diff --git a/src/Network/AWS/Flow.hs b/src/Network/AWS/Flow.hs
--- a/src/Network/AWS/Flow.hs
+++ b/src/Network/AWS/Flow.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE LambdaCase #-}
+
 module Network.AWS.Flow
   ( register
   , execute
@@ -28,12 +30,13 @@
 import           Network.AWS.Flow.SWF
 import           Network.AWS.Flow.Types
 import           Network.AWS.Flow.Uid
-import           Network.AWS.Flow.Prelude hiding ( ByteString, Metadata )
+import           Network.AWS.Flow.Prelude hiding ( ByteString, Metadata, handle )
 
 import           Control.Monad.Catch
 import qualified Data.HashMap.Strict as Map
 import           Formatting
 import           Network.AWS.SWF
+import           Network.HTTP.Types
 import           Safe
 
 -- Interface
@@ -61,29 +64,41 @@
   logInfo' $ sformat ("event=execute uid=" % stext) uid
   startWorkflowExecutionAction uid tskName tskVersion tskQueue input
 
+serializeError :: MonadFlow m => Error -> m ()
+serializeError = \case
+  e@(SerializeError s) ->
+    unless check $ throwM e where
+      check =
+        s ^. serializeStatus  == ok200 &&
+        s ^. serializeAbbrev  == "SWF" &&
+        s ^. serializeMessage == "key \"taskToken\" not present"
+  e -> throwM e
+
 act :: MonadFlow m => Queue -> (Uid -> Metadata -> [Blob] -> m (Metadata, [Artifact])) -> m ()
-act queue action = do
-  logInfo' "event=act"
-  (token, uid, input) <- pollForActivityTaskAction queue
-  logInfo' $ sformat ("event=act-begin uid=" % stext) uid
-  keys <- listObjectsAction uid
-  unless (null keys) $ logInfo' $ sformat ("event=list-blobs uid=" % stext) uid
-  blobs <- forM keys $ getObjectAction uid
-  unless (null blobs) $ logInfo' $ sformat ("event=blobs uid=" % stext) uid
-  (output, artifacts) <- action uid input blobs
-  logInfo' $ sformat ("event=act-finish uid=" % stext) uid
-  forM_ artifacts $ putObjectAction uid
-  unless (null artifacts) $ logInfo' $ sformat ("event=artifacts uid=" % stext) uid
-  respondActivityTaskCompletedAction token output
+act queue action =
+  handle serializeError $ do
+    logInfo' "event=act"
+    (token, uid, input) <- pollForActivityTaskAction queue
+    logInfo' $ sformat ("event=act-begin uid=" % stext) uid
+    keys <- listObjectsAction uid
+    unless (null keys) $ logInfo' $ sformat ("event=list-blobs uid=" % stext) uid
+    blobs <- forM keys $ getObjectAction uid
+    unless (null blobs) $ logInfo' $ sformat ("event=blobs uid=" % stext) uid
+    (output, artifacts) <- action uid input blobs
+    logInfo' $ sformat ("event=act-finish uid=" % stext) uid
+    forM_ artifacts $ putObjectAction uid
+    unless (null artifacts) $ logInfo' $ sformat ("event=artifacts uid=" % stext) uid
+    respondActivityTaskCompletedAction token output
 
 decide :: MonadFlow m => Plan -> m ()
-decide plan@Plan{..} = do
-  logInfo' "event=decide"
-  (token', events) <- pollForDecisionTaskAction (tskQueue $ strtTask plnStart)
-  token <- maybeThrow (userError "No Token") token'
-  logger <- asks feLogger
-  decisions <- runDecide logger plan events select
-  respondDecisionTaskCompletedAction token decisions
+decide plan@Plan{..} =
+  handle serializeError $ do
+    logInfo' "event=decide"
+    (token', events) <- pollForDecisionTaskAction (tskQueue $ strtTask plnStart)
+    token <- maybeThrow (userError "No Token") token'
+    logger <- asks feLogger
+    decisions <- runDecide logger plan events select
+    respondDecisionTaskCompletedAction token decisions
 
 -- Decisions
 
diff --git a/wolf.cabal b/wolf.cabal
--- a/wolf.cabal
+++ b/wolf.cabal
@@ -1,5 +1,5 @@
 name:                wolf
-version:             0.2.1
+version:             0.2.2
 synopsis:            Amazon Simple Workflow Service Wrapper.
 homepage:            https://github.com/swift-nav/wolf
 license:             MIT
@@ -46,6 +46,7 @@
                      , fast-logger
                      , formatting
                      , http-conduit
+                     , http-types
                      , lens
                      , monad-control
                      , monad-logger
