diff --git a/Graphics/X11/Xshape.hsc b/Graphics/X11/Xshape.hsc
new file mode 100644
--- /dev/null
+++ b/Graphics/X11/Xshape.hsc
@@ -0,0 +1,223 @@
+--------------------------------------------------------------------
+-- |
+-- Module    : Graphics.X11.Xshape
+-- Copyright : (c) Haskell.org, 2009
+-- License   : BSD3
+--
+-- Maintainer: Ewan Higgs <ewan_higgs@yahoo.co.uk>
+-- Stability : unstable 
+-- Portability: unportable 
+--
+--------------------------------------------------------------------
+--
+-- Interface to Xshape API
+--
+
+module Graphics.X11.Xshape( xshapeQueryExtension
+                          , xshapeQueryVersion
+                          , xshapeCombineRegion 
+                          , xshapeCombineRectangles 
+                          , xshapeCombineMask 
+                          , xshapeCombineShape 
+                          , xshapeOffsetShape 
+                          , xshapeQueryExtents 
+                          , xshapeSelectInput 
+                          , xshapeInputSelected
+             --             , xshapeGetRectangles
+                          , shapeQueryVersion
+                          , shapeRectangles
+                          , shapeMask
+                          , shapeCombine
+                          , shapeOffset
+                          , shapeQueryExtents
+                          , shapeSelectInput
+                          , shapeInputSelected
+                          , shapeGetRectangles
+                          , shapeSet
+                          , shapeUnion
+                          , shapeIntersect
+                          , shapeSubtract
+                          , shapeInvert
+                          , shapeBounding
+                          , shapeClip
+                          , shapeInput
+                          , shapeNotifyMask
+                          , shapeNotify
+                          , shapeNumberEvents
+) where
+
+import Foreign
+import Foreign.C.Types
+import Graphics.X11.Xlib
+import Control.Monad
+
+data XShapeEvent = XShapeEvent
+                 { xse_type       :: CInt
+                 , xse_serial     :: CUInt
+                 , xse_send_event :: Bool
+                 , xse_display    :: Display
+                 , xse_window     :: Window
+                 , xse_kind       :: CInt
+                 , xse_x          :: CInt
+                 , xse_y          :: CInt
+                 , xse_width      :: CUInt
+                 , xse_height     :: CUInt
+                 , xse_time       :: Time
+                 , xse_shaped     :: Bool 
+                 }
+shapeQueryVersion  :: CInt
+shapeQueryVersion   = 0
+shapeRectangles    :: CInt 
+shapeRectangles     = 1
+shapeMask          :: CInt 
+shapeMask           = 2
+shapeCombine       :: CInt 
+shapeCombine        = 3
+shapeOffset        :: CInt 
+shapeOffset         = 4
+shapeQueryExtents  :: CInt
+shapeQueryExtents   = 5
+shapeSelectInput   :: CInt
+shapeSelectInput    = 6
+shapeInputSelected :: CInt
+shapeInputSelected  = 7
+shapeGetRectangles :: CInt
+shapeGetRectangles  = 8
+
+shapeSet       :: CInt
+shapeSet        = 0
+shapeUnion     :: CInt
+shapeUnion      = 1
+shapeIntersect :: CInt
+shapeIntersect  = 2
+shapeSubtract  :: CInt
+shapeSubtract   = 3
+shapeInvert    :: CInt
+shapeInvert     = 4
+
+shapeBounding :: CInt
+shapeBounding  = 0
+shapeClip     :: CInt
+shapeClip      = 1
+shapeInput    :: CInt
+shapeInput     = 2
+
+shapeNotifyMask :: Int
+shapeNotifyMask  = 1 `shiftL` 0
+shapeNotify     :: Int
+shapeNotify      = 0
+
+shapeNumberEvents :: Int
+shapeNumberEvents  = shapeNotify + 1
+
+
+#ifdef HAVE_X11_EXTENSIONS_XSHAPE_H
+
+-- We have Xinerama, so the library will actually work
+compiledWithXshape :: Bool
+compiledWithXshape = True
+
+-- for XFree() (already included from Xdamage.h, but I don't know if I can count on that.)
+#include <X11/Xlib.h>
+
+#include <X11/extensions/shape.h>
+
+xshapeQueryExtension :: Display -> IO (Maybe (CInt, CInt))
+xshapeQueryExtension dpy = wrapPtr2 (cXshapeQueryExtension dpy) go
+  where go False _ _                = Nothing
+        go True eventbase errorbase = Just (fromIntegral eventbase, fromIntegral errorbase)
+
+xshapeQueryVersion :: Display -> IO (Maybe (CInt, CInt))
+xshapeQueryVersion dpy = wrapPtr2 (cXshapeQueryVersion dpy) go
+  where go False _ _        = Nothing
+        go True major minor = Just (fromIntegral major, fromIntegral minor)
+
+foreign import ccall "XShapeQueryExtension"
+  cXshapeQueryExtension :: Display -> Ptr CInt -> Ptr CInt -> IO Bool
+
+foreign import ccall "XShapeQueryVersion"
+  cXshapeQueryVersion :: Display -> Ptr CInt -> Ptr CInt -> IO Bool
+
+foreign import ccall "XShapeCombineRegion"
+  xshapeCombineRegion :: Display -> Window -> CInt -> CInt -> CInt -> Ptr Region -> CInt -> IO()
+
+foreign import ccall "XShapeCombineRectangles"
+  xshapeCombineRectangles :: Display -> Window -> CInt -> CInt -> CInt -> Ptr Rectangle -> CInt -> CInt -> CInt -> IO()
+
+foreign import ccall "XShapeCombineMask"
+  xshapeCombineMask :: Display -> Window -> CInt -> CInt -> CInt -> Pixmap -> CInt -> IO ()
+
+foreign import ccall "XShapeCombineShape"
+  xshapeCombineShape :: Display -> Window -> CInt -> CInt -> CInt -> Window -> CInt -> CInt -> IO ()
+
+
+foreign import ccall "XShapeOffsetShape"
+  xshapeOffsetShape :: Display -> Window -> CInt -> CInt -> CInt -> IO ()
+
+foreign import ccall "XShapeQueryExtents"
+  xshapeQueryExtents :: Display -> Window -> CInt -> CInt -> CUInt -> CUInt -> Bool -> CInt -> CInt -> CUInt -> CUInt -> IO ()
+
+foreign import ccall "XShapeSelectInput"
+  xshapeSelectInput :: Display -> Window -> CUInt -> IO()
+
+foreign import ccall "XShapeInputSelected"
+  xshapeInputSelected :: Display -> Window -> IO(CUInt)
+
+  -- May leak the returned Rectangle; ask for help here
+foreign import ccall "XShapeGetRectangles"
+  xshapeGetRectangles :: Display -> Window -> CInt -> Ptr CInt -> Ptr CInt -> IO(Ptr Rectangle)
+
+foreign import ccall "XFree"
+  cXFree :: Ptr a -> IO CInt
+
+
+wrapPtr2 :: (Storable a, Storable b) => (Ptr a -> Ptr b -> IO c) -> (c -> a -> b -> d) -> IO d
+wrapPtr2 cfun f =
+  withPool $ \pool -> do aptr <- pooledMalloc pool
+                         bptr <- pooledMalloc pool
+                         ret <- cfun aptr bptr
+                         a <- peek aptr
+                         b <- peek bptr
+                         return (f ret a b)
+
+#else
+
+-- No Xshape, but if we fake a non-active Xdamage interface, we can still have
+-- an active interface
+compiledWithXshape :: Bool
+compiledWithXshape = False
+
+xshapeQueryExtension :: Display -> IO (Maybe (CInt, CInt))
+xshapeQueryExtension _  = return Nothing
+
+xshapeQueryVersion :: Display -> IO (Maybe (CInt, CInt))
+xshapeQueryVersion _ = return Nothing
+
+xshapeCombineRegion :: Display -> Window -> CInt -> CInt -> CInt -> Region -> CInt -> IO()
+xshapeCombineRegion _ _ _ _ _ _ _ = return ()
+
+xshapeCombineRectangles :: Display -> Window -> CInt -> CInt -> CInt -> Rectangle -> CInt -> CInt -> CInt -> IO()
+xshapeCombineRectangles _ _ _ _ _ _ _ _ _ = return ()
+
+xshapeCombineMask :: Display -> Window -> CInt -> CInt -> CInt -> Pixmap -> CInt -> IO ()
+xshapeCombineMask _ _ _ _ _ _ _ = return ()
+
+xshapeCombineShape :: Display -> Window -> CInt -> CInt -> CInt -> Window -> CInt -> CInt -> IO ()
+xshapeCombineShape _ _ _ _ _ _ _ _ = return ()
+
+xshapeOffsetShape :: Display -> Window -> CInt -> CInt -> CInt -> IO ()
+xshapeOffsetShape _ _ _ _ _ = return ()
+
+xshapeQueryExtents :: Display -> Window -> CInt -> CInt -> CUInt -> CUInt -> Bool -> CInt -> CInt -> CUInt -> CUInt -> IO ()
+xshapeQueryExtents _ _ _ _ _ _ _ _ _ _ _ = return ()
+
+xshapeSelectInput :: Display -> Window -> CUInt -> IO()
+xshapeSelectInput  _ _ _ = return ()
+
+xshapeInputSelected :: Display -> Window -> IO(CUInt)
+xshapeInputSelected _ _ = return 0
+
+-- xshapeGetRectangles :: Display -> Window -> CInt -> Ptr CInt -> Ptr CInt -> IO(Ptr Rectangle)
+-- xshapeGetRectangles  _ _ _ _ _ = return $ Ptr (Rectangle 0 0 0 0)
+
+#endif
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,26 @@
+The HSX11xdamage Library is Copyright (c) Ewan Higgs,
+2008, All rights reserved, and is distributed as free software
+under the following license.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+
+- Neither name of the copyright holders nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND THE CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDERS OR THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,6 @@
+module Main (main) where
+
+import Distribution.Simple
+
+main :: IO ()
+main = defaultMainWithHooks simpleUserHooks
diff --git a/X11-xshape.cabal b/X11-xshape.cabal
new file mode 100644
--- /dev/null
+++ b/X11-xshape.cabal
@@ -0,0 +1,21 @@
+name:		        X11-xshape
+version:	        0.1.0
+license:	        BSD3
+license-file:	    LICENSE
+copyright:	        Ewan Higgs, 2008, libraries@haskell.org 2008
+maintainer:	        Ewan Higgs <ewan_higgs@yahoo.co.uk>
+homepage:           http://darcs.haskell.org/X11-xshape
+category:	        Graphics
+synopsis:	        A binding to the Xshape X11 extension library
+description:	    A Haskell binding to the Xshape X11 extention graphics library.
+	.
+	The binding is a direct translation of the C binding; for
+	documentation of these calls, refer to "The Xlib Programming
+	Manual", available online at <http://tronche.com/gui/x/xlib/>.
+exposed-modules:
+    Graphics.X11.Xshape
+extensions:	        ForeignFunctionInterface, CPP
+build-depends:	    base >= 3 && < 10, X11
+build-type:         Simple
+ghc-options:        -funbox-strict-fields -Wall -fno-warn-unused-binds
+ghc-prof-options:   -prof -auto-all
