diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@
 
 ## Version
 
-`1.4.5`
+`1.5.0`
 
 
 ## Description
diff --git a/amazonka-ecr.cabal b/amazonka-ecr.cabal
--- a/amazonka-ecr.cabal
+++ b/amazonka-ecr.cabal
@@ -1,13 +1,13 @@
 name:                  amazonka-ecr
-version:               1.4.5
+version:               1.5.0
 synopsis:              Amazon EC2 Container Registry SDK.
 homepage:              https://github.com/brendanhay/amazonka
 bug-reports:           https://github.com/brendanhay/amazonka/issues
-license:               OtherLicense
+license:               MPL-2.0
 license-file:          LICENSE
 author:                Brendan Hay
-maintainer:            Brendan Hay <brendan.g.hay@gmail.com>
-copyright:             Copyright (c) 2013-2016 Brendan Hay
+maintainer:            Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+copyright:             Copyright (c) 2013-2017 Brendan Hay
 category:              Network, AWS, Cloud, Distributed Computing
 build-type:            Simple
 cabal-version:         >= 1.10
@@ -29,14 +29,19 @@
     to get started.
 
 source-repository head
-    type:     git
-    location: git://github.com/brendanhay/amazonka.git
+    type:              git
+    location:          git://github.com/brendanhay/amazonka.git
+    subdir:            amazonka-ecr
 
 library
     default-language:  Haskell2010
     hs-source-dirs:    src gen
 
-    ghc-options:       -Wall
+    ghc-options:
+        -Wall
+        -fwarn-incomplete-uni-patterns
+        -fwarn-incomplete-record-updates
+        -funbox-strict-fields
 
     exposed-modules:
           Network.AWS.ECR
@@ -45,17 +50,22 @@
         , 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
@@ -65,7 +75,7 @@
         , Network.AWS.ECR.Types.Sum
 
     build-depends:
-          amazonka-core == 1.4.5.*
+          amazonka-core == 1.5.0.*
         , base          >= 4.7     && < 5
 
 test-suite amazonka-ecr-test
@@ -85,9 +95,9 @@
         , Test.AWS.ECR.Internal
 
     build-depends:
-          amazonka-core == 1.4.5.*
-        , amazonka-test == 1.4.5.*
-        , amazonka-ecr == 1.4.5.*
+          amazonka-core == 1.5.0.*
+        , amazonka-test == 1.5.0.*
+        , amazonka-ecr
         , base
         , bytestring
         , tasty
diff --git a/fixture/DeleteLifecyclePolicy.yaml b/fixture/DeleteLifecyclePolicy.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteLifecyclePolicy.yaml
@@ -0,0 +1,10 @@
+---
+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
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteLifecyclePolicyResponse.proto b/fixture/DeleteLifecyclePolicyResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteLifecyclePolicyResponse.proto
diff --git a/fixture/GetLifecyclePolicy.yaml b/fixture/GetLifecyclePolicy.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetLifecyclePolicy.yaml
@@ -0,0 +1,10 @@
+---
+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
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/GetLifecyclePolicyPreview.yaml b/fixture/GetLifecyclePolicyPreview.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetLifecyclePolicyPreview.yaml
@@ -0,0 +1,10 @@
+---
+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
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/GetLifecyclePolicyPreviewResponse.proto b/fixture/GetLifecyclePolicyPreviewResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetLifecyclePolicyPreviewResponse.proto
diff --git a/fixture/GetLifecyclePolicyResponse.proto b/fixture/GetLifecyclePolicyResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetLifecyclePolicyResponse.proto
diff --git a/fixture/PutLifecyclePolicy.yaml b/fixture/PutLifecyclePolicy.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/PutLifecyclePolicy.yaml
@@ -0,0 +1,10 @@
+---
+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
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/PutLifecyclePolicyResponse.proto b/fixture/PutLifecyclePolicyResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/PutLifecyclePolicyResponse.proto
diff --git a/fixture/StartLifecyclePolicyPreview.yaml b/fixture/StartLifecyclePolicyPreview.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/StartLifecyclePolicyPreview.yaml
@@ -0,0 +1,10 @@
+---
+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
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/StartLifecyclePolicyPreviewResponse.proto b/fixture/StartLifecyclePolicyPreviewResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/StartLifecyclePolicyPreviewResponse.proto
diff --git a/gen/Network/AWS/ECR.hs b/gen/Network/AWS/ECR.hs
--- a/gen/Network/AWS/ECR.hs
+++ b/gen/Network/AWS/ECR.hs
@@ -5,13 +5,13 @@
 
 -- |
 -- Module      : Network.AWS.ECR
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Amazon EC2 Container Registry (Amazon ECR) is a managed AWS 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 AWS 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.
+-- Amazon EC2 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
@@ -43,6 +43,9 @@
     -- ** LayerPartTooSmallException
     , _LayerPartTooSmallException
 
+    -- ** LifecyclePolicyPreviewNotFoundException
+    , _LifecyclePolicyPreviewNotFoundException
+
     -- ** ImageNotFoundException
     , _ImageNotFoundException
 
@@ -52,9 +55,15 @@
     -- ** RepositoryNotFoundException
     , _RepositoryNotFoundException
 
+    -- ** LifecyclePolicyPreviewInProgressException
+    , _LifecyclePolicyPreviewInProgressException
+
     -- ** UploadNotFoundException
     , _UploadNotFoundException
 
+    -- ** LifecyclePolicyNotFoundException
+    , _LifecyclePolicyNotFoundException
+
     -- ** InvalidLayerPartException
     , _InvalidLayerPartException
 
@@ -82,9 +91,18 @@
     -- ** 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
 
@@ -100,12 +118,18 @@
     -- ** 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
 
@@ -132,6 +156,9 @@
 
     -- * Types
 
+    -- ** ImageActionType
+    , ImageActionType (..)
+
     -- ** ImageFailureCode
     , ImageFailureCode (..)
 
@@ -141,6 +168,9 @@
     -- ** LayerFailureCode
     , LayerFailureCode (..)
 
+    -- ** LifecyclePolicyPreviewStatus
+    , LifecyclePolicyPreviewStatus (..)
+
     -- ** TagStatus
     , TagStatus (..)
 
@@ -190,6 +220,7 @@
     -- ** Layer
     , Layer
     , layer
+    , lMediaType
     , lLayerDigest
     , lLayerSize
     , lLayerAvailability
@@ -201,6 +232,30 @@
     , 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
@@ -216,25 +271,30 @@
     , 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.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.GetRepositoryPolicy
-import           Network.AWS.ECR.InitiateLayerUpload
-import           Network.AWS.ECR.ListImages
-import           Network.AWS.ECR.PutImage
-import           Network.AWS.ECR.SetRepositoryPolicy
-import           Network.AWS.ECR.Types
-import           Network.AWS.ECR.UploadLayerPart
-import           Network.AWS.ECR.Waiters
+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
diff --git a/gen/Network/AWS/ECR/BatchCheckLayerAvailability.hs b/gen/Network/AWS/ECR/BatchCheckLayerAvailability.hs
--- a/gen/Network/AWS/ECR/BatchCheckLayerAvailability.hs
+++ b/gen/Network/AWS/ECR/BatchCheckLayerAvailability.hs
@@ -12,9 +12,9 @@
 
 -- |
 -- Module      : Network.AWS.ECR.BatchCheckLayerAvailability
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
@@ -40,20 +40,21 @@
     , 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
+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)
+  { _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:
@@ -68,12 +69,13 @@
     -> NonEmpty Text -- ^ 'bclaLayerDigests'
     -> BatchCheckLayerAvailability
 batchCheckLayerAvailability pRepositoryName_ pLayerDigests_ =
-    BatchCheckLayerAvailability'
-    { _bclaRegistryId = Nothing
-    , _bclaRepositoryName = pRepositoryName_
-    , _bclaLayerDigests = _List1 # 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});
@@ -98,9 +100,9 @@
                      (x .?> "layers" .!@ mempty)
                      <*> (pure (fromEnum s)))
 
-instance Hashable BatchCheckLayerAvailability
+instance Hashable BatchCheckLayerAvailability where
 
-instance NFData BatchCheckLayerAvailability
+instance NFData BatchCheckLayerAvailability where
 
 instance ToHeaders BatchCheckLayerAvailability where
         toHeaders
@@ -128,11 +130,12 @@
 
 -- | /See:/ 'batchCheckLayerAvailabilityResponse' smart constructor.
 data BatchCheckLayerAvailabilityResponse = BatchCheckLayerAvailabilityResponse'
-    { _bclarsFailures       :: !(Maybe [LayerFailure])
-    , _bclarsLayers         :: !(Maybe [Layer])
-    , _bclarsResponseStatus :: !Int
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _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:
@@ -146,12 +149,13 @@
     :: Int -- ^ 'bclarsResponseStatus'
     -> BatchCheckLayerAvailabilityResponse
 batchCheckLayerAvailabilityResponse pResponseStatus_ =
-    BatchCheckLayerAvailabilityResponse'
-    { _bclarsFailures = Nothing
-    , _bclarsLayers = Nothing
-    , _bclarsResponseStatus = 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;
@@ -165,3 +169,4 @@
 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
--- a/gen/Network/AWS/ECR/BatchDeleteImage.hs
+++ b/gen/Network/AWS/ECR/BatchDeleteImage.hs
@@ -12,15 +12,19 @@
 
 -- |
 -- Module      : Network.AWS.ECR.BatchDeleteImage
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- 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
@@ -40,12 +44,12 @@
     , 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
+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@ .
 --
@@ -53,11 +57,12 @@
 --
 -- /See:/ 'batchDeleteImage' smart constructor.
 data BatchDeleteImage = BatchDeleteImage'
-    { _bdiRegistryId     :: !(Maybe Text)
-    , _bdiRepositoryName :: !Text
-    , _bdiImageIds       :: ![ImageIdentifier]
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _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:
@@ -71,12 +76,13 @@
     :: Text -- ^ 'bdiRepositoryName'
     -> BatchDeleteImage
 batchDeleteImage pRepositoryName_ =
-    BatchDeleteImage'
-    { _bdiRegistryId = Nothing
-    , _bdiRepositoryName = pRepositoryName_
-    , _bdiImageIds = mempty
-    }
+  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});
@@ -100,9 +106,9 @@
                      (x .?> "imageIds" .!@ mempty)
                      <*> (pure (fromEnum s)))
 
-instance Hashable BatchDeleteImage
+instance Hashable BatchDeleteImage where
 
-instance NFData BatchDeleteImage
+instance NFData BatchDeleteImage where
 
 instance ToHeaders BatchDeleteImage where
         toHeaders
@@ -130,11 +136,12 @@
 
 -- | /See:/ 'batchDeleteImageResponse' smart constructor.
 data BatchDeleteImageResponse = BatchDeleteImageResponse'
-    { _bdirsFailures       :: !(Maybe [ImageFailure])
-    , _bdirsImageIds       :: !(Maybe [ImageIdentifier])
-    , _bdirsResponseStatus :: !Int
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _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:
@@ -148,12 +155,13 @@
     :: Int -- ^ 'bdirsResponseStatus'
     -> BatchDeleteImageResponse
 batchDeleteImageResponse pResponseStatus_ =
-    BatchDeleteImageResponse'
-    { _bdirsFailures = Nothing
-    , _bdirsImageIds = Nothing
-    , _bdirsResponseStatus = 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;
@@ -166,4 +174,4 @@
 bdirsResponseStatus :: Lens' BatchDeleteImageResponse Int
 bdirsResponseStatus = lens _bdirsResponseStatus (\ s a -> s{_bdirsResponseStatus = a});
 
-instance NFData BatchDeleteImageResponse
+instance NFData BatchDeleteImageResponse where
diff --git a/gen/Network/AWS/ECR/BatchGetImage.hs b/gen/Network/AWS/ECR/BatchGetImage.hs
--- a/gen/Network/AWS/ECR/BatchGetImage.hs
+++ b/gen/Network/AWS/ECR/BatchGetImage.hs
@@ -12,9 +12,9 @@
 
 -- |
 -- Module      : Network.AWS.ECR.BatchGetImage
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
@@ -28,6 +28,7 @@
     , BatchGetImage
     -- * Request Lenses
     , bgiRegistryId
+    , bgiAcceptedMediaTypes
     , bgiRepositoryName
     , bgiImageIds
 
@@ -40,26 +41,30 @@
     , 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
+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)
-    , _bgiRepositoryName :: !Text
-    , _bgiImageIds       :: ![ImageIdentifier]
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _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@ .
@@ -67,16 +72,22 @@
     :: Text -- ^ 'bgiRepositoryName'
     -> BatchGetImage
 batchGetImage pRepositoryName_ =
-    BatchGetImage'
-    { _bgiRegistryId = Nothing
-    , _bgiRepositoryName = pRepositoryName_
-    , _bgiImageIds = mempty
-    }
+  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});
@@ -96,9 +107,9 @@
                      (x .?> "failures" .!@ mempty)
                      <*> (pure (fromEnum s)))
 
-instance Hashable BatchGetImage
+instance Hashable BatchGetImage where
 
-instance NFData BatchGetImage
+instance NFData BatchGetImage where
 
 instance ToHeaders BatchGetImage where
         toHeaders
@@ -115,6 +126,7 @@
           = object
               (catMaybes
                  [("registryId" .=) <$> _bgiRegistryId,
+                  ("acceptedMediaTypes" .=) <$> _bgiAcceptedMediaTypes,
                   Just ("repositoryName" .= _bgiRepositoryName),
                   Just ("imageIds" .= _bgiImageIds)])
 
@@ -126,11 +138,12 @@
 
 -- | /See:/ 'batchGetImageResponse' smart constructor.
 data BatchGetImageResponse = BatchGetImageResponse'
-    { _bgirsImages         :: !(Maybe [Image])
-    , _bgirsFailures       :: !(Maybe [ImageFailure])
-    , _bgirsResponseStatus :: !Int
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _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:
@@ -144,12 +157,13 @@
     :: Int -- ^ 'bgirsResponseStatus'
     -> BatchGetImageResponse
 batchGetImageResponse pResponseStatus_ =
-    BatchGetImageResponse'
-    { _bgirsImages = Nothing
-    , _bgirsFailures = Nothing
-    , _bgirsResponseStatus = 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;
@@ -162,4 +176,4 @@
 bgirsResponseStatus :: Lens' BatchGetImageResponse Int
 bgirsResponseStatus = lens _bgirsResponseStatus (\ s a -> s{_bgirsResponseStatus = a});
 
-instance NFData BatchGetImageResponse
+instance NFData BatchGetImageResponse where
diff --git a/gen/Network/AWS/ECR/CompleteLayerUpload.hs b/gen/Network/AWS/ECR/CompleteLayerUpload.hs
--- a/gen/Network/AWS/ECR/CompleteLayerUpload.hs
+++ b/gen/Network/AWS/ECR/CompleteLayerUpload.hs
@@ -12,13 +12,13 @@
 
 -- |
 -- Module      : Network.AWS.ECR.CompleteLayerUpload
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Inform Amazon ECR that the image layer upload for a specified registry, repository name, and upload ID, has completed. You can optionally provide a @sha256@ digest of the image layer for data validation purposes.
+-- 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
@@ -43,21 +43,22 @@
     , 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
+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)
+  { _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:
@@ -75,13 +76,14 @@
     -> NonEmpty Text -- ^ 'cluLayerDigests'
     -> CompleteLayerUpload
 completeLayerUpload pRepositoryName_ pUploadId_ pLayerDigests_ =
-    CompleteLayerUpload'
-    { _cluRegistryId = Nothing
-    , _cluRepositoryName = pRepositoryName_
-    , _cluUploadId = pUploadId_
-    , _cluLayerDigests = _List1 # 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});
@@ -111,9 +113,9 @@
                      <*> (x .?> "uploadId")
                      <*> (pure (fromEnum s)))
 
-instance Hashable CompleteLayerUpload
+instance Hashable CompleteLayerUpload where
 
-instance NFData CompleteLayerUpload
+instance NFData CompleteLayerUpload where
 
 instance ToHeaders CompleteLayerUpload where
         toHeaders
@@ -142,13 +144,14 @@
 
 -- | /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)
+  { _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:
@@ -166,14 +169,15 @@
     :: Int -- ^ 'clursResponseStatus'
     -> CompleteLayerUploadResponse
 completeLayerUploadResponse pResponseStatus_ =
-    CompleteLayerUploadResponse'
-    { _clursRegistryId = Nothing
-    , _clursLayerDigest = Nothing
-    , _clursRepositoryName = Nothing
-    , _clursUploadId = Nothing
-    , _clursResponseStatus = 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});
@@ -194,4 +198,4 @@
 clursResponseStatus :: Lens' CompleteLayerUploadResponse Int
 clursResponseStatus = lens _clursResponseStatus (\ s a -> s{_clursResponseStatus = a});
 
-instance NFData CompleteLayerUploadResponse
+instance NFData CompleteLayerUploadResponse where
diff --git a/gen/Network/AWS/ECR/CreateRepository.hs b/gen/Network/AWS/ECR/CreateRepository.hs
--- a/gen/Network/AWS/ECR/CreateRepository.hs
+++ b/gen/Network/AWS/ECR/CreateRepository.hs
@@ -12,9 +12,9 @@
 
 -- |
 -- Module      : Network.AWS.ECR.CreateRepository
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
@@ -37,18 +37,19 @@
     , 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
+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)
+  { _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:
@@ -58,10 +59,9 @@
     :: Text -- ^ 'crRepositoryName'
     -> CreateRepository
 createRepository pRepositoryName_ =
-    CreateRepository'
-    { _crRepositoryName = 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});
@@ -75,9 +75,9 @@
                  CreateRepositoryResponse' <$>
                    (x .?> "repository") <*> (pure (fromEnum s)))
 
-instance Hashable CreateRepository
+instance Hashable CreateRepository where
 
-instance NFData CreateRepository
+instance NFData CreateRepository where
 
 instance ToHeaders CreateRepository where
         toHeaders
@@ -103,10 +103,11 @@
 
 -- | /See:/ 'createRepositoryResponse' smart constructor.
 data CreateRepositoryResponse = CreateRepositoryResponse'
-    { _crrsRepository     :: !(Maybe Repository)
-    , _crrsResponseStatus :: !Int
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _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:
@@ -118,11 +119,10 @@
     :: Int -- ^ 'crrsResponseStatus'
     -> CreateRepositoryResponse
 createRepositoryResponse pResponseStatus_ =
-    CreateRepositoryResponse'
-    { _crrsRepository = Nothing
-    , _crrsResponseStatus = pResponseStatus_
-    }
+  CreateRepositoryResponse'
+  {_crrsRepository = Nothing, _crrsResponseStatus = pResponseStatus_}
 
+
 -- | The repository that was created.
 crrsRepository :: Lens' CreateRepositoryResponse (Maybe Repository)
 crrsRepository = lens _crrsRepository (\ s a -> s{_crrsRepository = a});
@@ -131,4 +131,4 @@
 crrsResponseStatus :: Lens' CreateRepositoryResponse Int
 crrsResponseStatus = lens _crrsResponseStatus (\ s a -> s{_crrsResponseStatus = a});
 
-instance NFData CreateRepositoryResponse
+instance NFData CreateRepositoryResponse where
diff --git a/gen/Network/AWS/ECR/DeleteLifecyclePolicy.hs b/gen/Network/AWS/ECR/DeleteLifecyclePolicy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ECR/DeleteLifecyclePolicy.hs
@@ -0,0 +1,177 @@
+{-# 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-2017 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 that is associated with the repository policy to  delete.
+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 that is associated with the repository policy to  delete.
+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 repository 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 repository 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
--- a/gen/Network/AWS/ECR/DeleteRepository.hs
+++ b/gen/Network/AWS/ECR/DeleteRepository.hs
@@ -12,9 +12,9 @@
 
 -- |
 -- Module      : Network.AWS.ECR.DeleteRepository
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
@@ -39,25 +39,26 @@
     , 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
+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)
+  { _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' - Force the deletion of the repository if it contains images.
+-- * '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.
 --
@@ -66,13 +67,14 @@
     :: Text -- ^ 'dRepositoryName'
     -> DeleteRepository
 deleteRepository pRepositoryName_ =
-    DeleteRepository'
-    { _dForce = Nothing
-    , _dRegistryId = Nothing
-    , _dRepositoryName = pRepositoryName_
-    }
+  DeleteRepository'
+  { _dForce = Nothing
+  , _dRegistryId = Nothing
+  , _dRepositoryName = pRepositoryName_
+  }
 
--- | Force the deletion of the repository if it contains images.
+
+-- | If a repository contains images, forces the deletion.
 dForce :: Lens' DeleteRepository (Maybe Bool)
 dForce = lens _dForce (\ s a -> s{_dForce = a});
 
@@ -93,9 +95,9 @@
                  DeleteRepositoryResponse' <$>
                    (x .?> "repository") <*> (pure (fromEnum s)))
 
-instance Hashable DeleteRepository
+instance Hashable DeleteRepository where
 
-instance NFData DeleteRepository
+instance NFData DeleteRepository where
 
 instance ToHeaders DeleteRepository where
         toHeaders
@@ -123,10 +125,11 @@
 
 -- | /See:/ 'deleteRepositoryResponse' smart constructor.
 data DeleteRepositoryResponse = DeleteRepositoryResponse'
-    { _drsRepository     :: !(Maybe Repository)
-    , _drsResponseStatus :: !Int
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _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:
@@ -138,11 +141,10 @@
     :: Int -- ^ 'drsResponseStatus'
     -> DeleteRepositoryResponse
 deleteRepositoryResponse pResponseStatus_ =
-    DeleteRepositoryResponse'
-    { _drsRepository = Nothing
-    , _drsResponseStatus = pResponseStatus_
-    }
+  DeleteRepositoryResponse'
+  {_drsRepository = Nothing, _drsResponseStatus = pResponseStatus_}
 
+
 -- | The repository that was deleted.
 drsRepository :: Lens' DeleteRepositoryResponse (Maybe Repository)
 drsRepository = lens _drsRepository (\ s a -> s{_drsRepository = a});
@@ -151,4 +153,4 @@
 drsResponseStatus :: Lens' DeleteRepositoryResponse Int
 drsResponseStatus = lens _drsResponseStatus (\ s a -> s{_drsResponseStatus = a});
 
-instance NFData DeleteRepositoryResponse
+instance NFData DeleteRepositoryResponse where
diff --git a/gen/Network/AWS/ECR/DeleteRepositoryPolicy.hs b/gen/Network/AWS/ECR/DeleteRepositoryPolicy.hs
--- a/gen/Network/AWS/ECR/DeleteRepositoryPolicy.hs
+++ b/gen/Network/AWS/ECR/DeleteRepositoryPolicy.hs
@@ -12,9 +12,9 @@
 
 -- |
 -- Module      : Network.AWS.ECR.DeleteRepositoryPolicy
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
@@ -40,19 +40,20 @@
     , 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
+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)
+  { _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:
@@ -64,11 +65,10 @@
     :: Text -- ^ 'drpRepositoryName'
     -> DeleteRepositoryPolicy
 deleteRepositoryPolicy pRepositoryName_ =
-    DeleteRepositoryPolicy'
-    { _drpRegistryId = Nothing
-    , _drpRepositoryName = 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});
@@ -89,9 +89,9 @@
                      (x .?> "policyText")
                      <*> (pure (fromEnum s)))
 
-instance Hashable DeleteRepositoryPolicy
+instance Hashable DeleteRepositoryPolicy where
 
-instance NFData DeleteRepositoryPolicy
+instance NFData DeleteRepositoryPolicy where
 
 instance ToHeaders DeleteRepositoryPolicy where
         toHeaders
@@ -118,12 +118,13 @@
 
 -- | /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)
+  { _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:
@@ -139,13 +140,14 @@
     :: Int -- ^ 'drprsResponseStatus'
     -> DeleteRepositoryPolicyResponse
 deleteRepositoryPolicyResponse pResponseStatus_ =
-    DeleteRepositoryPolicyResponse'
-    { _drprsRegistryId = Nothing
-    , _drprsRepositoryName = Nothing
-    , _drprsPolicyText = Nothing
-    , _drprsResponseStatus = 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});
@@ -162,4 +164,4 @@
 drprsResponseStatus :: Lens' DeleteRepositoryPolicyResponse Int
 drprsResponseStatus = lens _drprsResponseStatus (\ s a -> s{_drprsResponseStatus = a});
 
-instance NFData DeleteRepositoryPolicyResponse
+instance NFData DeleteRepositoryPolicyResponse where
diff --git a/gen/Network/AWS/ECR/DescribeImages.hs b/gen/Network/AWS/ECR/DescribeImages.hs
--- a/gen/Network/AWS/ECR/DescribeImages.hs
+++ b/gen/Network/AWS/ECR/DescribeImages.hs
@@ -12,13 +12,13 @@
 
 -- |
 -- Module      : Network.AWS.ECR.DescribeImages
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- 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 and creation date.
+-- Returns metadata about the images in a repository, including image size, image tags, and creation date.
 --
 --
 --
@@ -45,29 +45,30 @@
     , 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
+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)
+  { _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 list images. If you do not specify a registry, the default registry is assumed.
+-- * '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.
 --
@@ -82,16 +83,17 @@
     :: Text -- ^ 'diRepositoryName'
     -> DescribeImages
 describeImages pRepositoryName_ =
-    DescribeImages'
-    { _diRegistryId = Nothing
-    , _diImageIds = Nothing
-    , _diNextToken = Nothing
-    , _diFilter = Nothing
-    , _diMaxResults = Nothing
-    , _diRepositoryName = 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 list images. If you do not specify a registry, the default registry is assumed.
+
+-- | 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});
 
@@ -133,9 +135,9 @@
                      (x .?> "nextToken")
                      <*> (pure (fromEnum s)))
 
-instance Hashable DescribeImages
+instance Hashable DescribeImages where
 
-instance NFData DescribeImages
+instance NFData DescribeImages where
 
 instance ToHeaders DescribeImages where
         toHeaders
@@ -166,11 +168,12 @@
 
 -- | /See:/ 'describeImagesResponse' smart constructor.
 data DescribeImagesResponse = DescribeImagesResponse'
-    { _dirsImageDetails   :: !(Maybe [ImageDetail])
-    , _dirsNextToken      :: !(Maybe Text)
-    , _dirsResponseStatus :: !Int
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _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:
@@ -184,12 +187,13 @@
     :: Int -- ^ 'dirsResponseStatus'
     -> DescribeImagesResponse
 describeImagesResponse pResponseStatus_ =
-    DescribeImagesResponse'
-    { _dirsImageDetails = Nothing
-    , _dirsNextToken = Nothing
-    , _dirsResponseStatus = 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;
@@ -202,4 +206,4 @@
 dirsResponseStatus :: Lens' DescribeImagesResponse Int
 dirsResponseStatus = lens _dirsResponseStatus (\ s a -> s{_dirsResponseStatus = a});
 
-instance NFData DescribeImagesResponse
+instance NFData DescribeImagesResponse where
diff --git a/gen/Network/AWS/ECR/DescribeRepositories.hs b/gen/Network/AWS/ECR/DescribeRepositories.hs
--- a/gen/Network/AWS/ECR/DescribeRepositories.hs
+++ b/gen/Network/AWS/ECR/DescribeRepositories.hs
@@ -12,9 +12,9 @@
 
 -- |
 -- Module      : Network.AWS.ECR.DescribeRepositories
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
@@ -43,22 +43,23 @@
     , 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
+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)
+  { _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:
@@ -73,13 +74,14 @@
 describeRepositories
     :: DescribeRepositories
 describeRepositories =
-    DescribeRepositories'
-    { _drRegistryId = Nothing
-    , _drRepositoryNames = Nothing
-    , _drNextToken = Nothing
-    , _drMaxResults = Nothing
-    }
+  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});
@@ -115,9 +117,9 @@
                      (x .?> "nextToken")
                      <*> (pure (fromEnum s)))
 
-instance Hashable DescribeRepositories
+instance Hashable DescribeRepositories where
 
-instance NFData DescribeRepositories
+instance NFData DescribeRepositories where
 
 instance ToHeaders DescribeRepositories where
         toHeaders
@@ -146,11 +148,12 @@
 
 -- | /See:/ 'describeRepositoriesResponse' smart constructor.
 data DescribeRepositoriesResponse = DescribeRepositoriesResponse'
-    { _drrsRepositories   :: !(Maybe [Repository])
-    , _drrsNextToken      :: !(Maybe Text)
-    , _drrsResponseStatus :: !Int
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _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:
@@ -164,12 +167,13 @@
     :: Int -- ^ 'drrsResponseStatus'
     -> DescribeRepositoriesResponse
 describeRepositoriesResponse pResponseStatus_ =
-    DescribeRepositoriesResponse'
-    { _drrsRepositories = Nothing
-    , _drrsNextToken = Nothing
-    , _drrsResponseStatus = 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;
@@ -182,4 +186,4 @@
 drrsResponseStatus :: Lens' DescribeRepositoriesResponse Int
 drrsResponseStatus = lens _drrsResponseStatus (\ s a -> s{_drrsResponseStatus = a});
 
-instance NFData DescribeRepositoriesResponse
+instance NFData DescribeRepositoriesResponse where
diff --git a/gen/Network/AWS/ECR/GetAuthorizationToken.hs b/gen/Network/AWS/ECR/GetAuthorizationToken.hs
--- a/gen/Network/AWS/ECR/GetAuthorizationToken.hs
+++ b/gen/Network/AWS/ECR/GetAuthorizationToken.hs
@@ -12,9 +12,9 @@
 
 -- |
 -- Module      : Network.AWS.ECR.GetAuthorizationToken
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
@@ -39,18 +39,19 @@
     , 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
+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)
+  { _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:
@@ -58,11 +59,9 @@
 -- * '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
-    }
+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;
@@ -78,9 +77,9 @@
                    (x .?> "authorizationData" .!@ mempty) <*>
                      (pure (fromEnum s)))
 
-instance Hashable GetAuthorizationToken
+instance Hashable GetAuthorizationToken where
 
-instance NFData GetAuthorizationToken
+instance NFData GetAuthorizationToken where
 
 instance ToHeaders GetAuthorizationToken where
         toHeaders
@@ -105,10 +104,11 @@
 
 -- | /See:/ 'getAuthorizationTokenResponse' smart constructor.
 data GetAuthorizationTokenResponse = GetAuthorizationTokenResponse'
-    { _gatrsAuthorizationData :: !(Maybe [AuthorizationData])
-    , _gatrsResponseStatus    :: !Int
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _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:
@@ -120,11 +120,10 @@
     :: Int -- ^ 'gatrsResponseStatus'
     -> GetAuthorizationTokenResponse
 getAuthorizationTokenResponse pResponseStatus_ =
-    GetAuthorizationTokenResponse'
-    { _gatrsAuthorizationData = Nothing
-    , _gatrsResponseStatus = 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;
@@ -133,4 +132,4 @@
 gatrsResponseStatus :: Lens' GetAuthorizationTokenResponse Int
 gatrsResponseStatus = lens _gatrsResponseStatus (\ s a -> s{_gatrsResponseStatus = a});
 
-instance NFData GetAuthorizationTokenResponse
+instance NFData GetAuthorizationTokenResponse where
diff --git a/gen/Network/AWS/ECR/GetDownloadURLForLayer.hs b/gen/Network/AWS/ECR/GetDownloadURLForLayer.hs
--- a/gen/Network/AWS/ECR/GetDownloadURLForLayer.hs
+++ b/gen/Network/AWS/ECR/GetDownloadURLForLayer.hs
@@ -12,9 +12,9 @@
 
 -- |
 -- Module      : Network.AWS.ECR.GetDownloadURLForLayer
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
@@ -40,20 +40,21 @@
     , 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
+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)
+  { _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:
@@ -68,12 +69,13 @@
     -> Text -- ^ 'gduflLayerDigest'
     -> GetDownloadURLForLayer
 getDownloadURLForLayer pRepositoryName_ pLayerDigest_ =
-    GetDownloadURLForLayer'
-    { _gduflRegistryId = Nothing
-    , _gduflRepositoryName = pRepositoryName_
-    , _gduflLayerDigest = 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});
@@ -97,9 +99,9 @@
                    (x .?> "layerDigest") <*> (x .?> "downloadUrl") <*>
                      (pure (fromEnum s)))
 
-instance Hashable GetDownloadURLForLayer
+instance Hashable GetDownloadURLForLayer where
 
-instance NFData GetDownloadURLForLayer
+instance NFData GetDownloadURLForLayer where
 
 instance ToHeaders GetDownloadURLForLayer where
         toHeaders
@@ -127,11 +129,12 @@
 
 -- | /See:/ 'getDownloadURLForLayerResponse' smart constructor.
 data GetDownloadURLForLayerResponse = GetDownloadURLForLayerResponse'
-    { _gduflrsLayerDigest    :: !(Maybe Text)
-    , _gduflrsDownloadURL    :: !(Maybe Text)
-    , _gduflrsResponseStatus :: !Int
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _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:
@@ -145,12 +148,13 @@
     :: Int -- ^ 'gduflrsResponseStatus'
     -> GetDownloadURLForLayerResponse
 getDownloadURLForLayerResponse pResponseStatus_ =
-    GetDownloadURLForLayerResponse'
-    { _gduflrsLayerDigest = Nothing
-    , _gduflrsDownloadURL = Nothing
-    , _gduflrsResponseStatus = 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});
@@ -163,4 +167,4 @@
 gduflrsResponseStatus :: Lens' GetDownloadURLForLayerResponse Int
 gduflrsResponseStatus = lens _gduflrsResponseStatus (\ s a -> s{_gduflrsResponseStatus = a});
 
-instance NFData GetDownloadURLForLayerResponse
+instance NFData GetDownloadURLForLayerResponse where
diff --git a/gen/Network/AWS/ECR/GetLifecyclePolicy.hs b/gen/Network/AWS/ECR/GetLifecyclePolicy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ECR/GetLifecyclePolicy.hs
@@ -0,0 +1,177 @@
+{-# 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-2017 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 with the policy to retrieve.
+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 with the policy to retrieve.
+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 repository 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 repository 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
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ECR/GetLifecyclePolicyPreview.hs
@@ -0,0 +1,250 @@
+{-# 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-2017 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.
+--
+-- * '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.
+--
+-- * 'glppRepositoryName' - The name of the repository with the policy to retrieve.
+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.
+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.
+glppMaxResults :: Lens' GetLifecyclePolicyPreview (Maybe Natural)
+glppMaxResults = lens _glppMaxResults (\ s a -> s{_glppMaxResults = a}) . mapping _Nat;
+
+-- | The name of the repository with the policy to retrieve.
+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 repository 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 repository 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
--- a/gen/Network/AWS/ECR/GetRepositoryPolicy.hs
+++ b/gen/Network/AWS/ECR/GetRepositoryPolicy.hs
@@ -12,9 +12,9 @@
 
 -- |
 -- Module      : Network.AWS.ECR.GetRepositoryPolicy
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
@@ -40,40 +40,40 @@
     , 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
+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)
+  { _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 whose policy you want to retrieve.
+-- * 'grpRepositoryName' - The name of the repository with the policy to retrieve.
 getRepositoryPolicy
     :: Text -- ^ 'grpRepositoryName'
     -> GetRepositoryPolicy
 getRepositoryPolicy pRepositoryName_ =
-    GetRepositoryPolicy'
-    { _grpRegistryId = Nothing
-    , _grpRepositoryName = 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 whose policy you want to retrieve.
+-- | The name of the repository with the policy to retrieve.
 grpRepositoryName :: Lens' GetRepositoryPolicy Text
 grpRepositoryName = lens _grpRepositoryName (\ s a -> s{_grpRepositoryName = a});
 
@@ -89,9 +89,9 @@
                      (x .?> "policyText")
                      <*> (pure (fromEnum s)))
 
-instance Hashable GetRepositoryPolicy
+instance Hashable GetRepositoryPolicy where
 
-instance NFData GetRepositoryPolicy
+instance NFData GetRepositoryPolicy where
 
 instance ToHeaders GetRepositoryPolicy where
         toHeaders
@@ -118,12 +118,13 @@
 
 -- | /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)
+  { _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:
@@ -139,13 +140,14 @@
     :: Int -- ^ 'grprsResponseStatus'
     -> GetRepositoryPolicyResponse
 getRepositoryPolicyResponse pResponseStatus_ =
-    GetRepositoryPolicyResponse'
-    { _grprsRegistryId = Nothing
-    , _grprsRepositoryName = Nothing
-    , _grprsPolicyText = Nothing
-    , _grprsResponseStatus = 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});
@@ -162,4 +164,4 @@
 grprsResponseStatus :: Lens' GetRepositoryPolicyResponse Int
 grprsResponseStatus = lens _grprsResponseStatus (\ s a -> s{_grprsResponseStatus = a});
 
-instance NFData GetRepositoryPolicyResponse
+instance NFData GetRepositoryPolicyResponse where
diff --git a/gen/Network/AWS/ECR/InitiateLayerUpload.hs b/gen/Network/AWS/ECR/InitiateLayerUpload.hs
--- a/gen/Network/AWS/ECR/InitiateLayerUpload.hs
+++ b/gen/Network/AWS/ECR/InitiateLayerUpload.hs
@@ -12,9 +12,9 @@
 
 -- |
 -- Module      : Network.AWS.ECR.InitiateLayerUpload
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
@@ -39,40 +39,40 @@
     , 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
+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)
+  { _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 that you intend to upload layers to. If you do not specify a registry, the default registry is assumed.
+-- * '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 that you intend to upload layers to.
+-- * 'iluRepositoryName' - The name of the repository to which you intend to upload layers.
 initiateLayerUpload
     :: Text -- ^ 'iluRepositoryName'
     -> InitiateLayerUpload
 initiateLayerUpload pRepositoryName_ =
-    InitiateLayerUpload'
-    { _iluRegistryId = Nothing
-    , _iluRepositoryName = pRepositoryName_
-    }
+  InitiateLayerUpload'
+  {_iluRegistryId = Nothing, _iluRepositoryName = pRepositoryName_}
 
--- | The AWS account ID associated with the registry that you intend to upload layers to. If you do not specify a registry, the default registry is assumed.
+
+-- | 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 that you intend to upload layers to.
+-- | The name of the repository to which you intend to upload layers.
 iluRepositoryName :: Lens' InitiateLayerUpload Text
 iluRepositoryName = lens _iluRepositoryName (\ s a -> s{_iluRepositoryName = a});
 
@@ -87,9 +87,9 @@
                    (x .?> "partSize") <*> (x .?> "uploadId") <*>
                      (pure (fromEnum s)))
 
-instance Hashable InitiateLayerUpload
+instance Hashable InitiateLayerUpload where
 
-instance NFData InitiateLayerUpload
+instance NFData InitiateLayerUpload where
 
 instance ToHeaders InitiateLayerUpload where
         toHeaders
@@ -116,11 +116,12 @@
 
 -- | /See:/ 'initiateLayerUploadResponse' smart constructor.
 data InitiateLayerUploadResponse = InitiateLayerUploadResponse'
-    { _ilursPartSize       :: !(Maybe Nat)
-    , _ilursUploadId       :: !(Maybe Text)
-    , _ilursResponseStatus :: !Int
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _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:
@@ -134,12 +135,13 @@
     :: Int -- ^ 'ilursResponseStatus'
     -> InitiateLayerUploadResponse
 initiateLayerUploadResponse pResponseStatus_ =
-    InitiateLayerUploadResponse'
-    { _ilursPartSize = Nothing
-    , _ilursUploadId = Nothing
-    , _ilursResponseStatus = 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;
@@ -152,4 +154,4 @@
 ilursResponseStatus :: Lens' InitiateLayerUploadResponse Int
 ilursResponseStatus = lens _ilursResponseStatus (\ s a -> s{_ilursResponseStatus = a});
 
-instance NFData InitiateLayerUploadResponse
+instance NFData InitiateLayerUploadResponse where
diff --git a/gen/Network/AWS/ECR/ListImages.hs b/gen/Network/AWS/ECR/ListImages.hs
--- a/gen/Network/AWS/ECR/ListImages.hs
+++ b/gen/Network/AWS/ECR/ListImages.hs
@@ -12,9 +12,9 @@
 
 -- |
 -- Module      : Network.AWS.ECR.ListImages
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
@@ -46,28 +46,29 @@
     , 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
+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)
+  { _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 to list images in. If you do not specify a registry, the default registry is assumed.
+-- * '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.
 --
@@ -75,20 +76,21 @@
 --
 -- * '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 whose image IDs are to be listed.
+-- * '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_
-    }
+  ListImages'
+  { _liRegistryId = Nothing
+  , _liNextToken = Nothing
+  , _liFilter = Nothing
+  , _liMaxResults = Nothing
+  , _liRepositoryName = pRepositoryName_
+  }
 
--- | The AWS account ID associated with the registry that contains the repository to list images in. If you do not specify a registry, the default registry is assumed.
+
+-- | 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});
 
@@ -104,7 +106,7 @@
 liMaxResults :: Lens' ListImages (Maybe Natural)
 liMaxResults = lens _liMaxResults (\ s a -> s{_liMaxResults = a}) . mapping _Nat;
 
--- | The repository whose image IDs are to be listed.
+-- | The repository with image IDs to be listed.
 liRepositoryName :: Lens' ListImages Text
 liRepositoryName = lens _liRepositoryName (\ s a -> s{_liRepositoryName = a});
 
@@ -125,9 +127,9 @@
                    (x .?> "imageIds" .!@ mempty) <*> (x .?> "nextToken")
                      <*> (pure (fromEnum s)))
 
-instance Hashable ListImages
+instance Hashable ListImages where
 
-instance NFData ListImages
+instance NFData ListImages where
 
 instance ToHeaders ListImages where
         toHeaders
@@ -157,11 +159,12 @@
 
 -- | /See:/ 'listImagesResponse' smart constructor.
 data ListImagesResponse = ListImagesResponse'
-    { _lirsImageIds       :: !(Maybe [ImageIdentifier])
-    , _lirsNextToken      :: !(Maybe Text)
-    , _lirsResponseStatus :: !Int
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _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:
@@ -175,12 +178,13 @@
     :: Int -- ^ 'lirsResponseStatus'
     -> ListImagesResponse
 listImagesResponse pResponseStatus_ =
-    ListImagesResponse'
-    { _lirsImageIds = Nothing
-    , _lirsNextToken = Nothing
-    , _lirsResponseStatus = 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;
@@ -193,4 +197,4 @@
 lirsResponseStatus :: Lens' ListImagesResponse Int
 lirsResponseStatus = lens _lirsResponseStatus (\ s a -> s{_lirsResponseStatus = a});
 
-instance NFData ListImagesResponse
+instance NFData ListImagesResponse where
diff --git a/gen/Network/AWS/ECR/PutImage.hs b/gen/Network/AWS/ECR/PutImage.hs
--- a/gen/Network/AWS/ECR/PutImage.hs
+++ b/gen/Network/AWS/ECR/PutImage.hs
@@ -12,13 +12,13 @@
 
 -- |
 -- Module      : Network.AWS.ECR.PutImage
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
--- Creates or updates the image manifest associated with an image.
+-- Creates or updates the image manifest and tags associated with an image.
 --
 --
 module Network.AWS.ECR.PutImage
@@ -28,6 +28,7 @@
     , PutImage
     -- * Request Lenses
     , piRegistryId
+    , piImageTag
     , piRepositoryName
     , piImageManifest
 
@@ -39,26 +40,30 @@
     , 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
+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)
-    , _piRepositoryName :: !Text
-    , _piImageManifest  :: !Text
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _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.
@@ -67,16 +72,22 @@
     -> Text -- ^ 'piImageManifest'
     -> PutImage
 putImage pRepositoryName_ pImageManifest_ =
-    PutImage'
-    { _piRegistryId = Nothing
-    , _piRepositoryName = pRepositoryName_
-    , _piImageManifest = 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});
@@ -94,9 +105,9 @@
                  PutImageResponse' <$>
                    (x .?> "image") <*> (pure (fromEnum s)))
 
-instance Hashable PutImage
+instance Hashable PutImage where
 
-instance NFData PutImage
+instance NFData PutImage where
 
 instance ToHeaders PutImage where
         toHeaders
@@ -113,6 +124,7 @@
           = object
               (catMaybes
                  [("registryId" .=) <$> _piRegistryId,
+                  ("imageTag" .=) <$> _piImageTag,
                   Just ("repositoryName" .= _piRepositoryName),
                   Just ("imageManifest" .= _piImageManifest)])
 
@@ -124,10 +136,11 @@
 
 -- | /See:/ 'putImageResponse' smart constructor.
 data PutImageResponse = PutImageResponse'
-    { _pirsImage          :: !(Maybe Image)
-    , _pirsResponseStatus :: !Int
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _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:
@@ -139,11 +152,10 @@
     :: Int -- ^ 'pirsResponseStatus'
     -> PutImageResponse
 putImageResponse pResponseStatus_ =
-    PutImageResponse'
-    { _pirsImage = Nothing
-    , _pirsResponseStatus = pResponseStatus_
-    }
+  PutImageResponse'
+  {_pirsImage = Nothing, _pirsResponseStatus = pResponseStatus_}
 
+
 -- | Details of the image uploaded.
 pirsImage :: Lens' PutImageResponse (Maybe Image)
 pirsImage = lens _pirsImage (\ s a -> s{_pirsImage = a});
@@ -152,4 +164,4 @@
 pirsResponseStatus :: Lens' PutImageResponse Int
 pirsResponseStatus = lens _pirsResponseStatus (\ s a -> s{_pirsResponseStatus = a});
 
-instance NFData PutImageResponse
+instance NFData PutImageResponse where
diff --git a/gen/Network/AWS/ECR/PutLifecyclePolicy.hs b/gen/Network/AWS/ECR/PutLifecyclePolicy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ECR/PutLifecyclePolicy.hs
@@ -0,0 +1,182 @@
+{-# 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-2017 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.
+--
+--
+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
--- a/gen/Network/AWS/ECR/SetRepositoryPolicy.hs
+++ b/gen/Network/AWS/ECR/SetRepositoryPolicy.hs
@@ -12,9 +12,9 @@
 
 -- |
 -- Module      : Network.AWS.ECR.SetRepositoryPolicy
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
@@ -42,21 +42,22 @@
     , 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
+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)
+  { _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:
@@ -73,13 +74,14 @@
     -> Text -- ^ 'srpPolicyText'
     -> SetRepositoryPolicy
 setRepositoryPolicy pRepositoryName_ pPolicyText_ =
-    SetRepositoryPolicy'
-    { _srpForce = Nothing
-    , _srpRegistryId = Nothing
-    , _srpRepositoryName = pRepositoryName_
-    , _srpPolicyText = 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});
@@ -108,9 +110,9 @@
                      (x .?> "policyText")
                      <*> (pure (fromEnum s)))
 
-instance Hashable SetRepositoryPolicy
+instance Hashable SetRepositoryPolicy where
 
-instance NFData SetRepositoryPolicy
+instance NFData SetRepositoryPolicy where
 
 instance ToHeaders SetRepositoryPolicy where
         toHeaders
@@ -139,12 +141,13 @@
 
 -- | /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)
+  { _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:
@@ -160,13 +163,14 @@
     :: Int -- ^ 'srprsResponseStatus'
     -> SetRepositoryPolicyResponse
 setRepositoryPolicyResponse pResponseStatus_ =
-    SetRepositoryPolicyResponse'
-    { _srprsRegistryId = Nothing
-    , _srprsRepositoryName = Nothing
-    , _srprsPolicyText = Nothing
-    , _srprsResponseStatus = 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});
@@ -183,4 +187,4 @@
 srprsResponseStatus :: Lens' SetRepositoryPolicyResponse Int
 srprsResponseStatus = lens _srprsResponseStatus (\ s a -> s{_srprsResponseStatus = a});
 
-instance NFData SetRepositoryPolicyResponse
+instance NFData SetRepositoryPolicyResponse where
diff --git a/gen/Network/AWS/ECR/StartLifecyclePolicyPreview.hs b/gen/Network/AWS/ECR/StartLifecyclePolicyPreview.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ECR/StartLifecyclePolicyPreview.hs
@@ -0,0 +1,191 @@
+{-# 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-2017 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
--- a/gen/Network/AWS/ECR/Types.hs
+++ b/gen/Network/AWS/ECR/Types.hs
@@ -4,9 +4,9 @@
 
 -- |
 -- Module      : Network.AWS.ECR.Types
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
@@ -23,10 +23,13 @@
     , _LayerInaccessibleException
     , _InvalidLayerException
     , _LayerPartTooSmallException
+    , _LifecyclePolicyPreviewNotFoundException
     , _ImageNotFoundException
     , _ImageAlreadyExistsException
     , _RepositoryNotFoundException
+    , _LifecyclePolicyPreviewInProgressException
     , _UploadNotFoundException
+    , _LifecyclePolicyNotFoundException
     , _InvalidLayerPartException
     , _RepositoryNotEmptyException
     , _RepositoryAlreadyExistsException
@@ -34,6 +37,9 @@
     , _EmptyUploadException
     , _LimitExceededException
 
+    -- * ImageActionType
+    , ImageActionType (..)
+
     -- * ImageFailureCode
     , ImageFailureCode (..)
 
@@ -43,6 +49,9 @@
     -- * LayerFailureCode
     , LayerFailureCode (..)
 
+    -- * LifecyclePolicyPreviewStatus
+    , LifecyclePolicyPreviewStatus (..)
+
     -- * TagStatus
     , TagStatus (..)
 
@@ -92,6 +101,7 @@
     -- * Layer
     , Layer
     , layer
+    , lMediaType
     , lLayerDigest
     , lLayerSize
     , lLayerAvailability
@@ -103,6 +113,30 @@
     , 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
@@ -118,38 +152,40 @@
     , 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
+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
-    }
+  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
-        }
+      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"
+        Just "throttling_exception"
       | has (hasCode "Throttling" . hasStatus 400) e = Just "throttling"
       | has (hasStatus 504) e = Just "gateway_timeout"
       | has (hasStatus 502) e = Just "bad_gateway"
@@ -158,114 +194,154 @@
       | 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 = _ServiceError . hasCode "LayersNotFoundException"
+_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 =
-    _ServiceError . hasCode "InvalidParameterException"
+_InvalidParameterException = _MatchServiceError ecr "InvalidParameterException"
 
+
 -- | The image layer already exists in the associated repository.
 --
 --
 _LayerAlreadyExistsException :: AsError a => Getting (First ServiceError) a ServiceError
 _LayerAlreadyExistsException =
-    _ServiceError . hasCode "LayerAlreadyExistsException"
+  _MatchServiceError ecr "LayerAlreadyExistsException"
 
+
 -- | These errors are usually caused by a server-side issue.
 --
 --
 _ServerException :: AsError a => Getting (First ServiceError) a ServiceError
-_ServerException = _ServiceError . hasCode "ServerException"
+_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 =
-    _ServiceError . hasCode "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 = _ServiceError . hasCode "InvalidLayerException"
+_InvalidLayerException = _MatchServiceError ecr "InvalidLayerException"
 
+
 -- | Layer parts must be at least 5 MiB in size.
 --
 --
 _LayerPartTooSmallException :: AsError a => Getting (First ServiceError) a ServiceError
 _LayerPartTooSmallException =
-    _ServiceError . hasCode "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 = _ServiceError . hasCode "ImageNotFoundException"
+_ImageNotFoundException = _MatchServiceError ecr "ImageNotFoundException"
 
--- | The specified image has already been pushed, and there are no changes to the manifest or image tag since the last push.
+
+-- | 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 =
-    _ServiceError . hasCode "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 =
-    _ServiceError . hasCode "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 = _ServiceError . hasCode "UploadNotFoundException"
+_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 =
-    _ServiceError . hasCode "InvalidLayerPartException"
+_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 =
-    _ServiceError . hasCode "RepositoryNotEmptyException"
+  _MatchServiceError ecr "RepositoryNotEmptyException"
 
+
 -- | The specified repository already exists in the specified registry.
 --
 --
 _RepositoryAlreadyExistsException :: AsError a => Getting (First ServiceError) a ServiceError
 _RepositoryAlreadyExistsException =
-    _ServiceError . hasCode "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 =
-    _ServiceError . hasCode "RepositoryPolicyNotFoundException"
+  _MatchServiceError ecr "RepositoryPolicyNotFoundException"
 
+
 -- | The specified layer upload does not contain any layer parts.
 --
 --
 _EmptyUploadException :: AsError a => Getting (First ServiceError) a ServiceError
-_EmptyUploadException = _ServiceError . hasCode "EmptyUploadException"
+_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 EC2 Container Registry User Guide.
 --
 --
 _LimitExceededException :: AsError a => Getting (First ServiceError) a ServiceError
-_LimitExceededException = _ServiceError . hasCode "LimitExceededException"
+_LimitExceededException = _MatchServiceError ecr "LimitExceededException"
+
diff --git a/gen/Network/AWS/ECR/Types/Product.hs b/gen/Network/AWS/ECR/Types/Product.hs
--- a/gen/Network/AWS/ECR/Types/Product.hs
+++ b/gen/Network/AWS/ECR/Types/Product.hs
@@ -9,17 +9,17 @@
 
 -- |
 -- Module      : Network.AWS.ECR.Types.Product
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- 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
+import Network.AWS.ECR.Types.Sum
+import Network.AWS.Lens
+import Network.AWS.Prelude
 
 -- | An object representing authorization data for an Amazon ECR registry.
 --
@@ -27,11 +27,12 @@
 --
 -- /See:/ 'authorizationData' smart constructor.
 data AuthorizationData = AuthorizationData'
-    { _adExpiresAt          :: !(Maybe POSIX)
-    , _adProxyEndpoint      :: !(Maybe Text)
-    , _adAuthorizationToken :: !(Maybe Text)
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _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:
@@ -44,12 +45,13 @@
 authorizationData
     :: AuthorizationData
 authorizationData =
-    AuthorizationData'
-    { _adExpiresAt = Nothing
-    , _adProxyEndpoint = Nothing
-    , _adAuthorizationToken = Nothing
-    }
+  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;
@@ -70,9 +72,9 @@
                    (x .:? "expiresAt") <*> (x .:? "proxyEndpoint") <*>
                      (x .:? "authorizationToken"))
 
-instance Hashable AuthorizationData
+instance Hashable AuthorizationData where
 
-instance NFData AuthorizationData
+instance NFData AuthorizationData where
 
 -- | An object representing a filter on a 'DescribeImages' operation.
 --
@@ -80,9 +82,10 @@
 --
 -- /See:/ 'describeImagesFilter' smart constructor.
 newtype DescribeImagesFilter = DescribeImagesFilter'
-    { _difTagStatus :: Maybe TagStatus
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _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:
@@ -90,18 +93,16 @@
 -- * '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
-    }
+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
+instance Hashable DescribeImagesFilter where
 
-instance NFData DescribeImagesFilter
+instance NFData DescribeImagesFilter where
 
 instance ToJSON DescribeImagesFilter where
         toJSON DescribeImagesFilter'{..}
@@ -114,12 +115,13 @@
 --
 -- /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)
+  { _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:
@@ -134,13 +136,14 @@
 image
     :: Image
 image =
-    Image'
-    { _iRegistryId = Nothing
-    , _iImageId = Nothing
-    , _iRepositoryName = Nothing
-    , _iImageManifest = Nothing
-    }
+  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});
@@ -166,9 +169,9 @@
                      (x .:? "repositoryName")
                      <*> (x .:? "imageManifest"))
 
-instance Hashable Image
+instance Hashable Image where
 
-instance NFData Image
+instance NFData Image where
 
 -- | An object that describes an image returned by a 'DescribeImages' operation.
 --
@@ -176,14 +179,15 @@
 --
 -- /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)
+  { _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:
@@ -202,15 +206,16 @@
 imageDetail
     :: ImageDetail
 imageDetail =
-    ImageDetail'
-    { _idRegistryId = Nothing
-    , _idImageTags = Nothing
-    , _idImageSizeInBytes = Nothing
-    , _idImageDigest = Nothing
-    , _idImagePushedAt = Nothing
-    , _idRepositoryName = Nothing
-    }
+  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});
@@ -247,9 +252,9 @@
                      <*> (x .:? "imagePushedAt")
                      <*> (x .:? "repositoryName"))
 
-instance Hashable ImageDetail
+instance Hashable ImageDetail where
 
-instance NFData ImageDetail
+instance NFData ImageDetail where
 
 -- | An object representing an Amazon ECR image failure.
 --
@@ -257,11 +262,12 @@
 --
 -- /See:/ 'imageFailure' smart constructor.
 data ImageFailure = ImageFailure'
-    { _ifFailureReason :: !(Maybe Text)
-    , _ifFailureCode   :: !(Maybe ImageFailureCode)
-    , _ifImageId       :: !(Maybe ImageIdentifier)
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _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:
@@ -274,12 +280,10 @@
 imageFailure
     :: ImageFailure
 imageFailure =
-    ImageFailure'
-    { _ifFailureReason = Nothing
-    , _ifFailureCode = Nothing
-    , _ifImageId = Nothing
-    }
+  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});
@@ -300,9 +304,9 @@
                    (x .:? "failureReason") <*> (x .:? "failureCode") <*>
                      (x .:? "imageId"))
 
-instance Hashable ImageFailure
+instance Hashable ImageFailure where
 
-instance NFData ImageFailure
+instance NFData ImageFailure where
 
 -- | An object with identifying information for an Amazon ECR image.
 --
@@ -310,10 +314,11 @@
 --
 -- /See:/ 'imageIdentifier' smart constructor.
 data ImageIdentifier = ImageIdentifier'
-    { _iiImageDigest :: !(Maybe Text)
-    , _iiImageTag    :: !(Maybe Text)
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _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:
@@ -324,11 +329,9 @@
 imageIdentifier
     :: ImageIdentifier
 imageIdentifier =
-    ImageIdentifier'
-    { _iiImageDigest = Nothing
-    , _iiImageTag = Nothing
-    }
+  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});
@@ -344,9 +347,9 @@
                  ImageIdentifier' <$>
                    (x .:? "imageDigest") <*> (x .:? "imageTag"))
 
-instance Hashable ImageIdentifier
+instance Hashable ImageIdentifier where
 
-instance NFData ImageIdentifier
+instance NFData ImageIdentifier where
 
 instance ToJSON ImageIdentifier where
         toJSON ImageIdentifier'{..}
@@ -361,29 +364,39 @@
 --
 -- /See:/ 'layer' smart constructor.
 data Layer = Layer'
-    { _lLayerDigest       :: !(Maybe Text)
-    , _lLayerSize         :: !(Maybe Integer)
-    , _lLayerAvailability :: !(Maybe LayerAvailability)
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _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. Valid values are @AVAILABLE@ and @UNAVAILABLE@ .
+-- * 'lLayerAvailability' - The availability status of the image layer.
 layer
     :: Layer
 layer =
-    Layer'
-    { _lLayerDigest = Nothing
-    , _lLayerSize = Nothing
-    , _lLayerAvailability = Nothing
-    }
+  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});
@@ -392,7 +405,7 @@
 lLayerSize :: Lens' Layer (Maybe Integer)
 lLayerSize = lens _lLayerSize (\ s a -> s{_lLayerSize = a});
 
--- | The availability status of the image layer. Valid values are @AVAILABLE@ and @UNAVAILABLE@ .
+-- | The availability status of the image layer.
 lLayerAvailability :: Lens' Layer (Maybe LayerAvailability)
 lLayerAvailability = lens _lLayerAvailability (\ s a -> s{_lLayerAvailability = a});
 
@@ -401,12 +414,13 @@
           = withObject "Layer"
               (\ x ->
                  Layer' <$>
-                   (x .:? "layerDigest") <*> (x .:? "layerSize") <*>
-                     (x .:? "layerAvailability"))
+                   (x .:? "mediaType") <*> (x .:? "layerDigest") <*>
+                     (x .:? "layerSize")
+                     <*> (x .:? "layerAvailability"))
 
-instance Hashable Layer
+instance Hashable Layer where
 
-instance NFData Layer
+instance NFData Layer where
 
 -- | An object representing an Amazon ECR image layer failure.
 --
@@ -414,11 +428,12 @@
 --
 -- /See:/ 'layerFailure' smart constructor.
 data LayerFailure = LayerFailure'
-    { _lfFailureReason :: !(Maybe Text)
-    , _lfFailureCode   :: !(Maybe LayerFailureCode)
-    , _lfLayerDigest   :: !(Maybe Text)
-    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+  { _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:
@@ -431,12 +446,13 @@
 layerFailure
     :: LayerFailure
 layerFailure =
-    LayerFailure'
-    { _lfFailureReason = Nothing
-    , _lfFailureCode = Nothing
-    , _lfLayerDigest = Nothing
-    }
+  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});
@@ -457,19 +473,197 @@
                    (x .:? "failureReason") <*> (x .:? "failureCode") <*>
                      (x .:? "layerDigest"))
 
-instance Hashable LayerFailure
+instance Hashable LayerFailure where
 
-instance NFData LayerFailure
+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)
+  { _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:
@@ -477,18 +671,16 @@
 -- * '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
-    }
+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
+instance Hashable ListImagesFilter where
 
-instance NFData ListImagesFilter
+instance NFData ListImagesFilter where
 
 instance ToJSON ListImagesFilter where
         toJSON ListImagesFilter'{..}
@@ -501,42 +693,44 @@
 --
 -- /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)
+  { _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, the AWS account ID of the repository owner, the repository namespace, and then the repository name. For example, @arn:aws:ecr:region:012345678910:repository/test@ .
+-- * '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/time format, when the repository was created.
+-- * '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@ and @pull@ operations.
+-- * '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
-    }
+  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, the AWS account ID of the repository owner, the repository namespace, and then the repository name. For example, @arn:aws:ecr:region:012345678910:repository/test@ .
+
+-- | 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/time format, when the repository was created.
+-- | 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;
 
@@ -544,7 +738,7 @@
 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@ and @pull@ operations.
+-- | 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});
 
@@ -562,6 +756,6 @@
                      <*> (x .:? "repositoryUri")
                      <*> (x .:? "repositoryName"))
 
-instance Hashable Repository
+instance Hashable Repository where
 
-instance NFData Repository
+instance NFData Repository where
diff --git a/gen/Network/AWS/ECR/Types/Sum.hs b/gen/Network/AWS/ECR/Types/Sum.hs
--- a/gen/Network/AWS/ECR/Types/Sum.hs
+++ b/gen/Network/AWS/ECR/Types/Sum.hs
@@ -9,24 +9,49 @@
 
 -- |
 -- Module      : Network.AWS.ECR.Types.Sum
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- 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
+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)
+  = 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
@@ -55,10 +80,11 @@
     parseJSON = parseJSONText "ImageFailureCode"
 
 data LayerAvailability
-    = Available
-    | Unavailable
-    deriving (Eq,Ord,Read,Show,Enum,Bounded,Data,Typeable,Generic)
+  = Available
+  | Unavailable
+  deriving (Eq, Ord, Read, Show, Enum, Bounded, Data, Typeable, Generic)
 
+
 instance FromText LayerAvailability where
     parser = takeLowerText >>= \case
         "available" -> pure Available
@@ -81,10 +107,11 @@
     parseJSON = parseJSONText "LayerAvailability"
 
 data LayerFailureCode
-    = InvalidLayerDigest
-    | MissingLayerDigest
-    deriving (Eq,Ord,Read,Show,Enum,Bounded,Data,Typeable,Generic)
+  = InvalidLayerDigest
+  | MissingLayerDigest
+  deriving (Eq, Ord, Read, Show, Enum, Bounded, Data, Typeable, Generic)
 
+
 instance FromText LayerFailureCode where
     parser = takeLowerText >>= \case
         "invalidlayerdigest" -> pure InvalidLayerDigest
@@ -106,10 +133,44 @@
 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)
+  = Tagged
+  | Untagged
+  deriving (Eq, Ord, Read, Show, Enum, Bounded, Data, Typeable, Generic)
+
 
 instance FromText TagStatus where
     parser = takeLowerText >>= \case
diff --git a/gen/Network/AWS/ECR/UploadLayerPart.hs b/gen/Network/AWS/ECR/UploadLayerPart.hs
--- a/gen/Network/AWS/ECR/UploadLayerPart.hs
+++ b/gen/Network/AWS/ECR/UploadLayerPart.hs
@@ -12,9 +12,9 @@
 
 -- |
 -- Module      : Network.AWS.ECR.UploadLayerPart
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
@@ -45,30 +45,31 @@
     , 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
+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)
+  { _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 that you are uploading layer parts to. If you do not specify a registry, the default registry is assumed.
+-- * '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 that you are uploading layer parts to.
+-- * '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.
 --
@@ -85,20 +86,21 @@
     -> 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_
-    }
+  UploadLayerPart'
+  { _ulpRegistryId = Nothing
+  , _ulpRepositoryName = pRepositoryName_
+  , _ulpUploadId = pUploadId_
+  , _ulpPartFirstByte = _Nat # pPartFirstByte_
+  , _ulpPartLastByte = _Nat # pPartLastByte_
+  , _ulpLayerPartBlob = _Base64 # pLayerPartBlob_
+  }
 
--- | The AWS account ID associated with the registry that you are uploading layer parts to. If you do not specify a registry, the default registry is assumed.
+
+-- | 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 that you are uploading layer parts to.
+-- | The name of the repository to which you are uploading layer parts.
 ulpRepositoryName :: Lens' UploadLayerPart Text
 ulpRepositoryName = lens _ulpRepositoryName (\ s a -> s{_ulpRepositoryName = a});
 
@@ -130,9 +132,9 @@
                      <*> (x .?> "uploadId")
                      <*> (pure (fromEnum s)))
 
-instance Hashable UploadLayerPart
+instance Hashable UploadLayerPart where
 
-instance NFData UploadLayerPart
+instance NFData UploadLayerPart where
 
 instance ToHeaders UploadLayerPart where
         toHeaders
@@ -163,13 +165,14 @@
 
 -- | /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)
+  { _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:
@@ -187,14 +190,15 @@
     :: Int -- ^ 'ulprsResponseStatus'
     -> UploadLayerPartResponse
 uploadLayerPartResponse pResponseStatus_ =
-    UploadLayerPartResponse'
-    { _ulprsRegistryId = Nothing
-    , _ulprsLastByteReceived = Nothing
-    , _ulprsRepositoryName = Nothing
-    , _ulprsUploadId = Nothing
-    , _ulprsResponseStatus = 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});
@@ -215,4 +219,4 @@
 ulprsResponseStatus :: Lens' UploadLayerPartResponse Int
 ulprsResponseStatus = lens _ulprsResponseStatus (\ s a -> s{_ulprsResponseStatus = a});
 
-instance NFData UploadLayerPartResponse
+instance NFData UploadLayerPartResponse where
diff --git a/gen/Network/AWS/ECR/Waiters.hs b/gen/Network/AWS/ECR/Waiters.hs
--- a/gen/Network/AWS/ECR/Waiters.hs
+++ b/gen/Network/AWS/ECR/Waiters.hs
@@ -7,15 +7,15 @@
 
 -- |
 -- Module      : Network.AWS.ECR.Waiters
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- 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
+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,9 +2,9 @@
 
 -- |
 -- Module      : Main
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
 --
diff --git a/test/Test/AWS/Gen/ECR.hs b/test/Test/AWS/Gen/ECR.hs
--- a/test/Test/AWS/Gen/ECR.hs
+++ b/test/Test/AWS/Gen/ECR.hs
@@ -5,20 +5,20 @@
 
 -- |
 -- Module      : Test.AWS.Gen.ECR
--- Copyright   : (c) 2013-2016 Brendan Hay
+-- Copyright   : (c) 2013-2017 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- 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
-import Network.AWS.ECR
-import Test.AWS.ECR.Internal
 
 -- Auto-generated: the actual test selection needs to be manually placed into
 -- the top-level so that real test data can be incrementally added.
@@ -31,9 +31,18 @@
 --         [ requestGetRepositoryPolicy $
 --             getRepositoryPolicy
 --
+--         , requestPutLifecyclePolicy $
+--             putLifecyclePolicy
+--
+--         , requestDeleteLifecyclePolicy $
+--             deleteLifecyclePolicy
+--
 --         , requestBatchDeleteImage $
 --             batchDeleteImage
 --
+--         , requestGetLifecyclePolicyPreview $
+--             getLifecyclePolicyPreview
+--
 --         , requestBatchCheckLayerAvailability $
 --             batchCheckLayerAvailability
 --
@@ -49,12 +58,18 @@
 --         , requestDescribeRepositories $
 --             describeRepositories
 --
+--         , requestStartLifecyclePolicyPreview $
+--             startLifecyclePolicyPreview
+--
 --         , requestUploadLayerPart $
 --             uploadLayerPart
 --
 --         , requestBatchGetImage $
 --             batchGetImage
 --
+--         , requestGetLifecyclePolicy $
+--             getLifecyclePolicy
+--
 --         , requestSetRepositoryPolicy $
 --             setRepositoryPolicy
 --
@@ -85,9 +100,18 @@
 --         [ responseGetRepositoryPolicy $
 --             getRepositoryPolicyResponse
 --
+--         , responsePutLifecyclePolicy $
+--             putLifecyclePolicyResponse
+--
+--         , responseDeleteLifecyclePolicy $
+--             deleteLifecyclePolicyResponse
+--
 --         , responseBatchDeleteImage $
 --             batchDeleteImageResponse
 --
+--         , responseGetLifecyclePolicyPreview $
+--             getLifecyclePolicyPreviewResponse
+--
 --         , responseBatchCheckLayerAvailability $
 --             batchCheckLayerAvailabilityResponse
 --
@@ -103,12 +127,18 @@
 --         , responseDescribeRepositories $
 --             describeRepositoriesResponse
 --
+--         , responseStartLifecyclePolicyPreview $
+--             startLifecyclePolicyPreviewResponse
+--
 --         , responseUploadLayerPart $
 --             uploadLayerPartResponse
 --
 --         , responseBatchGetImage $
 --             batchGetImageResponse
 --
+--         , responseGetLifecyclePolicy $
+--             getLifecyclePolicyResponse
+--
 --         , responseSetRepositoryPolicy $
 --             setRepositoryPolicyResponse
 --
@@ -143,11 +173,26 @@
     "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"
@@ -173,6 +218,11 @@
     "DescribeRepositories"
     "fixture/DescribeRepositories.yaml"
 
+requestStartLifecyclePolicyPreview :: StartLifecyclePolicyPreview -> TestTree
+requestStartLifecyclePolicyPreview = req
+    "StartLifecyclePolicyPreview"
+    "fixture/StartLifecyclePolicyPreview.yaml"
+
 requestUploadLayerPart :: UploadLayerPart -> TestTree
 requestUploadLayerPart = req
     "UploadLayerPart"
@@ -183,6 +233,11 @@
     "BatchGetImage"
     "fixture/BatchGetImage.yaml"
 
+requestGetLifecyclePolicy :: GetLifecyclePolicy -> TestTree
+requestGetLifecyclePolicy = req
+    "GetLifecyclePolicy"
+    "fixture/GetLifecyclePolicy.yaml"
+
 requestSetRepositoryPolicy :: SetRepositoryPolicy -> TestTree
 requestSetRepositoryPolicy = req
     "SetRepositoryPolicy"
@@ -232,6 +287,20 @@
     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"
@@ -239,6 +308,13 @@
     ecr
     (Proxy :: Proxy BatchDeleteImage)
 
+responseGetLifecyclePolicyPreview :: GetLifecyclePolicyPreviewResponse -> TestTree
+responseGetLifecyclePolicyPreview = res
+    "GetLifecyclePolicyPreviewResponse"
+    "fixture/GetLifecyclePolicyPreviewResponse.proto"
+    ecr
+    (Proxy :: Proxy GetLifecyclePolicyPreview)
+
 responseBatchCheckLayerAvailability :: BatchCheckLayerAvailabilityResponse -> TestTree
 responseBatchCheckLayerAvailability = res
     "BatchCheckLayerAvailabilityResponse"
@@ -274,6 +350,13 @@
     ecr
     (Proxy :: Proxy DescribeRepositories)
 
+responseStartLifecyclePolicyPreview :: StartLifecyclePolicyPreviewResponse -> TestTree
+responseStartLifecyclePolicyPreview = res
+    "StartLifecyclePolicyPreviewResponse"
+    "fixture/StartLifecyclePolicyPreviewResponse.proto"
+    ecr
+    (Proxy :: Proxy StartLifecyclePolicyPreview)
+
 responseUploadLayerPart :: UploadLayerPartResponse -> TestTree
 responseUploadLayerPart = res
     "UploadLayerPartResponse"
@@ -287,6 +370,13 @@
     "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
