diff --git a/Gtk2HsSetup.hs b/Gtk2HsSetup.hs
--- a/Gtk2HsSetup.hs
+++ b/Gtk2HsSetup.hs
@@ -455,7 +455,7 @@
 -- existance of a .chs module may not depend on some CPP condition.  
 extractDeps :: ModDep -> IO ModDep
 extractDeps md@ModDep { mdLocation = Nothing } = return md
-extractDeps md@ModDep { mdLocation = Just f } = withFileContents f $ \con -> do
+extractDeps md@ModDep { mdLocation = Just f } = withUTF8FileContents f $ \con -> do
   let findImports acc (('{':'#':xs):xxs) = case (dropWhile ((==) ' ') xs) of
         ('i':'m':'p':'o':'r':'t':' ':ys) ->
           case simpleParse (takeWhile ((/=) '#') ys) of
diff --git a/demo/Makefile b/demo/Makefile
new file mode 100644
--- /dev/null
+++ b/demo/Makefile
@@ -0,0 +1,15 @@
+
+PROGS  = vorbis-play
+SOURCES = VorbisPlay.hs
+
+all: $(PROGS)
+
+vorbis-play : VorbisPlay.hs
+	$(HC_RULE)
+
+HC_RULE = $(HC) --make $< -o $@ $(HCFLAGS)
+
+clean:
+	rm -f $(SOURCES:.hs=.hi) $(SOURCES:.hs=.o) $(PROGS)
+
+HC=ghc
diff --git a/demo/VorbisPlay.hs b/demo/VorbisPlay.hs
new file mode 100644
--- /dev/null
+++ b/demo/VorbisPlay.hs
@@ -0,0 +1,92 @@
+import System.Exit
+import Data.Maybe
+import qualified Media.Streaming.GStreamer as Gst
+import qualified System.Glib as G
+import qualified System.Glib.MainLoop as G
+import qualified System.Glib.Properties as G
+import qualified System.Glib.GError as G
+import qualified System.Glib.Signals as G
+import Text.Printf
+import Control.Monad
+import System.IO
+import System
+
+mkElement action =
+    do element <- action
+       case element of
+         Just element' ->
+             return element'
+         Nothing -> 
+             do hPutStrLn stderr "could not create all GStreamer elements\n"
+                exitFailure
+
+main =
+    do args <- getArgs
+       when (length args /= 1) $
+            do hPutStrLn stderr "Usage: vorbis-play <Ogg/Vorbis filename>\n"
+               exitFailure
+       
+       Gst.init
+       
+       mainLoop <- G.mainLoopNew Nothing True
+       
+       pipeline <- Gst.pipelineNew "audio-player"
+       source <- mkElement $ Gst.elementFactoryMake "filesrc" $ Just "file-source"
+       parser <- mkElement $ Gst.elementFactoryMake "oggdemux" $ Just "ogg-parser"
+       decoder <- mkElement $ Gst.elementFactoryMake "vorbisdec" $ Just "vorbis-decoder"
+       conv <- mkElement $ Gst.elementFactoryMake "audioconvert" $ Just "convert"
+       sink <- mkElement $ Gst.elementFactoryMake "alsasink" $ Just "alsa-output"
+       
+       let elements = [source, parser, decoder, conv, sink]
+       
+       G.objectSetPropertyString "location" source (head args)
+       
+       bus <- Gst.pipelineGetBus (Gst.castToPipeline pipeline)
+       Gst.busAddWatch bus G.priorityDefault $ \bus message ->
+           do case Gst.messageType message of
+                Gst.MessageEOS ->
+                    do putStrLn "end of stream"
+                       G.mainLoopQuit mainLoop
+                Gst.MessageError ->
+                    let G.GError _ _ msg = fst $ fromJust $ Gst.messageParseError message
+                        messageStr = "Error: " ++ msg
+                    in do hPutStrLn stderr messageStr
+                          G.mainLoopQuit mainLoop
+                _ -> return ()
+              return True
+       
+       mapM_ (Gst.binAdd $ Gst.castToBin pipeline) elements
+       
+       Gst.elementLink source parser
+       Gst.elementLink decoder conv
+       Gst.elementLink conv sink
+       
+       G.on parser Gst.elementPadAdded $ \pad ->
+           do sinkPad <- Gst.elementGetStaticPad decoder "sink"
+              Gst.padLink pad $ fromJust sinkPad
+              return ()
+       
+       flip G.timeoutAdd 100 $ do
+         position <- Gst.elementQueryPosition pipeline Gst.FormatTime
+         duration <- Gst.elementQueryDuration pipeline Gst.FormatTime
+         case position of
+           Just (_, position') ->
+               case duration of
+                 Just (_, duration') -> do
+                   printf "%10d / %10d\r" 
+                     (fromIntegral (position' `div` Gst.second)::Integer)
+                     (fromIntegral (duration' `div` Gst.second)::Integer)
+                 Nothing -> do
+                   putStr "no information\r"
+           Nothing -> do
+             putStr "no information\r"
+         hFlush stdout
+         return True
+       
+       Gst.elementSetState pipeline Gst.StatePlaying
+       
+       G.mainLoopRun mainLoop
+       
+       Gst.elementSetState pipeline Gst.StateNull
+       
+       return ()
diff --git a/gstreamer.cabal b/gstreamer.cabal
--- a/gstreamer.cabal
+++ b/gstreamer.cabal
@@ -1,5 +1,5 @@
 Name:           gstreamer
-Version:        0.11.0
+Version:        0.11.1
 License:        LGPL-2.1
 License-file:   COPYING
 Copyright:      (c) 2001-2010 The Gtk2Hs Team
@@ -42,6 +42,10 @@
 x-Types-Mini-Tag:       default
 x-Types-Mini-Destructor: miniObjectUnref
 x-Types-Mini-Lib:       gstreamer
+
+Data-Dir:		demo
+Data-Files:		VorbisPlay.hs
+                Makefile
 
 Source-Repository head
   type:         darcs
