diff --git a/include/ZE_Defines.h b/include/ZE_Defines.h
index 147f829..0e49fa6 100644
--- a/include/ZE_Defines.h
+++ b/include/ZE_Defines.h
@@ -19,6 +19,6 @@
 
 #define USE_SDL_TTF
 #define USE_SDL_IMAGE
-#define USE_SDL_MIXER
+#define USE_AUDIERE
 
 #endif //__ze_defines_h__
diff --git a/include/ZE_Includes.h b/include/ZE_Includes.h
index 1163041..6844e8b 100644
--- a/include/ZE_Includes.h
+++ b/include/ZE_Includes.h
@@ -23,8 +23,8 @@
 #ifdef USE_SDL_TTF
 #include "SDL_ttf.h"
 #endif
-#ifdef USE_SDL_MIXER
-#include "SDL_mixer.h"
+#ifdef USE_AUDIERE
+#include "audiere.h"
 #endif
 
 #include "zlib/unzip.h"
diff --git a/include/ZE_Utility.h b/include/ZE_Utility.h
index 716f860..803287c 100755
--- a/include/ZE_Utility.h
+++ b/include/ZE_Utility.h
@@ -27,11 +27,6 @@ GLuint SurfaceToTexture(SDL_Surface *surface, GLfloat *texcoord);
 
 void FreeImage(SDL_Surface *&image);
 
-#ifdef USE_SDL_MIXER
-void FreeSound(Mix_Chunk *&chunk);
-void FreeMusic(Mix_Music *&music);
-#endif
-
 #ifdef USE_SDL_TTF
 void FreeFont(TTF_Font *&font);
 #endif
diff --git a/include/ZE_ZEngine.h b/include/ZE_ZEngine.h
index dec1910..602b604 100644
--- a/include/ZE_ZEngine.h
+++ b/include/ZE_ZEngine.h
@@ -24,12 +24,12 @@ class ZRect;
 
 enum ZErrorSeverity
 {
-    ZERR_NOTE,
     ZERR_VERBOSE,
     ZERR_DEPRECIATED,
     ZERR_WARNING,
     ZERR_ERROR,
-    ZERR_CRITICAL
+    ZERR_CRITICAL,
+    ZERR_NOTE
 };
 
 enum ZErrorLogStyle
@@ -44,7 +44,7 @@ class ZEngine
     public:
         static VersionInfo Version;
 
-    private:        
+    private:
         static ZEngine *sInstance;
         SDL_Surface *mScreen;
         bool mFullscreen;
@@ -64,17 +64,15 @@ class ZEngine
         int mMouseX;
         int mMouseY;
         Uint8 mMouseB;
-        ZErrorLogStyle mLogStyle;
-        std::FILE *mErrlog;
         SDL_EventFilter mEventFilter;
+        ZErrorLogStyle mLogStyle;
+        ZErrorSeverity mMinSeverity;
+        std::FILE *mErrlog;
         ZRandGen mRandGen;
         TiXmlDocument rZRF;
-
-#ifdef USE_SDL_MIXER 
-        bool mSoundInitialized;
-        int mSoundRate;
-        bool mStereo;
-#endif 
+#ifdef USE_AUDIERE
+        audiere::AudioDevicePtr mAudiereDevice;
+#endif //USE_AUDIERE
 
         ZEngine();
 
@@ -84,14 +82,14 @@ class ZEngine
         static ZEngine* GetInstance();
         static void ReleaseInstance();
 
-        bool CreateDisplay(int width, int height, int bpp, bool fullscreen, std::string title="ZEngine Application", 
-            int soundRate=22050, bool stereo=false, std::string icon="");
+        void InitErrorLog(ZErrorLogStyle logStyle=ZLOG_HTML, std::string logFile="errlog.html", ZErrorSeverity severityFilter=ZERR_VERBOSE);
+        bool InitSound();
+        bool CreateDisplay(int width, int height, int bpp, bool fullscreen, std::string title="ZEngine Application", std::string icon="");
         void CloseDisplay();
         void ToggleFullscreen();
 
-        SDL_Surface* Display();
         void Update();
-        void Clear(Uint8 red=0, Uint8 green=0, Uint8 blue=0, Uint8 alpha=255);
+        void ClearDisplay(Uint8 red=0, Uint8 green=0, Uint8 blue=0);
 
 #if (GFX_BACKEND == ZE_OGL)       
         void SetGL2D();
@@ -103,14 +101,14 @@ class ZEngine
         void UnpauseTimer();
         bool TimerIsPaused();
 
-        double GetFrameTime();
+        double GetFrameSpeed();
         double GetFramerate();
         
         bool IsActive();
 
         void RequestQuit();
         bool QuitRequested();
-        
+
         void SetReloadNeed(bool state);
         bool ImagesNeedReload();
 
@@ -129,7 +127,6 @@ class ZEngine
         void CheckEvents();
         void SetEventFilter(SDL_EventFilter filter);
         
-        void SetErrorLog(ZErrorLogStyle logStyle, std::string logFile);
         void ReportError(ZErrorSeverity type, std::string desc, ...);        
         void WriteLog(std::string str, ...);
 
@@ -147,6 +144,10 @@ class ZEngine
         int GetIntResource(std::string type, std::string id, std::string element);       
         double GetDoubleResource(std::string type, std::string id, std::string element);
 
+#ifdef USE_AUDIERE
+        audiere::AudioDevicePtr GetSoundDevice();
+#endif //USE_AUDIERE
+        SDL_Surface* GetDisplayPointer();
         bool DisplayCreated();
         int DisplayWidth();
         int DisplayHeight();
diff --git a/include/ZE_ZMusic.h b/include/ZE_ZMusic.h
index 8223652..bbcbf7e 100644
--- a/include/ZE_ZMusic.h
+++ b/include/ZE_ZMusic.h
@@ -12,42 +12,23 @@
 #define __ze_zmusic_h__
 
 #include "ZE_ZEngine.h"
+#include "ZE_ZSoundBase.h"
 
-#ifdef USE_SDL_MIXER
+#ifdef USE_AUDIERE
 
 namespace ZE
 {
-class ZMusic
+
+class ZMusic : public ZSoundBase
 {
-    protected:
-        ZEngine* rEngine;
-        Mix_Music *rMusic;
     public:
-        static const int LoopInfinite;
-        
         ZMusic();
         ZMusic(std::string filename);
-        virtual ~ZMusic();
-        
         void Open(std::string filename);
-        void OpenFromZRF(std::string resourceId);
-        
-        void Release();
-        void Play(int loopNum=0, int fadeTime=0) const;
-        void Pause() const;
-        void Unpause() const;
-        void Rewind() const;
-        void Stop(int fadeTime=0) const;
-        void SetVolume(int volume);
-
-        bool IsLoaded() const;
-        bool IsPlaying() const;
-        bool IsPaused() const;
-        int GetVolume() const;
 };
 
 }
 
-#endif //USE_SDL_MIXER
+#endif //USE_AUDIERE
 
 #endif //__ze_zmusic_h__
diff --git a/include/ZE_ZSound.h b/include/ZE_ZSound.h
index fab1dda..0606ba0 100644
--- a/include/ZE_ZSound.h
+++ b/include/ZE_ZSound.h
@@ -2,7 +2,7 @@
         This file is Part of the ZEngine Library for 2D game development.
                   Copyright (C) 2002-2004 James Turk
 
-                     Licensed under a BSD-style license.
+                   Licensed under a BSD-style license.
 
     The maintainer of this library is James Turk (james@conceptofzero.net) 
      and the home of this Library is http://www.zengine.sourceforge.net
@@ -12,45 +12,23 @@
 #define __ze_zsound_h__
 
 #include "ZE_ZEngine.h"
+#include "ZE_ZSoundBase.h"
 
-#ifdef USE_SDL_MIXER
+#ifdef USE_AUDIERE
 
 namespace ZE
 {
 
-class ZSound
+class ZSound : public ZSoundBase
 {
-    protected:
-        ZEngine* rEngine;
-        Mix_Chunk* rSound;
-        int rChannelID;
-
     public:
-        static const int LoopInfinite;
-
         ZSound();
         ZSound(std::string filename);
-        virtual ~ZSound();
-
         void Open(std::string filename);
-        void OpenFromZip(std::string zipname, std::string filename);
-        void OpenFromZRF(std::string resourceId);
-        void Release();
-
-        void Play(int loopNum=0, int fadeTime=0);
-        void Pause() const;
-        void Unpause() const;
-        void Stop(int fadeTime=0) const;
-        void SetVolume(int volume);
-
-        bool IsLoaded() const;
-        bool IsPlaying() const;
-        bool IsPaused() const;
-        int GetVolume() const;
 };
 
 }
 
-#endif //USE_SDL_MIXER
+#endif //USE_AUDIERE
 
-#endif //__ze_zsound_h__
+#endif //__ze_zsound_h__
\ No newline at end of file
diff --git a/include/ZE_ZSoundBase.h b/include/ZE_ZSoundBase.h
new file mode 100644
index 0000000..7ad11cd
--- /dev/null
+++ b/include/ZE_ZSoundBase.h
@@ -0,0 +1,57 @@
+/*******************************************************************************
+        This file is Part of the ZEngine Library for 2D game development.
+                  Copyright (C) 2002-2004 James Turk
+
+                     Licensed under a BSD-style license.
+
+    The maintainer of this library is James Turk (james@conceptofzero.net) 
+     and the home of this Library is http://www.zengine.sourceforge.net
+*******************************************************************************/
+
+#ifndef __ze_zsoundbase_h__
+#define __ze_zsoundbase_h__
+
+#include "ZE_ZEngine.h"
+
+#ifdef USE_AUDIERE
+
+namespace ZE
+{
+
+class ZSoundBase
+{
+    protected:
+        //ZEngine* rEngine;
+        audiere::AudioDevicePtr rDevice;
+        audiere::OutputStreamPtr rStream;
+
+    public:
+        ZSoundBase();
+        virtual ~ZSoundBase();
+
+        virtual void Open(std::string filename)=0;
+
+        void Play(bool loop=false);
+        void Stop();
+
+        void SetVolume(float volume);
+        void SetPan(float pan);
+        void SetPitch(float pitch);
+        void SetPosition(int position);
+        void SetPosition(float posPercent);
+
+        bool IsLoaded() const;
+        bool IsPlaying() const;
+        bool IsSeekable() const;
+        float GetVolume() const;
+        float GetPan() const;
+        float GetPitch() const;
+        int GetPosition() const;
+        int GetLength() const;
+};
+
+}
+
+#endif //USE_AUDIERE
+
+#endif //__ze_zsound_h__
diff --git a/include/ZEngine.h b/include/ZEngine.h
index 0da6f3d..e4c694b 100644
--- a/include/ZEngine.h
+++ b/include/ZEngine.h
@@ -15,7 +15,7 @@
 #ifdef USE_SDL_TTF
 #include "ZE_ZFont.h"
 #endif
-#ifdef USE_SDL_MIXER
+#ifdef USE_AUDIERE
 #include "ZE_ZSound.h"
 #include "ZE_ZMusic.h"
 #endif
diff --git a/src/ZE_Utility.cpp b/src/ZE_Utility.cpp
index 7689ba6..29390b8 100755
--- a/src/ZE_Utility.cpp
+++ b/src/ZE_Utility.cpp
@@ -157,28 +157,6 @@ void FreeImage(SDL_Surface *&image)
     }
 }
 
-#ifdef USE_SDL_MIXER
-
-void FreeSound(Mix_Chunk *&chunk)
-{
-    if(chunk)
-    {
-        Mix_FreeChunk(chunk);
-        chunk = NULL;
-    }
-}
-
-void FreeMusic(Mix_Music *&music)
-{
-    if(music)
-    {
-        Mix_FreeMusic(music);
-        music = NULL;
-    }
-}
-
-#endif 
-
 #ifdef USE_SDL_TTF
 
 void FreeFont(TTF_Font *&font)
diff --git a/src/ZE_ZEngine.cpp b/src/ZE_ZEngine.cpp
index 02cc6c7..85ed5ad 100644
--- a/src/ZE_ZEngine.cpp
+++ b/src/ZE_ZEngine.cpp
@@ -24,7 +24,8 @@ ZEngine::ZEngine() :
     mSecPerFrame(0.0),
     mNeedReload(false), mActive(false), mQuit(false), mKeyIsPressed(NULL),
     mMouseX(0), mMouseY(0), mMouseB(0),
-    mLogStyle(ZLOG_TEXT), mErrlog(stderr), mEventFilter(NULL)
+    mEventFilter(NULL),
+    mLogStyle(ZLOG_NONE), mMinSeverity(ZERR_NOTE), mErrlog(NULL)
 {
     for(int k = 0; k < SDLK_LAST; ++k)
         mKeyPress[k] = false;
@@ -83,10 +84,50 @@ void ZEngine::ReleaseInstance()
     sInstance = NULL;
 }
 
-bool ZEngine::CreateDisplay(int width, int height, int bpp, bool fullscreen, std::string title, 
-            int soundRate, bool stereo, std::string icon)
+void ZEngine::InitErrorLog(ZErrorLogStyle logStyle, std::string logFile, ZErrorSeverity minSeverity)
+{
+    mMinSeverity = minSeverity;
+    mLogStyle = logStyle;
+
+    if(logStyle != ZLOG_NONE && logFile.length())
+    {
+        //stderr & stdout directed to their appropriate streams
+        if(logFile == "stderr")
+            mErrlog = stderr;
+        else if(logFile == "stdout")
+            mErrlog = stdout;
+        else
+            mErrlog = std::fopen(logFile.c_str(),"w");
+
+        if(logStyle == ZLOG_HTML)
+        {
+            fprintf(mErrlog,
+                "
ZEngine Error Log\n\n\n\n");
+            fflush(mErrlog);
+        }
+    }
+}
+
+bool ZEngine::InitSound()
+{
+    mAudiereDevice = audiere::OpenDevice();
+    if(!mAudiereDevice)
+    {
+        ReportError(ZERR_CRITICAL,"Failed to initialize sound, AudiereDevice creation failed.");
+    }
+    return (mAudiereDevice != NULL);
+}
+
+bool ZEngine::CreateDisplay(int width, int height, int bpp, bool fullscreen, std::string title, std::string icon)
 {
-    Uint32 sdlFlags=SDL_INIT_VIDEO|SDL_INIT_TIMER;
     Uint32 vidFlags=0;
     SDL_Surface *iconImg;
     bool status=true;   //status of setup, only true if everything went flawlessly
@@ -99,26 +140,12 @@ bool ZEngine::CreateDisplay(int width, int height, int bpp, bool fullscreen, std
 
     if(!mInitialized)
     {
-        //audio only initialized if soundRate != 0
-        if(soundRate)
-            sdlFlags |= SDL_INIT_AUDIO;
-        if(SDL_Init(sdlFlags) < 0) 
+        if(SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER) < 0)
         {
             ReportError(ZERR_CRITICAL,"Error initializing SDL: %s",SDL_GetError());
             return false;   //return now, nothing else should be called
         }
     }
-    
-#ifdef USE_SDL_MIXER
-    if(!mInitialized)
-    {
-        if(Mix_OpenAudio(soundRate, AUDIO_S16SYS, stereo?2:1, 4096) < 0)  //Open Audio (Stereo?2:1 is conditional for number of channels)
-        {
-            ReportError(ZERR_ERROR,"Error initializing SDL_mixer: %s",SDL_GetError());
-            status = false;
-        }
-    }
-#endif //USE_SDL_MIXER
 
     //set vidFlags and bpp//
     if(mFullscreen)
@@ -204,9 +231,6 @@ bool ZEngine::CreateDisplay(int width, int height, int bpp, bool fullscreen, std
     {
         ReportError(ZERR_CRITICAL,"Error creating display: Unknown Error. %dx%d %dBPP (%s)", width, height, bpp, SDL_GetError());
 
-#ifdef USE_SDL_MIXER
-        Mix_CloseAudio();
-#endif
         SDL_Quit();
 
         return false;   //bail if display fails
@@ -246,10 +270,6 @@ void ZEngine::CloseDisplay()
         TTF_Quit();
 #endif
 
-#ifdef USE_SDL_MIXER
-        Mix_CloseAudio();
-#endif
-
         SDL_Quit();
 
         if(mErrlog && mErrlog != stderr && mErrlog != stdin)
@@ -269,11 +289,6 @@ void ZEngine::ToggleFullscreen()
     SetReloadNeed(true);    //images need to be reloaded on fullscreen swap
 }
 
-SDL_Surface *ZEngine::Display()
-{
-    return mScreen;
-}
-
 void ZEngine::Update()
 {
 #if (GFX_BACKEND == ZE_OGL)
@@ -289,10 +304,9 @@ void ZEngine::Update()
 
 #if (GFX_BACKEND == ZE_OGL)
 
-void ZEngine::Clear(Uint8 red, Uint8 green, Uint8 blue, Uint8 alpha)
+void ZEngine::ClearDisplay(Uint8 red, Uint8 green, Uint8 blue)
 {
-    GLclampf r = red/255.0f, g = green/255.0f, b = blue/255.0f, a = alpha/255.0f;
-    glClearColor(r,g,b,a);
+    glClearColor(red/255.0f,green/255.0f,blue/255.0f,1.0f);
     glClear(GL_COLOR_BUFFER_BIT);
     glLoadIdentity();
 }
@@ -369,7 +383,7 @@ bool ZEngine::TimerIsPaused()
     return mPaused;
 }
 
-double ZEngine::GetFrameTime()
+double ZEngine::GetFrameSpeed()
 {
     return mSecPerFrame;
 }
@@ -537,55 +551,24 @@ void ZEngine::SetEventFilter(SDL_EventFilter filter)
     mEventFilter = filter;
 }
 
-void ZEngine::SetErrorLog(ZErrorLogStyle logStyle, std::string logFile)
-{
-    mLogStyle = logStyle;
-
-    if(logStyle != ZLOG_NONE && logFile.length())
-    {
-        //stderr & stdout directed to their appropriate streams
-        if(logFile == "stderr")
-            mErrlog = stderr;
-        else if(logFile == "stdout")
-            mErrlog = stdout;
-        else
-            mErrlog = std::fopen(logFile.c_str(),"w");
-
-        if(logStyle == ZLOG_HTML)
-        {
-            fprintf(mErrlog,
-                "ZEngine Error Log\n\n\n\n");
-            fflush(mErrlog);
-        }
-    }
-}
-
 void ZEngine::ReportError(ZErrorSeverity severity, std::string desc, ...)
 {
     static std::string prefix[] = { 
-        " ",
         "VERBOSE: ",
         "DEPRECIATED: ",
         "WARNING: ",
         "ERROR: ",
         "CRITICAL: "
+        " ",
     };
 
     static std::string style[] = { 
-        "note",
         "verbose",
         "depr",
         "warning",
         "error",
-        "critical"
+        "critical",
+        "note"
     };
 
     if(mLogStyle != ZLOG_NONE)
@@ -715,6 +698,16 @@ double ZEngine::GetDoubleResource(std::string type, std::string id, std::string
     return ret;
 }
 
+audiere::AudioDevicePtr ZEngine::GetSoundDevice()
+{
+    return mAudiereDevice;
+}
+
+SDL_Surface *ZEngine::GetDisplayPointer()
+{
+    return mScreen;
+}
+
 bool ZEngine::DisplayCreated()
 {
     return mInitialized;
diff --git a/src/ZE_ZMusic.cpp b/src/ZE_ZMusic.cpp
index 10d6008..6ce6121 100644
--- a/src/ZE_ZMusic.cpp
+++ b/src/ZE_ZMusic.cpp
@@ -10,156 +10,25 @@
 
 #include "ZE_ZMusic.h"
 
-#ifdef USE_SDL_MIXER
+#ifdef USE_AUDIERE
 
 namespace ZE
 {
 
-//ZMusic is a very simple class, each call basically wraps a self-explanatory function of SDL_Mixer
-const int ZMusic::LoopInfinite = -1;    //constant for infinite, as used by SDL_Mixer
-
-ZMusic::ZMusic() : 
-    rEngine(ZEngine::GetInstance()),
-    rMusic(NULL)
+ZMusic::ZMusic()
 {
 }
 
-ZMusic::ZMusic(std::string filename) : 
-    rEngine(ZEngine::GetInstance()),
-    rMusic(NULL)
+ZMusic::ZMusic(std::string filename) : ZSoundBase()
 {
     Open(filename);
 }
 
-ZMusic::~ZMusic()
-{
-    Release();
-}
-
 void ZMusic::Open(std::string filename)
 {
-    Release();
-
-    rMusic = Mix_LoadMUS(filename.c_str());
-
-    if(!rMusic)
-        rEngine->ReportError(ZERR_WARNING,"Could not load %s",filename.c_str());
-}
-
-void ZMusic::OpenFromZRF(std::string resourceId)
-{
-    std::string filename = rEngine->GetStringResource("music",resourceId,"filename");
-    if(filename.length())
-        Open(filename);
-    else
-        rEngine->ReportError(ZERR_WARNING,"Failed to load music resource '%s'",resourceId.c_str());
-}
-
-void ZMusic::Release()
-{
-    Mix_HaltMusic();
-    FreeMusic(rMusic);
-}
-
-void ZMusic::Play(int loopNum, int fadeTime) const
-{
-    if(Mix_PlayingMusic())    //stop currently playing music
-        Mix_HaltMusic();
-
-    if(rMusic)
-    {
-        if(fadeTime)
-            Mix_FadeInMusic(rMusic, loopNum, fadeTime);
-        else
-            Mix_PlayMusic(rMusic, loopNum);
-    }
-    else
-        rEngine->ReportError(ZERR_VERBOSE,"Called ZMusic::Play with no music loaded.");
-}
-
-void ZMusic::Pause() const
-{
-    if(rMusic)
-        Mix_PauseMusic();
-    else
-        rEngine->ReportError(ZERR_VERBOSE,"Called ZMusic::Pause with no music loaded.");
-}
-
-void ZMusic::Unpause() const
-{
-    if(rMusic)
-        Mix_ResumeMusic();
-    else
-        rEngine->ReportError(ZERR_VERBOSE,"Called ZMusic::Unpause with no music loaded.");
-}
-
-void ZMusic::Rewind() const
-{
-    if(rMusic)
-        Mix_RewindMusic();
-    else
-        rEngine->ReportError(ZERR_VERBOSE,"Called ZMusic::Rewind with no music loaded.");
-}
-
-void ZMusic::Stop(int fadeTime) const
-{
-    if(rMusic)
-    {
-        if(fadeTime)
-            Mix_FadeOutMusic(fadeTime);
-        else
-            Mix_HaltMusic();
-    }
-    else
-        rEngine->ReportError(ZERR_VERBOSE,"Called ZMusic::Stop with no music loaded.");
-}
-
-void ZMusic::SetVolume(int volume)
-{
-    if(rMusic)
-        Mix_VolumeMusic(volume);
-    else
-        rEngine->ReportError(ZERR_VERBOSE,"Called ZMusic::SetVolume with no music loaded.");
-}
-
-bool ZMusic::IsLoaded() const
-{
-    return rMusic != NULL;
-}
-
-bool ZMusic::IsPlaying() const
-{
-    if(rMusic)
-        return Mix_PlayingMusic() > 0;
-    else
-    {
-        rEngine->ReportError(ZERR_VERBOSE,"Called ZMusic::IsPlaying with no music loaded.");
-        return false;
-    }
-}
-
-bool ZMusic::IsPaused() const
-{
-    if(rMusic)
-        return Mix_PausedMusic() > 0;
-    else
-    {
-        rEngine->ReportError(ZERR_VERBOSE,"Called ZMusic::IsPaused with no music loaded.");
-        return false;
-    }
-}
-
-int ZMusic::GetVolume() const
-{
-    if(rMusic)
-        return Mix_VolumeMusic(-1);
-    else
-    {
-        rEngine->ReportError(ZERR_VERBOSE,"Called ZMusic::GetVolume with no music loaded.");
-        return false;
-    }
+    rStream = audiere::OpenSound(rDevice, filename.c_str(), true);
 }
 
 }
 
-#endif 
+#endif
diff --git a/src/ZE_ZSound.cpp b/src/ZE_ZSound.cpp
index 34fe9e8..638f30e 100644
--- a/src/ZE_ZSound.cpp
+++ b/src/ZE_ZSound.cpp
@@ -9,167 +9,25 @@
 *******************************************************************************/
 
 #include "ZE_ZSound.h"
+#include "ZE_ZSoundBase.h"
 
-#ifdef USE_SDL_MIXER
+#ifdef USE_AUDIERE
 
 namespace ZE
 {
 
-//ZSound is almost exactly like ZMusic, when making changes check if that change should
-//be applied to ZMusic as well, roughly 90% of the time it should be.
-
-const int ZSound::LoopInfinite = -1;
-
-ZSound::ZSound() :
-    rEngine(ZEngine::GetInstance()),
-    rSound(NULL),
-    rChannelID(-1)    //request channel ID
+ZSound::ZSound()
 {
 }
 
-ZSound::ZSound(std::string filename) :
-    rEngine(ZEngine::GetInstance()),
-    rSound(NULL),
-    rChannelID(-1)    //request channel ID
+ZSound::ZSound(std::string filename) : ZSoundBase()
 {
     Open(filename);
 }
 
-ZSound::~ZSound()
-{
-    Release();
-}
-
 void ZSound::Open(std::string filename)
 {
-    Release();
-    rSound = Mix_LoadWAV(filename.c_str());
-
-    if(!rSound)
-        rEngine->ReportError(ZERR_ERROR,"Could not load %s",filename.c_str());
-}
-
-void ZSound::OpenFromZip(std::string zipname, std::string filename)
-{
-    SDL_RWops *rw = RWFromZip(zipname,filename);
-    if(rw)
-    {
-        rSound = Mix_LoadWAV_RW(rw,0);
-        delete []rw->hidden.mem.base;   //must free buffer
-        SDL_FreeRW(rw);
-    }
-
-    if(!rSound)
-        rEngine->ReportError(ZERR_WARNING,"Could not load %s from %s",filename.c_str(),zipname.c_str());
-}
-
-void ZSound::OpenFromZRF(std::string resourceId)
-{
-    std::string filename = rEngine->GetStringResource("sound",resourceId,"filename");
-    if(filename.length())
-        Open(filename);
-    else
-        rEngine->ReportError(ZERR_WARNING,"Failed to load sound resource '%s'",resourceId.c_str());
-}
-
-void ZSound::Release()
-{
-    if(rChannelID >= 0)
-        Mix_HaltChannel(rChannelID);
-    FreeSound(rSound);
-}
-
-void ZSound::Play(int loopNum, int fadeTime)
-{
-    if(rChannelID >= 0 && Mix_Playing(rChannelID))    //stop currently playing sound
-        Mix_HaltChannel(rChannelID);
-
-    if(rSound)
-    {
-        if(fadeTime)
-            rChannelID = Mix_FadeInChannel(rChannelID, rSound, loopNum, fadeTime);
-        else
-            rChannelID = Mix_PlayChannel(rChannelID, rSound, loopNum);
-    }
-    else if(!rSound)
-        rEngine->ReportError(ZERR_VERBOSE,"Called ZSound::Play with no sound effect loaded.");
-}
-
-void ZSound::Pause() const
-{
-    if(rSound && rChannelID >= 0)
-        Mix_Pause(rChannelID);
-    else if(!rSound)
-        rEngine->ReportError(ZERR_VERBOSE,"Called ZSound::Pause with no sound effect loaded.");
-}
-
-void ZSound::Unpause() const
-{
-    if(rSound && rChannelID >= 0)
-        Mix_Resume(rChannelID);
-    else if(!rSound)
-        rEngine->ReportError(ZERR_VERBOSE,"Called ZSound::Unpause with no sound effect loaded.");
-
-}
-
-void ZSound::Stop(int fadeTime) const
-{
-    if(rSound && rChannelID >= 0)
-    {
-        if(fadeTime)
-            Mix_FadeOutChannel(rChannelID,fadeTime);
-        else
-            Mix_HaltChannel(rChannelID);
-    }
-    else if(!rSound)
-        rEngine->ReportError(ZERR_VERBOSE,"Called ZSound::Stop with no sound effect loaded.");
-}
-
-void ZSound::SetVolume(int volume)
-{
-    if(rSound)
-        Mix_VolumeChunk(rSound,volume);
-    else
-        rEngine->ReportError(ZERR_VERBOSE,"Called ZSound::SetVolume with no sound effect loaded.");
-}
-
-bool ZSound::IsLoaded() const
-{
-    return rSound != NULL;
-}
-
-bool ZSound::IsPlaying() const
-{
-    if(rSound && rChannelID >= 0)
-        return Mix_Playing(rChannelID) > 0;
-    else
-    {
-        if(rChannelID >= 0)
-            rEngine->ReportError(ZERR_VERBOSE,"Called ZSound::IsPlaying with no sound effect loaded.");
-        return false;
-    }
-}
-
-bool ZSound::IsPaused() const
-{
-    if(rSound && rChannelID >= 0)
-        return Mix_Paused(rChannelID) > 0;
-    else
-    {
-        rEngine->ReportError(ZERR_VERBOSE,"Called ZSound::IsPaused with no sound effect loaded.");
-        return false;
-    }
-}
-
-int ZSound::GetVolume() const
-{
-    if(rSound)
-        return Mix_VolumeChunk(rSound,-1);
-    else
-    {
-        rEngine->ReportError(ZERR_VERBOSE,"Called ZSound::GetVolume with no sound effect loaded.");
-        return -1;
-    }
+    rStream = audiere::OpenSound(rDevice, filename.c_str(), false);
 }
 
 }
diff --git a/src/ZE_ZSoundBase.cpp b/src/ZE_ZSoundBase.cpp
new file mode 100644
index 0000000..dbed83c
--- /dev/null
+++ b/src/ZE_ZSoundBase.cpp
@@ -0,0 +1,106 @@
+/*******************************************************************************
+        This file is Part of the ZEngine Library for 2D game development.
+                  Copyright (C) 2002-2004 James Turk
+
+                     Licensed under a BSD-style license.
+
+    The maintainer of this library is James Turk (james@conceptofzero.net) 
+     and the home of this Library is http://www.zengine.sourceforge.net
+*******************************************************************************/
+
+#include "ZE_ZSoundBase.h"
+
+#ifdef USE_AUDIERE
+
+namespace ZE
+{
+
+ZSoundBase::ZSoundBase()
+{
+    rDevice = ZEngine::GetInstance()->GetSoundDevice();
+}
+
+ZSoundBase::~ZSoundBase()
+{
+}
+
+void ZSoundBase::Play(bool loop)
+{
+    rStream->play();
+    rStream->setRepeat(true);
+}
+
+void ZSoundBase::Stop()
+{
+    rStream->stop();
+}
+
+void ZSoundBase::SetVolume(float volume)
+{
+    rStream->setVolume(volume);
+}
+
+void ZSoundBase::SetPan(float pan)
+{
+    rStream->setPan(pan);
+}
+
+void ZSoundBase::SetPitch(float pitch)
+{
+    rStream->setPitchShift(pitch);
+}
+
+void ZSoundBase::SetPosition(int position)
+{
+    rStream->setPosition(position);
+}
+
+void ZSoundBase::SetPosition(float posPercent)
+{
+    rStream->setPosition(static_cast(posPercent*rStream->getLength()));
+}
+
+bool ZSoundBase::IsLoaded() const
+{
+    return (rStream != NULL);
+}
+
+bool ZSoundBase::IsPlaying() const
+{
+    return rStream->isPlaying();
+}
+
+bool ZSoundBase::IsSeekable() const
+{
+    return rStream->isSeekable();
+}
+
+float ZSoundBase::GetVolume() const
+{
+    return rStream->getVolume();
+}
+
+float ZSoundBase::GetPan() const
+{
+    return rStream->getPan();
+}
+
+float ZSoundBase::GetPitch() const
+{
+    return rStream->getPitchShift();
+}
+
+int ZSoundBase::GetPosition() const
+{
+    return rStream->getPosition();
+}
+
+int ZSoundBase::GetLength() const
+{
+    return rStream->getLength();
+}
+
+
+}
+
+#endif