--- a/LastFM.pro
+++ b/LastFM.pro
@@ -43,7 +43,8 @@
                src/libFingerprint/ \
                src/Bootstrapper/ITunesDevice
 
-    SUBDIRS += src/output/alsa-playback
+    SUBDIRS += src/output/alsa-playback \
+               src/output/RtAudio
 }
 
 
--- a/src/AudioController.cpp
+++ b/src/AudioController.cpp
@@ -126,9 +126,14 @@
              this,        SLOT  ( setStreamData( long, int ) ),
              Qt::DirectConnection );
 
-    connect( m_output,  SIGNAL( error( int, const QString& ) ),
+    // Each of the available audio plugins needs its error signal connected
+    QListIterator<OutputInterface *> i( m_audioPlugins);
+    while ( i.hasNext() )
+    {
+        connect( i.next(),  SIGNAL( error( int, const QString& ) ),
              parent(),  SLOT  ( onStreamingError( int, const QString& ) ),
              Qt::QueuedConnection );
+    }
 
     connect( m_timer, SIGNAL( timeout() ),
              this,    SLOT  ( onTimerTimeout() ),
@@ -171,16 +176,104 @@
 
     m_transcode->setBufferCapacity( kDecodedBufferMinSize );
 
-    #ifdef WIN32
-        m_output = qobject_cast<OutputInterface*>( loadPlugin( "rtaudioplayback" ) );
-    #elif defined LINUX
-        m_output = qobject_cast<OutputInterface*>( loadPlugin( "output_alsa" ) );
-    #else
-        m_output = qobject_cast<OutputInterface*>( loadPlugin( "output_portaudio" ) );
-    #endif
+    QString dirPath = MooseUtils::servicePath( "" );
+    QDir audioDir ( dirPath );
+
+    foreach ( QString fileName, audioDir.entryList( QDir::Files ) )
+     {
+        if ( fileName.contains( "srv_output_" ) )
+        {
+            QObject* audioPlugin = QPluginLoader( audioDir.absoluteFilePath( fileName ) ).instance();
+            if ( audioPlugin )
+            {
+                OutputInterface *oInterface = qobject_cast<OutputInterface *>( audioPlugin );
+                if ( oInterface )
+                {
+                    m_soundSystems << oInterface->soundSystems();
+                    m_audioPlugins << oInterface;
+                }
+            }
+        }
+    }
+
+    m_soundSystems.sort();
+
+    bool pluginSelected = selectAudioPlugin( The::settings().soundSystem() );
+
+    if ( !pluginSelected )
+         return false;
+
+    return true;
+}
+
+
+QStringList
+AudioControllerThread::getSoundSystems()
+{
+    return m_soundSystems;
+}
+
+
+bool
+AudioControllerThread::selectAudioPlugin( QString system )
+{
+    m_output = 0;
+
+    // First try to get a plugin that matches the settings
+    QListIterator<OutputInterface *> i( m_audioPlugins);
+    while ( i.hasNext() )
+    {
+        OutputInterface* iface = i.next();
 
+        QStringListIterator s( iface->soundSystems() );
+        while ( s.hasNext())
+        {
+            QString availSys = s.next();
+            if ( availSys == system )
+            {
+                m_output = iface;
+                break;
+            }
+        }
+        if ( m_output != 0 )
+            break;
+     }
+
+    // The preferred plugin we want isn't there,
     if ( m_output == 0 )
-        return false;
+    {
+        // so use the first device of the first available system
+        if ( m_soundSystems.size() > 0 )
+        {
+            i.toFront();
+            while ( i.hasNext() )
+            {
+                OutputInterface* iface = i.next();
+                // (and match exactly because contains isn't good enough)
+                QStringListIterator s( iface->soundSystems() );
+                while ( s.hasNext())
+                {
+                    QString availSys = s.next();
+                    if ( availSys == m_soundSystems.at( 0 ) )
+                    {
+                        m_output = iface;
+                        The::settings().setSoundCard( 0 );
+                        The::settings().setSoundSystem( m_soundSystems.at( 0 ) );
+                        break;
+                    }
+                }
+                if ( m_output != 0 )
+                    break;
+            }
+        }
+        // unless there's nothing to choose from.
+        else
+        {
+            emit error( Radio_PluginLoadFailed,
+                tr( "Couldn't load radio service '%1'. The radio will not work." ).arg( system ) );
+            return false;
+        }
+    }
 
     m_proxyOutput = new ProxyOutput();
 
@@ -188,6 +281,25 @@
 }
 
 
+QStringList
+AudioControllerThread::setSoundSystem( QString system )
+{
+    QStringList devices;
+    bool pluginSelected;
+
+    if ( m_output )
+        m_output->closeAudio();
+    pluginSelected = selectAudioPlugin ( system );
+    if ( pluginSelected )
+    {
+        m_output->initAudio( 44100, 2, system );
+        devices = m_output->devices();
+        m_output->closeAudio();
+    }
+    return devices;
+}
+
+
 QObject*
 AudioControllerThread::loadPlugin( QString name )
 {
@@ -544,11 +656,13 @@
     m_thread.m_initialised.wait( &m_mutex );
     locker.unlock();
 
+    // Safe to copy these values out here
+    m_soundSystems = m_thread.getSoundSystems();
     if ( m_thread.m_output != 0 )
     {
-        // Safe to copy these values out here
-        m_soundSystems = m_thread.m_output->soundSystems();
+        m_thread.m_output->initAudio( 44100, 2, m_thread.m_output->currentSoundSystem() );
         m_devices = m_thread.m_output->devices();
+        m_thread.m_output->closeAudio();
     }
 }
 
@@ -572,6 +686,14 @@
 void
 AudioController::play()
 {
+    if ( m_thread.m_output )
+    {
+        bool initialized = m_thread.m_output->initAudio( 44100, 2, m_thread.m_output->currentSoundSystem() );
+        // This prevents an assert on invalid state in httpinput
+        if ( ! initialized )
+            return;
+    }
+
     loadNext();
 }
 
@@ -580,6 +702,14 @@
 AudioController::play( RadioPlaylist& playlist )
 {
     m_playlist = &playlist;
+    if ( m_thread.m_output )
+    {
+        bool initialized = m_thread.m_output->initAudio( 44100, 2, m_thread.m_output->currentSoundSystem() );
+        // This prevents an assert on invalid state in httpinput
+        if ( ! initialized )
+            return;
+    }
+
     loadNext();
 
     // We reset the automatically managed buffer size on station change
@@ -709,6 +839,21 @@
 }
 
 
+
+void
+AudioController::setSoundSystem( QString system )
+{
+    m_devices = m_thread.setSoundSystem( system );
+}
+
+
+void
+AudioController::resetAudio()
+{
+    m_devices = m_thread.setSoundSystem( The::settings().soundSystem() );
+}
+
+
 void
 AudioController::loadNext()
 {
@@ -745,6 +890,22 @@
     QCoreApplication::postEvent( m_thread.eventHandler(), e );
 
     setState( State_Stopping );
+
+    do
+    {
+      #ifdef WIN32
+        Sleep( 10 );
+      #else
+        usleep( 100 );
+      #endif
+    }
+    while ( m_thread.state() != State_Stopped &&
+            m_thread.state() != State_Uninitialised &&
+            m_thread.state() != State_Handshaking &&
+            m_thread.state() != State_Handshaken );
+
+    if ( m_thread.m_output )
+        m_thread.m_output->closeAudio();
 }
 
 
--- a/src/AudioController.h
+++ b/src/AudioController.h
@@ -146,6 +146,9 @@
     virtual bool
     event( QEvent* e );
 
+    QStringList setSoundSystem( QString system );
+    QStringList getSoundSystems();
+
 signals:
     /** \brief Gets emitted frequently during playback to signal the current position in the stream.
       * \param seconds How many seconds elapsed since this stream started. */
@@ -184,6 +187,9 @@
     TranscodeInterface* m_transcode;
     OutputInterface* m_output;
     ProxyOutput* m_proxyOutput;
+    QList<OutputInterface *>m_audioPlugins;
+    QStringList m_soundSystems;
+    bool selectAudioPlugin( QString system );
 
     AudioControllerEventHandler* m_handler;
     
@@ -284,6 +290,10 @@
     /** \brief Returns the streamer URL of the currently playing track. */
     const QString& currentTrackUrl() const { return m_currentTrackUrl; }
 
+    void setSoundSystem( QString system );
+
+    void resetAudio();
+
 public slots:
     /** \brief Loads and starts this file instantly.
       * \param url The url that you want to load. Can be a file path or
--- a/src/interfaces/OutputInterface.h
+++ b/src/interfaces/OutputInterface.h
@@ -39,7 +39,10 @@
         /** \brief Initialises the audio device.
           * \param sampelRate The sample-rate that will be used for audio data.
           * \param channels How many channels will be used. */
-        virtual void initAudio( long sampleRate, int channels ) = 0;
+        virtual bool initAudio( long sampleRate, int channels, QString soundSystem ) = 0;
+
+        /** \brief Closes the audio device. */
+        virtual void closeAudio() = 0;
 
         /** \brief Returns the current volume. (range: 0 to 1.0) */
         virtual float volume() = 0;
@@ -63,6 +66,9 @@
         /** \brief Returns a list of supported Sound Systems. */
         virtual QStringList soundSystems() = 0;
 
+        /** \brief Returns the currently selected Sound System. */
+        virtual QString currentSoundSystem() = 0;
+
         /** \brief Returns a list of available devices. */
         virtual QStringList devices() = 0;
 
--- a/src/output/alsa-playback/alsaplayback.cpp
+++ b/src/output/alsa-playback/alsaplayback.cpp
@@ -28,6 +28,7 @@
 
 #include "RadioEnums.h"
 
+#define OUTPUT_ALSAPLAYBACK "Alsa"
 
 float AlsaPlayback::m_volume = 0.5;
 
@@ -85,7 +86,14 @@
 QStringList
 AlsaPlayback::soundSystems()
 {
-    return QStringList() << "Alsa";
+    return QStringList() << OUTPUT_ALSAPLAYBACK;
+}
+
+
+QString
+AlsaPlayback::currentSoundSystem()
+{
+    return OUTPUT_ALSAPLAYBACK;
 }
 
 
@@ -137,8 +145,8 @@
 }
 
 
-void
-AlsaPlayback::initAudio( long /*sampleRate*/, int /*channels*/ )
+bool
+AlsaPlayback::initAudio( long /*sampleRate*/, int /*channels*/, QString /*soundSystem*/ )
 {
     int channels = 2;
     int sampleRate = 44100;
@@ -164,7 +172,17 @@
         // there is no available device.
 
         emit error( Radio_NoSoundcard, tr("The ALSA soundsystem is either busy or not present.") );
+        return false;
     }
+    return true;
+}
+
+
+void
+AlsaPlayback::closeAudio()
+{
+    delete m_audio;
+    m_audio = 0;
 }
 
 
--- a/src/output/alsa-playback/alsaplayback.h
+++ b/src/output/alsa-playback/alsaplayback.h
@@ -31,7 +31,8 @@
     Q_OBJECT
     Q_INTERFACES( OutputInterface )
 
-        virtual void initAudio( long sampleRate, int channels );
+        virtual bool initAudio( long sampleRate, int channels, QString soundSystem );
+        virtual void closeAudio();
 
         virtual float volume() { return m_volume; }
         
@@ -45,8 +46,9 @@
         virtual int bufferSize();
         
         virtual QStringList soundSystems();
+        virtual QString currentSoundSystem();
         virtual QStringList devices();
-        virtual void setDevice( int n ) { m_deviceNum = n; initAudio( 44100, 2 ); }
+        virtual void setDevice( int n ) { m_deviceNum = n; /*initAudio( 44100, 2 );*/ }
 
         bool isActive() { return true; }
 
--- a/src/output/portAudio/portAudioOutput.cpp
+++ b/src/output/portAudio/portAudioOutput.cpp
@@ -27,6 +27,15 @@
 #include "logger.h"
 #include "RadioEnums.h"
 
+// Linux
+//#define OUTPUT_PORTAUDIO_ALSA "Alsa (portAudio)"
+//#define OUTPUT_PORTAUDIO_OSS "OSS (portAudio)"
+
+// Mac
+#define OUTPUT_PORTAUDIO_COREAUDIO "CoreAudio"
+
+// Windows
+//#define OUTPUT_PORTAUDIO_DIRECTSOUND "DirectSound (portAudio)"
 
 int
 audioCallback( const void*, void* outputBuffer, unsigned long frameCount,
@@ -105,9 +114,10 @@
 }
 
 
-void
-PortAudioOutput::initAudio( long sampleRate, int channels )
+bool
+PortAudioOutput::initAudio( long sampleRate, int channels, QString soundSystem )
 {
+    m_currentSoundSystem = soundSystem;
     if ( m_audio )
     {
         Pa_CloseStream( m_audio );
@@ -157,11 +167,26 @@
     m_deviceInfo = *Pa_GetDeviceInfo( p.device );
     m_sourceChannels = channels;
 
-    PaError error = Pa_OpenStream( &m_audio, 0, &p, sampleRate, bufferSize, 0, audioCallback, this );
-    if ( error != paNoError )
+    PaError pa_error = Pa_OpenStream( &m_audio, 0, &p, sampleRate, bufferSize, 0, audioCallback, this );
+    if ( pa_error != paNoError )
     {
-        qDebug() << "PortAudio Error:" << Pa_GetErrorText( error );
+        qDebug() << "PortAudio Error:" << Pa_GetErrorText( pa_error );
+        m_audio = 0;
+        emit error( Radio_NoSoundcard, tr("No soundcard available.") );
+        return false;
+    }
+    return true;
+}
+
+
+void
+PortAudioOutput::closeAudio()
+{
+    if ( m_audio )
+    {
+        Pa_CloseStream( m_audio );
         m_audio = 0;
+        m_currentSoundSystem.clear();
     }
 }
 
@@ -172,15 +197,15 @@
     return QStringList()
 
         #ifdef WIN32
-        << "DirectSound"
+        << OUTPUT_PORTAUDIO_DIRECTSOUND
         #endif
 
         #ifdef Q_WS_X11
-        << "Alsa"
+        << OUTPUT_PORTAUDIO_ALSA;
         #endif
 
         #ifdef Q_WS_MAC
-        << "CoreAudio"
+        << OUTPUT_PORTAUDIO_COREAUDIO
         #endif
 
         ;
--- a/src/output/portAudio/portAudioOutput.h
+++ b/src/output/portAudio/portAudioOutput.h
@@ -43,7 +43,8 @@
         PortAudioOutput();
         ~PortAudioOutput();
 
-        virtual void initAudio( long sampleRate, int channels );
+        virtual bool initAudio( long sampleRate, int channels, QString soundSystem );
+        virtual void closeAudio();
         virtual float volume() { return m_volume; }
         virtual void pause() { m_active = false; }
         virtual void resume() { m_active = true; }
@@ -51,6 +52,7 @@
         virtual bool needsData();
         virtual void processData( const QByteArray &buffer );
         virtual QStringList soundSystems();
+        virtual QString currentSoundSystem() { return m_currentSoundSystem; }
         virtual QStringList devices();
         virtual void setDevice( int n ) { m_deviceNum = n; initAudio( SAMPLERATE, CHANNELS ); }
 
@@ -77,6 +79,7 @@
         PaStream* m_audio;
         bool m_bufferEmpty;
         bool m_active;
+        QString m_currentSoundSystem;
 
         PaDeviceInfo m_deviceInfo;
         float m_volume;
--- a/src/output/RtAudio/rtaudio/RtAudio.cpp
+++ b/src/output/RtAudio/rtaudio/RtAudio.cpp
@@ -42,7 +42,8 @@
 #include <QtGlobal>
 
 #ifdef Q_WS_X11
-    #define __LINUX_ALSA__
+    //#define __LINUX_ALSA__
+    #define __LINUX_OSS__
 #endif
 #ifdef Q_WS_FREEBSD
     #define __LINUX_OSS__
@@ -55,8 +56,8 @@
 #endif
 
 #include "RtAudio.h"
-#include <iostream>
-#include <stdio.h>
+#include <cstdlib>
+#include <cstring>
 
 // Static variable definitions.
 const unsigned int RtApi::MAX_SAMPLE_RATES = 14;
@@ -625,7 +626,7 @@
 
     if (fd >= 0) close(fd);
     device.name.erase();
-    device.name.append( (const char *)device_name, strlen(device_name)+1);
+    device.name.append( (const char *)device_name, strlen(device_name) );
     devices_.push_back(device);
     nDevices_++;
   }
--- a/src/output/RtAudio/rtaudioplayback.cpp
+++ b/src/output/RtAudio/rtaudioplayback.cpp
@@ -26,6 +26,16 @@
 
 #include "RadioEnums.h"
 
+// Linux
+#define OUTPUT_RTAUDIO_ALSA "Alsa (RtAudio)"
+#define OUTPUT_RTAUDIO_OSS "OSS"
+
+// Mac
+#define OUTPUT_RTAUDIO_COREAUDIO "CoreAudio"
+
+// Windows
+#define OUTPUT_RTAUDIO_DIRECTSOUND "DirectSound"
+
 int
 audioCallback( char *buffer, int bufferSize, void* data_src )
 {
@@ -154,15 +164,15 @@
     QStringList l;
 
     #ifdef WIN32
-        l << "DirectSound";
+        l << OUTPUT_RTAUDIO_DIRECTSOUND;
     #endif
 
     #ifdef Q_WS_X11
-        l << "Alsa";
+        l << OUTPUT_RTAUDIO_OSS; // << OUTPUT_RTAUDIO_ALSA;
     #endif
 
     #ifdef Q_WS_MAC
-        l << "CoreAudio";
+        l << OUTPUT_RTAUDIO_COREAUDIO;
     #endif
 
     return l;
@@ -264,16 +274,19 @@
 }
 
 
-void
+bool
 RtAudioPlayback::initAudio(
     long sampleRate,
-    int channels )
+    int channels,
+    QString soundSystem )
 {
+    LOGL( 3, "Initializing RTAudio Playback" );
     //int channels = 2;
     //int sampleRate = 44100;
 
     int nBuffers = 16;
     int bufferSize = 512;
+    m_currentSoundSystem = soundSystem;
 
     try
     {
@@ -284,13 +297,18 @@
         int card = internalSoundCardID( m_deviceNum );
 
         #ifdef Q_WS_X11
-        api = RtAudio::LINUX_ALSA;
+        api = RtAudio::LINUX_OSS;
+        //if ( m_currentSoundSystem == OUTPUT_RTAUDIO_OSS )
+        //    api = RtAudio::LINUX_OSS;
+        //else if ( m_currentSoundSystem == OUTPUT_RTAUDIO_ALSA )
+        //    api = RtAudio::LINUX_ALSA;
         #endif
 
         RtAudioDeviceInfo info = m_audio->getDeviceInfo( card );
         delete m_audio;
 
-        if ( info.nativeFormats & RTAUDIO_SINT32 )
+        // See Debian bug report #373239
+        /*if ( info.nativeFormats & RTAUDIO_SINT32 )
         {
             format = RTAUDIO_SINT32;
         }
@@ -301,7 +319,7 @@
         if ( info.nativeFormats & RTAUDIO_SINT16 )
         {
             format = RTAUDIO_SINT16;
-        }
+        }*/
 
         m_audio = new RtAudio( card, channels, 0, 0, format, sampleRate, &bufferSize, nBuffers, api );
     }
@@ -311,12 +329,24 @@
                  " Message: " << error.getMessage() );
 
         // Don't delete m_audio here or it will crash.
-        // We don't emit an error signal here, it happens on startPlayback if
-        // we have no m_audio.
         m_audio = 0;
-
-        return;
     }
+
+    if ( m_audio )
+        return true;
+
+    // Looks like we do need to emit now
+    emit error( Radio_NoSoundcard, tr("The OSS soundsystem is either busy or not present.") );
+    return false;
+}
+
+
+void
+RtAudioPlayback::closeAudio()
+{
+    delete m_audio;
+    m_audio = 0;
+    m_currentSoundSystem.clear();
 }
 
 
--- a/src/output/RtAudio/rtaudioplayback.h
+++ b/src/output/RtAudio/rtaudioplayback.h
@@ -37,7 +37,8 @@
     public:
         RtAudioPlayback();
 
-        virtual void initAudio( long sampleRate, int channels );
+        virtual bool initAudio( long sampleRate, int channels, QString soundSystem );
+        virtual void closeAudio();
 
         virtual float volume();
 
@@ -52,8 +53,9 @@
         virtual void processData( const QByteArray& data );
 
         QStringList soundSystems();
+        QString currentSoundSystem() { return m_currentSoundSystem; }
         QStringList devices();
-        void setDevice( int n ) { m_deviceNum = n; initAudio( 44100, 2 ); }
+        void setDevice( int n ) { m_deviceNum = n; /*initAudio( 44100, 2 );*/ }
     
 
         int audioCallback( char *buffer, int bufferSize );
@@ -83,6 +85,7 @@
 
         QByteArray m_buffer;
         int m_bufferCapacity;
+        QString m_currentSoundSystem;
         
         int m_deviceNum;
         
--- a/src/output/RtAudio/RtAudio.pro
+++ b/src/output/RtAudio/RtAudio.pro
@@ -1,6 +1,6 @@
 TEMPLATE = lib
 CONFIG += service
-TARGET = rtaudioplayback
+TARGET = output_rtaudio
 QT -= gui
 
 include( ../../../definitions.pro.inc )
@@ -8,9 +8,9 @@
 HEADERS = rtaudioplayback.h
 SOURCES = rtaudioplayback.cpp rtaudio/RtAudio.cpp
 
-unix:!mac {
-    LIBS += -lasound
-}
+#unix:!mac {
+#    LIBS += -lasound
+#}
 
 win32 {
    LIBS += -lwinmm -Ldsound -ldsound -lole32 -lgdi32 -luser32
--- a/src/Radio.cpp
+++ b/src/Radio.cpp
@@ -386,6 +386,13 @@
 
 
 void
+Radio::setSoundSystem( QString system )
+{
+    m_audioController.setSoundSystem( system );
+}
+
+
+void
 Radio::onPlaylistError( RadioError errorCode,
                         const QString& message )
 {
@@ -646,7 +653,7 @@
     }
     else
     {
-        if ( err == Radio_PluginLoadFailed || err == Radio_NoSoundcard )
+        if ( err == Radio_PluginLoadFailed )
         {
             m_broken = true;
         }
--- a/src/settingsdialog.cpp
+++ b/src/settingsdialog.cpp
@@ -210,6 +210,7 @@
     connect( ui_radio.resumeCheckBox, SIGNAL( toggled( bool ) ), this, SLOT( configChanged() ) );
     connect( ui_radio.cardBox, SIGNAL( currentIndexChanged( int ) ), this, SLOT( configChanged() ) );
     connect( ui_radio.systemBox, SIGNAL( currentIndexChanged( int ) ), this, SLOT( configChanged() ) );
+    connect( ui_radio.systemBox, SIGNAL( activated( int ) ), this, SLOT( soundSystemChanged() ) );
     connect( ui_radio.automaticBufferCheck, SIGNAL( toggled( bool ) ), this, SLOT( configChanged() ) );
     connect( ui_radio.bufferEdit, SIGNAL( textChanged( QString ) ), this, SLOT( configChanged() ) );
     connect( ui_radio.musicProxyPort, SIGNAL( valueChanged( int ) ), this, SLOT( configChanged() ) );
@@ -247,6 +248,19 @@
 }
 
 
+void
+SettingsDialog::soundSystemChanged()
+{
+    Radio& radio = The::radio();
+    radio.stop();
+
+    radio.setSoundSystem( ui_radio.systemBox->currentText() );
+
+    ui_radio.cardBox->clear();
+    ui_radio.cardBox->addItems( radio.devices() );
+}
+
+
 int
 SettingsDialog::exec( int startPage )
 {
@@ -373,7 +387,9 @@
     ui_radio.systemBox->addItems( radio.soundSystems() );
     ui_radio.cardBox->addItems( radio.devices() );
 
-    ui_radio.systemBox->setCurrentIndex( The::settings().soundSystem() >= 0 ? The::settings().soundSystem() : 0 );
+    int item = ui_radio.systemBox->findText( The::settings().soundSystem(), Qt::MatchExactly );
+    if ( item >= 0 )
+        ui_radio.systemBox->setCurrentIndex( item );
     ui_radio.cardBox->setCurrentIndex( The::settings().soundCard() >= 0 ? The::settings().soundCard() : 0 );
 
     ui_radio.automaticBufferCheck->setChecked( The::settings().isBufferManagedAutomatically() );
@@ -557,7 +573,7 @@
 {
     The::settings().currentUser().setResumePlayback( ui_radio.resumeCheckBox->isChecked() );
     The::settings().setSoundCard( ui_radio.cardBox->currentIndex() >= 0 ? ui_radio.cardBox->currentIndex() : 0 );
-    The::settings().setSoundSystem( ui_radio.systemBox->currentIndex() >= 0 ? ui_radio.systemBox->currentIndex() : 0 );
+    The::settings().setSoundSystem( ui_radio.systemBox->currentText() );
 
     The::settings().setBufferManagedAutomatically( ui_radio.automaticBufferCheck->isChecked() );
 
@@ -569,7 +585,7 @@
     The::settings().setMusicProxyPort( ui_radio.musicProxyPort->value() );
 
     m_reAudio = ui_radio.cardBox->currentIndex()   != originalSoundCard   ||
-                ui_radio.systemBox->currentIndex() != originalSoundSystem ||
+                ui_radio.systemBox->currentText() != originalSoundSystem ||
                 m_reAudio;
 
     pageSaved( 1 );
@@ -677,7 +693,8 @@
         if ( m_reconnect )
             The::app().setUser( The::currentUsername() );
 
-        if ( m_reAudio )
+        // Not with the multiple sound system patch, you don't :)
+        /*if ( m_reAudio )
         {
             LastMessageBox dlg( QMessageBox::Information,
                                 tr( "Restart needed" ),
@@ -685,7 +702,7 @@
                                     "change to take effect." ),
                                 QMessageBox::Ok, this );
             dlg.exec();
-        }
+        }*/
 
         m_reconnect = m_reAudio = false;
     }
@@ -693,6 +710,22 @@
 
 
 void
+SettingsDialog::reject()
+{
+    m_reAudio = ui_radio.cardBox->currentIndex()   != originalSoundCard   ||
+                ui_radio.systemBox->currentText() != originalSoundSystem ||
+                m_reAudio;
+
+    if ( m_reAudio )
+    {
+        The::audioController().resetAudio();
+        m_reAudio = false;
+    }
+    QDialog::reject();
+}
+
+
+void
 SettingsDialog::configChanged()
 {
     if ( m_populating ) return;
--- a/src/Radio.h
+++ b/src/Radio.h
@@ -140,6 +140,9 @@
     void
     setVolume( int vol ) { m_audioController.setVolume( vol ); }
 
+    void
+    setSoundSystem( QString system );
+
 signals:
 
     void
--- a/src/settingsdialog.h
+++ b/src/settingsdialog.h
@@ -51,6 +51,7 @@
 
     private slots:
         void configChanged();
+        void soundSystemChanged();
         void pageSwitched( int currentRow );
         void clearCache();
         void verifiedAccount( bool verified, bool bootstrap );
@@ -61,6 +62,7 @@
         void clearUserIPodAssociations();
 
     private:
+        virtual void reject();
         void loadExtensions();
 
         void populateAccount();
@@ -97,7 +99,7 @@
         bool originalProxyUsage;
 
         int originalSoundCard;
-        int originalSoundSystem;
+        QString originalSoundSystem;
 
         bool m_reconnect;
         bool m_reAudio;
--- a/src/libMoose/LastFmSettings.h
+++ b/src/libMoose/LastFmSettings.h
@@ -259,8 +259,8 @@
     int  soundCard()     const { return QSettings().value( "soundcard", 0 ).toInt(); }
     void setSoundCard( int v ) { QSettings().setValue( "soundcard", v ); }
 
-    int  soundSystem()     const { return QSettings().value( "soundsystem", 0 ).toInt(); }
-    void setSoundSystem( int v ) { QSettings().setValue( "soundsystem", v ); }
+    QString  soundSystem()     const { return QSettings().value( "soundsystem", 0 ).toString(); }
+    void setSoundSystem( QString v ) { QSettings().setValue( "soundsystem", v ); }
 
     bool isBufferManagedAutomatically() const { return QSettings().value( "BufferManagedAutomatically", 1 ).toBool(); }
     void setBufferManagedAutomatically( bool v ) { QSettings().setValue( "BufferManagedAutomatically", v ); }
--- a/src/container.cpp
+++ b/src/container.cpp
@@ -778,7 +778,7 @@
         case Handshake_SessionFailed:
         case Radio_PluginLoadFailed:
         case Radio_NoSoundcard:
-            m_soundcardError = true;
+            //m_soundcardError = true;
         case Radio_PlaybackError:
         case Radio_UnknownError:
         {
