diff --git a/Manatee/Extension/Template/TemplateBuffer.hs b/Manatee/Extension/Template/TemplateBuffer.hs
--- a/Manatee/Extension/Template/TemplateBuffer.hs
+++ b/Manatee/Extension/Template/TemplateBuffer.hs
@@ -17,14 +17,19 @@
 -- along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 {-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE TemplateHaskell #-}
 module Manatee.Extension.Template.TemplateBuffer where
 
 import Control.Applicative
 import Control.Concurrent.STM 
 import DBus.Client hiding (Signal)
+import Data.Binary
+import Data.DeriveTH
 import Data.Typeable
+import Manatee.Core.Config
 import Manatee.Core.Types
 import Manatee.Extension.Template.PageMode
+import Manatee.Toolkit.General.STM
 
 import qualified Graphics.UI.Gtk.SourceView.SourceBuffer as SB
 
@@ -34,9 +39,19 @@
                    ,templateBufferPageId            :: PageId
                    ,templateBufferMode              :: PageMode
                    ,templateBufferBuffer            :: SB.SourceBuffer
+                   ,templateBufferState             :: TVar TemplateState
                    } 
     deriving Typeable
 
+data TemplateState =
+    TemplateState {templateStateCursor              :: Maybe (Int, Int)
+                  ,templateStateScrolledPosition    :: (Double, Double)}
+
+-- | Init state.
+templateInitState :: TemplateState
+templateInitState =
+    TemplateState (Just (1, 0)) (0, 0)
+
 -- | New template buffer.
 templateBufferNew :: String        -- Buffer name, also is Tab name
                   -> [String]      -- option pass application to parse
@@ -51,3 +66,18 @@
                  <*> pure pageId
                  <*> pure templateMode
                  <*> pure buffer
+                 <*> newTVarIO templateInitState
+
+-- | Write state.
+templateBufferWriteState :: TemplateBuffer -> FilePath -> IO ()
+templateBufferWriteState buffer path = do
+  state <- readTVarIO $ templateBufferState buffer
+  writeConfigPath path state
+
+-- | Read state.
+templateBufferReadState :: TemplateBuffer -> FilePath -> IO ()  
+templateBufferReadState buffer path = do
+  state <- readConfigPath path templateInitState
+  writeTVarIO (templateBufferState buffer) state
+  
+$(derive makeBinary ''TemplateState)
diff --git a/Manatee/Extension/Template/TemplateView.hs b/Manatee/Extension/Template/TemplateView.hs
--- a/Manatee/Extension/Template/TemplateView.hs
+++ b/Manatee/Extension/Template/TemplateView.hs
@@ -26,12 +26,13 @@
 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.Types
 import Manatee.Extension.Template.TemplateBuffer
+import Manatee.Toolkit.General.Maybe
 import Manatee.Toolkit.General.STM
-import Manatee.Toolkit.Gtk.Gtk
+import Manatee.Toolkit.Gtk.Multiline
 import Paths_manatee_template
 import System.FilePath
 
@@ -65,25 +66,46 @@
     -- Get package name to update user's configure.
     pageBufferPackageName _     = fmap takeFileName getDataDir
 
+    -- Save buffer state.
+    pageBufferWriteState        = templateBufferWriteState
+    
+    -- Restore buffer state.
+    pageBufferReadState         = templateBufferReadState
+
 instance PageView TemplateView where
     -- Page buffer.
-    pageViewBuffer              = PageBufferWrap . templateViewBuffer
+    pageViewBuffer                = PageBufferWrap . templateViewBuffer
+                                  
+    -- GtkPlug id.                
+    pageViewPlugId                = templateViewPlugId
+                                  
+    -- Page Frame.                
+    pageViewFrame                 = templateViewFrame
+                                  
+    -- Local keymap.              
+    pageViewLocalKeymap _         = templateViewLocalKeymap
 
-    -- GtkPlug id.
-    pageViewPlugId              = templateViewPlugId
+    -- Command map.
+    pageViewLocalCommandMap _     = templateViewLocalCommandMap
 
-    -- Box.
-    pageViewBox                 = pageFrameBox . templateViewFrame
+    -- How to focus when manatee focus current application.
+    pageViewFocus                 = widgetGrabFocus . templateViewView
 
-    -- Scrolled window.
-    pageViewScrolledWindow      = pageFrameScrolledWindow . templateViewFrame
+    -- Which widget to propagate event.
+    pageViewPropagateWidget       = castToWidget . templateViewView
+                                 
+    -- Save view state.          
+    pageViewSaveState view        = templateViewSaveState view Nothing
 
-    -- How to focus when manatee focus current application.
-    pageViewFocus               = widgetGrabFocus . templateViewView
+    -- Restore view state.
+    pageViewRestoreState view     = templateViewRestoreState view Nothing
 
-    -- How to handle key action that pass from daemon process.
-    pageViewHandleKeyAction     = templateViewHandleKeyAction
+    -- Save view state to file.
+    pageViewWriteState view path  = templateViewSaveState view (Just path)
 
+    -- Restore view state from file.
+    pageViewReadState view path   = templateViewRestoreState view (Just path)
+
     -- How to handle cut action, can ignore.
     -- pageViewCut                 = templateViewCut
 
@@ -133,16 +155,49 @@
   return $ TemplateView pId pFrame templateView sb
 
 -- | String buffer keymap.
-templateViewKeymap :: Map Text (TemplateView -> IO ())
-templateViewKeymap = 
+templateViewLocalKeymap :: Map Text Text
+templateViewLocalKeymap = 
     M.fromList []
 
--- | Handle key action.
-templateViewHandleKeyAction :: TemplateView -> Text -> SerializedEvent -> IO ()
-templateViewHandleKeyAction view keystoke sEvent = 
-  case M.lookup keystoke templateViewKeymap of
-    -- Execute action when found in keymap.
-    Just action -> action view
-    -- Otherwise propagate event.
-    Nothing -> widgetPropagateEvent (templateViewView view) sEvent 
+-- | String buffer keymap.
+templateViewLocalCommandMap :: Map Text (TemplateView -> IO ())
+templateViewLocalCommandMap = 
+    M.fromList []
+
+-- | Template view scrolled window.
+templateViewScrolledWindow :: TemplateView -> ScrolledWindow    
+templateViewScrolledWindow =
+  pageFrameScrolledWindow . templateViewFrame
+
+-- | Save state.
+templateViewSaveState :: TemplateView -> Maybe FilePath -> IO ()
+templateViewSaveState view@(TemplateView {templateViewBuffer  = buffer}) 
+                      statePath = do
+  -- Get scroll position.
+  scrolledWindowPosition <- textViewGetCursorAlign (templateViewView view)
+
+  -- Save state.
+  let state = TemplateState Nothing scrolledWindowPosition
+  case statePath of
+       Nothing   -> writeTVarIO (templateBufferState buffer) state
+       Just path -> writeConfigPath path state
+
+-- | Restore state.
+templateViewRestoreState :: TemplateView -> Maybe FilePath -> IO ()
+templateViewRestoreState TemplateView {templateViewBuffer  = buffer
+                                      ,templateViewView    = textView} 
+                         statePath = do
+  bufferState <- readTVarIO (templateBufferState buffer)
+  (TemplateState 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.
+  textViewSetCursorAlign textView scrolledWindowPosition
 
diff --git a/Setup.hs b/Setup.hs
--- a/Setup.hs
+++ b/Setup.hs
@@ -37,5 +37,6 @@
              -- PageMode with global keymap.
              (ExtensionGloalKeymap keymap) <- readConfig extensionGlobalKeymapPath (ExtensionGloalKeymap M.empty)
              writeConfig extensionGlobalKeymapPath (ExtensionGloalKeymap
-                                                    (M.insert "F1" ("PageTemplate", "Template", []) keymap))
+                                                    (M.insert "F1" ("Example extension",
+                                                                    ("PageTemplate", "Template", [])) keymap))
        }
diff --git a/manatee-template.cabal b/manatee-template.cabal
--- a/manatee-template.cabal
+++ b/manatee-template.cabal
@@ -1,16 +1,15 @@
-
 name:			manatee-template
-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:		Template code to create Manatee application.
 description:    manatee-template is template package to help you create your own manatee application.
  . 
  Details look <http://haskell.org/haskellwiki/Manatee#How_to_write_Manatee_extension>
  .
- 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>
  .
@@ -25,7 +24,7 @@
 stability:		provisional
 category:		Manatee, Template, IDE
 
-tested-with:	GHC==6.12.3
+tested-with:	GHC==7.0.2
 build-type:		Custom
 
 Source-Repository head
@@ -33,8 +32,8 @@
   location:     http://patch-tag.com/r/AndyStewart/manatee-template
   
 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.Template
