diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright (c) 2012, Greg Horn
+
+All rights reserved.
+
+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.
+
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+
+    * Neither the name of Greg Horn nor the names of other
+      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 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
+OWNER OR 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/OIS.hs b/OIS.hs
new file mode 100644
--- /dev/null
+++ b/OIS.hs
@@ -0,0 +1,22 @@
+module OIS ( module OIS.OISEvents
+           , module OIS.OISFactoryCreator
+           , module OIS.OISInputManager
+           , module OIS.OISInterface
+           , module OIS.OISJoyStick
+           , module OIS.OISKeyboard
+           , module OIS.OISMouse
+           , module OIS.OISMultiTouch
+           , module OIS.OISObject
+           , module OIS.OISPrereqs
+           ) where
+
+import OIS.OISEvents
+import OIS.OISFactoryCreator
+import OIS.OISInputManager
+import OIS.OISInterface
+import OIS.OISJoyStick
+import OIS.OISKeyboard
+import OIS.OISMouse
+import OIS.OISMultiTouch
+import OIS.OISObject
+import OIS.OISPrereqs
diff --git a/OIS/OISEvents.hs b/OIS/OISEvents.hs
new file mode 100644
--- /dev/null
+++ b/OIS/OISEvents.hs
@@ -0,0 +1,31 @@
+{-# LANGUAGE ForeignFunctionInterface #-}
+module OIS.OISEvents(
+eventArg_with, 
+eventArg_new, 
+eventArg_delete
+)
+
+where
+
+import OIS.Types
+import Control.Monad
+
+import Foreign
+import Foreign.C.String
+import Foreign.C.Types
+
+eventArg_with :: Object -> (EventArg -> IO a) -> IO a
+eventArg_with p1 f = do
+    obj <- eventArg_new p1
+    res <- f obj
+    eventArg_delete obj
+    return res
+
+foreign import ccall "OISEvents.h OIS_EventArg_new" c_eventArg_new :: Object -> IO EventArg
+eventArg_new :: Object -> IO EventArg
+eventArg_new p1 =   c_eventArg_new p1
+
+foreign import ccall "OISEvents.h OIS_EventArg_delete" c_eventArg_delete :: EventArg -> IO ()
+eventArg_delete :: EventArg -> IO ()
+eventArg_delete p1 =   c_eventArg_delete p1
+
diff --git a/OIS/OISFactoryCreator.hs b/OIS/OISFactoryCreator.hs
new file mode 100644
--- /dev/null
+++ b/OIS/OISFactoryCreator.hs
@@ -0,0 +1,39 @@
+{-# LANGUAGE ForeignFunctionInterface #-}
+module OIS.OISFactoryCreator(
+factoryCreator_delete, 
+factoryCreator_totalDevices, 
+factoryCreator_freeDevices, 
+factoryCreator_createObject, 
+factoryCreator_destroyObject
+)
+
+where
+
+import OIS.Types
+import Control.Monad
+
+import Foreign
+import Foreign.C.String
+import Foreign.C.Types
+
+foreign import ccall "OISFactoryCreator.h OIS_FactoryCreator_delete" c_factoryCreator_delete :: FactoryCreator -> IO ()
+factoryCreator_delete :: FactoryCreator -> IO ()
+factoryCreator_delete p1 =   c_factoryCreator_delete p1
+
+foreign import ccall "OISFactoryCreator.h OIS_FactoryCreator_totalDevices" c_factoryCreator_totalDevices :: FactoryCreator -> CInt -> IO CInt
+factoryCreator_totalDevices :: FactoryCreator -> Type -> IO Int
+factoryCreator_totalDevices p1 p2 =  liftM fromIntegral $  c_factoryCreator_totalDevices p1 (typeToCInt p2)
+
+foreign import ccall "OISFactoryCreator.h OIS_FactoryCreator_freeDevices" c_factoryCreator_freeDevices :: FactoryCreator -> CInt -> IO CInt
+factoryCreator_freeDevices :: FactoryCreator -> Type -> IO Int
+factoryCreator_freeDevices p1 p2 =  liftM fromIntegral $  c_factoryCreator_freeDevices p1 (typeToCInt p2)
+
+foreign import ccall "OISFactoryCreator.h OIS_FactoryCreator_createObject" c_factoryCreator_createObject :: FactoryCreator -> InputManager -> CInt -> CBool -> (Ptr CChar) -> IO Object
+factoryCreator_createObject :: FactoryCreator -> InputManager -> Type -> Bool -> String -> IO Object
+factoryCreator_createObject p1 p2 p3 p4 p5 = withCString p5 $ \cp5 -> 
+    c_factoryCreator_createObject p1 p2 (typeToCInt p3) (fromBool p4) cp5
+
+foreign import ccall "OISFactoryCreator.h OIS_FactoryCreator_destroyObject" c_factoryCreator_destroyObject :: FactoryCreator -> Object -> IO ()
+factoryCreator_destroyObject :: FactoryCreator -> Object -> IO ()
+factoryCreator_destroyObject p1 p2 =   c_factoryCreator_destroyObject p1 p2
+
diff --git a/OIS/OISInputManager.hs b/OIS/OISInputManager.hs
new file mode 100644
--- /dev/null
+++ b/OIS/OISInputManager.hs
@@ -0,0 +1,64 @@
+{-# LANGUAGE ForeignFunctionInterface #-}
+module OIS.OISInputManager(
+inputManager_getVersionNumber, 
+inputManager_createInputSystem_size_t, 
+inputManager_createInputSystem, 
+inputManager_destroyInputSystem, 
+inputManager_getNumberOfDevices, 
+inputManager_createInputObject, 
+inputManager_destroyInputObject, 
+inputManager_addFactoryCreator, 
+inputManager_removeFactoryCreator, 
+inputManager_enableAddOnFactory
+)
+
+where
+
+import OIS.Types
+import Control.Monad
+
+import Foreign
+import Foreign.C.String
+import Foreign.C.Types
+
+foreign import ccall "OISInputManager.h OIS_InputManager_getVersionNumber" c_inputManager_getVersionNumber :: IO CUInt
+inputManager_getVersionNumber :: IO Int
+inputManager_getVersionNumber  =  liftM fromIntegral $  c_inputManager_getVersionNumber 
+
+foreign import ccall "OISInputManager.h OIS_InputManager_createInputSystem_size_t" c_inputManager_createInputSystem_size_t :: CSize -> IO InputManager
+inputManager_createInputSystem_size_t :: Int -> IO InputManager
+inputManager_createInputSystem_size_t p1 =   c_inputManager_createInputSystem_size_t (fromIntegral p1)
+
+foreign import ccall "OISInputManager.h OIS_InputManager_createInputSystem" c_inputManager_createInputSystem :: ParamList -> IO InputManager
+inputManager_createInputSystem :: ParamList -> IO InputManager
+inputManager_createInputSystem p1 =   c_inputManager_createInputSystem p1
+
+foreign import ccall "OISInputManager.h OIS_InputManager_destroyInputSystem" c_inputManager_destroyInputSystem :: InputManager -> IO ()
+inputManager_destroyInputSystem :: InputManager -> IO ()
+inputManager_destroyInputSystem p1 =   c_inputManager_destroyInputSystem p1
+
+foreign import ccall "OISInputManager.h OIS_InputManager_getNumberOfDevices" c_inputManager_getNumberOfDevices :: InputManager -> CInt -> IO CInt
+inputManager_getNumberOfDevices :: InputManager -> Type -> IO Int
+inputManager_getNumberOfDevices p1 p2 =  liftM fromIntegral $  c_inputManager_getNumberOfDevices p1 (typeToCInt p2)
+
+foreign import ccall "OISInputManager.h OIS_InputManager_createInputObject" c_inputManager_createInputObject :: InputManager -> CInt -> CBool -> (Ptr CChar) -> IO Object
+inputManager_createInputObject :: InputManager -> Type -> Bool -> String -> IO Object
+inputManager_createInputObject p1 p2 p3 p4 = withCString p4 $ \cp4 -> 
+    c_inputManager_createInputObject p1 (typeToCInt p2) (fromBool p3) cp4
+
+foreign import ccall "OISInputManager.h OIS_InputManager_destroyInputObject" c_inputManager_destroyInputObject :: InputManager -> Object -> IO ()
+inputManager_destroyInputObject :: InputManager -> Object -> IO ()
+inputManager_destroyInputObject p1 p2 =   c_inputManager_destroyInputObject p1 p2
+
+foreign import ccall "OISInputManager.h OIS_InputManager_addFactoryCreator" c_inputManager_addFactoryCreator :: InputManager -> FactoryCreator -> IO ()
+inputManager_addFactoryCreator :: InputManager -> FactoryCreator -> IO ()
+inputManager_addFactoryCreator p1 p2 =   c_inputManager_addFactoryCreator p1 p2
+
+foreign import ccall "OISInputManager.h OIS_InputManager_removeFactoryCreator" c_inputManager_removeFactoryCreator :: InputManager -> FactoryCreator -> IO ()
+inputManager_removeFactoryCreator :: InputManager -> FactoryCreator -> IO ()
+inputManager_removeFactoryCreator p1 p2 =   c_inputManager_removeFactoryCreator p1 p2
+
+foreign import ccall "OISInputManager.h OIS_InputManager_enableAddOnFactory" c_inputManager_enableAddOnFactory :: InputManager -> CInt -> IO ()
+inputManager_enableAddOnFactory :: InputManager -> AddOnFactories -> IO ()
+inputManager_enableAddOnFactory p1 p2 =   c_inputManager_enableAddOnFactory p1 (addOnFactoriesToCInt p2)
+
diff --git a/OIS/OISInterface.hs b/OIS/OISInterface.hs
new file mode 100644
--- /dev/null
+++ b/OIS/OISInterface.hs
@@ -0,0 +1,31 @@
+{-# LANGUAGE ForeignFunctionInterface #-}
+module OIS.OISInterface(
+interface_with, 
+interface_new, 
+interface_delete
+)
+
+where
+
+import OIS.Types
+import Control.Monad
+
+import Foreign
+import Foreign.C.String
+import Foreign.C.Types
+
+interface_with :: (Interface -> IO a) -> IO a
+interface_with  f = do
+    obj <- interface_new 
+    res <- f obj
+    interface_delete obj
+    return res
+
+foreign import ccall "OISInterface.h OIS_Interface_new" c_interface_new :: IO Interface
+interface_new :: IO Interface
+interface_new  =   c_interface_new 
+
+foreign import ccall "OISInterface.h OIS_Interface_delete" c_interface_delete :: Interface -> IO ()
+interface_delete :: Interface -> IO ()
+interface_delete p1 =   c_interface_delete p1
+
diff --git a/OIS/OISJoyStick.hs b/OIS/OISJoyStick.hs
new file mode 100644
--- /dev/null
+++ b/OIS/OISJoyStick.hs
@@ -0,0 +1,155 @@
+{-# LANGUAGE ForeignFunctionInterface #-}
+module OIS.OISJoyStick(
+pov_with, 
+slider_with, 
+joyStickState_with, 
+joyStickEvent_with, 
+pov_delete, 
+slider_delete, 
+joyStickState_delete, 
+pov_new, 
+slider_new, 
+joyStickState_new, 
+joyStickState_clear, 
+joyStickEvent_new, 
+joyStickEvent_delete, 
+joyStickListener_delete, 
+joyStickListener_buttonPressed, 
+joyStickListener_buttonReleased, 
+joyStickListener_axisMoved, 
+joyStickListener_povMoved, 
+joyStickListener_vector3Moved, 
+joyStick_delete, 
+joyStick_getNumberOfComponents, 
+joyStick_setVector3Sensitivity, 
+joyStick_getVector3Sensitivity, 
+joyStick_setEventCallback, 
+joyStick_getEventCallback, 
+joyStick_getJoyStickState
+)
+
+where
+
+import OIS.Types
+import Control.Monad
+
+import Foreign
+import Foreign.C.String
+import Foreign.C.Types
+
+pov_with :: (Pov -> IO a) -> IO a
+pov_with  f = do
+    obj <- pov_new 
+    res <- f obj
+    pov_delete obj
+    return res
+
+slider_with :: (Slider -> IO a) -> IO a
+slider_with  f = do
+    obj <- slider_new 
+    res <- f obj
+    slider_delete obj
+    return res
+
+joyStickState_with :: (JoyStickState -> IO a) -> IO a
+joyStickState_with  f = do
+    obj <- joyStickState_new 
+    res <- f obj
+    joyStickState_delete obj
+    return res
+
+joyStickEvent_with :: Object -> JoyStickState -> (JoyStickEvent -> IO a) -> IO a
+joyStickEvent_with p1 p2 f = do
+    obj <- joyStickEvent_new p1 p2
+    res <- f obj
+    joyStickEvent_delete obj
+    return res
+
+foreign import ccall "OISJoyStick.h OIS_Pov_delete" c_pov_delete :: Pov -> IO ()
+pov_delete :: Pov -> IO ()
+pov_delete p1 =   c_pov_delete p1
+
+foreign import ccall "OISJoyStick.h OIS_Slider_delete" c_slider_delete :: Slider -> IO ()
+slider_delete :: Slider -> IO ()
+slider_delete p1 =   c_slider_delete p1
+
+foreign import ccall "OISJoyStick.h OIS_JoyStickState_delete" c_joyStickState_delete :: JoyStickState -> IO ()
+joyStickState_delete :: JoyStickState -> IO ()
+joyStickState_delete p1 =   c_joyStickState_delete p1
+
+foreign import ccall "OISJoyStick.h OIS_Pov_new" c_pov_new :: IO Pov
+pov_new :: IO Pov
+pov_new  =   c_pov_new 
+
+foreign import ccall "OISJoyStick.h OIS_Slider_new" c_slider_new :: IO Slider
+slider_new :: IO Slider
+slider_new  =   c_slider_new 
+
+foreign import ccall "OISJoyStick.h OIS_JoyStickState_new" c_joyStickState_new :: IO JoyStickState
+joyStickState_new :: IO JoyStickState
+joyStickState_new  =   c_joyStickState_new 
+
+foreign import ccall "OISJoyStick.h OIS_JoyStickState_clear" c_joyStickState_clear :: JoyStickState -> IO ()
+joyStickState_clear :: JoyStickState -> IO ()
+joyStickState_clear p1 =   c_joyStickState_clear p1
+
+foreign import ccall "OISJoyStick.h OIS_JoyStickEvent_new" c_joyStickEvent_new :: Object -> JoyStickState -> IO JoyStickEvent
+joyStickEvent_new :: Object -> JoyStickState -> IO JoyStickEvent
+joyStickEvent_new p1 p2 =   c_joyStickEvent_new p1 p2
+
+foreign import ccall "OISJoyStick.h OIS_JoyStickEvent_delete" c_joyStickEvent_delete :: JoyStickEvent -> IO ()
+joyStickEvent_delete :: JoyStickEvent -> IO ()
+joyStickEvent_delete p1 =   c_joyStickEvent_delete p1
+
+foreign import ccall "OISJoyStick.h OIS_JoyStickListener_delete" c_joyStickListener_delete :: JoyStickListener -> IO ()
+joyStickListener_delete :: JoyStickListener -> IO ()
+joyStickListener_delete p1 =   c_joyStickListener_delete p1
+
+foreign import ccall "OISJoyStick.h OIS_JoyStickListener_buttonPressed" c_joyStickListener_buttonPressed :: JoyStickListener -> JoyStickEvent -> CInt -> IO CBool
+joyStickListener_buttonPressed :: JoyStickListener -> JoyStickEvent -> Int -> IO Bool
+joyStickListener_buttonPressed p1 p2 p3 =  liftM toBool $  c_joyStickListener_buttonPressed p1 p2 (fromIntegral p3)
+
+foreign import ccall "OISJoyStick.h OIS_JoyStickListener_buttonReleased" c_joyStickListener_buttonReleased :: JoyStickListener -> JoyStickEvent -> CInt -> IO CBool
+joyStickListener_buttonReleased :: JoyStickListener -> JoyStickEvent -> Int -> IO Bool
+joyStickListener_buttonReleased p1 p2 p3 =  liftM toBool $  c_joyStickListener_buttonReleased p1 p2 (fromIntegral p3)
+
+foreign import ccall "OISJoyStick.h OIS_JoyStickListener_axisMoved" c_joyStickListener_axisMoved :: JoyStickListener -> JoyStickEvent -> CInt -> IO CBool
+joyStickListener_axisMoved :: JoyStickListener -> JoyStickEvent -> Int -> IO Bool
+joyStickListener_axisMoved p1 p2 p3 =  liftM toBool $  c_joyStickListener_axisMoved p1 p2 (fromIntegral p3)
+
+foreign import ccall "OISJoyStick.h OIS_JoyStickListener_povMoved" c_joyStickListener_povMoved :: JoyStickListener -> JoyStickEvent -> CInt -> IO CBool
+joyStickListener_povMoved :: JoyStickListener -> JoyStickEvent -> Int -> IO Bool
+joyStickListener_povMoved p1 p2 p3 =  liftM toBool $  c_joyStickListener_povMoved p1 p2 (fromIntegral p3)
+
+foreign import ccall "OISJoyStick.h OIS_JoyStickListener_vector3Moved" c_joyStickListener_vector3Moved :: JoyStickListener -> JoyStickEvent -> CInt -> IO CBool
+joyStickListener_vector3Moved :: JoyStickListener -> JoyStickEvent -> Int -> IO Bool
+joyStickListener_vector3Moved p1 p2 p3 =  liftM toBool $  c_joyStickListener_vector3Moved p1 p2 (fromIntegral p3)
+
+foreign import ccall "OISJoyStick.h OIS_JoyStick_delete" c_joyStick_delete :: JoyStick -> IO ()
+joyStick_delete :: JoyStick -> IO ()
+joyStick_delete p1 =   c_joyStick_delete p1
+
+foreign import ccall "OISJoyStick.h OIS_JoyStick_getNumberOfComponents" c_joyStick_getNumberOfComponents :: JoyStick -> CInt -> IO CInt
+joyStick_getNumberOfComponents :: JoyStick -> ComponentType -> IO Int
+joyStick_getNumberOfComponents p1 p2 =  liftM fromIntegral $  c_joyStick_getNumberOfComponents p1 (componentTypeToCInt p2)
+
+foreign import ccall "OISJoyStick.h OIS_JoyStick_setVector3Sensitivity" c_joyStick_setVector3Sensitivity :: JoyStick -> CFloat -> IO ()
+joyStick_setVector3Sensitivity :: JoyStick -> Float -> IO ()
+joyStick_setVector3Sensitivity p1 p2 =   c_joyStick_setVector3Sensitivity p1 (realToFrac p2)
+
+foreign import ccall "OISJoyStick.h OIS_JoyStick_getVector3Sensitivity" c_joyStick_getVector3Sensitivity :: JoyStick -> IO CFloat
+joyStick_getVector3Sensitivity :: JoyStick -> IO Float
+joyStick_getVector3Sensitivity p1 =  liftM realToFrac $  c_joyStick_getVector3Sensitivity p1
+
+foreign import ccall "OISJoyStick.h OIS_JoyStick_setEventCallback" c_joyStick_setEventCallback :: JoyStick -> JoyStickListener -> IO ()
+joyStick_setEventCallback :: JoyStick -> JoyStickListener -> IO ()
+joyStick_setEventCallback p1 p2 =   c_joyStick_setEventCallback p1 p2
+
+foreign import ccall "OISJoyStick.h OIS_JoyStick_getEventCallback" c_joyStick_getEventCallback :: JoyStick -> IO JoyStickListener
+joyStick_getEventCallback :: JoyStick -> IO JoyStickListener
+joyStick_getEventCallback p1 =   c_joyStick_getEventCallback p1
+
+foreign import ccall "OISJoyStick.h OIS_JoyStick_getJoyStickState" c_joyStick_getJoyStickState :: JoyStick -> IO JoyStickState
+joyStick_getJoyStickState :: JoyStick -> IO JoyStickState
+joyStick_getJoyStickState p1 =   c_joyStick_getJoyStickState p1
+
diff --git a/OIS/OISKeyboard.hs b/OIS/OISKeyboard.hs
new file mode 100644
--- /dev/null
+++ b/OIS/OISKeyboard.hs
@@ -0,0 +1,81 @@
+{-# LANGUAGE ForeignFunctionInterface #-}
+module OIS.OISKeyboard(
+keyEvent_with, 
+keyEvent_new, 
+keyEvent_delete, 
+keyListener_delete, 
+keyListener_keyPressed, 
+keyListener_keyReleased, 
+keyboard_delete, 
+keyboard_isKeyDown, 
+keyboard_setEventCallback, 
+keyboard_getEventCallback, 
+keyboard_setTextTranslation, 
+keyboard_getTextTranslation, 
+keyboard_isModifierDown
+)
+
+where
+
+import OIS.Types
+import Control.Monad
+
+import Foreign
+import Foreign.C.String
+import Foreign.C.Types
+
+keyEvent_with :: Object -> KeyCode -> Int -> (KeyEvent -> IO a) -> IO a
+keyEvent_with p1 p2 p3 f = do
+    obj <- keyEvent_new p1 p2 p3
+    res <- f obj
+    keyEvent_delete obj
+    return res
+
+foreign import ccall "OISKeyboard.h OIS_KeyEvent_new" c_keyEvent_new :: Object -> CInt -> CUInt -> IO KeyEvent
+keyEvent_new :: Object -> KeyCode -> Int -> IO KeyEvent
+keyEvent_new p1 p2 p3 =   c_keyEvent_new p1 (keyCodeToCInt p2) (fromIntegral p3)
+
+foreign import ccall "OISKeyboard.h OIS_KeyEvent_delete" c_keyEvent_delete :: KeyEvent -> IO ()
+keyEvent_delete :: KeyEvent -> IO ()
+keyEvent_delete p1 =   c_keyEvent_delete p1
+
+foreign import ccall "OISKeyboard.h OIS_KeyListener_delete" c_keyListener_delete :: KeyListener -> IO ()
+keyListener_delete :: KeyListener -> IO ()
+keyListener_delete p1 =   c_keyListener_delete p1
+
+foreign import ccall "OISKeyboard.h OIS_KeyListener_keyPressed" c_keyListener_keyPressed :: KeyListener -> KeyEvent -> IO CBool
+keyListener_keyPressed :: KeyListener -> KeyEvent -> IO Bool
+keyListener_keyPressed p1 p2 =  liftM toBool $  c_keyListener_keyPressed p1 p2
+
+foreign import ccall "OISKeyboard.h OIS_KeyListener_keyReleased" c_keyListener_keyReleased :: KeyListener -> KeyEvent -> IO CBool
+keyListener_keyReleased :: KeyListener -> KeyEvent -> IO Bool
+keyListener_keyReleased p1 p2 =  liftM toBool $  c_keyListener_keyReleased p1 p2
+
+foreign import ccall "OISKeyboard.h OIS_Keyboard_delete" c_keyboard_delete :: Keyboard -> IO ()
+keyboard_delete :: Keyboard -> IO ()
+keyboard_delete p1 =   c_keyboard_delete p1
+
+foreign import ccall "OISKeyboard.h OIS_Keyboard_isKeyDown" c_keyboard_isKeyDown :: Keyboard -> CInt -> IO CBool
+keyboard_isKeyDown :: Keyboard -> KeyCode -> IO Bool
+keyboard_isKeyDown p1 p2 =  liftM toBool $  c_keyboard_isKeyDown p1 (keyCodeToCInt p2)
+
+foreign import ccall "OISKeyboard.h OIS_Keyboard_setEventCallback" c_keyboard_setEventCallback :: Keyboard -> KeyListener -> IO ()
+keyboard_setEventCallback :: Keyboard -> KeyListener -> IO ()
+keyboard_setEventCallback p1 p2 =   c_keyboard_setEventCallback p1 p2
+
+foreign import ccall "OISKeyboard.h OIS_Keyboard_getEventCallback" c_keyboard_getEventCallback :: Keyboard -> IO KeyListener
+keyboard_getEventCallback :: Keyboard -> IO KeyListener
+keyboard_getEventCallback p1 =   c_keyboard_getEventCallback p1
+
+foreign import ccall "OISKeyboard.h OIS_Keyboard_setTextTranslation" c_keyboard_setTextTranslation :: Keyboard -> CInt -> IO ()
+keyboard_setTextTranslation :: Keyboard -> TextTranslationMode -> IO ()
+keyboard_setTextTranslation p1 p2 =   c_keyboard_setTextTranslation p1 (textTranslationModeToCInt p2)
+
+foreign import ccall "OISKeyboard.h OIS_Keyboard_getTextTranslation" c_keyboard_getTextTranslation :: Keyboard -> IO CInt
+keyboard_getTextTranslation :: Keyboard -> IO TextTranslationMode
+keyboard_getTextTranslation p1 =  liftM cintToTextTranslationMode $  c_keyboard_getTextTranslation p1
+
+foreign import ccall "OISKeyboard.h OIS_Keyboard_isModifierDown" c_keyboard_isModifierDown :: Keyboard -> CInt -> IO CBool
+keyboard_isModifierDown :: Keyboard -> Modifier -> IO Bool
+keyboard_isModifierDown p1 p2 =  liftM toBool $  c_keyboard_isModifierDown p1 (modifierToCInt p2)
+
diff --git a/OIS/OISMouse.hs b/OIS/OISMouse.hs
new file mode 100644
--- /dev/null
+++ b/OIS/OISMouse.hs
@@ -0,0 +1,99 @@
+{-# LANGUAGE ForeignFunctionInterface #-}
+module OIS.OISMouse(
+mouseState_with, 
+mouseEvent_with, 
+mouseState_delete, 
+mouseState_new, 
+mouseState_buttonDown, 
+mouseState_clear, 
+mouseEvent_new, 
+mouseEvent_delete, 
+mouseListener_delete, 
+mouseListener_mouseMoved, 
+mouseListener_mousePressed, 
+mouseListener_mouseReleased, 
+mouse_delete, 
+mouse_setEventCallback, 
+mouse_getEventCallback, 
+mouse_getMouseState
+)
+
+where
+
+import OIS.Types
+import Control.Monad
+
+import Foreign
+import Foreign.C.String
+import Foreign.C.Types
+
+mouseState_with :: (MouseState -> IO a) -> IO a
+mouseState_with  f = do
+    obj <- mouseState_new 
+    res <- f obj
+    mouseState_delete obj
+    return res
+
+mouseEvent_with :: Object -> MouseState -> (MouseEvent -> IO a) -> IO a
+mouseEvent_with p1 p2 f = do
+    obj <- mouseEvent_new p1 p2
+    res <- f obj
+    mouseEvent_delete obj
+    return res
+
+foreign import ccall "OISMouse.h OIS_MouseState_delete" c_mouseState_delete :: MouseState -> IO ()
+mouseState_delete :: MouseState -> IO ()
+mouseState_delete p1 =   c_mouseState_delete p1
+
+foreign import ccall "OISMouse.h OIS_MouseState_new" c_mouseState_new :: IO MouseState
+mouseState_new :: IO MouseState
+mouseState_new  =   c_mouseState_new 
+
+foreign import ccall "OISMouse.h OIS_MouseState_buttonDown" c_mouseState_buttonDown :: MouseState -> CInt -> IO CBool
+mouseState_buttonDown :: MouseState -> MouseButtonID -> IO Bool
+mouseState_buttonDown p1 p2 =  liftM toBool $  c_mouseState_buttonDown p1 (mouseButtonIDToCInt p2)
+
+foreign import ccall "OISMouse.h OIS_MouseState_clear" c_mouseState_clear :: MouseState -> IO ()
+mouseState_clear :: MouseState -> IO ()
+mouseState_clear p1 =   c_mouseState_clear p1
+
+foreign import ccall "OISMouse.h OIS_MouseEvent_new" c_mouseEvent_new :: Object -> MouseState -> IO MouseEvent
+mouseEvent_new :: Object -> MouseState -> IO MouseEvent
+mouseEvent_new p1 p2 =   c_mouseEvent_new p1 p2
+
+foreign import ccall "OISMouse.h OIS_MouseEvent_delete" c_mouseEvent_delete :: MouseEvent -> IO ()
+mouseEvent_delete :: MouseEvent -> IO ()
+mouseEvent_delete p1 =   c_mouseEvent_delete p1
+
+foreign import ccall "OISMouse.h OIS_MouseListener_delete" c_mouseListener_delete :: MouseListener -> IO ()
+mouseListener_delete :: MouseListener -> IO ()
+mouseListener_delete p1 =   c_mouseListener_delete p1
+
+foreign import ccall "OISMouse.h OIS_MouseListener_mouseMoved" c_mouseListener_mouseMoved :: MouseListener -> MouseEvent -> IO CBool
+mouseListener_mouseMoved :: MouseListener -> MouseEvent -> IO Bool
+mouseListener_mouseMoved p1 p2 =  liftM toBool $  c_mouseListener_mouseMoved p1 p2
+
+foreign import ccall "OISMouse.h OIS_MouseListener_mousePressed" c_mouseListener_mousePressed :: MouseListener -> MouseEvent -> CInt -> IO CBool
+mouseListener_mousePressed :: MouseListener -> MouseEvent -> MouseButtonID -> IO Bool
+mouseListener_mousePressed p1 p2 p3 =  liftM toBool $  c_mouseListener_mousePressed p1 p2 (mouseButtonIDToCInt p3)
+
+foreign import ccall "OISMouse.h OIS_MouseListener_mouseReleased" c_mouseListener_mouseReleased :: MouseListener -> MouseEvent -> CInt -> IO CBool
+mouseListener_mouseReleased :: MouseListener -> MouseEvent -> MouseButtonID -> IO Bool
+mouseListener_mouseReleased p1 p2 p3 =  liftM toBool $  c_mouseListener_mouseReleased p1 p2 (mouseButtonIDToCInt p3)
+
+foreign import ccall "OISMouse.h OIS_Mouse_delete" c_mouse_delete :: Mouse -> IO ()
+mouse_delete :: Mouse -> IO ()
+mouse_delete p1 =   c_mouse_delete p1
+
+foreign import ccall "OISMouse.h OIS_Mouse_setEventCallback" c_mouse_setEventCallback :: Mouse -> MouseListener -> IO ()
+mouse_setEventCallback :: Mouse -> MouseListener -> IO ()
+mouse_setEventCallback p1 p2 =   c_mouse_setEventCallback p1 p2
+
+foreign import ccall "OISMouse.h OIS_Mouse_getEventCallback" c_mouse_getEventCallback :: Mouse -> IO MouseListener
+mouse_getEventCallback :: Mouse -> IO MouseListener
+mouse_getEventCallback p1 =   c_mouse_getEventCallback p1
+
+foreign import ccall "OISMouse.h OIS_Mouse_getMouseState" c_mouse_getMouseState :: Mouse -> IO MouseState
+mouse_getMouseState :: Mouse -> IO MouseState
+mouse_getMouseState p1 =   c_mouse_getMouseState p1
+
diff --git a/OIS/OISMultiTouch.hs b/OIS/OISMultiTouch.hs
new file mode 100644
--- /dev/null
+++ b/OIS/OISMultiTouch.hs
@@ -0,0 +1,104 @@
+{-# LANGUAGE ForeignFunctionInterface #-}
+module OIS.OISMultiTouch(
+multiTouchState_with, 
+multiTouchEvent_with, 
+multiTouchState_delete, 
+multiTouchState_new, 
+multiTouchState_touchIsType, 
+multiTouchState_clear, 
+multiTouchEvent_new, 
+multiTouchEvent_delete, 
+multiTouchListener_delete, 
+multiTouchListener_touchMoved, 
+multiTouchListener_touchPressed, 
+multiTouchListener_touchReleased, 
+multiTouchListener_touchCancelled, 
+multiTouch_delete, 
+multiTouch_setEventCallback, 
+multiTouch_getEventCallback, 
+multiTouch_clearStates
+)
+
+where
+
+import OIS.Types
+import Control.Monad
+
+import Foreign
+import Foreign.C.String
+import Foreign.C.Types
+
+multiTouchState_with :: (MultiTouchState -> IO a) -> IO a
+multiTouchState_with  f = do
+    obj <- multiTouchState_new 
+    res <- f obj
+    multiTouchState_delete obj
+    return res
+
+multiTouchEvent_with :: Object -> MultiTouchState -> (MultiTouchEvent -> IO a) -> IO a
+multiTouchEvent_with p1 p2 f = do
+    obj <- multiTouchEvent_new p1 p2
+    res <- f obj
+    multiTouchEvent_delete obj
+    return res
+
+foreign import ccall "OISMultiTouch.h OIS_MultiTouchState_delete" c_multiTouchState_delete :: MultiTouchState -> IO ()
+multiTouchState_delete :: MultiTouchState -> IO ()
+multiTouchState_delete p1 =   c_multiTouchState_delete p1
+
+foreign import ccall "OISMultiTouch.h OIS_MultiTouchState_new" c_multiTouchState_new :: IO MultiTouchState
+multiTouchState_new :: IO MultiTouchState
+multiTouchState_new  =   c_multiTouchState_new 
+
+foreign import ccall "OISMultiTouch.h OIS_MultiTouchState_touchIsType" c_multiTouchState_touchIsType :: MultiTouchState -> CInt -> IO CBool
+multiTouchState_touchIsType :: MultiTouchState -> MultiTypeEventTypeID -> IO Bool
+multiTouchState_touchIsType p1 p2 =  liftM toBool $  c_multiTouchState_touchIsType p1 (multiTypeEventTypeIDToCInt p2)
+
+foreign import ccall "OISMultiTouch.h OIS_MultiTouchState_clear" c_multiTouchState_clear :: MultiTouchState -> IO ()
+multiTouchState_clear :: MultiTouchState -> IO ()
+multiTouchState_clear p1 =   c_multiTouchState_clear p1
+
+foreign import ccall "OISMultiTouch.h OIS_MultiTouchEvent_new" c_multiTouchEvent_new :: Object -> MultiTouchState -> IO MultiTouchEvent
+multiTouchEvent_new :: Object -> MultiTouchState -> IO MultiTouchEvent
+multiTouchEvent_new p1 p2 =   c_multiTouchEvent_new p1 p2
+
+foreign import ccall "OISMultiTouch.h OIS_MultiTouchEvent_delete" c_multiTouchEvent_delete :: MultiTouchEvent -> IO ()
+multiTouchEvent_delete :: MultiTouchEvent -> IO ()
+multiTouchEvent_delete p1 =   c_multiTouchEvent_delete p1
+
+foreign import ccall "OISMultiTouch.h OIS_MultiTouchListener_delete" c_multiTouchListener_delete :: MultiTouchListener -> IO ()
+multiTouchListener_delete :: MultiTouchListener -> IO ()
+multiTouchListener_delete p1 =   c_multiTouchListener_delete p1
+
+foreign import ccall "OISMultiTouch.h OIS_MultiTouchListener_touchMoved" c_multiTouchListener_touchMoved :: MultiTouchListener -> MultiTouchEvent -> IO CBool
+multiTouchListener_touchMoved :: MultiTouchListener -> MultiTouchEvent -> IO Bool
+multiTouchListener_touchMoved p1 p2 =  liftM toBool $  c_multiTouchListener_touchMoved p1 p2
+
+foreign import ccall "OISMultiTouch.h OIS_MultiTouchListener_touchPressed" c_multiTouchListener_touchPressed :: MultiTouchListener -> MultiTouchEvent -> IO CBool
+multiTouchListener_touchPressed :: MultiTouchListener -> MultiTouchEvent -> IO Bool
+multiTouchListener_touchPressed p1 p2 =  liftM toBool $  c_multiTouchListener_touchPressed p1 p2
+
+foreign import ccall "OISMultiTouch.h OIS_MultiTouchListener_touchReleased" c_multiTouchListener_touchReleased :: MultiTouchListener -> MultiTouchEvent -> IO CBool
+multiTouchListener_touchReleased :: MultiTouchListener -> MultiTouchEvent -> IO Bool
+multiTouchListener_touchReleased p1 p2 =  liftM toBool $  c_multiTouchListener_touchReleased p1 p2
+
+foreign import ccall "OISMultiTouch.h OIS_MultiTouchListener_touchCancelled" c_multiTouchListener_touchCancelled :: MultiTouchListener -> MultiTouchEvent -> IO CBool
+multiTouchListener_touchCancelled :: MultiTouchListener -> MultiTouchEvent -> IO Bool
+multiTouchListener_touchCancelled p1 p2 =  liftM toBool $  c_multiTouchListener_touchCancelled p1 p2
+
+foreign import ccall "OISMultiTouch.h OIS_MultiTouch_delete" c_multiTouch_delete :: MultiTouch -> IO ()
+multiTouch_delete :: MultiTouch -> IO ()
+multiTouch_delete p1 =   c_multiTouch_delete p1
+
+foreign import ccall "OISMultiTouch.h OIS_MultiTouch_setEventCallback" c_multiTouch_setEventCallback :: MultiTouch -> MultiTouchListener -> IO ()
+multiTouch_setEventCallback :: MultiTouch -> MultiTouchListener -> IO ()
+multiTouch_setEventCallback p1 p2 =   c_multiTouch_setEventCallback p1 p2
+
+foreign import ccall "OISMultiTouch.h OIS_MultiTouch_getEventCallback" c_multiTouch_getEventCallback :: MultiTouch -> IO MultiTouchListener
+multiTouch_getEventCallback :: MultiTouch -> IO MultiTouchListener
+multiTouch_getEventCallback p1 =   c_multiTouch_getEventCallback p1
+
+foreign import ccall "OISMultiTouch.h OIS_MultiTouch_clearStates" c_multiTouch_clearStates :: MultiTouch -> IO ()
+multiTouch_clearStates :: MultiTouch -> IO ()
+multiTouch_clearStates p1 =   c_multiTouch_clearStates p1
+
diff --git a/OIS/OISObject.hs b/OIS/OISObject.hs
new file mode 100644
--- /dev/null
+++ b/OIS/OISObject.hs
@@ -0,0 +1,58 @@
+{-# LANGUAGE ForeignFunctionInterface #-}
+module OIS.OISObject(
+object_delete, 
+object_type, 
+object_buffered, 
+object_getCreator, 
+object_setBuffered, 
+object_capture, 
+object_getID, 
+object_queryInterface, 
+object__initialize
+)
+
+where
+
+import OIS.Types
+import Control.Monad
+
+import Foreign
+import Foreign.C.String
+import Foreign.C.Types
+
+foreign import ccall "OISObject.h OIS_Object_delete" c_object_delete :: Object -> IO ()
+object_delete :: Object -> IO ()
+object_delete p1 =   c_object_delete p1
+
+foreign import ccall "OISObject.h OIS_Object_type" c_object_type :: Object -> IO CInt
+object_type :: Object -> IO Type
+object_type p1 =  liftM cintToType $  c_object_type p1
+
+foreign import ccall "OISObject.h OIS_Object_buffered" c_object_buffered :: Object -> IO CBool
+object_buffered :: Object -> IO Bool
+object_buffered p1 =  liftM toBool $  c_object_buffered p1
+
+foreign import ccall "OISObject.h OIS_Object_getCreator" c_object_getCreator :: Object -> IO InputManager
+object_getCreator :: Object -> IO InputManager
+object_getCreator p1 =   c_object_getCreator p1
+
+foreign import ccall "OISObject.h OIS_Object_setBuffered" c_object_setBuffered :: Object -> CBool -> IO ()
+object_setBuffered :: Object -> Bool -> IO ()
+object_setBuffered p1 p2 =   c_object_setBuffered p1 (fromBool p2)
+
+foreign import ccall "OISObject.h OIS_Object_capture" c_object_capture :: Object -> IO ()
+object_capture :: Object -> IO ()
+object_capture p1 =   c_object_capture p1
+
+foreign import ccall "OISObject.h OIS_Object_getID" c_object_getID :: Object -> IO CInt
+object_getID :: Object -> IO Int
+object_getID p1 =  liftM fromIntegral $  c_object_getID p1
+
+foreign import ccall "OISObject.h OIS_Object_queryInterface" c_object_queryInterface :: Object -> CInt -> IO Interface
+object_queryInterface :: Object -> IType -> IO Interface
+object_queryInterface p1 p2 =   c_object_queryInterface p1 (iTypeToCInt p2)
+
+foreign import ccall "OISObject.h OIS_Object__initialize" c_object__initialize :: Object -> IO ()
+object__initialize :: Object -> IO ()
+object__initialize p1 =   c_object__initialize p1
+
diff --git a/OIS/OISPrereqs.hs b/OIS/OISPrereqs.hs
new file mode 100644
--- /dev/null
+++ b/OIS/OISPrereqs.hs
@@ -0,0 +1,134 @@
+{-# LANGUAGE ForeignFunctionInterface #-}
+module OIS.OISPrereqs(
+component_with_void, 
+component_with, 
+button_with_void, 
+button_with, 
+axis_with, 
+vector3_with_void, 
+vector3_with, 
+component_delete, 
+button_delete, 
+axis_delete, 
+vector3_delete, 
+component_new_void, 
+component_new, 
+button_new_void, 
+button_new, 
+axis_new, 
+axis_clear, 
+vector3_new_void, 
+vector3_new, 
+vector3_clear
+)
+
+where
+
+import OIS.Types
+import Control.Monad
+
+import Foreign
+import Foreign.C.String
+import Foreign.C.Types
+
+component_with_void :: (Component -> IO a) -> IO a
+component_with_void  f = do
+    obj <- component_new_void 
+    res <- f obj
+    component_delete obj
+    return res
+
+component_with :: ComponentType -> (Component -> IO a) -> IO a
+component_with p1 f = do
+    obj <- component_new p1
+    res <- f obj
+    component_delete obj
+    return res
+
+button_with_void :: (Button -> IO a) -> IO a
+button_with_void  f = do
+    obj <- button_new_void 
+    res <- f obj
+    button_delete obj
+    return res
+
+button_with :: Bool -> (Button -> IO a) -> IO a
+button_with p1 f = do
+    obj <- button_new p1
+    res <- f obj
+    button_delete obj
+    return res
+
+axis_with :: (Axis -> IO a) -> IO a
+axis_with  f = do
+    obj <- axis_new 
+    res <- f obj
+    axis_delete obj
+    return res
+
+vector3_with_void :: (Vector3 -> IO a) -> IO a
+vector3_with_void  f = do
+    obj <- vector3_new_void 
+    res <- f obj
+    vector3_delete obj
+    return res
+
+vector3_with :: Float -> Float -> Float -> (Vector3 -> IO a) -> IO a
+vector3_with p1 p2 p3 f = do
+    obj <- vector3_new p1 p2 p3
+    res <- f obj
+    vector3_delete obj
+    return res
+
+foreign import ccall "OISPrereqs.h OIS_Component_delete" c_component_delete :: Component -> IO ()
+component_delete :: Component -> IO ()
+component_delete p1 =   c_component_delete p1
+
+foreign import ccall "OISPrereqs.h OIS_Button_delete" c_button_delete :: Button -> IO ()
+button_delete :: Button -> IO ()
+button_delete p1 =   c_button_delete p1
+
+foreign import ccall "OISPrereqs.h OIS_Axis_delete" c_axis_delete :: Axis -> IO ()
+axis_delete :: Axis -> IO ()
+axis_delete p1 =   c_axis_delete p1
+
+foreign import ccall "OISPrereqs.h OIS_Vector3_delete" c_vector3_delete :: Vector3 -> IO ()
+vector3_delete :: Vector3 -> IO ()
+vector3_delete p1 =   c_vector3_delete p1
+
+foreign import ccall "OISPrereqs.h OIS_Component_new_void" c_component_new_void :: IO Component
+component_new_void :: IO Component
+component_new_void  =   c_component_new_void 
+
+foreign import ccall "OISPrereqs.h OIS_Component_new" c_component_new :: CInt -> IO Component
+component_new :: ComponentType -> IO Component
+component_new p1 =   c_component_new (componentTypeToCInt p1)
+
+foreign import ccall "OISPrereqs.h OIS_Button_new_void" c_button_new_void :: IO Button
+button_new_void :: IO Button
+button_new_void  =   c_button_new_void 
+
+foreign import ccall "OISPrereqs.h OIS_Button_new" c_button_new :: CBool -> IO Button
+button_new :: Bool -> IO Button
+button_new p1 =   c_button_new (fromBool p1)
+
+foreign import ccall "OISPrereqs.h OIS_Axis_new" c_axis_new :: IO Axis
+axis_new :: IO Axis
+axis_new  =   c_axis_new 
+
+foreign import ccall "OISPrereqs.h OIS_Axis_clear" c_axis_clear :: Axis -> IO ()
+axis_clear :: Axis -> IO ()
+axis_clear p1 =   c_axis_clear p1
+
+foreign import ccall "OISPrereqs.h OIS_Vector3_new_void" c_vector3_new_void :: IO Vector3
+vector3_new_void :: IO Vector3
+vector3_new_void  =   c_vector3_new_void 
+
+foreign import ccall "OISPrereqs.h OIS_Vector3_new" c_vector3_new :: CFloat -> CFloat -> CFloat -> IO Vector3
+vector3_new :: Float -> Float -> Float -> IO Vector3
+vector3_new p1 p2 p3 =   c_vector3_new (realToFrac p1) (realToFrac p2) (realToFrac p3)
+
+foreign import ccall "OISPrereqs.h OIS_Vector3_clear" c_vector3_clear :: Vector3 -> IO ()
+vector3_clear :: Vector3 -> IO ()
+vector3_clear p1 =   c_vector3_clear p1
+
diff --git a/OIS/Types.hs b/OIS/Types.hs
new file mode 100644
--- /dev/null
+++ b/OIS/Types.hs
@@ -0,0 +1,520 @@
+module OIS.Types
+where
+
+import Foreign
+import Foreign.C.String
+import Foreign.C.Types
+
+type CBool = CChar -- correct?
+
+newtype Axis = Axis (Ptr Axis) -- nullary data type
+newtype Button = Button (Ptr Button) -- nullary data type
+newtype Component = Component (Ptr Component) -- nullary data type
+
+data ComponentType = OIS_Unknown | OIS_Button | OIS_Axis | OIS_Slider | OIS_POV | OIS_Vector3
+
+componentTypeToCInt :: ComponentType -> CInt
+componentTypeToCInt OIS_Unknown = 0
+componentTypeToCInt OIS_Button = 1
+componentTypeToCInt OIS_Axis = 2
+componentTypeToCInt OIS_Slider = 3
+componentTypeToCInt OIS_POV = 4
+componentTypeToCInt OIS_Vector3 = 5
+
+cintToComponentType :: CInt -> ComponentType
+cintToComponentType 0 = OIS_Unknown
+cintToComponentType 1 = OIS_Button
+cintToComponentType 2 = OIS_Axis
+cintToComponentType 3 = OIS_Slider
+cintToComponentType 4 = OIS_POV
+cintToComponentType 5 = OIS_Vector3
+cintToComponentType n = error $ "cintToComponentType: can not convert integer '" ++ show n ++ "' to ComponentType"
+
+newtype EventArg = EventArg (Ptr EventArg) -- nullary data type
+newtype FactoryCreator = FactoryCreator (Ptr FactoryCreator) -- nullary data type
+newtype InputManager = InputManager (Ptr InputManager) -- nullary data type
+
+data AddOnFactories = AddOn_All | AddOn_LIRC | AddOn_WiiMote
+
+addOnFactoriesToCInt :: AddOnFactories -> CInt
+addOnFactoriesToCInt AddOn_All = 0
+addOnFactoriesToCInt AddOn_LIRC = 1
+addOnFactoriesToCInt AddOn_WiiMote = 2
+
+cintToAddOnFactories :: CInt -> AddOnFactories
+cintToAddOnFactories 0 = AddOn_All
+cintToAddOnFactories 1 = AddOn_LIRC
+cintToAddOnFactories 2 = AddOn_WiiMote
+cintToAddOnFactories n = error $ "cintToAddOnFactories: can not convert integer '" ++ show n ++ "' to AddOnFactories"
+
+newtype Interface = Interface (Ptr Interface) -- nullary data type
+
+data IType = ForceFeedback | Reserved
+
+iTypeToCInt :: IType -> CInt
+iTypeToCInt ForceFeedback = 0
+iTypeToCInt Reserved = 1
+
+cintToIType :: CInt -> IType
+cintToIType 0 = ForceFeedback
+cintToIType 1 = Reserved
+cintToIType n = error $ "cintToIType: can not convert integer '" ++ show n ++ "' to IType"
+
+newtype JoyStick = JoyStick (Ptr JoyStick) -- nullary data type
+newtype JoyStickEvent = JoyStickEvent (Ptr JoyStickEvent) -- nullary data type
+newtype JoyStickListener = JoyStickListener (Ptr JoyStickListener) -- nullary data type
+newtype JoyStickState = JoyStickState (Ptr JoyStickState) -- nullary data type
+
+data KeyCode = KC_UNASSIGNED | KC_ESCAPE | KC_1 | KC_2 | KC_3 | KC_4 | KC_5 | KC_6 | KC_7 | KC_8 | KC_9 | KC_0 | KC_MINUS | KC_EQUALS | KC_BACK | KC_TAB | KC_Q | KC_W | KC_E | KC_R | KC_T | KC_Y | KC_U | KC_I | KC_O | KC_P | KC_LBRACKET | KC_RBRACKET | KC_RETURN | KC_LCONTROL | KC_A | KC_S | KC_D | KC_F | KC_G | KC_H | KC_J | KC_K | KC_L | KC_SEMICOLON | KC_APOSTROPHE | KC_GRAVE | KC_LSHIFT | KC_BACKSLASH | KC_Z | KC_X | KC_C | KC_V | KC_B | KC_N | KC_M | KC_COMMA | KC_PERIOD | KC_SLASH | KC_RSHIFT | KC_MULTIPLY | KC_LMENU | KC_SPACE | KC_CAPITAL | KC_F1 | KC_F2 | KC_F3 | KC_F4 | KC_F5 | KC_F6 | KC_F7 | KC_F8 | KC_F9 | KC_F10 | KC_NUMLOCK | KC_SCROLL | KC_NUMPAD7 | KC_NUMPAD8 | KC_NUMPAD9 | KC_SUBTRACT | KC_NUMPAD4 | KC_NUMPAD5 | KC_NUMPAD6 | KC_ADD | KC_NUMPAD1 | KC_NUMPAD2 | KC_NUMPAD3 | KC_NUMPAD0 | KC_DECIMAL | KC_OEM_102 | KC_F11 | KC_F12 | KC_F13 | KC_F14 | KC_F15 | KC_KANA | KC_ABNT_C1 | KC_CONVERT | KC_NOCONVERT | KC_YEN | KC_ABNT_C2 | KC_NUMPADEQUALS | KC_PREVTRACK | KC_AT | KC_COLON | KC_UNDERLINE | KC_KANJI | KC_STOP | KC_AX | KC_UNLABELED | KC_NEXTTRACK | KC_NUMPADENTER | KC_RCONTROL | KC_MUTE | KC_CALCULATOR | KC_PLAYPAUSE | KC_MEDIASTOP | KC_VOLUMEDOWN | KC_VOLUMEUP | KC_WEBHOME | KC_NUMPADCOMMA | KC_DIVIDE | KC_SYSRQ | KC_RMENU | KC_PAUSE | KC_HOME | KC_UP | KC_PGUP | KC_LEFT | KC_RIGHT | KC_END | KC_DOWN | KC_PGDOWN | KC_INSERT | KC_DELETE | KC_LWIN | KC_RWIN | KC_APPS | KC_POWER | KC_SLEEP | KC_WAKE | KC_WEBSEARCH | KC_WEBFAVORITES | KC_WEBREFRESH | KC_WEBSTOP | KC_WEBFORWARD | KC_WEBBACK | KC_MYCOMPUTER | KC_MAIL | KC_MEDIASELECT
+
+keyCodeToCInt :: KeyCode -> CInt
+keyCodeToCInt KC_UNASSIGNED = 0
+keyCodeToCInt KC_ESCAPE = 1
+keyCodeToCInt KC_1 = 2
+keyCodeToCInt KC_2 = 3
+keyCodeToCInt KC_3 = 4
+keyCodeToCInt KC_4 = 5
+keyCodeToCInt KC_5 = 6
+keyCodeToCInt KC_6 = 7
+keyCodeToCInt KC_7 = 8
+keyCodeToCInt KC_8 = 9
+keyCodeToCInt KC_9 = 10
+keyCodeToCInt KC_0 = 11
+keyCodeToCInt KC_MINUS = 12
+keyCodeToCInt KC_EQUALS = 13
+keyCodeToCInt KC_BACK = 14
+keyCodeToCInt KC_TAB = 15
+keyCodeToCInt KC_Q = 16
+keyCodeToCInt KC_W = 17
+keyCodeToCInt KC_E = 18
+keyCodeToCInt KC_R = 19
+keyCodeToCInt KC_T = 20
+keyCodeToCInt KC_Y = 21
+keyCodeToCInt KC_U = 22
+keyCodeToCInt KC_I = 23
+keyCodeToCInt KC_O = 24
+keyCodeToCInt KC_P = 25
+keyCodeToCInt KC_LBRACKET = 26
+keyCodeToCInt KC_RBRACKET = 27
+keyCodeToCInt KC_RETURN = 28
+keyCodeToCInt KC_LCONTROL = 29
+keyCodeToCInt KC_A = 30
+keyCodeToCInt KC_S = 31
+keyCodeToCInt KC_D = 32
+keyCodeToCInt KC_F = 33
+keyCodeToCInt KC_G = 34
+keyCodeToCInt KC_H = 35
+keyCodeToCInt KC_J = 36
+keyCodeToCInt KC_K = 37
+keyCodeToCInt KC_L = 38
+keyCodeToCInt KC_SEMICOLON = 39
+keyCodeToCInt KC_APOSTROPHE = 40
+keyCodeToCInt KC_GRAVE = 41
+keyCodeToCInt KC_LSHIFT = 42
+keyCodeToCInt KC_BACKSLASH = 43
+keyCodeToCInt KC_Z = 44
+keyCodeToCInt KC_X = 45
+keyCodeToCInt KC_C = 46
+keyCodeToCInt KC_V = 47
+keyCodeToCInt KC_B = 48
+keyCodeToCInt KC_N = 49
+keyCodeToCInt KC_M = 50
+keyCodeToCInt KC_COMMA = 51
+keyCodeToCInt KC_PERIOD = 52
+keyCodeToCInt KC_SLASH = 53
+keyCodeToCInt KC_RSHIFT = 54
+keyCodeToCInt KC_MULTIPLY = 55
+keyCodeToCInt KC_LMENU = 56
+keyCodeToCInt KC_SPACE = 57
+keyCodeToCInt KC_CAPITAL = 58
+keyCodeToCInt KC_F1 = 59
+keyCodeToCInt KC_F2 = 60
+keyCodeToCInt KC_F3 = 61
+keyCodeToCInt KC_F4 = 62
+keyCodeToCInt KC_F5 = 63
+keyCodeToCInt KC_F6 = 64
+keyCodeToCInt KC_F7 = 65
+keyCodeToCInt KC_F8 = 66
+keyCodeToCInt KC_F9 = 67
+keyCodeToCInt KC_F10 = 68
+keyCodeToCInt KC_NUMLOCK = 69
+keyCodeToCInt KC_SCROLL = 70
+keyCodeToCInt KC_NUMPAD7 = 71
+keyCodeToCInt KC_NUMPAD8 = 72
+keyCodeToCInt KC_NUMPAD9 = 73
+keyCodeToCInt KC_SUBTRACT = 74
+keyCodeToCInt KC_NUMPAD4 = 75
+keyCodeToCInt KC_NUMPAD5 = 76
+keyCodeToCInt KC_NUMPAD6 = 77
+keyCodeToCInt KC_ADD = 78
+keyCodeToCInt KC_NUMPAD1 = 79
+keyCodeToCInt KC_NUMPAD2 = 80
+keyCodeToCInt KC_NUMPAD3 = 81
+keyCodeToCInt KC_NUMPAD0 = 82
+keyCodeToCInt KC_DECIMAL = 83
+keyCodeToCInt KC_OEM_102 = 86
+keyCodeToCInt KC_F11 = 87
+keyCodeToCInt KC_F12 = 88
+keyCodeToCInt KC_F13 = 100
+keyCodeToCInt KC_F14 = 101
+keyCodeToCInt KC_F15 = 102
+keyCodeToCInt KC_KANA = 112
+keyCodeToCInt KC_ABNT_C1 = 115
+keyCodeToCInt KC_CONVERT = 121
+keyCodeToCInt KC_NOCONVERT = 123
+keyCodeToCInt KC_YEN = 125
+keyCodeToCInt KC_ABNT_C2 = 126
+keyCodeToCInt KC_NUMPADEQUALS = 141
+keyCodeToCInt KC_PREVTRACK = 144
+keyCodeToCInt KC_AT = 145
+keyCodeToCInt KC_COLON = 146
+keyCodeToCInt KC_UNDERLINE = 147
+keyCodeToCInt KC_KANJI = 148
+keyCodeToCInt KC_STOP = 149
+keyCodeToCInt KC_AX = 150
+keyCodeToCInt KC_UNLABELED = 151
+keyCodeToCInt KC_NEXTTRACK = 153
+keyCodeToCInt KC_NUMPADENTER = 156
+keyCodeToCInt KC_RCONTROL = 157
+keyCodeToCInt KC_MUTE = 160
+keyCodeToCInt KC_CALCULATOR = 161
+keyCodeToCInt KC_PLAYPAUSE = 162
+keyCodeToCInt KC_MEDIASTOP = 164
+keyCodeToCInt KC_VOLUMEDOWN = 174
+keyCodeToCInt KC_VOLUMEUP = 176
+keyCodeToCInt KC_WEBHOME = 178
+keyCodeToCInt KC_NUMPADCOMMA = 179
+keyCodeToCInt KC_DIVIDE = 181
+keyCodeToCInt KC_SYSRQ = 183
+keyCodeToCInt KC_RMENU = 184
+keyCodeToCInt KC_PAUSE = 197
+keyCodeToCInt KC_HOME = 199
+keyCodeToCInt KC_UP = 200
+keyCodeToCInt KC_PGUP = 201
+keyCodeToCInt KC_LEFT = 203
+keyCodeToCInt KC_RIGHT = 205
+keyCodeToCInt KC_END = 207
+keyCodeToCInt KC_DOWN = 208
+keyCodeToCInt KC_PGDOWN = 209
+keyCodeToCInt KC_INSERT = 210
+keyCodeToCInt KC_DELETE = 211
+keyCodeToCInt KC_LWIN = 219
+keyCodeToCInt KC_RWIN = 220
+keyCodeToCInt KC_APPS = 221
+keyCodeToCInt KC_POWER = 222
+keyCodeToCInt KC_SLEEP = 223
+keyCodeToCInt KC_WAKE = 227
+keyCodeToCInt KC_WEBSEARCH = 229
+keyCodeToCInt KC_WEBFAVORITES = 230
+keyCodeToCInt KC_WEBREFRESH = 231
+keyCodeToCInt KC_WEBSTOP = 232
+keyCodeToCInt KC_WEBFORWARD = 233
+keyCodeToCInt KC_WEBBACK = 234
+keyCodeToCInt KC_MYCOMPUTER = 235
+keyCodeToCInt KC_MAIL = 236
+keyCodeToCInt KC_MEDIASELECT = 237
+
+cintToKeyCode :: CInt -> KeyCode
+cintToKeyCode 0 = KC_UNASSIGNED
+cintToKeyCode 1 = KC_ESCAPE
+cintToKeyCode 2 = KC_1
+cintToKeyCode 3 = KC_2
+cintToKeyCode 4 = KC_3
+cintToKeyCode 5 = KC_4
+cintToKeyCode 6 = KC_5
+cintToKeyCode 7 = KC_6
+cintToKeyCode 8 = KC_7
+cintToKeyCode 9 = KC_8
+cintToKeyCode 10 = KC_9
+cintToKeyCode 11 = KC_0
+cintToKeyCode 12 = KC_MINUS
+cintToKeyCode 13 = KC_EQUALS
+cintToKeyCode 14 = KC_BACK
+cintToKeyCode 15 = KC_TAB
+cintToKeyCode 16 = KC_Q
+cintToKeyCode 17 = KC_W
+cintToKeyCode 18 = KC_E
+cintToKeyCode 19 = KC_R
+cintToKeyCode 20 = KC_T
+cintToKeyCode 21 = KC_Y
+cintToKeyCode 22 = KC_U
+cintToKeyCode 23 = KC_I
+cintToKeyCode 24 = KC_O
+cintToKeyCode 25 = KC_P
+cintToKeyCode 26 = KC_LBRACKET
+cintToKeyCode 27 = KC_RBRACKET
+cintToKeyCode 28 = KC_RETURN
+cintToKeyCode 29 = KC_LCONTROL
+cintToKeyCode 30 = KC_A
+cintToKeyCode 31 = KC_S
+cintToKeyCode 32 = KC_D
+cintToKeyCode 33 = KC_F
+cintToKeyCode 34 = KC_G
+cintToKeyCode 35 = KC_H
+cintToKeyCode 36 = KC_J
+cintToKeyCode 37 = KC_K
+cintToKeyCode 38 = KC_L
+cintToKeyCode 39 = KC_SEMICOLON
+cintToKeyCode 40 = KC_APOSTROPHE
+cintToKeyCode 41 = KC_GRAVE
+cintToKeyCode 42 = KC_LSHIFT
+cintToKeyCode 43 = KC_BACKSLASH
+cintToKeyCode 44 = KC_Z
+cintToKeyCode 45 = KC_X
+cintToKeyCode 46 = KC_C
+cintToKeyCode 47 = KC_V
+cintToKeyCode 48 = KC_B
+cintToKeyCode 49 = KC_N
+cintToKeyCode 50 = KC_M
+cintToKeyCode 51 = KC_COMMA
+cintToKeyCode 52 = KC_PERIOD
+cintToKeyCode 53 = KC_SLASH
+cintToKeyCode 54 = KC_RSHIFT
+cintToKeyCode 55 = KC_MULTIPLY
+cintToKeyCode 56 = KC_LMENU
+cintToKeyCode 57 = KC_SPACE
+cintToKeyCode 58 = KC_CAPITAL
+cintToKeyCode 59 = KC_F1
+cintToKeyCode 60 = KC_F2
+cintToKeyCode 61 = KC_F3
+cintToKeyCode 62 = KC_F4
+cintToKeyCode 63 = KC_F5
+cintToKeyCode 64 = KC_F6
+cintToKeyCode 65 = KC_F7
+cintToKeyCode 66 = KC_F8
+cintToKeyCode 67 = KC_F9
+cintToKeyCode 68 = KC_F10
+cintToKeyCode 69 = KC_NUMLOCK
+cintToKeyCode 70 = KC_SCROLL
+cintToKeyCode 71 = KC_NUMPAD7
+cintToKeyCode 72 = KC_NUMPAD8
+cintToKeyCode 73 = KC_NUMPAD9
+cintToKeyCode 74 = KC_SUBTRACT
+cintToKeyCode 75 = KC_NUMPAD4
+cintToKeyCode 76 = KC_NUMPAD5
+cintToKeyCode 77 = KC_NUMPAD6
+cintToKeyCode 78 = KC_ADD
+cintToKeyCode 79 = KC_NUMPAD1
+cintToKeyCode 80 = KC_NUMPAD2
+cintToKeyCode 81 = KC_NUMPAD3
+cintToKeyCode 82 = KC_NUMPAD0
+cintToKeyCode 83 = KC_DECIMAL
+cintToKeyCode 86 = KC_OEM_102
+cintToKeyCode 87 = KC_F11
+cintToKeyCode 88 = KC_F12
+cintToKeyCode 100 = KC_F13
+cintToKeyCode 101 = KC_F14
+cintToKeyCode 102 = KC_F15
+cintToKeyCode 112 = KC_KANA
+cintToKeyCode 115 = KC_ABNT_C1
+cintToKeyCode 121 = KC_CONVERT
+cintToKeyCode 123 = KC_NOCONVERT
+cintToKeyCode 125 = KC_YEN
+cintToKeyCode 126 = KC_ABNT_C2
+cintToKeyCode 141 = KC_NUMPADEQUALS
+cintToKeyCode 144 = KC_PREVTRACK
+cintToKeyCode 145 = KC_AT
+cintToKeyCode 146 = KC_COLON
+cintToKeyCode 147 = KC_UNDERLINE
+cintToKeyCode 148 = KC_KANJI
+cintToKeyCode 149 = KC_STOP
+cintToKeyCode 150 = KC_AX
+cintToKeyCode 151 = KC_UNLABELED
+cintToKeyCode 153 = KC_NEXTTRACK
+cintToKeyCode 156 = KC_NUMPADENTER
+cintToKeyCode 157 = KC_RCONTROL
+cintToKeyCode 160 = KC_MUTE
+cintToKeyCode 161 = KC_CALCULATOR
+cintToKeyCode 162 = KC_PLAYPAUSE
+cintToKeyCode 164 = KC_MEDIASTOP
+cintToKeyCode 174 = KC_VOLUMEDOWN
+cintToKeyCode 176 = KC_VOLUMEUP
+cintToKeyCode 178 = KC_WEBHOME
+cintToKeyCode 179 = KC_NUMPADCOMMA
+cintToKeyCode 181 = KC_DIVIDE
+cintToKeyCode 183 = KC_SYSRQ
+cintToKeyCode 184 = KC_RMENU
+cintToKeyCode 197 = KC_PAUSE
+cintToKeyCode 199 = KC_HOME
+cintToKeyCode 200 = KC_UP
+cintToKeyCode 201 = KC_PGUP
+cintToKeyCode 203 = KC_LEFT
+cintToKeyCode 205 = KC_RIGHT
+cintToKeyCode 207 = KC_END
+cintToKeyCode 208 = KC_DOWN
+cintToKeyCode 209 = KC_PGDOWN
+cintToKeyCode 210 = KC_INSERT
+cintToKeyCode 211 = KC_DELETE
+cintToKeyCode 219 = KC_LWIN
+cintToKeyCode 220 = KC_RWIN
+cintToKeyCode 221 = KC_APPS
+cintToKeyCode 222 = KC_POWER
+cintToKeyCode 223 = KC_SLEEP
+cintToKeyCode 227 = KC_WAKE
+cintToKeyCode 229 = KC_WEBSEARCH
+cintToKeyCode 230 = KC_WEBFAVORITES
+cintToKeyCode 231 = KC_WEBREFRESH
+cintToKeyCode 232 = KC_WEBSTOP
+cintToKeyCode 233 = KC_WEBFORWARD
+cintToKeyCode 234 = KC_WEBBACK
+cintToKeyCode 235 = KC_MYCOMPUTER
+cintToKeyCode 236 = KC_MAIL
+cintToKeyCode 237 = KC_MEDIASELECT
+cintToKeyCode n = error $ "cintToKeyCode: can not convert integer '" ++ show n ++ "' to KeyCode"
+
+newtype KeyEvent = KeyEvent (Ptr KeyEvent) -- nullary data type
+newtype KeyListener = KeyListener (Ptr KeyListener) -- nullary data type
+newtype Keyboard = Keyboard (Ptr Keyboard) -- nullary data type
+
+data Modifier = Shift | Ctrl | Alt
+
+modifierToCInt :: Modifier -> CInt
+modifierToCInt Shift = 1
+modifierToCInt Ctrl = 16
+modifierToCInt Alt = 256
+
+cintToModifier :: CInt -> Modifier
+cintToModifier 1 = Shift
+cintToModifier 16 = Ctrl
+cintToModifier 256 = Alt
+cintToModifier n = error $ "cintToModifier: can not convert integer '" ++ show n ++ "' to Modifier"
+
+
+data TextTranslationMode = Off | Unicode | Ascii
+
+textTranslationModeToCInt :: TextTranslationMode -> CInt
+textTranslationModeToCInt Off = 0
+textTranslationModeToCInt Unicode = 1
+textTranslationModeToCInt Ascii = 2
+
+cintToTextTranslationMode :: CInt -> TextTranslationMode
+cintToTextTranslationMode 0 = Off
+cintToTextTranslationMode 1 = Unicode
+cintToTextTranslationMode 2 = Ascii
+cintToTextTranslationMode n = error $ "cintToTextTranslationMode: can not convert integer '" ++ show n ++ "' to TextTranslationMode"
+
+newtype Mouse = Mouse (Ptr Mouse) -- nullary data type
+
+data MouseButtonID = MB_Left | MB_Right | MB_Middle | MB_Button3 | MB_Button4 | MB_Button5 | MB_Button6 | MB_Button7
+
+mouseButtonIDToCInt :: MouseButtonID -> CInt
+mouseButtonIDToCInt MB_Left = 0
+mouseButtonIDToCInt MB_Right = 1
+mouseButtonIDToCInt MB_Middle = 2
+mouseButtonIDToCInt MB_Button3 = 3
+mouseButtonIDToCInt MB_Button4 = 4
+mouseButtonIDToCInt MB_Button5 = 5
+mouseButtonIDToCInt MB_Button6 = 6
+mouseButtonIDToCInt MB_Button7 = 7
+
+cintToMouseButtonID :: CInt -> MouseButtonID
+cintToMouseButtonID 0 = MB_Left
+cintToMouseButtonID 1 = MB_Right
+cintToMouseButtonID 2 = MB_Middle
+cintToMouseButtonID 3 = MB_Button3
+cintToMouseButtonID 4 = MB_Button4
+cintToMouseButtonID 5 = MB_Button5
+cintToMouseButtonID 6 = MB_Button6
+cintToMouseButtonID 7 = MB_Button7
+cintToMouseButtonID n = error $ "cintToMouseButtonID: can not convert integer '" ++ show n ++ "' to MouseButtonID"
+
+newtype MouseEvent = MouseEvent (Ptr MouseEvent) -- nullary data type
+newtype MouseListener = MouseListener (Ptr MouseListener) -- nullary data type
+newtype MouseState = MouseState (Ptr MouseState) -- nullary data type
+newtype MultiTouch = MultiTouch (Ptr MultiTouch) -- nullary data type
+newtype MultiTouchEvent = MultiTouchEvent (Ptr MultiTouchEvent) -- nullary data type
+newtype MultiTouchListener = MultiTouchListener (Ptr MultiTouchListener) -- nullary data type
+newtype MultiTouchState = MultiTouchState (Ptr MultiTouchState) -- nullary data type
+
+data MultiTypeEventTypeID = MT_None | MT_Pressed | MT_Released | MT_Moved | MT_Cancelled
+
+multiTypeEventTypeIDToCInt :: MultiTypeEventTypeID -> CInt
+multiTypeEventTypeIDToCInt MT_None = 0
+multiTypeEventTypeIDToCInt MT_Pressed = 1
+multiTypeEventTypeIDToCInt MT_Released = 2
+multiTypeEventTypeIDToCInt MT_Moved = 3
+multiTypeEventTypeIDToCInt MT_Cancelled = 4
+
+cintToMultiTypeEventTypeID :: CInt -> MultiTypeEventTypeID
+cintToMultiTypeEventTypeID 0 = MT_None
+cintToMultiTypeEventTypeID 1 = MT_Pressed
+cintToMultiTypeEventTypeID 2 = MT_Released
+cintToMultiTypeEventTypeID 3 = MT_Moved
+cintToMultiTypeEventTypeID 4 = MT_Cancelled
+cintToMultiTypeEventTypeID n = error $ "cintToMultiTypeEventTypeID: can not convert integer '" ++ show n ++ "' to MultiTypeEventTypeID"
+
+newtype Object = Object (Ptr Object) -- nullary data type
+newtype ParamList = ParamList (Ptr ParamList) -- nullary data type
+newtype Pov = Pov (Ptr Pov) -- nullary data type
+newtype Slider = Slider (Ptr Slider) -- nullary data type
+
+data Type = OISUnknown | OISKeyboard | OISMouse | OISJoyStick | OISTablet | OISMultiTouch
+
+typeToCInt :: Type -> CInt
+typeToCInt OISUnknown = 0
+typeToCInt OISKeyboard = 1
+typeToCInt OISMouse = 2
+typeToCInt OISJoyStick = 3
+typeToCInt OISTablet = 4
+typeToCInt OISMultiTouch = 5
+
+cintToType :: CInt -> Type
+cintToType 0 = OISUnknown
+cintToType 1 = OISKeyboard
+cintToType 2 = OISMouse
+cintToType 3 = OISJoyStick
+cintToType 4 = OISTablet
+cintToType 5 = OISMultiTouch
+cintToType n = error $ "cintToType: can not convert integer '" ++ show n ++ "' to Type"
+
+newtype Vector3 = Vector3 (Ptr Vector3) -- nullary data type
+newtype Void = Void (Ptr Void) -- nullary data type
+
+class CComponent a where
+  toComponent :: a -> Component
+
+instance CComponent Button where
+  toComponent (Button p) = Component (castPtr p)
+
+instance CComponent Axis where
+  toComponent (Axis p) = Component (castPtr p)
+
+instance CComponent Vector3 where
+  toComponent (Vector3 p) = Component (castPtr p)
+
+instance CComponent Pov where
+  toComponent (Pov p) = Component (castPtr p)
+
+instance CComponent Slider where
+  toComponent (Slider p) = Component (castPtr p)
+
+class CEventArg a where
+  toEventArg :: a -> EventArg
+
+instance CEventArg MouseEvent where
+  toEventArg (MouseEvent p) = EventArg (castPtr p)
+
+instance CEventArg JoyStickEvent where
+  toEventArg (JoyStickEvent p) = EventArg (castPtr p)
+
+instance CEventArg MultiTouchEvent where
+  toEventArg (MultiTouchEvent p) = EventArg (castPtr p)
+
+instance CEventArg KeyEvent where
+  toEventArg (KeyEvent p) = EventArg (castPtr p)
+
+class CObject a where
+  toObject :: a -> Object
+
+instance CObject Mouse where
+  toObject (Mouse p) = Object (castPtr p)
+
+instance CObject JoyStick where
+  toObject (JoyStick p) = Object (castPtr p)
+
+instance CObject MultiTouch where
+  toObject (MultiTouch p) = Object (castPtr p)
+
+instance CObject Keyboard where
+  toObject (Keyboard p) = Object (castPtr p)
+
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/cbits/OISEvents.cpp b/cbits/OISEvents.cpp
new file mode 100644
--- /dev/null
+++ b/cbits/OISEvents.cpp
@@ -0,0 +1,12 @@
+#define CGEN_OUTPUT_INTERN
+#include "OISEvents.h"
+EventArg* OIS_EventArg_new(Object* obj)
+{
+    return new EventArg(obj);
+}
+
+void OIS_EventArg_delete(EventArg* this_ptr)
+{
+    delete this_ptr;
+}
+
diff --git a/cbits/OISEvents.h b/cbits/OISEvents.h
new file mode 100644
--- /dev/null
+++ b/cbits/OISEvents.h
@@ -0,0 +1,22 @@
+#ifndef CGEN_OISEVENTS_H
+#define CGEN_OISEVENTS_H
+
+#include <OIS/OIS.h>
+
+extern "C"
+{
+
+using namespace OIS;
+
+
+
+#ifdef CGEN_HS
+#endif
+
+EventArg* OIS_EventArg_new(Object* obj);
+void OIS_EventArg_delete(EventArg* this_ptr);
+
+}
+
+#endif
+
diff --git a/cbits/OISFactoryCreator.cpp b/cbits/OISFactoryCreator.cpp
new file mode 100644
--- /dev/null
+++ b/cbits/OISFactoryCreator.cpp
@@ -0,0 +1,32 @@
+#define CGEN_OUTPUT_INTERN
+#include "OISFactoryCreator.h"
+void OIS_FactoryCreator_delete(FactoryCreator* this_ptr)
+{
+    delete this_ptr;
+}
+
+DeviceList OIS_FactoryCreator_freeDeviceList(FactoryCreator* this_ptr)
+{
+    return this_ptr->freeDeviceList();
+}
+
+int OIS_FactoryCreator_totalDevices(FactoryCreator* this_ptr, Type iType)
+{
+    return this_ptr->totalDevices(iType);
+}
+
+int OIS_FactoryCreator_freeDevices(FactoryCreator* this_ptr, Type iType)
+{
+    return this_ptr->freeDevices(iType);
+}
+
+Object* OIS_FactoryCreator_createObject(FactoryCreator* this_ptr, InputManager* creator, Type iType, bool bufferMode, const char* vendor)
+{
+    return this_ptr->createObject(creator, iType, bufferMode, vendor);
+}
+
+void OIS_FactoryCreator_destroyObject(FactoryCreator* this_ptr, Object* obj)
+{
+    this_ptr->destroyObject(obj);
+}
+
diff --git a/cbits/OISFactoryCreator.h b/cbits/OISFactoryCreator.h
new file mode 100644
--- /dev/null
+++ b/cbits/OISFactoryCreator.h
@@ -0,0 +1,26 @@
+#ifndef CGEN_OISFACTORYCREATOR_H
+#define CGEN_OISFACTORYCREATOR_H
+
+#include <OIS/OIS.h>
+
+extern "C"
+{
+
+using namespace OIS;
+
+
+
+#ifdef CGEN_HS
+#endif
+
+void OIS_FactoryCreator_delete(FactoryCreator* this_ptr);
+DeviceList OIS_FactoryCreator_freeDeviceList(FactoryCreator* this_ptr);
+int OIS_FactoryCreator_totalDevices(FactoryCreator* this_ptr, Type iType);
+int OIS_FactoryCreator_freeDevices(FactoryCreator* this_ptr, Type iType);
+Object* OIS_FactoryCreator_createObject(FactoryCreator* this_ptr, InputManager* creator, Type iType, bool bufferMode, const char* vendor);
+void OIS_FactoryCreator_destroyObject(FactoryCreator* this_ptr, Object* obj);
+
+}
+
+#endif
+
diff --git a/cbits/OISInputManager.cpp b/cbits/OISInputManager.cpp
new file mode 100644
--- /dev/null
+++ b/cbits/OISInputManager.cpp
@@ -0,0 +1,57 @@
+#define CGEN_OUTPUT_INTERN
+#include "OISInputManager.h"
+unsigned int OIS_InputManager_getVersionNumber()
+{
+    return InputManager::getVersionNumber();
+}
+
+InputManager* OIS_InputManager_createInputSystem_size_t(size_t winHandle)
+{
+    return InputManager::createInputSystem(winHandle);
+}
+
+InputManager* OIS_InputManager_createInputSystem(ParamList* paramList)
+{
+    return InputManager::createInputSystem(*paramList);
+}
+
+void OIS_InputManager_destroyInputSystem(InputManager* manager)
+{
+    InputManager::destroyInputSystem(manager);
+}
+
+int OIS_InputManager_getNumberOfDevices(InputManager* this_ptr, Type iType)
+{
+    return this_ptr->getNumberOfDevices(iType);
+}
+
+DeviceList OIS_InputManager_listFreeDevices(InputManager* this_ptr)
+{
+    return this_ptr->listFreeDevices();
+}
+
+Object* OIS_InputManager_createInputObject(InputManager* this_ptr, Type iType, bool bufferMode, const char* vendor)
+{
+    return this_ptr->createInputObject(iType, bufferMode, vendor);
+}
+
+void OIS_InputManager_destroyInputObject(InputManager* this_ptr, Object* obj)
+{
+    this_ptr->destroyInputObject(obj);
+}
+
+void OIS_InputManager_addFactoryCreator(InputManager* this_ptr, FactoryCreator* factory)
+{
+    this_ptr->addFactoryCreator(factory);
+}
+
+void OIS_InputManager_removeFactoryCreator(InputManager* this_ptr, FactoryCreator* factory)
+{
+    this_ptr->removeFactoryCreator(factory);
+}
+
+void OIS_InputManager_enableAddOnFactory(InputManager* this_ptr, InputManager::AddOnFactories factory)
+{
+    this_ptr->enableAddOnFactory(factory);
+}
+
diff --git a/cbits/OISInputManager.h b/cbits/OISInputManager.h
new file mode 100644
--- /dev/null
+++ b/cbits/OISInputManager.h
@@ -0,0 +1,38 @@
+#ifndef CGEN_OISINPUTMANAGER_H
+#define CGEN_OISINPUTMANAGER_H
+
+#include <OIS/OIS.h>
+
+extern "C"
+{
+
+using namespace OIS;
+
+
+
+#ifdef CGEN_HS
+enum AddOnFactories {
+    AddOn_All = 0,
+    AddOn_LIRC = 1,
+    AddOn_WiiMote = 2
+};
+
+
+#endif
+
+unsigned int OIS_InputManager_getVersionNumber();
+InputManager* OIS_InputManager_createInputSystem_size_t(size_t winHandle);
+InputManager* OIS_InputManager_createInputSystem(ParamList* paramList);
+void OIS_InputManager_destroyInputSystem(InputManager* manager);
+int OIS_InputManager_getNumberOfDevices(InputManager* this_ptr, Type iType);
+DeviceList OIS_InputManager_listFreeDevices(InputManager* this_ptr);
+Object* OIS_InputManager_createInputObject(InputManager* this_ptr, Type iType, bool bufferMode, const char* vendor);
+void OIS_InputManager_destroyInputObject(InputManager* this_ptr, Object* obj);
+void OIS_InputManager_addFactoryCreator(InputManager* this_ptr, FactoryCreator* factory);
+void OIS_InputManager_removeFactoryCreator(InputManager* this_ptr, FactoryCreator* factory);
+void OIS_InputManager_enableAddOnFactory(InputManager* this_ptr, InputManager::AddOnFactories factory);
+
+}
+
+#endif
+
diff --git a/cbits/OISInterface.cpp b/cbits/OISInterface.cpp
new file mode 100644
--- /dev/null
+++ b/cbits/OISInterface.cpp
@@ -0,0 +1,12 @@
+#define CGEN_OUTPUT_INTERN
+#include "OISInterface.h"
+Interface* OIS_Interface_new()
+{
+    return new Interface();
+}
+
+void OIS_Interface_delete(Interface* this_ptr)
+{
+    delete this_ptr;
+}
+
diff --git a/cbits/OISInterface.h b/cbits/OISInterface.h
new file mode 100644
--- /dev/null
+++ b/cbits/OISInterface.h
@@ -0,0 +1,28 @@
+#ifndef CGEN_OISINTERFACE_H
+#define CGEN_OISINTERFACE_H
+
+#include <OIS/OIS.h>
+
+extern "C"
+{
+
+using namespace OIS;
+
+
+
+#ifdef CGEN_HS
+enum IType {
+    ForceFeedback = 0,
+    Reserved = 1
+};
+
+
+#endif
+
+Interface* OIS_Interface_new();
+void OIS_Interface_delete(Interface* this_ptr);
+
+}
+
+#endif
+
diff --git a/cbits/OISJoyStick.cpp b/cbits/OISJoyStick.cpp
new file mode 100644
--- /dev/null
+++ b/cbits/OISJoyStick.cpp
@@ -0,0 +1,112 @@
+#define CGEN_OUTPUT_INTERN
+#include "OISJoyStick.h"
+void OIS_Pov_delete(Pov* this_ptr)
+{
+    delete this_ptr;
+}
+
+void OIS_Slider_delete(Slider* this_ptr)
+{
+    delete this_ptr;
+}
+
+void OIS_JoyStickState_delete(JoyStickState* this_ptr)
+{
+    delete this_ptr;
+}
+
+Pov* OIS_Pov_new()
+{
+    return new Pov();
+}
+
+Slider* OIS_Slider_new()
+{
+    return new Slider();
+}
+
+JoyStickState* OIS_JoyStickState_new()
+{
+    return new JoyStickState();
+}
+
+void OIS_JoyStickState_clear(JoyStickState* this_ptr)
+{
+    this_ptr->clear();
+}
+
+JoyStickEvent* OIS_JoyStickEvent_new(Object* obj, const JoyStickState* st)
+{
+    return new JoyStickEvent(obj, *st);
+}
+
+void OIS_JoyStickEvent_delete(JoyStickEvent* this_ptr)
+{
+    delete this_ptr;
+}
+
+void OIS_JoyStickListener_delete(JoyStickListener* this_ptr)
+{
+    delete this_ptr;
+}
+
+bool OIS_JoyStickListener_buttonPressed(JoyStickListener* this_ptr, const JoyStickEvent* arg, int button)
+{
+    return this_ptr->buttonPressed(*arg, button);
+}
+
+bool OIS_JoyStickListener_buttonReleased(JoyStickListener* this_ptr, const JoyStickEvent* arg, int button)
+{
+    return this_ptr->buttonReleased(*arg, button);
+}
+
+bool OIS_JoyStickListener_axisMoved(JoyStickListener* this_ptr, const JoyStickEvent* arg, int axis)
+{
+    return this_ptr->axisMoved(*arg, axis);
+}
+
+bool OIS_JoyStickListener_povMoved(JoyStickListener* this_ptr, const JoyStickEvent* arg, int index)
+{
+    return this_ptr->povMoved(*arg, index);
+}
+
+bool OIS_JoyStickListener_vector3Moved(JoyStickListener* this_ptr, const JoyStickEvent* arg, int index)
+{
+    return this_ptr->vector3Moved(*arg, index);
+}
+
+void OIS_JoyStick_delete(JoyStick* this_ptr)
+{
+    delete this_ptr;
+}
+
+int OIS_JoyStick_getNumberOfComponents(const JoyStick* this_ptr, ComponentType cType)
+{
+    return this_ptr->getNumberOfComponents(cType);
+}
+
+void OIS_JoyStick_setVector3Sensitivity(JoyStick* this_ptr, float degrees)
+{
+    this_ptr->setVector3Sensitivity(degrees);
+}
+
+float OIS_JoyStick_getVector3Sensitivity(const JoyStick* this_ptr)
+{
+    return this_ptr->getVector3Sensitivity();
+}
+
+void OIS_JoyStick_setEventCallback(JoyStick* this_ptr, JoyStickListener* joyListener)
+{
+    this_ptr->setEventCallback(joyListener);
+}
+
+const JoyStickListener* OIS_JoyStick_getEventCallback(const JoyStick* this_ptr)
+{
+    return this_ptr->getEventCallback();
+}
+
+const JoyStickState* OIS_JoyStick_getJoyStickState(const JoyStick* this_ptr)
+{
+    return &this_ptr->getJoyStickState();
+}
+
diff --git a/cbits/OISJoyStick.h b/cbits/OISJoyStick.h
new file mode 100644
--- /dev/null
+++ b/cbits/OISJoyStick.h
@@ -0,0 +1,42 @@
+#ifndef CGEN_OISJOYSTICK_H
+#define CGEN_OISJOYSTICK_H
+
+#include <OIS/OIS.h>
+
+extern "C"
+{
+
+using namespace OIS;
+
+
+
+#ifdef CGEN_HS
+#endif
+
+void OIS_Pov_delete(Pov* this_ptr);
+void OIS_Slider_delete(Slider* this_ptr);
+void OIS_JoyStickState_delete(JoyStickState* this_ptr);
+Pov* OIS_Pov_new();
+Slider* OIS_Slider_new();
+JoyStickState* OIS_JoyStickState_new();
+void OIS_JoyStickState_clear(JoyStickState* this_ptr);
+JoyStickEvent* OIS_JoyStickEvent_new(Object* obj, const JoyStickState* st);
+void OIS_JoyStickEvent_delete(JoyStickEvent* this_ptr);
+void OIS_JoyStickListener_delete(JoyStickListener* this_ptr);
+bool OIS_JoyStickListener_buttonPressed(JoyStickListener* this_ptr, const JoyStickEvent* arg, int button);
+bool OIS_JoyStickListener_buttonReleased(JoyStickListener* this_ptr, const JoyStickEvent* arg, int button);
+bool OIS_JoyStickListener_axisMoved(JoyStickListener* this_ptr, const JoyStickEvent* arg, int axis);
+bool OIS_JoyStickListener_povMoved(JoyStickListener* this_ptr, const JoyStickEvent* arg, int index);
+bool OIS_JoyStickListener_vector3Moved(JoyStickListener* this_ptr, const JoyStickEvent* arg, int index);
+void OIS_JoyStick_delete(JoyStick* this_ptr);
+int OIS_JoyStick_getNumberOfComponents(const JoyStick* this_ptr, ComponentType cType);
+void OIS_JoyStick_setVector3Sensitivity(JoyStick* this_ptr, float degrees);
+float OIS_JoyStick_getVector3Sensitivity(const JoyStick* this_ptr);
+void OIS_JoyStick_setEventCallback(JoyStick* this_ptr, JoyStickListener* joyListener);
+const JoyStickListener* OIS_JoyStick_getEventCallback(const JoyStick* this_ptr);
+const JoyStickState* OIS_JoyStick_getJoyStickState(const JoyStick* this_ptr);
+
+}
+
+#endif
+
diff --git a/cbits/OISKeyboard.cpp b/cbits/OISKeyboard.cpp
new file mode 100644
--- /dev/null
+++ b/cbits/OISKeyboard.cpp
@@ -0,0 +1,62 @@
+#define CGEN_OUTPUT_INTERN
+#include "OISKeyboard.h"
+KeyEvent* OIS_KeyEvent_new(Object* obj, KeyCode kc, unsigned int txt)
+{
+    return new KeyEvent(obj, kc, txt);
+}
+
+void OIS_KeyEvent_delete(KeyEvent* this_ptr)
+{
+    delete this_ptr;
+}
+
+void OIS_KeyListener_delete(KeyListener* this_ptr)
+{
+    delete this_ptr;
+}
+
+bool OIS_KeyListener_keyPressed(KeyListener* this_ptr, const KeyEvent* arg)
+{
+    return this_ptr->keyPressed(*arg);
+}
+
+bool OIS_KeyListener_keyReleased(KeyListener* this_ptr, const KeyEvent* arg)
+{
+    return this_ptr->keyReleased(*arg);
+}
+
+void OIS_Keyboard_delete(Keyboard* this_ptr)
+{
+    delete this_ptr;
+}
+
+bool OIS_Keyboard_isKeyDown(const Keyboard* this_ptr, KeyCode key)
+{
+    return this_ptr->isKeyDown(key);
+}
+
+void OIS_Keyboard_setEventCallback(Keyboard* this_ptr, KeyListener* keyListener)
+{
+    this_ptr->setEventCallback(keyListener);
+}
+
+const KeyListener* OIS_Keyboard_getEventCallback(const Keyboard* this_ptr)
+{
+    return this_ptr->getEventCallback();
+}
+
+void OIS_Keyboard_setTextTranslation(Keyboard* this_ptr, Keyboard::TextTranslationMode mode)
+{
+    this_ptr->setTextTranslation(mode);
+}
+
+Keyboard::TextTranslationMode OIS_Keyboard_getTextTranslation(const Keyboard* this_ptr)
+{
+    return this_ptr->getTextTranslation();
+}
+
+bool OIS_Keyboard_isModifierDown(const Keyboard* this_ptr, Keyboard::Modifier mod)
+{
+    return this_ptr->isModifierDown(mod);
+}
+
diff --git a/cbits/OISKeyboard.h b/cbits/OISKeyboard.h
new file mode 100644
--- /dev/null
+++ b/cbits/OISKeyboard.h
@@ -0,0 +1,195 @@
+#ifndef CGEN_OISKEYBOARD_H
+#define CGEN_OISKEYBOARD_H
+
+#include <OIS/OIS.h>
+
+extern "C"
+{
+
+using namespace OIS;
+
+
+
+#ifdef CGEN_HS
+enum KeyCode {
+    KC_UNASSIGNED = 0,
+    KC_ESCAPE = 1,
+    KC_1 = 2,
+    KC_2 = 3,
+    KC_3 = 4,
+    KC_4 = 5,
+    KC_5 = 6,
+    KC_6 = 7,
+    KC_7 = 8,
+    KC_8 = 9,
+    KC_9 = 10,
+    KC_0 = 11,
+    KC_MINUS = 12,
+    KC_EQUALS = 13,
+    KC_BACK = 14,
+    KC_TAB = 15,
+    KC_Q = 16,
+    KC_W = 17,
+    KC_E = 18,
+    KC_R = 19,
+    KC_T = 20,
+    KC_Y = 21,
+    KC_U = 22,
+    KC_I = 23,
+    KC_O = 24,
+    KC_P = 25,
+    KC_LBRACKET = 26,
+    KC_RBRACKET = 27,
+    KC_RETURN = 28,
+    KC_LCONTROL = 29,
+    KC_A = 30,
+    KC_S = 31,
+    KC_D = 32,
+    KC_F = 33,
+    KC_G = 34,
+    KC_H = 35,
+    KC_J = 36,
+    KC_K = 37,
+    KC_L = 38,
+    KC_SEMICOLON = 39,
+    KC_APOSTROPHE = 40,
+    KC_GRAVE = 41,
+    KC_LSHIFT = 42,
+    KC_BACKSLASH = 43,
+    KC_Z = 44,
+    KC_X = 45,
+    KC_C = 46,
+    KC_V = 47,
+    KC_B = 48,
+    KC_N = 49,
+    KC_M = 50,
+    KC_COMMA = 51,
+    KC_PERIOD = 52,
+    KC_SLASH = 53,
+    KC_RSHIFT = 54,
+    KC_MULTIPLY = 55,
+    KC_LMENU = 56,
+    KC_SPACE = 57,
+    KC_CAPITAL = 58,
+    KC_F1 = 59,
+    KC_F2 = 60,
+    KC_F3 = 61,
+    KC_F4 = 62,
+    KC_F5 = 63,
+    KC_F6 = 64,
+    KC_F7 = 65,
+    KC_F8 = 66,
+    KC_F9 = 67,
+    KC_F10 = 68,
+    KC_NUMLOCK = 69,
+    KC_SCROLL = 70,
+    KC_NUMPAD7 = 71,
+    KC_NUMPAD8 = 72,
+    KC_NUMPAD9 = 73,
+    KC_SUBTRACT = 74,
+    KC_NUMPAD4 = 75,
+    KC_NUMPAD5 = 76,
+    KC_NUMPAD6 = 77,
+    KC_ADD = 78,
+    KC_NUMPAD1 = 79,
+    KC_NUMPAD2 = 80,
+    KC_NUMPAD3 = 81,
+    KC_NUMPAD0 = 82,
+    KC_DECIMAL = 83,
+    KC_OEM_102 = 86,
+    KC_F11 = 87,
+    KC_F12 = 88,
+    KC_F13 = 100,
+    KC_F14 = 101,
+    KC_F15 = 102,
+    KC_KANA = 112,
+    KC_ABNT_C1 = 115,
+    KC_CONVERT = 121,
+    KC_NOCONVERT = 123,
+    KC_YEN = 125,
+    KC_ABNT_C2 = 126,
+    KC_NUMPADEQUALS = 141,
+    KC_PREVTRACK = 144,
+    KC_AT = 145,
+    KC_COLON = 146,
+    KC_UNDERLINE = 147,
+    KC_KANJI = 148,
+    KC_STOP = 149,
+    KC_AX = 150,
+    KC_UNLABELED = 151,
+    KC_NEXTTRACK = 153,
+    KC_NUMPADENTER = 156,
+    KC_RCONTROL = 157,
+    KC_MUTE = 160,
+    KC_CALCULATOR = 161,
+    KC_PLAYPAUSE = 162,
+    KC_MEDIASTOP = 164,
+    KC_VOLUMEDOWN = 174,
+    KC_VOLUMEUP = 176,
+    KC_WEBHOME = 178,
+    KC_NUMPADCOMMA = 179,
+    KC_DIVIDE = 181,
+    KC_SYSRQ = 183,
+    KC_RMENU = 184,
+    KC_PAUSE = 197,
+    KC_HOME = 199,
+    KC_UP = 200,
+    KC_PGUP = 201,
+    KC_LEFT = 203,
+    KC_RIGHT = 205,
+    KC_END = 207,
+    KC_DOWN = 208,
+    KC_PGDOWN = 209,
+    KC_INSERT = 210,
+    KC_DELETE = 211,
+    KC_LWIN = 219,
+    KC_RWIN = 220,
+    KC_APPS = 221,
+    KC_POWER = 222,
+    KC_SLEEP = 223,
+    KC_WAKE = 227,
+    KC_WEBSEARCH = 229,
+    KC_WEBFAVORITES = 230,
+    KC_WEBREFRESH = 231,
+    KC_WEBSTOP = 232,
+    KC_WEBFORWARD = 233,
+    KC_WEBBACK = 234,
+    KC_MYCOMPUTER = 235,
+    KC_MAIL = 236,
+    KC_MEDIASELECT = 237
+};
+
+
+enum TextTranslationMode {
+    Off = 0,
+    Unicode = 1,
+    Ascii = 2
+};
+
+
+enum Modifier {
+    Shift = 1,
+    Ctrl = 16,
+    Alt = 256
+};
+
+
+#endif
+
+KeyEvent* OIS_KeyEvent_new(Object* obj, KeyCode kc, unsigned int txt);
+void OIS_KeyEvent_delete(KeyEvent* this_ptr);
+void OIS_KeyListener_delete(KeyListener* this_ptr);
+bool OIS_KeyListener_keyPressed(KeyListener* this_ptr, const KeyEvent* arg);
+bool OIS_KeyListener_keyReleased(KeyListener* this_ptr, const KeyEvent* arg);
+void OIS_Keyboard_delete(Keyboard* this_ptr);
+bool OIS_Keyboard_isKeyDown(const Keyboard* this_ptr, KeyCode key);
+void OIS_Keyboard_setEventCallback(Keyboard* this_ptr, KeyListener* keyListener);
+const KeyListener* OIS_Keyboard_getEventCallback(const Keyboard* this_ptr);
+void OIS_Keyboard_setTextTranslation(Keyboard* this_ptr, Keyboard::TextTranslationMode mode);
+Keyboard::TextTranslationMode OIS_Keyboard_getTextTranslation(const Keyboard* this_ptr);
+bool OIS_Keyboard_isModifierDown(const Keyboard* this_ptr, Keyboard::Modifier mod);
+
+}
+
+#endif
+
diff --git a/cbits/OISMouse.cpp b/cbits/OISMouse.cpp
new file mode 100644
--- /dev/null
+++ b/cbits/OISMouse.cpp
@@ -0,0 +1,72 @@
+#define CGEN_OUTPUT_INTERN
+#include "OISMouse.h"
+void OIS_MouseState_delete(MouseState* this_ptr)
+{
+    delete this_ptr;
+}
+
+MouseState* OIS_MouseState_new()
+{
+    return new MouseState();
+}
+
+bool OIS_MouseState_buttonDown(const MouseState* this_ptr, MouseButtonID button)
+{
+    return this_ptr->buttonDown(button);
+}
+
+void OIS_MouseState_clear(MouseState* this_ptr)
+{
+    this_ptr->clear();
+}
+
+MouseEvent* OIS_MouseEvent_new(Object* obj, const MouseState* ms)
+{
+    return new MouseEvent(obj, *ms);
+}
+
+void OIS_MouseEvent_delete(MouseEvent* this_ptr)
+{
+    delete this_ptr;
+}
+
+void OIS_MouseListener_delete(MouseListener* this_ptr)
+{
+    delete this_ptr;
+}
+
+bool OIS_MouseListener_mouseMoved(MouseListener* this_ptr, const MouseEvent* arg)
+{
+    return this_ptr->mouseMoved(*arg);
+}
+
+bool OIS_MouseListener_mousePressed(MouseListener* this_ptr, const MouseEvent* arg, MouseButtonID id)
+{
+    return this_ptr->mousePressed(*arg, id);
+}
+
+bool OIS_MouseListener_mouseReleased(MouseListener* this_ptr, const MouseEvent* arg, MouseButtonID id)
+{
+    return this_ptr->mouseReleased(*arg, id);
+}
+
+void OIS_Mouse_delete(Mouse* this_ptr)
+{
+    delete this_ptr;
+}
+
+void OIS_Mouse_setEventCallback(Mouse* this_ptr, MouseListener* mouseListener)
+{
+    this_ptr->setEventCallback(mouseListener);
+}
+
+const MouseListener* OIS_Mouse_getEventCallback(const Mouse* this_ptr)
+{
+    return this_ptr->getEventCallback();
+}
+
+const MouseState* OIS_Mouse_getMouseState(const Mouse* this_ptr)
+{
+    return &this_ptr->getMouseState();
+}
+
diff --git a/cbits/OISMouse.h b/cbits/OISMouse.h
new file mode 100644
--- /dev/null
+++ b/cbits/OISMouse.h
@@ -0,0 +1,46 @@
+#ifndef CGEN_OISMOUSE_H
+#define CGEN_OISMOUSE_H
+
+#include <OIS/OIS.h>
+
+extern "C"
+{
+
+using namespace OIS;
+
+
+
+#ifdef CGEN_HS
+enum MouseButtonID {
+    MB_Left = 0,
+    MB_Right = 1,
+    MB_Middle = 2,
+    MB_Button3 = 3,
+    MB_Button4 = 4,
+    MB_Button5 = 5,
+    MB_Button6 = 6,
+    MB_Button7 = 7
+};
+
+
+#endif
+
+void OIS_MouseState_delete(MouseState* this_ptr);
+MouseState* OIS_MouseState_new();
+bool OIS_MouseState_buttonDown(const MouseState* this_ptr, MouseButtonID button);
+void OIS_MouseState_clear(MouseState* this_ptr);
+MouseEvent* OIS_MouseEvent_new(Object* obj, const MouseState* ms);
+void OIS_MouseEvent_delete(MouseEvent* this_ptr);
+void OIS_MouseListener_delete(MouseListener* this_ptr);
+bool OIS_MouseListener_mouseMoved(MouseListener* this_ptr, const MouseEvent* arg);
+bool OIS_MouseListener_mousePressed(MouseListener* this_ptr, const MouseEvent* arg, MouseButtonID id);
+bool OIS_MouseListener_mouseReleased(MouseListener* this_ptr, const MouseEvent* arg, MouseButtonID id);
+void OIS_Mouse_delete(Mouse* this_ptr);
+void OIS_Mouse_setEventCallback(Mouse* this_ptr, MouseListener* mouseListener);
+const MouseListener* OIS_Mouse_getEventCallback(const Mouse* this_ptr);
+const MouseState* OIS_Mouse_getMouseState(const Mouse* this_ptr);
+
+}
+
+#endif
+
diff --git a/cbits/OISMultiTouch.cpp b/cbits/OISMultiTouch.cpp
new file mode 100644
--- /dev/null
+++ b/cbits/OISMultiTouch.cpp
@@ -0,0 +1,92 @@
+#define CGEN_OUTPUT_INTERN
+#include "OISMultiTouch.h"
+void OIS_MultiTouchState_delete(MultiTouchState* this_ptr)
+{
+    delete this_ptr;
+}
+
+MultiTouchState* OIS_MultiTouchState_new()
+{
+    return new MultiTouchState();
+}
+
+bool OIS_MultiTouchState_touchIsType(const MultiTouchState* this_ptr, MultiTypeEventTypeID touch)
+{
+    return this_ptr->touchIsType(touch);
+}
+
+void OIS_MultiTouchState_clear(MultiTouchState* this_ptr)
+{
+    this_ptr->clear();
+}
+
+MultiTouchEvent* OIS_MultiTouchEvent_new(Object* obj, const MultiTouchState* ms)
+{
+    return new MultiTouchEvent(obj, *ms);
+}
+
+void OIS_MultiTouchEvent_delete(MultiTouchEvent* this_ptr)
+{
+    delete this_ptr;
+}
+
+void OIS_MultiTouchListener_delete(MultiTouchListener* this_ptr)
+{
+    delete this_ptr;
+}
+
+bool OIS_MultiTouchListener_touchMoved(MultiTouchListener* this_ptr, const MultiTouchEvent* arg)
+{
+    return this_ptr->touchMoved(*arg);
+}
+
+bool OIS_MultiTouchListener_touchPressed(MultiTouchListener* this_ptr, const MultiTouchEvent* arg)
+{
+    return this_ptr->touchPressed(*arg);
+}
+
+bool OIS_MultiTouchListener_touchReleased(MultiTouchListener* this_ptr, const MultiTouchEvent* arg)
+{
+    return this_ptr->touchReleased(*arg);
+}
+
+bool OIS_MultiTouchListener_touchCancelled(MultiTouchListener* this_ptr, const MultiTouchEvent* arg)
+{
+    return this_ptr->touchCancelled(*arg);
+}
+
+void OIS_MultiTouch_delete(MultiTouch* this_ptr)
+{
+    delete this_ptr;
+}
+
+void OIS_MultiTouch_setEventCallback(MultiTouch* this_ptr, MultiTouchListener* touchListener)
+{
+    this_ptr->setEventCallback(touchListener);
+}
+
+MultiTouchListener* OIS_MultiTouch_getEventCallback(MultiTouch* this_ptr)
+{
+    return this_ptr->getEventCallback();
+}
+
+void OIS_MultiTouch_clearStates(MultiTouch* this_ptr)
+{
+    this_ptr->clearStates();
+}
+
+std::vector<MultiTouchState> OIS_MultiTouch_getMultiTouchStates(const MultiTouch* this_ptr)
+{
+    return this_ptr->getMultiTouchStates();
+}
+
+const std::vector<MultiTouchState> OIS_MultiTouch_getFirstNTouchStates(MultiTouch* this_ptr, int n)
+{
+    return this_ptr->getFirstNTouchStates(n);
+}
+
+const std::vector<MultiTouchState> OIS_MultiTouch_getMultiTouchStatesOfType(MultiTouch* this_ptr, MultiTypeEventTypeID type)
+{
+    return this_ptr->getMultiTouchStatesOfType(type);
+}
+
diff --git a/cbits/OISMultiTouch.h b/cbits/OISMultiTouch.h
new file mode 100644
--- /dev/null
+++ b/cbits/OISMultiTouch.h
@@ -0,0 +1,47 @@
+#ifndef CGEN_OISMULTITOUCH_H
+#define CGEN_OISMULTITOUCH_H
+
+#include <OIS/OIS.h>
+
+extern "C"
+{
+
+using namespace OIS;
+
+
+
+#ifdef CGEN_HS
+enum MultiTypeEventTypeID {
+    MT_None = 0,
+    MT_Pressed = 1,
+    MT_Released = 2,
+    MT_Moved = 3,
+    MT_Cancelled = 4
+};
+
+
+#endif
+
+void OIS_MultiTouchState_delete(MultiTouchState* this_ptr);
+MultiTouchState* OIS_MultiTouchState_new();
+bool OIS_MultiTouchState_touchIsType(const MultiTouchState* this_ptr, MultiTypeEventTypeID touch);
+void OIS_MultiTouchState_clear(MultiTouchState* this_ptr);
+MultiTouchEvent* OIS_MultiTouchEvent_new(Object* obj, const MultiTouchState* ms);
+void OIS_MultiTouchEvent_delete(MultiTouchEvent* this_ptr);
+void OIS_MultiTouchListener_delete(MultiTouchListener* this_ptr);
+bool OIS_MultiTouchListener_touchMoved(MultiTouchListener* this_ptr, const MultiTouchEvent* arg);
+bool OIS_MultiTouchListener_touchPressed(MultiTouchListener* this_ptr, const MultiTouchEvent* arg);
+bool OIS_MultiTouchListener_touchReleased(MultiTouchListener* this_ptr, const MultiTouchEvent* arg);
+bool OIS_MultiTouchListener_touchCancelled(MultiTouchListener* this_ptr, const MultiTouchEvent* arg);
+void OIS_MultiTouch_delete(MultiTouch* this_ptr);
+void OIS_MultiTouch_setEventCallback(MultiTouch* this_ptr, MultiTouchListener* touchListener);
+MultiTouchListener* OIS_MultiTouch_getEventCallback(MultiTouch* this_ptr);
+void OIS_MultiTouch_clearStates(MultiTouch* this_ptr);
+std::vector<MultiTouchState> OIS_MultiTouch_getMultiTouchStates(const MultiTouch* this_ptr);
+const std::vector<MultiTouchState> OIS_MultiTouch_getFirstNTouchStates(MultiTouch* this_ptr, int n);
+const std::vector<MultiTouchState> OIS_MultiTouch_getMultiTouchStatesOfType(MultiTouch* this_ptr, MultiTypeEventTypeID type);
+
+}
+
+#endif
+
diff --git a/cbits/OISObject.cpp b/cbits/OISObject.cpp
new file mode 100644
--- /dev/null
+++ b/cbits/OISObject.cpp
@@ -0,0 +1,47 @@
+#define CGEN_OUTPUT_INTERN
+#include "OISObject.h"
+void OIS_Object_delete(Object* this_ptr)
+{
+    delete this_ptr;
+}
+
+Type OIS_Object_type(const Object* this_ptr)
+{
+    return this_ptr->type();
+}
+
+bool OIS_Object_buffered(const Object* this_ptr)
+{
+    return this_ptr->buffered();
+}
+
+const InputManager* OIS_Object_getCreator(const Object* this_ptr)
+{
+    return this_ptr->getCreator();
+}
+
+void OIS_Object_setBuffered(Object* this_ptr, bool buffered)
+{
+    this_ptr->setBuffered(buffered);
+}
+
+void OIS_Object_capture(Object* this_ptr)
+{
+    this_ptr->capture();
+}
+
+int OIS_Object_getID(const Object* this_ptr)
+{
+    return this_ptr->getID();
+}
+
+Interface* OIS_Object_queryInterface(Object* this_ptr, Interface::IType type)
+{
+    return this_ptr->queryInterface(type);
+}
+
+void OIS_Object__initialize(Object* this_ptr)
+{
+    this_ptr->_initialize();
+}
+
diff --git a/cbits/OISObject.h b/cbits/OISObject.h
new file mode 100644
--- /dev/null
+++ b/cbits/OISObject.h
@@ -0,0 +1,29 @@
+#ifndef CGEN_OISOBJECT_H
+#define CGEN_OISOBJECT_H
+
+#include <OIS/OIS.h>
+
+extern "C"
+{
+
+using namespace OIS;
+
+
+
+#ifdef CGEN_HS
+#endif
+
+void OIS_Object_delete(Object* this_ptr);
+Type OIS_Object_type(const Object* this_ptr);
+bool OIS_Object_buffered(const Object* this_ptr);
+const InputManager* OIS_Object_getCreator(const Object* this_ptr);
+void OIS_Object_setBuffered(Object* this_ptr, bool buffered);
+void OIS_Object_capture(Object* this_ptr);
+int OIS_Object_getID(const Object* this_ptr);
+Interface* OIS_Object_queryInterface(Object* this_ptr, Interface::IType type);
+void OIS_Object__initialize(Object* this_ptr);
+
+}
+
+#endif
+
diff --git a/cbits/OISPrereqs.cpp b/cbits/OISPrereqs.cpp
new file mode 100644
--- /dev/null
+++ b/cbits/OISPrereqs.cpp
@@ -0,0 +1,67 @@
+#define CGEN_OUTPUT_INTERN
+#include "OISPrereqs.h"
+void OIS_Component_delete(Component* this_ptr)
+{
+    delete this_ptr;
+}
+
+void OIS_Button_delete(Button* this_ptr)
+{
+    delete this_ptr;
+}
+
+void OIS_Axis_delete(Axis* this_ptr)
+{
+    delete this_ptr;
+}
+
+void OIS_Vector3_delete(Vector3* this_ptr)
+{
+    delete this_ptr;
+}
+
+Component* OIS_Component_new_void()
+{
+    return new Component();
+}
+
+Component* OIS_Component_new(ComponentType type)
+{
+    return new Component(type);
+}
+
+Button* OIS_Button_new_void()
+{
+    return new Button();
+}
+
+Button* OIS_Button_new(bool bPushed)
+{
+    return new Button(bPushed);
+}
+
+Axis* OIS_Axis_new()
+{
+    return new Axis();
+}
+
+void OIS_Axis_clear(Axis* this_ptr)
+{
+    this_ptr->clear();
+}
+
+Vector3* OIS_Vector3_new_void()
+{
+    return new Vector3();
+}
+
+Vector3* OIS_Vector3_new(float _x, float _y, float _z)
+{
+    return new Vector3(_x, _y, _z);
+}
+
+void OIS_Vector3_clear(Vector3* this_ptr)
+{
+    this_ptr->clear();
+}
+
diff --git a/cbits/OISPrereqs.h b/cbits/OISPrereqs.h
new file mode 100644
--- /dev/null
+++ b/cbits/OISPrereqs.h
@@ -0,0 +1,53 @@
+#ifndef CGEN_OISPREREQS_H
+#define CGEN_OISPREREQS_H
+
+#include <OIS/OIS.h>
+
+extern "C"
+{
+
+using namespace OIS;
+
+
+
+#ifdef CGEN_HS
+enum Type {
+    OISUnknown = 0,
+    OISKeyboard = 1,
+    OISMouse = 2,
+    OISJoyStick = 3,
+    OISTablet = 4,
+    OISMultiTouch = 5
+};
+
+
+enum ComponentType {
+    OIS_Unknown = 0,
+    OIS_Button = 1,
+    OIS_Axis = 2,
+    OIS_Slider = 3,
+    OIS_POV = 4,
+    OIS_Vector3 = 5
+};
+
+
+#endif
+
+void OIS_Component_delete(Component* this_ptr);
+void OIS_Button_delete(Button* this_ptr);
+void OIS_Axis_delete(Axis* this_ptr);
+void OIS_Vector3_delete(Vector3* this_ptr);
+Component* OIS_Component_new_void();
+Component* OIS_Component_new(ComponentType type);
+Button* OIS_Button_new_void();
+Button* OIS_Button_new(bool bPushed);
+Axis* OIS_Axis_new();
+void OIS_Axis_clear(Axis* this_ptr);
+Vector3* OIS_Vector3_new_void();
+Vector3* OIS_Vector3_new(float _x, float _y, float _z);
+void OIS_Vector3_clear(Vector3* this_ptr);
+
+}
+
+#endif
+
diff --git a/examples/OISConsole.hs b/examples/OISConsole.hs
new file mode 100644
--- /dev/null
+++ b/examples/OISConsole.hs
@@ -0,0 +1,50 @@
+module Main
+where
+
+import Unsafe.Coerce
+
+import Control.Monad(when)
+import Control.Concurrent(threadDelay)
+import System.Environment(getEnv)
+
+import Graphics.X11.Xlib
+
+import OIS
+import OIS.Types
+
+main = do
+  displayname <- getEnv "DISPLAY"
+  xdisp <- openDisplay displayname -- TODO: check for null ptr
+  xwin <- createSimpleWindow xdisp (defaultRootWindow xdisp) 0 0 100 100 0 0 0
+  mapWindow xdisp xwin
+  selectInput xdisp xwin structureNotifyMask
+  allocaXEvent $ \ev -> do
+    let fn = do
+             nextEvent xdisp ev
+             et <- get_EventType ev
+             if et /= mapNotify 
+               then fn
+               else return ()
+    fn
+
+  let hwnd = fromIntegral xwin
+  im <- inputManager_createInputSystem_size_t hwnd
+  -- unsafeCoerce instead of static_cast
+  ms <- unsafeCoerce $ inputManager_createInputObject im OISMouse True ""
+  kb <- unsafeCoerce $ inputManager_createInputObject im OISKeyboard True ""
+  run ms kb
+
+run ms kb = do
+  threadDelay 50000
+  object_capture (toObject kb)
+  object_capture (toObject ms)
+
+  mstate <- mouse_getMouseState ms
+  bd <- mouseState_buttonDown mstate MB_Left
+  when bd $ putStrLn "Left mouse button is down"
+  
+  esc <- keyboard_isKeyDown kb KC_ESCAPE
+  if esc
+    then putStrLn "Escape pressed"
+    else run ms kb
+
diff --git a/hois.cabal b/hois.cabal
new file mode 100644
--- /dev/null
+++ b/hois.cabal
@@ -0,0 +1,92 @@
+name:                hois
+category:            GUI
+description:         Bindings to the OIS input system.
+
+version:             0.1.0.0
+synopsis:            OIS bindings
+-- description:         
+license:             BSD3
+license-file:        LICENSE
+author:              Antti Salonen and Greg Horn
+maintainer:          Greg Horn <gregmainland@gmail.com>
+-- copyright:           
+-- category:            
+build-type:          Simple
+cabal-version:       >=1.8
+
+extra-source-files:  interface/ois.gr
+                     interface/ois.hif
+                     interface/ois.if
+                     run_cgen.sh
+                     cbits/OISEvents.h
+                     cbits/OISFactoryCreator.h
+                     cbits/OISInputManager.h
+                     cbits/OISInterface.h
+                     cbits/OISJoyStick.h
+                     cbits/OISKeyboard.h
+                     cbits/OISMouse.h
+                     cbits/OISMultiTouch.h
+                     cbits/OISObject.h
+--                     OISForceFeedback.h
+                     cbits/OISPrereqs.h
+
+library
+  C-sources:         cbits/OISEvents.cpp
+                     cbits/OISFactoryCreator.cpp
+                     cbits/OISInputManager.cpp
+                     cbits/OISInterface.cpp
+                     cbits/OISJoyStick.cpp
+                     cbits/OISKeyboard.cpp
+                     cbits/OISMouse.cpp
+                     cbits/OISMultiTouch.cpp
+                     cbits/OISObject.cpp
+--                     OISForceFeedback.cpp
+                     cbits/OISPrereqs.cpp
+
+  extra-libraries: OIS
+
+--  Includes:          OISEvents.h
+--                     OISFactoryCreator.h
+--                     OISInputManager.h
+--                     OISInterface.h
+--                     OISJoyStick.h
+----                     OISKeyboard.h
+--                     OISMouse.h
+--                     OISMultiTouch.h
+--                     OISObject.h
+----                     OISForceFeedback.h,
+--                     OISPrereqs.h
+--
+--  Install-includes:  OISEvents.h
+--                     OISFactoryCreator.h
+--                     OISInputManager.h
+--                     OISInterface.h
+--                     OISJoyStick.h
+----                     OISKeyboard.h
+--                     OISMouse.h
+--                     OISMultiTouch.h
+--                     OISObject.h
+----                     OISForceFeedback.h,
+--                     OISPrereqs.h
+
+  exposed-modules:     OIS,
+                       OIS.OISMultiTouch,
+                       OIS.OISFactoryCreator,
+                       OIS.OISKeyboard,
+                       OIS.Types,
+                       OIS.OISInputManager,
+                       OIS.OISObject,
+                       OIS.OISJoyStick,
+                       OIS.OISMouse,
+                       OIS.OISEvents,
+--                       OIS.OISForceFeedback,
+                       OIS.OISPrereqs,
+                       OIS.OISInterface
+--  ghc-options: -pgml g++
+  build-depends:       base ==4.5.*
+
+
+executable OISConsole
+  build-depends: hois, base == 4.5.*, X11 >= 1.5 && < 1.7
+  main-is: examples/OISConsole.hs
+--  extra-libraries: stdc++
diff --git a/interface/ois.gr b/interface/ois.gr
new file mode 100644
--- /dev/null
+++ b/interface/ois.gr
@@ -0,0 +1,26 @@
+Component|
+Button|Component
+Axis|Component
+Vector3|Component
+Object|
+MouseState|
+MouseEvent|EventArg
+MouseListener|
+Mouse|Object
+Pov|Component
+Slider|Component
+JoyStickState|
+JoyStickEvent|EventArg
+JoyStickListener|
+JoyStick|Object
+MultiTouchState|
+MultiTouchEvent|EventArg
+MultiTouchListener|
+MultiTouch|Object
+InputManager|
+FactoryCreator|
+EventArg|
+Interface|
+KeyEvent|EventArg
+KeyListener|
+Keyboard|Object
diff --git a/interface/ois.hif b/interface/ois.hif
new file mode 100644
--- /dev/null
+++ b/interface/ois.hif
@@ -0,0 +1,3 @@
+@default-in
+char*
+
diff --git a/interface/ois.if b/interface/ois.if
new file mode 100644
--- /dev/null
+++ b/interface/ois.if
@@ -0,0 +1,16 @@
+@exclude
+getVersionName
+sliderMoved
+copyKeyStates
+inputSystemName
+getAsString
+vendor
+
+@rename
+std::size_t|size_t
+# Implicit coercion.
+std::string|char*
+
+@header
+OIS/OIS.h
+
diff --git a/run_cgen.sh b/run_cgen.sh
new file mode 100644
--- /dev/null
+++ b/run_cgen.sh
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+#rm OIS/*
+#rm cbits/*
+
+HEADERLIST="--include /usr/include/OIS OISPrereqs.h \
+    OISObject.h \
+    OISMouse.h \
+    OISJoyStick.h \
+    OISMultiTouch.h \
+    OISInputManager.h \
+    OISFactoryCreator.h \
+    OISEvents.h \
+    OISInterface.h \
+    OISKeyboard.h"
+#    OISForceFeedback.h \ # cgen-hs makes faulty file
+#    OISException.h \ # cgen fails
+#    OISEffect.h # cgen fails
+#    OISConfig.h \ # not intended for api use
+
+GRAPHFILE=interface/ois.gr
+
+cgen -o cbits/ --interface interface/ois.if $HEADERLIST
+
+grgen -o $GRAPHFILE $HEADERLIST
+
+cgen-hs --inherit $GRAPHFILE \
+	--interface interface/ois.hif \
+	-o OIS/ \
+	--hierarchy OIS. cbits/*.h 
