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/FileManager.hs b/Manatee/Extension/FileManager.hs
--- a/Manatee/Extension/FileManager.hs
+++ b/Manatee/Extension/FileManager.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/FileManager/DiredBuffer.hs b/Manatee/Extension/FileManager/DiredBuffer.hs
--- a/Manatee/Extension/FileManager/DiredBuffer.hs
+++ b/Manatee/Extension/FileManager/DiredBuffer.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,17 +17,21 @@
 -- along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 {-# LANGUAGE ScopedTypeVariables, DeriveDataTypeable #-}
+{-# LANGUAGE TemplateHaskell #-}
 module Manatee.Extension.FileManager.DiredBuffer where
 
 import Control.Applicative
 import Control.Concurrent.STM 
 import Control.Monad
-import Data.ByteString.UTF8
 import DBus.Client hiding (Signal)
-import Data.Ord (comparing)
+import Data.Binary
+import Data.ByteString.UTF8
+import Data.DeriveTH
 import Data.List (insert, delete)
+import Data.Ord (comparing)
 import Data.Typeable
-import Graphics.UI.Gtk
+import Graphics.UI.Gtk hiding (get)
+import Manatee.Core.Config
 import Manatee.Core.DBus
 import Manatee.Core.Types
 import Manatee.Extension.FileManager.PageMode
@@ -57,9 +61,15 @@
                 ,diredBufferFileMonitor         :: TVar FileMonitor
                 ,diredBufferMode                :: PageMode
                 ,diredBufferBroadcastChannel    :: TChan DiredBufferSignal
+                ,diredBufferState               :: TVar DiredState
                 }
     deriving Typeable
 
+data DiredState =
+    DiredState {diredStateSelectedPath          :: (Maybe TreePath)
+               ,diredStateScrolledPosition      :: (Double, Double)
+               }
+
 data DiredBufferSignal = UpdateBuffer FilePath
                        | UpdateView (Maybe String)
                        | UpdateFile [DiredFileInfo] [DiredFileInfo]
@@ -109,6 +119,11 @@
       compareRow FIMTime      row1 row2 = return $ comparing fst (dfiMtimeDescrible row1) (dfiMtimeDescrible row2)
       compareRow FIPermission row1 row2 = return $ comparing fst (dfiPermDescrible  row1) (dfiPermDescrible  row2)
 
+-- | Init state.
+diredInitState :: DiredState      
+diredInitState = 
+  DiredState Nothing (0, 0)
+
 -- | New.
 diredBufferNew :: FilePath -> [String] -> Client -> PageId -> CustomizeWrap -> IO DiredBuffer
 diredBufferNew dir _ client pageId _ = do
@@ -126,6 +141,7 @@
                         <*> newTVarIO monitor
                         <*> pure diredMode
                         <*> (newTChanIO :: IO (TChan DiredBufferSignal)) 
+                        <*> newTVarIO diredInitState
 
   -- Load directory content.
   diredBufferLoad buffer dir
@@ -285,3 +301,16 @@
    -- Hook file monitor with new file.
    diredBufferHandleFileMonitor buffer
   
+-- | Write state.
+diredBufferWriteState :: DiredBuffer -> FilePath -> IO ()
+diredBufferWriteState buffer path = do
+  state <- readTVarIO $ diredBufferState buffer
+  writeConfigPath path state
+
+-- | Read state.
+diredBufferReadState :: DiredBuffer -> FilePath -> IO ()  
+diredBufferReadState buffer path = do
+  state <- readConfigPath path diredInitState
+  writeTVarIO (diredBufferState buffer) state
+  
+$(derive makeBinary ''DiredState)
diff --git a/Manatee/Extension/FileManager/DiredView.hs b/Manatee/Extension/FileManager/DiredView.hs
--- a/Manatee/Extension/FileManager/DiredView.hs
+++ b/Manatee/Extension/FileManager/DiredView.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
@@ -29,7 +29,7 @@
 import Data.Text.Lazy (Text)
 import Data.Typeable
 import Graphics.UI.Gtk hiding (Statusbar, statusbarNew, get)
-import Graphics.UI.Gtk.Gdk.SerializedEvent
+import Manatee.Core.Config
 import Manatee.Core.DBus
 import Manatee.Core.FileOpenRule
 import Manatee.Core.PageFrame
@@ -43,8 +43,8 @@
 import Manatee.Toolkit.General.STM
 import Manatee.Toolkit.Gio.Gio
 import Manatee.Toolkit.Gtk.Concurrent
-import Manatee.Toolkit.Gtk.Gtk
 import Manatee.Toolkit.Gtk.ModelView
+import Manatee.Toolkit.Gtk.ScrolledWindow
 import Paths_manatee_filemanager
 import System.FilePath
 
@@ -69,16 +69,21 @@
     pageBufferPackageName _     = fmap takeFileName getDataDir
 
 instance PageView DiredView where
-    pageViewBuffer              = PageBufferWrap . diredViewBuffer
-    pageViewPlugId              = diredViewPlugId
-    pageViewBox                 = pageFrameBox . diredViewFrame
-    pageViewScrolledWindow      = diredViewScrolledWindow
-    pageViewFocus               = treeViewFocus . diredViewTreeView
-    pageViewHandleKeyAction     = diredViewHandleKeyAction
-    pageViewScrollToTop         = diredViewScrollToTop
-    pageViewScrollToBottom      = diredViewScrollToBottom
-    pageViewScrollVerticalPage  = diredViewScrollVerticalPage
-    pageViewScrollVerticalStep  = diredViewScrollVerticalStep
+    pageViewBuffer               = PageBufferWrap . diredViewBuffer
+    pageViewPlugId               = diredViewPlugId
+    pageViewFrame                = diredViewFrame
+    pageViewLocalKeymap _        = diredViewLocalKeymap
+    pageViewLocalCommandMap _    = diredViewLocalCommandMap
+    pageViewPropagateWidget      = castToWidget . diredViewTreeView
+    pageViewSaveState view       = diredViewSaveState view Nothing
+    pageViewRestoreState view    = diredViewRestoreState view Nothing
+    pageViewWriteState view path = diredViewSaveState view (Just path)
+    pageViewReadState view path  = diredViewRestoreState view (Just path)
+    pageViewFocus                = treeViewFocus . diredViewTreeView
+    pageViewScrollToTop          = diredViewScrollToTop
+    pageViewScrollToBottom       = diredViewScrollToBottom
+    pageViewScrollVerticalPage   = diredViewScrollVerticalPage
+    pageViewScrollVerticalStep   = diredViewScrollVerticalStep
 
 -- | Internal new function.
 diredViewNew :: DiredBuffer -> PagePlugId -> IO DiredView
@@ -377,30 +382,50 @@
       treeSortableSetSortColumnId (diredViewSortModel view) x sortType
 
 -- | Keymap.
-diredViewKeymap :: Map Text (DiredView -> IO ())
-diredViewKeymap = 
+diredViewLocalKeymap :: Map Text Text
+diredViewLocalKeymap = 
     M.fromList
-         [("j",         diredViewNextNode)
-         ,("k",         diredViewPrevNode)
-         ,("Down",      diredViewNextNode)
-         ,("Up",        diredViewPrevNode)          
-         ,("J",         diredViewScrollToBottom)
-         ,("K",         diredViewScrollToTop)
-         ,(" ",         diredViewScrollVerticalPage True)
-         ,("b",         diredViewScrollVerticalPage False)
-         ,("PageDown",  diredViewScrollVerticalPage True)
-         ,("PageUp",    diredViewScrollVerticalPage False)
-         ,("n",         diredViewSortByName)
-         ,("x",         diredViewSortByMime)
-         ,("s",         diredViewSortBySize)
-         ,("t",         diredViewSortByMTime)
-         ,("'",         diredViewUpperDirectory False)
-         ,("\"",        diredViewUpperDirectory True)
-         ,("m",         diredViewEntryNode False)
-         ,("Return",    diredViewEntryNode False)
-         ,("M",         diredViewEntryNode True)
+         [("j",         "Next")
+         ,("k",         "Previous")
+         ,("Down",      "Next")
+         ,("Up",        "Previous")          
+         ,("J",         "Scroll to top")
+         ,("K",         "Scroll to bottom")
+         ,(" ",         "Scroll page up")
+         ,("b",         "Scroll page download")
+         ,("PageDown",  "Scroll page up")
+         ,("PageUp",    "Scroll page download")
+         ,("n",         "Sort by name")
+         ,("x",         "Sort by type")
+         ,("s",         "Sort by size")
+         ,("t",         "Sort by modified time")
+         ,("'",         "Upper directory")
+         ,("\"",        "Upper directory in new tab")
+         ,("m",         "Entry")
+         ,("Return",    "Entry")
+         ,("M",         "Entry in new tab")
          ]
 
+-- | Keymap.
+diredViewLocalCommandMap :: Map Text (DiredView -> IO ())
+diredViewLocalCommandMap = 
+    M.fromList
+         [("Next",                      diredViewNextNode)
+         ,("Previous",                  diredViewPrevNode)
+         ,("Scroll to top",             diredViewScrollToBottom)
+         ,("Scroll to bottom",          diredViewScrollToTop)
+         ,("Scroll page up",            diredViewScrollVerticalPage True)
+         ,("Scroll page down",          diredViewScrollVerticalPage False)
+         ,("Sort by name",              diredViewSortByName)
+         ,("Sort by type",              diredViewSortByMime)
+         ,("Sort by size",              diredViewSortBySize)
+         ,("Sort by modified time",     diredViewSortByMTime)
+         ,("Upper directory",           diredViewUpperDirectory False)
+         ,("Upper directory in new tab",diredViewUpperDirectory True)
+         ,("Entry",                     diredViewEntryNode False)
+         ,("Entry in new tab",          diredViewEntryNode True)
+         ]
+
 -- | Begin.
 diredViewScrollToTop :: DiredView -> IO ()
 diredViewScrollToTop = 
@@ -427,14 +452,41 @@
   stepInc <- (<<<=) i2d treeViewGetSelectedCellHeight tv
   treeViewScrollVertical tv sw (if isDown then stepInc else (- stepInc))
 
--- | Handle key action.
-diredViewHandleKeyAction :: DiredView -> Text -> SerializedEvent -> IO ()  
-diredViewHandleKeyAction view keystoke sEvent = 
-  case M.lookup keystoke diredViewKeymap of
-    Just action -> action view
-    Nothing -> widgetPropagateEvent (diredViewTreeView view) sEvent
-
 -- | Scrolled window.
 diredViewScrolledWindow :: DiredView -> ScrolledWindow
 diredViewScrolledWindow =
   pageFrameScrolledWindow . diredViewFrame
+
+-- | Save state.
+diredViewSaveState :: DiredView -> Maybe FilePath -> IO ()
+diredViewSaveState view@(DiredView {diredViewBuffer     = buffer
+                                   ,diredViewTreeView   = treeView}) 
+                   statePath = do
+  -- Get selected path.
+  selectedPath <- treeViewGetSelectedPath treeView
+
+  -- Get scroll position.
+  scrolledWindowPosition <- scrolledWindowGetValue (diredViewScrolledWindow view)
+
+  -- Save state.
+  let state = DiredState selectedPath scrolledWindowPosition
+  case statePath of
+    Nothing   -> writeTVarIO (diredBufferState buffer) state
+    Just path -> writeConfigPath path state
+
+-- | Restore state.
+diredViewRestoreState :: DiredView -> Maybe FilePath -> IO ()
+diredViewRestoreState view@(DiredView {diredViewBuffer  = buffer
+                                      ,diredViewTreeView= treeView})
+                      statePath = do
+  bufferState <- readTVarIO (diredBufferState buffer)
+  (DiredState selectedPath scrolledWindowPosition) <- 
+      case statePath of
+        Just path -> readConfigPath path bufferState
+        Nothing   -> return bufferState
+
+  -- Restore selected path.
+  selectedPath ?>= \path -> treeViewSetCursor treeView path Nothing
+
+  -- Restore scroll position.
+  scrolledWindowSetValue (diredViewScrolledWindow view) scrolledWindowPosition
diff --git a/Manatee/Extension/FileManager/PageMode.hs b/Manatee/Extension/FileManager/PageMode.hs
--- a/Manatee/Extension/FileManager/PageMode.hs
+++ b/Manatee/Extension/FileManager/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/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.FileManager.PageMode
 
 import qualified Data.Map as M
@@ -26,7 +27,7 @@
 main = defaultMainWithHooks 
        -- Update Rule after install successful.
        simpleUserHooks {
-         postInst = \ _ _ _ _ -> do
+         postInst = \ _ _ pack_des lbi -> do
              -- Update PageTypeRule.
              (PageTypeRule typeRule) <- readConfig pageTypeRulePath (PageTypeRule M.empty)
              writeConfig pageTypeRulePath (PageTypeRule (M.insert "PageFileManager" "manatee-filemanager" typeRule))
@@ -37,5 +38,14 @@
              -- Update ExtensionGloalKeymap.
              (ExtensionGloalKeymap keymap) <- readConfig extensionGlobalKeymapPath (ExtensionGloalKeymap M.empty)
              writeConfig extensionGlobalKeymapPath (ExtensionGloalKeymap
-                                                    (M.insert "F4" ("PageFileManager", "/home/", []) keymap))
+                                                    (M.insert "F4" ("File Manager",
+                                                                    ("PageFileManager", "/home/", [])) keymap))
+             -- Update Application info.
+             let snapshotPath = getDataFilePath pack_des lbi "data/welcome/snapshot.png"
+             (WelcomeApplication apps) <- readConfig welcomeApplicationPath (WelcomeApplication M.empty)
+             writeConfig welcomeApplicationPath (WelcomeApplication
+                                                 (M.insert 
+                                                       ("File Manager", snapshotPath)
+                                                       ("PageFileManager", "/home/", [])
+                                                       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/manatee-filemanager.cabal b/manatee-filemanager.cabal
--- a/manatee-filemanager.cabal
+++ b/manatee-filemanager.cabal
@@ -1,13 +1,13 @@
 name:			manatee-filemanager
-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:		File manager extension for Manatee.
 description:    manatee-filemanager is file manager 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,19 @@
 stability:		provisional
 category:		Manatee, File Manager
 
-tested-with:	GHC==6.12.3
+tested-with:	GHC==7.0.2
 build-type:		Custom
 
+data-dir: ""
+data-files: data/welcome/snapshot.png
+
 Source-Repository head
   type:         darcs
   location:     http://patch-tag.com/r/AndyStewart/manatee-filemanager
   
 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,
+     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, derive, binary,
                     text >= 0.7.1.0, mtl >= 1.1.0.2, old-time >= 1.0.0.3, old-locale >= 1.0.0.2,
                     glib >= 0.12.0, gio >= 0.12.0, filepath >= 1.1.0.3, utf8-string >= 0.3.4
      exposed-modules:
