diff --git a/Spock.cabal b/Spock.cabal
--- a/Spock.cabal
+++ b/Spock.cabal
@@ -1,5 +1,5 @@
 name:                Spock
-version:             0.6.3.0
+version:             0.6.4.0
 synopsis:            Another Haskell web framework for rapid development
 description:         This toolbox provides everything you need to get a quick start into web hacking with haskell: routing, middleware, json, blaze, sessions, cookies, database helper, csrf-protection, global state
 Homepage:            https://github.com/agrafix/Spock
diff --git a/src/Web/Spock.hs b/src/Web/Spock.hs
--- a/src/Web/Spock.hs
+++ b/src/Web/Spock.hs
@@ -12,7 +12,7 @@
     , subcomponent, Http.StdMethod (..)
     , combineRoute
      -- * Handeling requests
-    , request, header, cookie, body, jsonBody, files, UploadedFile (..)
+    , request, header, cookie, body, jsonBody, jsonBody', files, UploadedFile (..)
     , params, param
      -- * Sending responses
     , setStatus, setHeader, redirect, jumpNext, setCookie, setCookie', bytes, lazyBytes
diff --git a/src/Web/Spock/Core.hs b/src/Web/Spock/Core.hs
--- a/src/Web/Spock/Core.hs
+++ b/src/Web/Spock/Core.hs
@@ -1,10 +1,11 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE DoAndIfThenElse #-}
 module Web.Spock.Core
     ( SpockT, ActionT, spockT
     , middleware, UploadedFile (..)
     , defRoute, get, post, head, put, delete, patch
-    , request, header, cookie, body, jsonBody
+    , request, header, cookie, body, jsonBody, jsonBody'
     , files, params, param, setStatus, setHeader, redirect
     , jumpNext
     , setCookie, setCookie'
@@ -98,13 +99,31 @@
 body :: MonadIO m => ActionT m BS.ByteString
 body =
     do req <- request
-       liftIO $ Wai.requestBody req
+       let parseBody = liftIO $ Wai.requestBody req
+           parseAll chunks =
+               do bs <- parseBody
+                  if BS.null bs
+                  then return chunks
+                  else parseAll (chunks `BS.append` bs)
+       parseAll BS.empty
 
 -- | Parse the request body as json
 jsonBody :: (MonadIO m, A.FromJSON a) => ActionT m (Maybe a)
 jsonBody =
     do b <- body
        return $ A.decodeStrict b
+
+-- | Parse the request body as json and fails with 500 status code on error
+jsonBody' :: (MonadIO m, A.FromJSON a) => ActionT m a
+jsonBody' =
+    do b <- body
+       case A.eitherDecodeStrict' b of
+         Left err ->
+             do setStatus status500
+                text (T.pack $ "Failed to parse json: " ++ err)
+                throwError ActionDone
+         Right val ->
+             return val
 
 -- | Get uploaded files
 files :: MonadIO m => ActionT m (HM.HashMap T.Text UploadedFile)
diff --git a/src/Web/Spock/Wire.hs b/src/Web/Spock/Wire.hs
--- a/src/Web/Spock/Wire.hs
+++ b/src/Web/Spock/Wire.hs
@@ -83,6 +83,7 @@
     = ActionRedirect T.Text
     | ActionTryNext
     | ActionError String
+    | ActionDone
     deriving (Show)
 
 instance Error ActionInterupt where
@@ -198,6 +199,8 @@
                                                 do liftIO $ putStrLn $ "Spock Error while handeling "
                                                               ++ show (Wai.pathInfo req) ++ ": " ++ errorMsg
                                                    return serverError
+                                            Left ActionDone ->
+                                                return respState
                                             Right () ->
                                                 return respState
                                respState <-
