diff --git a/src/audio/Makefile.am b/src/audio/Makefile.am
index cbfb5d282e88e02216d58a2ca0cda098e34e66f2..d0fe8c8ee36d30c027cb4713b65f3bd3039faa86 100644
--- a/src/audio/Makefile.am
+++ b/src/audio/Makefile.am
@@ -1,8 +1,4 @@
-if MAINTENER_CODE
-maintener_directories = OpenAL
-endif
-
-SUBDIRS = gsm pacpp ${maintener_directories}
+SUBDIRS = gsm pacpp OpenAL
 
 noinst_LTLIBRARIES = libaudio.la
 
diff --git a/src/audio/OpenAL/Device.hpp b/src/audio/OpenAL/Device.hpp
index 751f380d58f20a380e27a8e804435f7b9000b13e..143d2ff491b890a7e92dc86b6ea6c6a129f9a9e9 100644
--- a/src/audio/OpenAL/Device.hpp
+++ b/src/audio/OpenAL/Device.hpp
@@ -39,6 +39,7 @@ namespace SFLAudio
      * the load is successfull.
      */
     virtual bool load() = 0;
+    virtual void unload() = 0;
 
     /**
      * This will create a context for the device.
diff --git a/src/audio/OpenAL/Makefile.am b/src/audio/OpenAL/Makefile.am
index 2da160d1efc83f780ed947f27f326df389f274ed..bdd8d3d9aebbc959b50ca88666b35720c73e1e2e 100644
--- a/src/audio/OpenAL/Makefile.am
+++ b/src/audio/OpenAL/Makefile.am
@@ -1,3 +1,4 @@
+if MAINTENER_CODE
 noinst_PROGRAMS = example01 example02
 noinst_LTLIBRARIES = libsflaudio.la
 
@@ -26,5 +27,5 @@ LDADD = libsflaudio.la $(PORTAUDIO_LIBS) -lopenal ../pacpp/source/portaudiocpp/l
 
 example01_SOURCES = example01.cpp
 example02_SOURCES = example02.cpp
-
+endif
 
diff --git a/src/audio/OpenAL/NullDevice.cpp b/src/audio/OpenAL/NullDevice.cpp
index f48417fb10646ac714bc5916c799dafc5774f15d..cef84a8de276fbe2734e50bfd1c0627b2f4663d8 100644
--- a/src/audio/OpenAL/NullDevice.cpp
+++ b/src/audio/OpenAL/NullDevice.cpp
@@ -42,6 +42,10 @@ SFLAudio::NullDevice::load()
   return true;
 }
 
+void 
+SFLAudio::NullDevice::unload()
+{}
+
 bool
 SFLAudio::NullDevice::isNull() 
 {
diff --git a/src/audio/OpenAL/NullDevice.hpp b/src/audio/OpenAL/NullDevice.hpp
index d783518adf2b4df58220413714fa81bb3762cd44..43387038ed946feb7aa8a21803729e4a9a7603e1 100644
--- a/src/audio/OpenAL/NullDevice.hpp
+++ b/src/audio/OpenAL/NullDevice.hpp
@@ -32,6 +32,7 @@ namespace SFLAudio
     Context *createContext();
 
     virtual bool load();
+    virtual void unload();
     bool isNull();
   };
 }
diff --git a/src/audio/OpenAL/OpenALDevice.cpp b/src/audio/OpenAL/OpenALDevice.cpp
index 0389e9cc2f0e79c2d87ce1cbee64bf647b0aeb6a..87d6234f0e2de7177c204acd9c2b2993687020d3 100644
--- a/src/audio/OpenAL/OpenALDevice.cpp
+++ b/src/audio/OpenAL/OpenALDevice.cpp
@@ -18,6 +18,7 @@
  *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
+#include <iostream>
 #include <AL/al.h>
 #include <AL/alc.h>
 
@@ -30,16 +31,34 @@ SFLAudio::OpenALDevice::OpenALDevice()
   : mDevice(0)
 {}
 
+SFLAudio::OpenALDevice::~OpenALDevice()
+{
+  unload();
+}
+
+void
+SFLAudio::OpenALDevice::unload() {
+  if(mDevice) {
+    alcCloseDevice(mDevice);
+    mDevice = 0;
+  }
+}
+
+
 bool
 SFLAudio::OpenALDevice::load() {
-  OpenALLayer::clearError(); 
   mDevice = alcOpenDevice(0);
-  OpenALLayer::assertError();
+  ALenum error = alcGetError(mDevice);
+  if (error != AL_NO_ERROR) {
+    std::cerr << "OpenAL::alcOpenDevice: " << alGetString(error) << std::endl;
+    unload();
+  }
 
   if(mDevice != 0) {
     const ALCchar *device = alcGetString(mDevice, ALC_DEVICE_SPECIFIER);
     setName(device);
   }
+
   return mDevice;
 }
 
diff --git a/src/audio/OpenAL/OpenALDevice.hpp b/src/audio/OpenAL/OpenALDevice.hpp
index 4701d53df51f0329461caea31a246741d9f6dabb..33693d421f8374f0971e1c5a1f63d97385a2f779 100644
--- a/src/audio/OpenAL/OpenALDevice.hpp
+++ b/src/audio/OpenAL/OpenALDevice.hpp
@@ -31,6 +31,7 @@ namespace SFLAudio
   public:
     OpenALDevice();
     virtual bool load();
+    virtual void unload();
     virtual Context *createContext();
 
   private:
diff --git a/src/audio/OpenAL/OpenALLayer.cpp b/src/audio/OpenAL/OpenALLayer.cpp
index a3977a675fc03ed2dcab8bafaefea4fe7a83eeae..bc530a2af49184f4d09b962bc0cd1e9aadf6bf70 100644
--- a/src/audio/OpenAL/OpenALLayer.cpp
+++ b/src/audio/OpenAL/OpenALLayer.cpp
@@ -74,17 +74,4 @@ SFLAudio::OpenALLayer::openDevice(const std::string &)
   return new NullDevice();
 }
 
-void
-SFLAudio::OpenALLayer::assertError()
-{
-  ALenum error;
-  if ((error = alGetError()) != AL_NO_ERROR) {
-    std::cerr << "OpenAL::alcOpenDevice: " << alGetString(error) << std::endl;
-  }
-}
 
-void
-SFLAudio::OpenALLayer::clearError()
-{
-  alGetError();
-}
diff --git a/src/audio/OpenAL/OpenALLayer.hpp b/src/audio/OpenAL/OpenALLayer.hpp
index ecea6ab510e71d4f5bdeefb2e0a2dfe532199c34..1a04b027f08c3060151dbcfd4edb7e9a0c8a6114 100644
--- a/src/audio/OpenAL/OpenALLayer.hpp
+++ b/src/audio/OpenAL/OpenALLayer.hpp
@@ -33,9 +33,6 @@ namespace SFLAudio
     virtual std::list< std::string > getDevicesNames();
     virtual Device *openDevice();
     virtual Device *openDevice(const std::string &name);
-
-    static void clearError();
-    static void assertError();
   };
 }