diff --git a/hoodle-parser.cabal b/hoodle-parser.cabal
--- a/hoodle-parser.cabal
+++ b/hoodle-parser.cabal
@@ -1,5 +1,5 @@
 Name:		hoodle-parser
-Version:	0.3
+Version:	0.3.0
 Synopsis:       Hoodle file parser
 Description: 	Text parser for hoodle xml file
 Homepage:       http://ianwookim.org/hoodle
@@ -26,17 +26,20 @@
                  bytestring >= 0.9, 
                  containers >= 0.4, 
                  strict >= 0.3, 
-                 hoodle-types >= 0.3, 
-                 xournal-types >= 0.5.0.2,
+                 hoodle-types >= 0.3.0, 
+                 xournal-types >= 0.5.1,
                  text >= 0.11,
                  lens >= 2.5, 
                  either >= 3.1
   Exposed-Modules: 
                    Text.Hoodle.Migrate.FromXournal
-                   Text.Hoodle.Migrate.V0_1_1_to_V0_2
+                   Text.Hoodle.Migrate.V0_1_1_to_V0_2_2
+                   Text.Hoodle.Migrate.V0_2_2_to_V0_3
+                   Text.Hoodle.Migrate.V0_3_to_HEAD
                    Text.Hoodle.Parse.Attoparsec
                    Text.Hoodle.Parse.Attoparsec.V0_1_1
                    Text.Hoodle.Parse.Attoparsec.V0_2_2
+                   Text.Hoodle.Parse.Attoparsec.V0_3
                    Text.Hoodle.Parse.Zlib
                    Text.Hoodlet.Parse.Attoparsec
 
diff --git a/src/Text/Hoodle/Migrate/V0_1_1_to_V0_2.hs b/src/Text/Hoodle/Migrate/V0_1_1_to_V0_2.hs
deleted file mode 100644
--- a/src/Text/Hoodle/Migrate/V0_1_1_to_V0_2.hs
+++ /dev/null
@@ -1,113 +0,0 @@
-{-# LANGUAGE OverloadedStrings, RecordWildCards #-}
-
------------------------------------------------------------------------------
--- |
--- Module      : Text.Hoodle.Migrate.V0_1_999_to_V0_2
--- Copyright   : (c) 2011-2013 Ian-Woo Kim
---
--- License     : BSD3
--- Maintainer  : Ian-Woo Kim <ianwookim@gmail.com>
--- Stability   : experimental
--- Portability : GHC
---
--- attoparsec implementation of hoodle parser
--- 
------------------------------------------------------------------------------
-
-module Text.Hoodle.Migrate.V0_1_1_to_V0_2 where
-
-import           Control.Applicative 
-import           Control.Lens
-import           Control.Monad.Trans
-import           Control.Monad.Trans.Either
-import           Data.Attoparsec
-import qualified Data.ByteString.Char8 as B
---
-import qualified Data.Hoodle.Simple.V0_1_1 as OH
-import qualified Data.Hoodle.Simple as NH
--- import qualified Text.Hoodle.Builder as NB
--- 
-import           Text.Hoodle.Parse.Attoparsec
-import qualified Text.Hoodle.Parse.Attoparsec.V0_1_1 as OP 
-
-page2Page :: OH.Page -> NH.Page
-page2Page OH.Page {..} = NH.Page { NH.page_dim = dim2Dim page_dim
-                                 , NH.page_bkg = bkg2Bkg page_bkg
-                                 , NH.page_layers = fmap layer2Layer page_layers } 
-
-dim2Dim :: OH.Dimension -> NH.Dimension 
-dim2Dim (OH.Dim w h) = NH.Dim w h 
-
-
-bkg2Bkg :: OH.Background -> NH.Background 
-bkg2Bkg OH.Background {..} = NH.Background { NH.bkg_type = bkg_type 
-                                           , NH.bkg_color = bkg_color
-                                           , NH.bkg_style = bkg_style }
-bkg2Bkg OH.BackgroundPdf {..} = NH.BackgroundPdf { NH.bkg_type = bkg_type
-                                                 , NH.bkg_domain = bkg_domain 
-                                                 , NH.bkg_filename = bkg_filename
-                                              ,   NH.bkg_pageno = bkg_pageno } 
--- bkg2Bkg OH.BackgroundEmbedPdf {..} = NH.BackgroundEmbedPdf { NH.bkg_type = bkg_type
---                                                            , NH.bkg_pageno = bkg_pageno }
-
-
-item2Item :: OH.Item -> NH.Item 
-item2Item (OH.ItemStroke strk) = NH.ItemStroke (stroke2Stroke strk)
-item2Item (OH.ItemImage image) = NH.ItemImage (image2Image image)
-item2Item (OH.ItemSVG svg) = NH.ItemSVG (svg2SVG svg)
--- item2Item (OH.ItemLink lnk) = NH.ItemLink (link2Link lnk)
-
-stroke2Stroke :: OH.Stroke -> NH.Stroke
-stroke2Stroke OH.Stroke {..} = NH.Stroke { NH.stroke_tool = stroke_tool 
-                                         , NH.stroke_color = stroke_color
-                                         , NH.stroke_width = stroke_width
-                                         , NH.stroke_data = stroke_data } 
-stroke2Stroke OH.VWStroke {..} = NH.VWStroke { NH.stroke_tool = stroke_tool 
-                                             , NH.stroke_color = stroke_color
-                                             , NH.stroke_vwdata = stroke_vwdata } 
-
-image2Image :: OH.Image -> NH.Image
-image2Image OH.Image {..} = NH.Image { NH.img_src = img_src 
-                                     , NH.img_pos = img_pos
-                                     , NH.img_dim = dim2Dim img_dim } 
-
-svg2SVG :: OH.SVG -> NH.SVG
-svg2SVG OH.SVG {..} = NH.SVG { NH.svg_text = svg_text
-                             , NH.svg_command = svg_command 
-                             , NH.svg_render = svg_render 
-                             , NH.svg_pos = svg_pos 
-                             , NH.svg_dim = dim2Dim svg_dim } 
-
-{- 
-link2Link :: OH.Link -> NH.Link
-link2Link OH.Link {..} = NH.Link { NH.link_id = link_id 
-                                 , NH.link_type = link_type
-                                 , NH.link_location = link_location
-                                 , NH.link_text = link_text
-                                 , NH.link_command = link_command
-                                 , NH.link_render = link_render
-                                 , NH.link_pos = link_pos
-                                 , NH.link_dim = dim2Dim link_dim }
--}                                                 
-                                                     
-layer2Layer :: OH.Layer -> NH.Layer
-layer2Layer OH.Layer {..} = NH.Layer { NH.layer_items = fmap item2Item layer_items } 
-
-
-migrate :: B.ByteString -> IO (Either String NH.Hoodle)
-migrate bstr = do 
-  runEitherT $ do 
-    v <- hoistEither (parseOnly checkHoodleVersion bstr)
-    if v <= "0.1.1" 
-      then do  
-        oh <- hoistEither (parseOnly OP.hoodle bstr)
-        let ttl = view OH.title oh 
-            pgs = (fmap page2Page . view OH.pages) oh 
-        set NH.title ttl . set NH.pages pgs <$> lift NH.emptyHoodle 
-      else 
-        hoistEither (parseOnly hoodle bstr)
-
-            -- pdf = view OH.embeddedPdf oh 
-{- . set NH.embeddedPdf pdf -}
-
-
diff --git a/src/Text/Hoodle/Migrate/V0_1_1_to_V0_2_2.hs b/src/Text/Hoodle/Migrate/V0_1_1_to_V0_2_2.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Hoodle/Migrate/V0_1_1_to_V0_2_2.hs
@@ -0,0 +1,109 @@
+{-# LANGUAGE OverloadedStrings, RecordWildCards #-}
+
+-----------------------------------------------------------------------------
+-- |
+-- Module      : Text.Hoodle.Migrate.V0_1_1_to_V0_2_2
+-- Copyright   : (c) 2011-2015 Ian-Woo Kim
+--
+-- License     : BSD3
+-- Maintainer  : Ian-Woo Kim <ianwookim@gmail.com>
+-- Stability   : experimental
+-- Portability : GHC
+--
+-- attoparsec implementation of hoodle parser
+-- 
+-----------------------------------------------------------------------------
+
+module Text.Hoodle.Migrate.V0_1_1_to_V0_2_2 where
+
+import           Control.Applicative 
+import           Control.Lens
+import           Control.Monad.Trans
+import           Control.Monad.Trans.Either
+import           Data.Attoparsec.ByteString
+import qualified Data.ByteString.Char8 as B
+--
+import qualified Data.Hoodle.Simple.V0_1_1 as OH
+import qualified Data.Hoodle.Simple.V0_2_2 as NH
+-- 
+import qualified Text.Hoodle.Parse.Attoparsec.V0_1_1 as OP 
+import qualified Text.Hoodle.Parse.Attoparsec.V0_2_2 as NP
+
+page2Page :: OH.Page -> NH.Page
+page2Page OH.Page {..} = NH.Page { NH.page_dim = dim2Dim page_dim
+                                 , NH.page_bkg = bkg2Bkg page_bkg
+                                 , NH.page_layers = fmap layer2Layer page_layers } 
+
+dim2Dim :: OH.Dimension -> NH.Dimension 
+dim2Dim (OH.Dim w h) = NH.Dim w h 
+
+
+bkg2Bkg :: OH.Background -> NH.Background 
+bkg2Bkg OH.Background {..} = NH.Background { NH.bkg_type = bkg_type 
+                                           , NH.bkg_color = bkg_color
+                                           , NH.bkg_style = bkg_style }
+bkg2Bkg OH.BackgroundPdf {..} = NH.BackgroundPdf { NH.bkg_type = bkg_type
+                                                 , NH.bkg_domain = bkg_domain 
+                                                 , NH.bkg_filename = bkg_filename
+                                              ,   NH.bkg_pageno = bkg_pageno } 
+
+
+item2Item :: OH.Item -> NH.Item 
+item2Item (OH.ItemStroke strk) = NH.ItemStroke (stroke2Stroke strk)
+item2Item (OH.ItemImage image) = NH.ItemImage (image2Image image)
+item2Item (OH.ItemSVG svg) = NH.ItemSVG (svg2SVG svg)
+
+stroke2Stroke :: OH.Stroke -> NH.Stroke
+stroke2Stroke OH.Stroke {..} = NH.Stroke { NH.stroke_tool = stroke_tool 
+                                         , NH.stroke_color = stroke_color
+                                         , NH.stroke_width = stroke_width
+                                         , NH.stroke_data = stroke_data } 
+stroke2Stroke OH.VWStroke {..} = NH.VWStroke { NH.stroke_tool = stroke_tool 
+                                             , NH.stroke_color = stroke_color
+                                             , NH.stroke_vwdata = stroke_vwdata } 
+
+image2Image :: OH.Image -> NH.Image
+image2Image OH.Image {..} = NH.Image { NH.img_src = img_src 
+                                     , NH.img_pos = img_pos
+                                     , NH.img_dim = dim2Dim img_dim } 
+
+svg2SVG :: OH.SVG -> NH.SVG
+svg2SVG OH.SVG {..} = NH.SVG { NH.svg_text = svg_text
+                             , NH.svg_command = svg_command 
+                             , NH.svg_render = svg_render 
+                             , NH.svg_pos = svg_pos 
+                             , NH.svg_dim = dim2Dim svg_dim } 
+
+{- 
+link2Link :: OH.Link -> NH.Link
+link2Link OH.Link {..} = NH.Link { NH.link_id = link_id 
+                                 , NH.link_type = link_type
+                                 , NH.link_location = link_location
+                                 , NH.link_text = link_text
+                                 , NH.link_command = link_command
+                                 , NH.link_render = link_render
+                                 , NH.link_pos = link_pos
+                                 , NH.link_dim = dim2Dim link_dim }
+-}                                                 
+                                                     
+layer2Layer :: OH.Layer -> NH.Layer
+layer2Layer OH.Layer {..} = NH.Layer { NH.layer_items = fmap item2Item layer_items } 
+
+
+migrate :: B.ByteString -> IO (Either String NH.Hoodle)
+migrate bstr = do 
+  runEitherT $ do 
+    v <- hoistEither (parseOnly NP.checkHoodleVersion bstr)
+    if v <= "0.1.1" 
+      then do  
+        oh <- hoistEither (parseOnly OP.hoodle bstr)
+        let ttl = view OH.title oh 
+            pgs = (fmap page2Page . view OH.pages) oh 
+        set NH.title ttl . set NH.pages pgs <$> lift NH.emptyHoodle 
+      else 
+        hoistEither (parseOnly NP.hoodle bstr)
+
+            -- pdf = view OH.embeddedPdf oh 
+{- . set NH.embeddedPdf pdf -}
+
+
diff --git a/src/Text/Hoodle/Migrate/V0_2_2_to_V0_3.hs b/src/Text/Hoodle/Migrate/V0_2_2_to_V0_3.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Hoodle/Migrate/V0_2_2_to_V0_3.hs
@@ -0,0 +1,140 @@
+{-# LANGUAGE MultiWayIf #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+
+-----------------------------------------------------------------------------
+-- |
+-- Module      : Text.Hoodle.Migrate.V0_2_2_to_V0_3
+-- Copyright   : (c) 2011-2015 Ian-Woo Kim
+--
+-- License     : BSD3
+-- Maintainer  : Ian-Woo Kim <ianwookim@gmail.com>
+-- Stability   : experimental
+-- Portability : GHC
+--
+-- attoparsec implementation of hoodle parser
+-- 
+-----------------------------------------------------------------------------
+
+module Text.Hoodle.Migrate.V0_2_2_to_V0_3 where
+
+import           Control.Applicative 
+import           Control.Lens
+import           Control.Monad.Trans
+import           Control.Monad.Trans.Either
+import           Data.Attoparsec.ByteString
+import qualified Data.ByteString.Char8 as B
+--
+import qualified Data.Hoodle.Simple.V0_2_2 as OH
+import qualified Data.Hoodle.Simple.V0_3 as NH
+-- 
+import qualified Text.Hoodle.Migrate.V0_1_1_to_V0_2_2
+import qualified Text.Hoodle.Parse.Attoparsec.V0_2_2 as OP 
+import qualified Text.Hoodle.Parse.Attoparsec.V0_3 as NP
+
+
+
+dim2Dim :: OH.Dimension -> NH.Dimension 
+dim2Dim (OH.Dim w h) = NH.Dim w h 
+
+
+bkg2Bkg :: OH.Background -> NH.Background 
+bkg2Bkg OH.Background {..} = NH.Background { NH.bkg_type = bkg_type 
+                                           , NH.bkg_color = bkg_color
+                                           , NH.bkg_style = bkg_style }
+bkg2Bkg OH.BackgroundPdf {..} = NH.BackgroundPdf { NH.bkg_type = bkg_type
+                                                 , NH.bkg_domain = bkg_domain 
+                                                 , NH.bkg_filename = bkg_filename
+                                              ,   NH.bkg_pageno = bkg_pageno } 
+bkg2Bkg OH.BackgroundEmbedPdf {..} = NH.BackgroundEmbedPdf { NH.bkg_type = bkg_type
+                                                           , NH.bkg_pageno = bkg_pageno }
+
+
+item2Item :: OH.Item -> NH.Item 
+item2Item (OH.ItemStroke strk) = NH.ItemStroke (stroke2Stroke strk)
+item2Item (OH.ItemImage image) = NH.ItemImage (image2Image image)
+item2Item (OH.ItemSVG svg) = NH.ItemSVG (svg2SVG svg)
+item2Item (OH.ItemLink lnk) = NH.ItemLink (link2Link lnk)
+
+stroke2Stroke :: OH.Stroke -> NH.Stroke
+stroke2Stroke OH.Stroke {..} = NH.Stroke { NH.stroke_tool = stroke_tool 
+                                         , NH.stroke_color = stroke_color
+                                         , NH.stroke_width = stroke_width
+                                         , NH.stroke_data = stroke_data } 
+stroke2Stroke OH.VWStroke {..} = NH.VWStroke { NH.stroke_tool = stroke_tool 
+                                             , NH.stroke_color = stroke_color
+                                             , NH.stroke_vwdata = stroke_vwdata } 
+
+image2Image :: OH.Image -> NH.Image
+image2Image OH.Image {..} = NH.Image { NH.img_src = img_src 
+                                     , NH.img_pos = img_pos
+                                     , NH.img_dim = dim2Dim img_dim } 
+
+svg2SVG :: OH.SVG -> NH.SVG
+svg2SVG OH.SVG {..} = NH.SVG { NH.svg_text = svg_text
+                             , NH.svg_command = svg_command 
+                             , NH.svg_render = svg_render 
+                             , NH.svg_pos = svg_pos 
+                             , NH.svg_dim = dim2Dim svg_dim } 
+
+
+link2Link :: OH.Link -> NH.Link
+link2Link OH.Link {..}      = NH.Link      { NH.link_id = link_id 
+                                           , NH.link_type = link_type
+                                           , NH.link_location = link_location
+                                           , NH.link_text = link_text
+                                           , NH.link_command = link_command
+                                           , NH.link_render = link_render
+                                           , NH.link_pos = link_pos
+                                           , NH.link_dim = dim2Dim link_dim }
+link2Link OH.LinkDocID {..} = NH.LinkDocID { NH.link_id = link_id 
+                                           , NH.link_linkeddocid = link_linkeddocid
+                                           , NH.link_location = link_location
+                                           , NH.link_text = link_text
+                                           , NH.link_command = link_command
+                                           , NH.link_render = link_render
+                                           , NH.link_pos = link_pos
+                                           , NH.link_dim = dim2Dim link_dim }
+
+
+                                                     
+layer2Layer :: OH.Layer -> NH.Layer
+layer2Layer OH.Layer {..} = NH.Layer { NH.layer_items = fmap item2Item layer_items } 
+
+page2Page :: OH.Page -> NH.Page
+page2Page OH.Page {..} = NH.Page { NH.page_dim = dim2Dim page_dim
+                                 , NH.page_bkg = bkg2Bkg page_bkg
+                                 , NH.page_layers = fmap layer2Layer page_layers } 
+
+rev2Rev :: OH.Revision -> NH.Revision
+rev2Rev OH.Revision {..} = NH.Revision { NH._revmd5 = _revmd5 
+                                       , NH._revtxt = _revtxt }
+rev2Rev OH.RevisionInk {..} = NH.RevisionInk { NH._revmd5 = _revmd5 
+                                             , NH._revink = map stroke2Stroke _revink }
+
+hoodle2Hoodle :: OH.Hoodle -> IO NH.Hoodle
+hoodle2Hoodle oh =  set NH.hoodleID  (view OH.hoodleID oh)
+                  . set NH.title     (view OH.title oh)
+                  . set NH.revisions (map rev2Rev (view OH.revisions oh))
+                  . set NH.embeddedPdf (view OH.embeddedPdf oh)
+                  . set NH.pages ((fmap page2Page . view OH.pages) oh)
+                  <$> NH.emptyHoodle 
+
+migrate :: B.ByteString -> IO (Either String NH.Hoodle)
+migrate bstr = do 
+  runEitherT $ do 
+    v <- hoistEither (parseOnly NP.checkHoodleVersion bstr)
+    if | v <= "0.1.1" -> do oh <- EitherT (Text.Hoodle.Migrate.V0_1_1_to_V0_2_2.migrate bstr)
+                            let ttl = view OH.title oh 
+                                pgs = (fmap page2Page . view OH.pages) oh 
+                            set NH.title ttl . set NH.pages pgs <$> lift NH.emptyHoodle 
+       | v <= "0.2.2" && v > "0.1.1" ->
+                         do oh <- hoistEither (parseOnly OP.hoodle bstr)
+                            lift (hoodle2Hoodle oh)
+       | otherwise -> hoistEither (parseOnly NP.hoodle bstr)
+
+
+            -- pdf = view OH.embeddedPdf oh 
+{- . set NH.embeddedPdf pdf -}
+
+
diff --git a/src/Text/Hoodle/Migrate/V0_3_to_HEAD.hs b/src/Text/Hoodle/Migrate/V0_3_to_HEAD.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Hoodle/Migrate/V0_3_to_HEAD.hs
@@ -0,0 +1,129 @@
+{-# LANGUAGE MultiWayIf #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+
+-----------------------------------------------------------------------------
+-- |
+-- Module      : Text.Hoodle.Migrate.V0_3_to_HEAD
+-- Copyright   : (c) 2011-2015 Ian-Woo Kim
+--
+-- License     : BSD3
+-- Maintainer  : Ian-Woo Kim <ianwookim@gmail.com>
+-- Stability   : experimental
+-- Portability : GHC
+--
+-- attoparsec implementation of hoodle parser
+-- 
+-----------------------------------------------------------------------------
+
+module Text.Hoodle.Migrate.V0_3_to_HEAD where
+
+import           Control.Applicative 
+import           Control.Lens
+--
+import qualified Data.Hoodle.Simple.V0_3 as OH
+import qualified Data.Hoodle.Simple as NH
+-- 
+
+
+dim2Dim :: OH.Dimension -> NH.Dimension 
+dim2Dim (OH.Dim w h) = NH.Dim w h 
+
+
+bkg2Bkg :: OH.Background -> NH.Background 
+bkg2Bkg OH.Background {..} = NH.Background { NH.bkg_type = bkg_type 
+                                           , NH.bkg_color = bkg_color
+                                           , NH.bkg_style = bkg_style }
+bkg2Bkg OH.BackgroundPdf {..} = NH.BackgroundPdf { NH.bkg_type = bkg_type
+                                                 , NH.bkg_domain = bkg_domain 
+                                                 , NH.bkg_filename = bkg_filename
+                                              ,   NH.bkg_pageno = bkg_pageno } 
+bkg2Bkg OH.BackgroundEmbedPdf {..} = NH.BackgroundEmbedPdf { NH.bkg_type = bkg_type
+                                                           , NH.bkg_pageno = bkg_pageno }
+
+
+item2Item :: OH.Item -> NH.Item 
+item2Item (OH.ItemStroke strk) = NH.ItemStroke (stroke2Stroke strk)
+item2Item (OH.ItemImage image) = NH.ItemImage (image2Image image)
+item2Item (OH.ItemSVG svg) = NH.ItemSVG (svg2SVG svg)
+item2Item (OH.ItemLink lnk) = NH.ItemLink (link2Link lnk)
+item2Item (OH.ItemAnchor anchor) = NH.ItemAnchor (anchor2Anchor anchor)
+
+stroke2Stroke :: OH.Stroke -> NH.Stroke
+stroke2Stroke OH.Stroke {..} = NH.Stroke { NH.stroke_tool = stroke_tool 
+                                         , NH.stroke_color = stroke_color
+                                         , NH.stroke_width = stroke_width
+                                         , NH.stroke_data = stroke_data } 
+stroke2Stroke OH.VWStroke {..} = NH.VWStroke { NH.stroke_tool = stroke_tool 
+                                             , NH.stroke_color = stroke_color
+                                             , NH.stroke_vwdata = stroke_vwdata } 
+
+image2Image :: OH.Image -> NH.Image
+image2Image OH.Image {..} = NH.Image { NH.img_src = img_src 
+                                     , NH.img_pos = img_pos
+                                     , NH.img_dim = dim2Dim img_dim } 
+
+svg2SVG :: OH.SVG -> NH.SVG
+svg2SVG OH.SVG {..} = NH.SVG { NH.svg_text = svg_text
+                             , NH.svg_command = svg_command 
+                             , NH.svg_render = svg_render 
+                             , NH.svg_pos = svg_pos 
+                             , NH.svg_dim = dim2Dim svg_dim } 
+
+
+link2Link :: OH.Link -> NH.Link
+link2Link OH.Link {..}      = NH.Link      { NH.link_id = link_id 
+                                           , NH.link_type = link_type
+                                           , NH.link_location = link_location
+                                           , NH.link_text = link_text
+                                           , NH.link_command = link_command
+                                           , NH.link_render = link_render
+                                           , NH.link_pos = link_pos
+                                           , NH.link_dim = dim2Dim link_dim }
+link2Link OH.LinkDocID {..} = NH.LinkDocID { NH.link_id = link_id 
+                                           , NH.link_linkeddocid = link_linkeddocid
+                                           , NH.link_location = link_location
+                                           , NH.link_text = link_text
+                                           , NH.link_command = link_command
+                                           , NH.link_render = link_render
+                                           , NH.link_pos = link_pos
+                                           , NH.link_dim = dim2Dim link_dim }
+link2Link OH.LinkAnchor {..} = NH.LinkAnchor { NH.link_id = link_id
+                                             , NH.link_linkeddocid = link_linkeddocid
+                                             , NH.link_location = link_location
+                                             , NH.link_anchorid = link_anchorid
+                                             , NH.link_render = link_render
+                                             , NH.link_pos = link_pos
+                                             , NH.link_dim = dim2Dim link_dim }
+
+
+anchor2Anchor :: OH.Anchor -> NH.Anchor
+anchor2Anchor OH.Anchor {..} = NH.Anchor { NH.anchor_id = anchor_id
+                                         , NH.anchor_render = anchor_render
+                                         , NH.anchor_pos = anchor_pos
+                                         , NH.anchor_dim = dim2Dim anchor_dim }
+                                                     
+layer2Layer :: OH.Layer -> NH.Layer
+layer2Layer OH.Layer {..} = NH.Layer { NH.layer_items = fmap item2Item layer_items } 
+
+page2Page :: OH.Page -> NH.Page
+page2Page OH.Page {..} = NH.Page { NH.page_dim = dim2Dim page_dim
+                                 , NH.page_bkg = bkg2Bkg page_bkg
+                                 , NH.page_layers = fmap layer2Layer page_layers } 
+
+rev2Rev :: OH.Revision -> NH.Revision
+rev2Rev OH.Revision {..} = NH.Revision { NH._revmd5 = _revmd5 
+                                       , NH._revtxt = _revtxt }
+rev2Rev OH.RevisionInk {..} = NH.RevisionInk { NH._revmd5 = _revmd5 
+                                             , NH._revink = map stroke2Stroke _revink }
+
+hoodle2Hoodle :: OH.Hoodle -> IO NH.Hoodle
+hoodle2Hoodle oh =  set NH.hoodleID  (view OH.hoodleID oh)
+                  . set NH.title     (view OH.title oh)
+                  . set NH.revisions (map rev2Rev (view OH.revisions oh))
+                  . set NH.embeddedPdf (view OH.embeddedPdf oh)
+                  . set NH.embeddedText (view OH.embeddedText oh)
+                  . set NH.pages ((fmap page2Page . view OH.pages) oh)
+                  <$> NH.emptyHoodle 
+
+
diff --git a/src/Text/Hoodle/Parse/Attoparsec.hs b/src/Text/Hoodle/Parse/Attoparsec.hs
--- a/src/Text/Hoodle/Parse/Attoparsec.hs
+++ b/src/Text/Hoodle/Parse/Attoparsec.hs
@@ -4,7 +4,7 @@
 -----------------------------------------------------------------------------
 -- |
 -- Module      : Text.Hoodle.Parse.Attoparsec
--- Copyright   : (c) 2011-2014 Ian-Woo Kim
+-- Copyright   : (c) 2011-2015 Ian-Woo Kim
 --
 -- License     : BSD3
 -- Maintainer  : Ian-Woo Kim <ianwookim@gmail.com>
@@ -18,9 +18,10 @@
 module Text.Hoodle.Parse.Attoparsec where
 
 import           Control.Applicative 
-import           Data.Attoparsec
-import           Data.Attoparsec.Char8 ( char, decimal, double, skipSpace
-                                       , isHorizontalSpace, anyChar)
+import           Data.Attoparsec.ByteString
+import           Data.Attoparsec.ByteString.Char8 ( char, decimal, double
+                                                  , skipSpace
+                                                  , isHorizontalSpace, anyChar)
 import qualified Data.ByteString.Char8 as B hiding (map) 
 import           Data.Char 
 import           Data.Strict.Tuple
diff --git a/src/Text/Hoodle/Parse/Attoparsec/V0_1_1.hs b/src/Text/Hoodle/Parse/Attoparsec/V0_1_1.hs
--- a/src/Text/Hoodle/Parse/Attoparsec/V0_1_1.hs
+++ b/src/Text/Hoodle/Parse/Attoparsec/V0_1_1.hs
@@ -3,7 +3,7 @@
 -----------------------------------------------------------------------------
 -- |
 -- Module      : Text.Hoodle.Parse.Attoparsec.V0_1_1
--- Copyright   : (c) 2011-2013 Ian-Woo Kim
+-- Copyright   : (c) 2011-2015 Ian-Woo Kim
 --
 -- License     : BSD3
 -- Maintainer  : Ian-Woo Kim <ianwookim@gmail.com>
@@ -17,9 +17,10 @@
 module Text.Hoodle.Parse.Attoparsec.V0_1_1 where
 
 import           Control.Applicative 
-import           Data.Attoparsec
-import           Data.Attoparsec.Char8 ( char, decimal, double, skipSpace
-                                      , isHorizontalSpace, anyChar)
+import           Data.Attoparsec.ByteString
+import           Data.Attoparsec.ByteString.Char8 ( char, decimal, double
+                                                  , skipSpace
+                                                  , isHorizontalSpace, anyChar)
 import qualified Data.ByteString.Char8 as B hiding (map) 
 import           Data.Char 
 import           Data.Strict.Tuple
diff --git a/src/Text/Hoodle/Parse/Attoparsec/V0_2_2.hs b/src/Text/Hoodle/Parse/Attoparsec/V0_2_2.hs
--- a/src/Text/Hoodle/Parse/Attoparsec/V0_2_2.hs
+++ b/src/Text/Hoodle/Parse/Attoparsec/V0_2_2.hs
@@ -3,7 +3,7 @@
 -----------------------------------------------------------------------------
 -- |
 -- Module      : Text.Hoodle.Parse.Attoparsec.V0_2_2
--- Copyright   : (c) 2011-2014 Ian-Woo Kim
+-- Copyright   : (c) 2011-2015 Ian-Woo Kim
 --
 -- License     : BSD3
 -- Maintainer  : Ian-Woo Kim <ianwookim@gmail.com>
@@ -17,9 +17,10 @@
 module Text.Hoodle.Parse.Attoparsec.V0_2_2 where
 
 import           Control.Applicative 
-import           Data.Attoparsec
-import           Data.Attoparsec.Char8 ( char, decimal, double, skipSpace
-                                      , isHorizontalSpace, anyChar)
+import           Data.Attoparsec.ByteString
+import           Data.Attoparsec.ByteString.Char8 ( char, decimal, double
+                                                  , skipSpace
+                                                  , isHorizontalSpace, anyChar)
 import qualified Data.ByteString.Char8 as B hiding (map) 
 import           Data.Char 
 import           Data.Strict.Tuple
diff --git a/src/Text/Hoodle/Parse/Attoparsec/V0_3.hs b/src/Text/Hoodle/Parse/Attoparsec/V0_3.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Hoodle/Parse/Attoparsec/V0_3.hs
@@ -0,0 +1,594 @@
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE MultiWayIf #-}
+
+-----------------------------------------------------------------------------
+-- |
+-- Module      : Text.Hoodle.Parse.Attoparsec.V0_3
+-- Copyright   : (c) 2011-2015 Ian-Woo Kim
+--
+-- License     : BSD3
+-- Maintainer  : Ian-Woo Kim <ianwookim@gmail.com>
+-- Stability   : experimental
+-- Portability : GHC
+--
+-- attoparsec implementation of hoodle parser
+-- 
+-----------------------------------------------------------------------------
+
+module Text.Hoodle.Parse.Attoparsec.V0_3 where
+
+import           Control.Applicative 
+import           Data.Attoparsec.ByteString
+import           Data.Attoparsec.ByteString.Char8 ( char, decimal, double
+                                                  , skipSpace
+                                                  , isHorizontalSpace, anyChar)
+import qualified Data.ByteString.Char8 as B hiding (map) 
+import           Data.Char 
+import           Data.Strict.Tuple
+import qualified Data.Text as T
+import qualified Data.Text.Encoding as TE 
+-- from hoodle-platform 
+import qualified Data.Hoodle.Simple.V0_3 as H
+-- 
+import Prelude hiding (takeWhile)
+
+-- |
+skipSpaces :: Parser () 
+skipSpaces = satisfy isHorizontalSpace *> skipWhile isHorizontalSpace
+
+-- | 
+trim_starting_space :: Parser ()
+trim_starting_space = do try endOfInput
+                         <|> takeWhile (inClass " \n") *> return ()
+                
+-- | 
+langle :: Parser Char 
+langle = char '<'
+
+-- | 
+rangle :: Parser Char 
+rangle = char '>'
+
+-- | 
+xmlheader :: Parser B.ByteString
+xmlheader = string "<?" *> takeTill (inClass "?>") <* string "?>"
+                 
+-- | 
+headercontentWorker :: B.ByteString -> Parser B.ByteString 
+headercontentWorker  bstr = do 
+  h <- takeWhile1 (notInClass "?>") 
+  ((string "?>" >>= return . (bstr `B.append` h `B.append`))
+   <|> headercontentWorker (bstr `B.append` h))
+
+-- | 
+headercontent :: Parser B.ByteString 
+headercontent = headercontentWorker B.empty
+                 
+-- | 
+data StrokeWidth = SingleWidth Double | VarWidth [Double] 
+
+
+-- | 
+data XmlStroke = XmlStroke { xstrk_tool :: B.ByteString  
+                           , xstrk_color :: B.ByteString
+                           , xstrk_width :: StrokeWidth
+                           , xstrk_xydata :: [Pair Double Double] }
+
+-- | 
+xmlstroketagopen :: Parser XmlStroke 
+xmlstroketagopen = do 
+  trim 
+  string "<stroke"
+  trim 
+  string "tool="
+  char '"'
+  tool <- alphabet 
+  char '"'
+  trim 
+  string "color="
+  char '"'
+  color <- alphanumsharp 
+  char '"'
+  trim 
+  string "width="
+  width <- strokewidth 
+  char '>' 
+  return $ XmlStroke tool color width []   
+
+strokewidth :: Parser StrokeWidth   
+strokewidth = do 
+    char '"'
+    wlst <- many $ do trim_starting_space
+                      w <- double
+                      skipSpace 
+                      return w
+    char '"'
+    let msw | length wlst == 1 = return (SingleWidth (head wlst)) 
+            | length wlst == 0 = fail "no width"
+            | otherwise = return (VarWidth wlst)
+    msw
+
+  
+-- | 
+xmlstroketagclose :: Parser ()
+xmlstroketagclose = string "</stroke>" >> return ()
+
+
+-- | 
+xmlstroke :: Parser XmlStroke                 
+xmlstroke = do 
+    trim 
+    strokeinit <- xmlstroketagopen
+    coordlist <- many $ do trim_starting_space
+                           x <- double
+                           skipSpace 
+                           y <- double
+                           skipSpace 
+                           return (x :!: y)  
+    xmlstroketagclose 
+    return $ strokeinit { xstrk_xydata = coordlist } 
+
+
+-- | 
+onestroke :: Parser H.Stroke 
+onestroke =  do 
+    xstrk <- xmlstroke 
+    let r = case xstrk_width xstrk of 
+              SingleWidth w -> (H.Stroke <$> xstrk_tool 
+                                 <*> xstrk_color 
+                                 <*> pure w 
+                                 <*> xstrk_xydata ) xstrk
+              VarWidth ws -> let xyz = mkXYZ (xstrk_xydata xstrk) ws
+                             in (H.VWStroke <$> xstrk_tool <*> xstrk_color   
+                                  <*> pure xyz) xstrk
+    return r 
+
+-- | 
+mkXYZ :: [Pair Double Double] -> [Double] -> [(Double,Double,Double)]
+mkXYZ = zipWith f where f (x :!: y) z = (x,y,z)
+
+-- |  
+img :: Parser H.Item 
+img = do trim 
+         string "<img"
+         trim 
+         string "src=\""
+         fsrc <- parseFileName 
+         char '"'
+         trim 
+         string "x=\""
+         posx <- double 
+         char '"'
+         trim
+         string "y=\""
+         posy <- double
+         char '"'
+         trim 
+         string "width=\""
+         width <- double
+         char '"'
+         trim 
+         string "height=\""
+         height <- double
+         char '"'
+         trim 
+         string "/>"
+         (return . H.ItemImage) (H.Image fsrc (posx,posy) (H.Dim width height))
+         
+
+svg_header :: Parser ((Double,Double),H.Dimension)
+svg_header = do trim 
+                string "<svgobject"
+                trim 
+                string "x=\""
+                posx <- double 
+                char '"'
+                trim
+                string "y=\""
+                posy <- double
+                char '"'
+                trim 
+                string "width=\""
+                width <- double
+                char '"'
+                trim 
+                string "height=\""
+                height <- double
+                char '"'
+                trim 
+                string ">"
+                return ((posx,posy),H.Dim width height) 
+
+svg_footer :: Parser () 
+svg_footer = string "</svgobject>" >> return ()
+
+textCDATA :: Parser B.ByteString 
+textCDATA = do 
+    string "<text>"
+    bstr <- getCDATA
+    -- str <- string "<![CDATA[" *> manyTill anyChar (try (string "]]>"))
+    string "</text>"
+    return bstr -- (B.pack str) 
+
+commandCDATA :: Parser B.ByteString 
+commandCDATA = do 
+    string "<command>"
+    bstr <- getCDATA
+    -- str <- string "<![CDATA[" *> manyTill anyChar (try (string "]]>"))
+    string "</command>"
+    return bstr -- (B.pack str)
+
+renderCDATA :: Parser B.ByteString 
+renderCDATA = do 
+    string "<render>"
+    bstr <- getCDATA
+    -- str <- string "<![CDATA[" *> manyTill anyChar (try (string "]]>"))
+    string "</render>"
+    return bstr -- (B.pack str)
+
+
+getCDATA :: Parser B.ByteString
+getCDATA = string "<![CDATA[" *> manyTill anyChar (try (string "]]>")) >>= return . B.pack 
+
+svg_obj :: Parser H.Item 
+svg_obj = do (xy,dim) <- svg_header
+             trim 
+             (mt,mc) <- (try (do t <- textCDATA 
+                                 trim 
+                                 c <- commandCDATA 
+                                 return (Just t, Just c)) 
+                         <|> try (textCDATA >>= \t -> return (Just t, Nothing))
+                         <|> return (Nothing,Nothing))
+             trim 
+             bstr <- renderCDATA 
+             trim 
+             svg_footer
+             (return . H.ItemSVG) (H.SVG mt mc bstr xy dim)
+
+                                  
+
+link_header :: Parser ( B.ByteString
+                      , B.ByteString
+                      , Maybe B.ByteString
+                      , B.ByteString
+                      , Maybe B.ByteString
+                      , (Double,Double),H.Dimension)
+link_header = do 
+    trim 
+    string "<link"
+    trim 
+    i <- B.pack <$> (string "id=\"" *> manyTill anyChar (try (char '"')))
+    trim 
+    typ <- B.pack <$> (string "type=\"" *> manyTill anyChar (try (char '"')))
+    trim 
+    mlid <- if | typ == "simple" -> return Nothing 
+               | typ == "linkdocid" || typ == "anchor" ->
+                   Just <$> (string "linkedid=\"" 
+                             *> takeTill (inClass "\"") 
+                             <* char '"')
+               | otherwise -> fail "unknown link type"
+    trim
+    loc <- if | typ == "simple" || typ == "linkdocid" || typ == "anchor" ->
+                  (string "location=\"" 
+                   *> takeTill (inClass "\"")
+                   <* char '"')
+              | otherwise -> fail "unknown link type"
+    trim
+    maid <- if | typ == "anchor" -> 
+                   Just <$> (string "anchorid=\""
+                             *> takeTill (inClass "\"")
+                             <* char '"')
+               | typ == "simple" || typ == "linkdocid" -> return Nothing
+               | otherwise -> fail "unknown link type"
+    trim
+    posx <- string "x=\"" *> double <* char '"'
+    trim
+    posy <- string "y=\"" *> double <* char '"'
+    trim 
+    width <- string "width=\"" *> double <* char '"'
+    trim 
+    height <- string "height=\"" *> double <* char '"'
+    trim 
+    string ">"
+    return (i,typ,mlid,loc,maid,(posx,posy),H.Dim width height) 
+
+link_footer :: Parser () 
+link_footer = string "</link>" >> return ()
+
+link :: Parser H.Item 
+link = do 
+    (i,typ,mlid,loc,maid,xy,dim) <- link_header
+    trim 
+    (mt,mc) <- (try (do t <- textCDATA 
+                        trim 
+                        c <- commandCDATA 
+                        return (Just t, Just c)) 
+                <|> try (textCDATA >>= \t -> return (Just t, Nothing))
+                <|> return (Nothing,Nothing))
+    trim 
+    bstr <- renderCDATA 
+    trim 
+    link_footer
+    let lnk | typ == "simple" = H.Link i typ loc mt mc bstr xy dim
+            | typ == "linkdocid" = 
+                maybe (error "no linkedid or location for linkdocid") 
+                      (\lid -> H.LinkDocID i lid loc mt mc bstr xy dim)
+                      mlid 
+            | typ == "anchor" = 
+                maybe (error "no linkedid for anchor")
+                      (\(lid,aid) -> H.LinkAnchor i lid loc aid bstr xy dim)
+                      ( mlid >>= \lid -> maid >>= \aid -> return (lid,aid))
+            | otherwise = error "link type is not recognized"
+    (return . H.ItemLink) lnk  
+
+anchor :: Parser H.Item
+anchor = do
+    trim 
+    string "<anchor"
+    trim
+    i <- B.pack <$> (string "id=\"" *> manyTill anyChar (try (char '"')))
+    trim
+    posx <- string "x=\"" *> double <* char '"'
+    trim
+    posy <- string "y=\"" *> double <* char '"'
+    trim
+    width <- string "width=\"" *> double <* char '"'
+    trim 
+    height <- string "height=\"" *> double <* char '"'
+    trim 
+    (try (string "/>" >>
+          return (H.ItemAnchor (H.Anchor i "" (posx,posy) (H.Dim width height))))
+     <|> (do string ">" 
+             trim
+             bstr <- renderCDATA 
+             trim
+             string "</anchor>" >> return ()
+             return . H.ItemAnchor $ (H.Anchor i bstr (posx,posy) (H.Dim width height))))
+    
+-- | 
+trim :: Parser ()
+trim = trim_starting_space
+
+-- | 
+checkHoodleVersion :: Parser B.ByteString
+checkHoodleVersion = do trim 
+                        xmlheader
+                        trim 
+                        hoodleheaderstart
+                        trim 
+                        hoodleversion 
+
+                  
+-- | 
+hoodle :: Parser H.Hoodle 
+hoodle  = do trim
+             xmlheader <?> "xmlheader"
+             trim
+             (_v,hid) <- hoodleheader <?> "hoodleheader"
+             trim
+             t <- title <?> "title"
+             trim
+             revs <- many (revision <?> "revision")
+             skipSpace
+             pdf <- (try (Just <$> embeddedpdf)
+                     <|> return Nothing )
+             txt <- (try (Just <$> embeddedtext)
+                     <|> return Nothing )
+             pgs <- many1 (page <?> "page")
+             trim
+             hoodleclose 
+             return $ H.Hoodle hid t revs pdf txt pgs 
+             
+page :: Parser H.Page 
+page = do trim 
+          dim <- pageheader
+          trim 
+          bkg <- background <?> "background"
+          trim 
+          layers <- many1 layer
+          trim
+          pageclose 
+          return $ H.Page dim bkg layers
+         
+          
+layer :: Parser H.Layer
+layer = do trim
+           layerheader <?> "layer"
+           trim
+           itms <- many (try (H.ItemStroke <$> onestroke) <|> try img <|> try svg_obj <|> try link <|> anchor)
+           trim
+           layerclose 
+           return $ H.Layer itms
+
+
+title :: Parser B.ByteString 
+title = do trim 
+           titleheader
+           str <- takeTill (inClass "<")
+           titleclose
+           return str 
+
+titleheader :: Parser B.ByteString          
+titleheader = string "<title>"
+
+titleclose :: Parser B.ByteString
+titleclose = string "</title>"
+
+revision :: Parser H.Revision 
+revision = do skipSpace
+              string "<revision" 
+              skipSpace 
+              string "revmd5=\""
+              md5str <- manyTill anyChar (try (char '"'))
+              skipSpace 
+              (try (do string "revtxt=\""
+                       txtstr <- manyTill anyChar (try (char '"')) 
+                       skipSpace
+                       string "/>"
+                       return (H.Revision (B.pack md5str) (B.pack txtstr)))
+               <|> (do string "type=\"ink\""
+                       skipSpace
+                       char '>'
+                       skipSpace
+                       strks <- many1 onestroke
+                       skipSpace
+                       string "</revision>"
+                       return (H.RevisionInk (B.pack md5str) strks)))
+
+embeddedpdf :: Parser (B.ByteString) 
+embeddedpdf = do string "<embeddedpdf" 
+                 trim 
+                 string "src=\""
+                 str <- manyTill anyChar (try (char '"'))
+                 trim 
+                 string "/>" 
+                 return (B.pack str)
+
+embeddedtext :: Parser (T.Text) 
+embeddedtext = do string "<embeddedtext>"
+                  bstr <- getCDATA
+                  string "</embeddedtext>" 
+                  return (TE.decodeUtf8 bstr)
+
+hoodleheader :: Parser (B.ByteString,B.ByteString)
+hoodleheader = do hoodleheaderstart 
+                  trim 
+                  v <- hoodleversion
+                  trim 
+                  hid <- hoodleid
+                  trim 
+                  char '>' 
+                  return (v,hid)
+
+hoodleheaderstart :: Parser B.ByteString 
+hoodleheaderstart = string "<hoodle"
+
+
+hoodleversion :: Parser B.ByteString 
+hoodleversion = string "version=\"" *> takeTill (inClass "\"") <* char '"'
+
+hoodleid :: Parser B.ByteString 
+hoodleid = string "id=\"" *> takeTill (inClass "\"") <* char '"'
+
+hoodleheaderend :: Parser Char
+hoodleheaderend = char '>'
+
+hoodleclose :: Parser B.ByteString
+hoodleclose =  string "</hoodle>"
+
+pageheader :: Parser H.Dimension 
+pageheader = do pageheaderstart  
+                trim
+                string "width=" 
+                char '"'
+                w <- double
+                char '"'
+                trim 
+                string "height="
+                char '"' 
+                h <- double 
+                char '"'
+                takeTill (inClass ">")
+                pageheaderend
+                return $ H.Dim w h
+                 
+pageheaderstart :: Parser B.ByteString
+pageheaderstart = string "<page"
+
+pageheaderend :: Parser Char
+pageheaderend = char '>'
+
+pageclose :: Parser B.ByteString                  
+pageclose = string "</page>"
+
+layerheader :: Parser B.ByteString
+layerheader = string "<layer>"
+
+layerclose :: Parser B.ByteString
+layerclose = string "</layer>"
+
+background :: Parser H.Background 
+background = do 
+    trim
+    backgroundheader
+    trim 
+    string "type=" 
+    char '"'
+    typ <- alphabet
+    char '"'
+    case typ of 
+      "solid" -> do 
+        trim 
+        string "color="
+        char '"' 
+        col <- alphanumsharp 
+        char '"'
+        trim 
+        string "style="
+        trim 
+        char '"'
+        sty <- alphabet 
+        char '"' 
+        trim 
+        takeTill (inClass "/>") 
+        backgroundclose
+        return $ H.Background typ col sty 
+      "pdf" -> do     
+        trim <?> "trim0"
+        (mdomain,mfilename) <- (try $ do  
+                                 string "domain="
+                                 char '"' 
+                                 domain <- alphabet 
+                                 char '"'
+                                 trim <?> "trim1"
+                                 string "filename="
+                                 trim <?> "trim2"
+                                 char '"'
+                                 filename <- parseFileName <?> "filename parse"
+                                 char '"' 
+                                 return (Just domain, Just filename))
+                               <|> return (Nothing,Nothing)
+        trim <?> "trim3"
+        string "pageno="
+        trim <?> "trim4"
+        char '"' 
+        pnum <- decimal <?> "decimal"
+        char '"'
+        trim 
+        takeTill (inClass "/>")  <?> "here takeTill"
+        backgroundclose
+        return $ H.BackgroundPdf typ mdomain mfilename pnum 
+      "embedpdf" -> do     
+        trim <?> "trim0"
+        string "pageno="
+        char '"'
+        pnum <- decimal <?> "embedpdf decimal" 
+        char '"'
+        trim 
+        backgroundclose
+        return $ H.BackgroundEmbedPdf  typ pnum
+      _ -> fail "in parsing background"  
+        
+        
+alphabet :: Parser B.ByteString
+alphabet = takeWhile1 (\w -> (w >= 65 && w <= 90) || (w >= 97 && w <= 122)) 
+
+alphanumsharp :: Parser B.ByteString            
+alphanumsharp = takeWhile1 (\w -> (w >= 65 && w <= 90) 
+                                  || (w >= 97 && w <= 122) 
+                                  || ( w >= 48 && w<= 57 ) 
+                                  || ( w== 35) ) 
+
+-- | need to be reimplemented
+parseFileName :: Parser B.ByteString
+parseFileName = takeTill (inClass ['"'])
+
+
+-- |
+backgroundheader :: Parser B.ByteString
+backgroundheader = string "<background"
+
+-- | 
+backgroundclose :: Parser B.ByteString
+backgroundclose = string "/>"
+
diff --git a/src/Text/Hoodlet/Parse/Attoparsec.hs b/src/Text/Hoodlet/Parse/Attoparsec.hs
--- a/src/Text/Hoodlet/Parse/Attoparsec.hs
+++ b/src/Text/Hoodlet/Parse/Attoparsec.hs
@@ -17,8 +17,8 @@
 module Text.Hoodlet.Parse.Attoparsec where
 
 import           Control.Applicative 
-import           Data.Attoparsec
-import           Data.Attoparsec.Char8
+import           Data.Attoparsec.ByteString
+import           Data.Attoparsec.ByteString.Char8
 import qualified Data.ByteString.Char8 as B
 -- 
 import qualified Data.Hoodle.Simple as H
