diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,373 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+    means each individual or legal entity that creates, contributes to
+    the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+    means the combination of the Contributions of others (if any) used
+    by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+    means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+    means Source Code Form to which the initial Contributor has attached
+    the notice in Exhibit A, the Executable Form of such Source Code
+    Form, and Modifications of such Source Code Form, in each case
+    including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+    means
+
+    (a) that the initial Contributor has attached the notice described
+        in Exhibit B to the Covered Software; or
+
+    (b) that the Covered Software was made available under the terms of
+        version 1.1 or earlier of the License, but not also under the
+        terms of a Secondary License.
+
+1.6. "Executable Form"
+    means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+    means a work that combines Covered Software with other material, in
+    a separate file or files, that is not Covered Software.
+
+1.8. "License"
+    means this document.
+
+1.9. "Licensable"
+    means having the right to grant, to the maximum extent possible,
+    whether at the time of the initial grant or subsequently, any and
+    all of the rights conveyed by this License.
+
+1.10. "Modifications"
+    means any of the following:
+
+    (a) any file in Source Code Form that results from an addition to,
+        deletion from, or modification of the contents of Covered
+        Software; or
+
+    (b) any new file in Source Code Form that contains any Covered
+        Software.
+
+1.11. "Patent Claims" of a Contributor
+    means any patent claim(s), including without limitation, method,
+    process, and apparatus claims, in any patent Licensable by such
+    Contributor that would be infringed, but for the grant of the
+    License, by the making, using, selling, offering for sale, having
+    made, import, or transfer of either its Contributions or its
+    Contributor Version.
+
+1.12. "Secondary License"
+    means either the GNU General Public License, Version 2.0, the GNU
+    Lesser General Public License, Version 2.1, the GNU Affero General
+    Public License, Version 3.0, or any later versions of those
+    licenses.
+
+1.13. "Source Code Form"
+    means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+    means an individual or a legal entity exercising rights under this
+    License. For legal entities, "You" includes any entity that
+    controls, is controlled by, or is under common control with You. For
+    purposes of this definition, "control" means (a) the power, direct
+    or indirect, to cause the direction or management of such entity,
+    whether by contract or otherwise, or (b) ownership of more than
+    fifty percent (50%) of the outstanding shares or beneficial
+    ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+    Licensable by such Contributor to use, reproduce, make available,
+    modify, display, perform, distribute, and otherwise exploit its
+    Contributions, either on an unmodified basis, with Modifications, or
+    as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+    for sale, have made, import, and otherwise transfer either its
+    Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+    or
+
+(b) for infringements caused by: (i) Your and any other third party's
+    modifications of Covered Software, or (ii) the combination of its
+    Contributions with other software (except as part of its Contributor
+    Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+    its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+    Form, as described in Section 3.1, and You must inform recipients of
+    the Executable Form how they can obtain a copy of such Source Code
+    Form by reasonable means in a timely manner, at a charge no more
+    than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+    License, or sublicense it under different terms, provided that the
+    license for the Executable Form does not attempt to limit or alter
+    the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+*                                                                      *
+*  6. Disclaimer of Warranty                                           *
+*  -------------------------                                           *
+*                                                                      *
+*  Covered Software is provided under this License on an "as is"       *
+*  basis, without warranty of any kind, either expressed, implied, or  *
+*  statutory, including, without limitation, warranties that the       *
+*  Covered Software is free of defects, merchantable, fit for a        *
+*  particular purpose or non-infringing. The entire risk as to the     *
+*  quality and performance of the Covered Software is with You.        *
+*  Should any Covered Software prove defective in any respect, You     *
+*  (not any Contributor) assume the cost of any necessary servicing,   *
+*  repair, or correction. This disclaimer of warranty constitutes an   *
+*  essential part of this License. No use of any Covered Software is   *
+*  authorized under this License except under this disclaimer.         *
+*                                                                      *
+************************************************************************
+
+************************************************************************
+*                                                                      *
+*  7. Limitation of Liability                                          *
+*  --------------------------                                          *
+*                                                                      *
+*  Under no circumstances and under no legal theory, whether tort      *
+*  (including negligence), contract, or otherwise, shall any           *
+*  Contributor, or anyone who distributes Covered Software as          *
+*  permitted above, be liable to You for any direct, indirect,         *
+*  special, incidental, or consequential damages of any character      *
+*  including, without limitation, damages for lost profits, loss of    *
+*  goodwill, work stoppage, computer failure or malfunction, or any    *
+*  and all other commercial damages or losses, even if such party      *
+*  shall have been informed of the possibility of such damages. This   *
+*  limitation of liability shall not apply to liability for death or   *
+*  personal injury resulting from such party's negligence to the       *
+*  extent applicable law prohibits such limitation. Some               *
+*  jurisdictions do not allow the exclusion or limitation of           *
+*  incidental or consequential damages, so this exclusion and          *
+*  limitation may not apply to You.                                    *
+*                                                                      *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+  This Source Code Form is subject to the terms of the Mozilla Public
+  License, v. 2.0. If a copy of the MPL was not distributed with this
+  file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+---------------------------------------------------------
+
+  This Source Code Form is "Incompatible With Secondary Licenses", as
+  defined by the Mozilla Public License, v. 2.0.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,40 @@
+# Amazon EC2 Container Service SDK
+
+> _Warning:_ This is an experimental preview release which is still under heavy development and not intended for public consumption, _caveat emptor_!
+
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+## Description
+
+Amazon EC2 Container Service is a highly scalable, high performance container
+management service that supports Docker containers and allows you to easily
+run distributed applications on a managed cluster of Amazon EC2 instances.
+Amazon EC2 Container Service lets you launch and stop container-enabled
+applications with simple API calls, allows you to query the state of your
+cluster from a centralized service, and gives you access to many familiar
+Amazon EC2 features like security groups, EBS volumes and IAM roles. You can
+use EC2 Container Service to schedule the placement of containers across your
+cluster based on your resource needs, isolation policies, and availability
+requirements. Amazon EC2 Container Service eliminates the need for you to
+operate your own cluster management and configuration management systems or
+worry about scaling your management infrastructure.
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-ecs)
+and the [AWS API Reference](http://docs.aws.amazon.com/AmazonECS/latest/APIReference/Welcome.html).
+
+
+## Contribute
+
+For any problems, comments, or feedback please create an issue [here on GitHub](https://github.com/brendanhay/amazonka/issues).
+
+> _Note:_ this library is an auto-generated Haskell package. Please see `amazonka-gen` for more information.
+
+
+## Licence
+
+`amazonka-ecs` is released under the [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/).
+
+Parts of the code are derived from AWS service descriptions, licensed under Apache 2.0.
+Source files subject to this contain an additional licensing clause in their header.
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/amazonka-ecs.cabal b/amazonka-ecs.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-ecs.cabal
@@ -0,0 +1,73 @@
+name:                  amazonka-ecs
+version:               0.3.0
+synopsis:              Amazon EC2 Container Service SDK.
+homepage:              https://github.com/brendanhay/amazonka
+license:               OtherLicense
+license-file:          LICENSE
+author:                Brendan Hay
+maintainer:            Brendan Hay <brendan.g.hay@gmail.com>
+copyright:             Copyright (c) 2013-2014 Brendan Hay
+category:              Network, AWS, Cloud, Distributed Computing
+build-type:            Simple
+extra-source-files:    README.md
+cabal-version:         >= 1.10
+
+description:
+    Amazon EC2 Container Service is a highly scalable, high performance container
+    management service that supports Docker containers and allows you to easily
+    run distributed applications on a managed cluster of Amazon EC2 instances.
+    Amazon EC2 Container Service lets you launch and stop container-enabled
+    applications with simple API calls, allows you to query the state of your
+    cluster from a centralized service, and gives you access to many familiar
+    Amazon EC2 features like security groups, EBS volumes and IAM roles. You can
+    use EC2 Container Service to schedule the placement of containers across your
+    cluster based on your resource needs, isolation policies, and availability
+    requirements. Amazon EC2 Container Service eliminates the need for you to
+    operate your own cluster management and configuration management systems or
+    worry about scaling your management infrastructure.
+
+    .
+    /See:/ <http://docs.aws.amazon.com/AmazonECS/latest/APIReference/Welcome.html AWS API Reference>
+    .
+    /Warning:/ This is an experimental preview release which is still under
+    heavy development and not intended for public consumption, caveat emptor!
+
+source-repository head
+    type:     git
+    location: git://github.com/brendanhay/amazonka.git
+
+library
+    default-language:  Haskell2010
+    hs-source-dirs:    src gen
+
+    ghc-options:       -Wall
+
+    exposed-modules:
+          Network.AWS.ECS
+        , Network.AWS.ECS.CreateCluster
+        , Network.AWS.ECS.DeleteCluster
+        , Network.AWS.ECS.DeregisterContainerInstance
+        , Network.AWS.ECS.DeregisterTaskDefinition
+        , Network.AWS.ECS.DescribeClusters
+        , Network.AWS.ECS.DescribeContainerInstances
+        , Network.AWS.ECS.DescribeTaskDefinition
+        , Network.AWS.ECS.DescribeTasks
+        , Network.AWS.ECS.DiscoverPollEndpoint
+        , Network.AWS.ECS.ListClusters
+        , Network.AWS.ECS.ListContainerInstances
+        , Network.AWS.ECS.ListTaskDefinitions
+        , Network.AWS.ECS.ListTasks
+        , Network.AWS.ECS.RegisterContainerInstance
+        , Network.AWS.ECS.RegisterTaskDefinition
+        , Network.AWS.ECS.RunTask
+        , Network.AWS.ECS.StartTask
+        , Network.AWS.ECS.StopTask
+        , Network.AWS.ECS.SubmitContainerStateChange
+        , Network.AWS.ECS.SubmitTaskStateChange
+        , Network.AWS.ECS.Types
+
+    other-modules:
+
+    build-depends:
+          amazonka-core == 0.3.0.*
+        , base          >= 4.7     && < 5
diff --git a/gen/Network/AWS/ECS.hs b/gen/Network/AWS/ECS.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ECS.hs
@@ -0,0 +1,69 @@
+-- Module      : Network.AWS.ECS
+-- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
+-- License     : This Source Code Form is subject to the terms of
+--               the Mozilla Public License, v. 2.0.
+--               A copy of the MPL can be found in the LICENSE file or
+--               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : experimental
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | Amazon EC2 Container Service is a highly scalable, high performance container
+-- management service that supports Docker containers and allows you to easily
+-- run distributed applications on a managed cluster of Amazon EC2 instances.
+-- Amazon EC2 Container Service lets you launch and stop container-enabled
+-- applications with simple API calls, allows you to query the state of your
+-- cluster from a centralized service, and gives you access to many familiar
+-- Amazon EC2 features like security groups, EBS volumes and IAM roles. You can
+-- use EC2 Container Service to schedule the placement of containers across your
+-- cluster based on your resource needs, isolation policies, and availability
+-- requirements. Amazon EC2 Container Service eliminates the need for you to
+-- operate your own cluster management and configuration management systems or
+-- worry about scaling your management infrastructure.
+module Network.AWS.ECS
+    ( module Network.AWS.ECS.CreateCluster
+    , module Network.AWS.ECS.DeleteCluster
+    , module Network.AWS.ECS.DeregisterContainerInstance
+    , module Network.AWS.ECS.DeregisterTaskDefinition
+    , module Network.AWS.ECS.DescribeClusters
+    , module Network.AWS.ECS.DescribeContainerInstances
+    , module Network.AWS.ECS.DescribeTaskDefinition
+    , module Network.AWS.ECS.DescribeTasks
+    , module Network.AWS.ECS.DiscoverPollEndpoint
+    , module Network.AWS.ECS.ListClusters
+    , module Network.AWS.ECS.ListContainerInstances
+    , module Network.AWS.ECS.ListTaskDefinitions
+    , module Network.AWS.ECS.ListTasks
+    , module Network.AWS.ECS.RegisterContainerInstance
+    , module Network.AWS.ECS.RegisterTaskDefinition
+    , module Network.AWS.ECS.RunTask
+    , module Network.AWS.ECS.StartTask
+    , module Network.AWS.ECS.StopTask
+    , module Network.AWS.ECS.SubmitContainerStateChange
+    , module Network.AWS.ECS.SubmitTaskStateChange
+    , module Network.AWS.ECS.Types
+    ) where
+
+import Network.AWS.ECS.CreateCluster
+import Network.AWS.ECS.DeleteCluster
+import Network.AWS.ECS.DeregisterContainerInstance
+import Network.AWS.ECS.DeregisterTaskDefinition
+import Network.AWS.ECS.DescribeClusters
+import Network.AWS.ECS.DescribeContainerInstances
+import Network.AWS.ECS.DescribeTaskDefinition
+import Network.AWS.ECS.DescribeTasks
+import Network.AWS.ECS.DiscoverPollEndpoint
+import Network.AWS.ECS.ListClusters
+import Network.AWS.ECS.ListContainerInstances
+import Network.AWS.ECS.ListTaskDefinitions
+import Network.AWS.ECS.ListTasks
+import Network.AWS.ECS.RegisterContainerInstance
+import Network.AWS.ECS.RegisterTaskDefinition
+import Network.AWS.ECS.RunTask
+import Network.AWS.ECS.StartTask
+import Network.AWS.ECS.StopTask
+import Network.AWS.ECS.SubmitContainerStateChange
+import Network.AWS.ECS.SubmitTaskStateChange
+import Network.AWS.ECS.Types
diff --git a/gen/Network/AWS/ECS/CreateCluster.hs b/gen/Network/AWS/ECS/CreateCluster.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ECS/CreateCluster.hs
@@ -0,0 +1,113 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.ECS.CreateCluster
+-- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
+-- License     : This Source Code Form is subject to the terms of
+--               the Mozilla Public License, v. 2.0.
+--               A copy of the MPL can be found in the LICENSE file or
+--               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : experimental
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | Creates a new Amazon ECS cluster. By default, your account will receive a 'default' cluster when you launch your first container instance. However, you can
+-- create your own cluster with a unique name with the 'CreateCluster' action.
+--
+-- During the preview, each account is limited to two clusters.
+--
+--
+--
+-- <http://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateCluster.html>
+module Network.AWS.ECS.CreateCluster
+    (
+    -- * Request
+      CreateCluster
+    -- ** Request constructor
+    , createCluster
+    -- ** Request lenses
+    , ccClusterName
+
+    -- * Response
+    , CreateClusterResponse
+    -- ** Response constructor
+    , createClusterResponse
+    -- ** Response lenses
+    , ccrCluster
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.ECS.Types
+import qualified GHC.Exts
+
+newtype CreateCluster = CreateCluster
+    { _ccClusterName :: Maybe Text
+    } deriving (Eq, Ord, Read, Show, Monoid)
+
+-- | 'CreateCluster' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ccClusterName' @::@ 'Maybe' 'Text'
+--
+createCluster :: CreateCluster
+createCluster = CreateCluster
+    { _ccClusterName = Nothing
+    }
+
+-- | The name of your cluster. If you do not specify a name for your cluster, you
+-- will create a cluster named 'default'.
+ccClusterName :: Lens' CreateCluster (Maybe Text)
+ccClusterName = lens _ccClusterName (\s a -> s { _ccClusterName = a })
+
+newtype CreateClusterResponse = CreateClusterResponse
+    { _ccrCluster :: Maybe Cluster
+    } deriving (Eq, Read, Show)
+
+-- | 'CreateClusterResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ccrCluster' @::@ 'Maybe' 'Cluster'
+--
+createClusterResponse :: CreateClusterResponse
+createClusterResponse = CreateClusterResponse
+    { _ccrCluster = Nothing
+    }
+
+-- | The full description of your new cluster.
+ccrCluster :: Lens' CreateClusterResponse (Maybe Cluster)
+ccrCluster = lens _ccrCluster (\s a -> s { _ccrCluster = a })
+
+instance ToPath CreateCluster where
+    toPath = const "/"
+
+instance ToQuery CreateCluster where
+    toQuery CreateCluster{..} = mconcat
+        [ "clusterName" =? _ccClusterName
+        ]
+
+instance ToHeaders CreateCluster
+
+instance AWSRequest CreateCluster where
+    type Sv CreateCluster = ECS
+    type Rs CreateCluster = CreateClusterResponse
+
+    request  = post "CreateCluster"
+    response = xmlResponse
+
+instance FromXML CreateClusterResponse where
+    parseXML = withElement "CreateClusterResult" $ \x -> CreateClusterResponse
+        <$> x .@? "cluster"
diff --git a/gen/Network/AWS/ECS/DeleteCluster.hs b/gen/Network/AWS/ECS/DeleteCluster.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ECS/DeleteCluster.hs
@@ -0,0 +1,110 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.ECS.DeleteCluster
+-- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
+-- License     : This Source Code Form is subject to the terms of
+--               the Mozilla Public License, v. 2.0.
+--               A copy of the MPL can be found in the LICENSE file or
+--               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : experimental
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | Deletes the specified cluster. You must deregister all container instances
+-- from this cluster before you may delete it. You can list the container
+-- instances in a cluster with 'ListContainerInstances' and deregister them with 'DeregisterContainerInstance'.
+--
+-- <http://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DeleteCluster.html>
+module Network.AWS.ECS.DeleteCluster
+    (
+    -- * Request
+      DeleteCluster
+    -- ** Request constructor
+    , deleteCluster
+    -- ** Request lenses
+    , dcCluster
+
+    -- * Response
+    , DeleteClusterResponse
+    -- ** Response constructor
+    , deleteClusterResponse
+    -- ** Response lenses
+    , dcrCluster
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.ECS.Types
+import qualified GHC.Exts
+
+newtype DeleteCluster = DeleteCluster
+    { _dcCluster :: Text
+    } deriving (Eq, Ord, Read, Show, Monoid, IsString)
+
+-- | 'DeleteCluster' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dcCluster' @::@ 'Text'
+--
+deleteCluster :: Text -- ^ 'dcCluster'
+              -> DeleteCluster
+deleteCluster p1 = DeleteCluster
+    { _dcCluster = p1
+    }
+
+-- | The cluster you want to delete.
+dcCluster :: Lens' DeleteCluster Text
+dcCluster = lens _dcCluster (\s a -> s { _dcCluster = a })
+
+newtype DeleteClusterResponse = DeleteClusterResponse
+    { _dcrCluster :: Maybe Cluster
+    } deriving (Eq, Read, Show)
+
+-- | 'DeleteClusterResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dcrCluster' @::@ 'Maybe' 'Cluster'
+--
+deleteClusterResponse :: DeleteClusterResponse
+deleteClusterResponse = DeleteClusterResponse
+    { _dcrCluster = Nothing
+    }
+
+-- | The full description of the deleted cluster.
+dcrCluster :: Lens' DeleteClusterResponse (Maybe Cluster)
+dcrCluster = lens _dcrCluster (\s a -> s { _dcrCluster = a })
+
+instance ToPath DeleteCluster where
+    toPath = const "/"
+
+instance ToQuery DeleteCluster where
+    toQuery DeleteCluster{..} = mconcat
+        [ "cluster" =? _dcCluster
+        ]
+
+instance ToHeaders DeleteCluster
+
+instance AWSRequest DeleteCluster where
+    type Sv DeleteCluster = ECS
+    type Rs DeleteCluster = DeleteClusterResponse
+
+    request  = post "DeleteCluster"
+    response = xmlResponse
+
+instance FromXML DeleteClusterResponse where
+    parseXML = withElement "DeleteClusterResult" $ \x -> DeleteClusterResponse
+        <$> x .@? "cluster"
diff --git a/gen/Network/AWS/ECS/DeregisterContainerInstance.hs b/gen/Network/AWS/ECS/DeregisterContainerInstance.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ECS/DeregisterContainerInstance.hs
@@ -0,0 +1,139 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.ECS.DeregisterContainerInstance
+-- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
+-- License     : This Source Code Form is subject to the terms of
+--               the Mozilla Public License, v. 2.0.
+--               A copy of the MPL can be found in the LICENSE file or
+--               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : experimental
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | Deregisters an Amazon ECS container instance from the specified cluster. This
+-- instance will no longer be available to run tasks.
+--
+-- <http://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DeregisterContainerInstance.html>
+module Network.AWS.ECS.DeregisterContainerInstance
+    (
+    -- * Request
+      DeregisterContainerInstance
+    -- ** Request constructor
+    , deregisterContainerInstance
+    -- ** Request lenses
+    , dci1Cluster
+    , dci1ContainerInstance
+    , dci1Force
+
+    -- * Response
+    , DeregisterContainerInstanceResponse
+    -- ** Response constructor
+    , deregisterContainerInstanceResponse
+    -- ** Response lenses
+    , dcirContainerInstance
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.ECS.Types
+import qualified GHC.Exts
+
+data DeregisterContainerInstance = DeregisterContainerInstance
+    { _dci1Cluster           :: Maybe Text
+    , _dci1ContainerInstance :: Text
+    , _dci1Force             :: Maybe Bool
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'DeregisterContainerInstance' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dci1Cluster' @::@ 'Maybe' 'Text'
+--
+-- * 'dci1ContainerInstance' @::@ 'Text'
+--
+-- * 'dci1Force' @::@ 'Maybe' 'Bool'
+--
+deregisterContainerInstance :: Text -- ^ 'dci1ContainerInstance'
+                            -> DeregisterContainerInstance
+deregisterContainerInstance p1 = DeregisterContainerInstance
+    { _dci1ContainerInstance = p1
+    , _dci1Cluster           = Nothing
+    , _dci1Force             = Nothing
+    }
+
+-- | The short name or full Amazon Resource Name (ARN) of the cluster that hosts
+-- the container instance you want to deregister. If you do not specify a
+-- cluster, the default cluster is assumed.
+dci1Cluster :: Lens' DeregisterContainerInstance (Maybe Text)
+dci1Cluster = lens _dci1Cluster (\s a -> s { _dci1Cluster = a })
+
+-- | The container instance UUID or full Amazon Resource Name (ARN) of the
+-- container instance you want to deregister. The ARN contains the 'arn:aws:ecs'
+-- namespace, followed by the region of the container instance, the AWS account
+-- ID of the container instance owner, the 'container-instance' namespace, and
+-- then the container instance UUID. For example, arn:aws:ecs:/region/:/aws_account_id/:container-instance//container_instance_UUID/.
+dci1ContainerInstance :: Lens' DeregisterContainerInstance Text
+dci1ContainerInstance =
+    lens _dci1ContainerInstance (\s a -> s { _dci1ContainerInstance = a })
+
+-- | Force the deregistration of the container instance. You can use the 'force'
+-- parameter if you have several tasks running on a container instance and you
+-- don't want to run 'StopTask' for each task before deregistering the container
+-- instance.
+dci1Force :: Lens' DeregisterContainerInstance (Maybe Bool)
+dci1Force = lens _dci1Force (\s a -> s { _dci1Force = a })
+
+newtype DeregisterContainerInstanceResponse = DeregisterContainerInstanceResponse
+    { _dcirContainerInstance :: Maybe ContainerInstance
+    } deriving (Eq, Read, Show)
+
+-- | 'DeregisterContainerInstanceResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dcirContainerInstance' @::@ 'Maybe' 'ContainerInstance'
+--
+deregisterContainerInstanceResponse :: DeregisterContainerInstanceResponse
+deregisterContainerInstanceResponse = DeregisterContainerInstanceResponse
+    { _dcirContainerInstance = Nothing
+    }
+
+dcirContainerInstance :: Lens' DeregisterContainerInstanceResponse (Maybe ContainerInstance)
+dcirContainerInstance =
+    lens _dcirContainerInstance (\s a -> s { _dcirContainerInstance = a })
+
+instance ToPath DeregisterContainerInstance where
+    toPath = const "/"
+
+instance ToQuery DeregisterContainerInstance where
+    toQuery DeregisterContainerInstance{..} = mconcat
+        [ "cluster"           =? _dci1Cluster
+        , "containerInstance" =? _dci1ContainerInstance
+        , "force"             =? _dci1Force
+        ]
+
+instance ToHeaders DeregisterContainerInstance
+
+instance AWSRequest DeregisterContainerInstance where
+    type Sv DeregisterContainerInstance = ECS
+    type Rs DeregisterContainerInstance = DeregisterContainerInstanceResponse
+
+    request  = post "DeregisterContainerInstance"
+    response = xmlResponse
+
+instance FromXML DeregisterContainerInstanceResponse where
+    parseXML = withElement "DeregisterContainerInstanceResult" $ \x -> DeregisterContainerInstanceResponse
+        <$> x .@? "containerInstance"
diff --git a/gen/Network/AWS/ECS/DeregisterTaskDefinition.hs b/gen/Network/AWS/ECS/DeregisterTaskDefinition.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ECS/DeregisterTaskDefinition.hs
@@ -0,0 +1,112 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.ECS.DeregisterTaskDefinition
+-- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
+-- License     : This Source Code Form is subject to the terms of
+--               the Mozilla Public License, v. 2.0.
+--               A copy of the MPL can be found in the LICENSE file or
+--               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : experimental
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | Deregisters the specified task definition. You will no longer be able to run
+-- tasks from this definition after deregistration.
+--
+-- <http://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DeregisterTaskDefinition.html>
+module Network.AWS.ECS.DeregisterTaskDefinition
+    (
+    -- * Request
+      DeregisterTaskDefinition
+    -- ** Request constructor
+    , deregisterTaskDefinition
+    -- ** Request lenses
+    , dtd1TaskDefinition
+
+    -- * Response
+    , DeregisterTaskDefinitionResponse
+    -- ** Response constructor
+    , deregisterTaskDefinitionResponse
+    -- ** Response lenses
+    , dtdrTaskDefinition
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.ECS.Types
+import qualified GHC.Exts
+
+newtype DeregisterTaskDefinition = DeregisterTaskDefinition
+    { _dtd1TaskDefinition :: Text
+    } deriving (Eq, Ord, Read, Show, Monoid, IsString)
+
+-- | 'DeregisterTaskDefinition' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dtd1TaskDefinition' @::@ 'Text'
+--
+deregisterTaskDefinition :: Text -- ^ 'dtd1TaskDefinition'
+                         -> DeregisterTaskDefinition
+deregisterTaskDefinition p1 = DeregisterTaskDefinition
+    { _dtd1TaskDefinition = p1
+    }
+
+-- | The 'family' and 'revision' ('family:revision') or full Amazon Resource Name (ARN)
+-- of the task definition that you want to deregister.
+dtd1TaskDefinition :: Lens' DeregisterTaskDefinition Text
+dtd1TaskDefinition =
+    lens _dtd1TaskDefinition (\s a -> s { _dtd1TaskDefinition = a })
+
+newtype DeregisterTaskDefinitionResponse = DeregisterTaskDefinitionResponse
+    { _dtdrTaskDefinition :: Maybe TaskDefinition
+    } deriving (Eq, Read, Show)
+
+-- | 'DeregisterTaskDefinitionResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dtdrTaskDefinition' @::@ 'Maybe' 'TaskDefinition'
+--
+deregisterTaskDefinitionResponse :: DeregisterTaskDefinitionResponse
+deregisterTaskDefinitionResponse = DeregisterTaskDefinitionResponse
+    { _dtdrTaskDefinition = Nothing
+    }
+
+-- | The full description of the deregistered task.
+dtdrTaskDefinition :: Lens' DeregisterTaskDefinitionResponse (Maybe TaskDefinition)
+dtdrTaskDefinition =
+    lens _dtdrTaskDefinition (\s a -> s { _dtdrTaskDefinition = a })
+
+instance ToPath DeregisterTaskDefinition where
+    toPath = const "/"
+
+instance ToQuery DeregisterTaskDefinition where
+    toQuery DeregisterTaskDefinition{..} = mconcat
+        [ "taskDefinition" =? _dtd1TaskDefinition
+        ]
+
+instance ToHeaders DeregisterTaskDefinition
+
+instance AWSRequest DeregisterTaskDefinition where
+    type Sv DeregisterTaskDefinition = ECS
+    type Rs DeregisterTaskDefinition = DeregisterTaskDefinitionResponse
+
+    request  = post "DeregisterTaskDefinition"
+    response = xmlResponse
+
+instance FromXML DeregisterTaskDefinitionResponse where
+    parseXML = withElement "DeregisterTaskDefinitionResult" $ \x -> DeregisterTaskDefinitionResponse
+        <$> x .@? "taskDefinition"
diff --git a/gen/Network/AWS/ECS/DescribeClusters.hs b/gen/Network/AWS/ECS/DescribeClusters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ECS/DescribeClusters.hs
@@ -0,0 +1,124 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.ECS.DescribeClusters
+-- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
+-- License     : This Source Code Form is subject to the terms of
+--               the Mozilla Public License, v. 2.0.
+--               A copy of the MPL can be found in the LICENSE file or
+--               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : experimental
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | Describes one or more of your clusters.
+--
+-- <http://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DescribeClusters.html>
+module Network.AWS.ECS.DescribeClusters
+    (
+    -- * Request
+      DescribeClusters
+    -- ** Request constructor
+    , describeClusters
+    -- ** Request lenses
+    , dcClusters
+
+    -- * Response
+    , DescribeClustersResponse
+    -- ** Response constructor
+    , describeClustersResponse
+    -- ** Response lenses
+    , dcrClusters
+    , dcrFailures
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.ECS.Types
+import qualified GHC.Exts
+
+newtype DescribeClusters = DescribeClusters
+    { _dcClusters :: List "member" Text
+    } deriving (Eq, Ord, Read, Show, Monoid, Semigroup)
+
+instance GHC.Exts.IsList DescribeClusters where
+    type Item DescribeClusters = Text
+
+    fromList = DescribeClusters . GHC.Exts.fromList
+    toList   = GHC.Exts.toList . _dcClusters
+
+-- | 'DescribeClusters' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dcClusters' @::@ ['Text']
+--
+describeClusters :: DescribeClusters
+describeClusters = DescribeClusters
+    { _dcClusters = mempty
+    }
+
+-- | A space-separated list of cluster names or full cluster Amazon Resource Name
+-- (ARN) entries. If you do not specify a cluster, the default cluster is
+-- assumed.
+dcClusters :: Lens' DescribeClusters [Text]
+dcClusters = lens _dcClusters (\s a -> s { _dcClusters = a }) . _List
+
+data DescribeClustersResponse = DescribeClustersResponse
+    { _dcrClusters :: List "member" Cluster
+    , _dcrFailures :: List "member" Failure
+    } deriving (Eq, Read, Show)
+
+-- | 'DescribeClustersResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dcrClusters' @::@ ['Cluster']
+--
+-- * 'dcrFailures' @::@ ['Failure']
+--
+describeClustersResponse :: DescribeClustersResponse
+describeClustersResponse = DescribeClustersResponse
+    { _dcrClusters = mempty
+    , _dcrFailures = mempty
+    }
+
+-- | The list of clusters.
+dcrClusters :: Lens' DescribeClustersResponse [Cluster]
+dcrClusters = lens _dcrClusters (\s a -> s { _dcrClusters = a }) . _List
+
+dcrFailures :: Lens' DescribeClustersResponse [Failure]
+dcrFailures = lens _dcrFailures (\s a -> s { _dcrFailures = a }) . _List
+
+instance ToPath DescribeClusters where
+    toPath = const "/"
+
+instance ToQuery DescribeClusters where
+    toQuery DescribeClusters{..} = mconcat
+        [ "clusters" =? _dcClusters
+        ]
+
+instance ToHeaders DescribeClusters
+
+instance AWSRequest DescribeClusters where
+    type Sv DescribeClusters = ECS
+    type Rs DescribeClusters = DescribeClustersResponse
+
+    request  = post "DescribeClusters"
+    response = xmlResponse
+
+instance FromXML DescribeClustersResponse where
+    parseXML = withElement "DescribeClustersResult" $ \x -> DescribeClustersResponse
+        <$> x .@? "clusters" .!@ mempty
+        <*> x .@? "failures" .!@ mempty
diff --git a/gen/Network/AWS/ECS/DescribeContainerInstances.hs b/gen/Network/AWS/ECS/DescribeContainerInstances.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ECS/DescribeContainerInstances.hs
@@ -0,0 +1,134 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.ECS.DescribeContainerInstances
+-- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
+-- License     : This Source Code Form is subject to the terms of
+--               the Mozilla Public License, v. 2.0.
+--               A copy of the MPL can be found in the LICENSE file or
+--               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : experimental
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | Describes Amazon EC2 Container Service container instances. Returns metadata
+-- about registered and remaining resources on each container instance requested.
+--
+-- <http://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DescribeContainerInstances.html>
+module Network.AWS.ECS.DescribeContainerInstances
+    (
+    -- * Request
+      DescribeContainerInstances
+    -- ** Request constructor
+    , describeContainerInstances
+    -- ** Request lenses
+    , dciCluster
+    , dciContainerInstances
+
+    -- * Response
+    , DescribeContainerInstancesResponse
+    -- ** Response constructor
+    , describeContainerInstancesResponse
+    -- ** Response lenses
+    , dcirContainerInstances
+    , dcirFailures
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.ECS.Types
+import qualified GHC.Exts
+
+data DescribeContainerInstances = DescribeContainerInstances
+    { _dciCluster            :: Maybe Text
+    , _dciContainerInstances :: List "member" Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'DescribeContainerInstances' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dciCluster' @::@ 'Maybe' 'Text'
+--
+-- * 'dciContainerInstances' @::@ ['Text']
+--
+describeContainerInstances :: DescribeContainerInstances
+describeContainerInstances = DescribeContainerInstances
+    { _dciCluster            = Nothing
+    , _dciContainerInstances = mempty
+    }
+
+-- | The short name or full Amazon Resource Name (ARN) of the cluster that hosts
+-- the container instances you want to describe. If you do not specify a
+-- cluster, the default cluster is assumed.
+dciCluster :: Lens' DescribeContainerInstances (Maybe Text)
+dciCluster = lens _dciCluster (\s a -> s { _dciCluster = a })
+
+-- | A space-separated list of container instance UUIDs or full Amazon Resource
+-- Name (ARN) entries.
+dciContainerInstances :: Lens' DescribeContainerInstances [Text]
+dciContainerInstances =
+    lens _dciContainerInstances (\s a -> s { _dciContainerInstances = a })
+        . _List
+
+data DescribeContainerInstancesResponse = DescribeContainerInstancesResponse
+    { _dcirContainerInstances :: List "member" ContainerInstance
+    , _dcirFailures           :: List "member" Failure
+    } deriving (Eq, Read, Show)
+
+-- | 'DescribeContainerInstancesResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dcirContainerInstances' @::@ ['ContainerInstance']
+--
+-- * 'dcirFailures' @::@ ['Failure']
+--
+describeContainerInstancesResponse :: DescribeContainerInstancesResponse
+describeContainerInstancesResponse = DescribeContainerInstancesResponse
+    { _dcirContainerInstances = mempty
+    , _dcirFailures           = mempty
+    }
+
+-- | The list of container instances.
+dcirContainerInstances :: Lens' DescribeContainerInstancesResponse [ContainerInstance]
+dcirContainerInstances =
+    lens _dcirContainerInstances (\s a -> s { _dcirContainerInstances = a })
+        . _List
+
+dcirFailures :: Lens' DescribeContainerInstancesResponse [Failure]
+dcirFailures = lens _dcirFailures (\s a -> s { _dcirFailures = a }) . _List
+
+instance ToPath DescribeContainerInstances where
+    toPath = const "/"
+
+instance ToQuery DescribeContainerInstances where
+    toQuery DescribeContainerInstances{..} = mconcat
+        [ "cluster"            =? _dciCluster
+        , "containerInstances" =? _dciContainerInstances
+        ]
+
+instance ToHeaders DescribeContainerInstances
+
+instance AWSRequest DescribeContainerInstances where
+    type Sv DescribeContainerInstances = ECS
+    type Rs DescribeContainerInstances = DescribeContainerInstancesResponse
+
+    request  = post "DescribeContainerInstances"
+    response = xmlResponse
+
+instance FromXML DescribeContainerInstancesResponse where
+    parseXML = withElement "DescribeContainerInstancesResult" $ \x -> DescribeContainerInstancesResponse
+        <$> x .@? "containerInstances" .!@ mempty
+        <*> x .@? "failures" .!@ mempty
diff --git a/gen/Network/AWS/ECS/DescribeTaskDefinition.hs b/gen/Network/AWS/ECS/DescribeTaskDefinition.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ECS/DescribeTaskDefinition.hs
@@ -0,0 +1,111 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.ECS.DescribeTaskDefinition
+-- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
+-- License     : This Source Code Form is subject to the terms of
+--               the Mozilla Public License, v. 2.0.
+--               A copy of the MPL can be found in the LICENSE file or
+--               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : experimental
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | Describes a task definition.
+--
+-- <http://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DescribeTaskDefinition.html>
+module Network.AWS.ECS.DescribeTaskDefinition
+    (
+    -- * Request
+      DescribeTaskDefinition
+    -- ** Request constructor
+    , describeTaskDefinition
+    -- ** Request lenses
+    , dtdTaskDefinition
+
+    -- * Response
+    , DescribeTaskDefinitionResponse
+    -- ** Response constructor
+    , describeTaskDefinitionResponse
+    -- ** Response lenses
+    , dtdr1TaskDefinition
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.ECS.Types
+import qualified GHC.Exts
+
+newtype DescribeTaskDefinition = DescribeTaskDefinition
+    { _dtdTaskDefinition :: Text
+    } deriving (Eq, Ord, Read, Show, Monoid, IsString)
+
+-- | 'DescribeTaskDefinition' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dtdTaskDefinition' @::@ 'Text'
+--
+describeTaskDefinition :: Text -- ^ 'dtdTaskDefinition'
+                       -> DescribeTaskDefinition
+describeTaskDefinition p1 = DescribeTaskDefinition
+    { _dtdTaskDefinition = p1
+    }
+
+-- | The 'family' and 'revision' ('family:revision') or full Amazon Resource Name (ARN)
+-- of the task definition that you want to describe.
+dtdTaskDefinition :: Lens' DescribeTaskDefinition Text
+dtdTaskDefinition =
+    lens _dtdTaskDefinition (\s a -> s { _dtdTaskDefinition = a })
+
+newtype DescribeTaskDefinitionResponse = DescribeTaskDefinitionResponse
+    { _dtdr1TaskDefinition :: Maybe TaskDefinition
+    } deriving (Eq, Read, Show)
+
+-- | 'DescribeTaskDefinitionResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dtdr1TaskDefinition' @::@ 'Maybe' 'TaskDefinition'
+--
+describeTaskDefinitionResponse :: DescribeTaskDefinitionResponse
+describeTaskDefinitionResponse = DescribeTaskDefinitionResponse
+    { _dtdr1TaskDefinition = Nothing
+    }
+
+-- | The full task definition description.
+dtdr1TaskDefinition :: Lens' DescribeTaskDefinitionResponse (Maybe TaskDefinition)
+dtdr1TaskDefinition =
+    lens _dtdr1TaskDefinition (\s a -> s { _dtdr1TaskDefinition = a })
+
+instance ToPath DescribeTaskDefinition where
+    toPath = const "/"
+
+instance ToQuery DescribeTaskDefinition where
+    toQuery DescribeTaskDefinition{..} = mconcat
+        [ "taskDefinition" =? _dtdTaskDefinition
+        ]
+
+instance ToHeaders DescribeTaskDefinition
+
+instance AWSRequest DescribeTaskDefinition where
+    type Sv DescribeTaskDefinition = ECS
+    type Rs DescribeTaskDefinition = DescribeTaskDefinitionResponse
+
+    request  = post "DescribeTaskDefinition"
+    response = xmlResponse
+
+instance FromXML DescribeTaskDefinitionResponse where
+    parseXML = withElement "DescribeTaskDefinitionResult" $ \x -> DescribeTaskDefinitionResponse
+        <$> x .@? "taskDefinition"
diff --git a/gen/Network/AWS/ECS/DescribeTasks.hs b/gen/Network/AWS/ECS/DescribeTasks.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ECS/DescribeTasks.hs
@@ -0,0 +1,129 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.ECS.DescribeTasks
+-- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
+-- License     : This Source Code Form is subject to the terms of
+--               the Mozilla Public License, v. 2.0.
+--               A copy of the MPL can be found in the LICENSE file or
+--               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : experimental
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | Describes a specified task or tasks.
+--
+-- <http://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DescribeTasks.html>
+module Network.AWS.ECS.DescribeTasks
+    (
+    -- * Request
+      DescribeTasks
+    -- ** Request constructor
+    , describeTasks
+    -- ** Request lenses
+    , dtCluster
+    , dtTasks
+
+    -- * Response
+    , DescribeTasksResponse
+    -- ** Response constructor
+    , describeTasksResponse
+    -- ** Response lenses
+    , dtrFailures
+    , dtrTasks
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.ECS.Types
+import qualified GHC.Exts
+
+data DescribeTasks = DescribeTasks
+    { _dtCluster :: Maybe Text
+    , _dtTasks   :: List "member" Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'DescribeTasks' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dtCluster' @::@ 'Maybe' 'Text'
+--
+-- * 'dtTasks' @::@ ['Text']
+--
+describeTasks :: DescribeTasks
+describeTasks = DescribeTasks
+    { _dtCluster = Nothing
+    , _dtTasks   = mempty
+    }
+
+-- | The short name or full Amazon Resource Name (ARN) of the cluster that hosts
+-- the task you want to describe. If you do not specify a cluster, the default
+-- cluster is assumed.
+dtCluster :: Lens' DescribeTasks (Maybe Text)
+dtCluster = lens _dtCluster (\s a -> s { _dtCluster = a })
+
+-- | A space-separated list of task UUIDs or full Amazon Resource Name (ARN)
+-- entries.
+dtTasks :: Lens' DescribeTasks [Text]
+dtTasks = lens _dtTasks (\s a -> s { _dtTasks = a }) . _List
+
+data DescribeTasksResponse = DescribeTasksResponse
+    { _dtrFailures :: List "member" Failure
+    , _dtrTasks    :: List "member" Task
+    } deriving (Eq, Read, Show)
+
+-- | 'DescribeTasksResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dtrFailures' @::@ ['Failure']
+--
+-- * 'dtrTasks' @::@ ['Task']
+--
+describeTasksResponse :: DescribeTasksResponse
+describeTasksResponse = DescribeTasksResponse
+    { _dtrTasks    = mempty
+    , _dtrFailures = mempty
+    }
+
+dtrFailures :: Lens' DescribeTasksResponse [Failure]
+dtrFailures = lens _dtrFailures (\s a -> s { _dtrFailures = a }) . _List
+
+-- | The list of tasks.
+dtrTasks :: Lens' DescribeTasksResponse [Task]
+dtrTasks = lens _dtrTasks (\s a -> s { _dtrTasks = a }) . _List
+
+instance ToPath DescribeTasks where
+    toPath = const "/"
+
+instance ToQuery DescribeTasks where
+    toQuery DescribeTasks{..} = mconcat
+        [ "cluster" =? _dtCluster
+        , "tasks"   =? _dtTasks
+        ]
+
+instance ToHeaders DescribeTasks
+
+instance AWSRequest DescribeTasks where
+    type Sv DescribeTasks = ECS
+    type Rs DescribeTasks = DescribeTasksResponse
+
+    request  = post "DescribeTasks"
+    response = xmlResponse
+
+instance FromXML DescribeTasksResponse where
+    parseXML = withElement "DescribeTasksResult" $ \x -> DescribeTasksResponse
+        <$> x .@? "failures" .!@ mempty
+        <*> x .@? "tasks" .!@ mempty
diff --git a/gen/Network/AWS/ECS/DiscoverPollEndpoint.hs b/gen/Network/AWS/ECS/DiscoverPollEndpoint.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ECS/DiscoverPollEndpoint.hs
@@ -0,0 +1,117 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.ECS.DiscoverPollEndpoint
+-- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
+-- License     : This Source Code Form is subject to the terms of
+--               the Mozilla Public License, v. 2.0.
+--               A copy of the MPL can be found in the LICENSE file or
+--               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : experimental
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | This action is only used by the Amazon EC2 Container Service agent, and it is
+-- not intended for use outside of the agent.
+--
+-- Returns an endpoint for the Amazon EC2 Container Service agent to poll for
+-- updates.
+--
+-- <http://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DiscoverPollEndpoint.html>
+module Network.AWS.ECS.DiscoverPollEndpoint
+    (
+    -- * Request
+      DiscoverPollEndpoint
+    -- ** Request constructor
+    , discoverPollEndpoint
+    -- ** Request lenses
+    , dpeContainerInstance
+
+    -- * Response
+    , DiscoverPollEndpointResponse
+    -- ** Response constructor
+    , discoverPollEndpointResponse
+    -- ** Response lenses
+    , dperEndpoint
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.ECS.Types
+import qualified GHC.Exts
+
+newtype DiscoverPollEndpoint = DiscoverPollEndpoint
+    { _dpeContainerInstance :: Maybe Text
+    } deriving (Eq, Ord, Read, Show, Monoid)
+
+-- | 'DiscoverPollEndpoint' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dpeContainerInstance' @::@ 'Maybe' 'Text'
+--
+discoverPollEndpoint :: DiscoverPollEndpoint
+discoverPollEndpoint = DiscoverPollEndpoint
+    { _dpeContainerInstance = Nothing
+    }
+
+-- | The container instance UUID or full Amazon Resource Name (ARN) of the
+-- container instance. The ARN contains the 'arn:aws:ecs' namespace, followed by
+-- the region of the container instance, the AWS account ID of the container
+-- instance owner, the 'container-instance' namespace, and then the container
+-- instance UUID. For example, arn:aws:ecs:/region/:/aws_account_id/:container-instance/
+-- /container_instance_UUID/.
+dpeContainerInstance :: Lens' DiscoverPollEndpoint (Maybe Text)
+dpeContainerInstance =
+    lens _dpeContainerInstance (\s a -> s { _dpeContainerInstance = a })
+
+newtype DiscoverPollEndpointResponse = DiscoverPollEndpointResponse
+    { _dperEndpoint :: Maybe Text
+    } deriving (Eq, Ord, Read, Show, Monoid)
+
+-- | 'DiscoverPollEndpointResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'dperEndpoint' @::@ 'Maybe' 'Text'
+--
+discoverPollEndpointResponse :: DiscoverPollEndpointResponse
+discoverPollEndpointResponse = DiscoverPollEndpointResponse
+    { _dperEndpoint = Nothing
+    }
+
+-- | The endpoint for the Amazon ECS agent to poll.
+dperEndpoint :: Lens' DiscoverPollEndpointResponse (Maybe Text)
+dperEndpoint = lens _dperEndpoint (\s a -> s { _dperEndpoint = a })
+
+instance ToPath DiscoverPollEndpoint where
+    toPath = const "/"
+
+instance ToQuery DiscoverPollEndpoint where
+    toQuery DiscoverPollEndpoint{..} = mconcat
+        [ "containerInstance" =? _dpeContainerInstance
+        ]
+
+instance ToHeaders DiscoverPollEndpoint
+
+instance AWSRequest DiscoverPollEndpoint where
+    type Sv DiscoverPollEndpoint = ECS
+    type Rs DiscoverPollEndpoint = DiscoverPollEndpointResponse
+
+    request  = post "DiscoverPollEndpoint"
+    response = xmlResponse
+
+instance FromXML DiscoverPollEndpointResponse where
+    parseXML = withElement "DiscoverPollEndpointResult" $ \x -> DiscoverPollEndpointResponse
+        <$> x .@? "endpoint"
diff --git a/gen/Network/AWS/ECS/ListClusters.hs b/gen/Network/AWS/ECS/ListClusters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ECS/ListClusters.hs
@@ -0,0 +1,140 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.ECS.ListClusters
+-- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
+-- License     : This Source Code Form is subject to the terms of
+--               the Mozilla Public License, v. 2.0.
+--               A copy of the MPL can be found in the LICENSE file or
+--               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : experimental
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | Returns a list of existing clusters.
+--
+-- <http://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ListClusters.html>
+module Network.AWS.ECS.ListClusters
+    (
+    -- * Request
+      ListClusters
+    -- ** Request constructor
+    , listClusters
+    -- ** Request lenses
+    , lcMaxResults
+    , lcNextToken
+
+    -- * Response
+    , ListClustersResponse
+    -- ** Response constructor
+    , listClustersResponse
+    -- ** Response lenses
+    , lcrClusterArns
+    , lcrNextToken
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.ECS.Types
+import qualified GHC.Exts
+
+data ListClusters = ListClusters
+    { _lcMaxResults :: Maybe Int
+    , _lcNextToken  :: Maybe Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'ListClusters' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'lcMaxResults' @::@ 'Maybe' 'Int'
+--
+-- * 'lcNextToken' @::@ 'Maybe' 'Text'
+--
+listClusters :: ListClusters
+listClusters = ListClusters
+    { _lcNextToken  = Nothing
+    , _lcMaxResults = Nothing
+    }
+
+-- | The maximum number of cluster results returned by 'ListClusters' in paginated
+-- output. When this parameter is used, 'ListClusters' 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 'ListClusters' request with the returned 'nextToken' value. This value can be between 1 and
+-- 100. If this parameter is not used, then 'ListClusters' returns up to 100
+-- results and a 'nextToken' value if applicable.
+lcMaxResults :: Lens' ListClusters (Maybe Int)
+lcMaxResults = lens _lcMaxResults (\s a -> s { _lcMaxResults = a })
+
+-- | The 'nextToken' value returned from a previous paginated 'ListClusters' 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.
+lcNextToken :: Lens' ListClusters (Maybe Text)
+lcNextToken = lens _lcNextToken (\s a -> s { _lcNextToken = a })
+
+data ListClustersResponse = ListClustersResponse
+    { _lcrClusterArns :: List "member" Text
+    , _lcrNextToken   :: Maybe Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'ListClustersResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'lcrClusterArns' @::@ ['Text']
+--
+-- * 'lcrNextToken' @::@ 'Maybe' 'Text'
+--
+listClustersResponse :: ListClustersResponse
+listClustersResponse = ListClustersResponse
+    { _lcrClusterArns = mempty
+    , _lcrNextToken   = Nothing
+    }
+
+-- | The list of full Amazon Resource Name (ARN) entries for each cluster
+-- associated with your account.
+lcrClusterArns :: Lens' ListClustersResponse [Text]
+lcrClusterArns = lens _lcrClusterArns (\s a -> s { _lcrClusterArns = a }) . _List
+
+-- | The 'nextToken' value to include in a future 'ListClusters' request. When the
+-- results of a 'ListClusters' 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.
+lcrNextToken :: Lens' ListClustersResponse (Maybe Text)
+lcrNextToken = lens _lcrNextToken (\s a -> s { _lcrNextToken = a })
+
+instance ToPath ListClusters where
+    toPath = const "/"
+
+instance ToQuery ListClusters where
+    toQuery ListClusters{..} = mconcat
+        [ "maxResults" =? _lcMaxResults
+        , "nextToken"  =? _lcNextToken
+        ]
+
+instance ToHeaders ListClusters
+
+instance AWSRequest ListClusters where
+    type Sv ListClusters = ECS
+    type Rs ListClusters = ListClustersResponse
+
+    request  = post "ListClusters"
+    response = xmlResponse
+
+instance FromXML ListClustersResponse where
+    parseXML = withElement "ListClustersResult" $ \x -> ListClustersResponse
+        <$> x .@? "clusterArns" .!@ mempty
+        <*> x .@? "nextToken"
diff --git a/gen/Network/AWS/ECS/ListContainerInstances.hs b/gen/Network/AWS/ECS/ListContainerInstances.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ECS/ListContainerInstances.hs
@@ -0,0 +1,156 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.ECS.ListContainerInstances
+-- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
+-- License     : This Source Code Form is subject to the terms of
+--               the Mozilla Public License, v. 2.0.
+--               A copy of the MPL can be found in the LICENSE file or
+--               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : experimental
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | Returns a list of container instances in a specified cluster.
+--
+-- <http://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ListContainerInstances.html>
+module Network.AWS.ECS.ListContainerInstances
+    (
+    -- * Request
+      ListContainerInstances
+    -- ** Request constructor
+    , listContainerInstances
+    -- ** Request lenses
+    , lciCluster
+    , lciMaxResults
+    , lciNextToken
+
+    -- * Response
+    , ListContainerInstancesResponse
+    -- ** Response constructor
+    , listContainerInstancesResponse
+    -- ** Response lenses
+    , lcirContainerInstanceArns
+    , lcirNextToken
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.ECS.Types
+import qualified GHC.Exts
+
+data ListContainerInstances = ListContainerInstances
+    { _lciCluster    :: Maybe Text
+    , _lciMaxResults :: Maybe Int
+    , _lciNextToken  :: Maybe Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'ListContainerInstances' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'lciCluster' @::@ 'Maybe' 'Text'
+--
+-- * 'lciMaxResults' @::@ 'Maybe' 'Int'
+--
+-- * 'lciNextToken' @::@ 'Maybe' 'Text'
+--
+listContainerInstances :: ListContainerInstances
+listContainerInstances = ListContainerInstances
+    { _lciCluster    = Nothing
+    , _lciNextToken  = Nothing
+    , _lciMaxResults = Nothing
+    }
+
+-- | The short name or full Amazon Resource Name (ARN) of the cluster that hosts
+-- the container instances you want to list. If you do not specify a cluster,
+-- the default cluster is assumed..
+lciCluster :: Lens' ListContainerInstances (Maybe Text)
+lciCluster = lens _lciCluster (\s a -> s { _lciCluster = a })
+
+-- | The maximum number of container instance results returned by 'ListContainerInstances' in paginated output. When this parameter is used, 'ListContainerInstances'
+-- 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 'ListContainerInstances' request with the returned 'nextToken'
+-- value. This value can be between 1 and 100. If this parameter is not used,
+-- then 'ListContainerInstances' returns up to 100 results and a 'nextToken' value
+-- if applicable.
+lciMaxResults :: Lens' ListContainerInstances (Maybe Int)
+lciMaxResults = lens _lciMaxResults (\s a -> s { _lciMaxResults = a })
+
+-- | The 'nextToken' value returned from a previous paginated 'ListContainerInstances'
+-- 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.
+lciNextToken :: Lens' ListContainerInstances (Maybe Text)
+lciNextToken = lens _lciNextToken (\s a -> s { _lciNextToken = a })
+
+data ListContainerInstancesResponse = ListContainerInstancesResponse
+    { _lcirContainerInstanceArns :: List "member" Text
+    , _lcirNextToken             :: Maybe Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'ListContainerInstancesResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'lcirContainerInstanceArns' @::@ ['Text']
+--
+-- * 'lcirNextToken' @::@ 'Maybe' 'Text'
+--
+listContainerInstancesResponse :: ListContainerInstancesResponse
+listContainerInstancesResponse = ListContainerInstancesResponse
+    { _lcirContainerInstanceArns = mempty
+    , _lcirNextToken             = Nothing
+    }
+
+-- | The list of container instance full Amazon Resource Name (ARN) entries for
+-- each container instance associated with the specified cluster.
+lcirContainerInstanceArns :: Lens' ListContainerInstancesResponse [Text]
+lcirContainerInstanceArns =
+    lens _lcirContainerInstanceArns
+        (\s a -> s { _lcirContainerInstanceArns = a })
+            . _List
+
+-- | The 'nextToken' value to include in a future 'ListContainerInstances' request.
+-- When the results of a 'ListContainerInstances' 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.
+lcirNextToken :: Lens' ListContainerInstancesResponse (Maybe Text)
+lcirNextToken = lens _lcirNextToken (\s a -> s { _lcirNextToken = a })
+
+instance ToPath ListContainerInstances where
+    toPath = const "/"
+
+instance ToQuery ListContainerInstances where
+    toQuery ListContainerInstances{..} = mconcat
+        [ "cluster"    =? _lciCluster
+        , "maxResults" =? _lciMaxResults
+        , "nextToken"  =? _lciNextToken
+        ]
+
+instance ToHeaders ListContainerInstances
+
+instance AWSRequest ListContainerInstances where
+    type Sv ListContainerInstances = ECS
+    type Rs ListContainerInstances = ListContainerInstancesResponse
+
+    request  = post "ListContainerInstances"
+    response = xmlResponse
+
+instance FromXML ListContainerInstancesResponse where
+    parseXML = withElement "ListContainerInstancesResult" $ \x -> ListContainerInstancesResponse
+        <$> x .@? "containerInstanceArns" .!@ mempty
+        <*> x .@? "nextToken"
diff --git a/gen/Network/AWS/ECS/ListTaskDefinitions.hs b/gen/Network/AWS/ECS/ListTaskDefinitions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ECS/ListTaskDefinitions.hs
@@ -0,0 +1,154 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.ECS.ListTaskDefinitions
+-- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
+-- License     : This Source Code Form is subject to the terms of
+--               the Mozilla Public License, v. 2.0.
+--               A copy of the MPL can be found in the LICENSE file or
+--               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : experimental
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | Returns a list of task definitions that are registered to your account. You
+-- can filter the results by family name with the 'familyPrefix' parameter.
+--
+-- <http://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ListTaskDefinitions.html>
+module Network.AWS.ECS.ListTaskDefinitions
+    (
+    -- * Request
+      ListTaskDefinitions
+    -- ** Request constructor
+    , listTaskDefinitions
+    -- ** Request lenses
+    , ltdFamilyPrefix
+    , ltdMaxResults
+    , ltdNextToken
+
+    -- * Response
+    , ListTaskDefinitionsResponse
+    -- ** Response constructor
+    , listTaskDefinitionsResponse
+    -- ** Response lenses
+    , ltdrNextToken
+    , ltdrTaskDefinitionArns
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.ECS.Types
+import qualified GHC.Exts
+
+data ListTaskDefinitions = ListTaskDefinitions
+    { _ltdFamilyPrefix :: Maybe Text
+    , _ltdMaxResults   :: Maybe Int
+    , _ltdNextToken    :: Maybe Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'ListTaskDefinitions' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ltdFamilyPrefix' @::@ 'Maybe' 'Text'
+--
+-- * 'ltdMaxResults' @::@ 'Maybe' 'Int'
+--
+-- * 'ltdNextToken' @::@ 'Maybe' 'Text'
+--
+listTaskDefinitions :: ListTaskDefinitions
+listTaskDefinitions = ListTaskDefinitions
+    { _ltdFamilyPrefix = Nothing
+    , _ltdNextToken    = Nothing
+    , _ltdMaxResults   = Nothing
+    }
+
+-- | The name of the family that you want to filter the 'ListTaskDefinitions'
+-- results with. Specifying a 'familyPrefix' will limit the listed task
+-- definitions to definitions that belong to that family.
+ltdFamilyPrefix :: Lens' ListTaskDefinitions (Maybe Text)
+ltdFamilyPrefix = lens _ltdFamilyPrefix (\s a -> s { _ltdFamilyPrefix = a })
+
+-- | The maximum number of task definition results returned by 'ListTaskDefinitions'
+-- in paginated output. When this parameter is used, 'ListTaskDefinitions' 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 'ListTaskDefinitions' request with the returned 'nextToken' value. This
+-- value can be between 1 and 100. If this parameter is not used, then 'ListTaskDefinitions' returns up to 100 results and a 'nextToken' value if applicable.
+ltdMaxResults :: Lens' ListTaskDefinitions (Maybe Int)
+ltdMaxResults = lens _ltdMaxResults (\s a -> s { _ltdMaxResults = a })
+
+-- | The 'nextToken' value returned from a previous paginated 'ListTaskDefinitions'
+-- 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.
+ltdNextToken :: Lens' ListTaskDefinitions (Maybe Text)
+ltdNextToken = lens _ltdNextToken (\s a -> s { _ltdNextToken = a })
+
+data ListTaskDefinitionsResponse = ListTaskDefinitionsResponse
+    { _ltdrNextToken          :: Maybe Text
+    , _ltdrTaskDefinitionArns :: List "member" Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'ListTaskDefinitionsResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ltdrNextToken' @::@ 'Maybe' 'Text'
+--
+-- * 'ltdrTaskDefinitionArns' @::@ ['Text']
+--
+listTaskDefinitionsResponse :: ListTaskDefinitionsResponse
+listTaskDefinitionsResponse = ListTaskDefinitionsResponse
+    { _ltdrTaskDefinitionArns = mempty
+    , _ltdrNextToken          = Nothing
+    }
+
+-- | The 'nextToken' value to include in a future 'ListTaskDefinitions' request. When
+-- the results of a 'ListTaskDefinitions' 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.
+ltdrNextToken :: Lens' ListTaskDefinitionsResponse (Maybe Text)
+ltdrNextToken = lens _ltdrNextToken (\s a -> s { _ltdrNextToken = a })
+
+-- | The list of task definition Amazon Resource Name (ARN) entries for the 'ListTaskDefintions' request.
+ltdrTaskDefinitionArns :: Lens' ListTaskDefinitionsResponse [Text]
+ltdrTaskDefinitionArns =
+    lens _ltdrTaskDefinitionArns (\s a -> s { _ltdrTaskDefinitionArns = a })
+        . _List
+
+instance ToPath ListTaskDefinitions where
+    toPath = const "/"
+
+instance ToQuery ListTaskDefinitions where
+    toQuery ListTaskDefinitions{..} = mconcat
+        [ "familyPrefix" =? _ltdFamilyPrefix
+        , "maxResults"   =? _ltdMaxResults
+        , "nextToken"    =? _ltdNextToken
+        ]
+
+instance ToHeaders ListTaskDefinitions
+
+instance AWSRequest ListTaskDefinitions where
+    type Sv ListTaskDefinitions = ECS
+    type Rs ListTaskDefinitions = ListTaskDefinitionsResponse
+
+    request  = post "ListTaskDefinitions"
+    response = xmlResponse
+
+instance FromXML ListTaskDefinitionsResponse where
+    parseXML = withElement "ListTaskDefinitionsResult" $ \x -> ListTaskDefinitionsResponse
+        <$> x .@? "nextToken"
+        <*> x .@? "taskDefinitionArns" .!@ mempty
diff --git a/gen/Network/AWS/ECS/ListTasks.hs b/gen/Network/AWS/ECS/ListTasks.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ECS/ListTasks.hs
@@ -0,0 +1,178 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.ECS.ListTasks
+-- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
+-- License     : This Source Code Form is subject to the terms of
+--               the Mozilla Public License, v. 2.0.
+--               A copy of the MPL can be found in the LICENSE file or
+--               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : experimental
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | Returns a list of tasks for a specified cluster. You can filter the results
+-- by family name or by a particular container instance with the 'family' and 'containerInstance' parameters.
+--
+-- <http://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ListTasks.html>
+module Network.AWS.ECS.ListTasks
+    (
+    -- * Request
+      ListTasks
+    -- ** Request constructor
+    , listTasks
+    -- ** Request lenses
+    , ltCluster
+    , ltContainerInstance
+    , ltFamily
+    , ltMaxResults
+    , ltNextToken
+
+    -- * Response
+    , ListTasksResponse
+    -- ** Response constructor
+    , listTasksResponse
+    -- ** Response lenses
+    , ltrNextToken
+    , ltrTaskArns
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.ECS.Types
+import qualified GHC.Exts
+
+data ListTasks = ListTasks
+    { _ltCluster           :: Maybe Text
+    , _ltContainerInstance :: Maybe Text
+    , _ltFamily            :: Maybe Text
+    , _ltMaxResults        :: Maybe Int
+    , _ltNextToken         :: Maybe Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'ListTasks' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ltCluster' @::@ 'Maybe' 'Text'
+--
+-- * 'ltContainerInstance' @::@ 'Maybe' 'Text'
+--
+-- * 'ltFamily' @::@ 'Maybe' 'Text'
+--
+-- * 'ltMaxResults' @::@ 'Maybe' 'Int'
+--
+-- * 'ltNextToken' @::@ 'Maybe' 'Text'
+--
+listTasks :: ListTasks
+listTasks = ListTasks
+    { _ltCluster           = Nothing
+    , _ltContainerInstance = Nothing
+    , _ltFamily            = Nothing
+    , _ltNextToken         = Nothing
+    , _ltMaxResults        = Nothing
+    }
+
+-- | The short name or full Amazon Resource Name (ARN) of the cluster that hosts
+-- the tasks you want to list. If you do not specify a cluster, the default
+-- cluster is assumed..
+ltCluster :: Lens' ListTasks (Maybe Text)
+ltCluster = lens _ltCluster (\s a -> s { _ltCluster = a })
+
+-- | The container instance UUID or full Amazon Resource Name (ARN) of the
+-- container instance that you want to filter the 'ListTasks' results with.
+-- Specifying a 'containerInstance' will limit the results to tasks that belong to
+-- that container instance.
+ltContainerInstance :: Lens' ListTasks (Maybe Text)
+ltContainerInstance =
+    lens _ltContainerInstance (\s a -> s { _ltContainerInstance = a })
+
+-- | The name of the family that you want to filter the 'ListTasks' results with.
+-- Specifying a 'family' will limit the results to tasks that belong to that
+-- family.
+ltFamily :: Lens' ListTasks (Maybe Text)
+ltFamily = lens _ltFamily (\s a -> s { _ltFamily = a })
+
+-- | The maximum number of task results returned by 'ListTasks' in paginated output.
+-- When this parameter is used, 'ListTasks' 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 'ListTasks' request with the
+-- returned 'nextToken' value. This value can be between 1 and 100. If this
+-- parameter is not used, then 'ListTasks' returns up to 100 results and a 'nextToken' value if applicable.
+ltMaxResults :: Lens' ListTasks (Maybe Int)
+ltMaxResults = lens _ltMaxResults (\s a -> s { _ltMaxResults = a })
+
+-- | The 'nextToken' value returned from a previous paginated 'ListTasks' 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.
+ltNextToken :: Lens' ListTasks (Maybe Text)
+ltNextToken = lens _ltNextToken (\s a -> s { _ltNextToken = a })
+
+data ListTasksResponse = ListTasksResponse
+    { _ltrNextToken :: Maybe Text
+    , _ltrTaskArns  :: List "member" Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'ListTasksResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ltrNextToken' @::@ 'Maybe' 'Text'
+--
+-- * 'ltrTaskArns' @::@ ['Text']
+--
+listTasksResponse :: ListTasksResponse
+listTasksResponse = ListTasksResponse
+    { _ltrTaskArns  = mempty
+    , _ltrNextToken = Nothing
+    }
+
+-- | The 'nextToken' value to include in a future 'ListTasks' request. When the
+-- results of a 'ListTasks' 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.
+ltrNextToken :: Lens' ListTasksResponse (Maybe Text)
+ltrNextToken = lens _ltrNextToken (\s a -> s { _ltrNextToken = a })
+
+-- | The list of task Amazon Resource Name (ARN) entries for the 'ListTasks' request.
+ltrTaskArns :: Lens' ListTasksResponse [Text]
+ltrTaskArns = lens _ltrTaskArns (\s a -> s { _ltrTaskArns = a }) . _List
+
+instance ToPath ListTasks where
+    toPath = const "/"
+
+instance ToQuery ListTasks where
+    toQuery ListTasks{..} = mconcat
+        [ "cluster"           =? _ltCluster
+        , "containerInstance" =? _ltContainerInstance
+        , "family"            =? _ltFamily
+        , "maxResults"        =? _ltMaxResults
+        , "nextToken"         =? _ltNextToken
+        ]
+
+instance ToHeaders ListTasks
+
+instance AWSRequest ListTasks where
+    type Sv ListTasks = ECS
+    type Rs ListTasks = ListTasksResponse
+
+    request  = post "ListTasks"
+    response = xmlResponse
+
+instance FromXML ListTasksResponse where
+    parseXML = withElement "ListTasksResult" $ \x -> ListTasksResponse
+        <$> x .@? "nextToken"
+        <*> x .@? "taskArns" .!@ mempty
diff --git a/gen/Network/AWS/ECS/RegisterContainerInstance.hs b/gen/Network/AWS/ECS/RegisterContainerInstance.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ECS/RegisterContainerInstance.hs
@@ -0,0 +1,146 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.ECS.RegisterContainerInstance
+-- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
+-- License     : This Source Code Form is subject to the terms of
+--               the Mozilla Public License, v. 2.0.
+--               A copy of the MPL can be found in the LICENSE file or
+--               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : experimental
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | This action is only used by the Amazon EC2 Container Service agent, and it is
+-- not intended for use outside of the agent.
+--
+-- Registers an Amazon EC2 instance into the specified cluster. This instance
+-- will become available to place containers on.
+--
+-- <http://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RegisterContainerInstance.html>
+module Network.AWS.ECS.RegisterContainerInstance
+    (
+    -- * Request
+      RegisterContainerInstance
+    -- ** Request constructor
+    , registerContainerInstance
+    -- ** Request lenses
+    , rciCluster
+    , rciInstanceIdentityDocument
+    , rciInstanceIdentityDocumentSignature
+    , rciTotalResources
+
+    -- * Response
+    , RegisterContainerInstanceResponse
+    -- ** Response constructor
+    , registerContainerInstanceResponse
+    -- ** Response lenses
+    , rcirContainerInstance
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.ECS.Types
+import qualified GHC.Exts
+
+data RegisterContainerInstance = RegisterContainerInstance
+    { _rciCluster                           :: Maybe Text
+    , _rciInstanceIdentityDocument          :: Maybe Text
+    , _rciInstanceIdentityDocumentSignature :: Maybe Text
+    , _rciTotalResources                    :: List "member" Resource
+    } deriving (Eq, Read, Show)
+
+-- | 'RegisterContainerInstance' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'rciCluster' @::@ 'Maybe' 'Text'
+--
+-- * 'rciInstanceIdentityDocument' @::@ 'Maybe' 'Text'
+--
+-- * 'rciInstanceIdentityDocumentSignature' @::@ 'Maybe' 'Text'
+--
+-- * 'rciTotalResources' @::@ ['Resource']
+--
+registerContainerInstance :: RegisterContainerInstance
+registerContainerInstance = RegisterContainerInstance
+    { _rciCluster                           = Nothing
+    , _rciInstanceIdentityDocument          = Nothing
+    , _rciInstanceIdentityDocumentSignature = Nothing
+    , _rciTotalResources                    = mempty
+    }
+
+-- | The short name or full Amazon Resource Name (ARN) of the cluster that you
+-- want to register your container instance with. If you do not specify a
+-- cluster, the default cluster is assumed..
+rciCluster :: Lens' RegisterContainerInstance (Maybe Text)
+rciCluster = lens _rciCluster (\s a -> s { _rciCluster = a })
+
+rciInstanceIdentityDocument :: Lens' RegisterContainerInstance (Maybe Text)
+rciInstanceIdentityDocument =
+    lens _rciInstanceIdentityDocument
+        (\s a -> s { _rciInstanceIdentityDocument = a })
+
+rciInstanceIdentityDocumentSignature :: Lens' RegisterContainerInstance (Maybe Text)
+rciInstanceIdentityDocumentSignature =
+    lens _rciInstanceIdentityDocumentSignature
+        (\s a -> s { _rciInstanceIdentityDocumentSignature = a })
+
+rciTotalResources :: Lens' RegisterContainerInstance [Resource]
+rciTotalResources =
+    lens _rciTotalResources (\s a -> s { _rciTotalResources = a })
+        . _List
+
+newtype RegisterContainerInstanceResponse = RegisterContainerInstanceResponse
+    { _rcirContainerInstance :: Maybe ContainerInstance
+    } deriving (Eq, Read, Show)
+
+-- | 'RegisterContainerInstanceResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'rcirContainerInstance' @::@ 'Maybe' 'ContainerInstance'
+--
+registerContainerInstanceResponse :: RegisterContainerInstanceResponse
+registerContainerInstanceResponse = RegisterContainerInstanceResponse
+    { _rcirContainerInstance = Nothing
+    }
+
+rcirContainerInstance :: Lens' RegisterContainerInstanceResponse (Maybe ContainerInstance)
+rcirContainerInstance =
+    lens _rcirContainerInstance (\s a -> s { _rcirContainerInstance = a })
+
+instance ToPath RegisterContainerInstance where
+    toPath = const "/"
+
+instance ToQuery RegisterContainerInstance where
+    toQuery RegisterContainerInstance{..} = mconcat
+        [ "cluster"                           =? _rciCluster
+        , "instanceIdentityDocument"          =? _rciInstanceIdentityDocument
+        , "instanceIdentityDocumentSignature" =? _rciInstanceIdentityDocumentSignature
+        , "totalResources"                    =? _rciTotalResources
+        ]
+
+instance ToHeaders RegisterContainerInstance
+
+instance AWSRequest RegisterContainerInstance where
+    type Sv RegisterContainerInstance = ECS
+    type Rs RegisterContainerInstance = RegisterContainerInstanceResponse
+
+    request  = post "RegisterContainerInstance"
+    response = xmlResponse
+
+instance FromXML RegisterContainerInstanceResponse where
+    parseXML = withElement "RegisterContainerInstanceResult" $ \x -> RegisterContainerInstanceResponse
+        <$> x .@? "containerInstance"
diff --git a/gen/Network/AWS/ECS/RegisterTaskDefinition.hs b/gen/Network/AWS/ECS/RegisterTaskDefinition.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ECS/RegisterTaskDefinition.hs
@@ -0,0 +1,123 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.ECS.RegisterTaskDefinition
+-- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
+-- License     : This Source Code Form is subject to the terms of
+--               the Mozilla Public License, v. 2.0.
+--               A copy of the MPL can be found in the LICENSE file or
+--               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : experimental
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | Registers a new task definition from the supplied 'family' and 'containerDefinitions'.
+--
+-- <http://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RegisterTaskDefinition.html>
+module Network.AWS.ECS.RegisterTaskDefinition
+    (
+    -- * Request
+      RegisterTaskDefinition
+    -- ** Request constructor
+    , registerTaskDefinition
+    -- ** Request lenses
+    , rtdContainerDefinitions
+    , rtdFamily
+
+    -- * Response
+    , RegisterTaskDefinitionResponse
+    -- ** Response constructor
+    , registerTaskDefinitionResponse
+    -- ** Response lenses
+    , rtdrTaskDefinition
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.ECS.Types
+import qualified GHC.Exts
+
+data RegisterTaskDefinition = RegisterTaskDefinition
+    { _rtdContainerDefinitions :: List "member" ContainerDefinition
+    , _rtdFamily               :: Text
+    } deriving (Eq, Read, Show)
+
+-- | 'RegisterTaskDefinition' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'rtdContainerDefinitions' @::@ ['ContainerDefinition']
+--
+-- * 'rtdFamily' @::@ 'Text'
+--
+registerTaskDefinition :: Text -- ^ 'rtdFamily'
+                       -> RegisterTaskDefinition
+registerTaskDefinition p1 = RegisterTaskDefinition
+    { _rtdFamily               = p1
+    , _rtdContainerDefinitions = mempty
+    }
+
+-- | A list of container definitions in JSON format that describe the different
+-- containers that make up your task.
+rtdContainerDefinitions :: Lens' RegisterTaskDefinition [ContainerDefinition]
+rtdContainerDefinitions =
+    lens _rtdContainerDefinitions (\s a -> s { _rtdContainerDefinitions = a })
+        . _List
+
+-- | You can specify a 'family' for a task definition, which allows you to track
+-- multiple versions of the same task definition. You can think of the 'family' as
+-- a name for your task definition.
+rtdFamily :: Lens' RegisterTaskDefinition Text
+rtdFamily = lens _rtdFamily (\s a -> s { _rtdFamily = a })
+
+newtype RegisterTaskDefinitionResponse = RegisterTaskDefinitionResponse
+    { _rtdrTaskDefinition :: Maybe TaskDefinition
+    } deriving (Eq, Read, Show)
+
+-- | 'RegisterTaskDefinitionResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'rtdrTaskDefinition' @::@ 'Maybe' 'TaskDefinition'
+--
+registerTaskDefinitionResponse :: RegisterTaskDefinitionResponse
+registerTaskDefinitionResponse = RegisterTaskDefinitionResponse
+    { _rtdrTaskDefinition = Nothing
+    }
+
+rtdrTaskDefinition :: Lens' RegisterTaskDefinitionResponse (Maybe TaskDefinition)
+rtdrTaskDefinition =
+    lens _rtdrTaskDefinition (\s a -> s { _rtdrTaskDefinition = a })
+
+instance ToPath RegisterTaskDefinition where
+    toPath = const "/"
+
+instance ToQuery RegisterTaskDefinition where
+    toQuery RegisterTaskDefinition{..} = mconcat
+        [ "containerDefinitions" =? _rtdContainerDefinitions
+        , "family"               =? _rtdFamily
+        ]
+
+instance ToHeaders RegisterTaskDefinition
+
+instance AWSRequest RegisterTaskDefinition where
+    type Sv RegisterTaskDefinition = ECS
+    type Rs RegisterTaskDefinition = RegisterTaskDefinitionResponse
+
+    request  = post "RegisterTaskDefinition"
+    response = xmlResponse
+
+instance FromXML RegisterTaskDefinitionResponse where
+    parseXML = withElement "RegisterTaskDefinitionResult" $ \x -> RegisterTaskDefinitionResponse
+        <$> x .@? "taskDefinition"
diff --git a/gen/Network/AWS/ECS/RunTask.hs b/gen/Network/AWS/ECS/RunTask.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ECS/RunTask.hs
@@ -0,0 +1,154 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.ECS.RunTask
+-- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
+-- License     : This Source Code Form is subject to the terms of
+--               the Mozilla Public License, v. 2.0.
+--               A copy of the MPL can be found in the LICENSE file or
+--               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : experimental
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | Start a task using random placement and the default Amazon ECS scheduler. If
+-- you want to use your own scheduler or place a task on a specific container
+-- instance, use 'StartTask' instead.
+--
+-- <http://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RunTask.html>
+module Network.AWS.ECS.RunTask
+    (
+    -- * Request
+      RunTask
+    -- ** Request constructor
+    , runTask
+    -- ** Request lenses
+    , rtCluster
+    , rtCount
+    , rtOverrides
+    , rtTaskDefinition
+
+    -- * Response
+    , RunTaskResponse
+    -- ** Response constructor
+    , runTaskResponse
+    -- ** Response lenses
+    , rtrFailures
+    , rtrTasks
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.ECS.Types
+import qualified GHC.Exts
+
+data RunTask = RunTask
+    { _rtCluster        :: Maybe Text
+    , _rtCount          :: Maybe Int
+    , _rtOverrides      :: Maybe TaskOverride
+    , _rtTaskDefinition :: Text
+    } deriving (Eq, Read, Show)
+
+-- | 'RunTask' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'rtCluster' @::@ 'Maybe' 'Text'
+--
+-- * 'rtCount' @::@ 'Maybe' 'Int'
+--
+-- * 'rtOverrides' @::@ 'Maybe' 'TaskOverride'
+--
+-- * 'rtTaskDefinition' @::@ 'Text'
+--
+runTask :: Text -- ^ 'rtTaskDefinition'
+        -> RunTask
+runTask p1 = RunTask
+    { _rtTaskDefinition = p1
+    , _rtCluster        = Nothing
+    , _rtOverrides      = Nothing
+    , _rtCount          = Nothing
+    }
+
+-- | The short name or full Amazon Resource Name (ARN) of the cluster that you
+-- want to run your task on. If you do not specify a cluster, the default
+-- cluster is assumed..
+rtCluster :: Lens' RunTask (Maybe Text)
+rtCluster = lens _rtCluster (\s a -> s { _rtCluster = a })
+
+-- | The number of instances of the specified task that you would like to place on
+-- your cluster.
+rtCount :: Lens' RunTask (Maybe Int)
+rtCount = lens _rtCount (\s a -> s { _rtCount = a })
+
+rtOverrides :: Lens' RunTask (Maybe TaskOverride)
+rtOverrides = lens _rtOverrides (\s a -> s { _rtOverrides = a })
+
+-- | The 'family' and 'revision' ('family:revision') or full Amazon Resource Name (ARN)
+-- of the task definition that you want to run.
+rtTaskDefinition :: Lens' RunTask Text
+rtTaskDefinition = lens _rtTaskDefinition (\s a -> s { _rtTaskDefinition = a })
+
+data RunTaskResponse = RunTaskResponse
+    { _rtrFailures :: List "member" Failure
+    , _rtrTasks    :: List "member" Task
+    } deriving (Eq, Read, Show)
+
+-- | 'RunTaskResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'rtrFailures' @::@ ['Failure']
+--
+-- * 'rtrTasks' @::@ ['Task']
+--
+runTaskResponse :: RunTaskResponse
+runTaskResponse = RunTaskResponse
+    { _rtrTasks    = mempty
+    , _rtrFailures = mempty
+    }
+
+-- | Any failed tasks from your 'RunTask' action are listed here.
+rtrFailures :: Lens' RunTaskResponse [Failure]
+rtrFailures = lens _rtrFailures (\s a -> s { _rtrFailures = a }) . _List
+
+-- | A full description of the tasks that were run. Each task that was
+-- successfully placed on your cluster will be described here.
+rtrTasks :: Lens' RunTaskResponse [Task]
+rtrTasks = lens _rtrTasks (\s a -> s { _rtrTasks = a }) . _List
+
+instance ToPath RunTask where
+    toPath = const "/"
+
+instance ToQuery RunTask where
+    toQuery RunTask{..} = mconcat
+        [ "cluster"        =? _rtCluster
+        , "count"          =? _rtCount
+        , "overrides"      =? _rtOverrides
+        , "taskDefinition" =? _rtTaskDefinition
+        ]
+
+instance ToHeaders RunTask
+
+instance AWSRequest RunTask where
+    type Sv RunTask = ECS
+    type Rs RunTask = RunTaskResponse
+
+    request  = post "RunTask"
+    response = xmlResponse
+
+instance FromXML RunTaskResponse where
+    parseXML = withElement "RunTaskResult" $ \x -> RunTaskResponse
+        <$> x .@? "failures" .!@ mempty
+        <*> x .@? "tasks" .!@ mempty
diff --git a/gen/Network/AWS/ECS/StartTask.hs b/gen/Network/AWS/ECS/StartTask.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ECS/StartTask.hs
@@ -0,0 +1,157 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.ECS.StartTask
+-- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
+-- License     : This Source Code Form is subject to the terms of
+--               the Mozilla Public License, v. 2.0.
+--               A copy of the MPL can be found in the LICENSE file or
+--               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : experimental
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | Starts a new task from the specified task definition on the specified
+-- container instance or instances. If you want to use the default Amazon ECS
+-- scheduler to place your task, use 'RunTask' instead.
+--
+-- <http://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_StartTask.html>
+module Network.AWS.ECS.StartTask
+    (
+    -- * Request
+      StartTask
+    -- ** Request constructor
+    , startTask
+    -- ** Request lenses
+    , st1Cluster
+    , st1ContainerInstances
+    , st1Overrides
+    , st1TaskDefinition
+
+    -- * Response
+    , StartTaskResponse
+    -- ** Response constructor
+    , startTaskResponse
+    -- ** Response lenses
+    , strFailures
+    , strTasks
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.ECS.Types
+import qualified GHC.Exts
+
+data StartTask = StartTask
+    { _st1Cluster            :: Maybe Text
+    , _st1ContainerInstances :: List "member" Text
+    , _st1Overrides          :: Maybe TaskOverride
+    , _st1TaskDefinition     :: Text
+    } deriving (Eq, Read, Show)
+
+-- | 'StartTask' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'st1Cluster' @::@ 'Maybe' 'Text'
+--
+-- * 'st1ContainerInstances' @::@ ['Text']
+--
+-- * 'st1Overrides' @::@ 'Maybe' 'TaskOverride'
+--
+-- * 'st1TaskDefinition' @::@ 'Text'
+--
+startTask :: Text -- ^ 'st1TaskDefinition'
+          -> StartTask
+startTask p1 = StartTask
+    { _st1TaskDefinition     = p1
+    , _st1Cluster            = Nothing
+    , _st1Overrides          = Nothing
+    , _st1ContainerInstances = mempty
+    }
+
+-- | The short name or full Amazon Resource Name (ARN) of the cluster that you
+-- want to start your task on. If you do not specify a cluster, the default
+-- cluster is assumed..
+st1Cluster :: Lens' StartTask (Maybe Text)
+st1Cluster = lens _st1Cluster (\s a -> s { _st1Cluster = a })
+
+-- | The container instance UUIDs or full Amazon Resource Name (ARN) entries for
+-- the container instances on which you would like to place your task.
+st1ContainerInstances :: Lens' StartTask [Text]
+st1ContainerInstances =
+    lens _st1ContainerInstances (\s a -> s { _st1ContainerInstances = a })
+        . _List
+
+st1Overrides :: Lens' StartTask (Maybe TaskOverride)
+st1Overrides = lens _st1Overrides (\s a -> s { _st1Overrides = a })
+
+-- | The 'family' and 'revision' ('family:revision') or full Amazon Resource Name (ARN)
+-- of the task definition that you want to start.
+st1TaskDefinition :: Lens' StartTask Text
+st1TaskDefinition =
+    lens _st1TaskDefinition (\s a -> s { _st1TaskDefinition = a })
+
+data StartTaskResponse = StartTaskResponse
+    { _strFailures :: List "member" Failure
+    , _strTasks    :: List "member" Task
+    } deriving (Eq, Read, Show)
+
+-- | 'StartTaskResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'strFailures' @::@ ['Failure']
+--
+-- * 'strTasks' @::@ ['Task']
+--
+startTaskResponse :: StartTaskResponse
+startTaskResponse = StartTaskResponse
+    { _strTasks    = mempty
+    , _strFailures = mempty
+    }
+
+-- | Any failed tasks from your 'StartTask' action are listed here.
+strFailures :: Lens' StartTaskResponse [Failure]
+strFailures = lens _strFailures (\s a -> s { _strFailures = a }) . _List
+
+-- | A full description of the tasks that were started. Each task that was
+-- successfully placed on your container instances will be described here.
+strTasks :: Lens' StartTaskResponse [Task]
+strTasks = lens _strTasks (\s a -> s { _strTasks = a }) . _List
+
+instance ToPath StartTask where
+    toPath = const "/"
+
+instance ToQuery StartTask where
+    toQuery StartTask{..} = mconcat
+        [ "cluster"            =? _st1Cluster
+        , "containerInstances" =? _st1ContainerInstances
+        , "overrides"          =? _st1Overrides
+        , "taskDefinition"     =? _st1TaskDefinition
+        ]
+
+instance ToHeaders StartTask
+
+instance AWSRequest StartTask where
+    type Sv StartTask = ECS
+    type Rs StartTask = StartTaskResponse
+
+    request  = post "StartTask"
+    response = xmlResponse
+
+instance FromXML StartTaskResponse where
+    parseXML = withElement "StartTaskResult" $ \x -> StartTaskResponse
+        <$> x .@? "failures" .!@ mempty
+        <*> x .@? "tasks" .!@ mempty
diff --git a/gen/Network/AWS/ECS/StopTask.hs b/gen/Network/AWS/ECS/StopTask.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ECS/StopTask.hs
@@ -0,0 +1,120 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.ECS.StopTask
+-- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
+-- License     : This Source Code Form is subject to the terms of
+--               the Mozilla Public License, v. 2.0.
+--               A copy of the MPL can be found in the LICENSE file or
+--               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : experimental
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | Stops a running task.
+--
+-- <http://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_StopTask.html>
+module Network.AWS.ECS.StopTask
+    (
+    -- * Request
+      StopTask
+    -- ** Request constructor
+    , stopTask
+    -- ** Request lenses
+    , stCluster
+    , stTask
+
+    -- * Response
+    , StopTaskResponse
+    -- ** Response constructor
+    , stopTaskResponse
+    -- ** Response lenses
+    , strTask
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.ECS.Types
+import qualified GHC.Exts
+
+data StopTask = StopTask
+    { _stCluster :: Maybe Text
+    , _stTask    :: Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'StopTask' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'stCluster' @::@ 'Maybe' 'Text'
+--
+-- * 'stTask' @::@ 'Text'
+--
+stopTask :: Text -- ^ 'stTask'
+         -> StopTask
+stopTask p1 = StopTask
+    { _stTask    = p1
+    , _stCluster = Nothing
+    }
+
+-- | The short name or full Amazon Resource Name (ARN) of the cluster that hosts
+-- the task you want to stop. If you do not specify a cluster, the default
+-- cluster is assumed..
+stCluster :: Lens' StopTask (Maybe Text)
+stCluster = lens _stCluster (\s a -> s { _stCluster = a })
+
+-- | The task UUIDs or full Amazon Resource Name (ARN) entry of the task you would
+-- like to stop.
+stTask :: Lens' StopTask Text
+stTask = lens _stTask (\s a -> s { _stTask = a })
+
+newtype StopTaskResponse = StopTaskResponse
+    { _strTask :: Maybe Task
+    } deriving (Eq, Read, Show)
+
+-- | 'StopTaskResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'strTask' @::@ 'Maybe' 'Task'
+--
+stopTaskResponse :: StopTaskResponse
+stopTaskResponse = StopTaskResponse
+    { _strTask = Nothing
+    }
+
+strTask :: Lens' StopTaskResponse (Maybe Task)
+strTask = lens _strTask (\s a -> s { _strTask = a })
+
+instance ToPath StopTask where
+    toPath = const "/"
+
+instance ToQuery StopTask where
+    toQuery StopTask{..} = mconcat
+        [ "cluster" =? _stCluster
+        , "task"    =? _stTask
+        ]
+
+instance ToHeaders StopTask
+
+instance AWSRequest StopTask where
+    type Sv StopTask = ECS
+    type Rs StopTask = StopTaskResponse
+
+    request  = post "StopTask"
+    response = xmlResponse
+
+instance FromXML StopTaskResponse where
+    parseXML = withElement "StopTaskResult" $ \x -> StopTaskResponse
+        <$> x .@? "task"
diff --git a/gen/Network/AWS/ECS/SubmitContainerStateChange.hs b/gen/Network/AWS/ECS/SubmitContainerStateChange.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ECS/SubmitContainerStateChange.hs
@@ -0,0 +1,176 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.ECS.SubmitContainerStateChange
+-- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
+-- License     : This Source Code Form is subject to the terms of
+--               the Mozilla Public License, v. 2.0.
+--               A copy of the MPL can be found in the LICENSE file or
+--               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : experimental
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | This action is only used by the Amazon EC2 Container Service agent, and it is
+-- not intended for use outside of the agent.
+--
+-- Sent to acknowledge that a container changed states.
+--
+-- <http://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_SubmitContainerStateChange.html>
+module Network.AWS.ECS.SubmitContainerStateChange
+    (
+    -- * Request
+      SubmitContainerStateChange
+    -- ** Request constructor
+    , submitContainerStateChange
+    -- ** Request lenses
+    , scscCluster
+    , scscContainerName
+    , scscExitCode
+    , scscNetworkBindings
+    , scscReason
+    , scscStatus
+    , scscTask
+
+    -- * Response
+    , SubmitContainerStateChangeResponse
+    -- ** Response constructor
+    , submitContainerStateChangeResponse
+    -- ** Response lenses
+    , scscrAcknowledgment
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.ECS.Types
+import qualified GHC.Exts
+
+data SubmitContainerStateChange = SubmitContainerStateChange
+    { _scscCluster         :: Maybe Text
+    , _scscContainerName   :: Maybe Text
+    , _scscExitCode        :: Maybe Int
+    , _scscNetworkBindings :: List "member" NetworkBinding
+    , _scscReason          :: Maybe Text
+    , _scscStatus          :: Maybe Text
+    , _scscTask            :: Maybe Text
+    } deriving (Eq, Read, Show)
+
+-- | 'SubmitContainerStateChange' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'scscCluster' @::@ 'Maybe' 'Text'
+--
+-- * 'scscContainerName' @::@ 'Maybe' 'Text'
+--
+-- * 'scscExitCode' @::@ 'Maybe' 'Int'
+--
+-- * 'scscNetworkBindings' @::@ ['NetworkBinding']
+--
+-- * 'scscReason' @::@ 'Maybe' 'Text'
+--
+-- * 'scscStatus' @::@ 'Maybe' 'Text'
+--
+-- * 'scscTask' @::@ 'Maybe' 'Text'
+--
+submitContainerStateChange :: SubmitContainerStateChange
+submitContainerStateChange = SubmitContainerStateChange
+    { _scscCluster         = Nothing
+    , _scscTask            = Nothing
+    , _scscContainerName   = Nothing
+    , _scscStatus          = Nothing
+    , _scscExitCode        = Nothing
+    , _scscReason          = Nothing
+    , _scscNetworkBindings = mempty
+    }
+
+-- | The short name or full Amazon Resource Name (ARN) of the cluster that hosts
+-- the container.
+scscCluster :: Lens' SubmitContainerStateChange (Maybe Text)
+scscCluster = lens _scscCluster (\s a -> s { _scscCluster = a })
+
+-- | The name of the container.
+scscContainerName :: Lens' SubmitContainerStateChange (Maybe Text)
+scscContainerName =
+    lens _scscContainerName (\s a -> s { _scscContainerName = a })
+
+-- | The exit code returned for the state change request.
+scscExitCode :: Lens' SubmitContainerStateChange (Maybe Int)
+scscExitCode = lens _scscExitCode (\s a -> s { _scscExitCode = a })
+
+-- | The network bindings of the container.
+scscNetworkBindings :: Lens' SubmitContainerStateChange [NetworkBinding]
+scscNetworkBindings =
+    lens _scscNetworkBindings (\s a -> s { _scscNetworkBindings = a })
+        . _List
+
+-- | The reason for the state change request.
+scscReason :: Lens' SubmitContainerStateChange (Maybe Text)
+scscReason = lens _scscReason (\s a -> s { _scscReason = a })
+
+-- | The status of the state change request.
+scscStatus :: Lens' SubmitContainerStateChange (Maybe Text)
+scscStatus = lens _scscStatus (\s a -> s { _scscStatus = a })
+
+-- | The task UUID or full Amazon Resource Name (ARN) of the task that hosts the
+-- container.
+scscTask :: Lens' SubmitContainerStateChange (Maybe Text)
+scscTask = lens _scscTask (\s a -> s { _scscTask = a })
+
+newtype SubmitContainerStateChangeResponse = SubmitContainerStateChangeResponse
+    { _scscrAcknowledgment :: Maybe Text
+    } deriving (Eq, Ord, Read, Show, Monoid)
+
+-- | 'SubmitContainerStateChangeResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'scscrAcknowledgment' @::@ 'Maybe' 'Text'
+--
+submitContainerStateChangeResponse :: SubmitContainerStateChangeResponse
+submitContainerStateChangeResponse = SubmitContainerStateChangeResponse
+    { _scscrAcknowledgment = Nothing
+    }
+
+-- | Acknowledgement of the state change.
+scscrAcknowledgment :: Lens' SubmitContainerStateChangeResponse (Maybe Text)
+scscrAcknowledgment =
+    lens _scscrAcknowledgment (\s a -> s { _scscrAcknowledgment = a })
+
+instance ToPath SubmitContainerStateChange where
+    toPath = const "/"
+
+instance ToQuery SubmitContainerStateChange where
+    toQuery SubmitContainerStateChange{..} = mconcat
+        [ "cluster"         =? _scscCluster
+        , "containerName"   =? _scscContainerName
+        , "exitCode"        =? _scscExitCode
+        , "networkBindings" =? _scscNetworkBindings
+        , "reason"          =? _scscReason
+        , "status"          =? _scscStatus
+        , "task"            =? _scscTask
+        ]
+
+instance ToHeaders SubmitContainerStateChange
+
+instance AWSRequest SubmitContainerStateChange where
+    type Sv SubmitContainerStateChange = ECS
+    type Rs SubmitContainerStateChange = SubmitContainerStateChangeResponse
+
+    request  = post "SubmitContainerStateChange"
+    response = xmlResponse
+
+instance FromXML SubmitContainerStateChangeResponse where
+    parseXML = withElement "SubmitContainerStateChangeResult" $ \x -> SubmitContainerStateChangeResponse
+        <$> x .@? "acknowledgment"
diff --git a/gen/Network/AWS/ECS/SubmitTaskStateChange.hs b/gen/Network/AWS/ECS/SubmitTaskStateChange.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ECS/SubmitTaskStateChange.hs
@@ -0,0 +1,143 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.ECS.SubmitTaskStateChange
+-- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
+-- License     : This Source Code Form is subject to the terms of
+--               the Mozilla Public License, v. 2.0.
+--               A copy of the MPL can be found in the LICENSE file or
+--               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : experimental
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- | This action is only used by the Amazon EC2 Container Service agent, and it is
+-- not intended for use outside of the agent.
+--
+-- Sent to acknowledge that a task changed states.
+--
+-- <http://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_SubmitTaskStateChange.html>
+module Network.AWS.ECS.SubmitTaskStateChange
+    (
+    -- * Request
+      SubmitTaskStateChange
+    -- ** Request constructor
+    , submitTaskStateChange
+    -- ** Request lenses
+    , stscCluster
+    , stscReason
+    , stscStatus
+    , stscTask
+
+    -- * Response
+    , SubmitTaskStateChangeResponse
+    -- ** Response constructor
+    , submitTaskStateChangeResponse
+    -- ** Response lenses
+    , stscrAcknowledgment
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.Query
+import Network.AWS.ECS.Types
+import qualified GHC.Exts
+
+data SubmitTaskStateChange = SubmitTaskStateChange
+    { _stscCluster :: Maybe Text
+    , _stscReason  :: Maybe Text
+    , _stscStatus  :: Maybe Text
+    , _stscTask    :: Maybe Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'SubmitTaskStateChange' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'stscCluster' @::@ 'Maybe' 'Text'
+--
+-- * 'stscReason' @::@ 'Maybe' 'Text'
+--
+-- * 'stscStatus' @::@ 'Maybe' 'Text'
+--
+-- * 'stscTask' @::@ 'Maybe' 'Text'
+--
+submitTaskStateChange :: SubmitTaskStateChange
+submitTaskStateChange = SubmitTaskStateChange
+    { _stscCluster = Nothing
+    , _stscTask    = Nothing
+    , _stscStatus  = Nothing
+    , _stscReason  = Nothing
+    }
+
+-- | The short name or full Amazon Resource Name (ARN) of the cluster that hosts
+-- the task.
+stscCluster :: Lens' SubmitTaskStateChange (Maybe Text)
+stscCluster = lens _stscCluster (\s a -> s { _stscCluster = a })
+
+-- | The reason for the state change request.
+stscReason :: Lens' SubmitTaskStateChange (Maybe Text)
+stscReason = lens _stscReason (\s a -> s { _stscReason = a })
+
+-- | The status of the state change request.
+stscStatus :: Lens' SubmitTaskStateChange (Maybe Text)
+stscStatus = lens _stscStatus (\s a -> s { _stscStatus = a })
+
+-- | The task UUID or full Amazon Resource Name (ARN) of the task in the state
+-- change request.
+stscTask :: Lens' SubmitTaskStateChange (Maybe Text)
+stscTask = lens _stscTask (\s a -> s { _stscTask = a })
+
+newtype SubmitTaskStateChangeResponse = SubmitTaskStateChangeResponse
+    { _stscrAcknowledgment :: Maybe Text
+    } deriving (Eq, Ord, Read, Show, Monoid)
+
+-- | 'SubmitTaskStateChangeResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'stscrAcknowledgment' @::@ 'Maybe' 'Text'
+--
+submitTaskStateChangeResponse :: SubmitTaskStateChangeResponse
+submitTaskStateChangeResponse = SubmitTaskStateChangeResponse
+    { _stscrAcknowledgment = Nothing
+    }
+
+-- | Acknowledgement of the state change.
+stscrAcknowledgment :: Lens' SubmitTaskStateChangeResponse (Maybe Text)
+stscrAcknowledgment =
+    lens _stscrAcknowledgment (\s a -> s { _stscrAcknowledgment = a })
+
+instance ToPath SubmitTaskStateChange where
+    toPath = const "/"
+
+instance ToQuery SubmitTaskStateChange where
+    toQuery SubmitTaskStateChange{..} = mconcat
+        [ "cluster" =? _stscCluster
+        , "reason"  =? _stscReason
+        , "status"  =? _stscStatus
+        , "task"    =? _stscTask
+        ]
+
+instance ToHeaders SubmitTaskStateChange
+
+instance AWSRequest SubmitTaskStateChange where
+    type Sv SubmitTaskStateChange = ECS
+    type Rs SubmitTaskStateChange = SubmitTaskStateChangeResponse
+
+    request  = post "SubmitTaskStateChange"
+    response = xmlResponse
+
+instance FromXML SubmitTaskStateChangeResponse where
+    parseXML = withElement "SubmitTaskStateChangeResult" $ \x -> SubmitTaskStateChangeResponse
+        <$> x .@? "acknowledgment"
diff --git a/gen/Network/AWS/ECS/Types.hs b/gen/Network/AWS/ECS/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ECS/Types.hs
@@ -0,0 +1,1041 @@
+{-# LANGUAGE DataKinds                   #-}
+{-# LANGUAGE DeriveGeneric               #-}
+{-# LANGUAGE FlexibleInstances           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
+{-# LANGUAGE LambdaCase                  #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE OverloadedStrings           #-}
+{-# LANGUAGE RecordWildCards             #-}
+{-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE ViewPatterns                #-}
+
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Module      : Network.AWS.ECS.Types
+-- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
+-- License     : This Source Code Form is subject to the terms of
+--               the Mozilla Public License, v. 2.0.
+--               A copy of the MPL can be found in the LICENSE file or
+--               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : experimental
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+module Network.AWS.ECS.Types
+    (
+    -- * Service
+      ECS
+    -- ** Error
+    , RESTError
+    -- ** XML
+    , ns
+
+    -- * NetworkBinding
+    , NetworkBinding
+    , networkBinding
+    , nbBindIP
+    , nbContainerPort
+    , nbHostPort
+
+    -- * Cluster
+    , Cluster
+    , cluster
+    , cClusterArn
+    , cClusterName
+    , cStatus
+
+    -- * ContainerOverride
+    , ContainerOverride
+    , containerOverride
+    , coCommand
+    , coName
+
+    -- * KeyValuePair
+    , KeyValuePair
+    , keyValuePair
+    , kvpName
+    , kvpValue
+
+    -- * TaskOverride
+    , TaskOverride
+    , taskOverride
+    , toContainerOverrides
+
+    -- * Container
+    , Container
+    , container
+    , cContainerArn
+    , cExitCode
+    , cLastStatus
+    , cName
+    , cNetworkBindings
+    , cReason
+    , cTaskArn
+
+    -- * ContainerDefinition
+    , ContainerDefinition
+    , containerDefinition
+    , cdCommand
+    , cdCpu
+    , cdEntryPoint
+    , cdEnvironment
+    , cdEssential
+    , cdImage
+    , cdLinks
+    , cdMemory
+    , cdName
+    , cdPortMappings
+
+    -- * Resource
+    , Resource
+    , resource
+    , rDoubleValue
+    , rIntegerValue
+    , rLongValue
+    , rName
+    , rStringSetValue
+    , rType
+
+    -- * Task
+    , Task
+    , task
+    , tClusterArn
+    , tContainerInstanceArn
+    , tContainers
+    , tDesiredStatus
+    , tLastStatus
+    , tOverrides
+    , tTaskArn
+    , tTaskDefinitionArn
+
+    -- * PortMapping
+    , PortMapping
+    , portMapping
+    , pmContainerPort
+    , pmHostPort
+
+    -- * TaskDefinition
+    , TaskDefinition
+    , taskDefinition
+    , tdContainerDefinitions
+    , tdFamily
+    , tdRevision
+    , tdTaskDefinitionArn
+
+    -- * Failure
+    , Failure
+    , failure
+    , fArn
+    , fReason
+
+    -- * ContainerInstance
+    , ContainerInstance
+    , containerInstance
+    , ciAgentConnected
+    , ciContainerInstanceArn
+    , ciEc2InstanceId
+    , ciRegisteredResources
+    , ciRemainingResources
+    , ciStatus
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Signing
+import qualified GHC.Exts
+
+-- | Version @2014-11-13@ of the Amazon EC2 Container Service service.
+data ECS
+
+instance AWSService ECS where
+    type Sg ECS = V4
+    type Er ECS = RESTError
+
+    service = service'
+      where
+        service' :: Service ECS
+        service' = Service
+            { _svcAbbrev       = "ECS"
+            , _svcPrefix       = "ecs"
+            , _svcVersion      = "2014-11-13"
+            , _svcTargetPrefix = Nothing
+            , _svcJSONVersion  = Nothing
+            , _svcHandle       = handle
+            , _svcRetry        = retry
+            }
+
+        handle :: Status
+               -> Maybe (LazyByteString -> ServiceError RESTError)
+        handle = restError statusSuccess service'
+
+        retry :: Retry ECS
+        retry = Exponential
+            { _retryBase     = 0.05
+            , _retryGrowth   = 2
+            , _retryAttempts = 5
+            , _retryCheck    = check
+            }
+
+        check :: Status
+              -> RESTError
+              -> Bool
+        check (statusCode -> s) (awsErrorCode -> e)
+            | s == 500  = True -- General Server Error
+            | s == 509  = True -- Limit Exceeded
+            | s == 503  = True -- Service Unavailable
+            | otherwise = False
+
+ns :: Text
+ns = "http://ecs.amazonaws.com/doc/2014-11-13/"
+{-# INLINE ns #-}
+
+data NetworkBinding = NetworkBinding
+    { _nbBindIP        :: Maybe Text
+    , _nbContainerPort :: Maybe Int
+    , _nbHostPort      :: Maybe Int
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'NetworkBinding' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'nbBindIP' @::@ 'Maybe' 'Text'
+--
+-- * 'nbContainerPort' @::@ 'Maybe' 'Int'
+--
+-- * 'nbHostPort' @::@ 'Maybe' 'Int'
+--
+networkBinding :: NetworkBinding
+networkBinding = NetworkBinding
+    { _nbBindIP        = Nothing
+    , _nbContainerPort = Nothing
+    , _nbHostPort      = Nothing
+    }
+
+-- | The IP address that the container is bound to on the container instance.
+nbBindIP :: Lens' NetworkBinding (Maybe Text)
+nbBindIP = lens _nbBindIP (\s a -> s { _nbBindIP = a })
+
+-- | The port number on the container that should be used with the network binding.
+nbContainerPort :: Lens' NetworkBinding (Maybe Int)
+nbContainerPort = lens _nbContainerPort (\s a -> s { _nbContainerPort = a })
+
+-- | The port number on the host that should be used with the network binding.
+nbHostPort :: Lens' NetworkBinding (Maybe Int)
+nbHostPort = lens _nbHostPort (\s a -> s { _nbHostPort = a })
+
+instance FromXML NetworkBinding where
+    parseXML x = NetworkBinding
+        <$> x .@? "bindIP"
+        <*> x .@? "containerPort"
+        <*> x .@? "hostPort"
+
+instance ToQuery NetworkBinding where
+    toQuery NetworkBinding{..} = mconcat
+        [ "bindIP"        =? _nbBindIP
+        , "containerPort" =? _nbContainerPort
+        , "hostPort"      =? _nbHostPort
+        ]
+
+data Cluster = Cluster
+    { _cClusterArn  :: Maybe Text
+    , _cClusterName :: Maybe Text
+    , _cStatus      :: Maybe Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'Cluster' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'cClusterArn' @::@ 'Maybe' 'Text'
+--
+-- * 'cClusterName' @::@ 'Maybe' 'Text'
+--
+-- * 'cStatus' @::@ 'Maybe' 'Text'
+--
+cluster :: Cluster
+cluster = Cluster
+    { _cClusterArn  = Nothing
+    , _cClusterName = Nothing
+    , _cStatus      = Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) that identifies the cluster. The ARN contains
+-- the 'arn:aws:ecs' namespace, followed by the region of the cluster, the AWS
+-- account ID of the cluster owner, the 'cluster' namespace, and then the cluster
+-- name. For example, arn:aws:ecs:/region/:/012345678910/:cluster//test/.
+cClusterArn :: Lens' Cluster (Maybe Text)
+cClusterArn = lens _cClusterArn (\s a -> s { _cClusterArn = a })
+
+-- | A user-generated string that you can use to identify your cluster.
+cClusterName :: Lens' Cluster (Maybe Text)
+cClusterName = lens _cClusterName (\s a -> s { _cClusterName = a })
+
+-- | The status of the cluster. The valid values are 'ACTIVE' or 'INACTIVE'. 'ACTIVE'
+-- indicates that you can register container instances with the cluster and the
+-- associated instances can accept tasks.
+cStatus :: Lens' Cluster (Maybe Text)
+cStatus = lens _cStatus (\s a -> s { _cStatus = a })
+
+instance FromXML Cluster where
+    parseXML x = Cluster
+        <$> x .@? "clusterArn"
+        <*> x .@? "clusterName"
+        <*> x .@? "status"
+
+instance ToQuery Cluster where
+    toQuery Cluster{..} = mconcat
+        [ "clusterArn"  =? _cClusterArn
+        , "clusterName" =? _cClusterName
+        , "status"      =? _cStatus
+        ]
+
+data ContainerOverride = ContainerOverride
+    { _coCommand :: List "member" Text
+    , _coName    :: Maybe Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'ContainerOverride' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'coCommand' @::@ ['Text']
+--
+-- * 'coName' @::@ 'Maybe' 'Text'
+--
+containerOverride :: ContainerOverride
+containerOverride = ContainerOverride
+    { _coName    = Nothing
+    , _coCommand = mempty
+    }
+
+-- | The command to send to the container that receives the override.
+coCommand :: Lens' ContainerOverride [Text]
+coCommand = lens _coCommand (\s a -> s { _coCommand = a }) . _List
+
+-- | The name of the container that receives the override.
+coName :: Lens' ContainerOverride (Maybe Text)
+coName = lens _coName (\s a -> s { _coName = a })
+
+instance FromXML ContainerOverride where
+    parseXML x = ContainerOverride
+        <$> x .@? "command" .!@ mempty
+        <*> x .@? "name"
+
+instance ToQuery ContainerOverride where
+    toQuery ContainerOverride{..} = mconcat
+        [ "command" =? _coCommand
+        , "name"    =? _coName
+        ]
+
+data KeyValuePair = KeyValuePair
+    { _kvpName  :: Maybe Text
+    , _kvpValue :: Maybe Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'KeyValuePair' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'kvpName' @::@ 'Maybe' 'Text'
+--
+-- * 'kvpValue' @::@ 'Maybe' 'Text'
+--
+keyValuePair :: KeyValuePair
+keyValuePair = KeyValuePair
+    { _kvpName  = Nothing
+    , _kvpValue = Nothing
+    }
+
+-- | The name of the key value pair.
+kvpName :: Lens' KeyValuePair (Maybe Text)
+kvpName = lens _kvpName (\s a -> s { _kvpName = a })
+
+-- | The value of the key value pair.
+kvpValue :: Lens' KeyValuePair (Maybe Text)
+kvpValue = lens _kvpValue (\s a -> s { _kvpValue = a })
+
+instance FromXML KeyValuePair where
+    parseXML x = KeyValuePair
+        <$> x .@? "name"
+        <*> x .@? "value"
+
+instance ToQuery KeyValuePair where
+    toQuery KeyValuePair{..} = mconcat
+        [ "name"  =? _kvpName
+        , "value" =? _kvpValue
+        ]
+
+newtype TaskOverride = TaskOverride
+    { _toContainerOverrides :: List "member" ContainerOverride
+    } deriving (Eq, Read, Show, Monoid, Semigroup)
+
+instance GHC.Exts.IsList TaskOverride where
+    type Item TaskOverride = ContainerOverride
+
+    fromList = TaskOverride . GHC.Exts.fromList
+    toList   = GHC.Exts.toList . _toContainerOverrides
+
+-- | 'TaskOverride' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'toContainerOverrides' @::@ ['ContainerOverride']
+--
+taskOverride :: TaskOverride
+taskOverride = TaskOverride
+    { _toContainerOverrides = mempty
+    }
+
+-- | One or more container overrides to send when running a task.
+toContainerOverrides :: Lens' TaskOverride [ContainerOverride]
+toContainerOverrides =
+    lens _toContainerOverrides (\s a -> s { _toContainerOverrides = a })
+        . _List
+
+instance FromXML TaskOverride where
+    parseXML x = TaskOverride
+        <$> x .@? "containerOverrides" .!@ mempty
+
+instance ToQuery TaskOverride where
+    toQuery TaskOverride{..} = mconcat
+        [ "containerOverrides" =? _toContainerOverrides
+        ]
+
+data Container = Container
+    { _cContainerArn    :: Maybe Text
+    , _cExitCode        :: Maybe Int
+    , _cLastStatus      :: Maybe Text
+    , _cName            :: Maybe Text
+    , _cNetworkBindings :: List "member" NetworkBinding
+    , _cReason          :: Maybe Text
+    , _cTaskArn         :: Maybe Text
+    } deriving (Eq, Read, Show)
+
+-- | 'Container' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'cContainerArn' @::@ 'Maybe' 'Text'
+--
+-- * 'cExitCode' @::@ 'Maybe' 'Int'
+--
+-- * 'cLastStatus' @::@ 'Maybe' 'Text'
+--
+-- * 'cName' @::@ 'Maybe' 'Text'
+--
+-- * 'cNetworkBindings' @::@ ['NetworkBinding']
+--
+-- * 'cReason' @::@ 'Maybe' 'Text'
+--
+-- * 'cTaskArn' @::@ 'Maybe' 'Text'
+--
+container :: Container
+container = Container
+    { _cContainerArn    = Nothing
+    , _cTaskArn         = Nothing
+    , _cName            = Nothing
+    , _cLastStatus      = Nothing
+    , _cExitCode        = Nothing
+    , _cReason          = Nothing
+    , _cNetworkBindings = mempty
+    }
+
+-- | The Amazon Resource Name (ARN) of the container.
+cContainerArn :: Lens' Container (Maybe Text)
+cContainerArn = lens _cContainerArn (\s a -> s { _cContainerArn = a })
+
+-- | The exit code returned from the container.
+cExitCode :: Lens' Container (Maybe Int)
+cExitCode = lens _cExitCode (\s a -> s { _cExitCode = a })
+
+-- | The last known status of the container.
+cLastStatus :: Lens' Container (Maybe Text)
+cLastStatus = lens _cLastStatus (\s a -> s { _cLastStatus = a })
+
+-- | The name of the container.
+cName :: Lens' Container (Maybe Text)
+cName = lens _cName (\s a -> s { _cName = a })
+
+cNetworkBindings :: Lens' Container [NetworkBinding]
+cNetworkBindings = lens _cNetworkBindings (\s a -> s { _cNetworkBindings = a }) . _List
+
+-- | A short (255 max characters) human-readable string to provide additional
+-- detail about a running or stopped container.
+cReason :: Lens' Container (Maybe Text)
+cReason = lens _cReason (\s a -> s { _cReason = a })
+
+-- | The Amazon Resource Name (ARN) of the task.
+cTaskArn :: Lens' Container (Maybe Text)
+cTaskArn = lens _cTaskArn (\s a -> s { _cTaskArn = a })
+
+instance FromXML Container where
+    parseXML x = Container
+        <$> x .@? "containerArn"
+        <*> x .@? "exitCode"
+        <*> x .@? "lastStatus"
+        <*> x .@? "name"
+        <*> x .@? "networkBindings" .!@ mempty
+        <*> x .@? "reason"
+        <*> x .@? "taskArn"
+
+instance ToQuery Container where
+    toQuery Container{..} = mconcat
+        [ "containerArn"    =? _cContainerArn
+        , "exitCode"        =? _cExitCode
+        , "lastStatus"      =? _cLastStatus
+        , "name"            =? _cName
+        , "networkBindings" =? _cNetworkBindings
+        , "reason"          =? _cReason
+        , "taskArn"         =? _cTaskArn
+        ]
+
+data ContainerDefinition = ContainerDefinition
+    { _cdCommand      :: List "member" Text
+    , _cdCpu          :: Maybe Int
+    , _cdEntryPoint   :: List "member" Text
+    , _cdEnvironment  :: List "member" KeyValuePair
+    , _cdEssential    :: Maybe Bool
+    , _cdImage        :: Maybe Text
+    , _cdLinks        :: List "member" Text
+    , _cdMemory       :: Maybe Int
+    , _cdName         :: Maybe Text
+    , _cdPortMappings :: List "member" PortMapping
+    } deriving (Eq, Read, Show)
+
+-- | 'ContainerDefinition' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'cdCommand' @::@ ['Text']
+--
+-- * 'cdCpu' @::@ 'Maybe' 'Int'
+--
+-- * 'cdEntryPoint' @::@ ['Text']
+--
+-- * 'cdEnvironment' @::@ ['KeyValuePair']
+--
+-- * 'cdEssential' @::@ 'Maybe' 'Bool'
+--
+-- * 'cdImage' @::@ 'Maybe' 'Text'
+--
+-- * 'cdLinks' @::@ ['Text']
+--
+-- * 'cdMemory' @::@ 'Maybe' 'Int'
+--
+-- * 'cdName' @::@ 'Maybe' 'Text'
+--
+-- * 'cdPortMappings' @::@ ['PortMapping']
+--
+containerDefinition :: ContainerDefinition
+containerDefinition = ContainerDefinition
+    { _cdName         = Nothing
+    , _cdImage        = Nothing
+    , _cdCpu          = Nothing
+    , _cdMemory       = Nothing
+    , _cdLinks        = mempty
+    , _cdPortMappings = mempty
+    , _cdEssential    = Nothing
+    , _cdEntryPoint   = mempty
+    , _cdCommand      = mempty
+    , _cdEnvironment  = mempty
+    }
+
+-- | The 'CMD' that is passed to the container. For more information on the Docker 'CMD' parameter, see <https://docs.docker.com/reference/builder/#cmd https://docs.docker.com/reference/builder/#cmd>.
+cdCommand :: Lens' ContainerDefinition [Text]
+cdCommand = lens _cdCommand (\s a -> s { _cdCommand = a }) . _List
+
+-- | The number of 'cpu' units reserved for the container. A container instance has
+-- 1,024 'cpu' units for every CPU core.
+cdCpu :: Lens' ContainerDefinition (Maybe Int)
+cdCpu = lens _cdCpu (\s a -> s { _cdCpu = a })
+
+-- | The 'ENTRYPOINT' that is passed to the container. For more information on the
+-- Docker 'ENTRYPOINT' parameter, see <https://docs.docker.com/reference/builder/#entrypoint https://docs.docker.com/reference/builder/#entrypoint>.
+cdEntryPoint :: Lens' ContainerDefinition [Text]
+cdEntryPoint = lens _cdEntryPoint (\s a -> s { _cdEntryPoint = a }) . _List
+
+-- | The environment variables to pass to a container.
+cdEnvironment :: Lens' ContainerDefinition [KeyValuePair]
+cdEnvironment = lens _cdEnvironment (\s a -> s { _cdEnvironment = a }) . _List
+
+-- | If the 'essential' parameter of a container is marked as 'true', the failure of
+-- that container will stop the task. If the 'essential' parameter of a container
+-- is marked as 'false', then its failure will not affect the rest of the
+-- containers in a task.
+cdEssential :: Lens' ContainerDefinition (Maybe Bool)
+cdEssential = lens _cdEssential (\s a -> s { _cdEssential = a })
+
+-- | The image used to start a container. This string is passed directly to the
+-- Docker daemon. Images in the Docker Hub registry are available by default.
+-- Other repositories are specified with '/repository-url///image/:/tag/.
+cdImage :: Lens' ContainerDefinition (Maybe Text)
+cdImage = lens _cdImage (\s a -> s { _cdImage = a })
+
+-- | The 'link' parameter allows containers to communicate with each other without
+-- the need for port mappings, using the 'name' parameter. For more information on
+-- linking Docker containers, see <https://docs.docker.com/userguide/dockerlinks/ https://docs.docker.com/userguide/dockerlinks/>.
+cdLinks :: Lens' ContainerDefinition [Text]
+cdLinks = lens _cdLinks (\s a -> s { _cdLinks = a }) . _List
+
+-- | The number of MiB of memory reserved for the container. Docker will allocate
+-- a minimum of 4 MiB of memory to a container.
+cdMemory :: Lens' ContainerDefinition (Maybe Int)
+cdMemory = lens _cdMemory (\s a -> s { _cdMemory = a })
+
+-- | The name of a container. If you are linking multiple containers together in a
+-- task definition, the 'name' of one container can be entered in the 'links' of
+-- another container to connect the containers.
+cdName :: Lens' ContainerDefinition (Maybe Text)
+cdName = lens _cdName (\s a -> s { _cdName = a })
+
+-- | The list of port mappings for the container.
+cdPortMappings :: Lens' ContainerDefinition [PortMapping]
+cdPortMappings = lens _cdPortMappings (\s a -> s { _cdPortMappings = a }) . _List
+
+instance FromXML ContainerDefinition where
+    parseXML x = ContainerDefinition
+        <$> x .@? "command" .!@ mempty
+        <*> x .@? "cpu"
+        <*> x .@? "entryPoint" .!@ mempty
+        <*> x .@? "environment" .!@ mempty
+        <*> x .@? "essential"
+        <*> x .@? "image"
+        <*> x .@? "links" .!@ mempty
+        <*> x .@? "memory"
+        <*> x .@? "name"
+        <*> x .@? "portMappings" .!@ mempty
+
+instance ToQuery ContainerDefinition where
+    toQuery ContainerDefinition{..} = mconcat
+        [ "command"      =? _cdCommand
+        , "cpu"          =? _cdCpu
+        , "entryPoint"   =? _cdEntryPoint
+        , "environment"  =? _cdEnvironment
+        , "essential"    =? _cdEssential
+        , "image"        =? _cdImage
+        , "links"        =? _cdLinks
+        , "memory"       =? _cdMemory
+        , "name"         =? _cdName
+        , "portMappings" =? _cdPortMappings
+        ]
+
+data Resource = Resource
+    { _rDoubleValue    :: Maybe Double
+    , _rIntegerValue   :: Maybe Int
+    , _rLongValue      :: Maybe Integer
+    , _rName           :: Maybe Text
+    , _rStringSetValue :: List "member" Text
+    , _rType           :: Maybe Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'Resource' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'rDoubleValue' @::@ 'Maybe' 'Double'
+--
+-- * 'rIntegerValue' @::@ 'Maybe' 'Int'
+--
+-- * 'rLongValue' @::@ 'Maybe' 'Integer'
+--
+-- * 'rName' @::@ 'Maybe' 'Text'
+--
+-- * 'rStringSetValue' @::@ ['Text']
+--
+-- * 'rType' @::@ 'Maybe' 'Text'
+--
+resource :: Resource
+resource = Resource
+    { _rName           = Nothing
+    , _rType           = Nothing
+    , _rDoubleValue    = Nothing
+    , _rLongValue      = Nothing
+    , _rIntegerValue   = Nothing
+    , _rStringSetValue = mempty
+    }
+
+-- | When the 'doubleValue' type is set, the value of the resource must be a double
+-- precision floating-point type.
+rDoubleValue :: Lens' Resource (Maybe Double)
+rDoubleValue = lens _rDoubleValue (\s a -> s { _rDoubleValue = a })
+
+-- | When the 'integerValue' type is set, the value of the resource must be an
+-- integer.
+rIntegerValue :: Lens' Resource (Maybe Int)
+rIntegerValue = lens _rIntegerValue (\s a -> s { _rIntegerValue = a })
+
+-- | When the 'longValue' type is set, the value of the resource must be an extended
+-- precision floating-point type.
+rLongValue :: Lens' Resource (Maybe Integer)
+rLongValue = lens _rLongValue (\s a -> s { _rLongValue = a })
+
+-- | The name of the resource, such as 'CPU', 'MEMORY', 'PORTS', or a user-defined
+-- resource.
+rName :: Lens' Resource (Maybe Text)
+rName = lens _rName (\s a -> s { _rName = a })
+
+-- | When the 'stringSetValue' type is set, the value of the resource must be a
+-- string type.
+rStringSetValue :: Lens' Resource [Text]
+rStringSetValue = lens _rStringSetValue (\s a -> s { _rStringSetValue = a }) . _List
+
+-- | The type of the resource, such as 'INTEGER', 'DOUBLE', 'LONG', or 'STRINGSET'.
+rType :: Lens' Resource (Maybe Text)
+rType = lens _rType (\s a -> s { _rType = a })
+
+instance FromXML Resource where
+    parseXML x = Resource
+        <$> x .@? "doubleValue"
+        <*> x .@? "integerValue"
+        <*> x .@? "longValue"
+        <*> x .@? "name"
+        <*> x .@? "stringSetValue" .!@ mempty
+        <*> x .@? "type"
+
+instance ToQuery Resource where
+    toQuery Resource{..} = mconcat
+        [ "doubleValue"    =? _rDoubleValue
+        , "integerValue"   =? _rIntegerValue
+        , "longValue"      =? _rLongValue
+        , "name"           =? _rName
+        , "stringSetValue" =? _rStringSetValue
+        , "type"           =? _rType
+        ]
+
+data Task = Task
+    { _tClusterArn           :: Maybe Text
+    , _tContainerInstanceArn :: Maybe Text
+    , _tContainers           :: List "member" Container
+    , _tDesiredStatus        :: Maybe Text
+    , _tLastStatus           :: Maybe Text
+    , _tOverrides            :: Maybe TaskOverride
+    , _tTaskArn              :: Maybe Text
+    , _tTaskDefinitionArn    :: Maybe Text
+    } deriving (Eq, Read, Show)
+
+-- | 'Task' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'tClusterArn' @::@ 'Maybe' 'Text'
+--
+-- * 'tContainerInstanceArn' @::@ 'Maybe' 'Text'
+--
+-- * 'tContainers' @::@ ['Container']
+--
+-- * 'tDesiredStatus' @::@ 'Maybe' 'Text'
+--
+-- * 'tLastStatus' @::@ 'Maybe' 'Text'
+--
+-- * 'tOverrides' @::@ 'Maybe' 'TaskOverride'
+--
+-- * 'tTaskArn' @::@ 'Maybe' 'Text'
+--
+-- * 'tTaskDefinitionArn' @::@ 'Maybe' 'Text'
+--
+task :: Task
+task = Task
+    { _tTaskArn              = Nothing
+    , _tClusterArn           = Nothing
+    , _tTaskDefinitionArn    = Nothing
+    , _tContainerInstanceArn = Nothing
+    , _tOverrides            = Nothing
+    , _tLastStatus           = Nothing
+    , _tDesiredStatus        = Nothing
+    , _tContainers           = mempty
+    }
+
+-- | The Amazon Resource Name (ARN) of the of the cluster that hosts the task.
+tClusterArn :: Lens' Task (Maybe Text)
+tClusterArn = lens _tClusterArn (\s a -> s { _tClusterArn = a })
+
+-- | The Amazon Resource Name (ARN) of the container instances that host the task.
+tContainerInstanceArn :: Lens' Task (Maybe Text)
+tContainerInstanceArn =
+    lens _tContainerInstanceArn (\s a -> s { _tContainerInstanceArn = a })
+
+-- | The containers associated with the task.
+tContainers :: Lens' Task [Container]
+tContainers = lens _tContainers (\s a -> s { _tContainers = a }) . _List
+
+-- | The desired status of the task.
+tDesiredStatus :: Lens' Task (Maybe Text)
+tDesiredStatus = lens _tDesiredStatus (\s a -> s { _tDesiredStatus = a })
+
+-- | The last known status of the task.
+tLastStatus :: Lens' Task (Maybe Text)
+tLastStatus = lens _tLastStatus (\s a -> s { _tLastStatus = a })
+
+-- | One or more container overrides.
+tOverrides :: Lens' Task (Maybe TaskOverride)
+tOverrides = lens _tOverrides (\s a -> s { _tOverrides = a })
+
+-- | The Amazon Resource Name (ARN) of the task.
+tTaskArn :: Lens' Task (Maybe Text)
+tTaskArn = lens _tTaskArn (\s a -> s { _tTaskArn = a })
+
+-- | The Amazon Resource Name (ARN) of the of the task definition that creates the
+-- task.
+tTaskDefinitionArn :: Lens' Task (Maybe Text)
+tTaskDefinitionArn =
+    lens _tTaskDefinitionArn (\s a -> s { _tTaskDefinitionArn = a })
+
+instance FromXML Task where
+    parseXML x = Task
+        <$> x .@? "clusterArn"
+        <*> x .@? "containerInstanceArn"
+        <*> x .@? "containers" .!@ mempty
+        <*> x .@? "desiredStatus"
+        <*> x .@? "lastStatus"
+        <*> x .@? "overrides"
+        <*> x .@? "taskArn"
+        <*> x .@? "taskDefinitionArn"
+
+instance ToQuery Task where
+    toQuery Task{..} = mconcat
+        [ "clusterArn"           =? _tClusterArn
+        , "containerInstanceArn" =? _tContainerInstanceArn
+        , "containers"           =? _tContainers
+        , "desiredStatus"        =? _tDesiredStatus
+        , "lastStatus"           =? _tLastStatus
+        , "overrides"            =? _tOverrides
+        , "taskArn"              =? _tTaskArn
+        , "taskDefinitionArn"    =? _tTaskDefinitionArn
+        ]
+
+data PortMapping = PortMapping
+    { _pmContainerPort :: Maybe Int
+    , _pmHostPort      :: Maybe Int
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'PortMapping' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'pmContainerPort' @::@ 'Maybe' 'Int'
+--
+-- * 'pmHostPort' @::@ 'Maybe' 'Int'
+--
+portMapping :: PortMapping
+portMapping = PortMapping
+    { _pmContainerPort = Nothing
+    , _pmHostPort      = Nothing
+    }
+
+-- | The port number on the container that should be used with the port mapping.
+pmContainerPort :: Lens' PortMapping (Maybe Int)
+pmContainerPort = lens _pmContainerPort (\s a -> s { _pmContainerPort = a })
+
+-- | The port number on the host that should be used with the port mapping.
+pmHostPort :: Lens' PortMapping (Maybe Int)
+pmHostPort = lens _pmHostPort (\s a -> s { _pmHostPort = a })
+
+instance FromXML PortMapping where
+    parseXML x = PortMapping
+        <$> x .@? "containerPort"
+        <*> x .@? "hostPort"
+
+instance ToQuery PortMapping where
+    toQuery PortMapping{..} = mconcat
+        [ "containerPort" =? _pmContainerPort
+        , "hostPort"      =? _pmHostPort
+        ]
+
+data TaskDefinition = TaskDefinition
+    { _tdContainerDefinitions :: List "member" ContainerDefinition
+    , _tdFamily               :: Maybe Text
+    , _tdRevision             :: Maybe Int
+    , _tdTaskDefinitionArn    :: Maybe Text
+    } deriving (Eq, Read, Show)
+
+-- | 'TaskDefinition' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'tdContainerDefinitions' @::@ ['ContainerDefinition']
+--
+-- * 'tdFamily' @::@ 'Maybe' 'Text'
+--
+-- * 'tdRevision' @::@ 'Maybe' 'Int'
+--
+-- * 'tdTaskDefinitionArn' @::@ 'Maybe' 'Text'
+--
+taskDefinition :: TaskDefinition
+taskDefinition = TaskDefinition
+    { _tdTaskDefinitionArn    = Nothing
+    , _tdContainerDefinitions = mempty
+    , _tdFamily               = Nothing
+    , _tdRevision             = Nothing
+    }
+
+-- | A list of container definitions in JSON format that describe the different
+-- containers that make up your task.
+tdContainerDefinitions :: Lens' TaskDefinition [ContainerDefinition]
+tdContainerDefinitions =
+    lens _tdContainerDefinitions (\s a -> s { _tdContainerDefinitions = a })
+        . _List
+
+-- | The family of your task definition. You can think of the 'family' as the name
+-- of your task definition.
+tdFamily :: Lens' TaskDefinition (Maybe Text)
+tdFamily = lens _tdFamily (\s a -> s { _tdFamily = a })
+
+-- | The revision of the task in a particular family. You can think of the
+-- revision as a version number of a task definition in a family. When you
+-- register a task definition for the first time, the revision is '1', and each
+-- time you register a task definition in the same family, the revision value
+-- increases by one.
+tdRevision :: Lens' TaskDefinition (Maybe Int)
+tdRevision = lens _tdRevision (\s a -> s { _tdRevision = a })
+
+-- | The full Amazon Resource Name (ARN) of the of the task definition.
+tdTaskDefinitionArn :: Lens' TaskDefinition (Maybe Text)
+tdTaskDefinitionArn =
+    lens _tdTaskDefinitionArn (\s a -> s { _tdTaskDefinitionArn = a })
+
+instance FromXML TaskDefinition where
+    parseXML x = TaskDefinition
+        <$> x .@? "containerDefinitions" .!@ mempty
+        <*> x .@? "family"
+        <*> x .@? "revision"
+        <*> x .@? "taskDefinitionArn"
+
+instance ToQuery TaskDefinition where
+    toQuery TaskDefinition{..} = mconcat
+        [ "containerDefinitions" =? _tdContainerDefinitions
+        , "family"               =? _tdFamily
+        , "revision"             =? _tdRevision
+        , "taskDefinitionArn"    =? _tdTaskDefinitionArn
+        ]
+
+data Failure = Failure
+    { _fArn    :: Maybe Text
+    , _fReason :: Maybe Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'Failure' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'fArn' @::@ 'Maybe' 'Text'
+--
+-- * 'fReason' @::@ 'Maybe' 'Text'
+--
+failure :: Failure
+failure = Failure
+    { _fArn    = Nothing
+    , _fReason = Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) of the failed resource.
+fArn :: Lens' Failure (Maybe Text)
+fArn = lens _fArn (\s a -> s { _fArn = a })
+
+-- | The reason for the failure.
+fReason :: Lens' Failure (Maybe Text)
+fReason = lens _fReason (\s a -> s { _fReason = a })
+
+instance FromXML Failure where
+    parseXML x = Failure
+        <$> x .@? "arn"
+        <*> x .@? "reason"
+
+instance ToQuery Failure where
+    toQuery Failure{..} = mconcat
+        [ "arn"    =? _fArn
+        , "reason" =? _fReason
+        ]
+
+data ContainerInstance = ContainerInstance
+    { _ciAgentConnected       :: Maybe Bool
+    , _ciContainerInstanceArn :: Maybe Text
+    , _ciEc2InstanceId        :: Maybe Text
+    , _ciRegisteredResources  :: List "member" Resource
+    , _ciRemainingResources   :: List "member" Resource
+    , _ciStatus               :: Maybe Text
+    } deriving (Eq, Read, Show)
+
+-- | 'ContainerInstance' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ciAgentConnected' @::@ 'Maybe' 'Bool'
+--
+-- * 'ciContainerInstanceArn' @::@ 'Maybe' 'Text'
+--
+-- * 'ciEc2InstanceId' @::@ 'Maybe' 'Text'
+--
+-- * 'ciRegisteredResources' @::@ ['Resource']
+--
+-- * 'ciRemainingResources' @::@ ['Resource']
+--
+-- * 'ciStatus' @::@ 'Maybe' 'Text'
+--
+containerInstance :: ContainerInstance
+containerInstance = ContainerInstance
+    { _ciContainerInstanceArn = Nothing
+    , _ciEc2InstanceId        = Nothing
+    , _ciRemainingResources   = mempty
+    , _ciRegisteredResources  = mempty
+    , _ciStatus               = Nothing
+    , _ciAgentConnected       = Nothing
+    }
+
+-- | This parameter returns 'true' if the agent is actually connected to Amazon ECS.
+-- Registered instances with an agent that may be unhealthy or stopped will
+-- return 'false', and instances without a connected agent cannot accept placement
+-- request.
+ciAgentConnected :: Lens' ContainerInstance (Maybe Bool)
+ciAgentConnected = lens _ciAgentConnected (\s a -> s { _ciAgentConnected = a })
+
+-- | The Amazon Resource Name (ARN) of the container instance. The ARN contains
+-- the 'arn:aws:ecs' namespace, followed by the region of the container instance,
+-- the AWS account ID of the container instance owner, the 'container-instance'
+-- namespace, and then the container instance UUID. For example, arn:aws:ecs:/region/:/aws_account_id/:container-instance//container_instance_UUID/.
+ciContainerInstanceArn :: Lens' ContainerInstance (Maybe Text)
+ciContainerInstanceArn =
+    lens _ciContainerInstanceArn (\s a -> s { _ciContainerInstanceArn = a })
+
+-- | The Amazon EC2 instance ID of the container instance.
+ciEc2InstanceId :: Lens' ContainerInstance (Maybe Text)
+ciEc2InstanceId = lens _ciEc2InstanceId (\s a -> s { _ciEc2InstanceId = a })
+
+-- | The registered resources on the container instance that are in use by current
+-- tasks.
+ciRegisteredResources :: Lens' ContainerInstance [Resource]
+ciRegisteredResources =
+    lens _ciRegisteredResources (\s a -> s { _ciRegisteredResources = a })
+        . _List
+
+-- | The remaining resources of the container instance that are available for new
+-- tasks.
+ciRemainingResources :: Lens' ContainerInstance [Resource]
+ciRemainingResources =
+    lens _ciRemainingResources (\s a -> s { _ciRemainingResources = a })
+        . _List
+
+-- | The status of the container instance. The valid values are 'ACTIVE' or 'INACTIVE'.
+-- 'ACTIVE' indicates that the container instance can accept tasks.
+ciStatus :: Lens' ContainerInstance (Maybe Text)
+ciStatus = lens _ciStatus (\s a -> s { _ciStatus = a })
+
+instance FromXML ContainerInstance where
+    parseXML x = ContainerInstance
+        <$> x .@? "agentConnected"
+        <*> x .@? "containerInstanceArn"
+        <*> x .@? "ec2InstanceId"
+        <*> x .@? "registeredResources" .!@ mempty
+        <*> x .@? "remainingResources" .!@ mempty
+        <*> x .@? "status"
+
+instance ToQuery ContainerInstance where
+    toQuery ContainerInstance{..} = mconcat
+        [ "agentConnected"       =? _ciAgentConnected
+        , "containerInstanceArn" =? _ciContainerInstanceArn
+        , "ec2InstanceId"        =? _ciEc2InstanceId
+        , "registeredResources"  =? _ciRegisteredResources
+        , "remainingResources"   =? _ciRemainingResources
+        , "status"               =? _ciStatus
+        ]
