diff --git a/hoodle-types.cabal b/hoodle-types.cabal
--- a/hoodle-types.cabal
+++ b/hoodle-types.cabal
@@ -1,5 +1,5 @@
 Name:		hoodle-types
-Version:	0.2.2
+Version:	0.3
 Synopsis:	Data types for programs for hoodle file format
 Description: 	Hoodle file format data type including generic interface
 License: 	BSD3
@@ -22,11 +22,12 @@
   Build-Depends: 
                    base == 4.*, 
                    bytestring >= 0.9, 
-                   mtl > 2, 
-                   strict > 0.3 , 
                    containers >= 0.4, 
-                   lens >= 2.5,
                    cereal > 0.3, 
+                   lens >= 2.5,
+                   mtl > 2, 
+                   strict > 0.3, 
+                   text > 0.11, 
                    uuid >= 1.2.6
   Exposed-Modules: 
                    Data.Hoodle.BBox
@@ -37,6 +38,7 @@
                    Data.Hoodle.Select
                    Data.Hoodle.Simple
                    Data.Hoodle.Simple.V0_1_1
+                   Data.Hoodle.Simple.V0_2_2
                    Data.Hoodle.Util
                    Data.Hoodle.Zipper 
 
diff --git a/src/Data/Hoodle/BBox.hs b/src/Data/Hoodle/BBox.hs
--- a/src/Data/Hoodle/BBox.hs
+++ b/src/Data/Hoodle/BBox.hs
@@ -17,16 +17,6 @@
 , GetBBoxable (..) 
 , MakeBBoxedable (..) 
 , BBoxed (..)
--- , StrokeBBox (..)
--- , strkbbx_strk
--- , strkbbx_bbx
--- , mkStrokeBBox
--- , ImageBBox (..)
--- , imgbbx_img
--- , imgbbx_bbx
--- , mkImageBBox
--- , SVGBBox (..)
--- , mkSVGBBox
 , mkbbox
 , mkbboxF
 , bboxFromStroke
@@ -108,7 +98,10 @@
 instance MakeBBoxedable Identity Link where
   makeBBoxed lnk = return (BBoxed lnk (bboxFromLink lnk))
 
+instance MakeBBoxedable Identity Anchor where
+  makeBBoxed anc = return (BBoxed anc (bboxFromAnchor anc))
 
+
 -- |
 mkbbox :: [Pair Double Double] -> BBox 
 mkbbox lst = let xs = map fst lst 
@@ -155,6 +148,11 @@
 bboxFromLink :: Link -> BBox 
 bboxFromLink (Link _ _ _ _ _ _ (x,y) d) = moveBBoxULCornerTo (x,y) (dimToBBox d)
 bboxFromLink (LinkDocID _ _ _ _ _ _ (x,y) d) = moveBBoxULCornerTo (x,y) (dimToBBox d)
+bboxFromLink (LinkAnchor _ _ _ _ _ (x,y) d) = moveBBoxULCornerTo (x,y) (dimToBBox d)
+
+-- |
+bboxFromAnchor :: Anchor -> BBox 
+bboxFromAnchor (Anchor _ _ (x,y) d) =  moveBBoxULCornerTo (x,y) (dimToBBox d)
 
 
 -- | general transform BBox         
diff --git a/src/Data/Hoodle/Generic.hs b/src/Data/Hoodle/Generic.hs
--- a/src/Data/Hoodle/Generic.hs
+++ b/src/Data/Hoodle/Generic.hs
@@ -6,7 +6,7 @@
 -----------------------------------------------------------------------------
 -- |
 -- Module      : Data.Hoodle.Generic 
--- Copyright   : (c) 2011, 2012 Ian-Woo Kim
+-- Copyright   : (c) 2011,2012,2014 Ian-Woo Kim
 --
 -- License     : BSD3
 -- Maintainer  : Ian-Woo Kim <ianwookim@gmail.com>
@@ -25,6 +25,7 @@
 import Data.Functor
 import qualified Data.IntMap as IM 
 import qualified Data.Sequence as Seq 
+import qualified Data.Text as T
 import Data.UUID.V4 
 -- from this package
 import Data.Hoodle.Simple
@@ -37,6 +38,7 @@
                         , ghoodle_ttl :: ByteString 
                         , ghoodle_revisions :: [Revision]
                         , ghoodle_embeddedpdf :: Maybe ByteString 
+                        , ghoodle_embeddedtext :: Maybe T.Text
                         , ghoodle_pgs :: cntnr pg }  
 
 -- | Generic page data having dimension, generic background
@@ -62,7 +64,7 @@
   
 -- | 
 instance (Functor cntnr) => Functor (GHoodle cntnr) where
-  fmap f (GHoodle hid ttl revs pdf pgs) = GHoodle hid ttl revs pdf (fmap f pgs)
+  fmap f (GHoodle hid ttl revs pdf txt pgs) = GHoodle hid ttl revs pdf txt (fmap f pgs)
 
 ------------------------------
 -- lenses for Generic types --
@@ -84,6 +86,10 @@
 gembeddedpdf :: Simple Lens (GHoodle cntnr pg) (Maybe ByteString)
 gembeddedpdf = lens ghoodle_embeddedpdf (\f a -> f { ghoodle_embeddedpdf = a } )
 
+-- | 
+gembeddedtext :: Simple Lens (GHoodle cntnr pg) (Maybe T.Text)
+gembeddedtext = lens ghoodle_embeddedtext (\f a -> f { ghoodle_embeddedtext = a } )
+
 -- |
 gpages :: Simple Lens (GHoodle cntnr pg) (cntnr pg)
 gpages = lens ghoodle_pgs (\f a -> f { ghoodle_pgs = a } )
@@ -130,7 +136,7 @@
 emptyGHoodle :: (Listable m) => IO (GHoodle m a)
 emptyGHoodle = do 
   uuid <- nextRandom
-  return $ GHoodle ((pack.show) uuid) "" [] Nothing (fromList [])
+  return $ GHoodle ((pack.show) uuid) "" [] Nothing Nothing (fromList [])
 
 -- | 
 emptyGPage :: (Listable cntnr) => Dimension -> bkg -> GPage bkg cntnr a 
diff --git a/src/Data/Hoodle/Generic/Simple.hs b/src/Data/Hoodle/Generic/Simple.hs
--- a/src/Data/Hoodle/Generic/Simple.hs
+++ b/src/Data/Hoodle/Generic/Simple.hs
@@ -3,7 +3,7 @@
 -----------------------------------------------------------------------------
 -- |
 -- Module      : Data.Hoodle.Generic.Simple 
--- Copyright   : (c) 2011, 2012 Ian-Woo Kim
+-- Copyright   : (c) 2011, 2012, 2014 Ian-Woo Kim
 --
 -- License     : BSD3
 -- Maintainer  : Ian-Woo Kim <ianwookim@gmail.com>
@@ -49,6 +49,7 @@
             <*> view title 
             <*> view revisions
             <*> view embeddedPdf 
+            <*> view embeddedText
             <*> map mkSPage . view pages
 
 -- | 
@@ -61,5 +62,5 @@
 
 -- | 
 shoodle2Hoodle :: SHoodle -> Hoodle
-shoodle2Hoodle (GHoodle hid ttl revs pdf pgs) = Hoodle hid ttl revs pdf (map spage2Page pgs)
+shoodle2Hoodle (GHoodle hid ttl revs pdf txt pgs) = Hoodle hid ttl revs pdf txt (map spage2Page pgs)
 
diff --git a/src/Data/Hoodle/Select.hs b/src/Data/Hoodle/Select.hs
--- a/src/Data/Hoodle/Select.hs
+++ b/src/Data/Hoodle/Select.hs
@@ -3,7 +3,7 @@
 -----------------------------------------------------------------------------
 -- |
 -- Module      : Data.Hoodle.Select 
--- Copyright   : (c) 2011, 2012 Ian-Woo Kim
+-- Copyright   : (c) 2011,2012,2014 Ian-Woo Kim
 --
 -- License     : BSD3
 -- Maintainer  : Ian-Woo Kim <ianwookim@gmail.com>
@@ -15,18 +15,20 @@
 module Data.Hoodle.Select where
 
 -- from other packages
-import Control.Applicative
-import Control.Lens
-import Data.ByteString 
+import           Control.Applicative
+import           Control.Lens
+import           Data.ByteString
+import qualified Data.Text as T
 --
-import Data.Hoodle.Generic 
-import Data.Hoodle.Simple 
+import           Data.Hoodle.Generic 
+import           Data.Hoodle.Simple 
 
 -- | 
 data GSelect a b = GSelect { gselect_id :: ByteString 
                            , gselect_ttl :: ByteString 
                            , gselect_revisions :: [Revision]
-                           , gselect_embeddedpdf :: Maybe ByteString 
+                           , gselect_embeddedpdf :: Maybe ByteString
+                           , gselect_embeddedtext :: Maybe T.Text
                            , gselect_all :: a 
                            , gselect_selected :: b
                            }
@@ -47,6 +49,10 @@
 gselEmbeddedPdf = lens gselect_embeddedpdf (\f a -> f {gselect_embeddedpdf = a})
 
 -- |
+gselEmbeddedText :: Simple Lens (GSelect a b) (Maybe T.Text)
+gselEmbeddedText = lens gselect_embeddedtext (\f a -> f {gselect_embeddedtext = a})
+
+-- |
 gselAll :: Simple Lens (GSelect a b) a 
 gselAll = lens gselect_all (\f a -> f {gselect_all = a} )
 
@@ -60,6 +66,7 @@
                           <*> view gselTitle 
                           <*> view gselRevisions
                           <*> view gselEmbeddedPdf 
+                          <*> view gselEmbeddedText
                           <*> view gselAll 
 
 
@@ -68,5 +75,6 @@
                           <*> view gtitle 
                           <*> view grevisions
                           <*> view gembeddedpdf
+                          <*> view gembeddedtext
                           <*> view gpages
                           <*> pure Nothing 
diff --git a/src/Data/Hoodle/Simple.hs b/src/Data/Hoodle/Simple.hs
--- a/src/Data/Hoodle/Simple.hs
+++ b/src/Data/Hoodle/Simple.hs
@@ -4,7 +4,7 @@
 -----------------------------------------------------------------------------
 -- |
 -- Module      : Data.Hoodle.Simple 
--- Copyright   : (c) 2011-2013 Ian-Woo Kim
+-- Copyright   : (c) 2011-2014 Ian-Woo Kim
 --
 -- License     : BSD3
 -- Maintainer  : Ian-Woo Kim <ianwookim@gmail.com>
@@ -18,12 +18,11 @@
 -- from other packages
 import           Control.Applicative 
 import           Control.Lens 
--- import qualified Data.ByteString as S
 import           Data.ByteString.Char8 hiding (map)
 import           Data.UUID.V4 
--- import           Data.Label
 import qualified Data.Serialize as SE
 import           Data.Strict.Tuple
+import qualified Data.Text as T
 -- from this package
 import           Data.Hoodle.Util
 -- 
@@ -37,6 +36,7 @@
           | ItemImage Image
           | ItemSVG SVG
           | ItemLink Link
+          | ItemAnchor Anchor
           deriving (Show,Eq,Ord)
 
 
@@ -83,7 +83,23 @@
                       , link_render :: ByteString
                       , link_pos :: (Double,Double)
                       , link_dim :: !Dimension }  
+          | LinkAnchor { link_id :: ByteString 
+                       , link_linkeddocid :: ByteString
+                       , link_location :: ByteString
+                       , link_anchorid :: ByteString
+                       , link_render :: ByteString
+                       , link_pos :: (Double,Double)
+                       , link_dim :: !Dimension
+                       }
+
            deriving (Show,Eq,Ord)                    
+
+data Anchor = Anchor { anchor_id :: ByteString 
+                     , anchor_render :: ByteString
+                     , anchor_pos :: (Double, Double)
+                     , anchor_dim :: !Dimension
+                     } 
+            deriving (Show,Eq,Ord)
                     
 -- | 
 instance SE.Serialize Stroke where
@@ -123,34 +139,52 @@
 
 -- | 
 instance SE.Serialize Link where
-    put Link {..}      = SE.putWord8 0 
-                         >> SE.put link_id
-                         >> SE.put link_type
-                         >> SE.put link_location
-                         >> SE.put link_text
-                         >> SE.put link_command 
-                         >> SE.put link_render
-                         >> SE.put link_pos
-                         >> SE.put link_dim
-    put LinkDocID {..} = SE.putWord8 1 
-                         >> SE.put link_id
-                         >> SE.put link_linkeddocid 
-                         >> SE.put link_location
-                         >> SE.put link_text
-                         >> SE.put link_command 
-                         >> SE.put link_render
-                         >> SE.put link_pos
-                         >> SE.put link_dim
-                    
+    put Link {..}       = SE.putWord8 0 
+                          >> SE.put link_id
+                          >> SE.put link_type
+                          >> SE.put link_location
+                          >> SE.put link_text
+                          >> SE.put link_command 
+                          >> SE.put link_render
+                          >> SE.put link_pos
+                          >> SE.put link_dim
+    put LinkDocID {..}  = SE.putWord8 1 
+                          >> SE.put link_id
+                          >> SE.put link_linkeddocid 
+                          >> SE.put link_location
+                          >> SE.put link_text
+                          >> SE.put link_command 
+                          >> SE.put link_render
+                          >> SE.put link_pos
+                          >> SE.put link_dim
+    put LinkAnchor {..} = SE.putWord8 2
+                          >> SE.put link_id
+                          >> SE.put link_linkeddocid
+                          >> SE.put link_location
+                          >> SE.put link_anchorid
+                          >> SE.put link_render
+                          >> SE.put link_pos
+                          >> SE.put link_dim
     get = do tag <- SE.getWord8 
              case tag of 
-               0 -> Link      <$> SE.get <*> SE.get <*> SE.get <*> SE.get <*> SE.get 
-                              <*> SE.get <*> SE.get <*> SE.get
-               1 -> LinkDocID <$> SE.get <*> SE.get <*> SE.get <*> SE.get <*> SE.get 
-                              <*> SE.get <*> SE.get <*> SE.get
+               0 -> Link       <$> SE.get <*> SE.get <*> SE.get <*> SE.get 
+                               <*> SE.get <*> SE.get <*> SE.get <*> SE.get
+               1 -> LinkDocID  <$> SE.get <*> SE.get <*> SE.get <*> SE.get 
+                               <*> SE.get <*> SE.get <*> SE.get <*> SE.get
+               2 -> LinkAnchor <$> SE.get <*> SE.get <*> SE.get <*> SE.get
+                               <*> SE.get <*> SE.get <*> SE.get
                _ -> fail "err in Link parsing"
 
 
+
+instance SE.Serialize Anchor where
+    put Anchor {..} = SE.put anchor_id
+                      >> SE.put anchor_render
+                      >> SE.put anchor_pos
+                      >> SE.put anchor_dim
+    get = Anchor <$> SE.get <*> SE.get <*> SE.get <*> SE.get
+
+
 -- | 
 instance SE.Serialize Item where
     put (ItemStroke str) = SE.putWord8 0 
@@ -161,12 +195,15 @@
                         >> SE.put svg 
     put (ItemLink lnk) = SE.putWord8 3
                          >> SE.put lnk                         
+    put (ItemAnchor anc) = SE.putWord8 4
+                           >> SE.put anc                         
     get = do tag <- SE.getWord8 
              case tag of 
                0 -> ItemStroke <$> SE.get
                1 -> ItemImage <$> SE.get
                2 -> ItemSVG <$> SE.get
                3 -> ItemLink <$> SE.get
+               4 -> ItemAnchor <$> SE.get
                _ -> fail "err in Item parsing"
 
 -- |    
@@ -211,6 +248,7 @@
                      , hoodle_title :: !Title
                      , hoodle_revisions :: [Revision]
                      , hoodle_embeddedpdf :: Maybe ByteString
+                     , hoodle_embeddedtext :: Maybe T.Text
                      , hoodle_pages :: ![Page] }
              deriving Show 
 
@@ -258,17 +296,15 @@
 revmd5 :: Simple Lens Revision ByteString
 revmd5 = lens _revmd5 (\f a -> f { _revmd5 = a } )
 
-{-
 -- | 
-revtxt :: Simple Lens Revision ByteString
-revtxt = lens _revtxt (\f a -> f { _revtxt = a } )
--}
-
--- | 
 embeddedPdf :: Simple Lens Hoodle (Maybe ByteString)
 embeddedPdf = lens hoodle_embeddedpdf (\f a -> f { hoodle_embeddedpdf = a} )
 
 -- | 
+embeddedText :: Simple Lens Hoodle (Maybe T.Text)
+embeddedText = lens hoodle_embeddedtext (\f a -> f { hoodle_embeddedtext = a} )
+
+-- | 
 pages :: Simple Lens Hoodle [Page]
 pages = lens hoodle_pages (\f a -> f { hoodle_pages = a } )
 
@@ -298,7 +334,7 @@
 emptyHoodle :: IO Hoodle
 emptyHoodle = do
   uuid <- nextRandom
-  return $ Hoodle ((pack.show) uuid) "" [] Nothing [] 
+  return $ Hoodle ((pack.show) uuid) "" [] Nothing Nothing [] 
 
 -- | 
 emptyLayer :: Layer 
diff --git a/src/Data/Hoodle/Simple/V0_2_2.hs b/src/Data/Hoodle/Simple/V0_2_2.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Hoodle/Simple/V0_2_2.hs
@@ -0,0 +1,329 @@
+{-# LANGUAGE BangPatterns, OverloadedStrings,  TypeOperators, 
+             TypeFamilies, FlexibleContexts, RecordWildCards #-}
+
+-----------------------------------------------------------------------------
+-- |
+-- Module      : Data.Hoodle.Simple.V0_2_2 
+-- Copyright   : (c) 2011-2014 Ian-Woo Kim
+--
+-- License     : BSD3
+-- Maintainer  : Ian-Woo Kim <ianwookim@gmail.com>
+-- Stability   : experimental
+-- Portability : GHC
+--
+----------------------------------------------------------------------------- 
+
+module Data.Hoodle.Simple.V0_2_2 where
+
+-- from other packages
+import           Control.Applicative 
+import           Control.Lens 
+import           Data.ByteString.Char8 hiding (map)
+import           Data.UUID.V4 
+import qualified Data.Serialize as SE
+import           Data.Strict.Tuple
+-- from this package
+import           Data.Hoodle.Util
+-- 
+import Prelude hiding (putStrLn,fst,snd,curry,uncurry)
+
+-- | 
+type Title = ByteString
+
+-- | wrapper of object embeddable in Layer
+data Item = ItemStroke Stroke
+          | ItemImage Image
+          | ItemSVG SVG
+          | ItemLink Link
+          deriving (Show,Eq,Ord)
+
+
+-- | Pen stroke item 
+data Stroke = Stroke { stroke_tool  :: !ByteString
+                     , stroke_color :: !ByteString
+                     , stroke_width :: !Double
+                     , stroke_data  :: ![Pair Double Double]
+                     }
+            | VWStroke { stroke_tool :: ByteString 
+                       , stroke_color :: ByteString 
+                       , stroke_vwdata :: [(Double,Double,Double)] 
+                       }
+            deriving (Show,Eq,Ord)
+
+-- | Image item 
+data Image = Image { img_src :: ByteString
+                   , img_pos :: (Double,Double)
+                   , img_dim :: !Dimension
+                   } 
+             deriving (Show,Eq,Ord)
+
+data SVG = SVG { svg_text :: Maybe ByteString
+               , svg_command :: Maybe ByteString 
+               , svg_render :: ByteString
+               , svg_pos :: (Double,Double)
+               , svg_dim :: !Dimension }  
+           deriving (Show,Eq,Ord)
+                    
+
+data Link = Link { link_id :: ByteString 
+                 , link_type :: ByteString 
+                 , link_location :: ByteString
+                 , link_text :: Maybe ByteString
+                 , link_command :: Maybe ByteString 
+                 , link_render :: ByteString
+                 , link_pos :: (Double,Double)
+                 , link_dim :: !Dimension }  
+          | LinkDocID { link_id :: ByteString
+                      , link_linkeddocid :: ByteString 
+                      , link_location :: ByteString 
+                      , link_text :: Maybe ByteString
+                      , link_command :: Maybe ByteString 
+                      , link_render :: ByteString
+                      , link_pos :: (Double,Double)
+                      , link_dim :: !Dimension }  
+           deriving (Show,Eq,Ord)                    
+                    
+-- | 
+instance SE.Serialize Stroke where
+    put Stroke{..} = SE.putWord8 0 
+                     >> SE.put stroke_tool 
+                     >> SE.put stroke_color
+                     >> SE.put stroke_width
+                     >> SE.put stroke_data
+    put VWStroke{..} = SE.putWord8 1 
+                       >> SE.put stroke_tool 
+                       >> SE.put stroke_color
+                       >> SE.put stroke_vwdata
+    get = do tag <- SE.getWord8  
+             case tag of 
+               0 -> Stroke <$> SE.get <*> SE.get <*> SE.get <*> SE.get
+               1 -> VWStroke <$> SE.get <*> SE.get <*> SE.get
+               _ -> fail "err in Stroke parsing"
+
+
+-- | 
+instance SE.Serialize Image where
+    put Image {..} = SE.put img_src
+                     >> SE.put img_pos
+                     >> SE.put img_dim
+    get = Image <$> SE.get <*> SE.get <*> SE.get
+
+-- | 
+instance SE.Serialize SVG where
+    put SVG {..} = SE.put svg_text
+                   >> SE.put svg_command 
+                   >> SE.put svg_render
+                   >> SE.put svg_pos
+                   >> SE.put svg_dim
+    get = SVG <$> SE.get <*> SE.get <*> SE.get <*> SE.get <*> SE.get
+    
+    
+
+-- | 
+instance SE.Serialize Link where
+    put Link {..}      = SE.putWord8 0 
+                         >> SE.put link_id
+                         >> SE.put link_type
+                         >> SE.put link_location
+                         >> SE.put link_text
+                         >> SE.put link_command 
+                         >> SE.put link_render
+                         >> SE.put link_pos
+                         >> SE.put link_dim
+    put LinkDocID {..} = SE.putWord8 1 
+                         >> SE.put link_id
+                         >> SE.put link_linkeddocid 
+                         >> SE.put link_location
+                         >> SE.put link_text
+                         >> SE.put link_command 
+                         >> SE.put link_render
+                         >> SE.put link_pos
+                         >> SE.put link_dim
+                    
+    get = do tag <- SE.getWord8 
+             case tag of 
+               0 -> Link      <$> SE.get <*> SE.get <*> SE.get <*> SE.get <*> SE.get 
+                              <*> SE.get <*> SE.get <*> SE.get
+               1 -> LinkDocID <$> SE.get <*> SE.get <*> SE.get <*> SE.get <*> SE.get 
+                              <*> SE.get <*> SE.get <*> SE.get
+               _ -> fail "err in Link parsing"
+
+
+-- | 
+instance SE.Serialize Item where
+    put (ItemStroke str) = SE.putWord8 0 
+                           >> SE.put str 
+    put (ItemImage img) = SE.putWord8 1 
+                          >> SE.put img
+    put (ItemSVG svg) = SE.putWord8 2
+                        >> SE.put svg 
+    put (ItemLink lnk) = SE.putWord8 3
+                         >> SE.put lnk                         
+    get = do tag <- SE.getWord8 
+             case tag of 
+               0 -> ItemStroke <$> SE.get
+               1 -> ItemImage <$> SE.get
+               2 -> ItemSVG <$> SE.get
+               3 -> ItemLink <$> SE.get
+               _ -> fail "err in Item parsing"
+
+-- |    
+instance (SE.Serialize a, SE.Serialize b) => SE.Serialize (Pair a b) where
+    put (x :!: y) = SE.put x
+                    >> SE.put y
+    get = (:!:) <$> SE.get <*> SE.get
+
+    
+-- | 
+data Dimension = Dim { dim_width :: !Double, dim_height :: !Double }
+               deriving (Show,Eq,Ord)
+
+-- | 
+instance SE.Serialize Dimension where 
+  put (Dim w h) = SE.put w >> SE.put h 
+  get = Dim <$> SE.get <*> SE.get
+
+-- | 
+data Background = Background { bkg_type :: !ByteString 
+                             , bkg_color :: !ByteString 
+                             , bkg_style :: !ByteString 
+                             }
+                | BackgroundPdf { bkg_type :: ByteString 
+                                , bkg_domain :: Maybe ByteString
+                                , bkg_filename :: Maybe ByteString
+                                , bkg_pageno :: Int
+                                }
+                | BackgroundEmbedPdf { bkg_type :: ByteString
+                                     , bkg_pageno :: Int } 
+                deriving Show 
+-- | 
+data Revision = Revision { _revmd5 :: !ByteString 
+                         , _revtxt :: !ByteString 
+                         }  
+              | RevisionInk { _revmd5 :: !ByteString
+                            , _revink :: [Stroke] } 
+              deriving Show 
+
+-- | 
+data Hoodle = Hoodle { hoodle_id :: ByteString
+                     , hoodle_title :: !Title
+                     , hoodle_revisions :: [Revision]
+                     , hoodle_embeddedpdf :: Maybe ByteString
+                     , hoodle_pages :: ![Page] }
+             deriving Show 
+
+-- | 
+data Page = Page { page_dim :: !Dimension
+                 , page_bkg :: !Background 
+                 , page_layers :: ![Layer] }
+          deriving Show 
+
+-- | 
+data Layer = Layer { layer_items :: ![Item] } 
+           deriving Show 
+
+-- | 
+getXYtuples :: Stroke -> [(Double,Double)]
+getXYtuples (Stroke _t _c _w d) = map (\(x :!: y) -> (x,y)) d
+getXYtuples (VWStroke _t _c d) = map ((,)<$>fst3<*>snd3) d 
+
+
+----------------------------
+-- Lenses
+----------------------------
+
+-- | 
+tool :: Simple Lens Stroke ByteString
+tool = lens stroke_tool (\f a -> f { stroke_tool = a })  
+
+-- | 
+color :: Simple Lens Stroke ByteString 
+color = lens stroke_color (\f a -> f { stroke_color = a } )
+
+-- |
+hoodleID :: Simple Lens Hoodle ByteString 
+hoodleID = lens hoodle_id (\f a -> f { hoodle_id = a } )
+
+-- | 
+title :: Simple Lens Hoodle Title
+title = lens hoodle_title (\f a -> f { hoodle_title = a } )
+
+-- | 
+revisions :: Simple Lens Hoodle [Revision]
+revisions = lens hoodle_revisions (\f a -> f { hoodle_revisions = a } )
+
+-- | 
+revmd5 :: Simple Lens Revision ByteString
+revmd5 = lens _revmd5 (\f a -> f { _revmd5 = a } )
+
+-- | 
+embeddedPdf :: Simple Lens Hoodle (Maybe ByteString)
+embeddedPdf = lens hoodle_embeddedpdf (\f a -> f { hoodle_embeddedpdf = a} )
+
+-- | 
+pages :: Simple Lens Hoodle [Page]
+pages = lens hoodle_pages (\f a -> f { hoodle_pages = a } )
+
+-- | 
+dimension :: Simple Lens Page Dimension 
+dimension = lens page_dim (\f a -> f { page_dim = a } )
+
+-- | 
+background :: Simple Lens Page Background 
+background = lens page_bkg (\f a -> f { page_bkg = a } )
+
+-- | 
+layers :: Simple Lens Page [Layer] 
+layers = lens page_layers (\f a -> f { page_layers = a } )
+
+-- | 
+items :: Simple Lens Layer [Item]
+items = lens layer_items (\f a -> f { layer_items = a } )
+
+
+--------------------------
+-- empty objects
+--------------------------
+
+-- | 
+emptyHoodle :: IO Hoodle
+emptyHoodle = do
+  uuid <- nextRandom
+  return $ Hoodle ((pack.show) uuid) "" [] Nothing [] 
+
+-- | 
+emptyLayer :: Layer 
+emptyLayer = Layer { layer_items = [] } 
+
+-- | 
+emptyStroke :: Stroke 
+emptyStroke = Stroke "pen" "black" 1.4 []
+
+-- | 
+defaultBackground :: Background
+defaultBackground = Background { bkg_type = "solid"
+                               , bkg_color = "white"
+                               , bkg_style = "lined" 
+                               }
+
+-- | 
+defaultPage :: Page
+defaultPage = Page { page_dim = Dim  612.0 792.0 
+                   , page_bkg = defaultBackground
+                   , page_layers = [ emptyLayer ] 
+                   } 
+
+-- | 
+defaultHoodle :: IO Hoodle 
+defaultHoodle = 
+    (set title "untitled".set embeddedPdf Nothing . set pages [defaultPage])
+    <$> emptyHoodle 
+
+-- | 
+newPageFromOld :: Page -> Page
+newPageFromOld page = 
+  Page { page_dim = page_dim page 
+       , page_bkg = page_bkg page 
+       , page_layers = [emptyLayer] } 
+                   
+
