diff --git a/HOpenCV.cabal b/HOpenCV.cabal
--- a/HOpenCV.cabal
+++ b/HOpenCV.cabal
@@ -1,11 +1,11 @@
 name: HOpenCV
-version: 0.1.2.2
+version: 0.1.2.3
 license: BSD3
 maintainer: Noam Lewis <jones.noamle@gmail.com>
 bug-reports: mailto:jones.noamle@gmail.com
 category: AI, Graphics
 synopsis: A binding for the OpenCV computer vision library
-Tested-With:   GHC == 6.10.4
+Tested-With:   GHC == 6.10.4, GHC == 7.0.4
 description:
    Initial version with very limited bindings to OpenCV 2.0. (See: <http://opencv.willowgarage.com/wiki/Welcome>)
    .
@@ -17,11 +17,9 @@
    .
    You must install OpenCV (development packages) prior to installing this package. Currently only tested on Ubuntu Linux, but should work on most linux distributions. For OpenCV installation on other *nix platforms, see <http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.0/>
    .
-   On /Ubuntu/ systems, the appropriate version of OpenCV can be installed by (the instructions are for Karmic):
+   On /Ubuntu/ systems, the appropriate version of OpenCV can be installed by:
    .
-   > sudo add-apt-repository ppa:gijzelaar/opencv2-karmic
-   > sudo apt-get update
-   > sudo apt-get install libcv-dev libhighgui-dev
+   > sudo apt-get install libcv-dev libhighgui-dev libcvaux-dev
    .
    You should then have libcv4 and libhighgui4 installed automatically too.
    .
@@ -41,8 +39,8 @@
       src/AI/CV/OpenCV/HOpenCV_wrap.c
    hs-Source-Dirs: src
    include-dirs: /usr/include/opencv
-   extra-libraries: cv,highgui
-   build-depends: base >=4 && <5, allocated-processor >= 0.0.1, vector-space
+   pkgconfig-depends: opencv
+   build-depends: base >= 4 && < 5, allocated-processor >= 0.0.1, vector-space
    ghc-options: -Wall -fno-warn-type-defaults
 
 executable test-hopencv
@@ -50,11 +48,11 @@
      src/AI/CV/OpenCV/HOpenCV_wrap.c
   include-dirs: /usr/include/opencv
   hs-source-dirs:  src
-  Build-Depends: base >=4 && <5
+  Build-Depends: base >= 4 && < 5
   main-is: Test.hs
   Ghc-Options: -Wall -fno-warn-type-defaults
   Ghc-Prof-Options:  -prof -auto-all 
-  extra-libraries: cv,highgui
+  pkgconfig-depends: opencv
   other-modules: AI.CV.OpenCV.CxCore, AI.CV.OpenCV.CV, AI.CV.OpenCV.HighGui, AI.CV.OpenCV.Types
 
 
diff --git a/src/AI/CV/OpenCV/CxCore.hsc b/src/AI/CV/OpenCV/CxCore.hsc
--- a/src/AI/CV/OpenCV/CxCore.hsc
+++ b/src/AI/CV/OpenCV/CxCore.hsc
@@ -5,9 +5,11 @@
 import Foreign.ForeignPtrWrap
 import Foreign.C.Types
 import Foreign.C.String
-import Foreign
+import Foreign hiding (unsafePerformIO)
 
 import Data.VectorSpace as VectorSpace
+
+import System.IO.Unsafe (unsafePerformIO)
 
 #include <cxcore.h>
 
diff --git a/src/AI/CV/OpenCV/HighGui.hs b/src/AI/CV/OpenCV/HighGui.hs
deleted file mode 100644
--- a/src/AI/CV/OpenCV/HighGui.hs
+++ /dev/null
@@ -1,74 +0,0 @@
-{-# LANGUAGE ForeignFunctionInterface, EmptyDataDecls #-}
- 
-module AI.CV.OpenCV.HighGui where
- 
-import Foreign.ForeignPtrWrap
-import Foreign.C.Types
-import Foreign.Ptr
-import Foreign.ForeignPtr
-import Foreign.C.String
- 
-import AI.CV.OpenCV.CxCore
-
-
-------------------------------------------------
--- General
-foreign import ccall unsafe "highgui.h cvConvertImage"
-  c_cvConvertImage :: Ptr CvArr -> Ptr CvArr -> CInt -> IO ()
-
-cvConvertImage :: (IplArrayType a, IplArrayType a1) => Ptr a -> Ptr a1 -> CInt -> IO ()
-cvConvertImage src dst flags = c_cvConvertImage (fromArr src) (fromArr dst) flags
-
-------------------------------------------------
--- Capturing
-data CvCapture
-
-
-foreign import ccall unsafe "highgui.h cvCreateCameraCapture"
-  c_cvCreateCameraCapture :: CInt -> IO (Ptr CvCapture)
-                          
-cvCreateCameraCapture :: CInt -> IO (Ptr CvCapture)
-cvCreateCameraCapture x = errorName "Failed to create camera" . checkPtr $ c_cvCreateCameraCapture . fromIntegral $ x
-  
-foreign import ccall unsafe "highgui.h cvCreateFileCapture"
-  c_cvCreateFileCapture :: CString -> IO (Ptr CvCapture)
-                          
-cvCreateFileCapture :: String -> IO (Ptr CvCapture)
-cvCreateFileCapture filename = err' . checkPtr $ withCString filename f
-    where err' = errorName $ "Failed to capture from file: '" ++ filename ++ "'"
-          f filenameC = c_cvCreateFileCapture filenameC
-  
-
-foreign import ccall unsafe "HOpenCV_warp.h release_capture"
-  cvReleaseCapture  :: Ptr CvCapture -> IO ()
-
-foreign import ccall unsafe "HOpenCV_warp.h &release_capture"
-  cp_release_capture  :: FunPtr (Ptr CvCapture -> IO () )
- 
-createCameraCaptureF :: CInt -> IO (ForeignPtr CvCapture)
-createCameraCaptureF = (createForeignPtr cp_release_capture) . cvCreateCameraCapture
-
-
-
-foreign import ccall unsafe "highgui.h cvQueryFrame"
-  c_cvQueryFrame :: Ptr CvCapture -> IO (Ptr IplImage)
-
-cvQueryFrame :: Ptr CvCapture -> IO (Ptr IplImage)
-cvQueryFrame cap = errorName "Failed to query frame from camera" . checkPtr $ c_cvQueryFrame cap
-
--------------------------------------------------
--- Windows
-foreign import ccall unsafe "HOpenCV_wrap.h new_window"
-  c_newWindow :: CInt -> CInt -> IO ()
-
-newWindow :: CInt -> Bool -> IO ()
-newWindow num autoSize = c_newWindow num (if autoSize then 1 else 0)
-
-foreign import ccall unsafe "HOpenCV_wrap.h del_window"
-  delWindow :: CInt -> IO ()
-
-foreign import ccall unsafe "HOpenCV_wrap.h show_image"
-  showImage :: CInt -> Ptr IplImage -> IO ()
-
-foreign import ccall unsafe "highgui.h cvWaitKey"
-  waitKey :: CInt -> IO CInt
diff --git a/src/AI/CV/OpenCV/HighGui.hsc b/src/AI/CV/OpenCV/HighGui.hsc
new file mode 100644
--- /dev/null
+++ b/src/AI/CV/OpenCV/HighGui.hsc
@@ -0,0 +1,117 @@
+{-# LANGUAGE ForeignFunctionInterface, EmptyDataDecls #-}
+ 
+module AI.CV.OpenCV.HighGui where
+ 
+import Control.Monad
+import Foreign.ForeignPtrWrap
+import Foreign.C.Types
+import Foreign.Ptr
+import Foreign.ForeignPtr
+import Foreign.C.String
+ 
+import AI.CV.OpenCV.CxCore
+
+#include <highgui.h>
+
+------------------------------------------------
+-- General
+foreign import ccall unsafe "highgui.h cvConvertImage"
+  c_cvConvertImage :: Ptr CvArr -> Ptr CvArr -> CInt -> IO ()
+
+cvConvertImage :: (IplArrayType a, IplArrayType a1) => Ptr a -> Ptr a1 -> CInt -> IO ()
+cvConvertImage src dst flags = c_cvConvertImage (fromArr src) (fromArr dst) flags
+
+------------------------------------------------
+-- Capturing
+data CvCapture
+
+
+foreign import ccall unsafe "highgui.h cvCreateCameraCapture"
+  c_cvCreateCameraCapture :: CInt -> IO (Ptr CvCapture)
+                          
+cvCreateCameraCapture :: CInt -> IO (Ptr CvCapture)
+cvCreateCameraCapture x = errorName "Failed to create camera" . checkPtr $ c_cvCreateCameraCapture . fromIntegral $ x
+  
+foreign import ccall unsafe "highgui.h cvCreateFileCapture"
+  c_cvCreateFileCapture :: CString -> IO (Ptr CvCapture)
+                          
+cvCreateFileCapture :: String -> IO (Ptr CvCapture)
+cvCreateFileCapture filename = err' . checkPtr $ withCString filename f
+    where err' = errorName $ "Failed to capture from file: '" ++ filename ++ "'"
+          f filenameC = c_cvCreateFileCapture filenameC
+  
+
+foreign import ccall unsafe "HOpenCV_warp.h release_capture"
+  cvReleaseCapture  :: Ptr CvCapture -> IO ()
+
+foreign import ccall unsafe "HOpenCV_warp.h &release_capture"
+  cp_release_capture  :: FunPtr (Ptr CvCapture -> IO () )
+ 
+createCameraCaptureF :: CInt -> IO (ForeignPtr CvCapture)
+createCameraCaptureF = (createForeignPtr cp_release_capture) . cvCreateCameraCapture
+
+
+
+foreign import ccall unsafe "highgui.h cvQueryFrame"
+  c_cvQueryFrame :: Ptr CvCapture -> IO (Ptr IplImage)
+
+cvQueryFrame :: Ptr CvCapture -> IO (Ptr IplImage)
+cvQueryFrame cap = errorName "Failed to query frame from camera" . checkPtr $ c_cvQueryFrame cap
+
+-------------------------------------------------
+-- Windows
+foreign import ccall unsafe "HOpenCV_wrap.h new_window"
+  c_newWindow :: CInt -> CInt -> IO ()
+
+newWindow :: CInt -> Bool -> IO ()
+newWindow num autoSize = c_newWindow num (if autoSize then 1 else 0)
+
+foreign import ccall unsafe "HOpenCV_wrap.h del_window"
+  delWindow :: CInt -> IO ()
+
+foreign import ccall unsafe "HOpenCV_wrap.h show_image"
+  showImage :: CInt -> Ptr IplImage -> IO ()
+
+foreign import ccall unsafe "highgui.h cvWaitKey"
+  waitKey :: CInt -> IO CInt
+
+foreign import ccall unsafe "highgui.h cvNamedWindow"
+  cvNamedWindow :: CString -> CInt -> IO CInt
+
+type AutoSize = Bool
+
+titledWindow :: String -> AutoSize -> IO Int
+titledWindow s a
+  = do cs <- newCString s
+       i <- cvNamedWindow cs (fromToInteger $ fromEnum a)
+       return $ fromToInteger i
+
+fromToInteger :: (Integral a, Num b) => a -> b
+fromToInteger = fromInteger . toInteger
+
+newtype LoadImageColor = LoadImageColor { unLoadImageColor :: CInt }
+
+#{enum LoadImageColor, LoadImageColor
+    , loadImageColor     = CV_LOAD_IMAGE_COLOR
+    , loadImageGrayscale = CV_LOAD_IMAGE_GRAYSCALE
+    , loadImageUnchanged = CV_LOAD_IMAGE_UNCHANGED }
+
+foreign import ccall unsafe "highgui.h cvLoadImage"
+  c_cvLoadImage :: CString -> CInt -> IO (Ptr IplImage)
+
+cvLoadImage :: String -> LoadImageColor -> IO (Ptr IplImage)
+cvLoadImage filename (LoadImageColor color) = err' . checkPtr $ withCString filename f
+  where
+    err' = errorName $ "Failed to load from file: '" ++ filename ++ "'"
+    f filenameC = c_cvLoadImage filenameC color
+
+foreign import ccall unsafe "highgui.h cvSaveImage"
+  c_cvSaveImage :: CString -> Ptr CvArr -> IO CInt
+
+cvSaveImage :: String -> Ptr IplImage -> IO CInt
+cvSaveImage filename image = withCString filename f
+  where
+    f filenameC = do
+      ret <- c_cvSaveImage filenameC (fromArr image)
+      when (ret == 0) $ fail $ "Failed to save to file: '" ++ filename ++ "'"
+      return ret
diff --git a/src/AI/CV/OpenCV/Types.hs b/src/AI/CV/OpenCV/Types.hs
--- a/src/AI/CV/OpenCV/Types.hs
+++ b/src/AI/CV/OpenCV/Types.hs
@@ -5,9 +5,6 @@
 import AI.CV.OpenCV.HighGui
 
 import Foreign
-import Foreign.ForeignPtr
-
-
 
 type PImage = Ptr IplImage
 type PCapture = Ptr CvCapture
