diff --git a/amazonka-ecs.cabal b/amazonka-ecs.cabal
--- a/amazonka-ecs.cabal
+++ b/amazonka-ecs.cabal
@@ -1,5 +1,5 @@
 name:                  amazonka-ecs
-version:               0.3.0
+version:               0.3.1
 synopsis:              Amazon EC2 Container Service SDK.
 homepage:              https://github.com/brendanhay/amazonka
 license:               OtherLicense
@@ -55,6 +55,7 @@
         , Network.AWS.ECS.DiscoverPollEndpoint
         , Network.AWS.ECS.ListClusters
         , Network.AWS.ECS.ListContainerInstances
+        , Network.AWS.ECS.ListTaskDefinitionFamilies
         , Network.AWS.ECS.ListTaskDefinitions
         , Network.AWS.ECS.ListTasks
         , Network.AWS.ECS.RegisterContainerInstance
@@ -69,5 +70,5 @@
     other-modules:
 
     build-depends:
-          amazonka-core == 0.3.0.*
+          amazonka-core == 0.3.1.*
         , base          >= 4.7     && < 5
diff --git a/gen/Network/AWS/ECS.hs b/gen/Network/AWS/ECS.hs
--- a/gen/Network/AWS/ECS.hs
+++ b/gen/Network/AWS/ECS.hs
@@ -34,6 +34,7 @@
     , module Network.AWS.ECS.DiscoverPollEndpoint
     , module Network.AWS.ECS.ListClusters
     , module Network.AWS.ECS.ListContainerInstances
+    , module Network.AWS.ECS.ListTaskDefinitionFamilies
     , module Network.AWS.ECS.ListTaskDefinitions
     , module Network.AWS.ECS.ListTasks
     , module Network.AWS.ECS.RegisterContainerInstance
@@ -57,6 +58,7 @@
 import Network.AWS.ECS.DiscoverPollEndpoint
 import Network.AWS.ECS.ListClusters
 import Network.AWS.ECS.ListContainerInstances
+import Network.AWS.ECS.ListTaskDefinitionFamilies
 import Network.AWS.ECS.ListTaskDefinitions
 import Network.AWS.ECS.ListTasks
 import Network.AWS.ECS.RegisterContainerInstance
diff --git a/gen/Network/AWS/ECS/CreateCluster.hs b/gen/Network/AWS/ECS/CreateCluster.hs
--- a/gen/Network/AWS/ECS/CreateCluster.hs
+++ b/gen/Network/AWS/ECS/CreateCluster.hs
@@ -48,7 +48,7 @@
     ) where
 
 import Network.AWS.Prelude
-import Network.AWS.Request.Query
+import Network.AWS.Request.JSON
 import Network.AWS.ECS.Types
 import qualified GHC.Exts
 
@@ -95,19 +95,22 @@
     toPath = const "/"
 
 instance ToQuery CreateCluster where
-    toQuery CreateCluster{..} = mconcat
-        [ "clusterName" =? _ccClusterName
-        ]
+    toQuery = const mempty
 
 instance ToHeaders CreateCluster
 
+instance ToJSON CreateCluster where
+    toJSON CreateCluster{..} = object
+        [ "clusterName" .= _ccClusterName
+        ]
+
 instance AWSRequest CreateCluster where
     type Sv CreateCluster = ECS
     type Rs CreateCluster = CreateClusterResponse
 
     request  = post "CreateCluster"
-    response = xmlResponse
+    response = jsonResponse
 
-instance FromXML CreateClusterResponse where
-    parseXML = withElement "CreateClusterResult" $ \x -> CreateClusterResponse
-        <$> x .@? "cluster"
+instance FromJSON CreateClusterResponse where
+    parseJSON = withObject "CreateClusterResponse" $ \o -> CreateClusterResponse
+        <$> o .:? "cluster"
diff --git a/gen/Network/AWS/ECS/DeleteCluster.hs b/gen/Network/AWS/ECS/DeleteCluster.hs
--- a/gen/Network/AWS/ECS/DeleteCluster.hs
+++ b/gen/Network/AWS/ECS/DeleteCluster.hs
@@ -45,7 +45,7 @@
     ) where
 
 import Network.AWS.Prelude
-import Network.AWS.Request.Query
+import Network.AWS.Request.JSON
 import Network.AWS.ECS.Types
 import qualified GHC.Exts
 
@@ -65,7 +65,8 @@
     { _dcCluster = p1
     }
 
--- | The cluster you want to delete.
+-- | The short name or full Amazon Resource Name (ARN) of the cluster that you
+-- want to delete.
 dcCluster :: Lens' DeleteCluster Text
 dcCluster = lens _dcCluster (\s a -> s { _dcCluster = a })
 
@@ -92,19 +93,22 @@
     toPath = const "/"
 
 instance ToQuery DeleteCluster where
-    toQuery DeleteCluster{..} = mconcat
-        [ "cluster" =? _dcCluster
-        ]
+    toQuery = const mempty
 
 instance ToHeaders DeleteCluster
 
+instance ToJSON DeleteCluster where
+    toJSON DeleteCluster{..} = object
+        [ "cluster" .= _dcCluster
+        ]
+
 instance AWSRequest DeleteCluster where
     type Sv DeleteCluster = ECS
     type Rs DeleteCluster = DeleteClusterResponse
 
     request  = post "DeleteCluster"
-    response = xmlResponse
+    response = jsonResponse
 
-instance FromXML DeleteClusterResponse where
-    parseXML = withElement "DeleteClusterResult" $ \x -> DeleteClusterResponse
-        <$> x .@? "cluster"
+instance FromJSON DeleteClusterResponse where
+    parseJSON = withObject "DeleteClusterResponse" $ \o -> DeleteClusterResponse
+        <$> o .:? "cluster"
diff --git a/gen/Network/AWS/ECS/DeregisterContainerInstance.hs b/gen/Network/AWS/ECS/DeregisterContainerInstance.hs
--- a/gen/Network/AWS/ECS/DeregisterContainerInstance.hs
+++ b/gen/Network/AWS/ECS/DeregisterContainerInstance.hs
@@ -46,7 +46,7 @@
     ) where
 
 import Network.AWS.Prelude
-import Network.AWS.Request.Query
+import Network.AWS.Request.JSON
 import Network.AWS.ECS.Types
 import qualified GHC.Exts
 
@@ -119,21 +119,24 @@
     toPath = const "/"
 
 instance ToQuery DeregisterContainerInstance where
-    toQuery DeregisterContainerInstance{..} = mconcat
-        [ "cluster"           =? _dci1Cluster
-        , "containerInstance" =? _dci1ContainerInstance
-        , "force"             =? _dci1Force
-        ]
+    toQuery = const mempty
 
 instance ToHeaders DeregisterContainerInstance
 
+instance ToJSON DeregisterContainerInstance where
+    toJSON DeregisterContainerInstance{..} = object
+        [ "cluster"           .= _dci1Cluster
+        , "containerInstance" .= _dci1ContainerInstance
+        , "force"             .= _dci1Force
+        ]
+
 instance AWSRequest DeregisterContainerInstance where
     type Sv DeregisterContainerInstance = ECS
     type Rs DeregisterContainerInstance = DeregisterContainerInstanceResponse
 
     request  = post "DeregisterContainerInstance"
-    response = xmlResponse
+    response = jsonResponse
 
-instance FromXML DeregisterContainerInstanceResponse where
-    parseXML = withElement "DeregisterContainerInstanceResult" $ \x -> DeregisterContainerInstanceResponse
-        <$> x .@? "containerInstance"
+instance FromJSON DeregisterContainerInstanceResponse where
+    parseJSON = withObject "DeregisterContainerInstanceResponse" $ \o -> DeregisterContainerInstanceResponse
+        <$> o .:? "containerInstance"
diff --git a/gen/Network/AWS/ECS/DeregisterTaskDefinition.hs b/gen/Network/AWS/ECS/DeregisterTaskDefinition.hs
--- a/gen/Network/AWS/ECS/DeregisterTaskDefinition.hs
+++ b/gen/Network/AWS/ECS/DeregisterTaskDefinition.hs
@@ -22,7 +22,9 @@
 --
 -- Derived from AWS service descriptions, licensed under Apache 2.0.
 
--- | Deregisters the specified task definition. You will no longer be able to run
+-- | NOT YET IMPLEMENTED.
+--
+-- 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>
@@ -44,7 +46,7 @@
     ) where
 
 import Network.AWS.Prelude
-import Network.AWS.Request.Query
+import Network.AWS.Request.JSON
 import Network.AWS.ECS.Types
 import qualified GHC.Exts
 
@@ -94,19 +96,22 @@
     toPath = const "/"
 
 instance ToQuery DeregisterTaskDefinition where
-    toQuery DeregisterTaskDefinition{..} = mconcat
-        [ "taskDefinition" =? _dtd1TaskDefinition
-        ]
+    toQuery = const mempty
 
 instance ToHeaders DeregisterTaskDefinition
 
+instance ToJSON DeregisterTaskDefinition where
+    toJSON DeregisterTaskDefinition{..} = object
+        [ "taskDefinition" .= _dtd1TaskDefinition
+        ]
+
 instance AWSRequest DeregisterTaskDefinition where
     type Sv DeregisterTaskDefinition = ECS
     type Rs DeregisterTaskDefinition = DeregisterTaskDefinitionResponse
 
     request  = post "DeregisterTaskDefinition"
-    response = xmlResponse
+    response = jsonResponse
 
-instance FromXML DeregisterTaskDefinitionResponse where
-    parseXML = withElement "DeregisterTaskDefinitionResult" $ \x -> DeregisterTaskDefinitionResponse
-        <$> x .@? "taskDefinition"
+instance FromJSON DeregisterTaskDefinitionResponse where
+    parseJSON = withObject "DeregisterTaskDefinitionResponse" $ \o -> DeregisterTaskDefinitionResponse
+        <$> o .:? "taskDefinition"
diff --git a/gen/Network/AWS/ECS/DescribeClusters.hs b/gen/Network/AWS/ECS/DescribeClusters.hs
--- a/gen/Network/AWS/ECS/DescribeClusters.hs
+++ b/gen/Network/AWS/ECS/DescribeClusters.hs
@@ -44,12 +44,12 @@
     ) where
 
 import Network.AWS.Prelude
-import Network.AWS.Request.Query
+import Network.AWS.Request.JSON
 import Network.AWS.ECS.Types
 import qualified GHC.Exts
 
 newtype DescribeClusters = DescribeClusters
-    { _dcClusters :: List "member" Text
+    { _dcClusters :: List "clusters" Text
     } deriving (Eq, Ord, Read, Show, Monoid, Semigroup)
 
 instance GHC.Exts.IsList DescribeClusters where
@@ -76,8 +76,8 @@
 dcClusters = lens _dcClusters (\s a -> s { _dcClusters = a }) . _List
 
 data DescribeClustersResponse = DescribeClustersResponse
-    { _dcrClusters :: List "member" Cluster
-    , _dcrFailures :: List "member" Failure
+    { _dcrClusters :: List "clusters" Cluster
+    , _dcrFailures :: List "failures" Failure
     } deriving (Eq, Read, Show)
 
 -- | 'DescribeClustersResponse' constructor.
@@ -105,20 +105,23 @@
     toPath = const "/"
 
 instance ToQuery DescribeClusters where
-    toQuery DescribeClusters{..} = mconcat
-        [ "clusters" =? _dcClusters
-        ]
+    toQuery = const mempty
 
 instance ToHeaders DescribeClusters
 
+instance ToJSON DescribeClusters where
+    toJSON DescribeClusters{..} = object
+        [ "clusters" .= _dcClusters
+        ]
+
 instance AWSRequest DescribeClusters where
     type Sv DescribeClusters = ECS
     type Rs DescribeClusters = DescribeClustersResponse
 
     request  = post "DescribeClusters"
-    response = xmlResponse
+    response = jsonResponse
 
-instance FromXML DescribeClustersResponse where
-    parseXML = withElement "DescribeClustersResult" $ \x -> DescribeClustersResponse
-        <$> x .@? "clusters" .!@ mempty
-        <*> x .@? "failures" .!@ mempty
+instance FromJSON DescribeClustersResponse where
+    parseJSON = withObject "DescribeClustersResponse" $ \o -> DescribeClustersResponse
+        <$> o .:? "clusters" .!= mempty
+        <*> o .:? "failures" .!= mempty
diff --git a/gen/Network/AWS/ECS/DescribeContainerInstances.hs b/gen/Network/AWS/ECS/DescribeContainerInstances.hs
--- a/gen/Network/AWS/ECS/DescribeContainerInstances.hs
+++ b/gen/Network/AWS/ECS/DescribeContainerInstances.hs
@@ -46,13 +46,13 @@
     ) where
 
 import Network.AWS.Prelude
-import Network.AWS.Request.Query
+import Network.AWS.Request.JSON
 import Network.AWS.ECS.Types
 import qualified GHC.Exts
 
 data DescribeContainerInstances = DescribeContainerInstances
     { _dciCluster            :: Maybe Text
-    , _dciContainerInstances :: List "member" Text
+    , _dciContainerInstances :: List "containerInstances" Text
     } deriving (Eq, Ord, Read, Show)
 
 -- | 'DescribeContainerInstances' constructor.
@@ -83,8 +83,8 @@
         . _List
 
 data DescribeContainerInstancesResponse = DescribeContainerInstancesResponse
-    { _dcirContainerInstances :: List "member" ContainerInstance
-    , _dcirFailures           :: List "member" Failure
+    { _dcirContainerInstances :: List "containerInstances" ContainerInstance
+    , _dcirFailures           :: List "failures" Failure
     } deriving (Eq, Read, Show)
 
 -- | 'DescribeContainerInstancesResponse' constructor.
@@ -114,21 +114,24 @@
     toPath = const "/"
 
 instance ToQuery DescribeContainerInstances where
-    toQuery DescribeContainerInstances{..} = mconcat
-        [ "cluster"            =? _dciCluster
-        , "containerInstances" =? _dciContainerInstances
-        ]
+    toQuery = const mempty
 
 instance ToHeaders DescribeContainerInstances
 
+instance ToJSON DescribeContainerInstances where
+    toJSON DescribeContainerInstances{..} = object
+        [ "cluster"            .= _dciCluster
+        , "containerInstances" .= _dciContainerInstances
+        ]
+
 instance AWSRequest DescribeContainerInstances where
     type Sv DescribeContainerInstances = ECS
     type Rs DescribeContainerInstances = DescribeContainerInstancesResponse
 
     request  = post "DescribeContainerInstances"
-    response = xmlResponse
+    response = jsonResponse
 
-instance FromXML DescribeContainerInstancesResponse where
-    parseXML = withElement "DescribeContainerInstancesResult" $ \x -> DescribeContainerInstancesResponse
-        <$> x .@? "containerInstances" .!@ mempty
-        <*> x .@? "failures" .!@ mempty
+instance FromJSON DescribeContainerInstancesResponse where
+    parseJSON = withObject "DescribeContainerInstancesResponse" $ \o -> DescribeContainerInstancesResponse
+        <$> o .:? "containerInstances" .!= mempty
+        <*> o .:? "failures" .!= mempty
diff --git a/gen/Network/AWS/ECS/DescribeTaskDefinition.hs b/gen/Network/AWS/ECS/DescribeTaskDefinition.hs
--- a/gen/Network/AWS/ECS/DescribeTaskDefinition.hs
+++ b/gen/Network/AWS/ECS/DescribeTaskDefinition.hs
@@ -22,7 +22,9 @@
 --
 -- Derived from AWS service descriptions, licensed under Apache 2.0.
 
--- | Describes a task definition.
+-- | Describes a task definition. You can specify a 'family' and 'revision' to find
+-- information on a specific task definition, or you can simply specify the
+-- family to find the latest revision in that family.
 --
 -- <http://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DescribeTaskDefinition.html>
 module Network.AWS.ECS.DescribeTaskDefinition
@@ -43,7 +45,7 @@
     ) where
 
 import Network.AWS.Prelude
-import Network.AWS.Request.Query
+import Network.AWS.Request.JSON
 import Network.AWS.ECS.Types
 import qualified GHC.Exts
 
@@ -63,8 +65,9 @@
     { _dtdTaskDefinition = p1
     }
 
--- | The 'family' and 'revision' ('family:revision') or full Amazon Resource Name (ARN)
--- of the task definition that you want to describe.
+-- | The 'family' for the latest revision, 'family' and 'revision' ('family:revision') for
+-- a specific revision in the family, 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 })
@@ -93,19 +96,22 @@
     toPath = const "/"
 
 instance ToQuery DescribeTaskDefinition where
-    toQuery DescribeTaskDefinition{..} = mconcat
-        [ "taskDefinition" =? _dtdTaskDefinition
-        ]
+    toQuery = const mempty
 
 instance ToHeaders DescribeTaskDefinition
 
+instance ToJSON DescribeTaskDefinition where
+    toJSON DescribeTaskDefinition{..} = object
+        [ "taskDefinition" .= _dtdTaskDefinition
+        ]
+
 instance AWSRequest DescribeTaskDefinition where
     type Sv DescribeTaskDefinition = ECS
     type Rs DescribeTaskDefinition = DescribeTaskDefinitionResponse
 
     request  = post "DescribeTaskDefinition"
-    response = xmlResponse
+    response = jsonResponse
 
-instance FromXML DescribeTaskDefinitionResponse where
-    parseXML = withElement "DescribeTaskDefinitionResult" $ \x -> DescribeTaskDefinitionResponse
-        <$> x .@? "taskDefinition"
+instance FromJSON DescribeTaskDefinitionResponse where
+    parseJSON = withObject "DescribeTaskDefinitionResponse" $ \o -> DescribeTaskDefinitionResponse
+        <$> o .:? "taskDefinition"
diff --git a/gen/Network/AWS/ECS/DescribeTasks.hs b/gen/Network/AWS/ECS/DescribeTasks.hs
--- a/gen/Network/AWS/ECS/DescribeTasks.hs
+++ b/gen/Network/AWS/ECS/DescribeTasks.hs
@@ -45,13 +45,13 @@
     ) where
 
 import Network.AWS.Prelude
-import Network.AWS.Request.Query
+import Network.AWS.Request.JSON
 import Network.AWS.ECS.Types
 import qualified GHC.Exts
 
 data DescribeTasks = DescribeTasks
     { _dtCluster :: Maybe Text
-    , _dtTasks   :: List "member" Text
+    , _dtTasks   :: List "tasks" Text
     } deriving (Eq, Ord, Read, Show)
 
 -- | 'DescribeTasks' constructor.
@@ -80,8 +80,8 @@
 dtTasks = lens _dtTasks (\s a -> s { _dtTasks = a }) . _List
 
 data DescribeTasksResponse = DescribeTasksResponse
-    { _dtrFailures :: List "member" Failure
-    , _dtrTasks    :: List "member" Task
+    { _dtrFailures :: List "failures" Failure
+    , _dtrTasks    :: List "tasks" Task
     } deriving (Eq, Read, Show)
 
 -- | 'DescribeTasksResponse' constructor.
@@ -109,21 +109,24 @@
     toPath = const "/"
 
 instance ToQuery DescribeTasks where
-    toQuery DescribeTasks{..} = mconcat
-        [ "cluster" =? _dtCluster
-        , "tasks"   =? _dtTasks
-        ]
+    toQuery = const mempty
 
 instance ToHeaders DescribeTasks
 
+instance ToJSON DescribeTasks where
+    toJSON DescribeTasks{..} = object
+        [ "cluster" .= _dtCluster
+        , "tasks"   .= _dtTasks
+        ]
+
 instance AWSRequest DescribeTasks where
     type Sv DescribeTasks = ECS
     type Rs DescribeTasks = DescribeTasksResponse
 
     request  = post "DescribeTasks"
-    response = xmlResponse
+    response = jsonResponse
 
-instance FromXML DescribeTasksResponse where
-    parseXML = withElement "DescribeTasksResult" $ \x -> DescribeTasksResponse
-        <$> x .@? "failures" .!@ mempty
-        <*> x .@? "tasks" .!@ mempty
+instance FromJSON DescribeTasksResponse where
+    parseJSON = withObject "DescribeTasksResponse" $ \o -> DescribeTasksResponse
+        <$> o .:? "failures" .!= mempty
+        <*> o .:? "tasks" .!= mempty
diff --git a/gen/Network/AWS/ECS/DiscoverPollEndpoint.hs b/gen/Network/AWS/ECS/DiscoverPollEndpoint.hs
--- a/gen/Network/AWS/ECS/DiscoverPollEndpoint.hs
+++ b/gen/Network/AWS/ECS/DiscoverPollEndpoint.hs
@@ -36,6 +36,7 @@
     -- ** Request constructor
     , discoverPollEndpoint
     -- ** Request lenses
+    , dpeCluster
     , dpeContainerInstance
 
     -- * Response
@@ -47,25 +48,33 @@
     ) where
 
 import Network.AWS.Prelude
-import Network.AWS.Request.Query
+import Network.AWS.Request.JSON
 import Network.AWS.ECS.Types
 import qualified GHC.Exts
 
-newtype DiscoverPollEndpoint = DiscoverPollEndpoint
-    { _dpeContainerInstance :: Maybe Text
-    } deriving (Eq, Ord, Read, Show, Monoid)
+data DiscoverPollEndpoint = DiscoverPollEndpoint
+    { _dpeCluster           :: Maybe Text
+    , _dpeContainerInstance :: Maybe Text
+    } deriving (Eq, Ord, Read, Show)
 
 -- | 'DiscoverPollEndpoint' constructor.
 --
 -- The fields accessible through corresponding lenses are:
 --
+-- * 'dpeCluster' @::@ 'Maybe' 'Text'
+--
 -- * 'dpeContainerInstance' @::@ 'Maybe' 'Text'
 --
 discoverPollEndpoint :: DiscoverPollEndpoint
 discoverPollEndpoint = DiscoverPollEndpoint
     { _dpeContainerInstance = Nothing
+    , _dpeCluster           = Nothing
     }
 
+-- | The cluster that the container instance belongs to.
+dpeCluster :: Lens' DiscoverPollEndpoint (Maybe Text)
+dpeCluster = lens _dpeCluster (\s a -> s { _dpeCluster = a })
+
 -- | 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
@@ -99,19 +108,23 @@
     toPath = const "/"
 
 instance ToQuery DiscoverPollEndpoint where
-    toQuery DiscoverPollEndpoint{..} = mconcat
-        [ "containerInstance" =? _dpeContainerInstance
-        ]
+    toQuery = const mempty
 
 instance ToHeaders DiscoverPollEndpoint
 
+instance ToJSON DiscoverPollEndpoint where
+    toJSON DiscoverPollEndpoint{..} = object
+        [ "containerInstance" .= _dpeContainerInstance
+        , "cluster"           .= _dpeCluster
+        ]
+
 instance AWSRequest DiscoverPollEndpoint where
     type Sv DiscoverPollEndpoint = ECS
     type Rs DiscoverPollEndpoint = DiscoverPollEndpointResponse
 
     request  = post "DiscoverPollEndpoint"
-    response = xmlResponse
+    response = jsonResponse
 
-instance FromXML DiscoverPollEndpointResponse where
-    parseXML = withElement "DiscoverPollEndpointResult" $ \x -> DiscoverPollEndpointResponse
-        <$> x .@? "endpoint"
+instance FromJSON DiscoverPollEndpointResponse where
+    parseJSON = withObject "DiscoverPollEndpointResponse" $ \o -> DiscoverPollEndpointResponse
+        <$> o .:? "endpoint"
diff --git a/gen/Network/AWS/ECS/ListClusters.hs b/gen/Network/AWS/ECS/ListClusters.hs
--- a/gen/Network/AWS/ECS/ListClusters.hs
+++ b/gen/Network/AWS/ECS/ListClusters.hs
@@ -45,7 +45,7 @@
     ) where
 
 import Network.AWS.Prelude
-import Network.AWS.Request.Query
+import Network.AWS.Request.JSON
 import Network.AWS.ECS.Types
 import qualified GHC.Exts
 
@@ -86,7 +86,7 @@
 lcNextToken = lens _lcNextToken (\s a -> s { _lcNextToken = a })
 
 data ListClustersResponse = ListClustersResponse
-    { _lcrClusterArns :: List "member" Text
+    { _lcrClusterArns :: List "clusterArns" Text
     , _lcrNextToken   :: Maybe Text
     } deriving (Eq, Ord, Read, Show)
 
@@ -120,21 +120,24 @@
     toPath = const "/"
 
 instance ToQuery ListClusters where
-    toQuery ListClusters{..} = mconcat
-        [ "maxResults" =? _lcMaxResults
-        , "nextToken"  =? _lcNextToken
-        ]
+    toQuery = const mempty
 
 instance ToHeaders ListClusters
 
+instance ToJSON ListClusters where
+    toJSON ListClusters{..} = object
+        [ "nextToken"  .= _lcNextToken
+        , "maxResults" .= _lcMaxResults
+        ]
+
 instance AWSRequest ListClusters where
     type Sv ListClusters = ECS
     type Rs ListClusters = ListClustersResponse
 
     request  = post "ListClusters"
-    response = xmlResponse
+    response = jsonResponse
 
-instance FromXML ListClustersResponse where
-    parseXML = withElement "ListClustersResult" $ \x -> ListClustersResponse
-        <$> x .@? "clusterArns" .!@ mempty
-        <*> x .@? "nextToken"
+instance FromJSON ListClustersResponse where
+    parseJSON = withObject "ListClustersResponse" $ \o -> ListClustersResponse
+        <$> o .:? "clusterArns" .!= mempty
+        <*> o .:? "nextToken"
diff --git a/gen/Network/AWS/ECS/ListContainerInstances.hs b/gen/Network/AWS/ECS/ListContainerInstances.hs
--- a/gen/Network/AWS/ECS/ListContainerInstances.hs
+++ b/gen/Network/AWS/ECS/ListContainerInstances.hs
@@ -46,7 +46,7 @@
     ) where
 
 import Network.AWS.Prelude
-import Network.AWS.Request.Query
+import Network.AWS.Request.JSON
 import Network.AWS.ECS.Types
 import qualified GHC.Exts
 
@@ -98,7 +98,7 @@
 lciNextToken = lens _lciNextToken (\s a -> s { _lciNextToken = a })
 
 data ListContainerInstancesResponse = ListContainerInstancesResponse
-    { _lcirContainerInstanceArns :: List "member" Text
+    { _lcirContainerInstanceArns :: List "containerInstanceArns" Text
     , _lcirNextToken             :: Maybe Text
     } deriving (Eq, Ord, Read, Show)
 
@@ -135,22 +135,25 @@
     toPath = const "/"
 
 instance ToQuery ListContainerInstances where
-    toQuery ListContainerInstances{..} = mconcat
-        [ "cluster"    =? _lciCluster
-        , "maxResults" =? _lciMaxResults
-        , "nextToken"  =? _lciNextToken
-        ]
+    toQuery = const mempty
 
 instance ToHeaders ListContainerInstances
 
+instance ToJSON ListContainerInstances where
+    toJSON ListContainerInstances{..} = object
+        [ "cluster"    .= _lciCluster
+        , "nextToken"  .= _lciNextToken
+        , "maxResults" .= _lciMaxResults
+        ]
+
 instance AWSRequest ListContainerInstances where
     type Sv ListContainerInstances = ECS
     type Rs ListContainerInstances = ListContainerInstancesResponse
 
     request  = post "ListContainerInstances"
-    response = xmlResponse
+    response = jsonResponse
 
-instance FromXML ListContainerInstancesResponse where
-    parseXML = withElement "ListContainerInstancesResult" $ \x -> ListContainerInstancesResponse
-        <$> x .@? "containerInstanceArns" .!@ mempty
-        <*> x .@? "nextToken"
+instance FromJSON ListContainerInstancesResponse where
+    parseJSON = withObject "ListContainerInstancesResponse" $ \o -> ListContainerInstancesResponse
+        <$> o .:? "containerInstanceArns" .!= mempty
+        <*> o .:? "nextToken"
diff --git a/gen/Network/AWS/ECS/ListTaskDefinitionFamilies.hs b/gen/Network/AWS/ECS/ListTaskDefinitionFamilies.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/ECS/ListTaskDefinitionFamilies.hs
@@ -0,0 +1,150 @@
+{-# 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.ListTaskDefinitionFamilies
+-- 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 definition families that are registered to your
+-- account. You can filter the results with the 'familyPrefix' parameter.
+--
+-- <http://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ListTaskDefinitionFamilies.html>
+module Network.AWS.ECS.ListTaskDefinitionFamilies
+    (
+    -- * Request
+      ListTaskDefinitionFamilies
+    -- ** Request constructor
+    , listTaskDefinitionFamilies
+    -- ** Request lenses
+    , ltdfFamilyPrefix
+    , ltdfMaxResults
+    , ltdfNextToken
+
+    -- * Response
+    , ListTaskDefinitionFamiliesResponse
+    -- ** Response constructor
+    , listTaskDefinitionFamiliesResponse
+    -- ** Response lenses
+    , ltdfrFamilies
+    , ltdfrNextToken
+    ) where
+
+import Network.AWS.Prelude
+import Network.AWS.Request.JSON
+import Network.AWS.ECS.Types
+import qualified GHC.Exts
+
+data ListTaskDefinitionFamilies = ListTaskDefinitionFamilies
+    { _ltdfFamilyPrefix :: Maybe Text
+    , _ltdfMaxResults   :: Maybe Int
+    , _ltdfNextToken    :: Maybe Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'ListTaskDefinitionFamilies' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ltdfFamilyPrefix' @::@ 'Maybe' 'Text'
+--
+-- * 'ltdfMaxResults' @::@ 'Maybe' 'Int'
+--
+-- * 'ltdfNextToken' @::@ 'Maybe' 'Text'
+--
+listTaskDefinitionFamilies :: ListTaskDefinitionFamilies
+listTaskDefinitionFamilies = ListTaskDefinitionFamilies
+    { _ltdfFamilyPrefix = Nothing
+    , _ltdfNextToken    = Nothing
+    , _ltdfMaxResults   = Nothing
+    }
+
+-- | The 'familyPrefix' is a string that is used to filter the results of 'ListTaskDefinitionFamilies'. If you specify a 'familyPrefix', only task definition family names that begin
+-- with the 'familyPrefix' string are returned.
+ltdfFamilyPrefix :: Lens' ListTaskDefinitionFamilies (Maybe Text)
+ltdfFamilyPrefix = lens _ltdfFamilyPrefix (\s a -> s { _ltdfFamilyPrefix = a })
+
+-- | The maximum number of task definition family results returned by 'ListTaskDefinitionFamilies' 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 'ListTaskDefinitionFamilies' request with the returned 'nextToken' value.
+-- This value can be between 1 and 100. If this parameter is not used, then 'ListTaskDefinitionFamilies' returns up to 100 results and a 'nextToken' value if applicable.
+ltdfMaxResults :: Lens' ListTaskDefinitionFamilies (Maybe Int)
+ltdfMaxResults = lens _ltdfMaxResults (\s a -> s { _ltdfMaxResults = a })
+
+-- | The 'nextToken' value returned from a previous paginated 'ListTaskDefinitionFamilies' 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.
+ltdfNextToken :: Lens' ListTaskDefinitionFamilies (Maybe Text)
+ltdfNextToken = lens _ltdfNextToken (\s a -> s { _ltdfNextToken = a })
+
+data ListTaskDefinitionFamiliesResponse = ListTaskDefinitionFamiliesResponse
+    { _ltdfrFamilies  :: List "families" Text
+    , _ltdfrNextToken :: Maybe Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'ListTaskDefinitionFamiliesResponse' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'ltdfrFamilies' @::@ ['Text']
+--
+-- * 'ltdfrNextToken' @::@ 'Maybe' 'Text'
+--
+listTaskDefinitionFamiliesResponse :: ListTaskDefinitionFamiliesResponse
+listTaskDefinitionFamiliesResponse = ListTaskDefinitionFamiliesResponse
+    { _ltdfrFamilies  = mempty
+    , _ltdfrNextToken = Nothing
+    }
+
+-- | The list of task definition family names that match the 'ListTaskDefinitionFamilies' request.
+ltdfrFamilies :: Lens' ListTaskDefinitionFamiliesResponse [Text]
+ltdfrFamilies = lens _ltdfrFamilies (\s a -> s { _ltdfrFamilies = a }) . _List
+
+-- | The 'nextToken' value to include in a future 'ListTaskDefinitionFamilies'
+-- request. When the results of a 'ListTaskDefinitionFamilies' 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.
+ltdfrNextToken :: Lens' ListTaskDefinitionFamiliesResponse (Maybe Text)
+ltdfrNextToken = lens _ltdfrNextToken (\s a -> s { _ltdfrNextToken = a })
+
+instance ToPath ListTaskDefinitionFamilies where
+    toPath = const "/"
+
+instance ToQuery ListTaskDefinitionFamilies where
+    toQuery = const mempty
+
+instance ToHeaders ListTaskDefinitionFamilies
+
+instance ToJSON ListTaskDefinitionFamilies where
+    toJSON ListTaskDefinitionFamilies{..} = object
+        [ "familyPrefix" .= _ltdfFamilyPrefix
+        , "nextToken"    .= _ltdfNextToken
+        , "maxResults"   .= _ltdfMaxResults
+        ]
+
+instance AWSRequest ListTaskDefinitionFamilies where
+    type Sv ListTaskDefinitionFamilies = ECS
+    type Rs ListTaskDefinitionFamilies = ListTaskDefinitionFamiliesResponse
+
+    request  = post "ListTaskDefinitionFamilies"
+    response = jsonResponse
+
+instance FromJSON ListTaskDefinitionFamiliesResponse where
+    parseJSON = withObject "ListTaskDefinitionFamiliesResponse" $ \o -> ListTaskDefinitionFamiliesResponse
+        <$> o .:? "families" .!= mempty
+        <*> o .:? "nextToken"
diff --git a/gen/Network/AWS/ECS/ListTaskDefinitions.hs b/gen/Network/AWS/ECS/ListTaskDefinitions.hs
--- a/gen/Network/AWS/ECS/ListTaskDefinitions.hs
+++ b/gen/Network/AWS/ECS/ListTaskDefinitions.hs
@@ -47,7 +47,7 @@
     ) where
 
 import Network.AWS.Prelude
-import Network.AWS.Request.Query
+import Network.AWS.Request.JSON
 import Network.AWS.ECS.Types
 import qualified GHC.Exts
 
@@ -74,9 +74,9 @@
     , _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.
+-- | The full family name that you want to filter the 'ListTaskDefinitions' results
+-- with. Specifying a 'familyPrefix' will limit the listed task definitions to
+-- task definition revisions that belong to that family.
 ltdFamilyPrefix :: Lens' ListTaskDefinitions (Maybe Text)
 ltdFamilyPrefix = lens _ltdFamilyPrefix (\s a -> s { _ltdFamilyPrefix = a })
 
@@ -99,7 +99,7 @@
 
 data ListTaskDefinitionsResponse = ListTaskDefinitionsResponse
     { _ltdrNextToken          :: Maybe Text
-    , _ltdrTaskDefinitionArns :: List "member" Text
+    , _ltdrTaskDefinitionArns :: List "taskDefinitionArns" Text
     } deriving (Eq, Ord, Read, Show)
 
 -- | 'ListTaskDefinitionsResponse' constructor.
@@ -133,22 +133,25 @@
     toPath = const "/"
 
 instance ToQuery ListTaskDefinitions where
-    toQuery ListTaskDefinitions{..} = mconcat
-        [ "familyPrefix" =? _ltdFamilyPrefix
-        , "maxResults"   =? _ltdMaxResults
-        , "nextToken"    =? _ltdNextToken
-        ]
+    toQuery = const mempty
 
 instance ToHeaders ListTaskDefinitions
 
+instance ToJSON ListTaskDefinitions where
+    toJSON ListTaskDefinitions{..} = object
+        [ "familyPrefix" .= _ltdFamilyPrefix
+        , "nextToken"    .= _ltdNextToken
+        , "maxResults"   .= _ltdMaxResults
+        ]
+
 instance AWSRequest ListTaskDefinitions where
     type Sv ListTaskDefinitions = ECS
     type Rs ListTaskDefinitions = ListTaskDefinitionsResponse
 
     request  = post "ListTaskDefinitions"
-    response = xmlResponse
+    response = jsonResponse
 
-instance FromXML ListTaskDefinitionsResponse where
-    parseXML = withElement "ListTaskDefinitionsResult" $ \x -> ListTaskDefinitionsResponse
-        <$> x .@? "nextToken"
-        <*> x .@? "taskDefinitionArns" .!@ mempty
+instance FromJSON ListTaskDefinitionsResponse where
+    parseJSON = withObject "ListTaskDefinitionsResponse" $ \o -> ListTaskDefinitionsResponse
+        <$> o .:? "nextToken"
+        <*> o .:? "taskDefinitionArns" .!= mempty
diff --git a/gen/Network/AWS/ECS/ListTasks.hs b/gen/Network/AWS/ECS/ListTasks.hs
--- a/gen/Network/AWS/ECS/ListTasks.hs
+++ b/gen/Network/AWS/ECS/ListTasks.hs
@@ -49,7 +49,7 @@
     ) where
 
 import Network.AWS.Prelude
-import Network.AWS.Request.Query
+import Network.AWS.Request.JSON
 import Network.AWS.ECS.Types
 import qualified GHC.Exts
 
@@ -123,7 +123,7 @@
 
 data ListTasksResponse = ListTasksResponse
     { _ltrNextToken :: Maybe Text
-    , _ltrTaskArns  :: List "member" Text
+    , _ltrTaskArns  :: List "taskArns" Text
     } deriving (Eq, Ord, Read, Show)
 
 -- | 'ListTasksResponse' constructor.
@@ -155,24 +155,27 @@
     toPath = const "/"
 
 instance ToQuery ListTasks where
-    toQuery ListTasks{..} = mconcat
-        [ "cluster"           =? _ltCluster
-        , "containerInstance" =? _ltContainerInstance
-        , "family"            =? _ltFamily
-        , "maxResults"        =? _ltMaxResults
-        , "nextToken"         =? _ltNextToken
-        ]
+    toQuery = const mempty
 
 instance ToHeaders ListTasks
 
+instance ToJSON ListTasks where
+    toJSON ListTasks{..} = object
+        [ "cluster"           .= _ltCluster
+        , "containerInstance" .= _ltContainerInstance
+        , "family"            .= _ltFamily
+        , "nextToken"         .= _ltNextToken
+        , "maxResults"        .= _ltMaxResults
+        ]
+
 instance AWSRequest ListTasks where
     type Sv ListTasks = ECS
     type Rs ListTasks = ListTasksResponse
 
     request  = post "ListTasks"
-    response = xmlResponse
+    response = jsonResponse
 
-instance FromXML ListTasksResponse where
-    parseXML = withElement "ListTasksResult" $ \x -> ListTasksResponse
-        <$> x .@? "nextToken"
-        <*> x .@? "taskArns" .!@ mempty
+instance FromJSON ListTasksResponse where
+    parseJSON = withObject "ListTasksResponse" $ \o -> ListTasksResponse
+        <$> o .:? "nextToken"
+        <*> o .:? "taskArns" .!= mempty
diff --git a/gen/Network/AWS/ECS/RegisterContainerInstance.hs b/gen/Network/AWS/ECS/RegisterContainerInstance.hs
--- a/gen/Network/AWS/ECS/RegisterContainerInstance.hs
+++ b/gen/Network/AWS/ECS/RegisterContainerInstance.hs
@@ -50,7 +50,7 @@
     ) where
 
 import Network.AWS.Prelude
-import Network.AWS.Request.Query
+import Network.AWS.Request.JSON
 import Network.AWS.ECS.Types
 import qualified GHC.Exts
 
@@ -58,7 +58,7 @@
     { _rciCluster                           :: Maybe Text
     , _rciInstanceIdentityDocument          :: Maybe Text
     , _rciInstanceIdentityDocumentSignature :: Maybe Text
-    , _rciTotalResources                    :: List "member" Resource
+    , _rciTotalResources                    :: List "totalResources" Resource
     } deriving (Eq, Read, Show)
 
 -- | 'RegisterContainerInstance' constructor.
@@ -125,22 +125,25 @@
     toPath = const "/"
 
 instance ToQuery RegisterContainerInstance where
-    toQuery RegisterContainerInstance{..} = mconcat
-        [ "cluster"                           =? _rciCluster
-        , "instanceIdentityDocument"          =? _rciInstanceIdentityDocument
-        , "instanceIdentityDocumentSignature" =? _rciInstanceIdentityDocumentSignature
-        , "totalResources"                    =? _rciTotalResources
-        ]
+    toQuery = const mempty
 
 instance ToHeaders RegisterContainerInstance
 
+instance ToJSON RegisterContainerInstance where
+    toJSON RegisterContainerInstance{..} = object
+        [ "cluster"                           .= _rciCluster
+        , "instanceIdentityDocument"          .= _rciInstanceIdentityDocument
+        , "instanceIdentityDocumentSignature" .= _rciInstanceIdentityDocumentSignature
+        , "totalResources"                    .= _rciTotalResources
+        ]
+
 instance AWSRequest RegisterContainerInstance where
     type Sv RegisterContainerInstance = ECS
     type Rs RegisterContainerInstance = RegisterContainerInstanceResponse
 
     request  = post "RegisterContainerInstance"
-    response = xmlResponse
+    response = jsonResponse
 
-instance FromXML RegisterContainerInstanceResponse where
-    parseXML = withElement "RegisterContainerInstanceResult" $ \x -> RegisterContainerInstanceResponse
-        <$> x .@? "containerInstance"
+instance FromJSON RegisterContainerInstanceResponse where
+    parseJSON = withObject "RegisterContainerInstanceResponse" $ \o -> RegisterContainerInstanceResponse
+        <$> o .:? "containerInstance"
diff --git a/gen/Network/AWS/ECS/RegisterTaskDefinition.hs b/gen/Network/AWS/ECS/RegisterTaskDefinition.hs
--- a/gen/Network/AWS/ECS/RegisterTaskDefinition.hs
+++ b/gen/Network/AWS/ECS/RegisterTaskDefinition.hs
@@ -22,7 +22,9 @@
 --
 -- Derived from AWS service descriptions, licensed under Apache 2.0.
 
--- | Registers a new task definition from the supplied 'family' and 'containerDefinitions'.
+-- | Registers a new task definition from the supplied 'family' and 'containerDefinitions'. Optionally, you can add data volumes to your containers with the 'volumes'
+-- parameter. For more information on task definition parameters and defaults,
+-- see <http://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_defintions.html Amazon ECS Task Definitions> in the /Amazon EC2 Container Service DeveloperGuide/.
 --
 -- <http://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RegisterTaskDefinition.html>
 module Network.AWS.ECS.RegisterTaskDefinition
@@ -34,6 +36,7 @@
     -- ** Request lenses
     , rtdContainerDefinitions
     , rtdFamily
+    , rtdVolumes
 
     -- * Response
     , RegisterTaskDefinitionResponse
@@ -44,13 +47,14 @@
     ) where
 
 import Network.AWS.Prelude
-import Network.AWS.Request.Query
+import Network.AWS.Request.JSON
 import Network.AWS.ECS.Types
 import qualified GHC.Exts
 
 data RegisterTaskDefinition = RegisterTaskDefinition
-    { _rtdContainerDefinitions :: List "member" ContainerDefinition
+    { _rtdContainerDefinitions :: List "containerDefinitions" ContainerDefinition
     , _rtdFamily               :: Text
+    , _rtdVolumes              :: List "volumes" Volume
     } deriving (Eq, Read, Show)
 
 -- | 'RegisterTaskDefinition' constructor.
@@ -61,11 +65,14 @@
 --
 -- * 'rtdFamily' @::@ 'Text'
 --
+-- * 'rtdVolumes' @::@ ['Volume']
+--
 registerTaskDefinition :: Text -- ^ 'rtdFamily'
                        -> RegisterTaskDefinition
 registerTaskDefinition p1 = RegisterTaskDefinition
     { _rtdFamily               = p1
     , _rtdContainerDefinitions = mempty
+    , _rtdVolumes              = mempty
     }
 
 -- | A list of container definitions in JSON format that describe the different
@@ -75,12 +82,17 @@
     lens _rtdContainerDefinitions (\s a -> s { _rtdContainerDefinitions = a })
         . _List
 
--- | You can specify a 'family' for a task definition, which allows you to track
+-- | You must 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 })
 
+-- | A list of volume definitions in JSON format that containers in your task may
+-- use.
+rtdVolumes :: Lens' RegisterTaskDefinition [Volume]
+rtdVolumes = lens _rtdVolumes (\s a -> s { _rtdVolumes = a }) . _List
+
 newtype RegisterTaskDefinitionResponse = RegisterTaskDefinitionResponse
     { _rtdrTaskDefinition :: Maybe TaskDefinition
     } deriving (Eq, Read, Show)
@@ -104,20 +116,24 @@
     toPath = const "/"
 
 instance ToQuery RegisterTaskDefinition where
-    toQuery RegisterTaskDefinition{..} = mconcat
-        [ "containerDefinitions" =? _rtdContainerDefinitions
-        , "family"               =? _rtdFamily
-        ]
+    toQuery = const mempty
 
 instance ToHeaders RegisterTaskDefinition
 
+instance ToJSON RegisterTaskDefinition where
+    toJSON RegisterTaskDefinition{..} = object
+        [ "family"               .= _rtdFamily
+        , "containerDefinitions" .= _rtdContainerDefinitions
+        , "volumes"              .= _rtdVolumes
+        ]
+
 instance AWSRequest RegisterTaskDefinition where
     type Sv RegisterTaskDefinition = ECS
     type Rs RegisterTaskDefinition = RegisterTaskDefinitionResponse
 
     request  = post "RegisterTaskDefinition"
-    response = xmlResponse
+    response = jsonResponse
 
-instance FromXML RegisterTaskDefinitionResponse where
-    parseXML = withElement "RegisterTaskDefinitionResult" $ \x -> RegisterTaskDefinitionResponse
-        <$> x .@? "taskDefinition"
+instance FromJSON RegisterTaskDefinitionResponse where
+    parseJSON = withObject "RegisterTaskDefinitionResponse" $ \o -> RegisterTaskDefinitionResponse
+        <$> o .:? "taskDefinition"
diff --git a/gen/Network/AWS/ECS/RunTask.hs b/gen/Network/AWS/ECS/RunTask.hs
--- a/gen/Network/AWS/ECS/RunTask.hs
+++ b/gen/Network/AWS/ECS/RunTask.hs
@@ -49,7 +49,7 @@
     ) where
 
 import Network.AWS.Prelude
-import Network.AWS.Request.Query
+import Network.AWS.Request.JSON
 import Network.AWS.ECS.Types
 import qualified GHC.Exts
 
@@ -101,8 +101,8 @@
 rtTaskDefinition = lens _rtTaskDefinition (\s a -> s { _rtTaskDefinition = a })
 
 data RunTaskResponse = RunTaskResponse
-    { _rtrFailures :: List "member" Failure
-    , _rtrTasks    :: List "member" Task
+    { _rtrFailures :: List "failures" Failure
+    , _rtrTasks    :: List "tasks" Task
     } deriving (Eq, Read, Show)
 
 -- | 'RunTaskResponse' constructor.
@@ -132,23 +132,26 @@
     toPath = const "/"
 
 instance ToQuery RunTask where
-    toQuery RunTask{..} = mconcat
-        [ "cluster"        =? _rtCluster
-        , "count"          =? _rtCount
-        , "overrides"      =? _rtOverrides
-        , "taskDefinition" =? _rtTaskDefinition
-        ]
+    toQuery = const mempty
 
 instance ToHeaders RunTask
 
+instance ToJSON RunTask where
+    toJSON RunTask{..} = object
+        [ "cluster"        .= _rtCluster
+        , "taskDefinition" .= _rtTaskDefinition
+        , "overrides"      .= _rtOverrides
+        , "count"          .= _rtCount
+        ]
+
 instance AWSRequest RunTask where
     type Sv RunTask = ECS
     type Rs RunTask = RunTaskResponse
 
     request  = post "RunTask"
-    response = xmlResponse
+    response = jsonResponse
 
-instance FromXML RunTaskResponse where
-    parseXML = withElement "RunTaskResult" $ \x -> RunTaskResponse
-        <$> x .@? "failures" .!@ mempty
-        <*> x .@? "tasks" .!@ mempty
+instance FromJSON RunTaskResponse where
+    parseJSON = withObject "RunTaskResponse" $ \o -> RunTaskResponse
+        <$> o .:? "failures" .!= mempty
+        <*> o .:? "tasks" .!= mempty
diff --git a/gen/Network/AWS/ECS/StartTask.hs b/gen/Network/AWS/ECS/StartTask.hs
--- a/gen/Network/AWS/ECS/StartTask.hs
+++ b/gen/Network/AWS/ECS/StartTask.hs
@@ -49,13 +49,13 @@
     ) where
 
 import Network.AWS.Prelude
-import Network.AWS.Request.Query
+import Network.AWS.Request.JSON
 import Network.AWS.ECS.Types
 import qualified GHC.Exts
 
 data StartTask = StartTask
     { _st1Cluster            :: Maybe Text
-    , _st1ContainerInstances :: List "member" Text
+    , _st1ContainerInstances :: List "containerInstances" Text
     , _st1Overrides          :: Maybe TaskOverride
     , _st1TaskDefinition     :: Text
     } deriving (Eq, Read, Show)
@@ -104,8 +104,8 @@
     lens _st1TaskDefinition (\s a -> s { _st1TaskDefinition = a })
 
 data StartTaskResponse = StartTaskResponse
-    { _strFailures :: List "member" Failure
-    , _strTasks    :: List "member" Task
+    { _strFailures :: List "failures" Failure
+    , _strTasks    :: List "tasks" Task
     } deriving (Eq, Read, Show)
 
 -- | 'StartTaskResponse' constructor.
@@ -135,23 +135,26 @@
     toPath = const "/"
 
 instance ToQuery StartTask where
-    toQuery StartTask{..} = mconcat
-        [ "cluster"            =? _st1Cluster
-        , "containerInstances" =? _st1ContainerInstances
-        , "overrides"          =? _st1Overrides
-        , "taskDefinition"     =? _st1TaskDefinition
-        ]
+    toQuery = const mempty
 
 instance ToHeaders StartTask
 
+instance ToJSON StartTask where
+    toJSON StartTask{..} = object
+        [ "cluster"            .= _st1Cluster
+        , "taskDefinition"     .= _st1TaskDefinition
+        , "overrides"          .= _st1Overrides
+        , "containerInstances" .= _st1ContainerInstances
+        ]
+
 instance AWSRequest StartTask where
     type Sv StartTask = ECS
     type Rs StartTask = StartTaskResponse
 
     request  = post "StartTask"
-    response = xmlResponse
+    response = jsonResponse
 
-instance FromXML StartTaskResponse where
-    parseXML = withElement "StartTaskResult" $ \x -> StartTaskResponse
-        <$> x .@? "failures" .!@ mempty
-        <*> x .@? "tasks" .!@ mempty
+instance FromJSON StartTaskResponse where
+    parseJSON = withObject "StartTaskResponse" $ \o -> StartTaskResponse
+        <$> o .:? "failures" .!= mempty
+        <*> o .:? "tasks" .!= mempty
diff --git a/gen/Network/AWS/ECS/StopTask.hs b/gen/Network/AWS/ECS/StopTask.hs
--- a/gen/Network/AWS/ECS/StopTask.hs
+++ b/gen/Network/AWS/ECS/StopTask.hs
@@ -44,7 +44,7 @@
     ) where
 
 import Network.AWS.Prelude
-import Network.AWS.Request.Query
+import Network.AWS.Request.JSON
 import Network.AWS.ECS.Types
 import qualified GHC.Exts
 
@@ -101,20 +101,23 @@
     toPath = const "/"
 
 instance ToQuery StopTask where
-    toQuery StopTask{..} = mconcat
-        [ "cluster" =? _stCluster
-        , "task"    =? _stTask
-        ]
+    toQuery = const mempty
 
 instance ToHeaders StopTask
 
+instance ToJSON StopTask where
+    toJSON StopTask{..} = object
+        [ "cluster" .= _stCluster
+        , "task"    .= _stTask
+        ]
+
 instance AWSRequest StopTask where
     type Sv StopTask = ECS
     type Rs StopTask = StopTaskResponse
 
     request  = post "StopTask"
-    response = xmlResponse
+    response = jsonResponse
 
-instance FromXML StopTaskResponse where
-    parseXML = withElement "StopTaskResult" $ \x -> StopTaskResponse
-        <$> x .@? "task"
+instance FromJSON StopTaskResponse where
+    parseJSON = withObject "StopTaskResponse" $ \o -> StopTaskResponse
+        <$> o .:? "task"
diff --git a/gen/Network/AWS/ECS/SubmitContainerStateChange.hs b/gen/Network/AWS/ECS/SubmitContainerStateChange.hs
--- a/gen/Network/AWS/ECS/SubmitContainerStateChange.hs
+++ b/gen/Network/AWS/ECS/SubmitContainerStateChange.hs
@@ -52,7 +52,7 @@
     ) where
 
 import Network.AWS.Prelude
-import Network.AWS.Request.Query
+import Network.AWS.Request.JSON
 import Network.AWS.ECS.Types
 import qualified GHC.Exts
 
@@ -60,7 +60,7 @@
     { _scscCluster         :: Maybe Text
     , _scscContainerName   :: Maybe Text
     , _scscExitCode        :: Maybe Int
-    , _scscNetworkBindings :: List "member" NetworkBinding
+    , _scscNetworkBindings :: List "networkBindings" NetworkBinding
     , _scscReason          :: Maybe Text
     , _scscStatus          :: Maybe Text
     , _scscTask            :: Maybe Text
@@ -152,25 +152,28 @@
     toPath = const "/"
 
 instance ToQuery SubmitContainerStateChange where
-    toQuery SubmitContainerStateChange{..} = mconcat
-        [ "cluster"         =? _scscCluster
-        , "containerName"   =? _scscContainerName
-        , "exitCode"        =? _scscExitCode
-        , "networkBindings" =? _scscNetworkBindings
-        , "reason"          =? _scscReason
-        , "status"          =? _scscStatus
-        , "task"            =? _scscTask
-        ]
+    toQuery = const mempty
 
 instance ToHeaders SubmitContainerStateChange
 
+instance ToJSON SubmitContainerStateChange where
+    toJSON SubmitContainerStateChange{..} = object
+        [ "cluster"         .= _scscCluster
+        , "task"            .= _scscTask
+        , "containerName"   .= _scscContainerName
+        , "status"          .= _scscStatus
+        , "exitCode"        .= _scscExitCode
+        , "reason"          .= _scscReason
+        , "networkBindings" .= _scscNetworkBindings
+        ]
+
 instance AWSRequest SubmitContainerStateChange where
     type Sv SubmitContainerStateChange = ECS
     type Rs SubmitContainerStateChange = SubmitContainerStateChangeResponse
 
     request  = post "SubmitContainerStateChange"
-    response = xmlResponse
+    response = jsonResponse
 
-instance FromXML SubmitContainerStateChangeResponse where
-    parseXML = withElement "SubmitContainerStateChangeResult" $ \x -> SubmitContainerStateChangeResponse
-        <$> x .@? "acknowledgment"
+instance FromJSON SubmitContainerStateChangeResponse where
+    parseJSON = withObject "SubmitContainerStateChangeResponse" $ \o -> SubmitContainerStateChangeResponse
+        <$> o .:? "acknowledgment"
diff --git a/gen/Network/AWS/ECS/SubmitTaskStateChange.hs b/gen/Network/AWS/ECS/SubmitTaskStateChange.hs
--- a/gen/Network/AWS/ECS/SubmitTaskStateChange.hs
+++ b/gen/Network/AWS/ECS/SubmitTaskStateChange.hs
@@ -49,7 +49,7 @@
     ) where
 
 import Network.AWS.Prelude
-import Network.AWS.Request.Query
+import Network.AWS.Request.JSON
 import Network.AWS.ECS.Types
 import qualified GHC.Exts
 
@@ -122,22 +122,25 @@
     toPath = const "/"
 
 instance ToQuery SubmitTaskStateChange where
-    toQuery SubmitTaskStateChange{..} = mconcat
-        [ "cluster" =? _stscCluster
-        , "reason"  =? _stscReason
-        , "status"  =? _stscStatus
-        , "task"    =? _stscTask
-        ]
+    toQuery = const mempty
 
 instance ToHeaders SubmitTaskStateChange
 
+instance ToJSON SubmitTaskStateChange where
+    toJSON SubmitTaskStateChange{..} = object
+        [ "cluster" .= _stscCluster
+        , "task"    .= _stscTask
+        , "status"  .= _stscStatus
+        , "reason"  .= _stscReason
+        ]
+
 instance AWSRequest SubmitTaskStateChange where
     type Sv SubmitTaskStateChange = ECS
     type Rs SubmitTaskStateChange = SubmitTaskStateChangeResponse
 
     request  = post "SubmitTaskStateChange"
-    response = xmlResponse
+    response = jsonResponse
 
-instance FromXML SubmitTaskStateChangeResponse where
-    parseXML = withElement "SubmitTaskStateChangeResult" $ \x -> SubmitTaskStateChangeResponse
-        <$> x .@? "acknowledgment"
+instance FromJSON SubmitTaskStateChangeResponse where
+    parseJSON = withObject "SubmitTaskStateChangeResponse" $ \o -> SubmitTaskStateChangeResponse
+        <$> o .:? "acknowledgment"
diff --git a/gen/Network/AWS/ECS/Types.hs b/gen/Network/AWS/ECS/Types.hs
--- a/gen/Network/AWS/ECS/Types.hs
+++ b/gen/Network/AWS/ECS/Types.hs
@@ -28,9 +28,7 @@
     -- * Service
       ECS
     -- ** Error
-    , RESTError
-    -- ** XML
-    , ns
+    , JSONError
 
     -- * NetworkBinding
     , NetworkBinding
@@ -46,6 +44,12 @@
     , cClusterName
     , cStatus
 
+    -- * Volume
+    , Volume
+    , volume
+    , vHost
+    , vName
+
     -- * ContainerOverride
     , ContainerOverride
     , containerOverride
@@ -58,11 +62,22 @@
     , kvpName
     , kvpValue
 
+    -- * VolumeFrom
+    , VolumeFrom
+    , volumeFrom
+    , vfReadOnly
+    , vfSourceContainer
+
     -- * TaskOverride
     , TaskOverride
     , taskOverride
     , toContainerOverrides
 
+    -- * HostVolumeProperties
+    , HostVolumeProperties
+    , hostVolumeProperties
+    , hvpSourcePath
+
     -- * Container
     , Container
     , container
@@ -85,8 +100,10 @@
     , cdImage
     , cdLinks
     , cdMemory
+    , cdMountPoints
     , cdName
     , cdPortMappings
+    , cdVolumesFrom
 
     -- * Resource
     , Resource
@@ -123,6 +140,7 @@
     , tdFamily
     , tdRevision
     , tdTaskDefinitionArn
+    , tdVolumes
 
     -- * Failure
     , Failure
@@ -139,6 +157,13 @@
     , ciRegisteredResources
     , ciRemainingResources
     , ciStatus
+
+    -- * MountPoint
+    , MountPoint
+    , mountPoint
+    , mpContainerPath
+    , mpReadOnly
+    , mpSourceVolume
     ) where
 
 import Network.AWS.Prelude
@@ -150,7 +175,7 @@
 
 instance AWSService ECS where
     type Sg ECS = V4
-    type Er ECS = RESTError
+    type Er ECS = JSONError
 
     service = service'
       where
@@ -159,15 +184,15 @@
             { _svcAbbrev       = "ECS"
             , _svcPrefix       = "ecs"
             , _svcVersion      = "2014-11-13"
-            , _svcTargetPrefix = Nothing
-            , _svcJSONVersion  = Nothing
+            , _svcTargetPrefix = Just "AmazonEC2ContainerServiceV20141113"
+            , _svcJSONVersion  = Just "1.1"
             , _svcHandle       = handle
             , _svcRetry        = retry
             }
 
         handle :: Status
-               -> Maybe (LazyByteString -> ServiceError RESTError)
-        handle = restError statusSuccess service'
+               -> Maybe (LazyByteString -> ServiceError JSONError)
+        handle = jsonError statusSuccess service'
 
         retry :: Retry ECS
         retry = Exponential
@@ -178,7 +203,7 @@
             }
 
         check :: Status
-              -> RESTError
+              -> JSONError
               -> Bool
         check (statusCode -> s) (awsErrorCode -> e)
             | s == 500  = True -- General Server Error
@@ -186,10 +211,6 @@
             | 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
@@ -217,25 +238,25 @@
 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.
+-- | The port number on the container that is 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.
+-- | The port number on the host that is 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 FromJSON NetworkBinding where
+    parseJSON = withObject "NetworkBinding" $ \o -> NetworkBinding
+        <$> o .:? "bindIP"
+        <*> o .:? "containerPort"
+        <*> o .:? "hostPort"
 
-instance ToQuery NetworkBinding where
-    toQuery NetworkBinding{..} = mconcat
-        [ "bindIP"        =? _nbBindIP
-        , "containerPort" =? _nbContainerPort
-        , "hostPort"      =? _nbHostPort
+instance ToJSON NetworkBinding where
+    toJSON NetworkBinding{..} = object
+        [ "bindIP"        .= _nbBindIP
+        , "containerPort" .= _nbContainerPort
+        , "hostPort"      .= _nbHostPort
         ]
 
 data Cluster = Cluster
@@ -278,21 +299,62 @@
 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 FromJSON Cluster where
+    parseJSON = withObject "Cluster" $ \o -> Cluster
+        <$> o .:? "clusterArn"
+        <*> o .:? "clusterName"
+        <*> o .:? "status"
 
-instance ToQuery Cluster where
-    toQuery Cluster{..} = mconcat
-        [ "clusterArn"  =? _cClusterArn
-        , "clusterName" =? _cClusterName
-        , "status"      =? _cStatus
+instance ToJSON Cluster where
+    toJSON Cluster{..} = object
+        [ "clusterArn"  .= _cClusterArn
+        , "clusterName" .= _cClusterName
+        , "status"      .= _cStatus
         ]
 
+data Volume = Volume
+    { _vHost :: Maybe HostVolumeProperties
+    , _vName :: Maybe Text
+    } deriving (Eq, Read, Show)
+
+-- | 'Volume' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'vHost' @::@ 'Maybe' 'HostVolumeProperties'
+--
+-- * 'vName' @::@ 'Maybe' 'Text'
+--
+volume :: Volume
+volume = Volume
+    { _vName = Nothing
+    , _vHost = Nothing
+    }
+
+-- | The path on the host container instance that is presented to the containers
+-- which access the volume. If this parameter is empty, then the Docker daemon
+-- assigns a host path for you.
+vHost :: Lens' Volume (Maybe HostVolumeProperties)
+vHost = lens _vHost (\s a -> s { _vHost = a })
+
+-- | The name of the volume. This name is referenced in the 'sourceVolume' parameter
+-- of container definition 'mountPoints'.
+vName :: Lens' Volume (Maybe Text)
+vName = lens _vName (\s a -> s { _vName = a })
+
+instance FromJSON Volume where
+    parseJSON = withObject "Volume" $ \o -> Volume
+        <$> o .:? "host"
+        <*> o .:? "name"
+
+instance ToJSON Volume where
+    toJSON Volume{..} = object
+        [ "name" .= _vName
+        , "host" .= _vHost
+        ]
+
 data ContainerOverride = ContainerOverride
-    { _coCommand :: List "member" Text
+    { _coCommand :: List "command" Text
     , _coName    :: Maybe Text
     } deriving (Eq, Ord, Read, Show)
 
@@ -318,15 +380,15 @@
 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 FromJSON ContainerOverride where
+    parseJSON = withObject "ContainerOverride" $ \o -> ContainerOverride
+        <$> o .:? "command" .!= mempty
+        <*> o .:? "name"
 
-instance ToQuery ContainerOverride where
-    toQuery ContainerOverride{..} = mconcat
-        [ "command" =? _coCommand
-        , "name"    =? _coName
+instance ToJSON ContainerOverride where
+    toJSON ContainerOverride{..} = object
+        [ "name"    .= _coName
+        , "command" .= _coCommand
         ]
 
 data KeyValuePair = KeyValuePair
@@ -356,19 +418,60 @@
 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 FromJSON KeyValuePair where
+    parseJSON = withObject "KeyValuePair" $ \o -> KeyValuePair
+        <$> o .:? "name"
+        <*> o .:? "value"
 
-instance ToQuery KeyValuePair where
-    toQuery KeyValuePair{..} = mconcat
-        [ "name"  =? _kvpName
-        , "value" =? _kvpValue
+instance ToJSON KeyValuePair where
+    toJSON KeyValuePair{..} = object
+        [ "name"  .= _kvpName
+        , "value" .= _kvpValue
         ]
 
+data VolumeFrom = VolumeFrom
+    { _vfReadOnly        :: Maybe Bool
+    , _vfSourceContainer :: Maybe Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'VolumeFrom' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'vfReadOnly' @::@ 'Maybe' 'Bool'
+--
+-- * 'vfSourceContainer' @::@ 'Maybe' 'Text'
+--
+volumeFrom :: VolumeFrom
+volumeFrom = VolumeFrom
+    { _vfSourceContainer = Nothing
+    , _vfReadOnly        = Nothing
+    }
+
+-- | If this value is 'true', the container has read-only access to the volume. If
+-- this value is 'false', then the container can write to the volume. The default
+-- value is 'false'.
+vfReadOnly :: Lens' VolumeFrom (Maybe Bool)
+vfReadOnly = lens _vfReadOnly (\s a -> s { _vfReadOnly = a })
+
+-- | The name of the container to mount volumes from.
+vfSourceContainer :: Lens' VolumeFrom (Maybe Text)
+vfSourceContainer =
+    lens _vfSourceContainer (\s a -> s { _vfSourceContainer = a })
+
+instance FromJSON VolumeFrom where
+    parseJSON = withObject "VolumeFrom" $ \o -> VolumeFrom
+        <$> o .:? "readOnly"
+        <*> o .:? "sourceContainer"
+
+instance ToJSON VolumeFrom where
+    toJSON VolumeFrom{..} = object
+        [ "sourceContainer" .= _vfSourceContainer
+        , "readOnly"        .= _vfReadOnly
+        ]
+
 newtype TaskOverride = TaskOverride
-    { _toContainerOverrides :: List "member" ContainerOverride
+    { _toContainerOverrides :: List "containerOverrides" ContainerOverride
     } deriving (Eq, Read, Show, Monoid, Semigroup)
 
 instance GHC.Exts.IsList TaskOverride where
@@ -394,21 +497,51 @@
     lens _toContainerOverrides (\s a -> s { _toContainerOverrides = a })
         . _List
 
-instance FromXML TaskOverride where
-    parseXML x = TaskOverride
-        <$> x .@? "containerOverrides" .!@ mempty
+instance FromJSON TaskOverride where
+    parseJSON = withObject "TaskOverride" $ \o -> TaskOverride
+        <$> o .:? "containerOverrides" .!= mempty
 
-instance ToQuery TaskOverride where
-    toQuery TaskOverride{..} = mconcat
-        [ "containerOverrides" =? _toContainerOverrides
+instance ToJSON TaskOverride where
+    toJSON TaskOverride{..} = object
+        [ "containerOverrides" .= _toContainerOverrides
         ]
 
+newtype HostVolumeProperties = HostVolumeProperties
+    { _hvpSourcePath :: Maybe Text
+    } deriving (Eq, Ord, Read, Show, Monoid)
+
+-- | 'HostVolumeProperties' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'hvpSourcePath' @::@ 'Maybe' 'Text'
+--
+hostVolumeProperties :: HostVolumeProperties
+hostVolumeProperties = HostVolumeProperties
+    { _hvpSourcePath = Nothing
+    }
+
+-- | The path on the host container instance that is presented to the container.
+-- If this parameter is empty, then the Docker daemon has assigned a host path
+-- for you.
+hvpSourcePath :: Lens' HostVolumeProperties (Maybe Text)
+hvpSourcePath = lens _hvpSourcePath (\s a -> s { _hvpSourcePath = a })
+
+instance FromJSON HostVolumeProperties where
+    parseJSON = withObject "HostVolumeProperties" $ \o -> HostVolumeProperties
+        <$> o .:? "sourcePath"
+
+instance ToJSON HostVolumeProperties where
+    toJSON HostVolumeProperties{..} = object
+        [ "sourcePath" .= _hvpSourcePath
+        ]
+
 data Container = Container
     { _cContainerArn    :: Maybe Text
     , _cExitCode        :: Maybe Int
     , _cLastStatus      :: Maybe Text
     , _cName            :: Maybe Text
-    , _cNetworkBindings :: List "member" NetworkBinding
+    , _cNetworkBindings :: List "networkBindings" NetworkBinding
     , _cReason          :: Maybe Text
     , _cTaskArn         :: Maybe Text
     } deriving (Eq, Read, Show)
@@ -470,38 +603,40 @@
 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 FromJSON Container where
+    parseJSON = withObject "Container" $ \o -> Container
+        <$> o .:? "containerArn"
+        <*> o .:? "exitCode"
+        <*> o .:? "lastStatus"
+        <*> o .:? "name"
+        <*> o .:? "networkBindings" .!= mempty
+        <*> o .:? "reason"
+        <*> o .:? "taskArn"
 
-instance ToQuery Container where
-    toQuery Container{..} = mconcat
-        [ "containerArn"    =? _cContainerArn
-        , "exitCode"        =? _cExitCode
-        , "lastStatus"      =? _cLastStatus
-        , "name"            =? _cName
-        , "networkBindings" =? _cNetworkBindings
-        , "reason"          =? _cReason
-        , "taskArn"         =? _cTaskArn
+instance ToJSON Container where
+    toJSON Container{..} = object
+        [ "containerArn"    .= _cContainerArn
+        , "taskArn"         .= _cTaskArn
+        , "name"            .= _cName
+        , "lastStatus"      .= _cLastStatus
+        , "exitCode"        .= _cExitCode
+        , "reason"          .= _cReason
+        , "networkBindings" .= _cNetworkBindings
         ]
 
 data ContainerDefinition = ContainerDefinition
-    { _cdCommand      :: List "member" Text
+    { _cdCommand      :: List "command" Text
     , _cdCpu          :: Maybe Int
-    , _cdEntryPoint   :: List "member" Text
-    , _cdEnvironment  :: List "member" KeyValuePair
+    , _cdEntryPoint   :: List "entryPoint" Text
+    , _cdEnvironment  :: List "environment" KeyValuePair
     , _cdEssential    :: Maybe Bool
     , _cdImage        :: Maybe Text
-    , _cdLinks        :: List "member" Text
+    , _cdLinks        :: List "links" Text
     , _cdMemory       :: Maybe Int
+    , _cdMountPoints  :: List "mountPoints" MountPoint
     , _cdName         :: Maybe Text
-    , _cdPortMappings :: List "member" PortMapping
+    , _cdPortMappings :: List "portMappings" PortMapping
+    , _cdVolumesFrom  :: List "volumesFrom" VolumeFrom
     } deriving (Eq, Read, Show)
 
 -- | 'ContainerDefinition' constructor.
@@ -524,10 +659,14 @@
 --
 -- * 'cdMemory' @::@ 'Maybe' 'Int'
 --
+-- * 'cdMountPoints' @::@ ['MountPoint']
+--
 -- * 'cdName' @::@ 'Maybe' 'Text'
 --
 -- * 'cdPortMappings' @::@ ['PortMapping']
 --
+-- * 'cdVolumesFrom' @::@ ['VolumeFrom']
+--
 containerDefinition :: ContainerDefinition
 containerDefinition = ContainerDefinition
     { _cdName         = Nothing
@@ -540,6 +679,8 @@
     , _cdEntryPoint   = mempty
     , _cdCommand      = mempty
     , _cdEnvironment  = mempty
+    , _cdMountPoints  = mempty
+    , _cdVolumesFrom  = 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>.
@@ -551,7 +692,10 @@
 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
+-- | Early versions of the Amazon ECS container agent do not properly handle 'entryPoint' parameters. If you have problems using 'entryPoint', update your container
+-- agent or enter your commands and arguments as 'command' array items instead.
+--
+-- 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
@@ -584,6 +728,10 @@
 cdMemory :: Lens' ContainerDefinition (Maybe Int)
 cdMemory = lens _cdMemory (\s a -> s { _cdMemory = a })
 
+-- | The mount points for data volumes in your container.
+cdMountPoints :: Lens' ContainerDefinition [MountPoint]
+cdMountPoints = lens _cdMountPoints (\s a -> s { _cdMountPoints = a }) . _List
+
 -- | 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.
@@ -594,31 +742,39 @@
 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
+-- | Data volumes to mount from another container.
+cdVolumesFrom :: Lens' ContainerDefinition [VolumeFrom]
+cdVolumesFrom = lens _cdVolumesFrom (\s a -> s { _cdVolumesFrom = a }) . _List
 
-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
+instance FromJSON ContainerDefinition where
+    parseJSON = withObject "ContainerDefinition" $ \o -> ContainerDefinition
+        <$> o .:? "command" .!= mempty
+        <*> o .:? "cpu"
+        <*> o .:? "entryPoint" .!= mempty
+        <*> o .:? "environment" .!= mempty
+        <*> o .:? "essential"
+        <*> o .:? "image"
+        <*> o .:? "links" .!= mempty
+        <*> o .:? "memory"
+        <*> o .:? "mountPoints" .!= mempty
+        <*> o .:? "name"
+        <*> o .:? "portMappings" .!= mempty
+        <*> o .:? "volumesFrom" .!= mempty
+
+instance ToJSON ContainerDefinition where
+    toJSON ContainerDefinition{..} = object
+        [ "name"         .= _cdName
+        , "image"        .= _cdImage
+        , "cpu"          .= _cdCpu
+        , "memory"       .= _cdMemory
+        , "links"        .= _cdLinks
+        , "portMappings" .= _cdPortMappings
+        , "essential"    .= _cdEssential
+        , "entryPoint"   .= _cdEntryPoint
+        , "command"      .= _cdCommand
+        , "environment"  .= _cdEnvironment
+        , "mountPoints"  .= _cdMountPoints
+        , "volumesFrom"  .= _cdVolumesFrom
         ]
 
 data Resource = Resource
@@ -626,7 +782,7 @@
     , _rIntegerValue   :: Maybe Int
     , _rLongValue      :: Maybe Integer
     , _rName           :: Maybe Text
-    , _rStringSetValue :: List "member" Text
+    , _rStringSetValue :: List "stringSetValue" Text
     , _rType           :: Maybe Text
     } deriving (Eq, Ord, Read, Show)
 
@@ -685,29 +841,29 @@
 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 FromJSON Resource where
+    parseJSON = withObject "Resource" $ \o -> Resource
+        <$> o .:? "doubleValue"
+        <*> o .:? "integerValue"
+        <*> o .:? "longValue"
+        <*> o .:? "name"
+        <*> o .:? "stringSetValue" .!= mempty
+        <*> o .:? "type"
 
-instance ToQuery Resource where
-    toQuery Resource{..} = mconcat
-        [ "doubleValue"    =? _rDoubleValue
-        , "integerValue"   =? _rIntegerValue
-        , "longValue"      =? _rLongValue
-        , "name"           =? _rName
-        , "stringSetValue" =? _rStringSetValue
-        , "type"           =? _rType
+instance ToJSON Resource where
+    toJSON Resource{..} = object
+        [ "name"           .= _rName
+        , "type"           .= _rType
+        , "doubleValue"    .= _rDoubleValue
+        , "longValue"      .= _rLongValue
+        , "integerValue"   .= _rIntegerValue
+        , "stringSetValue" .= _rStringSetValue
         ]
 
 data Task = Task
     { _tClusterArn           :: Maybe Text
     , _tContainerInstanceArn :: Maybe Text
-    , _tContainers           :: List "member" Container
+    , _tContainers           :: List "containers" Container
     , _tDesiredStatus        :: Maybe Text
     , _tLastStatus           :: Maybe Text
     , _tOverrides            :: Maybe TaskOverride
@@ -782,27 +938,27 @@
 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 FromJSON Task where
+    parseJSON = withObject "Task" $ \o -> Task
+        <$> o .:? "clusterArn"
+        <*> o .:? "containerInstanceArn"
+        <*> o .:? "containers" .!= mempty
+        <*> o .:? "desiredStatus"
+        <*> o .:? "lastStatus"
+        <*> o .:? "overrides"
+        <*> o .:? "taskArn"
+        <*> o .:? "taskDefinitionArn"
 
-instance ToQuery Task where
-    toQuery Task{..} = mconcat
-        [ "clusterArn"           =? _tClusterArn
-        , "containerInstanceArn" =? _tContainerInstanceArn
-        , "containers"           =? _tContainers
-        , "desiredStatus"        =? _tDesiredStatus
-        , "lastStatus"           =? _tLastStatus
-        , "overrides"            =? _tOverrides
-        , "taskArn"              =? _tTaskArn
-        , "taskDefinitionArn"    =? _tTaskDefinitionArn
+instance ToJSON Task where
+    toJSON Task{..} = object
+        [ "taskArn"              .= _tTaskArn
+        , "clusterArn"           .= _tClusterArn
+        , "taskDefinitionArn"    .= _tTaskDefinitionArn
+        , "containerInstanceArn" .= _tContainerInstanceArn
+        , "overrides"            .= _tOverrides
+        , "lastStatus"           .= _tLastStatus
+        , "desiredStatus"        .= _tDesiredStatus
+        , "containers"           .= _tContainers
         ]
 
 data PortMapping = PortMapping
@@ -824,30 +980,48 @@
     , _pmHostPort      = Nothing
     }
 
--- | The port number on the container that should be used with the port mapping.
+-- | The port number on the container that is bound to the user-specified or
+-- automatically assigned host port. If you specify a container port and not a
+-- host port, your container will automatically receive a host port in the 49153
+-- to 65535 port range.
 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.
+-- | The port number on the container instance to reserve for your container. You
+-- can specify a non-reserved host port for your container port mapping, or you
+-- can omit the 'hostPort' while specifying a 'containerPort' and your container
+-- will automatically receive a port in the 49153 to 65535 port range. You
+-- should not attempt to specify a host port in the 49153 to 65535 port range,
+-- since these are reserved for automatic assignment.
+--
+-- The default reserved ports are 22 for SSH, the Docker ports 2375 and 2376,
+-- and the Amazon ECS Container Agent port 51678. Any host port that was
+-- previously specified in a running task is also reserved while the task is
+-- running (once a task stops, the host port is released).The current reserved
+-- ports are displayed in the 'remainingResources' of 'DescribeContainerInstances'
+-- output, and a container instance may have up to 50 reserved ports at a time,
+-- including the default reserved ports (automatically assigned ports do not
+-- count toward this limit).
 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 FromJSON PortMapping where
+    parseJSON = withObject "PortMapping" $ \o -> PortMapping
+        <$> o .:? "containerPort"
+        <*> o .:? "hostPort"
 
-instance ToQuery PortMapping where
-    toQuery PortMapping{..} = mconcat
-        [ "containerPort" =? _pmContainerPort
-        , "hostPort"      =? _pmHostPort
+instance ToJSON PortMapping where
+    toJSON PortMapping{..} = object
+        [ "containerPort" .= _pmContainerPort
+        , "hostPort"      .= _pmHostPort
         ]
 
 data TaskDefinition = TaskDefinition
-    { _tdContainerDefinitions :: List "member" ContainerDefinition
+    { _tdContainerDefinitions :: List "containerDefinitions" ContainerDefinition
     , _tdFamily               :: Maybe Text
     , _tdRevision             :: Maybe Int
     , _tdTaskDefinitionArn    :: Maybe Text
+    , _tdVolumes              :: List "volumes" Volume
     } deriving (Eq, Read, Show)
 
 -- | 'TaskDefinition' constructor.
@@ -862,16 +1036,20 @@
 --
 -- * 'tdTaskDefinitionArn' @::@ 'Maybe' 'Text'
 --
+-- * 'tdVolumes' @::@ ['Volume']
+--
 taskDefinition :: TaskDefinition
 taskDefinition = TaskDefinition
     { _tdTaskDefinitionArn    = Nothing
     , _tdContainerDefinitions = mempty
     , _tdFamily               = Nothing
     , _tdRevision             = Nothing
+    , _tdVolumes              = mempty
     }
 
 -- | A list of container definitions in JSON format that describe the different
--- containers that make up your task.
+-- containers that make up your task. For more information on container
+-- definition parameters and defaults, see <http://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_defintions.html Amazon ECS Task Definitions> in the /Amazon EC2 Container Service Developer Guide/.
 tdContainerDefinitions :: Lens' TaskDefinition [ContainerDefinition]
 tdContainerDefinitions =
     lens _tdContainerDefinitions (\s a -> s { _tdContainerDefinitions = a })
@@ -895,19 +1073,26 @@
 tdTaskDefinitionArn =
     lens _tdTaskDefinitionArn (\s a -> s { _tdTaskDefinitionArn = a })
 
-instance FromXML TaskDefinition where
-    parseXML x = TaskDefinition
-        <$> x .@? "containerDefinitions" .!@ mempty
-        <*> x .@? "family"
-        <*> x .@? "revision"
-        <*> x .@? "taskDefinitionArn"
+-- | The list of volumes in a task. For more information on volume definition
+-- parameters and defaults, see <http://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_defintions.html Amazon ECS Task Definitions> in the /Amazon EC2Container Service Developer Guide/.
+tdVolumes :: Lens' TaskDefinition [Volume]
+tdVolumes = lens _tdVolumes (\s a -> s { _tdVolumes = a }) . _List
 
-instance ToQuery TaskDefinition where
-    toQuery TaskDefinition{..} = mconcat
-        [ "containerDefinitions" =? _tdContainerDefinitions
-        , "family"               =? _tdFamily
-        , "revision"             =? _tdRevision
-        , "taskDefinitionArn"    =? _tdTaskDefinitionArn
+instance FromJSON TaskDefinition where
+    parseJSON = withObject "TaskDefinition" $ \o -> TaskDefinition
+        <$> o .:? "containerDefinitions" .!= mempty
+        <*> o .:? "family"
+        <*> o .:? "revision"
+        <*> o .:? "taskDefinitionArn"
+        <*> o .:? "volumes" .!= mempty
+
+instance ToJSON TaskDefinition where
+    toJSON TaskDefinition{..} = object
+        [ "taskDefinitionArn"    .= _tdTaskDefinitionArn
+        , "containerDefinitions" .= _tdContainerDefinitions
+        , "family"               .= _tdFamily
+        , "revision"             .= _tdRevision
+        , "volumes"              .= _tdVolumes
         ]
 
 data Failure = Failure
@@ -937,23 +1122,23 @@
 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 FromJSON Failure where
+    parseJSON = withObject "Failure" $ \o -> Failure
+        <$> o .:? "arn"
+        <*> o .:? "reason"
 
-instance ToQuery Failure where
-    toQuery Failure{..} = mconcat
-        [ "arn"    =? _fArn
-        , "reason" =? _fReason
+instance ToJSON Failure where
+    toJSON Failure{..} = object
+        [ "arn"    .= _fArn
+        , "reason" .= _fReason
         ]
 
 data ContainerInstance = ContainerInstance
     { _ciAgentConnected       :: Maybe Bool
     , _ciContainerInstanceArn :: Maybe Text
     , _ciEc2InstanceId        :: Maybe Text
-    , _ciRegisteredResources  :: List "member" Resource
-    , _ciRemainingResources   :: List "member" Resource
+    , _ciRegisteredResources  :: List "registeredResources" Resource
+    , _ciRemainingResources   :: List "remainingResources" Resource
     , _ciStatus               :: Maybe Text
     } deriving (Eq, Read, Show)
 
@@ -1021,21 +1206,71 @@
 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 FromJSON ContainerInstance where
+    parseJSON = withObject "ContainerInstance" $ \o -> ContainerInstance
+        <$> o .:? "agentConnected"
+        <*> o .:? "containerInstanceArn"
+        <*> o .:? "ec2InstanceId"
+        <*> o .:? "registeredResources" .!= mempty
+        <*> o .:? "remainingResources" .!= mempty
+        <*> o .:? "status"
 
-instance ToQuery ContainerInstance where
-    toQuery ContainerInstance{..} = mconcat
-        [ "agentConnected"       =? _ciAgentConnected
-        , "containerInstanceArn" =? _ciContainerInstanceArn
-        , "ec2InstanceId"        =? _ciEc2InstanceId
-        , "registeredResources"  =? _ciRegisteredResources
-        , "remainingResources"   =? _ciRemainingResources
-        , "status"               =? _ciStatus
+instance ToJSON ContainerInstance where
+    toJSON ContainerInstance{..} = object
+        [ "containerInstanceArn" .= _ciContainerInstanceArn
+        , "ec2InstanceId"        .= _ciEc2InstanceId
+        , "remainingResources"   .= _ciRemainingResources
+        , "registeredResources"  .= _ciRegisteredResources
+        , "status"               .= _ciStatus
+        , "agentConnected"       .= _ciAgentConnected
+        ]
+
+data MountPoint = MountPoint
+    { _mpContainerPath :: Maybe Text
+    , _mpReadOnly      :: Maybe Bool
+    , _mpSourceVolume  :: Maybe Text
+    } deriving (Eq, Ord, Read, Show)
+
+-- | 'MountPoint' constructor.
+--
+-- The fields accessible through corresponding lenses are:
+--
+-- * 'mpContainerPath' @::@ 'Maybe' 'Text'
+--
+-- * 'mpReadOnly' @::@ 'Maybe' 'Bool'
+--
+-- * 'mpSourceVolume' @::@ 'Maybe' 'Text'
+--
+mountPoint :: MountPoint
+mountPoint = MountPoint
+    { _mpSourceVolume  = Nothing
+    , _mpContainerPath = Nothing
+    , _mpReadOnly      = Nothing
+    }
+
+-- | The path on the container to mount the host volume at.
+mpContainerPath :: Lens' MountPoint (Maybe Text)
+mpContainerPath = lens _mpContainerPath (\s a -> s { _mpContainerPath = a })
+
+-- | If this value is 'true', the container has read-only access to the volume. If
+-- this value is 'false', then the container can write to the volume. The default
+-- value is 'false'.
+mpReadOnly :: Lens' MountPoint (Maybe Bool)
+mpReadOnly = lens _mpReadOnly (\s a -> s { _mpReadOnly = a })
+
+-- | The name of the volume to mount.
+mpSourceVolume :: Lens' MountPoint (Maybe Text)
+mpSourceVolume = lens _mpSourceVolume (\s a -> s { _mpSourceVolume = a })
+
+instance FromJSON MountPoint where
+    parseJSON = withObject "MountPoint" $ \o -> MountPoint
+        <$> o .:? "containerPath"
+        <*> o .:? "readOnly"
+        <*> o .:? "sourceVolume"
+
+instance ToJSON MountPoint where
+    toJSON MountPoint{..} = object
+        [ "sourceVolume"  .= _mpSourceVolume
+        , "containerPath" .= _mpContainerPath
+        , "readOnly"      .= _mpReadOnly
         ]
