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/ProcessManager.hs b/Manatee/Extension/ProcessManager.hs
--- a/Manatee/Extension/ProcessManager.hs
+++ b/Manatee/Extension/ProcessManager.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/ProcessManager/PageMode.hs b/Manatee/Extension/ProcessManager/PageMode.hs
--- a/Manatee/Extension/ProcessManager/PageMode.hs
+++ b/Manatee/Extension/ProcessManager/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/ProcessManager/ProcessBuffer.hs b/Manatee/Extension/ProcessManager/ProcessBuffer.hs
--- a/Manatee/Extension/ProcessManager/ProcessBuffer.hs
+++ b/Manatee/Extension/ProcessManager/ProcessBuffer.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,6 +17,7 @@
 -- along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 {-# LANGUAGE ScopedTypeVariables, DeriveDataTypeable #-}
+{-# LANGUAGE TemplateHaskell #-}
 module Manatee.Extension.ProcessManager.ProcessBuffer where
 
 import Control.Applicative
@@ -25,18 +26,19 @@
 import Control.Concurrent.STM 
 import Control.Monad
 import DBus.Client hiding (Signal)
-import Data.Ord
+import Data.Binary
+import Data.DeriveTH
 import Data.List
+import Data.Ord
 import Data.Typeable
-import Graphics.UI.Gtk.General.Enums
-import Graphics.UI.Gtk.General.General
-import Graphics.UI.Gtk.ModelView.TreeSortable
+import Graphics.UI.Gtk hiding (get)
+import Manatee.Core.Config
 import Manatee.Core.Types
 import Manatee.Extension.ProcessManager.PageMode
 import Manatee.Toolkit.General.List
 import Manatee.Toolkit.General.Misc
 import Manatee.Toolkit.General.STM
-import System.Linux.Proc
+import System.Linux.Proc hiding (ProcessState)
 
 data ProcessBuffer =
     ProcessBuffer {processBufferName                    :: String
@@ -49,9 +51,15 @@
                   ,processBufferBroadcastChannel        :: TChan ProcTChanSignal
                   ,processBufferDelay                   :: Int
                   ,processBufferViewCounter             :: TVar Int
+                  ,processBufferState                   :: TVar ProcessState
                   }
     deriving Typeable
 
+data ProcessState =
+    ProcessState {processStateSelectedPath          :: (Maybe TreePath)
+                 ,processStateScrolledPosition      :: (Double, Double)
+                 }
+
 data ProcTChanSignal = Empty
                      | UpdateProcesses ([ProcStatus], [ProcStatus], [ProcStatus])
                      | KillProcess Int
@@ -150,6 +158,11 @@
     compareRow MCmdline          row1 row2 = return $ comparing psCmdline         row1 row2
     compareRow MUser             row1 row2 = return $ comparing psUsername        row1 row2
 
+-- | Init state.
+processInitState :: ProcessState      
+processInitState = 
+  ProcessState Nothing (0, 0)
+
 -- | Create process buffer.
 processBufferNew :: FilePath -> [String] -> Client -> PageId -> CustomizeWrap -> IO ProcessBuffer
 processBufferNew path _ client pageId _ = do
@@ -175,6 +188,7 @@
                 <*> newTChanIO
                 <*> pure 3000   -- default delay is 3s
                 <*> newTVarIO 0
+                <*> newTVarIO processInitState
 
 -- | Update process buffer status.
 processBufferUpdate :: ProcessBuffer -> IO () 
@@ -224,3 +238,17 @@
             Nothing -> ([x], [])
   in ((++) add *** (++) diff) (diffProcessStatus xs oldStatus)
     
+-- | Write state.
+processBufferWriteState :: ProcessBuffer -> FilePath -> IO ()
+processBufferWriteState buffer path = do
+  state <- readTVarIO $ processBufferState buffer
+  writeConfigPath path state
+
+-- | Read state.
+processBufferReadState :: ProcessBuffer -> FilePath -> IO ()  
+processBufferReadState buffer path = do
+  state <- readConfigPath path processInitState
+  writeTVarIO (processBufferState buffer) state
+  
+$(derive makeBinary ''ProcessState)
+
diff --git a/Manatee/Extension/ProcessManager/ProcessView.hs b/Manatee/Extension/ProcessManager/ProcessView.hs
--- a/Manatee/Extension/ProcessManager/ProcessView.hs
+++ b/Manatee/Extension/ProcessManager/ProcessView.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
@@ -28,8 +28,9 @@
 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.PageFrame
+import Manatee.Core.PageView
 import Manatee.Core.Types
 import Manatee.Extension.ProcessManager.ProcessBuffer
 import Manatee.Toolkit.General.Basic
@@ -38,11 +39,11 @@
 import Manatee.Toolkit.General.Process
 import Manatee.Toolkit.General.STM
 import Manatee.Toolkit.Gtk.Concurrent
-import Manatee.Toolkit.Gtk.Gtk
 import Manatee.Toolkit.Gtk.ModelView
+import Manatee.Toolkit.Gtk.ScrolledWindow
 import Paths_manatee_processmanager
-import System.Linux.Proc
 import System.FilePath
+import System.Linux.Proc
 
 import qualified Data.Map as M
 
@@ -66,16 +67,21 @@
     pageBufferPackageName _     = fmap takeFileName getDataDir
 
 instance PageView ProcessView where
-    pageViewBuffer              = PageBufferWrap . processViewBuffer
-    pageViewPlugId              = processViewPlugId
-    pageViewBox                 = pageFrameBox . processViewFrame
-    pageViewScrolledWindow      = processViewScrolledWindow
-    pageViewFocus               = treeViewFocus . processViewTreeView
-    pageViewHandleKeyAction     = processViewHandleKeyAction
-    pageViewScrollToTop         = processViewScrollToTop
-    pageViewScrollToBottom      = processViewScrollToBottom
-    pageViewScrollVerticalPage  = processViewScrollVerticalPage
-    pageViewScrollVerticalStep  = processViewScrollVerticalStep
+    pageViewBuffer               = PageBufferWrap . processViewBuffer
+    pageViewPlugId               = processViewPlugId
+    pageViewFrame                = processViewFrame
+    pageViewLocalKeymap _        = processViewLocalKeymap
+    pageViewLocalCommandMap _    = processViewLocalCommandMap
+    pageViewFocus                = treeViewFocus . processViewTreeView
+    pageViewPropagateWidget      = castToWidget . processViewTreeView
+    pageViewSaveState view       = processViewSaveState view Nothing
+    pageViewRestoreState view    = processViewRestoreState view Nothing
+    pageViewWriteState view path = processViewSaveState view (Just path)
+    pageViewReadState view path  = processViewRestoreState view (Just path)
+    pageViewScrollToTop          = processViewScrollToTop
+    pageViewScrollToBottom       = processViewScrollToBottom
+    pageViewScrollVerticalPage   = processViewScrollVerticalPage
+    pageViewScrollVerticalStep   = processViewScrollVerticalStep
 
 -- | Create process view.
 processViewNew :: ProcessBuffer -> PagePlugId -> IO ProcessView
@@ -262,39 +268,54 @@
       set cell [cellText   := getCellText info row
                ,cellXAlign := getCellXAlign info]
 
--- | Handle keymap.
-processViewHandleKeyAction :: ProcessView -> Text -> SerializedEvent -> IO ()  
-processViewHandleKeyAction view keystoke sEvent = 
-  case M.lookup keystoke processViewKeymap of
-    Just action -> action view
-    Nothing -> widgetPropagateEvent (processViewTreeView view) sEvent
-                 
 -- | Keymap.
-processViewKeymap :: Map Text (ProcessView -> IO ())
-processViewKeymap = 
+processViewLocalKeymap :: Map Text Text
+processViewLocalKeymap = 
     M.fromList
-         [("j",         processViewNextNode)
-         ,("k",         processViewPrevNode)
-         ,("Down",      processViewNextNode)
-         ,("Up",        processViewPrevNode)          
-         ,("J",         processViewScrollToBottom)
-         ,("K",         processViewScrollToTop)
-         ,(" ",         processViewScrollVerticalPage True)
-         ,("b",         processViewScrollVerticalPage False)
-         ,("PageDown",  processViewScrollVerticalPage True)
-         ,("PageUp",    processViewScrollVerticalPage False)
-         ,(";",         processViewKillProcess)
-         ,("1",         processViewSortByName)
-         ,("2",         processViewSortByProcessId)
-         ,("3",         processViewSortByUser)
-         ,("4",         processViewSortByState)
-         ,("5",         processViewSortByMemory)
-         ,("6",         processViewSortByCPU)
-         ,("7",         processViewSortByPriority)
-         ,("8",         processViewSortByThreads)
-         ,("9",         processViewSortByCmdline)
+         [("j",         "Next")
+         ,("k",         "Previous")
+         ,("Down",      "Next")
+         ,("Up",        "Previous")          
+         ,("J",         "Scroll to bottom")
+         ,("K",         "Scroll to top")
+         ,(" ",         "Scroll page up")
+         ,("b",         "Scroll page down")
+         ,("PageDown",  "Scroll page up")
+         ,("PageUp",    "Scroll page down")
+         ,(";",         "Kill process")
+         ,("1",         "Sort by name")
+         ,("2",         "Sort by process id")
+         ,("3",         "Sort by user")
+         ,("4",         "Sort by state")
+         ,("5",         "Sort by memory")
+         ,("6",         "Sort by cpu")
+         ,("7",         "Sort by priority")
+         ,("8",         "Sort by threads")
+         ,("9",         "Sort by command")
          ]
 
+-- | Keymap.
+processViewLocalCommandMap :: Map Text (ProcessView -> IO ())
+processViewLocalCommandMap = 
+    M.fromList
+         [("Next",              processViewNextNode)
+         ,("Previous",          processViewPrevNode)
+         ,("Scroll to bottom",  processViewScrollToBottom)
+         ,("Scroll to top",     processViewScrollToTop)
+         ,("Scroll page up",    processViewScrollVerticalPage True)
+         ,("Scroll page down",  processViewScrollVerticalPage False)
+         ,("Kill process",      processViewKillProcess)
+         ,("Sort by name",      processViewSortByName)
+         ,("Sort by process id",processViewSortByProcessId)
+         ,("Sort by user",      processViewSortByUser)
+         ,("Sort by state",     processViewSortByState)
+         ,("Sort by memory",    processViewSortByMemory)
+         ,("Sort by cpu",       processViewSortByCPU)
+         ,("Sort by priority",  processViewSortByPriority)
+         ,("Sort by threads",   processViewSortByThreads)
+         ,("Sort by command",   processViewSortByCmdline)
+         ]
+
 -- | Next node.
 processViewNextNode :: ProcessView -> IO ()
 processViewNextNode = treeViewFocusNextToplevelNode . processViewTreeView
@@ -426,7 +447,7 @@
       processViewRemoveProcess view (head currentPath)
 
       -- Popup notify message.
-      pageFrameShowOutputbar (processViewFrame view) ("Kill process '" ++ processName ++ "' (" ++ show processId ++ ")") Nothing
+      pageViewShowOutputbar view ("Kill process '" ++ processName ++ "' (" ++ show processId ++ ")") Nothing
   
 -- | Remove process from view.  
 processViewRemoveProcess :: ProcessView -> Int -> IO ()
@@ -438,3 +459,37 @@
 processViewScrolledWindow :: ProcessView -> ScrolledWindow
 processViewScrolledWindow =
     pageFrameScrolledWindow . processViewFrame
+
+-- | Save state.
+processViewSaveState :: ProcessView -> Maybe FilePath -> IO ()
+processViewSaveState view@(ProcessView {processViewBuffer     = buffer
+                                       ,processViewTreeView   = treeView}) 
+                     statePath = do
+  -- Get selected path.
+  selectedPath <- treeViewGetSelectedPath treeView
+
+  -- Get scroll position.
+  scrolledWindowPosition <- scrolledWindowGetValue (processViewScrolledWindow view)
+
+  -- Save state.
+  let state = ProcessState selectedPath scrolledWindowPosition
+  case statePath of
+    Nothing   -> writeTVarIO (processBufferState buffer) state
+    Just path -> writeConfigPath path state
+
+-- | Restore state.
+processViewRestoreState :: ProcessView -> Maybe FilePath -> IO ()
+processViewRestoreState view@(ProcessView {processViewBuffer  = buffer
+                                          ,processViewTreeView= treeView}) 
+                        statePath = do
+  bufferState <- readTVarIO (processBufferState buffer)
+  (ProcessState 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 (processViewScrolledWindow view) 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.ProcessManager.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 "PageProcessManager" "manatee-processmanager" rule))
              -- Update PageModeRule.
@@ -37,6 +38,15 @@
              -- Update ExtensionGloalKeymap.
              (ExtensionGloalKeymap keymap) <- readConfig extensionGlobalKeymapPath (ExtensionGloalKeymap M.empty)
              writeConfig extensionGlobalKeymapPath (ExtensionGloalKeymap
-                                                    (M.insert "F2" ("PageProcessManager", "ProcessManager", []) keymap))
+                                                    (M.insert "F2" ("Process Manager",
+                                                                    ("PageProcessManager", "ProcessManager", [])) 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 
+                                                       ("Process Manager", snapshotPath)
+                                                       ("PageProcessManager", "ProcessManager", [])
+                                                       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-processmanager.cabal b/manatee-processmanager.cabal
--- a/manatee-processmanager.cabal
+++ b/manatee-processmanager.cabal
@@ -1,13 +1,13 @@
 name:			manatee-processmanager
-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:		Process manager extension for Manatee.
 description:    manatee-processmanager is process 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, Process Manager, System
 
-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-processmanager
   
 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, proc >= 0.0.8, filepath
      exposed-modules:
          Manatee.Extension.ProcessManager
