diff --git a/Config/Curl.hs b/Config/Curl.hs
new file mode 100644
--- /dev/null
+++ b/Config/Curl.hs
@@ -0,0 +1,39 @@
+-- Author:     Andy Stewart <lazycat.manatee@gmail.com>
+-- Maintainer: Andy Stewart <lazycat.manatee@gmail.com>
+-- 
+-- Copyright (C) 2010 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
+-- the Free Software Foundation, either version 3 of the License, or
+-- any later version.
+-- 
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+-- 
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+module Config.User where
+
+-- | Default download thread number.
+defaultThreadNumber :: Int
+defaultThreadNumber = 8
+
+-- | Default cache size (bytes).
+-- Default is 512K.
+-- This cache value is for thread, 
+-- max memory is bigger if you use more threads.
+-- Of course, memory will release after flush cache to disk.
+-- NOTE, don't set value too little, 
+-- it will cause too many I/O operation if cache size is less than download speed.
+defaultCacheSize :: Int
+defaultCacheSize = 
+  512 * 2 ^ 10
+
+-- | Whether automatic start download file when startup process?
+-- Default is 'False'.
+autoStart :: Bool
+autoStart = False
diff --git a/Config/Default.hs b/Config/Default.hs
new file mode 100644
--- /dev/null
+++ b/Config/Default.hs
@@ -0,0 +1,39 @@
+-- Author:     Andy Stewart <lazycat.manatee@gmail.com>
+-- Maintainer: Andy Stewart <lazycat.manatee@gmail.com>
+-- 
+-- Copyright (C) 2010 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
+-- the Free Software Foundation, either version 3 of the License, or
+-- any later version.
+-- 
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+-- 
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+module Config.Default where
+
+-- | Default download thread number.
+defaultThreadNumber :: Int
+defaultThreadNumber = 8
+
+-- | Default cache size (bytes).
+-- Default is 512K.
+-- This cache value is for thread, 
+-- max memory is bigger if you use more threads.
+-- Of course, memory will release after flush cache to disk.
+-- NOTE, don't set value too little, 
+-- it will cause too many I/O operation if cache size is less than download speed.
+defaultCacheSize :: Int
+defaultCacheSize = 
+  512 * 2 ^ 10
+
+-- | Whether automatic start download file when startup process?
+-- Default is 'False'.
+autoStart :: Bool
+autoStart = False
diff --git a/Config/Import.hs b/Config/Import.hs
new file mode 100644
--- /dev/null
+++ b/Config/Import.hs
@@ -0,0 +1,21 @@
+-- Author:     Andy Stewart <lazycat.manatee@gmail.com>
+-- Maintainer: Andy Stewart <lazycat.manatee@gmail.com>
+-- 
+-- Copyright (C) 2010 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
+-- the Free Software Foundation, either version 3 of the License, or
+-- any later version.
+-- 
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+-- 
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+module Config.Import (defaultThreadNumber, defaultCacheSize, autoStart) where 
+
+import Config.Default
diff --git a/Config/User.hs b/Config/User.hs
new file mode 100644
--- /dev/null
+++ b/Config/User.hs
@@ -0,0 +1,19 @@
+-- Author:     Andy Stewart <lazycat.manatee@gmail.com>
+-- Maintainer: Andy Stewart <lazycat.manatee@gmail.com>
+-- 
+-- Copyright (C) 2010 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
+-- the Free Software Foundation, either version 3 of the License, or
+-- any later version.
+-- 
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+-- 
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+module Config.User where
diff --git a/Main.hs b/Main.hs
--- a/Main.hs
+++ b/Main.hs
@@ -21,12 +21,16 @@
 module Main where
 
 import Control.Applicative hiding (empty)
+import Manatee.Core.Dynload
 import Manatee.Core.Render
 import Manatee.Core.Types
 import Manatee.Extension.Curl
+import Manatee.Extension.Curl.Types
 
 -- | Irc client render process.
 main :: IO ()
 main = 
-    startupRender (\ pagePath options client pageId -> 
-                       PageBufferWrap <$> curlBufferNew pagePath options client pageId)
+    startupRender 
+    (\ pagePath options client pageId customize -> 
+                       PageBufferWrap <$> curlBufferNew pagePath options client pageId customize)
+    curlCustomizeNew
diff --git a/Manatee/Extension/Curl/CurlBuffer.hs b/Manatee/Extension/Curl/CurlBuffer.hs
--- a/Manatee/Extension/Curl/CurlBuffer.hs
+++ b/Manatee/Extension/Curl/CurlBuffer.hs
@@ -20,6 +20,7 @@
 {-# LANGUAGE ScopedTypeVariables, DeriveDataTypeable #-}
 module Manatee.Extension.Curl.CurlBuffer where
 
+import Config.Import
 import Control.Applicative
 import Control.Concurrent
 import Control.Concurrent.STM 
@@ -36,6 +37,7 @@
 import Graphics.UI.Gtk.ModelView.TreeSortable
 import Manatee.Core.Config
 import Manatee.Core.DBus
+import Manatee.Core.Dynload
 import Manatee.Core.Types
 import Manatee.Extension.Curl.PageMode
 import Manatee.Extension.Curl.Types
@@ -74,6 +76,7 @@
                ,curlBufferDownloadStatusPixbuf  :: DownloadStatusPixbuf
                ,curlBufferMode                  :: PageMode
                ,curlBufferBroadcastChannel      :: TChan CurlTChanSignal
+               ,curlBufferCustomize             :: CurlCustomize
                }
     deriving Typeable
 
@@ -85,7 +88,7 @@
 class CurlFileInfoClass a where
     getColumnTitle      :: a -> String                         -- get title for treeColumn 
     getCellXAlign       :: a -> Float                          -- get x align for cell
-    getCellMinWidth     :: a -> Maybe Int                      -- get min width for cell
+    getCellWidthChars   :: a -> Int                            -- get min width for cell
     getCellMaxWidth     :: a -> Maybe Int                      -- get max width for cell
     getCellText         :: a -> DownloadFile -> IO String       -- get text for cell
     compareRow          :: a -> DownloadFile -> DownloadFile -> IO Ordering -- compare row for treeView
@@ -109,14 +112,14 @@
   getCellXAlign        DFThread        = 1.0
   getCellXAlign        DFURL           = 0.0
 
-  getCellMinWidth        DFName          = Nothing
-  getCellMinWidth        DFSize          = Just 70
-  getCellMinWidth        DFDownloadSize  = Just 70
-  getCellMinWidth        DFRestSize      = Just 70
-  getCellMinWidth        DFSpeed         = Just 80
-  getCellMinWidth        DFRestTime      = Nothing
-  getCellMinWidth        DFThread        = Nothing
-  getCellMinWidth        DFURL           = Nothing
+  getCellWidthChars        DFName          = -1
+  getCellWidthChars        DFSize          = length ("xxx.xx KB" :: String)
+  getCellWidthChars        DFDownloadSize  = length ("xxx.xx KB" :: String)
+  getCellWidthChars        DFRestSize      = length ("xxx.xx KB" :: String)
+  getCellWidthChars        DFSpeed         = length ("xxx.xx Kb/s" :: String)
+  getCellWidthChars        DFRestTime      = length ("xxxd xxh xxm xxs" :: String)
+  getCellWidthChars        DFThread        = -1
+  getCellWidthChars        DFURL           = -1
 
   getCellMaxWidth        DFName          = Just 300
   getCellMaxWidth        DFSize          = Nothing
@@ -165,10 +168,6 @@
   compareRow DFURL              row1 row2 =
       liftA2 compare (downloadFileGetURL row1) (downloadFileGetURL row2)
 
--- | Default download thread number.
-defaultThreadNumber :: Int
-defaultThreadNumber = 4
-
 -- | Default download directory.
 defaultDownloadDir :: FilePath
 defaultDownloadDir = 
@@ -179,25 +178,12 @@
 defaultCacheDir = 
     "download/cache"
 
--- | Default cache size (bytes).
--- Default is 512K.
--- This cache value is for thread, 
--- max memory is bigger if you use more threads.
--- Of course, memory will release after flush cache to disk.
--- NOTE, don't set value too little, 
--- it will cause too many I/O operation if cache size is less than download speed.
-defaultCacheSize :: Int
-defaultCacheSize = 
-  512 * 2 ^ 10
-
--- | Whether automatic start download file when startup process?
--- Default is 'False'.
-autoStart :: Bool
-autoStart = False
-
 -- | New.
-curlBufferNew :: FilePath -> [String] -> Client -> PageId -> IO CurlBuffer
-curlBufferNew name urls client pageId = do
+curlBufferNew :: FilePath -> [String] -> Client -> PageId -> CustomizeWrap -> IO CurlBuffer
+curlBufferNew name urls client pageId c = do
+  -- Get customize option.
+  let customize = castCustomize c
+
   -- Create directory if missing.
   configDir <- getConfigDirectory
   createDirectoryIfMissing True (configDir </> defaultDownloadDir)
@@ -219,6 +205,7 @@
                       <*> pixbufNewFromIcon "gtk-cancel" 16)
                  <*> pure curlMode
                  <*> (newTChanIO :: IO (TChan CurlTChanSignal)) 
+                 <*> pure customize
 
   -- Scan cache file to resume.
   curlBufferScanCacheFile buffer
@@ -254,7 +241,11 @@
 
 -- | Add download.
 curlBufferAddDownload :: CurlBuffer -> String -> IO ()
-curlBufferAddDownload curlBuffer uri = 
+curlBufferAddDownload curlBuffer@(CurlBuffer 
+                                  {curlBufferCustomize =
+                                       CurlCustomize 
+                                       {curlCustomizeDefaultThreadNumber = threadNumberTVar}}) 
+                      uri = 
   case parseURI uri of
     Nothing -> putStrLn $ "Malformed URI : " ++ uri
     Just _  -> do
@@ -292,6 +283,7 @@
              writeTVarIO (dfSize downloadFile) size
 
              -- Update DownloadBuffer.
+             defaultThreadNumber <- readTVarIO threadNumberTVar
              buffers <- initDownloadBuffers size defaultThreadNumber
              writeTVarIO (dfBuffers downloadFile) buffers
 
@@ -342,7 +334,10 @@
     
 -- | Scan cache file to resume.
 curlBufferScanCacheFile :: CurlBuffer -> IO ()
-curlBufferScanCacheFile curlBuffer = 
+curlBufferScanCacheFile curlBuffer@(CurlBuffer 
+                                    {curlBufferCustomize = 
+                                         CurlCustomize 
+                                         {curlCustomizeAutoStart = autoStartTVar}}) = 
   forkIO_ $ do
     -- Get log pathes.
     logPathes <- getLogPathes
@@ -350,6 +345,7 @@
     -- Scan log patch to pick cache information.
     forM_ logPathes $ \ logPath -> 
         forkIO_ $ do
+          autoStart <- readTVarIO autoStartTVar
           -- Get DownloadLog.
           let emptyLog = DownloadLog "" "" 0 M.empty
           downloadLog@(DownloadLog {dlBuffers = logBufferMap}) <- readConfig logPath emptyLog
@@ -489,6 +485,7 @@
   writeTVarIO (dbThreadId downloadBuffer) (Just tId)
   let range = show start ++ "-" ++ show end
       lock  = dfFinishLock downloadFile
+      cacheSizeTVar = curlCustomizeDefaultCacheSize $ curlBufferCustomize curlBuffer 
 
   -- Init curl.
   h <- initialize
@@ -504,7 +501,7 @@
   setopt h (CurlRange range)
   setopt h (CurlNoProgress False)
   -- setopt h (CurlVerbose True)   -- debug
-  setopt h (CurlWriteFunction (gather ref downloadFile downloadBuffer))
+  setopt h (CurlWriteFunction (gather ref cacheSizeTVar downloadFile downloadBuffer))
   setopt h (CurlProgressData nullPtr)
   setopt h (CurlProgressFunction 
             (\ _ _ download _ _ -> do
@@ -584,8 +581,8 @@
                 tryPutMVar lock DownloadFinish >> return ()
 
 -- | Gather network data.
-gather :: TVar BufferCache -> DownloadFile -> DownloadBuffer -> WriteFunction
-gather tvar downloadFile downloadBuffer = 
+gather :: TVar BufferCache -> TVar Int -> DownloadFile -> DownloadBuffer -> WriteFunction
+gather tvar cacheSizeTVar downloadFile downloadBuffer = 
   writer $ \(srcPtr, bytes) -> do
     -- Copy memory chunks of data into bytestring.
     BufferCache destPtr offset <- readTVarIO tvar
@@ -593,6 +590,7 @@
     newDestPtr <- reallocBytes destPtr newOffset
     S.memcpy (newDestPtr `plusPtr` offset) srcPtr (fromIntegral bytes)
 
+    defaultCacheSize <- readTVarIO cacheSizeTVar
     if newOffset >= defaultCacheSize 
        -- Flush cache to disk if data reach cache size.
        then do
@@ -830,3 +828,11 @@
                          <*> newTVarIO cacheSize
                          <*> newTVarIO isFinish)
   
+-- | Curl customize new.
+curlCustomizeNew :: IO CustomizeWrap
+curlCustomizeNew =
+  fmap CustomizeWrap $
+       CurlCustomize <$> newTVarIO defaultThreadNumber
+                     <*> newTVarIO defaultCacheSize
+                     <*> newTVarIO autoStart
+
diff --git a/Manatee/Extension/Curl/CurlView.hs b/Manatee/Extension/Curl/CurlView.hs
--- a/Manatee/Extension/Curl/CurlView.hs
+++ b/Manatee/Extension/Curl/CurlView.hs
@@ -45,6 +45,7 @@
 import Manatee.Toolkit.Gtk.Gtk
 import Manatee.Toolkit.Gtk.ModelView
 import Manatee.Toolkit.Gtk.ScrolledWindow
+import Paths_manatee_curl
 import System.Directory
 import System.FilePath
 import System.GIO
@@ -69,6 +70,7 @@
     pageBufferClient            = curlBufferClient
     pageBufferCreateView a pId  = PageViewWrap <$> curlViewNew a pId
     pageBufferMode              = curlBufferMode
+    pageBufferPackageName _     = fmap takeFileName getDataDir
 
 instance PageView CurlView where
     pageViewBuffer              = PageBufferWrap . curlViewBuffer
@@ -254,12 +256,13 @@
 
   let name = getColumnTitle info
   tvc <- treeViewAddColumnWithTitle treeView name sortId
-  getCellMinWidth info 
-      ?>= \width -> set tvc [treeViewColumnMinWidth := width]
+  -- Set max width.
   getCellMaxWidth info 
       ?>= \width -> set tvc [treeViewColumnMaxWidth := width]
 
   cell <- cellRendererTextNew
+  -- Set min width request. 
+  set cell [cellTextWidthChars := getCellWidthChars info]
   treeViewColumnPackStart tvc cell True
 
   curlViewSetCellText tvc cell model sortModel info
@@ -539,16 +542,4 @@
          ,("7",         curlViewSortByRestTime)
          ,("8",         curlViewSortByThread)
          ,("9",         curlViewSortByUrl)
-         ,("t",         curlViewTest)
          ]
-
-curlViewTest :: CurlView -> IO ()
-curlViewTest view@(CurlView {curlViewBuffer = buffer}) = do
-  let urls = ["http://3c.media.v4.skyrock.net/music/3c2/316/3c2316b00657d412725ce07c1c7a3900.mp3"]
-  forM_ urls $ \ url -> do
-      files <- readTVarIO $ curlBufferFileInfos buffer
-      if url `elem` map dfURL files
-         then pageViewUpdateOutputStatus view ("Has exist " ++ url) Nothing
-         else curlBufferAddDownload buffer url
-
-
diff --git a/Manatee/Extension/Curl/Types.hs b/Manatee/Extension/Curl/Types.hs
--- a/Manatee/Extension/Curl/Types.hs
+++ b/Manatee/Extension/Curl/Types.hs
@@ -30,6 +30,26 @@
 import Data.Typeable
 import Foreign
 import Graphics.UI.Gtk.Gdk.Pixbuf
+import Manatee.Core.Types
+import Manatee.Toolkit.General.STM
+import Unsafe.Coerce
+
+data CurlCustomize =
+    CurlCustomize {curlCustomizeDefaultThreadNumber     :: TVar Int
+                  ,curlCustomizeDefaultCacheSize        :: TVar Int
+                  ,curlCustomizeAutoStart        :: TVar Bool
+                  }
+    deriving Typeable
+
+instance Customize CurlCustomize where
+  customizeConfigFile _ = "Curl.hs"
+  customizeLoad a       =
+    [("defaultThreadNumber"
+     ,\v -> writeTVarIO (curlCustomizeDefaultThreadNumber a) (unsafeCoerce v :: Int))
+    ,("defaultCacheSize"
+     ,\v -> writeTVarIO (curlCustomizeDefaultCacheSize a) (unsafeCoerce v :: Int))
+    ,("autoStart"
+     ,\v -> writeTVarIO (curlCustomizeAutoStart a) (unsafeCoerce v :: Bool))]
 
 data DownloadFile =
     DownloadFile {dfURL                 :: String
diff --git a/Setup.hs b/Setup.hs
--- a/Setup.hs
+++ b/Setup.hs
@@ -16,8 +16,10 @@
 -- You should have received a copy of the GNU General Public License
 -- along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
+import Distribution.PackageDescription
 import Distribution.Simple
 import Manatee.Core.Config
+import Manatee.Core.Dynload
 import Manatee.Core.Types
 import Manatee.Toolkit.General.List
 import Manatee.Toolkit.General.Map
@@ -27,8 +29,13 @@
 
 main = defaultMainWithHooks 
        simpleUserHooks {
+         -- Generate User.hs and Import.hs before configure.
+         preConf = \ _ _ -> do
+             generateConfig "Curl.hs"
+                                ["defaultThreadNumber", "defaultCacheSize", "autoStart"]
+             return emptyHookedBuildInfo
          -- Update Rule after install successful.
-         postInst = \ _ _ _ _ -> do
+        ,postInst = \ _ _ _ _ -> do
              -- Update PageTypeRule.
              (PageTypeRule typeRule) <- readConfig pageTypeRulePath (PageTypeRule M.empty)
              writeConfig pageTypeRulePath (PageTypeRule (M.insert "PageCurl" "manatee-curl" typeRule))
diff --git a/manatee-curl.cabal b/manatee-curl.cabal
--- a/manatee-curl.cabal
+++ b/manatee-curl.cabal
@@ -1,5 +1,5 @@
 name:			manatee-curl
-version:		0.0.6
+version:		0.0.7
 Cabal-Version:	>= 1.6
 license:		GPL-3
 license-file:	LICENSE
@@ -7,8 +7,12 @@
 synopsis:		Download Manager extension for Manatee.
 description:    manatee-curl is multithreads download manager extension for Manatee (Haskell/Gtk+ Integrated Live Environment)
  .
- Video at (Select 720p HD) at : <http://www.youtube.com/watch?v=weS6zys3U8k> <http://v.youku.com/v_show/id_XMjI2MDMzODI4.html>
+ Default configuration template at Config\/Curl.hs, copy to directory `HOME/.manatee/config/`.
  .
+ Note, you need re-install package to start the configuration file take effect the next time,
+ .
+ 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>
+ .
  Screenshots at : <http://goo.gl/MkVw>
  .
  Manual at : <http://haskell.org/haskellwiki/Manatee>
@@ -25,12 +29,15 @@
 tested-with:	GHC==6.12.3
 build-type:		Custom
 
+data-dir: ""
+data-files: Config/Curl.hs            
+
 Source-Repository head
   type:         darcs
   location:     http://patch-tag.com/r/AndyStewart/manatee-curl
   
 Library
-     build-depends: base >= 4 && < 5, manatee-core >= 0.0.6, dbus-client >= 0.3 && < 0.4, stm >= 2.1.2.0,
+     build-depends: base >= 4 && < 5, manatee-core >= 0.0.7, 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,
                     text >= 0.7.1.0, mtl >= 1.1.0.2, old-time, old-locale, glib >= 0.12.0, gio >= 0.12.0,
                     filepath >= 1.1.0.3, utf8-string >= 0.3.4, bytestring, network, curl >= 1.3.5, directory,
@@ -42,6 +49,10 @@
          Manatee.Extension.Curl.CurlView	 
          Manatee.Extension.Curl.Types
      other-modules:							
+         Paths_manatee_curl
+         Config.Default                                                
+         Config.User                                                
+         Config.Import
      extensions:  
      ghc-options: -fwarn-unused-matches -fwarn-unused-binds -fwarn-unused-imports -fwarn-overlapping-patterns -fwarn-duplicate-exports -fwarn-unrecognised-pragmas -fwarn-hi-shadowing 
      
