diff --git a/ALUT.cabal b/ALUT.cabal
--- a/ALUT.cabal
+++ b/ALUT.cabal
@@ -1,65 +1,69 @@
 name: ALUT
-version: 2.3.0.1
+version: 2.3.0.2
+synopsis: A binding for the OpenAL Utility Toolkit
+description:
+  A Haskell binding for the OpenAL Utility Toolkit, which makes
+  managing of OpenAL contexts, loading sounds in various formats
+  and creating waveforms very easy. For more information about the
+  C library on which this binding is based, please see:
+  <http://distro.ibiblio.org/rootlinux/rootlinux-ports/more/freealut/freealut-1.1.0/doc/alut.html>.
+homepage: https://github.com/haskell-openal/ALUT
+bug-reports: https://github.com/haskell-openal/ALUT/issues
 license: BSD3
 license-file: LICENSE
+author: Sven Panne
 maintainer: Sven Panne <svenpanne@gmail.com>
-bug-reports: https://github.com/haskell-openal/ALUT/issues
-homepage: https://github.com/haskell-openal/ALUT
 category: Sound
-synopsis: A binding for the OpenAL Utility Toolkit
-description:
-        A Haskell binding for the OpenAL Utility Toolkit, which makes
-        managing of OpenAL contexts, loading sounds in various formats
-        and creating waveforms very easy. For more information about the
-        C library on which this binding is based, please see:
-        <http://distro.ibiblio.org/rootlinux/rootlinux-ports/more/freealut/freealut-1.1.0/doc/alut.html>.
 build-type: Simple
-cabal-version:  >= 1.6
+cabal-version:  >= 1.10
 extra-source-files:
-        README.md
-        examples/Basic/HelloWorld.hs
-        examples/Basic/OpenALInfo.hs
-        examples/Basic/PlayFile.hs
-        examples/TestSuite/TestErrorStuff.hs
-        examples/TestSuite/TestFileLoader.hs
-        examples/TestSuite/TestMemoryLoader.hs
-        examples/TestSuite/TestVersion.hs
-        examples/TestSuite/TestWaveforms.hs
-        examples/TestSuite/file1.wav
-        examples/TestSuite/file2.au
-        examples/TestSuite/file3.raw
+  README.md
+  examples/Basic/HelloWorld.hs
+  examples/Basic/OpenALInfo.hs
+  examples/Basic/PlayFile.hs
+  examples/TestSuite/TestErrorStuff.hs
+  examples/TestSuite/TestFileLoader.hs
+  examples/TestSuite/TestMemoryLoader.hs
+  examples/TestSuite/TestVersion.hs
+  examples/TestSuite/TestWaveforms.hs
+  examples/TestSuite/file1.wav
+  examples/TestSuite/file2.au
+  examples/TestSuite/file3.raw
 
 flag UseNativeWindowsLibraries
-   description:
-      When compiling under Windows, use the native libraries instead of e.g. the
-      ones coming with Cygwin.
+  description:
+    When compiling under Windows, use the native libraries instead of e.g. the
+    ones coming with Cygwin.
 
 library
-    exposed-modules:
-        Sound.ALUT,
-        Sound.ALUT.Initialization,
-        Sound.ALUT.Loaders,
-        Sound.ALUT.Sleep,
-        Sound.ALUT.Version
-    other-modules:
-        Sound.ALUT.Config,
-        Sound.ALUT.Constants,
-        Sound.ALUT.Errors
-    ghc-options: -Wall -O2
-    build-depends: base >= 3 && < 5, OpenGL >= 2.9.0.0, OpenAL >= 1.6.0.0
-    if os(windows) && flag(UseNativeWindowsLibraries)
-      if arch(i386)
-         cpp-options: "-DCALLCONV=stdcall"
-      else
-         cpp-options: "-DCALLCONV=ccall"
-      extra-libraries: alut
+  exposed-modules:
+    Sound.ALUT
+    Sound.ALUT.Initialization
+    Sound.ALUT.Loaders
+    Sound.ALUT.Sleep
+    Sound.ALUT.Version
+  other-modules:
+    Sound.ALUT.Config
+    Sound.ALUT.Constants
+    Sound.ALUT.Errors
+  hs-source-dirs: src
+  ghc-options: -Wall -O2
+  build-depends: base >= 3 && < 5, OpenGL >= 2.9.0.0, OpenAL >= 1.6.0.0
+  default-language: Haskell2010
+  other-extensions: CPP
+  if os(windows) && flag(UseNativeWindowsLibraries)
+    if arch(i386)
+      cpp-options: "-DCALLCONV=stdcall"
     else
       cpp-options: "-DCALLCONV=ccall"
-      if os(darwin) || os(ios)
-         frameworks: ALUT
-      else
-         extra-libraries: alut
+    extra-libraries: alut
+  else
+    cpp-options: "-DCALLCONV=ccall"
+    if os(ios)
+      frameworks: ALUT
+    else
+      extra-libraries: alut
 
 source-repository head
-  type:     git
-  location: https://github.com/haskell-openal/ALUT
+  type: git
+  location: https://github.com/haskell-openal/ALUT.git
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -3,4 +3,4 @@
 
 A Haskell binding for the OpenAL Utility Toolkit, which makes managing of OpenAL contexts, loading sounds in various formats and creating waveforms very easy.
 
-[![Build Status](https://travis-ci.org/haskell-openal/ALUT.png)](https://travis-ci.org/haskell-openal/ALUT)
+[![Hackage](https://img.shields.io/hackage/v/ALUT.svg)](https://hackage.haskell.org/package/ALUT) [![Build Status](https://travis-ci.org/haskell-openal/ALUT.png)](https://travis-ci.org/haskell-openal/ALUT)
diff --git a/Sound/ALUT.hs b/Sound/ALUT.hs
deleted file mode 100644
--- a/Sound/ALUT.hs
+++ /dev/null
@@ -1,32 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Sound.ALUT
--- Copyright   :  (c) Sven Panne 2005-2013
--- License     :  BSD3
---
--- Maintainer  :  Sven Panne <svenpanne@gmail.com>
--- Stability   :  stable
--- Portability :  portable
---
--- A Haskell binding for the OpenAL Utility Toolkit, which makes managing of
--- OpenAL contexts, loading sounds in various formats and creating waveforms
--- very easy. For more information about the C library on which this binding is
--- based, please see: <http://www.openal.org/openal_webstf/specs/alut.html>.
---
---------------------------------------------------------------------------------
-
-module Sound.ALUT (
-   module Sound.OpenAL,
-
-   module Sound.ALUT.Initialization,
-   module Sound.ALUT.Loaders,
-   module Sound.ALUT.Version,
-   module Sound.ALUT.Sleep
-)  where
-
-import Sound.OpenAL
-
-import Sound.ALUT.Initialization
-import Sound.ALUT.Loaders
-import Sound.ALUT.Version
-import Sound.ALUT.Sleep
diff --git a/Sound/ALUT/Config.hs b/Sound/ALUT/Config.hs
deleted file mode 100644
--- a/Sound/ALUT/Config.hs
+++ /dev/null
@@ -1,159 +0,0 @@
-{-# LANGUAGE ForeignFunctionInterface, CPP #-}
-{-# OPTIONS_HADDOCK hide #-}
---------------------------------------------------------------------------------
--- |
--- Module      :  Sound.ALUT.Config
--- Copyright   :  (c) Sven Panne 2006-2013
--- License     :  BSD3
---
--- Maintainer  :  Sven Panne <svenpanne@gmail.com>
--- Stability   :  stable
--- Portability :  portable
---
--- This purely internal module defines the platform-specific stuff which has
--- been figured out by configure.
---
---------------------------------------------------------------------------------
-
-module Sound.ALUT.Config (
-   alut_Init,
-   alut_InitWithoutContext,
-   alut_Exit,
-
-   alut_GetError,
-   alut_GetErrorString,
-
-   alut_CreateBufferFromFile,
-   alut_CreateBufferFromFileImage,
-   alut_CreateBufferHelloWorld,
-   alut_CreateBufferWaveform,
-
-   alut_LoadMemoryFromFile,
-   alut_LoadMemoryFromFileImage,
-   alut_LoadMemoryHelloWorld,
-   alut_LoadMemoryWaveform,
-
-   alut_GetMIMETypes,
-
-   alut_GetMajorVersion,
-   alut_GetMinorVersion,
-
-   alut_Sleep
-) where
-
---------------------------------------------------------------------------------
-
-import Foreign.C
-import Foreign.Ptr
-import Sound.OpenAL.AL.BasicTypes
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "alutInit"
-   alut_Init :: Ptr CInt -> Ptr CString -> IO ALboolean
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "alutInitWithoutContext"
-   alut_InitWithoutContext :: Ptr CInt -> Ptr CString -> IO ALboolean
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "alutExit"
-   alut_Exit :: IO ALboolean
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "alutGetError"
-   alut_GetError :: IO ALenum
-
---------------------------------------------------------------------------------
-
-alut_GetErrorString :: ALenum -> IO String
-alut_GetErrorString e = peekCString =<< alutGetErrorString e
-
-foreign import CALLCONV unsafe "alutGetErrorString"
-   alutGetErrorString :: ALenum -> IO CString
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "alutCreateBufferFromFile"
-   alut_CreateBufferFromFile :: CString -> IO ALuint
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "alutCreateBufferFromFileImage"
-   alut_CreateBufferFromFileImage :: Ptr a -> ALsizei -> IO ALuint
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "alutCreateBufferHelloWorld"
-   alut_CreateBufferHelloWorld :: IO ALuint
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "alutCreateBufferWaveform"
-   alut_CreateBufferWaveform :: ALenum
-                             -> ALfloat
-                             -> ALfloat
-                             -> ALfloat
-                             -> IO ALuint
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "alutLoadMemoryFromFile"
-   alut_LoadMemoryFromFile :: CString
-                           -> Ptr ALenum
-                           -> Ptr ALsizei
-                           -> Ptr ALfloat
-                           -> IO (Ptr b)
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "alutLoadMemoryFromFileImage"
-   alut_LoadMemoryFromFileImage :: Ptr a
-                                -> ALsizei
-                                -> Ptr ALenum
-                                -> Ptr ALsizei
-                                -> Ptr ALfloat
-                                -> IO (Ptr b)
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "alutLoadMemoryHelloWorld"
-   alut_LoadMemoryHelloWorld :: Ptr ALenum
-                             -> Ptr ALsizei
-                             -> Ptr ALfloat
-                             -> IO (Ptr b)
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "alutLoadMemoryWaveform"
-   alut_LoadMemoryWaveform :: ALenum
-                           -> ALfloat
-                           -> ALfloat
-                           -> ALfloat
-                           -> Ptr ALenum
-                           -> Ptr ALsizei
-                           -> Ptr ALfloat
-                           -> IO (Ptr b)
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "alutGetMIMETypes"
-   alut_GetMIMETypes :: ALenum -> IO CString
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "alutGetMajorVersion"
-   alut_GetMajorVersion :: IO ALint
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "alutGetMinorVersion"
-   alut_GetMinorVersion :: IO ALint
-
---------------------------------------------------------------------------------
-
-foreign import CALLCONV unsafe "alutSleep"
-   alut_Sleep :: ALfloat -> IO ALboolean
diff --git a/Sound/ALUT/Constants.hs b/Sound/ALUT/Constants.hs
deleted file mode 100644
--- a/Sound/ALUT/Constants.hs
+++ /dev/null
@@ -1,38 +0,0 @@
-{-# OPTIONS_HADDOCK hide #-}
---------------------------------------------------------------------------------
--- |
--- Module      :  Sound.ALUT.Constants
--- Copyright   :  (c) Sven Panne 2005-2013
--- License     :  BSD3
---
--- Maintainer  :  Sven Panne <svenpanne@gmail.com>
--- Stability   :  stable
--- Portability :  portable
---
---------------------------------------------------------------------------------
-
-module Sound.ALUT.Constants where
-
-import Sound.OpenAL.AL.BasicTypes ( ALint, ALenum )
-
---------------------------------------------------------------------------------
-
-alut_API_MAJOR_VERSION, alut_API_MINOR_VERSION :: ALint
-alut_API_MAJOR_VERSION               = 1
-alut_API_MINOR_VERSION               = 1
-
---------------------------------------------------------------------------------
-
-alut_WAVEFORM_SINE, alut_WAVEFORM_SQUARE, alut_WAVEFORM_SAWTOOTH,
-   alut_WAVEFORM_IMPULSE, alut_WAVEFORM_WHITENOISE :: ALenum
-alut_WAVEFORM_SINE                   = 0x100
-alut_WAVEFORM_SQUARE                 = 0x101
-alut_WAVEFORM_SAWTOOTH               = 0x102
-alut_WAVEFORM_WHITENOISE             = 0x103
-alut_WAVEFORM_IMPULSE                = 0x104
-
---------------------------------------------------------------------------------
-
-alut_LOADER_BUFFER, alut_LOADER_MEMORY :: ALenum
-alut_LOADER_BUFFER                   = 0x300
-alut_LOADER_MEMORY                   = 0x301
diff --git a/Sound/ALUT/Errors.hs b/Sound/ALUT/Errors.hs
deleted file mode 100644
--- a/Sound/ALUT/Errors.hs
+++ /dev/null
@@ -1,51 +0,0 @@
-{-# OPTIONS_HADDOCK hide #-}
---------------------------------------------------------------------------------
--- |
--- Module      :  Sound.ALUT.Errors
--- Copyright   :  (c) Sven Panne 2005-2013
--- License     :  BSD3
---
--- Maintainer  :  Sven Panne <svenpanne@gmail.com>
--- Stability   :  stable
--- Portability :  portable
---
---------------------------------------------------------------------------------
-
-module Sound.ALUT.Errors (
-   throwIfALfalse, throwIfNullPtr, makeBuffer
-)  where
-
-import Control.Monad ( void, when )
-import Data.Maybe ( fromJust, isNothing )
-import Foreign.Ptr ( Ptr, nullPtr )
-import Sound.OpenAL.AL.BasicTypes ( ALboolean, ALuint )
-import Sound.OpenAL.AL.Buffer ( Buffer )
-import Sound.OpenAL.AL.Extensions ( unmarshalALboolean, unmarshalBuffer )
-import Sound.ALUT.Config ( alut_GetError, alut_GetErrorString )
-
---------------------------------------------------------------------------------
-
-throwIf ::  (a -> Bool) -> String -> IO a -> IO a
-throwIf failurePredicate name action = do
-   returnValue <- action
-   when (failurePredicate returnValue) $ do
-      description <- alut_GetErrorString =<< alut_GetError
-      ioError (userError (name ++ ": " ++ description))
-   return returnValue
-
---------------------------------------------------------------------------------
-
-throwIfALfalse :: String -> IO ALboolean -> IO ()
-throwIfALfalse name action =
-   void $ throwIf (not . unmarshalALboolean) name action
-
---------------------------------------------------------------------------------
-
-throwIfNullPtr :: String -> IO (Ptr a) -> IO (Ptr a)
-throwIfNullPtr = throwIf (== nullPtr)
-
---------------------------------------------------------------------------------
-
-makeBuffer :: String -> IO ALuint -> IO Buffer
-makeBuffer name =
-   fmap fromJust . throwIf isNothing name . fmap unmarshalBuffer
diff --git a/Sound/ALUT/Initialization.hs b/Sound/ALUT/Initialization.hs
deleted file mode 100644
--- a/Sound/ALUT/Initialization.hs
+++ /dev/null
@@ -1,69 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Sound.ALUT.Initialization
--- Copyright   :  (c) Sven Panne 2005-2013
--- License     :  BSD3
---
--- Maintainer  :  Sven Panne <svenpanne@gmail.com>
--- Stability   :  stable
--- Portability :  portable
---
---------------------------------------------------------------------------------
-
-module Sound.ALUT.Initialization (
-   ArgumentConsumer, Runner, runALUT, runALUTUsingCurrentContext,
-   withProgNameAndArgs
-)  where
-
-import Control.Exception ( finally )
-import Data.List ( genericLength )
-import Foreign.C.String ( CString, withCString, peekCString )
-import Foreign.C.Types ( CInt )
-import Foreign.Marshal.Array ( withArray0, peekArray )
-import Foreign.Marshal.Utils ( with, withMany )
-import Foreign.Ptr ( Ptr, nullPtr )
-import Foreign.Storable ( Storable(peek) )
-import Sound.ALUT.Config ( alut_Init, alut_InitWithoutContext, alut_Exit )
-import Sound.ALUT.Errors ( throwIfALfalse )
-import Sound.OpenAL.AL.BasicTypes ( ALboolean )
-import System.Environment ( getProgName, getArgs )
-
---------------------------------------------------------------------------------
-
-type ArgumentConsumer a = String -> [String] -> a
-
-type Runner a = ArgumentConsumer (IO a) -> IO a
-
---------------------------------------------------------------------------------
-
-runALUT :: ArgumentConsumer (Runner a)
-runALUT = runner "runALUT" alut_Init
-
---------------------------------------------------------------------------------
-
-runALUTUsingCurrentContext :: ArgumentConsumer (Runner a)
-runALUTUsingCurrentContext =
-   runner "runALUTUsingCurrentContext" alut_InitWithoutContext
-
---------------------------------------------------------------------------------
-
-runner :: String -> (Ptr CInt -> Ptr CString -> IO ALboolean) -> String
-       -> [String] -> Runner a
-runner name initAction progName args action =
-   with (1 + genericLength args) $ \argcBuf ->
-      withMany withCString (progName : args) $ \argvPtrs ->
-         withArray0 nullPtr argvPtrs $ \argvBuf -> do
-            throwIfALfalse name $ initAction argcBuf argvBuf
-            newArgc <- peek argcBuf
-            newArgvPtrs <- peekArray (fromIntegral newArgc) argvBuf
-            newArgv <- mapM peekCString newArgvPtrs
-            action (head newArgv) (tail newArgv)
-               `finally` throwIfALfalse name alut_Exit
-
---------------------------------------------------------------------------------
-
-withProgNameAndArgs :: (ArgumentConsumer (Runner a)) -> Runner a
-withProgNameAndArgs alutRunner action = do
-   n <- getProgName
-   a <- getArgs
-   alutRunner n a action
diff --git a/Sound/ALUT/Loaders.hs b/Sound/ALUT/Loaders.hs
deleted file mode 100644
--- a/Sound/ALUT/Loaders.hs
+++ /dev/null
@@ -1,121 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Sound.ALUT.Loaders
--- Copyright   :  (c) Sven Panne 2005-2013
--- License     :  BSD3
---
--- Maintainer  :  Sven Panne <svenpanne@gmail.com>
--- Stability   :  stable
--- Portability :  portable
---
---------------------------------------------------------------------------------
-
-module Sound.ALUT.Loaders (
-   Phase, Duration, SoundDataSource(..),
-   createBuffer, createBufferData,
-   bufferMIMETypes, bufferDataMIMETypes
-)  where
-
-import Foreign.C.String ( peekCString, withCString )
-import Foreign.Marshal.Alloc ( alloca )
-import Foreign.Storable ( Storable(peek) )
-import Foreign.Ptr ( Ptr )
-import Graphics.Rendering.OpenGL ( GettableStateVar, makeGettableStateVar )
-import Sound.ALUT.Config (
-   alut_CreateBufferFromFile, alut_CreateBufferFromFileImage,
-   alut_CreateBufferHelloWorld, alut_CreateBufferWaveform,
-   alut_LoadMemoryFromFile, alut_LoadMemoryFromFileImage,
-   alut_LoadMemoryHelloWorld, alut_LoadMemoryWaveform,
-   alut_GetMIMETypes )
-import Sound.ALUT.Constants (
-   alut_WAVEFORM_SINE, alut_WAVEFORM_SQUARE, alut_WAVEFORM_SAWTOOTH,
-   alut_WAVEFORM_IMPULSE, alut_WAVEFORM_WHITENOISE,
-   alut_LOADER_BUFFER, alut_LOADER_MEMORY )
-import Sound.ALUT.Errors ( makeBuffer, throwIfNullPtr )
-import Sound.OpenAL.AL.BasicTypes
-import Sound.OpenAL.AL.Buffer ( Buffer, MemoryRegion(..), BufferData(..) )
-import Sound.OpenAL.AL.Extensions ( unmarshalFormat )
-import Sound.OpenAL.ALC.Context ( Frequency )
-
---------------------------------------------------------------------------------
-
-type Phase = Float
-
-type Duration = Float
-
-data SoundDataSource a =
-     File FilePath
-   | FileImage (MemoryRegion a)
-   | HelloWorld
-   | Sine Frequency Phase Duration
-   | Square Frequency Phase Duration
-   | Sawtooth Frequency Phase Duration
-   | Impulse Frequency Phase Duration
-   | WhiteNoise Duration
-   deriving ( Eq, Ord, Show )
-
---------------------------------------------------------------------------------
-
-createBuffer :: SoundDataSource a -> IO Buffer
-createBuffer src = makeBuffer "createBuffer" $ case src of
-   File filePath -> withCString filePath alut_CreateBufferFromFile
-   FileImage (MemoryRegion buf size) -> alut_CreateBufferFromFileImage buf size
-   HelloWorld -> alut_CreateBufferHelloWorld
-   Sine f p d -> createBufferWaveform alut_WAVEFORM_SINE f p d
-   Square f p d -> createBufferWaveform alut_WAVEFORM_SQUARE f p d
-   Sawtooth f p d -> createBufferWaveform alut_WAVEFORM_SAWTOOTH f p d
-   Impulse f p d -> createBufferWaveform alut_WAVEFORM_IMPULSE f p d
-   WhiteNoise d -> createBufferWaveform alut_WAVEFORM_WHITENOISE 1 0 d
-
-createBufferWaveform :: ALenum -> Float -> Float -> Float -> IO ALuint
-createBufferWaveform w f p d =
-   alut_CreateBufferWaveform w (realToFrac f) (realToFrac p) (realToFrac d)
-
---------------------------------------------------------------------------------
-
-createBufferData :: SoundDataSource a -> IO (BufferData b)
-createBufferData src = case src of
-   File filePath -> withCString filePath $ \fp -> loadWith (alut_LoadMemoryFromFile fp)
-   FileImage (MemoryRegion buf size) -> loadWith (alut_LoadMemoryFromFileImage buf size)
-   HelloWorld -> loadWith alut_LoadMemoryHelloWorld
-   Sine f p d -> loadWith (loadMemoryWaveform alut_WAVEFORM_SINE f p d)
-   Square f p d -> loadWith (loadMemoryWaveform alut_WAVEFORM_SQUARE f p d)
-   Sawtooth f p d -> loadWith (loadMemoryWaveform alut_WAVEFORM_SAWTOOTH f p d)
-   Impulse f p d -> loadWith (loadMemoryWaveform alut_WAVEFORM_IMPULSE f p d)
-   WhiteNoise d -> loadWith (loadMemoryWaveform alut_WAVEFORM_WHITENOISE 1 0 d)
-
-loadMemoryWaveform :: ALenum -> Float -> Float -> Float -> Ptr ALenum -> Ptr ALsizei -> Ptr ALfloat -> IO (Ptr b)
-loadMemoryWaveform w f p d =
-   alut_LoadMemoryWaveform w (realToFrac f) (realToFrac p) (realToFrac d)
-
-loadWith :: (Ptr ALenum -> Ptr ALsizei -> Ptr ALfloat -> IO (Ptr b)) -> IO (BufferData b)
-loadWith loader =
-   alloca $ \formatBuf ->
-      alloca $ \sizeBuf ->
-         alloca $ \frequencyBuf -> do
-            buf <- throwIfNullPtr "createBufferData" $
-                      loader formatBuf sizeBuf frequencyBuf
-            format <- peek formatBuf
-            size <- peek sizeBuf
-            frequency <- peek frequencyBuf
-            return $ BufferData (MemoryRegion buf size) (unmarshalFormat format) (realToFrac frequency)
-
---------------------------------------------------------------------------------
-
-bufferMIMETypes :: GettableStateVar [String]
-bufferMIMETypes = mimeTypes "bufferMIMETypes" alut_LOADER_BUFFER
-
-bufferDataMIMETypes :: GettableStateVar [String]
-bufferDataMIMETypes = mimeTypes "bufferDataMIMETypes" alut_LOADER_MEMORY
-
-mimeTypes :: String -> ALenum -> GettableStateVar [String]
-mimeTypes name loaderType =
-   makeGettableStateVar $ do
-      ts <- throwIfNullPtr name $ alut_GetMIMETypes loaderType
-      fmap (splitBy (== ',')) $ peekCString ts
-
-splitBy :: (a -> Bool) -> [a] -> [[a]]
-splitBy _ [] = []
-splitBy p xs = case break p xs of
-                (ys, []  ) -> [ys]
-                (ys, _:zs) -> ys : splitBy p zs
diff --git a/Sound/ALUT/Sleep.hs b/Sound/ALUT/Sleep.hs
deleted file mode 100644
--- a/Sound/ALUT/Sleep.hs
+++ /dev/null
@@ -1,24 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Sound.ALUT.Sleep
--- Copyright   :  (c) Sven Panne 2005-2013
--- License     :  BSD3
---
--- Maintainer  :  Sven Panne <svenpanne@gmail.com>
--- Stability   :  stable
--- Portability :  portable
---
---------------------------------------------------------------------------------
-
-module Sound.ALUT.Sleep (
-   sleep
-)  where
-
-import Sound.ALUT.Config ( alut_Sleep )
-import Sound.ALUT.Errors ( throwIfALfalse )
-import Sound.ALUT.Loaders ( Duration )
-
---------------------------------------------------------------------------------
-
-sleep :: Duration -> IO ()
-sleep = throwIfALfalse "sleep" . alut_Sleep . realToFrac
diff --git a/Sound/ALUT/Version.hs b/Sound/ALUT/Version.hs
deleted file mode 100644
--- a/Sound/ALUT/Version.hs
+++ /dev/null
@@ -1,36 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module      :  Sound.ALUT.Version
--- Copyright   :  (c) Sven Panne 2005-2013
--- License     :  BSD3
---
--- Maintainer  :  Sven Panne <svenpanne@gmail.com>
--- Stability   :  stable
--- Portability :  portable
---
---------------------------------------------------------------------------------
-
-module Sound.ALUT.Version (
-   alutAPIVersion, alutVersion
-)  where
-
-import Control.Monad ( liftM2 )
-import Graphics.Rendering.OpenGL ( GettableStateVar, makeGettableStateVar )
-import Sound.OpenAL.AL.BasicTypes ( ALint )
-import Sound.ALUT.Config ( alut_GetMajorVersion, alut_GetMinorVersion )
-import Sound.ALUT.Constants ( alut_API_MAJOR_VERSION, alut_API_MINOR_VERSION )
-
---------------------------------------------------------------------------------
-
-alutAPIVersion :: String
-alutAPIVersion = makeVersionString alut_API_MAJOR_VERSION alut_API_MINOR_VERSION
-
-makeVersionString :: ALint -> ALint -> String
-makeVersionString major minor = show major ++ "." ++ show minor
-
---------------------------------------------------------------------------------
-
-alutVersion :: GettableStateVar String
-alutVersion =
-   makeGettableStateVar $
-      liftM2 makeVersionString alut_GetMajorVersion alut_GetMinorVersion
diff --git a/src/Sound/ALUT.hs b/src/Sound/ALUT.hs
new file mode 100644
--- /dev/null
+++ b/src/Sound/ALUT.hs
@@ -0,0 +1,32 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Sound.ALUT
+-- Copyright   :  (c) Sven Panne 2005-2013
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- A Haskell binding for the OpenAL Utility Toolkit, which makes managing of
+-- OpenAL contexts, loading sounds in various formats and creating waveforms
+-- very easy. For more information about the C library on which this binding is
+-- based, please see: <http://www.openal.org/openal_webstf/specs/alut.html>.
+--
+--------------------------------------------------------------------------------
+
+module Sound.ALUT (
+   module Sound.OpenAL,
+
+   module Sound.ALUT.Initialization,
+   module Sound.ALUT.Loaders,
+   module Sound.ALUT.Version,
+   module Sound.ALUT.Sleep
+)  where
+
+import Sound.OpenAL
+
+import Sound.ALUT.Initialization
+import Sound.ALUT.Loaders
+import Sound.ALUT.Version
+import Sound.ALUT.Sleep
diff --git a/src/Sound/ALUT/Config.hs b/src/Sound/ALUT/Config.hs
new file mode 100644
--- /dev/null
+++ b/src/Sound/ALUT/Config.hs
@@ -0,0 +1,159 @@
+{-# LANGUAGE CPP #-}
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Sound.ALUT.Config
+-- Copyright   :  (c) Sven Panne 2006-2013
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- This purely internal module defines the platform-specific stuff which has
+-- been figured out by configure.
+--
+--------------------------------------------------------------------------------
+
+module Sound.ALUT.Config (
+   alut_Init,
+   alut_InitWithoutContext,
+   alut_Exit,
+
+   alut_GetError,
+   alut_GetErrorString,
+
+   alut_CreateBufferFromFile,
+   alut_CreateBufferFromFileImage,
+   alut_CreateBufferHelloWorld,
+   alut_CreateBufferWaveform,
+
+   alut_LoadMemoryFromFile,
+   alut_LoadMemoryFromFileImage,
+   alut_LoadMemoryHelloWorld,
+   alut_LoadMemoryWaveform,
+
+   alut_GetMIMETypes,
+
+   alut_GetMajorVersion,
+   alut_GetMinorVersion,
+
+   alut_Sleep
+) where
+
+--------------------------------------------------------------------------------
+
+import Foreign.C
+import Foreign.Ptr
+import Sound.OpenAL.AL.BasicTypes
+
+--------------------------------------------------------------------------------
+
+foreign import CALLCONV unsafe "alutInit"
+   alut_Init :: Ptr CInt -> Ptr CString -> IO ALboolean
+
+--------------------------------------------------------------------------------
+
+foreign import CALLCONV unsafe "alutInitWithoutContext"
+   alut_InitWithoutContext :: Ptr CInt -> Ptr CString -> IO ALboolean
+
+--------------------------------------------------------------------------------
+
+foreign import CALLCONV unsafe "alutExit"
+   alut_Exit :: IO ALboolean
+
+--------------------------------------------------------------------------------
+
+foreign import CALLCONV unsafe "alutGetError"
+   alut_GetError :: IO ALenum
+
+--------------------------------------------------------------------------------
+
+alut_GetErrorString :: ALenum -> IO String
+alut_GetErrorString e = peekCString =<< alutGetErrorString e
+
+foreign import CALLCONV unsafe "alutGetErrorString"
+   alutGetErrorString :: ALenum -> IO CString
+
+--------------------------------------------------------------------------------
+
+foreign import CALLCONV unsafe "alutCreateBufferFromFile"
+   alut_CreateBufferFromFile :: CString -> IO ALuint
+
+--------------------------------------------------------------------------------
+
+foreign import CALLCONV unsafe "alutCreateBufferFromFileImage"
+   alut_CreateBufferFromFileImage :: Ptr a -> ALsizei -> IO ALuint
+
+--------------------------------------------------------------------------------
+
+foreign import CALLCONV unsafe "alutCreateBufferHelloWorld"
+   alut_CreateBufferHelloWorld :: IO ALuint
+
+--------------------------------------------------------------------------------
+
+foreign import CALLCONV unsafe "alutCreateBufferWaveform"
+   alut_CreateBufferWaveform :: ALenum
+                             -> ALfloat
+                             -> ALfloat
+                             -> ALfloat
+                             -> IO ALuint
+
+--------------------------------------------------------------------------------
+
+foreign import CALLCONV unsafe "alutLoadMemoryFromFile"
+   alut_LoadMemoryFromFile :: CString
+                           -> Ptr ALenum
+                           -> Ptr ALsizei
+                           -> Ptr ALfloat
+                           -> IO (Ptr b)
+
+--------------------------------------------------------------------------------
+
+foreign import CALLCONV unsafe "alutLoadMemoryFromFileImage"
+   alut_LoadMemoryFromFileImage :: Ptr a
+                                -> ALsizei
+                                -> Ptr ALenum
+                                -> Ptr ALsizei
+                                -> Ptr ALfloat
+                                -> IO (Ptr b)
+
+--------------------------------------------------------------------------------
+
+foreign import CALLCONV unsafe "alutLoadMemoryHelloWorld"
+   alut_LoadMemoryHelloWorld :: Ptr ALenum
+                             -> Ptr ALsizei
+                             -> Ptr ALfloat
+                             -> IO (Ptr b)
+
+--------------------------------------------------------------------------------
+
+foreign import CALLCONV unsafe "alutLoadMemoryWaveform"
+   alut_LoadMemoryWaveform :: ALenum
+                           -> ALfloat
+                           -> ALfloat
+                           -> ALfloat
+                           -> Ptr ALenum
+                           -> Ptr ALsizei
+                           -> Ptr ALfloat
+                           -> IO (Ptr b)
+
+--------------------------------------------------------------------------------
+
+foreign import CALLCONV unsafe "alutGetMIMETypes"
+   alut_GetMIMETypes :: ALenum -> IO CString
+
+--------------------------------------------------------------------------------
+
+foreign import CALLCONV unsafe "alutGetMajorVersion"
+   alut_GetMajorVersion :: IO ALint
+
+--------------------------------------------------------------------------------
+
+foreign import CALLCONV unsafe "alutGetMinorVersion"
+   alut_GetMinorVersion :: IO ALint
+
+--------------------------------------------------------------------------------
+
+foreign import CALLCONV unsafe "alutSleep"
+   alut_Sleep :: ALfloat -> IO ALboolean
diff --git a/src/Sound/ALUT/Constants.hs b/src/Sound/ALUT/Constants.hs
new file mode 100644
--- /dev/null
+++ b/src/Sound/ALUT/Constants.hs
@@ -0,0 +1,38 @@
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Sound.ALUT.Constants
+-- Copyright   :  (c) Sven Panne 2005-2013
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+--------------------------------------------------------------------------------
+
+module Sound.ALUT.Constants where
+
+import Sound.OpenAL.AL.BasicTypes ( ALint, ALenum )
+
+--------------------------------------------------------------------------------
+
+alut_API_MAJOR_VERSION, alut_API_MINOR_VERSION :: ALint
+alut_API_MAJOR_VERSION               = 1
+alut_API_MINOR_VERSION               = 1
+
+--------------------------------------------------------------------------------
+
+alut_WAVEFORM_SINE, alut_WAVEFORM_SQUARE, alut_WAVEFORM_SAWTOOTH,
+   alut_WAVEFORM_IMPULSE, alut_WAVEFORM_WHITENOISE :: ALenum
+alut_WAVEFORM_SINE                   = 0x100
+alut_WAVEFORM_SQUARE                 = 0x101
+alut_WAVEFORM_SAWTOOTH               = 0x102
+alut_WAVEFORM_WHITENOISE             = 0x103
+alut_WAVEFORM_IMPULSE                = 0x104
+
+--------------------------------------------------------------------------------
+
+alut_LOADER_BUFFER, alut_LOADER_MEMORY :: ALenum
+alut_LOADER_BUFFER                   = 0x300
+alut_LOADER_MEMORY                   = 0x301
diff --git a/src/Sound/ALUT/Errors.hs b/src/Sound/ALUT/Errors.hs
new file mode 100644
--- /dev/null
+++ b/src/Sound/ALUT/Errors.hs
@@ -0,0 +1,51 @@
+{-# OPTIONS_HADDOCK hide #-}
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Sound.ALUT.Errors
+-- Copyright   :  (c) Sven Panne 2005-2013
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+--------------------------------------------------------------------------------
+
+module Sound.ALUT.Errors (
+   throwIfALfalse, throwIfNullPtr, makeBuffer
+)  where
+
+import Control.Monad ( void, when )
+import Data.Maybe ( fromJust, isNothing )
+import Foreign.Ptr ( Ptr, nullPtr )
+import Sound.OpenAL.AL.BasicTypes ( ALboolean, ALuint )
+import Sound.OpenAL.AL.Buffer ( Buffer )
+import Sound.OpenAL.AL.Extensions ( unmarshalALboolean, unmarshalBuffer )
+import Sound.ALUT.Config ( alut_GetError, alut_GetErrorString )
+
+--------------------------------------------------------------------------------
+
+throwIf ::  (a -> Bool) -> String -> IO a -> IO a
+throwIf failurePredicate name action = do
+   returnValue <- action
+   when (failurePredicate returnValue) $ do
+      description <- alut_GetErrorString =<< alut_GetError
+      ioError (userError (name ++ ": " ++ description))
+   return returnValue
+
+--------------------------------------------------------------------------------
+
+throwIfALfalse :: String -> IO ALboolean -> IO ()
+throwIfALfalse name action =
+   void $ throwIf (not . unmarshalALboolean) name action
+
+--------------------------------------------------------------------------------
+
+throwIfNullPtr :: String -> IO (Ptr a) -> IO (Ptr a)
+throwIfNullPtr = throwIf (== nullPtr)
+
+--------------------------------------------------------------------------------
+
+makeBuffer :: String -> IO ALuint -> IO Buffer
+makeBuffer name =
+   fmap fromJust . throwIf isNothing name . fmap unmarshalBuffer
diff --git a/src/Sound/ALUT/Initialization.hs b/src/Sound/ALUT/Initialization.hs
new file mode 100644
--- /dev/null
+++ b/src/Sound/ALUT/Initialization.hs
@@ -0,0 +1,69 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Sound.ALUT.Initialization
+-- Copyright   :  (c) Sven Panne 2005-2013
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+--------------------------------------------------------------------------------
+
+module Sound.ALUT.Initialization (
+   ArgumentConsumer, Runner, runALUT, runALUTUsingCurrentContext,
+   withProgNameAndArgs
+)  where
+
+import Control.Exception ( finally )
+import Data.List ( genericLength )
+import Foreign.C.String ( CString, withCString, peekCString )
+import Foreign.C.Types ( CInt )
+import Foreign.Marshal.Array ( withArray0, peekArray )
+import Foreign.Marshal.Utils ( with, withMany )
+import Foreign.Ptr ( Ptr, nullPtr )
+import Foreign.Storable ( Storable(peek) )
+import Sound.ALUT.Config ( alut_Init, alut_InitWithoutContext, alut_Exit )
+import Sound.ALUT.Errors ( throwIfALfalse )
+import Sound.OpenAL.AL.BasicTypes ( ALboolean )
+import System.Environment ( getProgName, getArgs )
+
+--------------------------------------------------------------------------------
+
+type ArgumentConsumer a = String -> [String] -> a
+
+type Runner a = ArgumentConsumer (IO a) -> IO a
+
+--------------------------------------------------------------------------------
+
+runALUT :: ArgumentConsumer (Runner a)
+runALUT = runner "runALUT" alut_Init
+
+--------------------------------------------------------------------------------
+
+runALUTUsingCurrentContext :: ArgumentConsumer (Runner a)
+runALUTUsingCurrentContext =
+   runner "runALUTUsingCurrentContext" alut_InitWithoutContext
+
+--------------------------------------------------------------------------------
+
+runner :: String -> (Ptr CInt -> Ptr CString -> IO ALboolean) -> String
+       -> [String] -> Runner a
+runner name initAction progName args action =
+   with (1 + genericLength args) $ \argcBuf ->
+      withMany withCString (progName : args) $ \argvPtrs ->
+         withArray0 nullPtr argvPtrs $ \argvBuf -> do
+            throwIfALfalse name $ initAction argcBuf argvBuf
+            newArgc <- peek argcBuf
+            newArgvPtrs <- peekArray (fromIntegral newArgc) argvBuf
+            newArgv <- mapM peekCString newArgvPtrs
+            action (head newArgv) (tail newArgv)
+               `finally` throwIfALfalse name alut_Exit
+
+--------------------------------------------------------------------------------
+
+withProgNameAndArgs :: (ArgumentConsumer (Runner a)) -> Runner a
+withProgNameAndArgs alutRunner action = do
+   n <- getProgName
+   a <- getArgs
+   alutRunner n a action
diff --git a/src/Sound/ALUT/Loaders.hs b/src/Sound/ALUT/Loaders.hs
new file mode 100644
--- /dev/null
+++ b/src/Sound/ALUT/Loaders.hs
@@ -0,0 +1,121 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Sound.ALUT.Loaders
+-- Copyright   :  (c) Sven Panne 2005-2013
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+--------------------------------------------------------------------------------
+
+module Sound.ALUT.Loaders (
+   Phase, Duration, SoundDataSource(..),
+   createBuffer, createBufferData,
+   bufferMIMETypes, bufferDataMIMETypes
+)  where
+
+import Foreign.C.String ( peekCString, withCString )
+import Foreign.Marshal.Alloc ( alloca )
+import Foreign.Storable ( Storable(peek) )
+import Foreign.Ptr ( Ptr )
+import Graphics.Rendering.OpenGL ( GettableStateVar, makeGettableStateVar )
+import Sound.ALUT.Config (
+   alut_CreateBufferFromFile, alut_CreateBufferFromFileImage,
+   alut_CreateBufferHelloWorld, alut_CreateBufferWaveform,
+   alut_LoadMemoryFromFile, alut_LoadMemoryFromFileImage,
+   alut_LoadMemoryHelloWorld, alut_LoadMemoryWaveform,
+   alut_GetMIMETypes )
+import Sound.ALUT.Constants (
+   alut_WAVEFORM_SINE, alut_WAVEFORM_SQUARE, alut_WAVEFORM_SAWTOOTH,
+   alut_WAVEFORM_IMPULSE, alut_WAVEFORM_WHITENOISE,
+   alut_LOADER_BUFFER, alut_LOADER_MEMORY )
+import Sound.ALUT.Errors ( makeBuffer, throwIfNullPtr )
+import Sound.OpenAL.AL.BasicTypes
+import Sound.OpenAL.AL.Buffer ( Buffer, MemoryRegion(..), BufferData(..) )
+import Sound.OpenAL.AL.Extensions ( unmarshalFormat )
+import Sound.OpenAL.ALC.Context ( Frequency )
+
+--------------------------------------------------------------------------------
+
+type Phase = Float
+
+type Duration = Float
+
+data SoundDataSource a =
+     File FilePath
+   | FileImage (MemoryRegion a)
+   | HelloWorld
+   | Sine Frequency Phase Duration
+   | Square Frequency Phase Duration
+   | Sawtooth Frequency Phase Duration
+   | Impulse Frequency Phase Duration
+   | WhiteNoise Duration
+   deriving ( Eq, Ord, Show )
+
+--------------------------------------------------------------------------------
+
+createBuffer :: SoundDataSource a -> IO Buffer
+createBuffer src = makeBuffer "createBuffer" $ case src of
+   File filePath -> withCString filePath alut_CreateBufferFromFile
+   FileImage (MemoryRegion buf size) -> alut_CreateBufferFromFileImage buf size
+   HelloWorld -> alut_CreateBufferHelloWorld
+   Sine f p d -> createBufferWaveform alut_WAVEFORM_SINE f p d
+   Square f p d -> createBufferWaveform alut_WAVEFORM_SQUARE f p d
+   Sawtooth f p d -> createBufferWaveform alut_WAVEFORM_SAWTOOTH f p d
+   Impulse f p d -> createBufferWaveform alut_WAVEFORM_IMPULSE f p d
+   WhiteNoise d -> createBufferWaveform alut_WAVEFORM_WHITENOISE 1 0 d
+
+createBufferWaveform :: ALenum -> Float -> Float -> Float -> IO ALuint
+createBufferWaveform w f p d =
+   alut_CreateBufferWaveform w (realToFrac f) (realToFrac p) (realToFrac d)
+
+--------------------------------------------------------------------------------
+
+createBufferData :: SoundDataSource a -> IO (BufferData b)
+createBufferData src = case src of
+   File filePath -> withCString filePath $ \fp -> loadWith (alut_LoadMemoryFromFile fp)
+   FileImage (MemoryRegion buf size) -> loadWith (alut_LoadMemoryFromFileImage buf size)
+   HelloWorld -> loadWith alut_LoadMemoryHelloWorld
+   Sine f p d -> loadWith (loadMemoryWaveform alut_WAVEFORM_SINE f p d)
+   Square f p d -> loadWith (loadMemoryWaveform alut_WAVEFORM_SQUARE f p d)
+   Sawtooth f p d -> loadWith (loadMemoryWaveform alut_WAVEFORM_SAWTOOTH f p d)
+   Impulse f p d -> loadWith (loadMemoryWaveform alut_WAVEFORM_IMPULSE f p d)
+   WhiteNoise d -> loadWith (loadMemoryWaveform alut_WAVEFORM_WHITENOISE 1 0 d)
+
+loadMemoryWaveform :: ALenum -> Float -> Float -> Float -> Ptr ALenum -> Ptr ALsizei -> Ptr ALfloat -> IO (Ptr b)
+loadMemoryWaveform w f p d =
+   alut_LoadMemoryWaveform w (realToFrac f) (realToFrac p) (realToFrac d)
+
+loadWith :: (Ptr ALenum -> Ptr ALsizei -> Ptr ALfloat -> IO (Ptr b)) -> IO (BufferData b)
+loadWith loader =
+   alloca $ \formatBuf ->
+      alloca $ \sizeBuf ->
+         alloca $ \frequencyBuf -> do
+            buf <- throwIfNullPtr "createBufferData" $
+                      loader formatBuf sizeBuf frequencyBuf
+            format <- peek formatBuf
+            size <- peek sizeBuf
+            frequency <- peek frequencyBuf
+            return $ BufferData (MemoryRegion buf size) (unmarshalFormat format) (realToFrac frequency)
+
+--------------------------------------------------------------------------------
+
+bufferMIMETypes :: GettableStateVar [String]
+bufferMIMETypes = mimeTypes "bufferMIMETypes" alut_LOADER_BUFFER
+
+bufferDataMIMETypes :: GettableStateVar [String]
+bufferDataMIMETypes = mimeTypes "bufferDataMIMETypes" alut_LOADER_MEMORY
+
+mimeTypes :: String -> ALenum -> GettableStateVar [String]
+mimeTypes name loaderType =
+   makeGettableStateVar $ do
+      ts <- throwIfNullPtr name $ alut_GetMIMETypes loaderType
+      fmap (splitBy (== ',')) $ peekCString ts
+
+splitBy :: (a -> Bool) -> [a] -> [[a]]
+splitBy _ [] = []
+splitBy p xs = case break p xs of
+                (ys, []  ) -> [ys]
+                (ys, _:zs) -> ys : splitBy p zs
diff --git a/src/Sound/ALUT/Sleep.hs b/src/Sound/ALUT/Sleep.hs
new file mode 100644
--- /dev/null
+++ b/src/Sound/ALUT/Sleep.hs
@@ -0,0 +1,24 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Sound.ALUT.Sleep
+-- Copyright   :  (c) Sven Panne 2005-2013
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+--------------------------------------------------------------------------------
+
+module Sound.ALUT.Sleep (
+   sleep
+)  where
+
+import Sound.ALUT.Config ( alut_Sleep )
+import Sound.ALUT.Errors ( throwIfALfalse )
+import Sound.ALUT.Loaders ( Duration )
+
+--------------------------------------------------------------------------------
+
+sleep :: Duration -> IO ()
+sleep = throwIfALfalse "sleep" . alut_Sleep . realToFrac
diff --git a/src/Sound/ALUT/Version.hs b/src/Sound/ALUT/Version.hs
new file mode 100644
--- /dev/null
+++ b/src/Sound/ALUT/Version.hs
@@ -0,0 +1,36 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module      :  Sound.ALUT.Version
+-- Copyright   :  (c) Sven Panne 2005-2013
+-- License     :  BSD3
+--
+-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
+-- Stability   :  stable
+-- Portability :  portable
+--
+--------------------------------------------------------------------------------
+
+module Sound.ALUT.Version (
+   alutAPIVersion, alutVersion
+)  where
+
+import Control.Monad ( liftM2 )
+import Graphics.Rendering.OpenGL ( GettableStateVar, makeGettableStateVar )
+import Sound.OpenAL.AL.BasicTypes ( ALint )
+import Sound.ALUT.Config ( alut_GetMajorVersion, alut_GetMinorVersion )
+import Sound.ALUT.Constants ( alut_API_MAJOR_VERSION, alut_API_MINOR_VERSION )
+
+--------------------------------------------------------------------------------
+
+alutAPIVersion :: String
+alutAPIVersion = makeVersionString alut_API_MAJOR_VERSION alut_API_MINOR_VERSION
+
+makeVersionString :: ALint -> ALint -> String
+makeVersionString major minor = show major ++ "." ++ show minor
+
+--------------------------------------------------------------------------------
+
+alutVersion :: GettableStateVar String
+alutVersion =
+   makeGettableStateVar $
+      liftM2 makeVersionString alut_GetMajorVersion alut_GetMinorVersion
