diff --git a/growler.cabal b/growler.cabal
--- a/growler.cabal
+++ b/growler.cabal
@@ -2,7 +2,7 @@
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 name:                growler
-version:             0.4.0
+version:             0.5.0
 synopsis:            A revised version of the scotty library that attempts to be simpler and more performant.
 description:         Growler provides a very similar interface to scotty, with slight tweaks for performance and a few feature tradeoffs. Growler provides the ability to abort actions (handlers) with arbitrary responses, not just in the event of redirects or raising errors. Growler avoids coercing everything into lazy Text values and reading the whole request body into memory. It also eliminates the ability to abort the handler and have another handler handle the request instead (Scotty's 'next' function).
 		     .
@@ -33,7 +33,13 @@
 cabal-version:       >=1.10
 
 library
-  exposed-modules:   Web.Growler, Web.Growler.Handler, Web.Growler.Parsable, Web.Growler.Router, Web.Growler.Types
+  exposed-modules:     Web.Growler,
+                       Web.Growler.Handler,
+                       Web.Growler.Parsable,
+                       Web.Growler.Router,
+                       Web.Growler.Types,
+                       Web.Growler.EventSource
+
   other-extensions:    OverloadedStrings, FlexibleContexts, FlexibleInstances, LambdaCase, RankNTypes, ScopedTypeVariables
   build-depends:       base >=4.6 && <5,
                        lens >=4.5 && <5,
@@ -46,15 +52,15 @@
                        regex-compat >=0.95 && <1,
                        blaze-builder >=0.3 && <0.7,
                        unordered-containers >=0.2 && <0.9,
-                       aeson,
-                       vector,
-                       case-insensitive,
-                       warp,
-                       pipes,
-                       pipes-aeson,
-                       pipes-wai,
-                       monad-control,
+                       aeson >= 0.8,
+                       vector >= 0.7.1,
+                       case-insensitive >= 1.2,
+                       warp >= 3,
+                       pipes >= 4.0 && <4.2,
+                       pipes-aeson >= 0.4,
+                       pipes-wai >= 3,
+                       monad-control == 1.*,
                        either >= 4.3.1,
-                       transformers-base
+                       transformers-base >= 0.4
   hs-source-dirs:      src
   default-language:    Haskell2010
diff --git a/src/Web/Growler/EventSource.hs b/src/Web/Growler/EventSource.hs
new file mode 100644
--- /dev/null
+++ b/src/Web/Growler/EventSource.hs
@@ -0,0 +1,19 @@
+{-# LANGUAGE OverloadedStrings #-}
+module Web.Growler.EventSource where
+import           Blaze.ByteString.Builder (Builder)
+import           Control.Monad.Trans
+import           Data.Function (fix)
+import           Network.HTTP.Types (hContentType, status200)
+import           Network.Wai.EventSource.EventStream
+import           Web.Growler
+
+eventSource :: MonadIO m => IO ServerEvent -> HandlerT m ()
+eventSource m = do
+  status status200
+  setHeader hContentType "text/event-stream"
+  stream $ \sendChunk flush -> fix $ \loop -> do
+    se <- m
+    case eventToBuilder se of
+      Nothing -> return ()
+      Just b -> sendChunk b >> flush >> loop
+
diff --git a/src/Web/Growler/Types.hs b/src/Web/Growler/Types.hs
--- a/src/Web/Growler/Types.hs
+++ b/src/Web/Growler/Types.hs
@@ -127,8 +127,10 @@
 instance MonadBase b m => MonadBase b (HandlerT m) where
   liftBase = liftBaseDefault
 
+newtype StHandlerT a = StHandlerT { unStHandlerT :: Either ResponseState (a, ResponseState) }
+
 instance MonadTransControl HandlerT where
-  newtype StT HandlerT a = StHandlerT { unStHandlerT :: Either ResponseState (a, ResponseState) }
+  type StT HandlerT a = StHandlerT a
   liftWith f = do
     r <- HandlerT ask
     s <- HandlerT get
@@ -149,9 +151,9 @@
         return x
 
 instance MonadBaseControl b m => MonadBaseControl b (HandlerT m) where
-  newtype StM (HandlerT m) a = StMHandlerT { unStMHandlerT :: StM m (StT HandlerT a) }
-  liftBaseWith = defaultLiftBaseWith StMHandlerT
-  restoreM = defaultRestoreM unStMHandlerT
+  type StM (HandlerT m) a = ComposeSt HandlerT m a
+  liftBaseWith = defaultLiftBaseWith
+  restoreM = defaultRestoreM
 
 type Handler = HandlerT IO
 
