diff --git a/CHANGES b/CHANGES
--- a/CHANGES
+++ b/CHANGES
@@ -2,3 +2,5 @@
    * First public release
 0.3: 18 Dec 2011 
    * Rename modules and make compatible with new xournal-types package
+0.4: 25 Dec 2011
+   * Double buffer support
diff --git a/src/Graphics/Xournal/Render/BBox.hs b/src/Graphics/Xournal/Render/BBox.hs
--- a/src/Graphics/Xournal/Render/BBox.hs
+++ b/src/Graphics/Xournal/Render/BBox.hs
@@ -14,7 +14,7 @@
 import Data.Xournal.Predefined 
 
 import Data.Foldable
-
+import Data.Monoid 
 import qualified Data.Map as M
 
 import Data.ByteString hiding (map, minimum, maximum, concat, concatMap, filter )
@@ -22,7 +22,21 @@
 import Debug.Trace
 import Prelude hiding (fst,snd,curry,uncurry,mapM_,concatMap)
 
+clipBBox :: Maybe BBox -> Render ()
+clipBBox (Just (BBox (x1,y1) (x2,y2))) = do {resetClip; rectangle x1 y1 x2 y2; clip}
+clipBBox Nothing = resetClip 
 
+clearBBox :: Maybe BBox -> Render ()        
+clearBBox Nothing = return ()
+clearBBox (Just (BBox (x1,y1) (x2,y2))) = do 
+    save
+    setSourceRGBA 0 0 0 0
+    setOperator OperatorSource
+    rectangle x1 y1 x2 y2 
+    fill
+    restore
+
+
 cairoOneStrokeBBoxOnly :: StrokeBBox -> Render () 
 cairoOneStrokeBBoxOnly sbbox = do  
   let s = gToStroke sbbox
@@ -67,8 +81,9 @@
 
 
 cairoDrawBackgroundBBox :: Maybe BBox -> Dimension -> Background -> Render ()
-cairoDrawBackgroundBBox mbbox (Dim w h) (Background typ col sty) = 
-    case mbbox of 
+cairoDrawBackgroundBBox mbbox dim@(Dim w h) (Background typ col sty) = do 
+    let mbbox2 = toMaybe $ fromMaybe mbbox `mappend` (Intersect (Middle (dimToBBox dim)))
+    case mbbox2 of 
       Nothing -> cairoDrawBkg (Dim w h) (Background typ col sty)
       Just bbox@(BBox (x1,y1) (x2,y2)) -> do 
         let c = M.lookup col predefined_bkgcolor  
diff --git a/src/Graphics/Xournal/Render/BBoxMapPDF.hs b/src/Graphics/Xournal/Render/BBoxMapPDF.hs
--- a/src/Graphics/Xournal/Render/BBoxMapPDF.hs
+++ b/src/Graphics/Xournal/Render/BBoxMapPDF.hs
@@ -1,38 +1,39 @@
-{-# LANGUAGE OverloadedStrings, CPP #-}
+{-# LANGUAGE OverloadedStrings, TypeFamilies, TypeSynonymInstances, 
+             MultiParamTypeClasses, FlexibleInstances, FlexibleContexts, 
+             CPP #-}
 
 module Graphics.Xournal.Render.BBoxMapPDF where
 
 import Graphics.Xournal.Render.Type 
+import Graphics.Xournal.Render.Generic
+import Graphics.Xournal.Render.Simple
+import Graphics.Xournal.Render.PDFBackground
 import Data.Xournal.Simple
 import Data.Xournal.Generic
 import Data.Xournal.Map
 import Data.Xournal.BBox
+import Data.Xournal.Buffer
+import Data.Foldable 
 import Data.IntMap
+import Data.Traversable 
 
+import Control.Category
+import Control.Monad.State hiding (get, mapM_, mapM,sequence)
+import qualified Control.Monad.State as St (get)
+import Data.Label
+
 import Data.ByteString hiding (putStrLn, empty)
 import qualified Data.ByteString.Char8 as C hiding (empty)
+
 #ifdef POPPLER
 import qualified Graphics.UI.Gtk.Poppler.Document as Poppler
-#endif
+#endif 
 
+import Graphics.Xournal.Render.BBox
 import Graphics.Rendering.Cairo
 
-data BackgroundPDFDrawable = 
-  BkgPDFSolid { bkgpdf_color :: ByteString
-              , bkgpdf_style :: ByteString
-              }
-  | BkgPDFPDF { bkgpdf_domain :: Maybe ByteString
-              , bkgpdf_filename :: Maybe ByteString
-              , bkgpdf_pageno :: Int
-#ifdef POPPLER 
-              , bkgpdf_popplerpage :: Maybe Poppler.Page 
-#else 
-              , bkgpdf_popplerpage :: Maybe ()
-#endif
-              , bkgpdf_cairosurface :: Maybe Surface
-              } 
+import Prelude hiding ((.),id,mapM, mapM_, sequence )
 
-data BkgPDFOption = DrawBkgPDF | DrawWhite | DrawBuffer
 
 type TPageBBoxMapPDF = TPageBBoxMapBkg BackgroundPDFDrawable 
 
@@ -47,36 +48,257 @@
   gFromBackground = bkgPDFFromBkg 
   gToBackground = bkgFromBkgPDF
 
-bkgFromBkgPDF :: BackgroundPDFDrawable -> Background 
-bkgFromBkgPDF (BkgPDFSolid c s) = Background "solid" c s 
-bkgFromBkgPDF (BkgPDFPDF d f n _ _ ) = BackgroundPdf "pdf" d f n 
 
-bkgPDFFromBkg :: Background -> BackgroundPDFDrawable
-bkgPDFFromBkg (Background _t c s) = BkgPDFSolid c s
-bkgPDFFromBkg (BackgroundPdf _t md mf pn) = BkgPDFPDF md mf pn Nothing Nothing
 
-  
-emptyTXournalBBoxMapPDF :: TXournalBBoxMapPDF
-emptyTXournalBBoxMapPDF = GXournal "" empty
-
-
 tlayerBBoxFromTLayerSelect :: TLayerSelect TLayerBBox -> TLayerBBox 
 tlayerBBoxFromTLayerSelect l = 
   case unTEitherAlterHitted (gstrokes l) of
     Left strs -> GLayer strs 
     Right alist -> GLayer . Prelude.concat $ interleave id unHitted alist
 
+tlayerbufFromTLayerSelectBuf :: TLayerSelectBuf (TLayerBBoxBuf b) 
+                                -> (TLayerBBoxBuf b) 
+tlayerbufFromTLayerSelectBuf l = 
+  case unTEitherAlterHitted (get g_bstrokes l) of
+    Left strs -> GLayerBuf (get g_buffer l) strs 
+    Right alist -> GLayerBuf (get g_buffer l) . Prelude.concat 
+                   $ interleave id unHitted alist
+  
+instance GCast TTempPageSelectPDF TPageBBoxMapPDF where      
+  gcast = tpageBBoxMapPDFFromTTempPageSelectPDF
+
+
 tpageBBoxMapPDFFromTTempPageSelectPDF :: TTempPageSelectPDF -> TPageBBoxMapPDF
 tpageBBoxMapPDFFromTTempPageSelectPDF p = 
   let TLayerSelectInPage s others = glayers p 
       s' = tlayerBBoxFromTLayerSelect s
   in  GPage (gdimension p) (gbackground p) (gFromList (s':others))
+     
+instance GCast TTempPageSelectPDFBuf TPageBBoxMapPDFBuf where      
+  gcast = tpageBBoxMapPDFBufFromTTempPageSelectPDFBuf
       
+tpageBBoxMapPDFBufFromTTempPageSelectPDFBuf :: TTempPageSelectPDFBuf 
+                                               -> TPageBBoxMapPDFBuf
+tpageBBoxMapPDFBufFromTTempPageSelectPDFBuf p = 
+  let TLayerSelectInPageBuf s others = get g_layers p 
+      s' = tlayerbufFromTLayerSelectBuf s
+  in  GPage (gdimension p) (gbackground p) (gFromList (s':others))
+
       
+instance GCast TPageBBoxMapPDF TTempPageSelectPDF where
+  gcast = ttempPageSelectPDFFromTPageBBoxMapPDF
+
 ttempPageSelectPDFFromTPageBBoxMapPDF :: TPageBBoxMapPDF -> TTempPageSelectPDF 
 ttempPageSelectPDFFromTPageBBoxMapPDF p = 
   let (x:xs) = gToList (glayers p)
       l = GLayer . TEitherAlterHitted . Left . gToList . gstrokes $ x
   in  GPage (gdimension p) (gbackground p) (TLayerSelectInPage l xs)
       
+
+instance GCast TPageBBoxMapPDFBuf TTempPageSelectPDFBuf where
+  gcast = ttempPageSelectPDFBufFromTPageBBoxMapPDFBuf
+
+ttempPageSelectPDFBufFromTPageBBoxMapPDFBuf :: TPageBBoxMapPDFBuf
+                                               -> TTempPageSelectPDFBuf
+ttempPageSelectPDFBufFromTPageBBoxMapPDFBuf p = 
+  let (x:xs) = gToList (get g_layers p)
+      l = GLayerBuf { 
+          gbuffer = gbuffer x ,
+          gbstrokes = TEitherAlterHitted . Left . gToList . gbstrokes $ x
+          }
+  in  GPage (gdimension p) (gbackground p) (TLayerSelectInPageBuf l xs)
+
+----------------------      
+
+
+
+
+mkTXournalBBoxMapPDF :: Xournal -> IO TXournalBBoxMapPDF
+mkTXournalBBoxMapPDF xoj = do 
+  let pgs = xoj_pages xoj 
+  npgs <- mkAllTPageBBoxMapPDF pgs 
+  return $ GXournal (xoj_title xoj) (gFromList npgs)
+  
+mkAllTPageBBoxMapPDF :: [Page] -> IO [TPageBBoxMapPDF]
+mkAllTPageBBoxMapPDF pgs = evalStateT (mapM mkPagePDF pgs) Nothing 
+
+
+mkPagePDF :: Page -> StateT (Maybe Context) IO TPageBBoxMapPDF
+mkPagePDF pg = do  
+  let bkg = page_bkg pg
+      dim = page_dim pg 
+      ls = page_layers pg
+  newbkg <- mkBkgPDF dim bkg
+  return $ GPage dim newbkg (gFromList . Prelude.map fromLayer $ ls)
+  
+mkBkgPDF :: Dimension -> Background 
+            -> StateT (Maybe Context) IO BackgroundPDFDrawable
+mkBkgPDF dim@(Dim w h) bkg = do  
+  let bkgpdf = bkgPDFFromBkg bkg
+  case bkgpdf of 
+    BkgPDFSolid c s msfc -> do -- return bkgpdf 
+      case msfc of 
+        Just _ -> return bkgpdf
+        Nothing -> do 
+          sfc <- liftIO $ createImageSurface FormatARGB32 (floor w) (floor h)
+          renderWith sfc $ do 
+            cairoDrawBkg dim (bkgFromBkgPDF bkgpdf) 
+          return bkgpdf { bkgpdf_cairosurface = Just sfc}
+    BkgPDFPDF md mf pn _ _ -> do 
+#ifdef POPPLER
+      mctxt <- St.get 
+      case mctxt of
+        Nothing -> do 
+          case (md,mf) of 
+            (Just d, Just f) -> do 
+              mdoc <- popplerGetDocFromFile f
+              put $ Just (Context d f mdoc)
+              case mdoc of 
+                Just doc -> do  
+                  (mpg,msfc) <- popplerGetPageFromDoc doc pn 
+                  return (bkgpdf {bkgpdf_popplerpage = mpg, bkgpdf_cairosurface = msfc}) 
+            _ -> return bkgpdf 
+        Just (Context oldd oldf olddoc) -> do 
+          (mpage,msfc) <- case olddoc of 
+            Just doc -> do 
+              popplerGetPageFromDoc doc pn
+            Nothing -> return (Nothing,Nothing) 
+          return $ BkgPDFPDF md mf pn mpage msfc
+#else
+          return bkgpdf
+#endif  
+
+
+
+newtype LyBuf = LyBuf { mbuffer :: Maybe Surface } 
+
+type instance StrokeTypeFromLayer (TLayerBBoxBuf b) = StrokeBBox 
+
+type TPageBBoxMapPDFBuf = 
+  TPageBBoxMapBkgBuf BackgroundPDFDrawable LyBuf
+  
+type TXournalBBoxMapPDFBuf = 
+  TXournalBBoxMapBkgBuf BackgroundPDFDrawable LyBuf
+  
+type TTempPageSelectPDFBuf = 
+  GPage BackgroundPDFDrawable (TLayerSelectInPageBuf []) (TLayerBBoxBuf LyBuf)
+
+type TTempXournalSelectPDFBuf = 
+  GSelect (IntMap TPageBBoxMapPDFBuf) (Maybe (Int, TTempPageSelectPDFBuf))
+
+mkTLayerBBoxBufFromNoBuf :: Dimension -> TLayerBBox -> IO (TLayerBBoxBuf LyBuf)
+mkTLayerBBoxBufFromNoBuf (Dim w h) lyr = do 
+  let strs = get g_strokes lyr 
+  sfc <- createImageSurface FormatARGB32 (floor w) (floor h)
+  renderWith sfc (cairoDrawLayerBBox (Just (BBox (0,0) (w,h))) lyr)
+  return $ GLayerBuf { gbuffer = LyBuf (Just sfc), 
+                       gbstrokes = strs }  -- temporary
+
+updateLayerBuf :: Maybe BBox -> TLayerBBoxBuf LyBuf -> IO (TLayerBBoxBuf LyBuf)
+updateLayerBuf mbbox lyr = do 
+  -- putStrLn $ "updatelayerbuf called" ++ show mbbox
+  case get g_buffer lyr of 
+    LyBuf (Just sfc) -> do 
+      --  putStrLn "here"
+      renderWith sfc $ do 
+        clearBBox mbbox        
+        cairoDrawLayerBBox mbbox (gcast lyr :: TLayerBBox)
+      return lyr
+    _ -> return lyr
+    
+
+mkTPageBBoxMapPDFBufFromNoBuf :: TPageBBoxMapPDF -> IO TPageBBoxMapPDFBuf
+mkTPageBBoxMapPDFBufFromNoBuf page = do 
+  let dim = get g_dimension page
+      bkg = get g_background page
+      ls =  get g_layers page
+  ls' <- mapM (mkTLayerBBoxBufFromNoBuf dim) ls
+  return $ GPage dim bkg ls'
       
+
+mkTXournalBBoxMapPDFBufFromNoBuf :: TXournalBBoxMapPDF 
+                                    -> IO TXournalBBoxMapPDFBuf
+mkTXournalBBoxMapPDFBufFromNoBuf xoj = do 
+  let title = get g_title xoj
+      pages = get g_pages xoj 
+  pages' <- mapM mkTPageBBoxMapPDFBufFromNoBuf pages
+ 
+  return $ GXournal title pages'
+
+resetPageBuffers :: TPageBBoxMapPDFBuf -> IO TPageBBoxMapPDFBuf 
+resetPageBuffers page = do 
+  let dim = get g_dimension page
+      mbbox = Just . dimToBBox $ dim 
+  newlayers <- sequence . fmap (updateLayerBuf mbbox) . get g_layers $ page 
+  return (set g_layers newlayers page)
+
+resetXournalBuffers :: TXournalBBoxMapPDFBuf -> IO TXournalBBoxMapPDFBuf 
+resetXournalBuffers xoj = do 
+  let pages = get g_pages xoj 
+  newpages <- mapM resetPageBuffers pages
+  return . set g_pages newpages $ xoj
+  
+  
+
+instance GCast (TLayerBBoxBuf a) TLayerBBox where
+  gcast = tlayerBBoxFromTLayerBBoxBuf
+ 
+instance GCast TPageBBoxMapPDFBuf TPageBBoxMapPDF where
+  gcast = tpageBBoxMapPDFFromTPageBBoxMapPDFBuf
+
+tlayerBBoxFromTLayerBBoxBuf :: TLayerBBoxBuf a -> TLayerBBox
+tlayerBBoxFromTLayerBBoxBuf (GLayerBuf _ strs) = GLayer strs 
+
+tpageBBoxMapPDFFromTPageBBoxMapPDFBuf :: TPageBBoxMapPDFBuf -> TPageBBoxMapPDF
+tpageBBoxMapPDFFromTPageBBoxMapPDFBuf (GPage dim bkg ls) = 
+  GPage dim bkg (fmap tlayerBBoxFromTLayerBBoxBuf ls)
+ 
+  
+----- Rendering   
+
+newtype InBBox a = InBBox a
+
+data InBBoxOption = InBBoxOption (Maybe BBox) 
+
+instance RenderOptionable (InBBox TLayerBBox) where
+  type RenderOption (InBBox TLayerBBox) = InBBoxOption 
+  cairoRenderOption (InBBoxOption mbbox) (InBBox layer) 
+    = cairoDrawLayerBBox mbbox layer 
+
+                             
+instance RenderOptionable (InBBox TPageBBoxMapPDF) where
+  type RenderOption (InBBox TPageBBoxMapPDF) = InBBoxOption 
+  cairoRenderOption opt@(InBBoxOption mbbox) (InBBox page) = do 
+    cairoRenderOption (DrawPDFInBBox mbbox) (gbackground page, gdimension page) 
+    mapM_ (cairoDrawLayerBBox mbbox) . glayers $ page 
+
+    
+-- | page within a bbox. not implemented bbox part.
+
+cairoDrawPageBBoxPDF :: Maybe BBox -> TPageBBoxMapPDF -> Render ()
+cairoDrawPageBBoxPDF mbbox page = cairoRender page  -- This is temporary
+
+
+
+
+cairoDrawLayerBBoxBuf :: Maybe BBox -> TLayerBBoxBuf LyBuf -> Render ()
+cairoDrawLayerBBoxBuf mbbox layer = do
+  case get g_buffer layer of 
+    LyBuf (Just sfc) -> do clipBBox mbbox 
+                           setSourceSurface sfc 0 0 
+                           paint 
+                           resetClip 
+    _ -> cairoDrawLayerBBox mbbox (gcast layer :: TLayerBBox)
+  
+
+
+instance RenderOptionable (InBBox (TLayerBBoxBuf LyBuf)) where
+  type RenderOption (InBBox (TLayerBBoxBuf LyBuf)) = InBBoxOption 
+  cairoRenderOption (InBBoxOption mbbox) (InBBox layer) 
+    = cairoDrawLayerBBoxBuf mbbox layer
+      
+instance RenderOptionable (InBBox TPageBBoxMapPDFBuf) where
+  type RenderOption (InBBox TPageBBoxMapPDFBuf) = InBBoxOption 
+  cairoRenderOption opt@(InBBoxOption mbbox) (InBBox page) = do 
+    cairoRenderOption (DrawPDFInBBox mbbox) (get g_background page, get g_dimension page)
+    mapM_ (cairoRenderOption opt . InBBox) .  get g_layers $ page
diff --git a/src/Graphics/Xournal/Render/Generic.hs b/src/Graphics/Xournal/Render/Generic.hs
--- a/src/Graphics/Xournal/Render/Generic.hs
+++ b/src/Graphics/Xournal/Render/Generic.hs
@@ -55,14 +55,13 @@
   type RenderOption Stroke = () 
   cairoRenderOption () = cairoRender
   
-data StrokeBBoxOption = DrawFull | DrawBoxOnly
-
+data StrokeBBoxOption = DrawFull | DrawBoxOnly 
 
 instance RenderOptionable StrokeBBox where
   type RenderOption StrokeBBox = StrokeBBoxOption
   cairoRenderOption DrawFull = cairoRender 
   cairoRenderOption DrawBoxOnly = cairoOneStrokeBBoxOnly
-
+  
 cairoOptionLayer :: (RenderOptionable a, Foldable s) => 
                     RenderOption a -> GLayer s a -> Render () 
 cairoOptionLayer opt = mapM_ (cairoRenderOption opt) . gstrokes 
@@ -89,14 +88,3 @@
   type RenderOption (GPage b s a) = (RenderOption (b,Dimension), RenderOption a)
   cairoRenderOption = cairoOptionPage
             
-{-
-instance (Renderable (b,Dimension)) => 
-         Renderable (GBackground b,Dimension) where
-  cairoRender (GBackground b,dim) = cairoRender (b,dim)
-
-instance (RenderOptionable (b,Dimension)) => 
-         RenderOptionable (GBackground b,Dimension) where
-  type RenderOption (GBackground b,Dimension) = RenderOption (b,Dimension)
-  cairoRenderOption opt (GBackground b,dim)= cairoRenderOption opt (b,dim)
--}
-
diff --git a/src/Graphics/Xournal/Render/PDFBackground.hs b/src/Graphics/Xournal/Render/PDFBackground.hs
--- a/src/Graphics/Xournal/Render/PDFBackground.hs
+++ b/src/Graphics/Xournal/Render/PDFBackground.hs
@@ -4,15 +4,18 @@
 
 module Graphics.Xournal.Render.PDFBackground where
 
-import Control.Monad.State
+import Debug.Trace
+import Control.Monad.State hiding (mapM_)
+import Prelude hiding (mapM_)
 
+import Data.Foldable 
 import Data.Monoid 
 import Data.ByteString hiding (putStrLn)
 import qualified Data.ByteString.Char8 as C
 import Data.Xournal.Generic
 import Data.Xournal.Simple
 import Data.Xournal.BBox
-import Graphics.Xournal.Render.BBoxMapPDF
+import Graphics.Xournal.Render.BBox 
 import Graphics.Xournal.Render.Generic
 import Graphics.Xournal.Render.Type
 
@@ -28,64 +31,42 @@
                        , ctxt_filename :: ByteString 
 #ifdef POPPLER
                        , ctxt_doc :: Maybe Poppler.Document
-#else 
+#else
                        , ctxt_doc :: Maybe ()
-#endif
+#endif 
                        }
 
-
-mkTXournalBBoxMapPDF :: Xournal -> IO TXournalBBoxMapPDF
-mkTXournalBBoxMapPDF xoj = do 
-  let pgs = xoj_pages xoj 
-  npgs <- mkAllTPageBBoxMapPDF pgs 
-  return $ GXournal (xoj_title xoj) (gFromList npgs)
-  
-mkAllTPageBBoxMapPDF :: [Page] -> IO [TPageBBoxMapPDF]
-mkAllTPageBBoxMapPDF pgs = evalStateT (mapM mkPagePDF pgs) Nothing 
-
-
-mkPagePDF :: Page -> StateT (Maybe Context) IO TPageBBoxMapPDF
-mkPagePDF pg = do  
-  let bkg = page_bkg pg
-      dim = page_dim pg 
-      ls = page_layers pg
-  newbkg <- mkBkgPDF bkg
-  return $ GPage dim newbkg (gFromList . Prelude.map fromLayer $ ls)
-  
-mkBkgPDF :: Background 
-            -> StateT (Maybe Context) IO BackgroundPDFDrawable
-mkBkgPDF bkg = do  
-  let bkgpdf = bkgPDFFromBkg bkg
+data BackgroundPDFDrawable = 
+  BkgPDFSolid { bkgpdf_color :: ByteString
+              , bkgpdf_style :: ByteString
+              , bkgpdf_cairosurface :: Maybe Surface
+              }
+  | BkgPDFPDF { bkgpdf_domain :: Maybe ByteString
+              , bkgpdf_filename :: Maybe ByteString
+              , bkgpdf_pageno :: Int 
 #ifdef POPPLER
-  case bkgpdf of 
-    BkgPDFSolid _ _ -> return bkgpdf 
-    BkgPDFPDF md mf pn _ _ -> do 
-      mctxt <- get 
-      case mctxt of
-        Nothing -> do 
-          case (md,mf) of 
-            (Just d, Just f) -> do 
-              liftIO $ putStrLn "hey"
-              mdoc <- popplerGetDocFromFile f
-              put $ Just (Context d f mdoc)
-
-              case mdoc of 
-                Just doc -> do  
-                  (mpg,msfc) <- popplerGetPageFromDoc doc pn 
-                  return (bkgpdf {bkgpdf_popplerpage = mpg, bkgpdf_cairosurface = msfc}) 
-            _ -> return bkgpdf 
-        Just (Context oldd oldf olddoc) -> do 
-          (mpage,msfc) <- case olddoc of 
-            Just doc -> do 
-              popplerGetPageFromDoc doc pn
-            Nothing -> return (Nothing,Nothing) 
-          return $ BkgPDFPDF md mf pn mpage msfc
-#else 
-  return $ bkgpdf
+              , bkgpdf_popplerpage :: Maybe Poppler.Page 
+#else    
+              , bkgpdf_popplerpage :: Maybe ()
 #endif
+              , bkgpdf_cairosurface :: Maybe Surface
+              } 
 
+data BkgPDFOption = DrawBkgPDF 
+                  | DrawWhite 
+                  | DrawBuffer
+                  | DrawPDFInBBox (Maybe BBox)
 
-#ifdef POPPLER            
+bkgFromBkgPDF :: BackgroundPDFDrawable -> Background 
+bkgFromBkgPDF (BkgPDFSolid c s _) = Background "solid" c s 
+bkgFromBkgPDF (BkgPDFPDF d f n _ _ ) = BackgroundPdf "pdf" d f n 
+
+bkgPDFFromBkg :: Background -> BackgroundPDFDrawable
+bkgPDFFromBkg (Background _t c s) = BkgPDFSolid c s Nothing
+bkgPDFFromBkg (BackgroundPdf _t md mf pn) = BkgPDFPDF md mf pn Nothing Nothing
+
+            
+#ifdef POPPLER
 popplerGetDocFromFile :: (MonadIO m) => 
                          ByteString -> m (Maybe Poppler.Document)
 popplerGetDocFromFile fp = 
@@ -113,7 +94,7 @@
 
 cairoRenderBackgroundPDFDrawable :: (BackgroundPDFDrawable,Dimension) 
                                     -> Render ()
-cairoRenderBackgroundPDFDrawable (BkgPDFSolid c s,dim) = 
+cairoRenderBackgroundPDFDrawable (BkgPDFSolid c s _,dim) = 
   cairoRender (Background "solid" c s,dim)
 cairoRenderBackgroundPDFDrawable (BkgPDFPDF _ _ _ p _,dim) = do
   case p of 
@@ -125,9 +106,7 @@
       fill
 #ifdef POPPLER
       PopplerPage.pageRender pg
-#endif    
-  
-
+#endif     
 
 instance Renderable (BackgroundPDFDrawable,Dimension) where
   cairoRender = cairoRenderBackgroundPDFDrawable
@@ -142,32 +121,32 @@
     fill 
   cairoRenderOption DrawBuffer (b,dim) = do 
     case b of 
-      BkgPDFSolid _ _ -> cairoRenderOption DrawBkgPDF (b,dim)
+      BkgPDFSolid _ _ msfc  -> do  
+        case msfc of 
+          Nothing -> cairoRenderOption DrawBkgPDF (b,dim)
+          Just sfc -> do 
+            -- cairoRenderOption DrawBkgPDF (b,dim)
+            -- clipBBox . Just . dimToBBox $ dim
+            setSourceSurface sfc 0 0 
+            paint 
+            -- resetClip 
       BkgPDFPDF _ _ _ _ msfc -> do 
         case bkgpdf_cairosurface b of 
           Nothing -> cairoRenderOption DrawBkgPDF (b,dim)
           Just sfc -> do 
             setSourceSurface sfc 0 0 
             paint 
-      
+  cairoRenderOption (DrawPDFInBBox mbbox) (b,dim) = do 
+    case b of 
+      BkgPDFSolid _ _ _ -> do 
+        clipBBox mbbox
+        cairoRenderOption DrawBuffer (b,dim)
+        resetClip
+        --  cairoDrawBackgroundBBox mbbox dim (bkgFromBkgPDF b)
+      BkgPDFPDF _ _ _ _ _ -> do 
+        clipBBox mbbox
+        cairoRenderOption DrawBuffer (b,dim)
+        resetClip
 
-cairoDrawPageBBoxPDF :: Maybe BBox -> TPageBBoxMapPDF -> Render ()
-cairoDrawPageBBoxPDF mbbox page = do 
-  cairoRender page 
-{-  case gbackground page of 
-    BkgPDFSolid c s -> do 
-      let bkg = Background "solid" c s 
-          bkg 
       
-      page
--}    
-    
-  
-
-
-
-
-
-
-
 
diff --git a/src/Graphics/Xournal/Render/Simple.hs b/src/Graphics/Xournal/Render/Simple.hs
--- a/src/Graphics/Xournal/Render/Simple.hs
+++ b/src/Graphics/Xournal/Render/Simple.hs
@@ -3,7 +3,6 @@
 module Graphics.Xournal.Render.Simple where 
 
 import Graphics.Rendering.Cairo
-
 import Data.Strict.Tuple
 
 import Data.Xournal.Simple
diff --git a/src/Graphics/Xournal/Render/Type.hs b/src/Graphics/Xournal/Render/Type.hs
--- a/src/Graphics/Xournal/Render/Type.hs
+++ b/src/Graphics/Xournal/Render/Type.hs
@@ -53,17 +53,29 @@
           TEitherAlterHitted { 
             unTEitherAlterHitted :: Either [a] (TAlterHitted a)
           }
+
 type TLayerSelect a = GLayer TEitherAlterHitted (StrokeTypeFromLayer a) 
 
+type TLayerSelectBuf a = GLayerBuf (BufTypeFromLayer a) TEitherAlterHitted (StrokeTypeFromLayer a) 
+
 type family StrokeTypeFromLayer a  :: * 
      
+type family BufTypeFromLayer a :: *
+     
+type instance BufTypeFromLayer (GLayerBuf b s a) = b     
+     
 type instance StrokeTypeFromLayer TLayerBBox = StrokeBBox
- 
 
 data TLayerSelectInPage s a = TLayerSelectInPage 
                               { gselectedlayer :: TLayerSelect a 
                               , gotherlayers :: s a
                               }
+
+data TLayerSelectInPageBuf s a = TLayerSelectInPageBuf
+                               { gselectedlayerbuf :: TLayerSelectBuf a 
+                               , gotherlayersbuf :: s a
+                               }
+
 
 type TTempPageSelect = GPage Background (TLayerSelectInPage []) TLayerBBox
                        
diff --git a/xournal-render.cabal b/xournal-render.cabal
--- a/xournal-render.cabal
+++ b/xournal-render.cabal
@@ -1,5 +1,5 @@
 Name:		xournal-render
-Version:	0.3.0.0
+Version:	0.4
 Synopsis:       Xournal file renderer
 Description: 	Rendering library using cairo for xournal file format
 License: 	BSD3
@@ -22,6 +22,7 @@
   hs-source-dirs: src
   ghc-options: 	-Wall -O2 -threaded -funbox-strict-fields -fno-warn-unused-do-bind
   ghc-prof-options: -caf-all -auto-all
+
   if flag(poppler)
     Build-Depends: base == 4.*, 
                    mtl == 2.*, 
@@ -31,7 +32,7 @@
                    bytestring == 0.9.*,
                    poppler == 0.12.*, 
                    fclabels == 1.0.*, 
-                   xournal-types == 0.1.* 
+                   xournal-types == 0.2.*
   else
     Build-Depends: base == 4.*, 
                    mtl == 2.*, 
@@ -40,8 +41,9 @@
                    strict == 0.3.*, 
                    bytestring == 0.9.*,
                    fclabels == 1.0.*, 
-                   xournal-types == 0.1.* 
+                   xournal-types == 0.2.*
 
+
   Exposed-Modules: 
                    Graphics.Xournal.Render.Simple
                    Graphics.Xournal.Render.BBox
@@ -51,7 +53,7 @@
                    Graphics.Xournal.Render.HitTest
                    Graphics.Xournal.Render.Type
 
-  if flag(poppler) 
+  if flag(poppler)
     cpp-options: -DPOPPLER
                   
 
