diff --git a/Demo.hs b/Demo.hs
--- a/Demo.hs
+++ b/Demo.hs
@@ -2,6 +2,7 @@
 
 import System.Environment
 import Control.Monad
+import Control.Monad.Trans.Class
 import Data.IORef
 
 import qualified Data.Text.Lazy.IO as L
@@ -56,22 +57,26 @@
              , containerChild := canvas
              ]
 
-  onExpose canvas $ const $ do
+  on canvas draw $ do
     redraw canvas state
-    return True
 
-  onMotionNotify canvas False $ \e -> do
-    modifyIORef state (\s -> s {mousePos = (E.eventX e, E.eventY e)})
-    tick canvas state
-    return True
+  on canvas motionNotifyEvent $ do
+    (x,y) <- eventCoordinates
+    lift $ do
+      modifyIORef state (\s -> s {mousePos = (x,y)})
+      tick canvas state
+      return True
 
-  onButtonPress canvas $ \e -> do
-    when (E.eventButton e == LeftButton && E.eventClick e == SingleClick) $
-      click state dg
-    return True
+  on canvas buttonPressEvent $ do
+    button <- eventButton
+    eClick <- eventClick
+    lift $ do
+        when (button == LeftButton && eClick == SingleClick) $
+          click state dg
+        return True
 
   widgetShowAll window
-  onDestroy window mainQuit
+  on window destroyEvent $ lift $ mainQuit >> return True
   mainGUI
 
 click :: IORef State -> R.DotGraph String -> IO ()
@@ -104,31 +109,27 @@
   s <- readIORef state
   unless (oldHover == hover s) $ widgetQueueDraw canvas
 
-redraw :: WidgetClass w => w -> IORef State -> IO ()
+redraw :: WidgetClass w => w -> IORef State -> Render ()
 redraw canvas state = do
-  s <- readIORef state
-  E.Rectangle _ _ rw rh <- widgetGetAllocation canvas
+  s <- liftIO $ readIORef state
+  rw <- liftIO $ widgetGetAllocatedWidth canvas
+  rh <- liftIO $ widgetGetAllocatedHeight canvas
 
   let (ops, size'@(_,_,sw,sh)) = objects s
 
-  boundingBoxes <- render canvas $ do
-    -- Proportional scaling
-    let scalex = min (fromIntegral rw / sw) (fromIntegral rh / sh)
-        scaley = scalex
-        offsetx = 0.5 * fromIntegral rw
-        offsety = 0.5 * fromIntegral rh
-    save
-    translate offsetx offsety
-    scale scalex scaley
+  -- Proportional scaling
+  let scalex = min (fromIntegral rw / sw) (fromIntegral rh / sh)
+      scaley = scalex
+      offsetx = 0.5 * fromIntegral rw
+      offsety = 0.5 * fromIntegral rh
+  save
+  translate offsetx offsety
+  scale scalex scaley
 
-    result <- drawAll (hover s) size' ops
+  result <- drawAll (hover s) size' ops
 
-    restore
-    return $ map (\(o, (x,y,w,h)) -> (o, (x*scalex+offsetx,y*scaley+offsety,w*scalex,h*scaley))) result
+  restore
 
-  modifyIORef state (\s' -> s' {bounds = boundingBoxes})
+  let boundingBoxes = map (\(o, (x,y,w,h)) -> (o, (x*scalex+offsetx,y*scaley+offsety,w*scalex,h*scaley))) result
 
-render :: WidgetClass w => w -> Render b -> IO b
-render canvas r = do
-    win <- widgetGetDrawWindow canvas
-    renderWithDrawable win r
+  liftIO $ modifyIORef state (\s' -> s' {bounds = boundingBoxes})
diff --git a/xdot.cabal b/xdot.cabal
--- a/xdot.cabal
+++ b/xdot.cabal
@@ -1,5 +1,5 @@
 name:               xdot
-version:            0.2.4.9
+version:            0.3
 license:            BSD3
 license-file:       LICENSE
 category:           Graphs, Graphics
@@ -7,7 +7,7 @@
 build-type:         Simple
 author:             Dennis Felsing <dennis@felsin9.de>
 maintainer:         Dennis Felsing <dennis@felsin9.de>
-copyright:          Dennis Felsing 2012-2013
+copyright:          Dennis Felsing 2012-2016
 synopsis:           Parse Graphviz xdot files and interactively view them using GTK and Cairo
 description:        Parse Graphviz xdot files and interactively view them using
                     GTK and Cairo.
@@ -30,7 +30,7 @@
   Build-depends: base == 4.*,
                  mtl >= 2.0 && < 2.3,
                  cairo >= 0.12 && < 0.14,
-                 gtk >= 0.12 && < 0.15,
+                 gtk3 >= 0.12 && < 0.15,
                  graphviz >= 2999.16 && < 2999.19,
                  text >= 0.11 && < 1.3,
                  polyparse >= 1.8 && < 1.12
@@ -43,8 +43,9 @@
   Build-depends: base,
                  cairo,
                  graphviz,
-                 gtk,
+                 gtk3,
                  text,
+                 transformers,
                  -- ourselves
                  xdot
 
