diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,5 @@
+# Revision history for essence-of-live-coding-gloss
+
+## 0.1.0.0 -- YYYY-mm-dd
+
+* First version. Released on an unsuspecting world.
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright (c) 2019, Manuel Bärenz
+
+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.
+
+    * Neither the name of Manuel Bärenz nor the names of other
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"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
+OWNER OR CONTRIBUTORS 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.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/essence-of-live-coding-gloss.cabal b/essence-of-live-coding-gloss.cabal
new file mode 100644
--- /dev/null
+++ b/essence-of-live-coding-gloss.cabal
@@ -0,0 +1,51 @@
+name:                essence-of-live-coding-gloss
+version:             0.1.0.1
+synopsis: General purpose live coding framework - Gloss backend
+description:
+  essence-of-live-coding is a general purpose and type safe live coding framework.
+  .
+  You can run programs in it, and edit, recompile and reload them while they're running.
+  Internally, the state of the live program is automatically migrated when performing hot code swap.
+  .
+  The library also offers an easy to use FRP interface.
+  It is parametrized by its side effects,
+  separates data flow cleanly from control flow,
+  and allows to develop live programs from reusable, modular components.
+  There are also useful utilities for debugging and quickchecking.
+  .
+  This package contains a backend for Gloss (http://gloss.ouroborus.net/).
+
+license:             BSD3
+license-file:        LICENSE
+author:              Manuel Bärenz
+maintainer:          programming@manuelbaerenz.de
+homepage:            https://www.manuelbaerenz.de/#computerscience
+category:            FRP, Live coding
+build-type:          Simple
+extra-source-files:  CHANGELOG.md
+cabal-version:       >=1.10
+
+source-repository head
+  type:     git
+  location: git@github.com:turion/essence-of-live-coding.git
+
+source-repository this
+  type:     git
+  location: git@github.com:turion/essence-of-live-coding.git
+  tag:      v0.1.0.1
+
+library
+  exposed-modules:
+    LiveCoding.Gloss
+    LiveCoding.Gloss.Debugger
+    LiveCoding.Gloss.GHCi
+    LiveCoding.Gloss.PictureM
+  build-depends:
+      base >= 4.11 && <4.13
+    , syb
+    , transformers
+    , essence-of-live-coding
+    , foreign-store
+    , gloss
+  hs-source-dirs:      src
+  default-language:    Haskell2010
diff --git a/src/LiveCoding/Gloss.hs b/src/LiveCoding/Gloss.hs
new file mode 100644
--- /dev/null
+++ b/src/LiveCoding/Gloss.hs
@@ -0,0 +1,86 @@
+{-# LANGUAGE Arrows #-}
+
+module LiveCoding.Gloss
+  ( module X
+  , module LiveCoding.Gloss
+  ) where
+
+-- base
+import Control.Concurrent
+import Data.IORef
+
+-- transformers
+import Control.Monad.Trans.Writer
+
+-- gloss
+import Graphics.Gloss as X
+import Graphics.Gloss.Interface.IO.Game as X
+
+-- essence-of-live-coding
+import LiveCoding
+
+-- essence-of-live-coding-gloss
+import LiveCoding.Gloss.Debugger as X
+import LiveCoding.Gloss.PictureM as X
+
+type GlossCellWorldForeground = (GlossCell, [Event], Picture)
+
+playCellForeground :: GlossCell -> IO ()
+playCellForeground cell = playIO (InWindow "Gears" (600, 800) (20, 20)) black stepRate (initialWorld cell) toPicture handleEvent playStep
+
+type GlossCellWorld = (MVar GlossCell, [Event], Picture)
+
+-- TODO Abstract external main loops
+playCell :: GlossCell -> IO (MVar GlossCell)
+playCell glossCell = do
+  var <- newMVar glossCell
+  forkIO $ playIO (InWindow "Gears" (600, 800) (20, 20)) black stepRate (initialWorld var) toPicture handleEvent playStepMVar
+  return var
+
+-- TODO Of course these are general for cells
+updateGloss :: MVar GlossCell -> GlossCell -> IO ()
+updateGloss var newGlossCell = do
+  oldGlossCell <- takeMVar var
+  putMVar var $ hotCodeSwapCell newGlossCell oldGlossCell
+
+initialWorld cell = (cell, [], blank)
+toPicture (_, _, picture) = do
+  --putStrLn "toPicture"
+  threadDelay 10000
+  return picture
+handleEvent event (cell, events, picture) = do
+  --putStrLn "handleEvent"
+  threadDelay 10000
+  return (cell, event : events, picture)
+playStep _ (cell, events, _) = do
+  (picture, cell') <- fmap massageWriterOutput $ runWriterT $ step cell events
+  threadDelay 10000
+  --putStrLn "playStep"
+  return (cell', [], picture)
+playStepMVar _ (var, events, _) = do
+  cell <- takeMVar var
+  (picture, cell') <- fmap massageWriterOutput $ runWriterT $ step cell events
+  putMVar var cell'
+  threadDelay 10000
+  --putStrLn "playStepMVar"
+  return (var, [], picture)
+
+glossWrap :: GlossCell -> IO (LiveProgram IO)
+glossWrap cell = do
+  pictureVar <- newMVar blank
+  eventRef <- newIORef []
+  stepVar <- newMVar 0
+  let
+    getPicture () = takeMVar pictureVar
+    putEvent event () = modifyIORef eventRef $ (event :)
+    putStep _ () = putMVar stepVar $ 1 / stepRate
+  forkIO $ playIO (InWindow "Gears" (600, 800) (20, 20)) black stepRate () getPicture putEvent putStep
+  let
+    putPicture = putMVar pictureVar
+    getEvents = atomicModifyIORef eventRef $ \events -> ([], events)
+    getStep = takeMVar stepVar
+  return $ liveCell $ proc _ -> do
+    _       <- constM getStep            -< ()
+    events  <- constM getEvents          -< ()
+    picture <- runPictureM cell -< events
+    arrM putPicture                            -< picture
diff --git a/src/LiveCoding/Gloss/Debugger.hs b/src/LiveCoding/Gloss/Debugger.hs
new file mode 100644
--- /dev/null
+++ b/src/LiveCoding/Gloss/Debugger.hs
@@ -0,0 +1,40 @@
+{-# LANGUAGE Arrows #-}
+module LiveCoding.Gloss.Debugger where
+
+-- base
+import Control.Arrow
+import Data.Data
+
+-- transformers
+import Control.Monad.Trans.Writer
+import Control.Monad.Trans.Class
+import Control.Monad.Trans.State
+
+-- syb
+import Data.Generics.Text
+
+-- gloss
+import Graphics.Gloss
+
+-- essence-of-live-coding
+import LiveCoding
+
+-- essence-of-live-coding-gloss
+import LiveCoding.Gloss.PictureM
+
+statePicture :: Data s => s -> Picture
+statePicture = translate (-100) 200 . scale 0.2 0.2 . color red . text . stateShow
+
+statePlay :: Debugger PictureM
+statePlay = Debugger $ liveCell $ every 2 >>> keep blank >>> arrM (lift . tell)
+
+every :: Data s => Integer -> Cell (StateT s PictureM) () (Maybe Picture)
+every maxN = proc () -> do
+  n <- sumC -< 1
+  if n `mod` maxN == 0
+  then do
+    s <- getC -< ()
+    let pic = statePicture s
+    returnA -< Just pic
+  else
+    returnA  -< Nothing
diff --git a/src/LiveCoding/Gloss/GHCi.hs b/src/LiveCoding/Gloss/GHCi.hs
new file mode 100644
--- /dev/null
+++ b/src/LiveCoding/Gloss/GHCi.hs
@@ -0,0 +1,29 @@
+module LiveCoding.Gloss.GHCi where
+
+-- base
+import Control.Concurrent
+
+-- foreign-store
+import Foreign.Store
+
+-- essence-of-live-coding
+import LiveCoding.LiveProgram
+
+-- essence-of-live-coding-gloss
+import LiveCoding.Gloss
+
+livegloss "" = livegloss "glossCell"
+livegloss glossCell = return $ unlines
+  [ "var <- playCell " ++ glossCell
+  , "saveGloss var"
+  ]
+livereloadgloss "" = livereloadgloss "glossCell"
+livereloadgloss glossCell  = return $ unlines
+  [ ":reload"
+  , "var <- loadGloss"
+  , "updateGloss var " ++ glossCell
+  ]
+loadGloss :: IO (MVar GlossCell)
+loadGloss = readStore (Store 0)
+saveGloss :: MVar GlossCell -> IO ()
+saveGloss var = writeStore (Store 0) var
diff --git a/src/LiveCoding/Gloss/PictureM.hs b/src/LiveCoding/Gloss/PictureM.hs
new file mode 100644
--- /dev/null
+++ b/src/LiveCoding/Gloss/PictureM.hs
@@ -0,0 +1,24 @@
+module LiveCoding.Gloss.PictureM where
+
+-- transformers
+import Control.Monad.Trans.Writer
+
+-- gloss
+import Graphics.Gloss
+import Graphics.Gloss.Interface.IO.Game
+
+-- essence-of-live-coding
+import LiveCoding
+
+type PictureM = WriterT Picture IO
+
+runPictureM :: GlossCell -> Cell IO [Event] Picture
+runPictureM = transformOutput $ fmap massageWriterOutput . runWriterT
+
+massageWriterOutput (((), s), pic) = (pic, s)
+
+-- TODO Rhine integration instead of fixed sample size
+type GlossCell = Cell PictureM [Event] ()
+
+addPicture :: Cell PictureM Picture ()
+addPicture = arrM tell
