diff --git a/Main.hs b/Main.hs
--- a/Main.hs
+++ b/Main.hs
@@ -1,7 +1,7 @@
 -- Author:     Andy Stewart <lazycat.manatee@gmail.com>
 -- Maintainer: Andy Stewart <lazycat.manatee@gmail.com>
 -- 
--- Copyright (C) 2010 Andy Stewart, all rights reserved.
+-- Copyright (C) 2010 ~ 2011 Andy Stewart, all rights reserved.
 -- 
 -- This program is free software: you can redistribute it and/or modify
 -- it under the terms of the GNU General Public License as published by
diff --git a/Manatee/Extension/Editor.hs b/Manatee/Extension/Editor.hs
--- a/Manatee/Extension/Editor.hs
+++ b/Manatee/Extension/Editor.hs
@@ -1,7 +1,7 @@
 -- Author:     Andy Stewart <lazycat.manatee@gmail.com>
 -- Maintainer: Andy Stewart <lazycat.manatee@gmail.com>
 -- 
--- Copyright (C) 2010 Andy Stewart, all rights reserved.
+-- Copyright (C) 2010 ~ 2011 Andy Stewart, all rights reserved.
 -- 
 -- This program is free software: you can redistribute it and/or modify
 -- it under the terms of the GNU General Public License as published by
diff --git a/Manatee/Extension/Editor/PageMode.hs b/Manatee/Extension/Editor/PageMode.hs
--- a/Manatee/Extension/Editor/PageMode.hs
+++ b/Manatee/Extension/Editor/PageMode.hs
@@ -1,7 +1,7 @@
 -- Author:     Andy Stewart <lazycat.manatee@gmail.com>
 -- Maintainer: Andy Stewart <lazycat.manatee@gmail.com>
 -- 
--- Copyright (C) 2010 Andy Stewart, all rights reserved.
+-- Copyright (C) 2010 ~ 2011 Andy Stewart, all rights reserved.
 -- 
 -- This program is free software: you can redistribute it and/or modify
 -- it under the terms of the GNU General Public License as published by
diff --git a/Manatee/Extension/Editor/SourceBuffer.hs b/Manatee/Extension/Editor/SourceBuffer.hs
--- a/Manatee/Extension/Editor/SourceBuffer.hs
+++ b/Manatee/Extension/Editor/SourceBuffer.hs
@@ -1,7 +1,7 @@
 -- Author:     Andy Stewart <lazycat.manatee@gmail.com>
 -- Maintainer: Andy Stewart <lazycat.manatee@gmail.com>
 -- 
--- Copyright (C) 2010 Andy Stewart, all rights reserved.
+-- Copyright (C) 2010 ~ 2011 Andy Stewart, all rights reserved.
 -- 
 -- This program is free software: you can redistribute it and/or modify
 -- it under the terms of the GNU General Public License as published by
@@ -17,18 +17,23 @@
 -- along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 {-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE TemplateHaskell #-}
 module Manatee.Extension.Editor.SourceBuffer where
 
 import Control.Applicative
 import Control.Concurrent.STM 
 import DBus.Client hiding (Signal)
+import Data.Binary
+import Data.DeriveTH
 import Data.List 
 import Data.Maybe
 import Data.Typeable
 import Graphics.UI.Gtk.Multiline.TextBuffer
+import Manatee.Core.Config
 import Manatee.Core.PageMode
 import Manatee.Core.Types
 import Manatee.Extension.Editor.PageMode
+import Manatee.Toolkit.General.STM
 import Text.Regex.TDFA
 
 import qualified Data.ByteString as BS
@@ -40,9 +45,20 @@
                  ,sourceBufferPageId            :: PageId
                  ,sourceBufferMode              :: PageMode
                  ,sourceBufferBuffer            :: SB.SourceBuffer
+                 ,sourceBufferState             :: TVar SourceState
                  } 
     deriving Typeable
 
+data SourceState =
+    SourceState {sourceStateCursor              :: Maybe (Int, Int)
+                ,sourceStateScrolledPosition    :: (Double, Double)
+                } deriving Show
+
+-- | Init state.
+sourceInitState :: SourceState
+sourceInitState =
+    SourceState (Just (1, 0)) (0, 0)
+
 -- | New source buffer.
 sourceBufferNew :: String -> [String] -> Client -> PageId -> CustomizeWrap -> IO SourceBuffer
 sourceBufferNew path _ client pageId _ = do
@@ -55,3 +71,18 @@
                <*> pure pageId
                <*> pure (fromMaybe defaultMode $ find (\x -> path =~ pageModeRegexp x) sourceModeList)
                <*> pure buffer
+               <*> newTVarIO sourceInitState
+
+-- | Write state.
+sourceBufferWriteState :: SourceBuffer -> FilePath -> IO ()
+sourceBufferWriteState buffer path = do
+  state <- readTVarIO $ sourceBufferState buffer
+  writeConfigPath path state
+
+-- | Read state.
+sourceBufferReadState :: SourceBuffer -> FilePath -> IO ()  
+sourceBufferReadState buffer path = do
+  state <- readConfigPath path sourceInitState
+  writeTVarIO (sourceBufferState buffer) state
+  
+$(derive makeBinary ''SourceState)
diff --git a/Manatee/Extension/Editor/SourceView.hs b/Manatee/Extension/Editor/SourceView.hs
--- a/Manatee/Extension/Editor/SourceView.hs
+++ b/Manatee/Extension/Editor/SourceView.hs
@@ -1,7 +1,7 @@
 -- Author:     Andy Stewart <lazycat.manatee@gmail.com>
 -- Maintainer: Andy Stewart <lazycat.manatee@gmail.com>
 -- 
--- Copyright (C) 2010 Andy Stewart, all rights reserved.
+-- Copyright (C) 2010 ~ 2011 Andy Stewart, all rights reserved.
 -- 
 -- This program is free software: you can redistribute it and/or modify
 -- it under the terms of the GNU General Public License as published by
@@ -27,9 +27,9 @@
 import Data.Text.Lazy (Text)
 import Data.Typeable
 import Graphics.UI.Gtk hiding (Statusbar, statusbarNew, get)
-import Graphics.UI.Gtk.Gdk.SerializedEvent
 import Graphics.UI.Gtk.SourceView.SourceLanguage
 import Graphics.UI.Gtk.SourceView.SourceLanguageManager
+import Manatee.Core.Config
 import Manatee.Core.DBus
 import Manatee.Core.PageFrame
 import Manatee.Core.PageView
@@ -63,21 +63,28 @@
     pageBufferCreateView a pId  = PageViewWrap <$> sourceViewNew a pId
     pageBufferMode              = sourceBufferMode
     pageBufferPackageName _     = fmap takeFileName getDataDir
+    pageBufferWriteState        = sourceBufferWriteState
+    pageBufferReadState         = sourceBufferReadState
 
 instance PageView SourceView where
-    pageViewBuffer              = PageBufferWrap . sourceViewBuffer
-    pageViewPlugId              = sourceViewPlugId
-    pageViewBox                 = pageFrameBox . sourceViewFrame
-    pageViewScrolledWindow      = sourceViewScrolledWindow
-    pageViewFocus               = widgetGrabFocus . sourceViewView
-    pageViewCut                 = sourceViewCut
-    pageViewCopy                = sourceViewCopy
-    pageViewPaste               = sourceViewPaste
-    pageViewHandleKeyAction     = sourceViewHandleKeyAction
-    pageViewScrollToTop         = sourceViewScrollToTop
-    pageViewScrollToBottom      = sourceViewScrollToBottom
-    pageViewScrollVerticalPage  = sourceViewScrollVerticalPage
-    pageViewScrollVerticalStep  = sourceViewScrollVerticalStep
+    pageViewBuffer               = PageBufferWrap . sourceViewBuffer
+    pageViewPlugId               = sourceViewPlugId
+    pageViewFrame                = sourceViewFrame
+    pageViewCut                  = sourceViewCut
+    pageViewCopy                 = sourceViewCopy
+    pageViewPaste                = sourceViewPaste
+    pageViewLocalKeymap _        = sourceViewLocalKeymap
+    pageViewLocalCommandMap _    = sourceViewLocalCommandMap
+    pageViewFocus                = widgetGrabFocus . sourceViewView
+    pageViewPropagateWidget      = castToWidget . sourceViewView
+    pageViewSaveState view       = sourceViewSaveState view Nothing
+    pageViewRestoreState view    = sourceViewRestoreState view Nothing
+    pageViewWriteState view path = sourceViewSaveState view (Just path)
+    pageViewReadState view path  = sourceViewRestoreState view (Just path)
+    pageViewScrollToTop          = sourceViewScrollToTop
+    pageViewScrollToBottom       = sourceViewScrollToBottom
+    pageViewScrollVerticalPage   = sourceViewScrollVerticalPage
+    pageViewScrollVerticalStep   = sourceViewScrollVerticalStep
 
 -- | Internal function for create string buffer.
 sourceViewNew :: SourceBuffer -> PagePlugId -> IO SourceView
@@ -145,14 +152,14 @@
 sourceViewDisplayPositionStatus :: SourceView -> IO ()
 sourceViewDisplayPositionStatus sb = 
   liftM2 (printf "Pos (%d, %d)") (sourceViewGetLine sb) (sourceViewGetColumn sb)
-         >>= pageFrameUpdateStatusbar (sourceViewFrame sb) "Pos"
+         >>= pageViewUpdateStatusbar sb "Pos"
 
 -- | Display percent information.
 sourceViewDisplayPercentStatus :: SourceView -> IO ()
 sourceViewDisplayPercentStatus sv = do
   line <- sourceViewGetLine sv
   lineCount <- sourceViewGetLineCount sv
-  pageFrameUpdateStatusbar (sourceViewFrame sv) "Percent" ("(" ++ show (floor (i2d (line * 100) / i2d lineCount)) ++ "%)")
+  pageViewUpdateStatusbar sv "Percent" ("(" ++ show (floor (i2d (line * 100) / i2d lineCount)) ++ "%)")
   
 -- | Handle selection mark.
 sourceViewHandleSelectionMark :: SourceView -> IO ()  
@@ -198,7 +205,7 @@
   string <- sourceViewGetText a
   writeFile filepath string
   name <- sourceViewName a
-  pageFrameShowOutputbar (sourceViewFrame a) ("Save " ++ name) Nothing
+  pageViewShowOutputbar a ("Save " ++ name) Nothing
 
 -- | Get buffer name.
 sourceViewName :: SourceView -> IO String
@@ -212,8 +219,8 @@
   ifM (SB.sourceBufferGetCanUndo sb)
           (do
             SB.sourceBufferUndo sb
-            pageFrameShowOutputbar (sourceViewFrame a) "Undo!" Nothing)
-          (pageFrameShowOutputbar (sourceViewFrame a) "No further undo information." Nothing)
+            pageViewShowOutputbar a "Undo!" Nothing)
+          (pageViewShowOutputbar a "No further undo information." Nothing)
 
 -- | Redo.
 sourceViewRedo :: SourceView -> IO ()
@@ -222,8 +229,8 @@
   ifM (SB.sourceBufferGetCanRedo sb)
           (do
             SB.sourceBufferRedo sb
-            pageFrameShowOutputbar (sourceViewFrame a) "Redo!" Nothing)
-          (pageFrameShowOutputbar (sourceViewFrame a) "No further redo information." Nothing)
+            pageViewShowOutputbar a "Redo!" Nothing)
+          (pageViewShowOutputbar a "No further redo information." Nothing)
 
 -- | String view wrap user action for undo/redo.
 sourceViewWrapAction :: SourceView -> IO () -> IO ()  
@@ -389,62 +396,102 @@
 sourceViewSetText :: SourceView -> String -> IO ()
 sourceViewSetText = textViewSetText . sourceViewView
 
+-- | Local keymap.
+sourceViewLocalKeymap :: Map Text Text
+sourceViewLocalKeymap = 
+    M.fromList
+         [("M-a",    "Select all")
+         ,("M-s",    "Save")
+         ,("M-d",    "Delete lines")
+         ,("M-D",    "Delete")
+         ,("M-/",    "Undo")
+         ,("M-?",    "Redo")
+         ,("M-r",    "Reload")
+         ,("M-,",    "Backward delete char")
+         ,("M-.",    "Forward delete char")
+         ,("M-<",    "Backward delete word")
+         ,("M->",    "Forward delete word")
+         ,("C-M-,",  "Delete to line start")
+         ,("C-M-.",  "Delete to line end")
+         ,("M-j",    "Forward line")
+         ,("M-k",    "Backward line")
+         ,("M-l",    "Forward char")
+         ,("M-h",    "Backward char")
+         ,("M-m",    "New line")
+         ,("Down",   "Forward line")
+         ,("Up",     "Backward line")
+         ,("Left",   "Forward char")
+         ,("Right",  "Backward char")
+         ,("Return", "New line")
+         ,("M-L",    "Forward word")
+         ,("M-H",    "Backward word")
+         ,("M-P-h",  "Smart home")
+         ,("M-P-l",  "Smart end")
+         ,("M-N",    "Open new line below")
+         ,("M-P",    "Open new line above")
+         ,("M-w",    "Duplicate lines below")
+         ,("M-W",    "Duplicate lines above")
+         ,("M-e",    "Transposes line below")
+         ,("M-E",    "Transposes line above")
+         ,("C-c",    "Toggle selection mark")
+         ,("C-C",    "Exchange selection mark")
+         ,("C-o",    "Open file")
+         ,("C-g",    "Goto line")
+         ,("C-G",    "Goto column")
+         ]
+
 -- | String buffer keymap.
-sourceViewKeymap :: Map Text (SourceView -> IO ())
-sourceViewKeymap = 
+sourceViewLocalCommandMap :: Map Text (SourceView -> IO ())
+sourceViewLocalCommandMap = 
     M.fromList 
-         [("M-a",    sourceViewSelectAll)
-         ,("M-s",    sourceViewSave)
-         ,("M-d",    sourceViewDelLines)
-         ,("M-D",    sourceViewDelete)
-         ,("M-/",    sourceViewUndo)
-         ,("M-?",    sourceViewRedo)
-         ,("M-r",    sourceViewReload)
-         ,("M-,",    sourceViewDeleteBackwardChar)
-         ,("M-.",    sourceViewDeleteForwardChar)
-         ,("M-<",    sourceViewDeleteBackwardWord)
-         ,("M->",    sourceViewDeleteForwardWord)
-         ,("M-C-,",  sourceViewDeleteToLineStart)
-         ,("M-C-.",  sourceViewDeleteToLineEnd)
-         ,("M-j",    sourceViewForwardLine)
-         ,("M-k",    sourceViewBackwardLine)
-         ,("M-l",    sourceViewForwardChar)
-         ,("M-h",    sourceViewBackwardChar)
-         ,("M-m",    sourceViewNewline)
-         ,("Down",   sourceViewForwardLine)
-         ,("Up",     sourceViewBackwardLine)
-         ,("Left",   sourceViewForwardChar)
-         ,("Right",  sourceViewBackwardChar)
-         ,("Return", sourceViewNewline)
-         ,("M-L",    sourceViewForwardWord)
-         ,("M-H",    sourceViewBackwardWord)
-         ,("M-P-h",  sourceViewSmartHome)
-         ,("M-P-l",  sourceViewSmartEnd)
-         ,("M-N",    sourceViewOpenNewlineBelow)
-         ,("M-P",    sourceViewOpenNewlineAbove)
-         ,("M-w",    sourceViewDupLinesBelow)
-         ,("M-W",    sourceViewDupLinesAbove)
-         ,("M-e",    sourceViewTraLinesBelow)
-         ,("M-E",    sourceViewTraLinesAbove)
-         ,("C-c",    sourceViewToggleSelectionMark)
-         ,("C-C",    sourceViewExchangeSelectionMark)
-         ,("C-o",    sourceViewOpenFile)
-         ,("C-g",    sourceViewGotoLine)
-         ,("C-G",    sourceViewGotoColumn)
+         [("Select all",                sourceViewSelectAll)
+         ,("Save",                      sourceViewSave)
+         ,("Delete lines",              sourceViewDelLines)
+         ,("Delete",                    sourceViewDelete)
+         ,("Undo",                      sourceViewUndo)
+         ,("Redo",                      sourceViewRedo)
+         ,("Reload",                    sourceViewReload)
+         ,("Backward delete char",      sourceViewDeleteBackwardChar)
+         ,("Forward delete char",       sourceViewDeleteForwardChar)
+         ,("Backward delete word",      sourceViewDeleteBackwardWord)
+         ,("Forward delete word",       sourceViewDeleteForwardWord)
+         ,("Delete to line start",      sourceViewDeleteToLineStart)
+         ,("Delete to line end",        sourceViewDeleteToLineEnd)
+         ,("Forward line",              sourceViewForwardLine)
+         ,("Backward line",             sourceViewBackwardLine)
+         ,("Forward char",              sourceViewForwardChar)
+         ,("Backward char",             sourceViewBackwardChar)
+         ,("New line",                  sourceViewNewline)
+         ,("Forward word",              sourceViewForwardWord)
+         ,("Backward word",             sourceViewBackwardWord)
+         ,("Smart home",                sourceViewSmartHome)
+         ,("Smart end",                 sourceViewSmartEnd)
+         ,("Open new line below",       sourceViewOpenNewlineBelow)
+         ,("Open new line above",       sourceViewOpenNewlineAbove)
+         ,("Duplicate lines below",     sourceViewDupLinesBelow)
+         ,("Duplicate lines above",     sourceViewDupLinesAbove)
+         ,("Transposes line below",     sourceViewTraLinesBelow)
+         ,("Transposes line above",     sourceViewTraLinesAbove)
+         ,("Toggle selection mark",     sourceViewToggleSelectionMark)
+         ,("Exchange selection mark",   sourceViewExchangeSelectionMark)
+         ,("Open file",                 sourceViewOpenFile)
+         ,("Goto line",                 sourceViewGotoLine)
+         ,("Goto column",               sourceViewGotoColumn)
          ]
 
 -- | Open file.
 sourceViewOpenFile :: SourceView -> IO ()
 sourceViewOpenFile view = 
-  localInteractive view "fOpen file : " $ \ [path] ->                       
+  interactive view [(IFile, "Open file : ", "")] $ \ [path] ->                       
       mkDaemonSignal (pageViewClient view) NewTab (NewTabArgs "PageEditor" path [])
 
 -- | Goto column.
 sourceViewGotoColumn :: SourceView -> IO ()          
 sourceViewGotoColumn view@SourceView {sourceViewView = sourceView} = 
-  localInteractive view "nColumn : " $ \ [column] -> do
+  interactive view [(INum, "Column : ", "")] $ \ [column] -> do
       let number = read column :: Int
       textViewGotoColumn sourceView number
+      pageViewShowOutputbar view (show [column]) Nothing
   
 -- | Goto row.  
 sourceViewGotoLine :: SourceView -> IO ()
@@ -452,7 +499,7 @@
                                    ,sourceViewBuffer = sourceBuffer} = do
   let buffer = sourceBufferBuffer sourceBuffer
   lines <- textBufferGetLineCount buffer
-  localInteractive view ("nLine (1 - " ++ show lines ++ ") : ") $ \ [line] -> do
+  interactive view [(INum, "Line (1 - " ++ show lines ++ ") : ", "")] $ \ [line] -> do
       let number = read line :: Int
       textViewGotoLine sourceView number
 
@@ -460,8 +507,8 @@
 sourceViewToggleSelectionMark :: SourceView -> IO ()
 sourceViewToggleSelectionMark view = 
   ifM (textViewToggleSelectionMark $ sourceViewView view )
-      (pageFrameUpdateStatusbar (sourceViewFrame view) "Selection" "Selection (Active)")
-      (pageFrameUpdateStatusbar (sourceViewFrame view) "Selection" "Selection (Inactive)")
+      (pageViewUpdateStatusbar view "Selection" "Selection (Active)")
+      (pageViewUpdateStatusbar view "Selection" "Selection (Inactive)")
 
 -- | Exchange selection mark.
 sourceViewExchangeSelectionMark :: SourceView -> IO ()
@@ -491,16 +538,45 @@
   textViewScrollVertical tv sw (if isDown then stepInc else (- stepInc))
   sourceViewApplySelectionMark a
 
--- | Handle key action.
-sourceViewHandleKeyAction :: SourceView -> Text -> SerializedEvent -> IO ()
-sourceViewHandleKeyAction view keystoke sEvent = 
-  case M.lookup keystoke sourceViewKeymap of
-    -- Execute action when found in keymap.
-    Just action -> action view
-    -- Otherwise propagate event.
-    Nothing -> widgetPropagateEvent (sourceViewView view) sEvent 
-
 -- | Source view scrolled window.
 sourceViewScrolledWindow :: SourceView -> ScrolledWindow    
 sourceViewScrolledWindow =
   pageFrameScrolledWindow . sourceViewFrame
+
+-- | Save state.
+sourceViewSaveState :: SourceView -> Maybe FilePath -> IO ()
+sourceViewSaveState view@(SourceView {sourceViewBuffer  = buffer}) 
+                    statePath = do
+  -- Get cursor.
+  line <- textBufferGetLine (sourceBufferBuffer buffer)
+  column <- textBufferGetLineOffset (sourceBufferBuffer buffer)
+
+  -- Get scroll position.
+  scrolledWindowPosition <- textViewGetCursorAlign (sourceViewView view)
+
+  -- Save state.
+  let state = SourceState (Just (line, column)) scrolledWindowPosition 
+  case statePath of
+    Nothing   -> writeTVarIO (sourceBufferState buffer) state
+    Just path -> writeConfigPath path state
+
+-- | Restore state.
+sourceViewRestoreState :: SourceView -> Maybe FilePath -> IO ()
+sourceViewRestoreState SourceView {sourceViewBuffer  = buffer
+                                  ,sourceViewView    = textView} 
+                       statePath = do
+  bufferState <- readTVarIO (sourceBufferState buffer)
+  (SourceState cursor scrolledWindowPosition) <- 
+      case statePath of
+        Just path -> readConfigPath path bufferState
+        Nothing   -> return bufferState
+
+  -- Restore cursor.
+  cursor ?>= \ (line, column) -> do
+    textViewGotoLine textView line
+    textViewGotoColumn textView column
+
+  -- Restore cursor alignment.
+  -- TODO, we need find a way to restore TextView scroll position.
+  -- textViewSetCursorAlign can't work if cursor not in visible area.
+  textViewSetCursorAlign textView scrolledWindowPosition
diff --git a/Setup.hs b/Setup.hs
--- a/Setup.hs
+++ b/Setup.hs
@@ -1,7 +1,7 @@
 -- Author:     Andy Stewart <lazycat.manatee@gmail.com>
 -- Maintainer: Andy Stewart <lazycat.manatee@gmail.com>
 -- 
--- Copyright (C) 2010 Andy Stewart, all rights reserved.
+-- Copyright (C) 2010 ~ 2011 Andy Stewart, all rights reserved.
 -- 
 -- This program is free software: you can redistribute it and/or modify
 -- it under the terms of the GNU General Public License as published by
@@ -19,6 +19,7 @@
 import Distribution.Simple
 import Manatee.Core.Config
 import Manatee.Core.Types
+import Manatee.Toolkit.Cabal.Utils
 import Manatee.Extension.Editor.PageMode
 
 import qualified Data.Map as M
@@ -26,7 +27,7 @@
 main = defaultMainWithHooks 
        simpleUserHooks {
          -- Update PageTypeRule after install successful.
-         postInst = \ _ _ _ _ -> do
+         postInst = \ _ _ pack_des lbi -> do
              (PageTypeRule rule) <- readConfig pageTypeRulePath (PageTypeRule M.empty)
              writeConfig pageTypeRulePath (PageTypeRule (M.insert "PageEditor" "manatee-editor" rule))
              -- Update PageModeRule.
@@ -37,4 +38,13 @@
                                (Right $ M.fromList $ 
                                       map (\x -> (pageModeRegexp x, pageModeName x)) sourceModeList
                                ) modeRule))
+             -- Update Application info.
+             let snapshotPath = getDataFilePath pack_des lbi "data/welcome/snapshot.png"
+                 welcomeFile = getDataFilePath pack_des lbi "data/welcome/welcome.txt"
+             (WelcomeApplication apps) <- readConfig welcomeApplicationPath (WelcomeApplication M.empty)
+             writeConfig welcomeApplicationPath (WelcomeApplication
+                                                 (M.insert 
+                                                       ("Editor", snapshotPath)
+                                                       ("PageEditor", welcomeFile, [])
+                                                       apps))
        }
diff --git a/data/welcome/snapshot.png b/data/welcome/snapshot.png
new file mode 100644
Binary files /dev/null and b/data/welcome/snapshot.png differ
diff --git a/data/welcome/welcome.txt b/data/welcome/welcome.txt
new file mode 100644
--- /dev/null
+++ b/data/welcome/welcome.txt
@@ -0,0 +1,24 @@
+Hi, there!
+
+Welcome to Manatee (The Haskell/Gtk+ Integrated Live Environment) !
+
+Want to know what's it? 
+Please watch video: 
+    http://www.youtube.com/watch?v=weS6zys3U8k or http://www.youtube.com/watch?v=A3DgKDVkyeM
+	
+How to use it?
+Please read wiki page:
+    http://haskell.org/haskellwiki/Manatee	
+	
+Here have some screenshot:
+    http://goo.gl/MkVw
+	
+Please report bug or suggestion to:
+    manatee-user@googlegroups.com
+
+If you're lucky, you can find me (ManateeLazyCat) at IRC:
+   (irc.freenode.net 6667 ##manatee)
+
+Enjoy! :)
+
+   -- Andy
diff --git a/manatee-editor.cabal b/manatee-editor.cabal
--- a/manatee-editor.cabal
+++ b/manatee-editor.cabal
@@ -1,13 +1,13 @@
 name:			manatee-editor
-version:		0.0.8
+version:		0.1.0
 Cabal-Version:	>= 1.6
 license:		GPL-3
 license-file:	LICENSE
-copyright:		(c) 2009 ~ 2010 Andy Stewart
+copyright:		(c) 2010 ~ 2011 Andy Stewart
 synopsis:		Editor extension for Manatee.
 description:    manatee-editor is editor extension for Manatee (Haskell/Gtk+ Integrated Live Environment)
  .
- Video at (Select 720p HD) at : <http://www.youtube.com/watch?v=weS6zys3U8k> <http://www.youtube.com/watch?v=A3DgKDVkyeM> <http://v.youku.com/v_show/id_XMjI2MDMzODI4.html>
+ Video (Select 720p HD) at : <http://www.youtube.com/watch?v=weS6zys3U8k> <http://www.youtube.com/watch?v=A3DgKDVkyeM> <http://v.youku.com/v_show/id_XMjI2MDMzODI4.html>
  .
  Screenshots at : <http://goo.gl/MkVw>
  .
@@ -22,16 +22,20 @@
 stability:		provisional
 category:		Manatee, Editor, IDE
 
-tested-with:	GHC==6.12.3
+tested-with:	GHC==7.0.2
 build-type:		Custom
 
+data-dir: ""
+data-files: data/welcome/snapshot.png
+            data/welcome/welcome.txt
+
 Source-Repository head
   type:         darcs
   location:     http://patch-tag.com/r/AndyStewart/manatee-editor
   
 Library
-     build-depends: base >= 4 && < 5, manatee-core >= 0.0.8, dbus-client >= 0.3 && < 0.4, stm >= 2.1.2.0,
-                    containers >= 0.3.0.0, gtk-serialized-event >= 0.12.0, gtk >= 0.12.0, gtksourceview2 >= 0.12.0,
+     build-depends: base >= 4 && < 5, manatee-core >= 0.1.0, dbus-client >= 0.3 && < 0.4, stm >= 2.1.2.0,
+                    containers >= 0.3.0.0, gtk >= 0.12.0, gtksourceview2 >= 0.12.0, derive, binary,
                     text >= 0.7.1.0, bytestring >= 0.9.1.5, dbus-core, regex-tdfa, filepath
      exposed-modules:
          Manatee.Extension.Editor
