diff --git a/Spock.cabal b/Spock.cabal
--- a/Spock.cabal
+++ b/Spock.cabal
@@ -1,5 +1,5 @@
 name:                Spock
-version:             0.6.2.0
+version:             0.6.2.1
 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
@@ -76,9 +76,9 @@
            runM m = runResourceT $ runReaderT (runWebStateM m) internalState
 
        spockT port runM $
-               do middleware (sm_middleware sessionMgr)
-                  hookSafeActions
+               do hookSafeActions
                   defs
+                  middleware (sm_middleware sessionMgr)
 
 -- | Write to the current session. Note that all data is stored on the server.
 -- The user only reciedes a sessionId to be identified.
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
@@ -44,7 +44,7 @@
 data SpockState m
    = SpockState
    { ss_treeMap :: !(SpockRouteMap m)
-   , ss_middleware :: Wai.Middleware
+   , ss_middleware :: [Wai.Middleware]
    , ss_spockLift :: forall a. m a -> IO a
    }
 
@@ -67,13 +67,14 @@
    = ResponseFile FilePath
    | ResponseLBS BSL.ByteString
    | ResponseRedirect T.Text
+   deriving (Show, Eq)
 
 data ResponseState
    = ResponseState
    { rs_responseHeaders :: [(T.Text, T.Text)]
    , rs_status :: Status
    , rs_responseBody :: ResponseBody
-   }
+   } deriving (Show, Eq)
 
 type BaseRoute = T.Text
 
@@ -135,7 +136,7 @@
     do let initState =
                SpockState
                { ss_treeMap = HM.empty
-               , ss_middleware = id
+               , ss_middleware = []
                , ss_spockLift = spockLift
                }
        (spockState, ()) <- spockLift $ execRWST (runSpockT spockActions) "/" initState
@@ -170,7 +171,7 @@
                                  (respState, _) <- liftIO $
                                      (spockLift $ execRWST (runActionT action) env resp)
                                      `catch` \(e :: SomeException) ->
-                                         do putStrLn $ "Spock Error: " ++ show e
+                                         do putStrLn $ "Spock Error while handeling " ++ show (Wai.pathInfo req) ++ ": " ++ show e
                                             return (serverError, ())
                                  forM_ (HM.elems uploadedFiles) $ \uploadedFile ->
                                      do stillThere <- doesFileExist (uf_tempLocation uploadedFile)
@@ -180,12 +181,12 @@
                               respond notFound
                     Nothing ->
                         respond notFound
-       return $ ss_middleware spockState $ app
+       return $ foldl (.) id (ss_middleware spockState) $ app
 
 -- | Hook up a 'Wai.Middleware'
 middleware :: MonadIO m => Wai.Middleware -> SpockT m ()
 middleware mw =
-    modify $ \st -> st { ss_middleware = mw . (ss_middleware st) }
+    modify $ \st -> st { ss_middleware = (ss_middleware st ++ [mw]) }
 
 -- | Define a route matching a provided 'StdMethod' and route
 defRoute :: (MonadIO m) => StdMethod -> T.Text -> ActionT m () -> SpockT m ()
@@ -228,14 +229,16 @@
        parentRoute <- ask
        let initState =
                parentState
-               { ss_treeMap = HM.empty }
+               { ss_treeMap = HM.empty
+               , ss_middleware = []
+               }
        (a, finalState, ()) <-
            liftIO $ (ss_spockLift parentState) $
            runRWST (runSpockT defs) (parentRoute `combineRoute` baseRoute) initState
        modify $ \st ->
            st
            { ss_treeMap = HM.unionWith HM.union (ss_treeMap st) (ss_treeMap finalState)
-           , ss_middleware = (ss_middleware finalState) . (ss_middleware st)
+           , ss_middleware = (ss_middleware st) ++ (ss_middleware finalState)
            }
        return a
 
