diff --git a/Graphics/UI/SDL/Mixer.hs b/Graphics/UI/SDL/Mixer.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/UI/SDL/Mixer.hs
@@ -0,0 +1,15 @@
+module Graphics.UI.SDL.Mixer
+    ( module Graphics.UI.SDL.Mixer.Channels
+    , module Graphics.UI.SDL.Mixer.Music
+    , module Graphics.UI.SDL.Mixer.Types
+    , module Graphics.UI.SDL.Mixer.General
+    , module Graphics.UI.SDL.Mixer.Samples
+    , module Graphics.UI.SDL.Mixer.Version
+    ) where
+
+import Graphics.UI.SDL.Mixer.Channels
+import Graphics.UI.SDL.Mixer.Music
+import Graphics.UI.SDL.Mixer.Types
+import Graphics.UI.SDL.Mixer.General
+import Graphics.UI.SDL.Mixer.Samples
+import Graphics.UI.SDL.Mixer.Version
diff --git a/Graphics/UI/SDL/Mixer/Channels.hs b/Graphics/UI/SDL/Mixer/Channels.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/UI/SDL/Mixer/Channels.hs
@@ -0,0 +1,131 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.UI.SDL.Mixer.Channels
+-- Copyright   :  (c) David Himmelstrup 2005
+-- License     :  BSD-like
+--
+-- Maintainer  :  lemmih@gmail.com
+-- Stability   :  provisional
+-- Portability :  portable
+--
+-----------------------------------------------------------------------------
+module Graphics.UI.SDL.Mixer.Channels
+    ( allocateChannels
+    , volume
+    , tryPlayChannel
+    , playChannel
+    , tryFadeInChannel
+    , fadeInChannel
+    , tryFadeInChannelTimed
+    , fadeInChannelTimed
+    , pause
+    , resume
+    , haltChannel
+    , expireChannel
+    , fadeOutChannel
+    , isChannelPlaying
+    , numChannelsPlaying
+    , isChannelPaused
+    , numChannelsPaused
+    , fadingChannel
+    , getChunk
+    ) where
+
+import Foreign(Ptr, newForeignPtr_, toBool, withForeignPtr)
+
+import Graphics.UI.SDL.Mixer.Types(Fading, Channel, Chunk, ChunkStruct)
+import Graphics.UI.SDL.General(unwrapInt)
+
+-- int Mix_AllocateChannels(int numchans)
+foreign import ccall unsafe "Mix_AllocateChannels" allocateChannels :: Int -> IO Int
+
+-- int Mix_Volume(int channel, int volume)
+foreign import ccall unsafe "Mix_Volume" volume :: Int -> Int -> IO Int
+
+tryPlayChannel :: Channel -> Chunk -> Int -> IO Int
+tryPlayChannel channel chunk loops
+    = tryPlayChannelTimed channel chunk loops (-1)
+
+playChannel :: Channel -> Chunk -> Int -> IO Int
+playChannel channel chunk loops
+    = playChannelTimed channel chunk loops (-1)
+
+-- int Mix_PlayChannelTimed(int channel, Mix_Chunk *chunk, int loops, int ticks)
+foreign import ccall unsafe "Mix_PlayChannelTimed" mixPlayChannelTimed
+    :: Int -> Ptr ChunkStruct -> Int -> Int -> IO Int
+tryPlayChannelTimed :: Channel -> Chunk -> Int -> Int -> IO Int
+tryPlayChannelTimed channel chunk loops ticks
+    = withForeignPtr chunk $ \chunkPtr ->
+      mixPlayChannelTimed channel chunkPtr loops ticks
+
+playChannelTimed :: Channel -> Chunk -> Int -> Int -> IO Int
+playChannelTimed channel chunk loops ticks
+    = unwrapInt (/=(-1)) "Mix_PlayChannelTimed"
+                (tryPlayChannelTimed channel chunk loops ticks)
+
+tryFadeInChannel :: Channel -> Chunk -> Int -> Int -> IO Int
+tryFadeInChannel channel chunk loops ms
+    = tryFadeInChannelTimed channel chunk loops ms (-1)
+
+fadeInChannel :: Channel -> Chunk -> Int -> Int -> IO Int
+fadeInChannel channel chunk loops ms
+    = fadeInChannelTimed channel chunk loops ms (-1)
+
+-- int Mix_FadeInChannelTimed(int channel, Mix_Chunk *chunk, int loops, int ms, int ticks)
+foreign import ccall unsafe "Mix_FadeInChannelTimed" mixFadeInChannelTimed
+    :: Int -> Ptr ChunkStruct -> Int -> Int -> Int -> IO Int
+tryFadeInChannelTimed :: Channel -> Chunk -> Int -> Int -> Int -> IO Int
+tryFadeInChannelTimed channel chunk loops ms ticks
+    = withForeignPtr chunk $ \chunkPtr ->
+      mixFadeInChannelTimed channel chunkPtr loops ms ticks
+
+fadeInChannelTimed :: Channel -> Chunk -> Int -> Int -> Int -> IO Int
+fadeInChannelTimed channel chunk loops ms ticks
+    = unwrapInt (/=(-1)) "Mix_FadeInChannelTimed"
+                (tryFadeInChannelTimed channel chunk loops ms ticks)
+
+
+-- void Mix_Pause(int channel)
+foreign import ccall unsafe "Mix_Pause" pause :: Channel -> IO ()
+
+-- void Mix_Resume(int channel)
+foreign import ccall unsafe "Mix_Resume" resume :: Channel -> IO ()
+
+-- int Mix_HaltChannel(int channel)
+foreign import ccall unsafe "Mix_HaltChannel" mixHaltChannel :: Int -> IO Int
+haltChannel :: Channel -> IO ()
+haltChannel channel = mixHaltChannel channel >> return ()
+
+-- int Mix_ExpireChannel(int channel, int ticks)
+foreign import ccall unsafe "Mix_ExpireChannel" expireChannel :: Channel -> Int -> IO Int
+
+-- int Mix_FadeOutChannel(int channel, int ms)
+foreign import ccall unsafe "Mix_FadeOutChannel" fadeOutChannel :: Channel -> Int -> IO Int
+
+-- int Mix_Playing(int channel)
+foreign import ccall unsafe "Mix_Playing" mixPlaying :: Int -> IO Int
+
+isChannelPlaying :: Channel -> IO Bool
+isChannelPlaying = fmap toBool . mixPlaying
+
+numChannelsPlaying :: IO Int
+numChannelsPlaying = mixPlaying (-1)
+
+-- int Mix_Paused(int channel)
+foreign import ccall unsafe "Mix_Paused" mixPaused :: Int -> IO Int
+
+isChannelPaused :: Channel -> IO Bool
+isChannelPaused = fmap toBool . mixPaused
+
+numChannelsPaused :: IO Int
+numChannelsPaused = mixPaused (-1)
+
+-- Mix_Fading Mix_FadingChannel(int which)
+foreign import ccall unsafe "Mix_FadingChannel" mixFadingChannel :: Int -> IO Int
+fadingChannel :: Channel -> IO Fading
+fadingChannel = fmap toEnum . mixFadingChannel
+
+-- Mix_Chunk *Mix_GetChunk(int channel)
+foreign import ccall unsafe "Mix_GetChunk" mixGetChunk :: Int -> IO (Ptr ChunkStruct)
+getChunk :: Channel -> IO Chunk
+getChunk ch = newForeignPtr_ =<< mixGetChunk ch
diff --git a/Graphics/UI/SDL/Mixer/General.hsc b/Graphics/UI/SDL/Mixer/General.hsc
new file mode 100644
--- /dev/null
+++ b/Graphics/UI/SDL/Mixer/General.hsc
@@ -0,0 +1,60 @@
+#include <SDL_mixer.h>
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.UI.SDL.Mixer.General
+-- Copyright   :  (c) David Himmelstrup 2005
+-- License     :  BSD-like
+--
+-- Maintainer  :  lemmih@gmail.com
+-- Stability   :  provisional
+-- Portability :  portable
+--
+-----------------------------------------------------------------------------
+module Graphics.UI.SDL.Mixer.General
+    ( AudioFormat (..)
+    , tryOpenAudio
+    , openAudio
+    , closeAudio
+    , tryQuerySpec
+    , querySpec
+    , defaultFrequency
+    ) where
+
+import Graphics.UI.SDL.General(unwrapMaybe, unwrapBool)
+import Graphics.UI.SDL.Audio(AudioFormat(..), fromAudioFormat, toAudioFormat)
+
+import Data.Word(Word16)
+import Foreign(Ptr, Storable(peek), alloca)
+
+defaultFrequency :: Int
+defaultFrequency = 22050
+
+-- int Mix_OpenAudio(int frequency, Uint16 format, int channels, int chunksize)
+foreign import ccall unsafe "Mix_OpenAudio" mixOpenAudio :: Int -> Word16 -> Int -> Int -> IO Int
+tryOpenAudio :: Int -> AudioFormat -> Int -> Int -> IO Bool
+tryOpenAudio frequency format channels chunksize
+    = fmap (0==) (mixOpenAudio frequency (fromAudioFormat format) channels chunksize)
+
+openAudio :: Int -> AudioFormat -> Int -> Int -> IO ()
+openAudio frequency format channels chunksize
+    = unwrapBool "Mix_OpenAudio" (tryOpenAudio frequency format channels chunksize)
+
+-- void Mix_CloseAudio()
+foreign import ccall unsafe "Mix_CloseAudio" closeAudio :: IO ()
+
+-- int Mix_QuerySpec(int *frequency, Uint16 *format, int *channels)
+foreign import ccall unsafe "Mix_QuerySpec" mixQuerySpec :: Ptr Int -> Ptr Word16 -> Ptr Int -> IO Int
+tryQuerySpec :: IO (Maybe (Int,AudioFormat,Int))
+tryQuerySpec
+    = alloca $ \freq ->
+      alloca $ \format ->
+      alloca $ \channels ->
+      do ret <- mixQuerySpec freq format channels
+         case ret of
+           0 -> return Nothing
+           _ -> do [f,c] <- mapM peek [freq,channels]
+                   fm <- peek format
+                   return (Just (f,toAudioFormat fm,c))
+
+querySpec :: IO (Int,AudioFormat,Int)
+querySpec = unwrapMaybe "Mix_QuerySpec" tryQuerySpec
diff --git a/Graphics/UI/SDL/Mixer/Music.hs b/Graphics/UI/SDL/Mixer/Music.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/UI/SDL/Mixer/Music.hs
@@ -0,0 +1,187 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.UI.SDL.Mixer.Music
+-- Copyright   :  (c) David Himmelstrup 2005
+-- License     :  BSD-like
+--
+-- Maintainer  :  lemmih@gmail.com
+-- Stability   :  provisional
+-- Portability :  portable
+--
+-----------------------------------------------------------------------------
+module Graphics.UI.SDL.Mixer.Music
+    ( freeMusic
+    , tryLoadMUS
+    , loadMUS
+    , tryPlayMusic
+    , playMusic
+    , tryFadeInMusic
+    , fadeInMusic
+    , tryFadeInMusicPos
+    , fadeInMusicPos
+    , setMusicVolume
+    , getMusicVolume
+    , modifyMusicVolume
+    , pauseMusic
+    , resumeMusic
+    , rewindMusic
+    , trySetMusicPosition
+    , setMusicPosition
+    , trySetMusicCmd
+    , setMusicCmd
+    , disableMusicCmd
+    , haltMusic
+    , tryFadeOutMusic
+    , fadeOutMusic
+    , getMusicType
+    , playingMusic
+    , pausedMusic
+    , fadingMusic
+    ) where
+
+
+import Foreign(Ptr, FunPtr, nullPtr, toBool, withForeignPtr, newForeignPtr)
+import Foreign.C(withCString, CString)
+
+import Graphics.UI.SDL.Mixer.Types(Fading, MusicType, Music, MusicStruct)
+import Graphics.UI.SDL.General(unwrapMaybe, unwrapBool)
+
+-- void Mix_FreeMusic(Mix_Music *music)
+foreign import ccall unsafe "&Mix_FreeMusic" mixFreeMusicFinal :: FunPtr (Ptr MusicStruct -> IO ())
+
+mkFinalizedMusic :: Ptr MusicStruct -> IO Music
+mkFinalizedMusic = newForeignPtr mixFreeMusicFinal
+
+foreign import ccall unsafe "Mix_FreeMusic" mixFreeMusic :: Ptr MusicStruct -> IO ()
+freeMusic :: Music -> IO ()
+freeMusic music = withForeignPtr music mixFreeMusic
+
+-- Mix_Music *Mix_LoadMUS(const char *file)
+foreign import ccall unsafe "Mix_LoadMUS" mixLoadMUS :: CString -> IO (Ptr MusicStruct)
+tryLoadMUS :: FilePath -> IO (Maybe Music)
+tryLoadMUS path
+    = withCString path $ \cPath ->
+      do music <- mixLoadMUS cPath
+         if music == nullPtr
+            then return Nothing
+            else fmap Just (mkFinalizedMusic music)
+
+loadMUS :: FilePath -> IO Music
+loadMUS = unwrapMaybe "Mix_LoadMUS" . tryLoadMUS
+
+-- int Mix_PlayMusic(Mix_Music *music, int loops)
+foreign import ccall unsafe "Mix_PlayMusic" mixPlayMusic :: Ptr MusicStruct -> Int -> IO Int
+tryPlayMusic :: Music -> Int -> IO Bool
+tryPlayMusic music loops
+    = withForeignPtr music $ \musicPtr ->
+      fmap (==0) (mixPlayMusic musicPtr loops)
+
+playMusic :: Music -> Int -> IO ()
+playMusic music loops = unwrapBool "Mix_PlayMusic" (tryPlayMusic music loops)
+
+tryFadeInMusic :: Music -> Int -> Int -> IO Bool
+tryFadeInMusic music loops ms
+    = tryFadeInMusicPos music loops ms 0
+
+fadeInMusic :: Music -> Int -> Int -> IO ()
+fadeInMusic music loops ms
+    = fadeInMusicPos music loops ms 0
+
+-- int Mix_FadeInMusicPos(Mix_Music *music, int loops, int ms, double position)
+foreign import ccall unsafe "Mix_FadeInMusicPos" mixFadeInMusicPos
+    :: Ptr MusicStruct -> Int -> Int -> Double -> IO Int
+tryFadeInMusicPos :: Music -> Int -> Int -> Double -> IO Bool
+tryFadeInMusicPos music loops ms pos
+    = withForeignPtr music $ \musicPtr ->
+      fmap (==0) (mixFadeInMusicPos musicPtr loops ms pos)
+
+fadeInMusicPos :: Music -> Int -> Int -> Double -> IO ()
+fadeInMusicPos music loops ms pos
+    = unwrapBool "Mix_FadeInMusic" (tryFadeInMusicPos music loops ms pos)
+
+-- int Mix_VolumeMusic(int volume)
+foreign import ccall unsafe "Mix_VolumeMusic" mixVolumeMusic :: Int -> IO Int
+
+setMusicVolume :: Int -> IO ()
+setMusicVolume volume = mixVolumeMusic volume >> return ()
+
+getMusicVolume :: IO Int
+getMusicVolume = mixVolumeMusic (-1)
+
+modifyMusicVolume :: (Int -> Int) -> IO ()
+modifyMusicVolume fn = getMusicVolume >>= setMusicVolume . fn
+
+-- void Mix_PauseMusic()
+foreign import ccall unsafe "Mix_PauseMusic" pauseMusic :: IO ()
+
+-- void Mix_ResumeMusic()
+foreign import ccall unsafe "Mix_ResumeMusic" resumeMusic :: IO ()
+
+-- void Mix_RewindMusic()
+foreign import ccall unsafe "Mix_RewindMusic" rewindMusic :: IO ()
+
+-- int Mix_SetMusicPosition(double position)
+foreign import ccall unsafe "Mix_SetMusicPosition" mixSetMusicPosition :: Double -> IO Int
+
+trySetMusicPosition :: Double -> IO Bool
+trySetMusicPosition = fmap (==0) . mixSetMusicPosition
+
+setMusicPosition :: Double -> IO ()
+setMusicPosition = unwrapBool "Mix_SetMusicPosition" . trySetMusicPosition
+
+-- int Mix_SetMusicCMD(const char *command)
+foreign import ccall unsafe "Mix_SetMusicCMD" mixSetMusicCmd :: CString -> IO Int
+
+trySetMusicCmd :: String -> IO Bool
+trySetMusicCmd cmd
+    = withCString cmd $ \cString ->
+      fmap (==0) (mixSetMusicCmd cString)
+
+setMusicCmd :: String -> IO ()
+setMusicCmd cmd = unwrapBool "Mix_SetMusicCMD" (trySetMusicCmd cmd)
+
+disableMusicCmd :: IO ()
+disableMusicCmd = mixSetMusicCmd nullPtr >> return ()
+
+-- int Mix_HaltMusic()
+foreign import ccall unsafe "Mix_HaltMusic" mixHaltMusic :: IO Int
+haltMusic :: IO ()
+haltMusic = mixHaltMusic >> return ()
+
+-- int Mix_FadeOutMusic(int ms)
+foreign import ccall unsafe "Mix_FadeOutMusic" mixFadeOutMusic :: Int -> IO Int
+tryFadeOutMusic :: Int -> IO Bool
+tryFadeOutMusic ms = fmap (==1) (mixFadeOutMusic ms)
+
+fadeOutMusic :: Int -> IO ()
+fadeOutMusic ms = unwrapBool "Mix_FadeOutMusic" (tryFadeOutMusic ms)
+
+-- Mix_MusicType Mix_GetMusicType(const Mix_Music *music)
+foreign import ccall unsafe "Mix_GetMusicType" mixGetMusicType :: Ptr MusicStruct -> IO Int
+
+getMusicType :: Maybe Music -> IO MusicType
+getMusicType mbMusic
+    = withMusic mbMusic $ \musicPtr ->
+      fmap toEnum (mixGetMusicType musicPtr)
+    where withMusic Nothing action = action nullPtr
+          withMusic (Just music) action = withForeignPtr music action
+
+-- int Mix_PlayingMusic()
+foreign import ccall unsafe "Mix_PlayingMusic" mixPlayingMusic :: IO Int
+
+playingMusic :: IO Bool
+playingMusic = fmap toBool mixPlayingMusic
+
+-- int Mix_PausedMusic()
+foreign import ccall unsafe "Mix_PausedMusic" mixPausedMusic :: IO Int
+
+pausedMusic :: IO Bool
+pausedMusic = fmap toBool mixPausedMusic
+
+-- Mix_Fading Mix_FadingMusic()
+foreign import ccall unsafe "Mix_FadingMusic" mixFadingMusic :: IO Int
+
+fadingMusic :: IO Fading
+fadingMusic = fmap toEnum mixFadingMusic
+
+
diff --git a/Graphics/UI/SDL/Mixer/Samples.hs b/Graphics/UI/SDL/Mixer/Samples.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/UI/SDL/Mixer/Samples.hs
@@ -0,0 +1,51 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.UI.SDL.Mixer.Samples
+-- Copyright   :  (c) David Himmelstrup 2005
+-- License     :  BSD-like
+--
+-- Maintainer  :  lemmih@gmail.com
+-- Stability   :  provisional
+-- Portability :  portable
+--
+-----------------------------------------------------------------------------
+module Graphics.UI.SDL.Mixer.Samples
+    ( mkFinalizedChunk
+    , maxVolume
+    , tryLoadWAV
+    , loadWAV
+    , volumeChunk
+    ) where
+
+import Foreign(Ptr, FunPtr, nullPtr, withForeignPtr, newForeignPtr)
+import Foreign.C(withCString, CString)
+
+import Graphics.UI.SDL.Mixer.Types(Chunk, ChunkStruct)
+import Graphics.UI.SDL.General(unwrapMaybe)
+
+maxVolume :: Int
+maxVolume = 128
+
+-- void Mix_FreeChunk(Mix_Chunk *chunk)
+foreign import ccall unsafe "&Mix_FreeChunk" mixFreeChunkFinal :: FunPtr (Ptr ChunkStruct -> IO ())
+mkFinalizedChunk :: Ptr ChunkStruct -> IO Chunk
+mkFinalizedChunk = newForeignPtr mixFreeChunkFinal
+
+-- Mix_Chunk *Mix_LoadWAV(char *file)
+foreign import ccall unsafe "Mix_LoadWAV" mixLoadWAV :: CString -> IO (Ptr ChunkStruct)
+tryLoadWAV :: FilePath -> IO (Maybe Chunk)
+tryLoadWAV string
+    = withCString string $ \cString ->
+      do chunk <- mixLoadWAV cString
+         if chunk == nullPtr
+            then return Nothing
+            else fmap Just (mkFinalizedChunk chunk)
+
+loadWAV :: FilePath -> IO Chunk
+loadWAV path = unwrapMaybe "Mix_LoadWAV" (tryLoadWAV path)
+
+-- int Mix_VolumeChunk(Mix_Chunk *chunk, int volume)
+foreign import ccall unsafe "Mix_VolumeChunk" mixVolumeChunk :: Ptr ChunkStruct -> Int -> IO Int
+volumeChunk :: Chunk -> Int -> IO Int
+volumeChunk chunk volume = withForeignPtr chunk (\ptr -> mixVolumeChunk ptr volume)
+
diff --git a/Graphics/UI/SDL/Mixer/Types.hs b/Graphics/UI/SDL/Mixer/Types.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/UI/SDL/Mixer/Types.hs
@@ -0,0 +1,46 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.UI.SDL.Mixer.Types
+-- Copyright   :  (c) David Himmelstrup 2005
+-- License     :  BSD-like
+--
+-- Maintainer  :  lemmih@gmail.com
+-- Stability   :  provisional
+-- Portability :  portable
+--
+-----------------------------------------------------------------------------
+module Graphics.UI.SDL.Mixer.Types
+    ( ChunkStruct
+    , Chunk
+    , MusicStruct
+    , Music
+    , Channel
+    , MusicType (..)
+    , Fading (..)
+    ) where
+
+import Foreign(ForeignPtr)
+
+data ChunkStruct
+type Chunk = ForeignPtr ChunkStruct
+
+data MusicStruct
+type Music = ForeignPtr MusicStruct
+
+type Channel = Int
+
+data MusicType
+    = MusicNone
+    | MusicCmd
+    | MusicWav
+    | MusicMod
+    | MusicMid
+    | MusicOgg
+    | MusicMp3
+      deriving (Show,Eq,Ord,Enum,Bounded)
+
+data Fading
+    = NoFading
+    | FadingOut
+    | FadingIn
+      deriving (Show,Eq,Ord,Enum,Bounded)
diff --git a/Graphics/UI/SDL/Mixer/Version.hsc b/Graphics/UI/SDL/Mixer/Version.hsc
new file mode 100644
--- /dev/null
+++ b/Graphics/UI/SDL/Mixer/Version.hsc
@@ -0,0 +1,32 @@
+#include "SDL_mixer.h"
+module Graphics.UI.SDL.Mixer.Version
+    ( compiledFor
+    , linkedWith
+    ) where
+
+import Data.Version (Version(Version))
+
+import Foreign (Word8, Ptr, Storable(sizeOf, alignment, peekByteOff, peek))
+
+data SDLVersion
+    = SDLVersion Word8 Word8 Word8
+
+instance Storable SDLVersion where
+    sizeOf _ = #{size SDL_version}
+    alignment _ = 1
+    peek ptr = do major <- #{peek SDL_version, major} ptr
+                  minor <- #{peek SDL_version, minor} ptr
+                  patch <- #{peek SDL_version, patch} ptr
+                  return (SDLVersion major minor patch)
+
+compiledFor :: Version
+compiledFor = Version [ #{const SDL_MIXER_MAJOR_VERSION}
+                      , #{const SDL_MIXER_MINOR_VERSION}
+                      , #{const SDL_MIXER_PATCHLEVEL}
+                      ] []
+
+foreign import ccall unsafe "Mix_Linked_Version" sdlLinkedVersion :: IO (Ptr SDLVersion)
+linkedWith :: IO Version
+linkedWith = do versionPtr <- sdlLinkedVersion
+                SDLVersion major minor patch <- peek versionPtr
+                return (Version (map fromIntegral [major,minor,patch]) [])
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,35 @@
+Copyright (c) 2004-2006, David Himmelstrup
+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 David Himmelstrup 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/SDL-mixer.cabal b/SDL-mixer.cabal
new file mode 100644
--- /dev/null
+++ b/SDL-mixer.cabal
@@ -0,0 +1,20 @@
+Name: SDL-mixer
+Version: 0.4.0
+Maintainer: Lemmih (lemmih@gmail.com)
+Author: Lemmih (lemmih@gmail.com)
+Copyright: 2004-2005, Lemmih
+License-File: LICENSE
+Build-Depends: base, SDL
+Category: Foreign binding
+Synopsis: Binding to libSDL_mixer
+Extensions: ForeignFunctionInterface
+Exposed-Modules:
+  Graphics.UI.SDL.Mixer.General,
+  Graphics.UI.SDL.Mixer.Samples,
+  Graphics.UI.SDL.Mixer.Channels,
+  Graphics.UI.SDL.Mixer.Music,
+  Graphics.UI.SDL.Mixer.Types,
+  Graphics.UI.SDL.Mixer.Version,
+  Graphics.UI.SDL.Mixer
+Includes: SDL.h SDL_mixer.h
+GHC-Options: -fglasgow-exts -O2 -fvia-c -Wall -Werror
diff --git a/Setup.lhs b/Setup.lhs
new file mode 100644
--- /dev/null
+++ b/Setup.lhs
@@ -0,0 +1,5 @@
+#!/usr/bin/env runhaskell
+> module Main where
+> import Distribution.Simple
+> main :: IO ()
+> main = defaultMainWithHooks defaultUserHooks
