diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,25 @@
+The following license covers this documentation, and the source code, except
+where otherwise indicated.
+
+Copyright 2012, Chris Smith, Mathias Biilmann Christensen. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+  list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+  this list of conditions and the following disclaimer in the documentation
+  and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS "AS IS" AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/Setup.lhs b/Setup.lhs
new file mode 100644
--- /dev/null
+++ b/Setup.lhs
@@ -0,0 +1,7 @@
+#!/usr/bin/env runhaskell
+
+> module Main where
+> import Distribution.Simple
+
+> main :: IO ()
+> main = defaultMain
diff --git a/src/Network/Wai/EventSource.hs b/src/Network/Wai/EventSource.hs
new file mode 100644
--- /dev/null
+++ b/src/Network/Wai/EventSource.hs
@@ -0,0 +1,32 @@
+{-# LANGUAGE OverloadedStrings #-}
+module Network.Wai.EventSource (
+    ServerEvent(..),
+    eventSourceApp
+    ) where
+
+import           Blaze.ByteString.Builder (Builder)
+import           Control.Concurrent.Chan (Chan, dupChan, readChan)
+import           Control.Monad.IO.Class (liftIO)
+import qualified Data.Conduit as C
+import           Network.HTTP.Types (statusOK)
+import           Network.Wai (Application, Response(..))
+
+import Network.Wai.EventSource.EventStream
+
+-- | Make a new WAI EventSource application reading events from
+-- the given channel.
+eventSourceApp :: Chan ServerEvent -> Application
+eventSourceApp chan _ = do
+  chan' <- liftIO $ dupChan chan
+  return $ res chan'
+
+res :: Chan ServerEvent -> Response
+res chan = ResponseSource statusOK [("Content-Type", "text/event-stream")] $ resE chan
+
+resE :: Chan ServerEvent -> C.Source IO Builder
+resE chan =
+  C.sourceIO ign (const ign) (const $ fmap (f . eventToBuilder) $ readChan chan)
+  where
+    ign = return ()
+    f Nothing = C.Closed
+    f (Just b) = C.Open b
diff --git a/src/Network/Wai/EventSource/EventStream.hs b/src/Network/Wai/EventSource/EventStream.hs
new file mode 100644
--- /dev/null
+++ b/src/Network/Wai/EventSource/EventStream.hs
@@ -0,0 +1,83 @@
+{-# LANGUAGE OverloadedStrings #-}
+{- code adapted by Mathias Billman originaly from Chris Smith https://github.com/cdsmith/gloss-web -}
+
+{-|
+    A WAI adapter to the HTML5 Server-Sent Events API.  Push-mode and
+    pull-mode interfaces are both available.
+-}
+module Network.Wai.EventSource.EventStream (
+    ServerEvent(..),
+    eventToBuilder
+    ) where
+
+import Blaze.ByteString.Builder
+import Blaze.ByteString.Builder.Char8
+import Data.Monoid
+
+{-|
+    Type representing a communication over an event stream.  This can be an
+    actual event, a comment, a modification to the retry timer, or a special
+    "close" event indicating the server should close the connection.
+-}
+data ServerEvent
+    = ServerEvent {
+        eventName :: Maybe Builder,
+        eventId   :: Maybe Builder,
+        eventData :: [Builder]
+        }
+    | CommentEvent {
+        eventComment :: Builder
+        }
+    | RetryEvent {
+        eventRetry :: Int
+        }
+    | CloseEvent
+
+
+{-|
+    Newline as a Builder.
+-}
+nl :: Builder
+nl = fromChar '\n'
+
+
+{-|
+    Field names as Builder
+-}
+nameField, idField, dataField, retryField, commentField :: Builder
+nameField = fromString "event:"
+idField = fromString "id:"
+dataField = fromString "data:"
+retryField = fromString "retry:"
+commentField = fromChar ':'
+
+
+{-|
+    Wraps the text as a labeled field of an event stream.
+-}
+field :: Builder -> Builder -> Builder
+field l b = l `mappend` b `mappend` nl
+
+
+{-|
+    Appends a buffer flush to the end of a Builder.
+-}
+flushAfter :: Builder -> Builder
+flushAfter b = b `mappend` flush
+
+
+{-|
+    Converts a 'ServerEvent' to its wire representation as specified by the
+    @text/event-stream@ content type.
+-}
+eventToBuilder :: ServerEvent -> Maybe Builder
+eventToBuilder (CommentEvent txt) = Just $ flushAfter $ field commentField txt
+eventToBuilder (RetryEvent   n)   = Just $ flushAfter $ field retryField (fromShow n)
+eventToBuilder (CloseEvent)       = Nothing
+eventToBuilder (ServerEvent n i d)= Just $ flushAfter $
+    (name n $ evid i $ mconcat (map (field dataField) d)) `mappend` nl
+  where
+    name Nothing  = id
+    name (Just n') = mappend (field nameField n')
+    evid Nothing  = id
+    evid (Just i') = mappend (field idField   i')
diff --git a/wai-eventsource.cabal b/wai-eventsource.cabal
new file mode 100644
--- /dev/null
+++ b/wai-eventsource.cabal
@@ -0,0 +1,33 @@
+Name:                wai-eventsource
+Version:             1.0.0
+Synopsis:            WAI support for server-sent events
+Description:         WAI support for server-sent events
+License:             BSD3
+Author:              Chris Smith, Mathias Biilmann Christensen
+Maintainer:          greg@gregweber.info
+Stability:           Experimental
+Category:            Web
+Build-type:          Simple
+Cabal-version:       >=1.8
+homepage:            http://www.yesodweb.com/book/wai
+license-file:        LICENSE
+
+Library
+  Build-depends:
+      base                      >= 4.3 && < 5
+    , bytestring                >= 0.9.1.4  && < 0.10
+    , blaze-builder             >= 0.3 && < 0.4
+    , conduit
+    , http-types                >= 0.6      && < 0.7
+    , wai                       >= 1.0
+    , warp                      >= 1.0
+    , transformers
+
+  ghc-options:     -Wall
+  hs-source-dirs:  src
+  exposed-modules: Network.Wai.EventSource
+  other-modules:   Network.Wai.EventSource.EventStream
+
+source-repository head
+  type:     git
+  location: git://github.com/yesodweb/wai.git
