diff --git a/Graphics/UI/Gtk/SourceView/Signals.chs b/Graphics/UI/Gtk/SourceView/Signals.chs
--- a/Graphics/UI/Gtk/SourceView/Signals.chs
+++ b/Graphics/UI/Gtk/SourceView/Signals.chs
@@ -54,7 +54,7 @@
 import Control.Monad	(liftM)
 
 import System.Glib.FFI
-import System.Glib.UTFString   (peekUTFString)
+import System.Glib.UTFString   (peekUTFString,maybePeekUTFString)
 import System.Glib.GError      (failOnGError)
 {#import System.Glib.Signals#}
 {#import System.Glib.GObject#} 
diff --git a/Graphics/UI/Gtk/SourceView/SourceGutter.chs b/Graphics/UI/Gtk/SourceView/SourceGutter.chs
--- a/Graphics/UI/Gtk/SourceView/SourceGutter.chs
+++ b/Graphics/UI/Gtk/SourceView/SourceGutter.chs
@@ -53,6 +53,8 @@
     sourceGutterReorder,
     sourceGutterRemove,
     sourceGutterQueueDraw,
+    sourceGutterSetCellDataFunc,
+    sourceGutterSetCellSizeFunc,
 
 -- * Attributes
     sourceGutterView,
@@ -80,6 +82,18 @@
 
 {# context lib="gtk" prefix="gtk" #}
 
+{#pointer SourceGutterDataFunc#}
+
+foreign import ccall "wrapper" mkSourceGutterDataFunc ::
+  (Ptr SourceGutter -> Ptr CellRenderer -> {#type gint#} -> {#type gboolean#} -> Ptr () -> IO ())
+  -> IO SourceGutterDataFunc
+
+{#pointer SourceGutterSizeFunc#}
+
+foreign import ccall "wrapper" mkSourceGutterSizeFunc ::
+  (Ptr SourceGutter -> Ptr CellRenderer -> Ptr () -> IO ())
+  -> IO SourceGutterSizeFunc
+
 -- | Get the 'Window' of the gutter. The window will only be available when the gutter has at least one,
 -- non-zero width, cell renderer packed.
 sourceGutterGetWindow :: SourceGutterClass sg => sg -> IO (Maybe DrawWindow)
@@ -124,6 +138,42 @@
 sourceGutterQueueDraw sb =
   {#call gtk_source_gutter_queue_draw #} (toSourceGutter sb)
 
+-- | Sets the 'SourceGutterDataFunc' to use for renderer. This function is used to setup the cell
+-- renderer properties for rendering the current cell.
+sourceGutterSetCellDataFunc :: (SourceGutterClass sg, CellRendererClass cell)
+                              => sg
+                              -> cell
+                              -> (CellRenderer -> Int -> Bool -> IO ())
+                              -> IO ()
+sourceGutterSetCellDataFunc gutter cell func = do
+  funcPtr <- mkSourceGutterDataFunc $ \_ c line currentLine _ -> do
+    func (toCellRenderer cell)
+         (fromIntegral line)
+         (toBool currentLine)
+  {#call gtk_source_gutter_set_cell_data_func #}
+     (toSourceGutter gutter)
+     (toCellRenderer cell)
+     funcPtr
+     (castFunPtrToPtr funcPtr)
+     destroyFunPtr
+
+-- | Sets the 'SourceGutterSizeFunc' to use for renderer. This function is used to setup the cell
+-- renderer properties for measuring the maximum size of the cell.
+sourceGutterSetCellSizeFunc :: (SourceGutterClass gutter, CellRendererClass cell)
+                              => gutter
+                              -> cell
+                              -> (CellRenderer -> IO ())
+                              -> IO ()
+sourceGutterSetCellSizeFunc gutter cell func = do
+  funcPtr <- mkSourceGutterSizeFunc $ \ _ c _ -> do
+    func (toCellRenderer cell)
+  {#call gtk_source_gutter_set_cell_size_func #}
+     (toSourceGutter gutter)
+     (toCellRenderer cell)
+     funcPtr
+     (castFunPtrToPtr funcPtr)
+     destroyFunPtr
+
 -- | The 'SourceView' of the gutter
 sourceGutterView :: SourceGutterClass sg => Attr sg SourceView
 sourceGutterView = newAttrFromObjectProperty "view"
@@ -150,3 +200,4 @@
 sourceGutterQueryTooltip :: SourceGutterClass sg => Signal sg (CellRenderer -> TextIter -> Tooltip -> IO Bool)
 sourceGutterQueryTooltip = 
     Signal $ connect_OBJECT_BOXED_OBJECT__BOOL "query-tooltip" mkTextIterCopy
+
diff --git a/demo/LineNumber.hs b/demo/LineNumber.hs
new file mode 100644
--- /dev/null
+++ b/demo/LineNumber.hs
@@ -0,0 +1,53 @@
+-- | Line number demo.
+--  Author      :  Andy Stewart
+--  Copyright   :  (c) 2010 Andy Stewart <lazycat.manatee@gmail.com>
+--
+-- This demo show how to build your own line number gutter.
+--
+module Main where
+
+import Graphics.UI.Gtk
+import Graphics.UI.Gtk.SourceView
+
+main = do
+  -- Init.
+  initGUI
+  
+  -- Create window.
+  window <- windowNew
+  windowSetDefaultSize window 900 600
+  windowSetPosition window WinPosCenter
+
+  -- Create source view widget.
+  sourceView <- sourceViewNew
+
+  -- Create scroll window.
+  scrolledWindow <- scrolledWindowNew Nothing Nothing
+
+  -- Insert CellRendererText in source view's gutter.
+  gutter <- sourceViewGetGutter sourceView TextWindowLeft
+  cell   <- cellRendererTextNew
+  sourceGutterInsert gutter cell 0
+
+  -- Set gutter data.
+  sourceGutterSetCellDataFunc gutter cell $ \ c l currentLine -> do
+         -- Display line number.
+         set (castToCellRendererText c) [cellText := show (l + 1)]
+         -- Highlight current line.
+         let color = if currentLine 
+                        then Color 65535 0 0 
+                        else Color 0 65535 0
+         set (castToCellRendererText c) [cellTextForegroundColor := color]
+
+  -- Set gutter size.
+  sourceGutterSetCellSizeFunc gutter cell $ \ c -> 
+      -- -1 mean cell renderer will adjust width with chars dynamically.
+      set (castToCellRendererText c) [cellTextWidthChars := (-1)]
+
+  -- Connect and show.
+  scrolledWindow `containerAdd` sourceView
+  window `containerAdd` scrolledWindow
+  window `onDestroy` mainQuit
+  widgetShowAll window
+
+  mainGUI
diff --git a/demo/Makefile b/demo/Makefile
--- a/demo/Makefile
+++ b/demo/Makefile
@@ -1,11 +1,18 @@
 
-PROG  = sourceview
-SOURCES = SourceViewTest.hs
+PROGS  = sourceview linenumber 
+SOURCES = SourceView.hs LineNumber.hs
 
-$(PROG) : $(SOURCES)
-	$(HC) --make $< -o $@ $(HCFLAGS)
+all : $(PROGS)
 
+sourceview : SourceView.hs
+	$(HC_RULE)
+
+linenumber : LineNumber.hs
+	$(HC_RULE)
+
+HC_RULE = $(HC) --make $< -o $@ $(HCFLAGS)
+
 clean:
-	rm -f $(SOURCES:.hs=.hi) $(SOURCES:.hs=.o) $(PROG)
+	rm -f $(SOURCES:.hs=.hi) $(SOURCES:.hs=.o) $(PROGS)
 
 HC=ghc
diff --git a/demo/SourceView.hs b/demo/SourceView.hs
new file mode 100644
--- /dev/null
+++ b/demo/SourceView.hs
@@ -0,0 +1,46 @@
+-- Test file for the SourceView widget.
+module Main where
+
+import Graphics.UI.Gtk
+import Graphics.UI.Gtk.SourceView
+
+main = do
+  initGUI
+  win <- windowNew
+  windowSetPosition win WinPosCenter
+  win `onDestroy` mainQuit
+
+  -- create the appropriate language
+  lm <- sourceLanguageManagerNew
+  langM <- sourceLanguageManagerGetLanguage lm "haskell"
+  lang <- case langM of
+    (Just lang) -> return lang
+    Nothing -> do
+      langDirs <- sourceLanguageManagerGetSearchPath lm
+      error ("please copy haskell.lang to one of the following directories:\n"
+        ++unlines langDirs)
+
+  -- create a new SourceBuffer object
+  buffer <- sourceBufferNewWithLanguage lang
+
+  -- load up and display a file
+  fileContents <- readFile "SourceView.hs"
+  textBufferSetText buffer fileContents
+  textBufferSetModified buffer False
+
+  sourceBufferSetHighlightSyntax buffer True
+
+  -- create a new SourceView Widget
+  sv <- sourceViewNewWithBuffer buffer
+
+  -- put it in a scrolled window
+  sw <- scrolledWindowNew Nothing Nothing
+  sw `containerAdd` sv
+  scrolledWindowSetPolicy sw PolicyAutomatic PolicyAutomatic
+  sw `scrolledWindowSetShadowType` ShadowIn
+  win `containerAdd` sw
+
+  -- show the widget and run the main loop
+  windowSetDefaultSize win 400 500
+  widgetShowAll win
+  mainGUI
diff --git a/demo/SourceViewTest.hs b/demo/SourceViewTest.hs
deleted file mode 100644
--- a/demo/SourceViewTest.hs
+++ /dev/null
@@ -1,45 +0,0 @@
--- Test file for the SourceView widget.
-module Main where
-
-import Graphics.UI.Gtk
-import Graphics.UI.Gtk.SourceView
-
-main = do
-  initGUI
-  win <- windowNew
-  win `onDestroy` mainQuit
-
-  -- create the appropriate language
-  lm <- sourceLanguageManagerNew
-  langM <- sourceLanguageManagerGetLanguage lm "haskell"
-  lang <- case langM of
-    (Just lang) -> return lang
-    Nothing -> do
-      langDirs <- sourceLanguageManagerGetSearchPath lm
-      error ("please copy haskell.lang to one of the following directories:\n"
-        ++unlines langDirs)
-
-  -- create a new SourceBuffer object
-  buffer <- sourceBufferNewWithLanguage lang
-
-  -- load up and display a file
-  fileContents <- readFile "SourceViewTest.hs"
-  textBufferSetText buffer fileContents
-  textBufferSetModified buffer False
-
-  sourceBufferSetHighlightSyntax buffer True
-
-  -- create a new SourceView Widget
-  sv <- sourceViewNewWithBuffer buffer
-
-  -- put it in a scrolled window
-  sw <- scrolledWindowNew Nothing Nothing
-  sw `containerAdd` sv
-  scrolledWindowSetPolicy sw PolicyAutomatic PolicyAutomatic
-  sw `scrolledWindowSetShadowType` ShadowIn
-  win `containerAdd` sw
-
-  -- show the widget and run the main loop
-  windowSetDefaultSize win 400 500
-  widgetShowAll win
-  mainGUI
diff --git a/gtksourceview2.cabal b/gtksourceview2.cabal
--- a/gtksourceview2.cabal
+++ b/gtksourceview2.cabal
@@ -1,5 +1,5 @@
 Name:           gtksourceview2
-Version:        0.12.0
+Version:        0.12.1
 License:        LGPL-2.1
 License-file:   COPYING
 Copyright:      (c) 2001-2010 The Gtk2Hs Team
@@ -24,8 +24,9 @@
 
 Data-Dir:		demo
 Data-Files:		haskell.lang
-                SourceViewTest.hs
+                SourceView.hs
                 Makefile
+                LineNumber.hs
 				
 x-Types-File:       Graphics/UI/Gtk/SourceView/Types.chs
 x-Types-Tag:        gtksourceview2
