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:               0.0.7
+version:               0.0.8
 synopsis:              Amazon DynamoDB SDK.
 homepage:              https://github.com/brendanhay/amazonka
 license:               OtherLicense
@@ -53,9 +53,10 @@
         , Network.AWS.DynamoDB.Types
         , Network.AWS.DynamoDB.UpdateItem
         , Network.AWS.DynamoDB.UpdateTable
+        , Network.AWS.DynamoDB.Waiters
 
     other-modules:
 
     build-depends:
-          amazonka-core == 0.0.7.*
+          amazonka-core == 0.0.8.*
         , base          >= 4.7     && < 5
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
@@ -32,6 +32,7 @@
     , module Network.AWS.DynamoDB.Types
     , module Network.AWS.DynamoDB.UpdateItem
     , module Network.AWS.DynamoDB.UpdateTable
+    , module Network.AWS.DynamoDB.Waiters
     ) where
 
 import Network.AWS.DynamoDB.BatchGetItem
@@ -48,3 +49,4 @@
 import Network.AWS.DynamoDB.Types
 import Network.AWS.DynamoDB.UpdateItem
 import Network.AWS.DynamoDB.UpdateTable
+import Network.AWS.DynamoDB.Waiters
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
@@ -70,21 +70,22 @@
 dt1TableName = lens _dt1TableName (\s a -> s { _dt1TableName = a })
 
 newtype DescribeTableResponse = DescribeTableResponse
-    { _dtrTable :: Maybe TableDescription
+    { _dtrTable :: TableDescription
     } deriving (Eq, Show)
 
 -- | 'DescribeTableResponse' constructor.
 --
 -- The fields accessible through corresponding lenses are:
 --
--- * 'dtrTable' @::@ 'Maybe' 'TableDescription'
+-- * 'dtrTable' @::@ 'TableDescription'
 --
-describeTableResponse :: DescribeTableResponse
-describeTableResponse = DescribeTableResponse
-    { _dtrTable = Nothing
+describeTableResponse :: TableDescription -- ^ 'dtrTable'
+                      -> DescribeTableResponse
+describeTableResponse p1 = DescribeTableResponse
+    { _dtrTable = p1
     }
 
-dtrTable :: Lens' DescribeTableResponse (Maybe TableDescription)
+dtrTable :: Lens' DescribeTableResponse TableDescription
 dtrTable = lens _dtrTable (\s a -> s { _dtrTable = a })
 
 instance ToPath DescribeTable where
@@ -109,4 +110,4 @@
 
 instance FromJSON DescribeTableResponse where
     parseJSON = withObject "DescribeTableResponse" $ \o -> DescribeTableResponse
-        <$> o .:? "Table"
+        <$> o .:  "Table"
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
@@ -7,6 +7,7 @@
 {-# LANGUAGE OverloadedStrings           #-}
 {-# LANGUAGE RecordWildCards             #-}
 {-# LANGUAGE TypeFamilies                #-}
+{-# LANGUAGE ViewPatterns                #-}
 
 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
 
@@ -238,8 +239,6 @@
     , gsiuUpdate
     ) where
 
-import Data.Char (isUpper)
-import Network.AWS.Error
 import Network.AWS.Prelude
 import Network.AWS.Signing
 import qualified GHC.Exts
@@ -251,16 +250,42 @@
     type Sg DynamoDB = V4
     type Er DynamoDB = JSONError
 
-    service = Service
-        { _svcAbbrev       = "DynamoDB"
-        , _svcPrefix       = "dynamodb"
-        , _svcVersion      = "2012-08-10"
-        , _svcTargetPrefix = Just "DynamoDB_20120810"
-        , _svcJSONVersion  = Just "1.0"
-        }
+    service = service'
+      where
+        service' :: Service DynamoDB
+        service' = Service
+            { _svcAbbrev       = "DynamoDB"
+            , _svcPrefix       = "dynamodb"
+            , _svcVersion      = "2012-08-10"
+            , _svcTargetPrefix = Just "DynamoDB_20120810"
+            , _svcJSONVersion  = Just "1.0"
+            , _svcHandle       = handle
+            , _svcRetry        = retry
+            }
 
-    handle = jsonError statusSuccess
+        handle :: Status
+               -> Maybe (LazyByteString -> ServiceError JSONError)
+        handle = jsonError statusSuccess service'
 
+        retry :: Retry DynamoDB
+        retry = Exponential
+            { _retryBase     = 0.05
+            , _retryGrowth   = 2
+            , _retryAttempts = 10
+            , _retryCheck    = check
+            }
+
+        check :: Status
+              -> JSONError
+              -> Bool
+        check (statusCode -> s) (awsErrorCode -> e)
+            | s == 400 && "ThrottlingException" == e = True -- Throttling
+            | s == 400 && "ProvisionedThroughputExceededException" == e = True -- Throughput Exceeded
+            | s == 500  = True -- General Server Error
+            | s == 509  = True -- Limit Exceeded
+            | s == 503  = True -- Service Unavailable
+            | otherwise = False
+
 data WriteRequest = WriteRequest
     { _wDeleteRequest :: Maybe DeleteRequest
     , _wPutRequest    :: Maybe PutRequest
@@ -677,15 +702,15 @@
 
 data TableDescription = TableDescription
     { _tdAttributeDefinitions   :: List "AttributeDefinitions" AttributeDefinition
-    , _tdCreationDateTime       :: Maybe ISO8601
+    , _tdCreationDateTime       :: ISO8601
     , _tdGlobalSecondaryIndexes :: List "GlobalSecondaryIndexes" GlobalSecondaryIndexDescription
-    , _tdItemCount              :: Maybe Integer
+    , _tdItemCount              :: Integer
     , _tdKeySchema              :: List1 "KeySchema" KeySchemaElement
     , _tdLocalSecondaryIndexes  :: List "LocalSecondaryIndexes" LocalSecondaryIndexDescription
-    , _tdProvisionedThroughput  :: Maybe ProvisionedThroughputDescription
-    , _tdTableName              :: Maybe Text
-    , _tdTableSizeBytes         :: Maybe Integer
-    , _tdTableStatus            :: Maybe TableStatus
+    , _tdProvisionedThroughput  :: ProvisionedThroughputDescription
+    , _tdTableName              :: Text
+    , _tdTableSizeBytes         :: Integer
+    , _tdTableStatus            :: TableStatus
     } deriving (Eq, Show)
 
 -- | 'TableDescription' constructor.
@@ -694,35 +719,41 @@
 --
 -- * 'tdAttributeDefinitions' @::@ ['AttributeDefinition']
 --
--- * 'tdCreationDateTime' @::@ 'Maybe' 'UTCTime'
+-- * 'tdCreationDateTime' @::@ 'UTCTime'
 --
 -- * 'tdGlobalSecondaryIndexes' @::@ ['GlobalSecondaryIndexDescription']
 --
--- * 'tdItemCount' @::@ 'Maybe' 'Integer'
+-- * 'tdItemCount' @::@ 'Integer'
 --
 -- * 'tdKeySchema' @::@ 'NonEmpty' 'KeySchemaElement'
 --
 -- * 'tdLocalSecondaryIndexes' @::@ ['LocalSecondaryIndexDescription']
 --
--- * 'tdProvisionedThroughput' @::@ 'Maybe' 'ProvisionedThroughputDescription'
+-- * 'tdProvisionedThroughput' @::@ 'ProvisionedThroughputDescription'
 --
--- * 'tdTableName' @::@ 'Maybe' 'Text'
+-- * 'tdTableName' @::@ 'Text'
 --
--- * 'tdTableSizeBytes' @::@ 'Maybe' 'Integer'
+-- * 'tdTableSizeBytes' @::@ 'Integer'
 --
--- * 'tdTableStatus' @::@ 'Maybe' 'TableStatus'
+-- * 'tdTableStatus' @::@ 'TableStatus'
 --
-tableDescription :: NonEmpty KeySchemaElement -- ^ 'tdKeySchema'
+tableDescription :: Text -- ^ 'tdTableName'
+                 -> NonEmpty KeySchemaElement -- ^ 'tdKeySchema'
+                 -> TableStatus -- ^ 'tdTableStatus'
+                 -> UTCTime -- ^ 'tdCreationDateTime'
+                 -> ProvisionedThroughputDescription -- ^ 'tdProvisionedThroughput'
+                 -> Integer -- ^ 'tdTableSizeBytes'
+                 -> Integer -- ^ 'tdItemCount'
                  -> TableDescription
-tableDescription p1 = TableDescription
-    { _tdKeySchema              = withIso _List1 (const id) p1
+tableDescription p1 p2 p3 p4 p5 p6 p7 = TableDescription
+    { _tdTableName              = p1
+    , _tdKeySchema              = withIso _List1 (const id) p2
+    , _tdTableStatus            = p3
+    , _tdCreationDateTime       = withIso _Time (const id) p4
+    , _tdProvisionedThroughput  = p5
+    , _tdTableSizeBytes         = p6
+    , _tdItemCount              = p7
     , _tdAttributeDefinitions   = mempty
-    , _tdTableName              = Nothing
-    , _tdTableStatus            = Nothing
-    , _tdCreationDateTime       = Nothing
-    , _tdProvisionedThroughput  = Nothing
-    , _tdTableSizeBytes         = Nothing
-    , _tdItemCount              = Nothing
     , _tdLocalSecondaryIndexes  = mempty
     , _tdGlobalSecondaryIndexes = mempty
     }
@@ -743,10 +774,10 @@
         . _List
 
 -- | The date and time when the table was created, in <http://www.epochconverter.com/ UNIX epoch time> format.
-tdCreationDateTime :: Lens' TableDescription (Maybe UTCTime)
+tdCreationDateTime :: Lens' TableDescription UTCTime
 tdCreationDateTime =
     lens _tdCreationDateTime (\s a -> s { _tdCreationDateTime = a })
-        . mapping _Time
+        . _Time
 
 -- | The global secondary indexes, if any, on the table. Each index is scoped to a
 -- given hash key value. Each element is composed of:
@@ -810,7 +841,7 @@
 -- | The number of items in the specified table. DynamoDB updates this value
 -- approximately every six hours. Recent changes might not be reflected in this
 -- value.
-tdItemCount :: Lens' TableDescription (Maybe Integer)
+tdItemCount :: Lens' TableDescription Integer
 tdItemCount = lens _tdItemCount (\s a -> s { _tdItemCount = a })
 
 -- | The primary key structure for the table. Each /KeySchemaElement/ consists of:
@@ -872,18 +903,18 @@
 
 -- | The provisioned throughput settings for the table, consisting of read and
 -- write capacity units, along with data about increases and decreases.
-tdProvisionedThroughput :: Lens' TableDescription (Maybe ProvisionedThroughputDescription)
+tdProvisionedThroughput :: Lens' TableDescription ProvisionedThroughputDescription
 tdProvisionedThroughput =
     lens _tdProvisionedThroughput (\s a -> s { _tdProvisionedThroughput = a })
 
 -- | The name of the table.
-tdTableName :: Lens' TableDescription (Maybe Text)
+tdTableName :: Lens' TableDescription Text
 tdTableName = lens _tdTableName (\s a -> s { _tdTableName = a })
 
 -- | The total size of the specified table, in bytes. DynamoDB updates this value
 -- approximately every six hours. Recent changes might not be reflected in this
 -- value.
-tdTableSizeBytes :: Lens' TableDescription (Maybe Integer)
+tdTableSizeBytes :: Lens' TableDescription Integer
 tdTableSizeBytes = lens _tdTableSizeBytes (\s a -> s { _tdTableSizeBytes = a })
 
 -- | The current state of the table:
@@ -900,21 +931,21 @@
 -- /ACTIVE/ - The table is ready for use.
 --
 --
-tdTableStatus :: Lens' TableDescription (Maybe TableStatus)
+tdTableStatus :: Lens' TableDescription TableStatus
 tdTableStatus = lens _tdTableStatus (\s a -> s { _tdTableStatus = a })
 
 instance FromJSON TableDescription where
     parseJSON = withObject "TableDescription" $ \o -> TableDescription
         <$> o .:? "AttributeDefinitions" .!= mempty
-        <*> o .:? "CreationDateTime"
+        <*> o .:  "CreationDateTime"
         <*> o .:? "GlobalSecondaryIndexes" .!= mempty
-        <*> o .:? "ItemCount"
+        <*> o .:  "ItemCount"
         <*> o .:  "KeySchema"
         <*> o .:? "LocalSecondaryIndexes" .!= mempty
-        <*> o .:? "ProvisionedThroughput"
-        <*> o .:? "TableName"
-        <*> o .:? "TableSizeBytes"
-        <*> o .:? "TableStatus"
+        <*> o .:  "ProvisionedThroughput"
+        <*> o .:  "TableName"
+        <*> o .:  "TableSizeBytes"
+        <*> o .:  "TableStatus"
 
 instance ToJSON TableDescription where
     toJSON TableDescription{..} = object
diff --git a/gen/Network/AWS/DynamoDB/Waiters.hs b/gen/Network/AWS/DynamoDB/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/DynamoDB/Waiters.hs
@@ -0,0 +1,42 @@
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TypeFamilies      #-}
+
+-- Module      : Network.AWS.DynamoDB.Waiters
+-- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
+-- License     : This Source Code Form is subject to the terms of
+--               the Mozilla Public License, v. 2.0.
+--               A copy of the MPL can be found in the LICENSE file or
+--               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : experimental
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+module Network.AWS.DynamoDB.Waiters where
+
+import Network.AWS.DynamoDB.DescribeTable
+import Network.AWS.DynamoDB.Types
+import Network.AWS.Waiters
+
+tableExists :: Wait DescribeTable
+tableExists = Wait
+    { _waitName      = "TableExists"
+    , _waitAttempts  = 25
+    , _waitDelay     = 20
+    , _waitAcceptors =
+        [ matchAll TSActive AcceptSuccess
+            (dtrTable . tdTableStatus)
+        , matchError "ResourceNotFoundException" AcceptRetry
+        ]
+    }
+
+tableNotExists :: Wait DescribeTable
+tableNotExists = Wait
+    { _waitName      = "TableNotExists"
+    , _waitAttempts  = 25
+    , _waitDelay     = 20
+    , _waitAcceptors =
+        [ matchError "ResourceNotFoundException" AcceptSuccess
+        ]
+    }
