diff --git a/Rasenschach.cabal b/Rasenschach.cabal
--- a/Rasenschach.cabal
+++ b/Rasenschach.cabal
@@ -1,5 +1,5 @@
 name: Rasenschach
-version: 0.1.3
+version: 0.1.3.1
 cabal-version: >=1.2
 build-type: Simple
 license: BSD3
@@ -32,7 +32,7 @@
                    ObjectBehaviour GameFSM Message Rules Object BasicTypes Animate
                    Helper Global Command BallFSM 
                    Main States AI Grid Parser Lineup Main Data.FSM Physics
-                   Render AL Message Object BasicTypes Main States Render Main
+                   Render AL Message Object BasicTypes Main States Render Util Main
     ghc-prof-options: --enable-executable-profiling
     ghc-options: -O2
  
diff --git a/Util.hs b/Util.hs
new file mode 100644
--- /dev/null
+++ b/Util.hs
@@ -0,0 +1,48 @@
+module Util ( bitmapLoad, Image(..) ) where
+
+import Data.Word ( Word8, Word32 )
+import Data.Serialize.Get ( Get, runGet, getWord32le, getWord16le
+                          , skip, getByteString )
+import qualified Data.ByteString as BS
+import qualified Data.ByteString.Internal as BSI
+import Foreign ( Ptr, pokeElemOff, peekElemOff, plusPtr
+               , withForeignPtr )
+ 
+data Image = Image !Int !Int !BS.ByteString
+
+bitmapLoad :: FilePath -> IO (Maybe Image)
+bitmapLoad f = do
+  bs <- BS.readFile f
+  case runGet getBitmap bs of
+    Left  err -> putStrLn err >> return Nothing
+    Right i@(Image _ _ bytes) -> do
+      let (ptr, offset, len) = BSI.toForeignPtr bytes
+      withForeignPtr ptr $ bgr2rgb len offset
+      return $! Just i
+
+-- | Returns a bitmap in bgr format.
+getBitmap :: Get Image
+getBitmap = do
+  skip 18
+  width   <- getWord32le
+  height  <- getWord32le
+  _planes <- getWord16le
+  bpp     <- getWord16le
+  let size = fromIntegral $
+              width * height * (fromIntegral (bpp `div` 8) :: Word32) :: Int
+  skip 24
+  bgrBytes <- getByteString size
+  return $! Image (fromIntegral width)
+                  (fromIntegral height)
+                  bgrBytes
+
+bgr2rgb :: Int -> Int -> Ptr Word8 -> IO ()
+bgr2rgb n o p = do
+  mapM_ (\i -> do
+    b <- peekElemOff p' (i+0)
+    r <- peekElemOff p' (i+2)
+    pokeElemOff p' (i+0) (r::Word8)
+    pokeElemOff p' (i+2) (b::Word8))
+    [0,3..n-3]
+  where
+  p' = p `plusPtr` o
