diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@
 
 ## Version
 
-`1.1.0`
+`1.2.0`
 
 
 ## Description
diff --git a/amazonka-dynamodb.cabal b/amazonka-dynamodb.cabal
--- a/amazonka-dynamodb.cabal
+++ b/amazonka-dynamodb.cabal
@@ -1,5 +1,5 @@
 name:                  amazonka-dynamodb
-version:               1.1.0
+version:               1.2.0
 synopsis:              Amazon DynamoDB SDK.
 homepage:              https://github.com/brendanhay/amazonka
 license:               OtherLicense
@@ -176,7 +176,7 @@
         , Network.AWS.DynamoDB.Types.Sum
 
     build-depends:
-          amazonka-core == 1.1.0.*
+          amazonka-core == 1.2.0.*
         , base          >= 4.7     && < 5
 
 test-suite amazonka-dynamodb-test
@@ -195,9 +195,9 @@
         , Test.AWS.DynamoDB.Internal
 
     build-depends:
-          amazonka-core == 1.1.0
-        , amazonka-test == 1.1.0
-        , amazonka-dynamodb == 1.1.0
+          amazonka-core == 1.2.0
+        , amazonka-test == 1.2.0
+        , amazonka-dynamodb == 1.2.0
         , base
         , bytestring
         , lens
diff --git a/gen/Network/AWS/DynamoDB.hs b/gen/Network/AWS/DynamoDB.hs
--- a/gen/Network/AWS/DynamoDB.hs
+++ b/gen/Network/AWS/DynamoDB.hs
@@ -130,8 +130,8 @@
 -- /See:/ <http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/Welcome.html AWS API Reference>
 module Network.AWS.DynamoDB
     (
-    -- * Service
-      DynamoDB
+    -- * Service Configuration
+      dynamoDB
 
     -- * Errors
     -- $errors
diff --git a/gen/Network/AWS/DynamoDB/BatchGetItem.hs b/gen/Network/AWS/DynamoDB/BatchGetItem.hs
--- a/gen/Network/AWS/DynamoDB/BatchGetItem.hs
+++ b/gen/Network/AWS/DynamoDB/BatchGetItem.hs
@@ -224,9 +224,8 @@
 bgiRequestItems = lens _bgiRequestItems (\ s a -> s{_bgiRequestItems = a}) . _Map;
 
 instance AWSRequest BatchGetItem where
-        type Sv BatchGetItem = DynamoDB
         type Rs BatchGetItem = BatchGetItemResponse
-        request = postJSON
+        request = postJSON dynamoDB
         response
           = receiveJSON
               (\ s h x ->
@@ -248,9 +247,10 @@
 instance ToJSON BatchGetItem where
         toJSON BatchGetItem'{..}
           = object
-              ["ReturnConsumedCapacity" .=
-                 _bgiReturnConsumedCapacity,
-               "RequestItems" .= _bgiRequestItems]
+              (catMaybes
+                 [("ReturnConsumedCapacity" .=) <$>
+                    _bgiReturnConsumedCapacity,
+                  Just ("RequestItems" .= _bgiRequestItems)])
 
 instance ToPath BatchGetItem where
         toPath = const "/"
diff --git a/gen/Network/AWS/DynamoDB/BatchWriteItem.hs b/gen/Network/AWS/DynamoDB/BatchWriteItem.hs
--- a/gen/Network/AWS/DynamoDB/BatchWriteItem.hs
+++ b/gen/Network/AWS/DynamoDB/BatchWriteItem.hs
@@ -194,9 +194,8 @@
 bwiRequestItems = lens _bwiRequestItems (\ s a -> s{_bwiRequestItems = a}) . _Map;
 
 instance AWSRequest BatchWriteItem where
-        type Sv BatchWriteItem = DynamoDB
         type Rs BatchWriteItem = BatchWriteItemResponse
-        request = postJSON
+        request = postJSON dynamoDB
         response
           = receiveJSON
               (\ s h x ->
@@ -218,11 +217,12 @@
 instance ToJSON BatchWriteItem where
         toJSON BatchWriteItem'{..}
           = object
-              ["ReturnConsumedCapacity" .=
-                 _bwiReturnConsumedCapacity,
-               "ReturnItemCollectionMetrics" .=
-                 _bwiReturnItemCollectionMetrics,
-               "RequestItems" .= _bwiRequestItems]
+              (catMaybes
+                 [("ReturnConsumedCapacity" .=) <$>
+                    _bwiReturnConsumedCapacity,
+                  ("ReturnItemCollectionMetrics" .=) <$>
+                    _bwiReturnItemCollectionMetrics,
+                  Just ("RequestItems" .= _bwiRequestItems)])
 
 instance ToPath BatchWriteItem where
         toPath = const "/"
diff --git a/gen/Network/AWS/DynamoDB/CreateTable.hs b/gen/Network/AWS/DynamoDB/CreateTable.hs
--- a/gen/Network/AWS/DynamoDB/CreateTable.hs
+++ b/gen/Network/AWS/DynamoDB/CreateTable.hs
@@ -260,9 +260,8 @@
 ctProvisionedThroughput = lens _ctProvisionedThroughput (\ s a -> s{_ctProvisionedThroughput = a});
 
 instance AWSRequest CreateTable where
-        type Sv CreateTable = DynamoDB
         type Rs CreateTable = CreateTableResponse
-        request = postJSON
+        request = postJSON dynamoDB
         response
           = receiveJSON
               (\ s h x ->
@@ -281,14 +280,20 @@
 instance ToJSON CreateTable where
         toJSON CreateTable'{..}
           = object
-              ["GlobalSecondaryIndexes" .=
-                 _ctGlobalSecondaryIndexes,
-               "LocalSecondaryIndexes" .= _ctLocalSecondaryIndexes,
-               "StreamSpecification" .= _ctStreamSpecification,
-               "AttributeDefinitions" .= _ctAttributeDefinitions,
-               "TableName" .= _ctTableName,
-               "KeySchema" .= _ctKeySchema,
-               "ProvisionedThroughput" .= _ctProvisionedThroughput]
+              (catMaybes
+                 [("GlobalSecondaryIndexes" .=) <$>
+                    _ctGlobalSecondaryIndexes,
+                  ("LocalSecondaryIndexes" .=) <$>
+                    _ctLocalSecondaryIndexes,
+                  ("StreamSpecification" .=) <$>
+                    _ctStreamSpecification,
+                  Just
+                    ("AttributeDefinitions" .= _ctAttributeDefinitions),
+                  Just ("TableName" .= _ctTableName),
+                  Just ("KeySchema" .= _ctKeySchema),
+                  Just
+                    ("ProvisionedThroughput" .=
+                       _ctProvisionedThroughput)])
 
 instance ToPath CreateTable where
         toPath = const "/"
diff --git a/gen/Network/AWS/DynamoDB/DeleteItem.hs b/gen/Network/AWS/DynamoDB/DeleteItem.hs
--- a/gen/Network/AWS/DynamoDB/DeleteItem.hs
+++ b/gen/Network/AWS/DynamoDB/DeleteItem.hs
@@ -495,9 +495,8 @@
 diKey = lens _diKey (\ s a -> s{_diKey = a}) . _Map;
 
 instance AWSRequest DeleteItem where
-        type Sv DeleteItem = DynamoDB
         type Rs DeleteItem = DeleteItemResponse
-        request = postJSON
+        request = postJSON dynamoDB
         response
           = receiveJSON
               (\ s h x ->
@@ -519,19 +518,23 @@
 instance ToJSON DeleteItem where
         toJSON DeleteItem'{..}
           = object
-              ["ReturnValues" .= _diReturnValues,
-               "ExpressionAttributeNames" .=
-                 _diExpressionAttributeNames,
-               "ReturnConsumedCapacity" .=
-                 _diReturnConsumedCapacity,
-               "ExpressionAttributeValues" .=
-                 _diExpressionAttributeValues,
-               "ReturnItemCollectionMetrics" .=
-                 _diReturnItemCollectionMetrics,
-               "ConditionExpression" .= _diConditionExpression,
-               "ConditionalOperator" .= _diConditionalOperator,
-               "Expected" .= _diExpected,
-               "TableName" .= _diTableName, "Key" .= _diKey]
+              (catMaybes
+                 [("ReturnValues" .=) <$> _diReturnValues,
+                  ("ExpressionAttributeNames" .=) <$>
+                    _diExpressionAttributeNames,
+                  ("ReturnConsumedCapacity" .=) <$>
+                    _diReturnConsumedCapacity,
+                  ("ExpressionAttributeValues" .=) <$>
+                    _diExpressionAttributeValues,
+                  ("ReturnItemCollectionMetrics" .=) <$>
+                    _diReturnItemCollectionMetrics,
+                  ("ConditionExpression" .=) <$>
+                    _diConditionExpression,
+                  ("ConditionalOperator" .=) <$>
+                    _diConditionalOperator,
+                  ("Expected" .=) <$> _diExpected,
+                  Just ("TableName" .= _diTableName),
+                  Just ("Key" .= _diKey)])
 
 instance ToPath DeleteItem where
         toPath = const "/"
diff --git a/gen/Network/AWS/DynamoDB/DeleteTable.hs b/gen/Network/AWS/DynamoDB/DeleteTable.hs
--- a/gen/Network/AWS/DynamoDB/DeleteTable.hs
+++ b/gen/Network/AWS/DynamoDB/DeleteTable.hs
@@ -87,9 +87,8 @@
 dtTableName = lens _dtTableName (\ s a -> s{_dtTableName = a});
 
 instance AWSRequest DeleteTable where
-        type Sv DeleteTable = DynamoDB
         type Rs DeleteTable = DeleteTableResponse
-        request = postJSON
+        request = postJSON dynamoDB
         response
           = receiveJSON
               (\ s h x ->
@@ -107,7 +106,8 @@
 
 instance ToJSON DeleteTable where
         toJSON DeleteTable'{..}
-          = object ["TableName" .= _dtTableName]
+          = object
+              (catMaybes [Just ("TableName" .= _dtTableName)])
 
 instance ToPath DeleteTable where
         toPath = const "/"
diff --git a/gen/Network/AWS/DynamoDB/DescribeTable.hs b/gen/Network/AWS/DynamoDB/DescribeTable.hs
--- a/gen/Network/AWS/DynamoDB/DescribeTable.hs
+++ b/gen/Network/AWS/DynamoDB/DescribeTable.hs
@@ -76,9 +76,8 @@
 dTableName = lens _dTableName (\ s a -> s{_dTableName = a});
 
 instance AWSRequest DescribeTable where
-        type Sv DescribeTable = DynamoDB
         type Rs DescribeTable = DescribeTableResponse
-        request = postJSON
+        request = postJSON dynamoDB
         response
           = receiveJSON
               (\ s h x ->
@@ -96,7 +95,8 @@
 
 instance ToJSON DescribeTable where
         toJSON DescribeTable'{..}
-          = object ["TableName" .= _dTableName]
+          = object
+              (catMaybes [Just ("TableName" .= _dTableName)])
 
 instance ToPath DescribeTable where
         toPath = const "/"
diff --git a/gen/Network/AWS/DynamoDB/GetItem.hs b/gen/Network/AWS/DynamoDB/GetItem.hs
--- a/gen/Network/AWS/DynamoDB/GetItem.hs
+++ b/gen/Network/AWS/DynamoDB/GetItem.hs
@@ -200,9 +200,8 @@
 giKey = lens _giKey (\ s a -> s{_giKey = a}) . _Map;
 
 instance AWSRequest GetItem where
-        type Sv GetItem = DynamoDB
         type Rs GetItem = GetItemResponse
-        request = postJSON
+        request = postJSON dynamoDB
         response
           = receiveJSON
               (\ s h x ->
@@ -223,14 +222,17 @@
 instance ToJSON GetItem where
         toJSON GetItem'{..}
           = object
-              ["ProjectionExpression" .= _giProjectionExpression,
-               "ConsistentRead" .= _giConsistentRead,
-               "ExpressionAttributeNames" .=
-                 _giExpressionAttributeNames,
-               "AttributesToGet" .= _giAttributesToGet,
-               "ReturnConsumedCapacity" .=
-                 _giReturnConsumedCapacity,
-               "TableName" .= _giTableName, "Key" .= _giKey]
+              (catMaybes
+                 [("ProjectionExpression" .=) <$>
+                    _giProjectionExpression,
+                  ("ConsistentRead" .=) <$> _giConsistentRead,
+                  ("ExpressionAttributeNames" .=) <$>
+                    _giExpressionAttributeNames,
+                  ("AttributesToGet" .=) <$> _giAttributesToGet,
+                  ("ReturnConsumedCapacity" .=) <$>
+                    _giReturnConsumedCapacity,
+                  Just ("TableName" .= _giTableName),
+                  Just ("Key" .= _giKey)])
 
 instance ToPath GetItem where
         toPath = const "/"
diff --git a/gen/Network/AWS/DynamoDB/ListTables.hs b/gen/Network/AWS/DynamoDB/ListTables.hs
--- a/gen/Network/AWS/DynamoDB/ListTables.hs
+++ b/gen/Network/AWS/DynamoDB/ListTables.hs
@@ -94,9 +94,8 @@
                 rs ^. ltrsLastEvaluatedTableName
 
 instance AWSRequest ListTables where
-        type Sv ListTables = DynamoDB
         type Rs ListTables = ListTablesResponse
-        request = postJSON
+        request = postJSON dynamoDB
         response
           = receiveJSON
               (\ s h x ->
@@ -117,9 +116,10 @@
 instance ToJSON ListTables where
         toJSON ListTables'{..}
           = object
-              ["ExclusiveStartTableName" .=
-                 _ltExclusiveStartTableName,
-               "Limit" .= _ltLimit]
+              (catMaybes
+                 [("ExclusiveStartTableName" .=) <$>
+                    _ltExclusiveStartTableName,
+                  ("Limit" .=) <$> _ltLimit])
 
 instance ToPath ListTables where
         toPath = const "/"
diff --git a/gen/Network/AWS/DynamoDB/PutItem.hs b/gen/Network/AWS/DynamoDB/PutItem.hs
--- a/gen/Network/AWS/DynamoDB/PutItem.hs
+++ b/gen/Network/AWS/DynamoDB/PutItem.hs
@@ -521,9 +521,8 @@
 piItem = lens _piItem (\ s a -> s{_piItem = a}) . _Map;
 
 instance AWSRequest PutItem where
-        type Sv PutItem = DynamoDB
         type Rs PutItem = PutItemResponse
-        request = postJSON
+        request = postJSON dynamoDB
         response
           = receiveJSON
               (\ s h x ->
@@ -545,19 +544,23 @@
 instance ToJSON PutItem where
         toJSON PutItem'{..}
           = object
-              ["ReturnValues" .= _piReturnValues,
-               "ExpressionAttributeNames" .=
-                 _piExpressionAttributeNames,
-               "ReturnConsumedCapacity" .=
-                 _piReturnConsumedCapacity,
-               "ExpressionAttributeValues" .=
-                 _piExpressionAttributeValues,
-               "ReturnItemCollectionMetrics" .=
-                 _piReturnItemCollectionMetrics,
-               "ConditionExpression" .= _piConditionExpression,
-               "ConditionalOperator" .= _piConditionalOperator,
-               "Expected" .= _piExpected,
-               "TableName" .= _piTableName, "Item" .= _piItem]
+              (catMaybes
+                 [("ReturnValues" .=) <$> _piReturnValues,
+                  ("ExpressionAttributeNames" .=) <$>
+                    _piExpressionAttributeNames,
+                  ("ReturnConsumedCapacity" .=) <$>
+                    _piReturnConsumedCapacity,
+                  ("ExpressionAttributeValues" .=) <$>
+                    _piExpressionAttributeValues,
+                  ("ReturnItemCollectionMetrics" .=) <$>
+                    _piReturnItemCollectionMetrics,
+                  ("ConditionExpression" .=) <$>
+                    _piConditionExpression,
+                  ("ConditionalOperator" .=) <$>
+                    _piConditionalOperator,
+                  ("Expected" .=) <$> _piExpected,
+                  Just ("TableName" .= _piTableName),
+                  Just ("Item" .= _piItem)])
 
 instance ToPath PutItem where
         toPath = const "/"
diff --git a/gen/Network/AWS/DynamoDB/Query.hs b/gen/Network/AWS/DynamoDB/Query.hs
--- a/gen/Network/AWS/DynamoDB/Query.hs
+++ b/gen/Network/AWS/DynamoDB/Query.hs
@@ -707,9 +707,8 @@
               qExclusiveStartKey .~ rs ^. qrsLastEvaluatedKey
 
 instance AWSRequest Query where
-        type Sv Query = DynamoDB
         type Rs Query = QueryResponse
-        request = postJSON
+        request = postJSON dynamoDB
         response
           = receiveJSON
               (\ s h x ->
@@ -733,24 +732,28 @@
 instance ToJSON Query where
         toJSON Query'{..}
           = object
-              ["ProjectionExpression" .= _qProjectionExpression,
-               "KeyConditions" .= _qKeyConditions,
-               "FilterExpression" .= _qFilterExpression,
-               "QueryFilter" .= _qQueryFilter,
-               "ConsistentRead" .= _qConsistentRead,
-               "ExpressionAttributeNames" .=
-                 _qExpressionAttributeNames,
-               "AttributesToGet" .= _qAttributesToGet,
-               "ReturnConsumedCapacity" .= _qReturnConsumedCapacity,
-               "ExpressionAttributeValues" .=
-                 _qExpressionAttributeValues,
-               "ScanIndexForward" .= _qScanIndexForward,
-               "Limit" .= _qLimit, "Select" .= _qSelect,
-               "ConditionalOperator" .= _qConditionalOperator,
-               "KeyConditionExpression" .= _qKeyConditionExpression,
-               "ExclusiveStartKey" .= _qExclusiveStartKey,
-               "IndexName" .= _qIndexName,
-               "TableName" .= _qTableName]
+              (catMaybes
+                 [("ProjectionExpression" .=) <$>
+                    _qProjectionExpression,
+                  ("KeyConditions" .=) <$> _qKeyConditions,
+                  ("FilterExpression" .=) <$> _qFilterExpression,
+                  ("QueryFilter" .=) <$> _qQueryFilter,
+                  ("ConsistentRead" .=) <$> _qConsistentRead,
+                  ("ExpressionAttributeNames" .=) <$>
+                    _qExpressionAttributeNames,
+                  ("AttributesToGet" .=) <$> _qAttributesToGet,
+                  ("ReturnConsumedCapacity" .=) <$>
+                    _qReturnConsumedCapacity,
+                  ("ExpressionAttributeValues" .=) <$>
+                    _qExpressionAttributeValues,
+                  ("ScanIndexForward" .=) <$> _qScanIndexForward,
+                  ("Limit" .=) <$> _qLimit, ("Select" .=) <$> _qSelect,
+                  ("ConditionalOperator" .=) <$> _qConditionalOperator,
+                  ("KeyConditionExpression" .=) <$>
+                    _qKeyConditionExpression,
+                  ("ExclusiveStartKey" .=) <$> _qExclusiveStartKey,
+                  ("IndexName" .=) <$> _qIndexName,
+                  Just ("TableName" .= _qTableName)])
 
 instance ToPath Query where
         toPath = const "/"
diff --git a/gen/Network/AWS/DynamoDB/Scan.hs b/gen/Network/AWS/DynamoDB/Scan.hs
--- a/gen/Network/AWS/DynamoDB/Scan.hs
+++ b/gen/Network/AWS/DynamoDB/Scan.hs
@@ -479,9 +479,8 @@
               sExclusiveStartKey .~ rs ^. srsLastEvaluatedKey
 
 instance AWSRequest Scan where
-        type Sv Scan = DynamoDB
         type Rs Scan = ScanResponse
-        request = postJSON
+        request = postJSON dynamoDB
         response
           = receiveJSON
               (\ s h x ->
@@ -505,23 +504,26 @@
 instance ToJSON Scan where
         toJSON Scan'{..}
           = object
-              ["ProjectionExpression" .= _sProjectionExpression,
-               "ScanFilter" .= _sScanFilter,
-               "TotalSegments" .= _sTotalSegments,
-               "FilterExpression" .= _sFilterExpression,
-               "ConsistentRead" .= _sConsistentRead,
-               "ExpressionAttributeNames" .=
-                 _sExpressionAttributeNames,
-               "AttributesToGet" .= _sAttributesToGet,
-               "ReturnConsumedCapacity" .= _sReturnConsumedCapacity,
-               "ExpressionAttributeValues" .=
-                 _sExpressionAttributeValues,
-               "Limit" .= _sLimit, "Select" .= _sSelect,
-               "Segment" .= _sSegment,
-               "ConditionalOperator" .= _sConditionalOperator,
-               "ExclusiveStartKey" .= _sExclusiveStartKey,
-               "IndexName" .= _sIndexName,
-               "TableName" .= _sTableName]
+              (catMaybes
+                 [("ProjectionExpression" .=) <$>
+                    _sProjectionExpression,
+                  ("ScanFilter" .=) <$> _sScanFilter,
+                  ("TotalSegments" .=) <$> _sTotalSegments,
+                  ("FilterExpression" .=) <$> _sFilterExpression,
+                  ("ConsistentRead" .=) <$> _sConsistentRead,
+                  ("ExpressionAttributeNames" .=) <$>
+                    _sExpressionAttributeNames,
+                  ("AttributesToGet" .=) <$> _sAttributesToGet,
+                  ("ReturnConsumedCapacity" .=) <$>
+                    _sReturnConsumedCapacity,
+                  ("ExpressionAttributeValues" .=) <$>
+                    _sExpressionAttributeValues,
+                  ("Limit" .=) <$> _sLimit, ("Select" .=) <$> _sSelect,
+                  ("Segment" .=) <$> _sSegment,
+                  ("ConditionalOperator" .=) <$> _sConditionalOperator,
+                  ("ExclusiveStartKey" .=) <$> _sExclusiveStartKey,
+                  ("IndexName" .=) <$> _sIndexName,
+                  Just ("TableName" .= _sTableName)])
 
 instance ToPath Scan where
         toPath = const "/"
diff --git a/gen/Network/AWS/DynamoDB/Types.hs b/gen/Network/AWS/DynamoDB/Types.hs
--- a/gen/Network/AWS/DynamoDB/Types.hs
+++ b/gen/Network/AWS/DynamoDB/Types.hs
@@ -1,5 +1,4 @@
 {-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TypeFamilies      #-}
 
 -- Derived from AWS service descriptions, licensed under Apache 2.0.
 
@@ -13,8 +12,8 @@
 --
 module Network.AWS.DynamoDB.Types
     (
-    -- * Service
-      DynamoDB
+    -- * Service Configuration
+      dynamoDB
 
     -- * Errors
     , _ProvisionedThroughputExceededException
@@ -270,44 +269,40 @@
 import           Network.AWS.Prelude
 import           Network.AWS.Sign.V4
 
--- | Version @2012-08-10@ of the Amazon DynamoDB SDK.
-data DynamoDB
-
-instance AWSService DynamoDB where
-    type Sg DynamoDB = V4
-    service = const svc
-      where
-        svc =
-            Service
-            { _svcAbbrev = "DynamoDB"
-            , _svcPrefix = "dynamodb"
-            , _svcVersion = "2012-08-10"
-            , _svcEndpoint = defaultEndpoint svc
-            , _svcTimeout = Just 70
-            , _svcStatus = statusSuccess
-            , _svcError = parseJSONError
-            , _svcRetry = retry
-            }
-        retry =
-            Exponential
-            { _retryBase = 5.0e-2
-            , _retryGrowth = 2
-            , _retryAttempts = 5
-            , _retryCheck = check
-            }
-        check e
-          | has (hasCode "ThrottlingException" . hasStatus 400) e =
-              Just "throttling_exception"
-          | has (hasCode "Throttling" . hasStatus 400) e = Just "throttling"
-          | has
-               (hasCode "ProvisionedThroughputExceededException" .
-                hasStatus 400)
-               e =
-              Just "throughput_exceeded"
-          | has (hasStatus 503) e = Just "service_unavailable"
-          | has (hasStatus 500) e = Just "general_server_error"
-          | has (hasStatus 509) e = Just "limit_exceeded"
-          | otherwise = Nothing
+-- | API version '2012-08-10' of the Amazon DynamoDB SDK configuration.
+dynamoDB :: Service
+dynamoDB =
+    Service
+    { _svcAbbrev = "DynamoDB"
+    , _svcSigner = v4
+    , _svcPrefix = "dynamodb"
+    , _svcVersion = "2012-08-10"
+    , _svcEndpoint = defaultEndpoint dynamoDB
+    , _svcTimeout = Just 70
+    , _svcCheck = statusSuccess
+    , _svcError = parseJSONError
+    , _svcRetry = retry
+    }
+  where
+    retry =
+        Exponential
+        { _retryBase = 5.0e-2
+        , _retryGrowth = 2
+        , _retryAttempts = 5
+        , _retryCheck = check
+        }
+    check e
+      | has (hasCode "ThrottlingException" . hasStatus 400) e =
+          Just "throttling_exception"
+      | has (hasCode "Throttling" . hasStatus 400) e = Just "throttling"
+      | has
+           (hasCode "ProvisionedThroughputExceededException" . hasStatus 400)
+           e =
+          Just "throughput_exceeded"
+      | has (hasStatus 503) e = Just "service_unavailable"
+      | has (hasStatus 500) e = Just "general_server_error"
+      | has (hasStatus 509) e = Just "limit_exceeded"
+      | otherwise = Nothing
 
 -- | Your request rate is too high. The AWS SDKs for DynamoDB automatically
 -- retry requests that receive this exception. Your request is eventually
diff --git a/gen/Network/AWS/DynamoDB/Types/Product.hs b/gen/Network/AWS/DynamoDB/Types/Product.hs
--- a/gen/Network/AWS/DynamoDB/Types/Product.hs
+++ b/gen/Network/AWS/DynamoDB/Types/Product.hs
@@ -2,7 +2,6 @@
 {-# LANGUAGE DeriveGeneric      #-}
 {-# LANGUAGE OverloadedStrings  #-}
 {-# LANGUAGE RecordWildCards    #-}
-{-# LANGUAGE TypeFamilies       #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
 
@@ -65,8 +64,9 @@
 instance ToJSON AttributeDefinition where
         toJSON AttributeDefinition'{..}
           = object
-              ["AttributeName" .= _adAttributeName,
-               "AttributeType" .= _adAttributeType]
+              (catMaybes
+                 [Just ("AttributeName" .= _adAttributeName),
+                  Just ("AttributeType" .= _adAttributeType)])
 
 -- | Represents the data for an attribute. You can set one, and only one, of
 -- the elements.
@@ -194,10 +194,12 @@
 instance ToJSON AttributeValue where
         toJSON AttributeValue'{..}
           = object
-              ["L" .= _avL, "M" .= _avM, "NS" .= _avNS,
-               "NULL" .= _avNULL, "N" .= _avN, "BS" .= _avBS,
-               "B" .= _avB, "SS" .= _avSS, "S" .= _avS,
-               "BOOL" .= _avBOOL]
+              (catMaybes
+                 [("L" .=) <$> _avL, ("M" .=) <$> _avM,
+                  ("NS" .=) <$> _avNS, ("NULL" .=) <$> _avNULL,
+                  ("N" .=) <$> _avN, ("BS" .=) <$> _avBS,
+                  ("B" .=) <$> _avB, ("SS" .=) <$> _avSS,
+                  ("S" .=) <$> _avS, ("BOOL" .=) <$> _avBOOL])
 
 -- | For the /UpdateItem/ operation, represents the attributes to be
 -- modified, the action to perform on each, and the new value for each.
@@ -314,7 +316,9 @@
 instance ToJSON AttributeValueUpdate where
         toJSON AttributeValueUpdate'{..}
           = object
-              ["Value" .= _avuValue, "Action" .= _avuAction]
+              (catMaybes
+                 [("Value" .=) <$> _avuValue,
+                  ("Action" .=) <$> _avuAction])
 
 -- | Represents the amount of provisioned throughput capacity consumed on a
 -- table or an index.
@@ -556,8 +560,9 @@
 instance ToJSON Condition where
         toJSON Condition'{..}
           = object
-              ["AttributeValueList" .= _cAttributeValueList,
-               "ComparisonOperator" .= _cComparisonOperator]
+              (catMaybes
+                 [("AttributeValueList" .=) <$> _cAttributeValueList,
+                  Just ("ComparisonOperator" .= _cComparisonOperator)])
 
 -- | The capacity units consumed by an operation. The data returned includes
 -- the total provisioned throughput consumed, along with statistics for the
@@ -689,11 +694,13 @@
          where
         toJSON CreateGlobalSecondaryIndexAction'{..}
           = object
-              ["IndexName" .= _cgsiaIndexName,
-               "KeySchema" .= _cgsiaKeySchema,
-               "Projection" .= _cgsiaProjection,
-               "ProvisionedThroughput" .=
-                 _cgsiaProvisionedThroughput]
+              (catMaybes
+                 [Just ("IndexName" .= _cgsiaIndexName),
+                  Just ("KeySchema" .= _cgsiaKeySchema),
+                  Just ("Projection" .= _cgsiaProjection),
+                  Just
+                    ("ProvisionedThroughput" .=
+                       _cgsiaProvisionedThroughput)])
 
 -- | Represents a global secondary index to be deleted from an existing
 -- table.
@@ -723,7 +730,8 @@
 instance ToJSON DeleteGlobalSecondaryIndexAction
          where
         toJSON DeleteGlobalSecondaryIndexAction'{..}
-          = object ["IndexName" .= _dgsiaIndexName]
+          = object
+              (catMaybes [Just ("IndexName" .= _dgsiaIndexName)])
 
 -- | Represents a request to perform a /DeleteItem/ operation on an item.
 --
@@ -757,7 +765,8 @@
               (\ x -> DeleteRequest' <$> (x .:? "Key" .!= mempty))
 
 instance ToJSON DeleteRequest where
-        toJSON DeleteRequest'{..} = object ["Key" .= _drKey]
+        toJSON DeleteRequest'{..}
+          = object (catMaybes [Just ("Key" .= _drKey)])
 
 -- | Represents a condition to be compared with an attribute value. This
 -- condition can be used with /DeleteItem/, /PutItem/ or /UpdateItem/
@@ -1019,9 +1028,13 @@
 instance ToJSON ExpectedAttributeValue where
         toJSON ExpectedAttributeValue'{..}
           = object
-              ["AttributeValueList" .= _eavAttributeValueList,
-               "Exists" .= _eavExists, "Value" .= _eavValue,
-               "ComparisonOperator" .= _eavComparisonOperator]
+              (catMaybes
+                 [("AttributeValueList" .=) <$>
+                    _eavAttributeValueList,
+                  ("Exists" .=) <$> _eavExists,
+                  ("Value" .=) <$> _eavValue,
+                  ("ComparisonOperator" .=) <$>
+                    _eavComparisonOperator])
 
 -- | Represents the properties of a global secondary index.
 --
@@ -1079,10 +1092,13 @@
 instance ToJSON GlobalSecondaryIndex where
         toJSON GlobalSecondaryIndex'{..}
           = object
-              ["IndexName" .= _gsiIndexName,
-               "KeySchema" .= _gsiKeySchema,
-               "Projection" .= _gsiProjection,
-               "ProvisionedThroughput" .= _gsiProvisionedThroughput]
+              (catMaybes
+                 [Just ("IndexName" .= _gsiIndexName),
+                  Just ("KeySchema" .= _gsiKeySchema),
+                  Just ("Projection" .= _gsiProjection),
+                  Just
+                    ("ProvisionedThroughput" .=
+                       _gsiProvisionedThroughput)])
 
 -- | Represents the properties of a global secondary index.
 --
@@ -1273,8 +1289,10 @@
 instance ToJSON GlobalSecondaryIndexUpdate where
         toJSON GlobalSecondaryIndexUpdate'{..}
           = object
-              ["Create" .= _gsiuCreate, "Delete" .= _gsiuDelete,
-               "Update" .= _gsiuUpdate]
+              (catMaybes
+                 [("Create" .=) <$> _gsiuCreate,
+                  ("Delete" .=) <$> _gsiuDelete,
+                  ("Update" .=) <$> _gsiuUpdate])
 
 -- | Information about item collections, if any, that were affected by the
 -- operation. /ItemCollectionMetrics/ is only returned if the request asked
@@ -1379,8 +1397,9 @@
 instance ToJSON KeySchemaElement where
         toJSON KeySchemaElement'{..}
           = object
-              ["AttributeName" .= _kseAttributeName,
-               "KeyType" .= _kseKeyType]
+              (catMaybes
+                 [Just ("AttributeName" .= _kseAttributeName),
+                  Just ("KeyType" .= _kseKeyType)])
 
 -- | Represents a set of primary keys and, for each key, the attributes to
 -- retrieve from the table.
@@ -1513,12 +1532,14 @@
 instance ToJSON KeysAndAttributes where
         toJSON KeysAndAttributes'{..}
           = object
-              ["ProjectionExpression" .= _kaaProjectionExpression,
-               "ConsistentRead" .= _kaaConsistentRead,
-               "ExpressionAttributeNames" .=
-                 _kaaExpressionAttributeNames,
-               "AttributesToGet" .= _kaaAttributesToGet,
-               "Keys" .= _kaaKeys]
+              (catMaybes
+                 [("ProjectionExpression" .=) <$>
+                    _kaaProjectionExpression,
+                  ("ConsistentRead" .=) <$> _kaaConsistentRead,
+                  ("ExpressionAttributeNames" .=) <$>
+                    _kaaExpressionAttributeNames,
+                  ("AttributesToGet" .=) <$> _kaaAttributesToGet,
+                  Just ("Keys" .= _kaaKeys)])
 
 -- | Represents the properties of a local secondary index.
 --
@@ -1567,9 +1588,10 @@
 instance ToJSON LocalSecondaryIndex where
         toJSON LocalSecondaryIndex'{..}
           = object
-              ["IndexName" .= _lsiIndexName,
-               "KeySchema" .= _lsiKeySchema,
-               "Projection" .= _lsiProjection]
+              (catMaybes
+                 [Just ("IndexName" .= _lsiIndexName),
+                  Just ("KeySchema" .= _lsiKeySchema),
+                  Just ("Projection" .= _lsiProjection)])
 
 -- | Represents the properties of a local secondary index.
 --
@@ -1711,8 +1733,9 @@
 instance ToJSON Projection where
         toJSON Projection'{..}
           = object
-              ["ProjectionType" .= _pProjectionType,
-               "NonKeyAttributes" .= _pNonKeyAttributes]
+              (catMaybes
+                 [("ProjectionType" .=) <$> _pProjectionType,
+                  ("NonKeyAttributes" .=) <$> _pNonKeyAttributes])
 
 -- | Represents the provisioned throughput settings for a specified table or
 -- index. The settings can be modified using the /UpdateTable/ operation.
@@ -1762,8 +1785,10 @@
 instance ToJSON ProvisionedThroughput where
         toJSON ProvisionedThroughput'{..}
           = object
-              ["ReadCapacityUnits" .= _ptReadCapacityUnits,
-               "WriteCapacityUnits" .= _ptWriteCapacityUnits]
+              (catMaybes
+                 [Just ("ReadCapacityUnits" .= _ptReadCapacityUnits),
+                  Just
+                    ("WriteCapacityUnits" .= _ptWriteCapacityUnits)])
 
 -- | Represents the provisioned throughput settings for the table, consisting
 -- of read and write capacity units, along with data about increases and
@@ -1879,7 +1904,8 @@
               (\ x -> PutRequest' <$> (x .:? "Item" .!= mempty))
 
 instance ToJSON PutRequest where
-        toJSON PutRequest'{..} = object ["Item" .= _prItem]
+        toJSON PutRequest'{..}
+          = object (catMaybes [Just ("Item" .= _prItem)])
 
 -- | Represents the DynamoDB Streams configuration for a table in DynamoDB.
 --
@@ -1943,8 +1969,9 @@
 instance ToJSON StreamSpecification where
         toJSON StreamSpecification'{..}
           = object
-              ["StreamEnabled" .= _ssStreamEnabled,
-               "StreamViewType" .= _ssStreamViewType]
+              (catMaybes
+                 [("StreamEnabled" .=) <$> _ssStreamEnabled,
+                  ("StreamViewType" .=) <$> _ssStreamViewType])
 
 -- | Represents the properties of a table.
 --
@@ -2287,9 +2314,11 @@
          where
         toJSON UpdateGlobalSecondaryIndexAction'{..}
           = object
-              ["IndexName" .= _ugsiaIndexName,
-               "ProvisionedThroughput" .=
-                 _ugsiaProvisionedThroughput]
+              (catMaybes
+                 [Just ("IndexName" .= _ugsiaIndexName),
+                  Just
+                    ("ProvisionedThroughput" .=
+                       _ugsiaProvisionedThroughput)])
 
 -- | Represents an operation to perform - either /DeleteItem/ or /PutItem/.
 -- You can only request one of these operations, not both, in a single
@@ -2335,5 +2364,6 @@
 instance ToJSON WriteRequest where
         toJSON WriteRequest'{..}
           = object
-              ["PutRequest" .= _wrPutRequest,
-               "DeleteRequest" .= _wrDeleteRequest]
+              (catMaybes
+                 [("PutRequest" .=) <$> _wrPutRequest,
+                  ("DeleteRequest" .=) <$> _wrDeleteRequest])
diff --git a/gen/Network/AWS/DynamoDB/UpdateItem.hs b/gen/Network/AWS/DynamoDB/UpdateItem.hs
--- a/gen/Network/AWS/DynamoDB/UpdateItem.hs
+++ b/gen/Network/AWS/DynamoDB/UpdateItem.hs
@@ -698,9 +698,8 @@
 uiKey = lens _uiKey (\ s a -> s{_uiKey = a}) . _Map;
 
 instance AWSRequest UpdateItem where
-        type Sv UpdateItem = DynamoDB
         type Rs UpdateItem = UpdateItemResponse
-        request = postJSON
+        request = postJSON dynamoDB
         response
           = receiveJSON
               (\ s h x ->
@@ -722,21 +721,25 @@
 instance ToJSON UpdateItem where
         toJSON UpdateItem'{..}
           = object
-              ["ReturnValues" .= _uiReturnValues,
-               "ExpressionAttributeNames" .=
-                 _uiExpressionAttributeNames,
-               "UpdateExpression" .= _uiUpdateExpression,
-               "AttributeUpdates" .= _uiAttributeUpdates,
-               "ReturnConsumedCapacity" .=
-                 _uiReturnConsumedCapacity,
-               "ExpressionAttributeValues" .=
-                 _uiExpressionAttributeValues,
-               "ReturnItemCollectionMetrics" .=
-                 _uiReturnItemCollectionMetrics,
-               "ConditionExpression" .= _uiConditionExpression,
-               "ConditionalOperator" .= _uiConditionalOperator,
-               "Expected" .= _uiExpected,
-               "TableName" .= _uiTableName, "Key" .= _uiKey]
+              (catMaybes
+                 [("ReturnValues" .=) <$> _uiReturnValues,
+                  ("ExpressionAttributeNames" .=) <$>
+                    _uiExpressionAttributeNames,
+                  ("UpdateExpression" .=) <$> _uiUpdateExpression,
+                  ("AttributeUpdates" .=) <$> _uiAttributeUpdates,
+                  ("ReturnConsumedCapacity" .=) <$>
+                    _uiReturnConsumedCapacity,
+                  ("ExpressionAttributeValues" .=) <$>
+                    _uiExpressionAttributeValues,
+                  ("ReturnItemCollectionMetrics" .=) <$>
+                    _uiReturnItemCollectionMetrics,
+                  ("ConditionExpression" .=) <$>
+                    _uiConditionExpression,
+                  ("ConditionalOperator" .=) <$>
+                    _uiConditionalOperator,
+                  ("Expected" .=) <$> _uiExpected,
+                  Just ("TableName" .= _uiTableName),
+                  Just ("Key" .= _uiKey)])
 
 instance ToPath UpdateItem where
         toPath = const "/"
diff --git a/gen/Network/AWS/DynamoDB/UpdateTable.hs b/gen/Network/AWS/DynamoDB/UpdateTable.hs
--- a/gen/Network/AWS/DynamoDB/UpdateTable.hs
+++ b/gen/Network/AWS/DynamoDB/UpdateTable.hs
@@ -141,9 +141,8 @@
 utTableName = lens _utTableName (\ s a -> s{_utTableName = a});
 
 instance AWSRequest UpdateTable where
-        type Sv UpdateTable = DynamoDB
         type Rs UpdateTable = UpdateTableResponse
-        request = postJSON
+        request = postJSON dynamoDB
         response
           = receiveJSON
               (\ s h x ->
@@ -162,12 +161,16 @@
 instance ToJSON UpdateTable where
         toJSON UpdateTable'{..}
           = object
-              ["ProvisionedThroughput" .= _utProvisionedThroughput,
-               "AttributeDefinitions" .= _utAttributeDefinitions,
-               "GlobalSecondaryIndexUpdates" .=
-                 _utGlobalSecondaryIndexUpdates,
-               "StreamSpecification" .= _utStreamSpecification,
-               "TableName" .= _utTableName]
+              (catMaybes
+                 [("ProvisionedThroughput" .=) <$>
+                    _utProvisionedThroughput,
+                  ("AttributeDefinitions" .=) <$>
+                    _utAttributeDefinitions,
+                  ("GlobalSecondaryIndexUpdates" .=) <$>
+                    _utGlobalSecondaryIndexUpdates,
+                  ("StreamSpecification" .=) <$>
+                    _utStreamSpecification,
+                  Just ("TableName" .= _utTableName)])
 
 instance ToPath UpdateTable where
         toPath = const "/"
diff --git a/test/Test/AWS/Gen/DynamoDB.hs b/test/Test/AWS/Gen/DynamoDB.hs
--- a/test/Test/AWS/Gen/DynamoDB.hs
+++ b/test/Test/AWS/Gen/DynamoDB.hs
@@ -185,76 +185,89 @@
 testUpdateItemResponse = res
     "UpdateItemResponse"
     "fixture/UpdateItemResponse"
+    dynamoDB
     (Proxy :: Proxy UpdateItem)
 
 testDeleteItemResponse :: DeleteItemResponse -> TestTree
 testDeleteItemResponse = res
     "DeleteItemResponse"
     "fixture/DeleteItemResponse"
+    dynamoDB
     (Proxy :: Proxy DeleteItem)
 
 testPutItemResponse :: PutItemResponse -> TestTree
 testPutItemResponse = res
     "PutItemResponse"
     "fixture/PutItemResponse"
+    dynamoDB
     (Proxy :: Proxy PutItem)
 
 testDeleteTableResponse :: DeleteTableResponse -> TestTree
 testDeleteTableResponse = res
     "DeleteTableResponse"
     "fixture/DeleteTableResponse"
+    dynamoDB
     (Proxy :: Proxy DeleteTable)
 
 testUpdateTableResponse :: UpdateTableResponse -> TestTree
 testUpdateTableResponse = res
     "UpdateTableResponse"
     "fixture/UpdateTableResponse"
+    dynamoDB
     (Proxy :: Proxy UpdateTable)
 
 testBatchGetItemResponse :: BatchGetItemResponse -> TestTree
 testBatchGetItemResponse = res
     "BatchGetItemResponse"
     "fixture/BatchGetItemResponse"
+    dynamoDB
     (Proxy :: Proxy BatchGetItem)
 
 testDescribeTableResponse :: DescribeTableResponse -> TestTree
 testDescribeTableResponse = res
     "DescribeTableResponse"
     "fixture/DescribeTableResponse"
+    dynamoDB
     (Proxy :: Proxy DescribeTable)
 
 testGetItemResponse :: GetItemResponse -> TestTree
 testGetItemResponse = res
     "GetItemResponse"
     "fixture/GetItemResponse"
+    dynamoDB
     (Proxy :: Proxy GetItem)
 
 testBatchWriteItemResponse :: BatchWriteItemResponse -> TestTree
 testBatchWriteItemResponse = res
     "BatchWriteItemResponse"
     "fixture/BatchWriteItemResponse"
+    dynamoDB
     (Proxy :: Proxy BatchWriteItem)
 
 testScanResponse :: ScanResponse -> TestTree
 testScanResponse = res
     "ScanResponse"
     "fixture/ScanResponse"
+    dynamoDB
     (Proxy :: Proxy Scan)
 
 testListTablesResponse :: ListTablesResponse -> TestTree
 testListTablesResponse = res
     "ListTablesResponse"
     "fixture/ListTablesResponse"
+    dynamoDB
     (Proxy :: Proxy ListTables)
 
 testQueryResponse :: QueryResponse -> TestTree
 testQueryResponse = res
     "QueryResponse"
     "fixture/QueryResponse"
+    dynamoDB
     (Proxy :: Proxy Query)
 
 testCreateTableResponse :: CreateTableResponse -> TestTree
 testCreateTableResponse = res
     "CreateTableResponse"
     "fixture/CreateTableResponse"
+    dynamoDB
     (Proxy :: Proxy CreateTable)
