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.1.1
+Version:	0.2
 Synopsis:       Hoodle file parser
 Description: 	Text parser for hoodle xml file
 Homepage:       http://ianwookim.org/hoodle
@@ -26,14 +26,18 @@
                  bytestring >= 0.9, 
                  containers >= 0.4, 
                  strict == 0.3.*, 
-                 hoodle-types >= 0.1.1, 
+                 hoodle-types >= 0.2, 
                  xournal-types >= 0.5.0.1,
                  text == 0.11.*,
-                 lens >= 2.5
+                 lens >= 2.5, 
+                 either >= 3.1
   Exposed-Modules: 
+                   Text.Hoodle.Migrate.FromXournal
+                   Text.Hoodle.Migrate.V0_1_1_to_V0_2
                    Text.Hoodle.Parse.Attoparsec
+                   Text.Hoodle.Parse.Attoparsec.V0_1_1
+                   -- Text.Hoodle.Parse.Attoparsec.V0_1_999
                    Text.Hoodle.Parse.Zlib
-                   Text.Hoodle.Translate.FromXournal
 
 
 
diff --git a/src/Text/Hoodle/Migrate/FromXournal.hs b/src/Text/Hoodle/Migrate/FromXournal.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Hoodle/Migrate/FromXournal.hs
@@ -0,0 +1,60 @@
+{-# LANGUAGE RecordWildCards #-}
+
+-----------------------------------------------------------------------------
+-- |
+-- Module      : Text.Hoodle.Migrate.FromXournal 
+-- Copyright   : (c) 2011-2013 Ian-Woo Kim
+--
+-- License     : BSD3
+-- Maintainer  : Ian-Woo Kim <ianwookim@gmail.com>
+-- Stability   : experimental
+-- Portability : GHC
+--
+-----------------------------------------------------------------------------
+
+module Text.Hoodle.Migrate.FromXournal 
+( mkHoodleFromXournal      
+) where
+
+import Control.Applicative
+import Control.Lens
+-- 
+import qualified Data.Xournal.Simple as X 
+import qualified Data.Hoodle.Simple as H
+
+-- | 
+mkHoodleFromXournal :: X.Xournal -> IO H.Hoodle 
+mkHoodleFromXournal X.Xournal {..} = 
+    set H.title xoj_title . set H.pages (map x2h4Page xoj_pages) <$> H.emptyHoodle 
+    
+-- |     
+x2h4Page :: X.Page -> H.Page
+x2h4Page X.Page {..} = H.Page 
+                         (x2h4dim page_dim) 
+                         (x2h4bkg page_bkg) 
+                         (map x2h4layer page_layers)
+                         
+-- |                          
+x2h4dim :: X.Dimension -> H.Dimension
+x2h4dim X.Dim {..} = H.Dim dim_width dim_height 
+
+-- | 
+x2h4bkg :: X.Background -> H.Background 
+x2h4bkg X.Background {..} = H.Background bkg_type bkg_color bkg_style
+x2h4bkg X.BackgroundPdf {..} = 
+    H.BackgroundPdf bkg_type bkg_domain bkg_filename bkg_pageno
+
+
+-- | 
+x2h4layer :: X.Layer -> H.Layer 
+x2h4layer X.Layer {..} = H.Layer (map x2h4stroke layer_strokes)
+
+-- | 
+x2h4stroke :: X.Stroke -> H.Item -- H.Stroke 
+x2h4stroke X.Stroke {..} = 
+    H.ItemStroke (H.Stroke stroke_tool stroke_color stroke_width stroke_data)
+x2h4stroke X.VWStroke {..} = 
+    H.ItemStroke (H.VWStroke stroke_tool stroke_color stroke_vwdata)
+    
+    
+
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
new file mode 100644
--- /dev/null
+++ b/src/Text/Hoodle/Migrate/V0_1_1_to_V0_2.hs
@@ -0,0 +1,113 @@
+{-# 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/Parse/Attoparsec.hs b/src/Text/Hoodle/Parse/Attoparsec.hs
--- a/src/Text/Hoodle/Parse/Attoparsec.hs
+++ b/src/Text/Hoodle/Parse/Attoparsec.hs
@@ -3,7 +3,7 @@
 -----------------------------------------------------------------------------
 -- |
 -- Module      : Text.Hoodle.Parse.Attoparsec
--- Copyright   : (c) 2011, 2012 Ian-Woo Kim
+-- Copyright   : (c) 2011-2013 Ian-Woo Kim
 --
 -- License     : BSD3
 -- Maintainer  : Ian-Woo Kim <ianwookim@gmail.com>
@@ -20,11 +20,8 @@
 import           Data.Attoparsec
 import           Data.Attoparsec.Char8 ( char, decimal, double, skipSpace
                                       , isHorizontalSpace, anyChar)
--- import qualified Data.Attoparsec.Iteratee as AI
 import qualified Data.ByteString.Char8 as B hiding (map) 
 import           Data.Char 
--- import qualified Data.Iteratee as Iter
--- import           Data.Iteratee.Char
 import           Data.Strict.Tuple
 -- from hoodle-platform 
 import qualified Data.Hoodle.Simple as H
@@ -202,22 +199,22 @@
 svg_footer :: Parser () 
 svg_footer = string "</svgobject>" >> return ()
 
-svg_text :: Parser B.ByteString 
-svg_text = do 
+textCDATA :: Parser B.ByteString 
+textCDATA = do 
     string "<text>"
     str <- string "<![CDATA[" *> manyTill anyChar (try (string "]]>"))
     string "</text>"
     return (B.pack str) 
 
-svg_command :: Parser B.ByteString 
-svg_command = do 
+commandCDATA :: Parser B.ByteString 
+commandCDATA = do 
     string "<command>"
     str <- string "<![CDATA[" *> manyTill anyChar (try (string "]]>"))
     string "</command>"
     return (B.pack str)
 
-svg_render :: Parser B.ByteString 
-svg_render = do 
+renderCDATA :: Parser B.ByteString 
+renderCDATA = do 
   string "<render>"
   str <- string "<![CDATA[" *> manyTill anyChar (try (string "]]>"))
   string "</render>"
@@ -227,40 +224,101 @@
 svg_obj :: Parser H.Item 
 svg_obj = do (xy,dim) <- svg_header
              trim 
-             (mt,mc) <- (try (do t <- svg_text 
+             (mt,mc) <- (try (do t <- textCDATA 
                                  trim 
-                                 c <- svg_command 
+                                 c <- commandCDATA 
                                  return (Just t, Just c)) 
-                         <|> try (svg_text >>= \t -> return (Just t, Nothing))
+                         <|> try (textCDATA >>= \t -> return (Just t, Nothing))
                          <|> return (Nothing,Nothing))
              trim 
-             bstr <- svg_render 
+             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,(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 <- case typ of 
+      "simple" -> return Nothing 
+      "linkdocid" -> Just<$>(string "linkedid=\"" *> takeTill (inClass "\"")<* char '"')
+      _ -> fail "unknown link type"
+    trim    
+    loc <- B.pack <$> (string "location=\"" *> 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 
+    string ">"
+    return (i,typ,mlid,loc,(posx,posy),H.Dim width height) 
+
+link_footer :: Parser () 
+link_footer = string "</link>" >> return ()
+
+
+link :: Parser H.Item 
+link = do 
+    (i,typ,mlid,loc,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
+    return . H.ItemLink $ 
+      flip ($) mlid $ maybe (H.Link i typ loc mt mc bstr xy dim)
+                            (\lid -> H.LinkDocID i lid loc mt mc bstr xy dim) 
+
+
+
+
 -- | 
 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
-             hoodleheader <?> "hoodleheader"
+             (_v,hid) <- hoodleheader <?> "hoodleheader"
              trim
              t <- title <?> "title"
              trim
-             (try (preview >> return ())
-              <|> return ()) 
+             pdf <- (try (Just <$> embeddedpdf)
+                     <|> return Nothing )
              pgs <- many1 (page <?> "page")
              trim
              hoodleclose 
-             return $ H.Hoodle t pgs 
+             return $ H.Hoodle hid t pdf pgs 
              
 page :: Parser H.Page 
 page = do trim 
@@ -278,10 +336,7 @@
 layer = do trim
            layerheader <?> "layer"
            trim
-           -- s1 <- onestroke 
-           -- s2 <- img
-           -- let strokes = [s1,s2]
-           itms <- many (try onestroke <|> try img <|> svg_obj)
+           itms <- many (try onestroke <|> try img <|> try svg_obj <|> link)
            trim
            layerclose 
            return $ H.Layer itms
@@ -300,25 +355,36 @@
 titleclose :: Parser B.ByteString
 titleclose = string "</title>"
 
-preview :: Parser ()
-preview = do trim 
-             previewheader
-             _str <- takeTill (inClass "<") 
-             previewclose
-             trim
+embeddedpdf :: Parser (B.ByteString) 
+embeddedpdf = do string "<embeddedpdf" 
+                 trim 
+                 string "src=\""
+                 str <- manyTill anyChar (try (char '"'))
+                 trim 
+                 string "/>" 
+                 return (B.pack str)
 
-previewheader :: Parser B.ByteString 
-previewheader = string "<preview>"
 
-previewclose :: Parser B.ByteString 
-previewclose = string "</preview>"
-
-hoodleheader :: Parser B.ByteString
-hoodleheader = hoodleheaderstart *> takeTill (inClass ">") <* hoodleheaderend
+hoodleheader :: Parser (B.ByteString,B.ByteString)
+hoodleheader = do hoodleheaderstart 
+                  trim 
+                  v <- hoodleversion
+                  trim 
+                  hid <- hoodleid
+                  trim 
+                  char '>' -- takeTill (inClass ">") <* hoodleheaderend
+                  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 '>'
 
@@ -407,6 +473,15 @@
         takeTill (inClass "/>")  <?> "here takeTill"
         backgroundclose
         return $ H.BackgroundPdf typ mdomain mfilename pnum 
+      "embedpdf" -> do     
+        trim <?> "trim0"
+        string "pageno="
+        char '"'
+        pnum <- decimal <?> "embedpdf decimal" -- str <- manyTill anyChar (try (char '"'))
+        char '"'
+        trim 
+        backgroundclose
+        return $ H.BackgroundEmbedPdf  typ pnum -- (B.pack str) 
       _ -> fail "in parsing background"  
         
         
@@ -422,10 +497,6 @@
 -- | need to be reimplemented
 parseFileName :: Parser B.ByteString
 parseFileName = takeTill (inClass ['"'])
-                -- takeWhilw1 (\w -> (w >= 65 && w <= 90) 
-                --                   || (w >= 97 && w <= 122)
-                --                   || (w >= 48 && w <= 57)
-                --                   || (w == 35) 
 
 
 -- |
@@ -435,22 +506,4 @@
 -- | 
 backgroundclose :: Parser B.ByteString
 backgroundclose = string "/>"
-
-{-
-iter_hoodle :: Iter.Iteratee B.ByteString IO Hoodle
-iter_hoodle = AI.parserToIteratee parser_hoodle 
-
-read_hoodle :: String -> IO Hoodle 
-read_hoodle str = Iter.fileDriver iter_hoodle str 
-
-read_xojgz :: String -> IO Hoodle 
-read_xojgz str =  Iter.fileDriver (Iter.joinIM (ungzipXoj iter_hoodle)) str
-
-
-cat_hoodlegz :: String -> IO () 
-cat_hoodlegz str = Iter.fileDriver 
-                      (Iter.joinIM (ungzipXoj printLinesUnterminated)) str 
-
-onlyresult (Done _ r) = r 
--}
 
diff --git a/src/Text/Hoodle/Parse/Attoparsec/V0_1_1.hs b/src/Text/Hoodle/Parse/Attoparsec/V0_1_1.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Hoodle/Parse/Attoparsec/V0_1_1.hs
@@ -0,0 +1,453 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+-----------------------------------------------------------------------------
+-- |
+-- Module      : Text.Hoodle.Parse.Attoparsec.V0_1_1
+-- 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.Parse.Attoparsec.V0_1_1 where
+
+import           Control.Applicative 
+import           Data.Attoparsec
+import           Data.Attoparsec.Char8 ( char, decimal, double, skipSpace
+                                      , isHorizontalSpace, anyChar)
+import qualified Data.ByteString.Char8 as B hiding (map) 
+import           Data.Char 
+import           Data.Strict.Tuple
+-- from hoodle-platform 
+import qualified Data.Hoodle.Simple.V0_1_1 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 <- double 
+  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.Item 
+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 . H.ItemStroke) 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 ()
+
+svg_text :: Parser B.ByteString 
+svg_text = do 
+    string "<text>"
+    str <- string "<![CDATA[" *> manyTill anyChar (try (string "]]>"))
+    string "</text>"
+    return (B.pack str) 
+
+svg_command :: Parser B.ByteString 
+svg_command = do 
+    string "<command>"
+    str <- string "<![CDATA[" *> manyTill anyChar (try (string "]]>"))
+    string "</command>"
+    return (B.pack str)
+
+svg_render :: Parser B.ByteString 
+svg_render = do 
+  string "<render>"
+  str <- string "<![CDATA[" *> manyTill anyChar (try (string "]]>"))
+  string "</render>"
+  return (B.pack str)
+
+
+svg_obj :: Parser H.Item 
+svg_obj = do (xy,dim) <- svg_header
+             trim 
+             (mt,mc) <- (try (do t <- svg_text 
+                                 trim 
+                                 c <- svg_command 
+                                 return (Just t, Just c)) 
+                         <|> try (svg_text >>= \t -> return (Just t, Nothing))
+                         <|> return (Nothing,Nothing))
+             trim 
+             bstr <- svg_render 
+             trim 
+             svg_footer
+             (return . H.ItemSVG) (H.SVG mt mc bstr xy dim)
+
+                                  
+
+-- | 
+trim :: Parser ()
+trim = trim_starting_space
+
+                  
+-- | 
+hoodle :: Parser H.Hoodle 
+hoodle  = do trim
+             xmlheader <?> "xmlheader"
+             trim
+             hoodleheader <?> "hoodleheader"
+             trim
+             t <- title <?> "title"
+             trim
+             (try (preview >> return ())
+              <|> return ()) 
+             pgs <- many1 (page <?> "page")
+             trim
+             hoodleclose 
+             return $ H.Hoodle t 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
+           -- s1 <- onestroke 
+           -- s2 <- img
+           -- let strokes = [s1,s2]
+           itms <- many (try onestroke <|> try img <|> svg_obj)
+           trim
+           layerclose 
+           return $ H.Layer itms
+
+
+title :: Parser B.ByteString 
+title = do trim 
+           titleheader
+           str <- takeTill (inClass "<") -- (many . satisfy . notInClass ) "<"
+           titleclose
+           return str 
+
+titleheader :: Parser B.ByteString          
+titleheader = string "<title>"
+
+titleclose :: Parser B.ByteString
+titleclose = string "</title>"
+
+preview :: Parser ()
+preview = do trim 
+             previewheader
+             _str <- takeTill (inClass "<") 
+             previewclose
+             trim
+
+previewheader :: Parser B.ByteString 
+previewheader = string "<preview>"
+
+previewclose :: Parser B.ByteString 
+previewclose = string "</preview>"
+
+hoodleheader :: Parser B.ByteString
+hoodleheader = hoodleheaderstart *> takeTill (inClass ">") <* hoodleheaderend
+
+hoodleheaderstart :: Parser B.ByteString 
+hoodleheaderstart = string "<hoodle"
+
+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 
+      _ -> 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 ['"'])
+                -- takeWhilw1 (\w -> (w >= 65 && w <= 90) 
+                --                   || (w >= 97 && w <= 122)
+                --                   || (w >= 48 && w <= 57)
+                --                   || (w == 35) 
+
+
+-- |
+backgroundheader :: Parser B.ByteString
+backgroundheader = string "<background"
+
+-- | 
+backgroundclose :: Parser B.ByteString
+backgroundclose = string "/>"
+
+{-
+iter_hoodle :: Iter.Iteratee B.ByteString IO Hoodle
+iter_hoodle = AI.parserToIteratee parser_hoodle 
+
+read_hoodle :: String -> IO Hoodle 
+read_hoodle str = Iter.fileDriver iter_hoodle str 
+
+read_xojgz :: String -> IO Hoodle 
+read_xojgz str =  Iter.fileDriver (Iter.joinIM (ungzipXoj iter_hoodle)) str
+
+
+cat_hoodlegz :: String -> IO () 
+cat_hoodlegz str = Iter.fileDriver 
+                      (Iter.joinIM (ungzipXoj printLinesUnterminated)) str 
+
+onlyresult (Done _ r) = r 
+-}
+
diff --git a/src/Text/Hoodle/Translate/FromXournal.hs b/src/Text/Hoodle/Translate/FromXournal.hs
deleted file mode 100644
--- a/src/Text/Hoodle/Translate/FromXournal.hs
+++ /dev/null
@@ -1,57 +0,0 @@
-{-# LANGUAGE RecordWildCards #-}
-
------------------------------------------------------------------------------
--- |
--- Module      : Text.Hoodle.Builder 
--- Copyright   : (c) 2011, 2012 Ian-Woo Kim
---
--- License     : BSD3
--- Maintainer  : Ian-Woo Kim <ianwookim@gmail.com>
--- Stability   : experimental
--- Portability : GHC
---
------------------------------------------------------------------------------
-
-module Text.Hoodle.Translate.FromXournal 
-( mkHoodleFromXournal      
-) where
-
-import qualified Data.Xournal.Simple as X 
-import qualified Data.Hoodle.Simple as H
-
--- | 
-mkHoodleFromXournal :: X.Xournal -> H.Hoodle 
-mkHoodleFromXournal X.Xournal {..} = 
-    H.Hoodle xoj_title (map x2h4Page xoj_pages) 
-    
--- |     
-x2h4Page :: X.Page -> H.Page
-x2h4Page X.Page {..} = H.Page 
-                         (x2h4dim page_dim) 
-                         (x2h4bkg page_bkg) 
-                         (map x2h4layer page_layers)
-                         
--- |                          
-x2h4dim :: X.Dimension -> H.Dimension
-x2h4dim X.Dim {..} = H.Dim dim_width dim_height 
-
--- | 
-x2h4bkg :: X.Background -> H.Background 
-x2h4bkg X.Background {..} = H.Background bkg_type bkg_color bkg_style
-x2h4bkg X.BackgroundPdf {..} = 
-    H.BackgroundPdf bkg_type bkg_domain bkg_filename bkg_pageno
-
-
--- | 
-x2h4layer :: X.Layer -> H.Layer 
-x2h4layer X.Layer {..} = H.Layer (map x2h4stroke layer_strokes)
-
--- | 
-x2h4stroke :: X.Stroke -> H.Item -- H.Stroke 
-x2h4stroke X.Stroke {..} = 
-    H.ItemStroke (H.Stroke stroke_tool stroke_color stroke_width stroke_data)
-x2h4stroke X.VWStroke {..} = 
-    H.ItemStroke (H.VWStroke stroke_tool stroke_color stroke_vwdata)
-    
-    
-
