diff -ruN vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25.orig/config.c vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25+bgstreamV7/config.c
--- vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25.orig/config.c	2009-11-16 12:16:16.000000000 +0100
+++ vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25+bgstreamV7/config.c	2010-01-25 20:00:57.000000000 +0100
@@ -175,7 +175,7 @@
 };
 
 const char * const config_t::s_audioVisualizations[ AUDIO_VIS_count+1 ] = {
-  "none", "goom", "oscope", "fftscope", "fftgraph",
+  "none", "goom", "oscope", "fftscope", "fftgraph", "bgstream",
   NULL
 };
 
@@ -185,6 +185,7 @@
   trNOOP("Oscilloscope"),
   trNOOP("FFT Scope"),
   trNOOP("FFT Graph"),
+  trNOOP("Images"),
   NULL
 };
 
diff -ruN vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25.orig/config.h vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25+bgstreamV7/config.h
--- vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25.orig/config.h	2009-11-16 12:16:16.000000000 +0100
+++ vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25+bgstreamV7/config.h	2010-01-25 20:00:57.000000000 +0100
@@ -119,7 +119,7 @@
 
 #define AUDIO_VIS_NONE   0
 #define AUDIO_VIS_GOOM   1
-#define AUDIO_VIS_count  5
+#define AUDIO_VIS_count  6
 
 /* speaker arrangements: xine, audio_out_alsa.c */
 #define SPEAKERS_MONO          0
diff -ruN vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25.orig/device.c vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25+bgstreamV7/device.c
--- vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25.orig/device.c	2009-08-19 19:08:08.000000000 +0200
+++ vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25+bgstreamV7/device.c	2010-01-25 20:00:57.000000000 +0100
@@ -840,7 +840,7 @@
 
 int cXinelibDevice::PlayFileCtrl(const char *Cmd, int TimeoutMs)
 {
-  TRACEF("cXinelibDevice::PlayFile");
+  TRACEF("cXinelibDevice::PlayFileCtrl");
   int result = -1;
 
   /*if(m_PlayingFile != pmNone)*/ {
@@ -861,7 +861,7 @@
   return true;
 }
 
-bool cXinelibDevice::PlayFile(const char *FileName, int Position, 
+bool cXinelibDevice::PlayFile(const char *FileName, const char *BaGrFile, int Position,
 			      bool LoopPlay, ePlayMode PlayMode,
 			      int TimeoutMs)
 {
@@ -879,14 +879,14 @@
     for(int i = 0; i < mi_Count; i++) 
       m_MetaInfo[i][0] = 0;
     if(m_server)
-      result = m_server->PlayFile(FileName, Position, LoopPlay, PlayMode, TimeoutMs);
+      result = m_server->PlayFile(FileName, BaGrFile, Position, LoopPlay, PlayMode, TimeoutMs);
     if(m_local)
-      result = m_local->PlayFile(FileName, Position, LoopPlay, PlayMode, TimeoutMs);
+      result = m_local->PlayFile(FileName, BaGrFile, Position, LoopPlay, PlayMode, TimeoutMs);
   } else if(/*!FileName &&*/m_PlayingFile != pmNone) {
     if(m_server) 
-      result = m_server->PlayFile(NULL, 0, 0, pmNone, TimeoutMs);
+      result = m_server->PlayFile(NULL, NULL, 0, 0, pmNone, TimeoutMs);
     if(m_local)
-      result = m_local->PlayFile(NULL, 0, 0, pmNone, TimeoutMs);
+      result = m_local->PlayFile(NULL, NULL, 0, 0, pmNone, TimeoutMs);
     if(!m_liveMode)
       SetReplayMode();
     else
diff -ruN vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25.orig/device.h vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25+bgstreamV7/device.h
--- vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25.orig/device.h	2009-08-01 21:50:36.000000000 +0200
+++ vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25+bgstreamV7/device.h	2010-01-25 20:00:57.000000000 +0100
@@ -203,7 +203,7 @@
     ePlayMode m_PlayingFile;
 
   public:
-    bool PlayFile(const char *Filename, int Position = 0,
+    bool PlayFile(const char *Filename, const char *BaGrFile = NULL, int Position = 0,
                   bool LoopPlay = false, ePlayMode PlayMode = pmAudioVideo,
                   int TimeoutMs = -1);
     int  PlayFileCtrl(const char *Cmd, int TimeoutMs = -1);
diff -ruN vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25.orig/frontend.c vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25+bgstreamV7/frontend.c
--- vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25.orig/frontend.c	2010-01-16 21:11:19.000000000 +0100
+++ vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25+bgstreamV7/frontend.c	2010-01-25 20:00:57.000000000 +0100
@@ -317,7 +317,7 @@
   if(xc.audio_vis_goom_opts[0] && !strcmp(xc.audio_visualization, "goom"))
     opts = xc.audio_vis_goom_opts;
 
-  if(m_bNoVideo && strcmp(xc.audio_visualization, "none")) {
+  if(m_bNoVideo && strcmp(xc.audio_visualization, "none") && strcmp(xc.audio_visualization, "bgstream")) {
     ConfigurePostprocessing(xc.audio_visualization, true, opts);
   } else {
     ConfigurePostprocessing("AudioVisualization", false, NULL);
@@ -660,13 +660,13 @@
   return Xine_Control(buf);
 }
 
-bool cXinelibThread::PlayFile(const char *FileName, int Position, 
+bool cXinelibThread::PlayFile(const char *FileName, const char *BaGrFile, int Position, 
 			      bool LoopPlay, ePlayMode PlayMode,
 			      int TimeoutMs)
 {
   TRACEF("cXinelibThread::PlayFile");
 
-  char vis[256];
+  char vis[256+4096];
 
   switch(PlayMode) {
     case pmVideoOnly:
@@ -683,19 +683,22 @@
       break;
     case pmAudioVideo:
     default:
-      if(xc.audio_vis_goom_opts[0] && !strcmp(xc.audio_visualization, "goom"))
+      if(xc.audio_vis_goom_opts[0] && !strcmp(xc.audio_visualization, "goom")) {
 	snprintf(vis, sizeof(vis), "%s:%s", xc.audio_visualization, xc.audio_vis_goom_opts);
-      else
+      } else if(FileName && !strcmp(xc.audio_visualization, "bgstream")) {
+        snprintf(vis, sizeof(vis), "%s:%s", xc.audio_visualization, BaGrFile);
+      } else {
 	strn0cpy(vis, xc.audio_visualization, sizeof(vis));
+      }
       vis[sizeof(vis)-1] = 0;
       break;
   }
 
-  char buf[4096];
+  char buf[4096+4096+256];
   m_bEndOfStreamReached = false;
   if(snprintf(buf, sizeof(buf), "PLAYFILE %s %d %s %s",
 	      LoopPlay ? "Loop" : "", Position, vis, FileName ? FileName : "")
-     >= 4096) {
+     >= 4096+4096+256) {
     LOGMSG("PlayFile: message too long !");
     return 0;
   }
@@ -703,6 +706,7 @@
   if(FileName) {
     Lock();
     m_FileName = FileName;
+    m_BaGrFile = BaGrFile;
     m_bPlayingFile = true;
     m_SpuLangAuto = true;
     if (m_StatusMonitor)
@@ -802,7 +806,7 @@
 	  audio_equalizer[8],audio_equalizer[9]);
   r = Xine_Control(buf) && r;
 
-  if(m_bNoVideo && strcmp(xc.audio_visualization, "none")) {
+  if(m_bNoVideo && strcmp(xc.audio_visualization, "none") && strcmp(xc.audio_visualization, "bgstream")) {
     char *opts = NULL;
     if(xc.audio_vis_goom_opts[0] && !strcmp(xc.audio_visualization, "goom"))
       opts = xc.audio_vis_goom_opts;
diff -ruN vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25.orig/frontend.h vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25+bgstreamV7/frontend.h
--- vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25.orig/frontend.h	2010-01-16 21:55:52.000000000 +0100
+++ vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25+bgstreamV7/frontend.h	2010-01-25 20:00:57.000000000 +0100
@@ -89,7 +89,7 @@
     bool NoSignalDisplay(void);
 
     // Playback files
-    virtual bool PlayFile(const char *FileName, int Position, 
+    virtual bool PlayFile(const char *FileName, const char *BaGrFile, int Position, 
 			  bool LoopPlay = false, ePlayMode PlayMode = pmAudioVideo,
 			  int TimeoutMs = -1);
     virtual int  PlayFileCtrl(const char *Cmd, int TimeoutMs=-1) { return Xine_Control(Cmd); }
@@ -140,6 +140,7 @@
     bool m_bPlayingFile;
     int  m_Volume;
     cString  m_FileName;
+    cString  m_BaGrFile;
     uint64_t m_StreamPos;
     uint64_t m_LastClearPos;
     uint32_t m_Frames;
diff -ruN vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25.orig/frontend_local.c vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25+bgstreamV7/frontend_local.c
--- vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25.orig/frontend_local.c	2009-08-18 14:51:42.000000000 +0200
+++ vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25+bgstreamV7/frontend_local.c	2010-01-25 20:00:57.000000000 +0100
@@ -230,7 +230,7 @@
 {
   TRACEF("cXinelibLocal::Xine_Control");
   if (cmd && *cmd && Running()) {
-    char buf[4096];
+    char buf[4096+4096+256];
     if(snprintf(buf, sizeof(buf), "%s\r\n", cmd) >= (int)sizeof(buf)) {
       buf[sizeof(buf)-1] = 0;
       LOGMSG("Xine_Control: message too long ! (%s)", buf);
diff -ruN vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25.orig/frontend_svr.c vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25+bgstreamV7/frontend_svr.c
--- vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25.orig/frontend_svr.c	2010-01-18 19:00:30.000000000 +0100
+++ vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25+bgstreamV7/frontend_svr.c	2010-01-25 20:00:57.000000000 +0100
@@ -1322,6 +1322,7 @@
         if(pos)
           file.Truncate(pos - m_FileName);
         bool Allow = ( !strcmp_escaped(file, m_State[cli]->Uri() + 9)
+                       || !strcmp_escaped(m_BaGrFile, m_State[cli]->Uri() + 9)
                        || (pos && !strcmp_escaped(pos + 10, m_State[cli]->Uri() + 9)));
         if(Allow) {
           LOGMSG("HTTP streaming media file");
diff -ruN vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25.orig/media_player.c vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25+bgstreamV7/media_player.c
--- vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25.orig/media_player.c	2009-10-26 00:41:28.000000000 +0100
+++ vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25+bgstreamV7/media_player.c	2010-01-25 20:00:57.000000000 +0100
@@ -40,6 +40,7 @@
     cString m_File;
     cString m_ResumeFile;
     cString m_SubFile;
+    cString m_BaGrFile;
 
     cPlaylist m_Playlist;
 
@@ -51,6 +52,10 @@
 
     cXinelibDevice *m_Dev;
 
+    virtual char *FindBaGrFile(const char *fname);
+    virtual bool TryBaGrFileExts(char *afile);
+    virtual void strrcut(char *str, int c);
+
   protected:
     virtual void Activate(bool On);
 
@@ -234,6 +239,7 @@
     // Maybe mrls from playlist files should not be escaped ?
     // (those may contain #subtitle, #volnorm etc. directives)
     cString mrl;
+    cString bgmrl;
     if(*m_SubFile)
       mrl = cString::sprintf("%s%s#subtitle:%s%s",
 			     m_File[0] == '/' ? "file:" : "",
@@ -247,9 +253,15 @@
     else
       mrl = cPlaylist::EscapeMrl(m_File);
 
+    // Search a background file if visualization is set to "bgstream"
+    if(!strcmp(xc.audio_visualization, "bgstream")) {
+      m_BaGrFile = FindBaGrFile(m_File);
+      bgmrl = cString::sprintf("file:%s",*cPlaylist::EscapeMrl(m_BaGrFile));
+    }
+
     // Start replay
     UpdateNumTracks();
-    m_Error = !m_Dev->PlayFile(mrl, pos);
+    m_Error = !m_Dev->PlayFile(mrl, bgmrl, pos);
     LOGDBG("cXinelibPlayer playing %s (%s)", *m_File, m_Error ? "FAIL" : "OK");
 
     if(!m_Error) {
@@ -294,6 +306,79 @@
   }
 }
 
+/* Find a background file */
+char *cXinelibPlayer::FindBaGrFile(const char *fname)
+{
+  static char afile[4096];
+
+  /* search for a matching background file only for local files (skip mrls like "http://...") */
+  if(fname[0] == '/') {
+
+    sprintf(afile,"%s",fname);
+
+    LOGDBG("cXinelibPlayer::FindBaGrFile: trying to find a matching background file for %s",fname);
+
+    /* check if /Path/To/Artist/Album/Song.exts_bg exists */
+    strrcut(afile,'.');
+    strcat(afile,".");
+    if(TryBaGrFileExts(afile))
+      return afile;
+
+    /* check if /Path/To/Artist/Album/cover.exts_bg exists */
+    strrcut(afile,'/');
+    strcat(afile,"/cover.");
+    if(TryBaGrFileExts(afile))
+      return afile;
+
+    /* check if /Path/To/Artist/artist.exts_bg exists */
+    strrcut(afile,'/');
+    strrcut(afile,'/');
+    strcat(afile,"/artist.");
+    if(TryBaGrFileExts(afile))
+      return afile;
+
+  } else {
+    LOGDBG("cXinelibPlayer::FindBaGrFile: looking only for a default background file for %s",fname);
+  }
+
+  /* check if /SomePath/To/Default/background.exts_bg exists */
+  sprintf(afile,"%s","/usr/share/libxine1-xvdr/background.");
+  if(TryBaGrFileExts(afile))
+    return afile;
+
+  LOGDBG("cXinelibPlayer::FindBaGrFile: no background file found.");
+  sprintf(afile,"NOTFOUND");
+  return afile;
+}
+
+/* Try different extensions to find a matching background file */
+bool cXinelibPlayer::TryBaGrFileExts(char *afile)
+{
+  // Maybe it would make sense to use exts_image and exts_video from config.c instead of exts_bg
+  const char exts_bg[][8] = { "jpg", "png", "gif", "avi", "mpg", };
+  char *afilecheck;
+  unsigned int i;
+
+  for(i=0; i<sizeof(exts_bg)/sizeof(exts_bg[0]); i++) {
+    asprintf(&afilecheck,"%s%s",afile,exts_bg[i]);
+    LOGDBG("cXinelibPlayer::TryBaGrFileExts: trying to open background file %s",afilecheck);
+    if(!euidaccess(afilecheck,R_OK)) {
+      LOGDBG("cXinelibPlayer::TryBaGrFileExts: background file found: %s",afilecheck);
+      strcat(afile,exts_bg[i]);
+      return 1;
+    }
+  }
+  return 0;
+}
+
+/* Cut off string str at the last occurrence of c */
+void cXinelibPlayer::strrcut(char *str, int c)
+{
+  char *pos = strrchr(str,c);
+  if (pos && *pos)
+    *pos = '\0';
+}
+
 //
 // cPlaylistMenu
 //
diff -ruN vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25.orig/xine_input_vdr.c vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25+bgstreamV7/xine_input_vdr.c
--- vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25.orig/xine_input_vdr.c	2010-01-18 21:39:36.000000000 +0100
+++ vdr-plugin-xineliboutput_1.0.90_CVS_2010-01-25+bgstreamV7/xine_input_vdr.c	2010-01-25 20:00:57.000000000 +0100
@@ -296,6 +296,13 @@
   xine_event_queue_t *slave_event_queue;
   int                 autoplay_size;
 
+  struct {
+
+    xine_stream_t        *stream;
+    xine_event_queue_t   *event_queue;
+
+  } bg_stream;
+
   /* Sync */
   pthread_mutex_t     lock;
   pthread_mutex_t     vdr_entry_lock;
@@ -2131,7 +2138,7 @@
 static int handle_control_playfile(vdr_input_plugin_t *this, const char *cmd)
 {
   const char *pt = cmd + 9;
-  char filename[4096], av[256], *pav = av;
+  char filename[4096], av[256+4096], *pav = av;
   int loop = 0, pos = 0, err = 0, avsize = sizeof(av)-2, mix_streams = 0;
 
   while(*pt==' ') pt++;
@@ -2162,6 +2169,18 @@
     int is_file_mrl = !strncmp(filename, "file:/", 6) ? 5 : 0;
     this->loop_play = 0;
 
+    /* mrlbase is needed for filename and for bgfile in remote mode */
+    char mrlbase[256];
+    if(this->fd_control >= 0) {
+      char *host = strdup(strstr(this->mrl, "//")+2);
+      char *port = strchr(host, ':');
+      int  iport = port ? atoi(port+1) : DEFAULT_VDR_PORT;
+      if(port) *port = 0;
+      snprintf(mrlbase, sizeof(mrlbase), "http://%s:%d/PLAYFILE",
+               host?:"127.0.0.1", iport);
+      free(host);
+    }
+
     if(this->slave_stream)
       handle_control_playfile(this, "PLAYFILE 0");
 
@@ -2179,15 +2198,9 @@
 	if(errno == ENOENT || errno == ENOTDIR) 
 	  LOGERR("File not found !");
 	if(this->fd_control >= 0) {
-	  char mrl[sizeof(filename)+256], mrlbase[256];
-	  char *host = strdup(strstr(this->mrl, "//")+2);
-	  char *port = strchr(host, ':');
+	  char mrl[4096+256];
 	  char *sub  = strstr(filename, "#subtitle:");
-	  int  iport = port ? atoi(port+1) : DEFAULT_VDR_PORT;
-	  if(port) *port = 0;
 	  if(sub) *sub = 0;
-	  snprintf(mrlbase, sizeof(mrlbase), "http://%s:%d/PLAYFILE", 
-		   host?:"127.0.0.1", iport);
 	  sprintf(mrl, "%s%s", mrlbase, filename + is_file_mrl);
 	  if(sub) {
 	    sub += 10; /*strlen("#subtitle:");*/
@@ -2195,7 +2208,6 @@
 	    strcat(mrl, mrlbase);
 	    strcat(mrl, sub);
 	  }
-	  free(host);
 	  LOGMSG("  -> trying to stream from server (%s) ...", mrl);
 	  strn0cpy(filename, mrl, sizeof(filename));
 	}
@@ -2288,6 +2300,51 @@
 		  mix_streams ? av : "");
 	  this->funcs.fe_control(this->funcs.fe_handle, tmp);
 	  has_video = _x_stream_info_get(this->slave_stream, XINE_STREAM_INFO_HAS_VIDEO);
+
+          /* Play background file */
+          if(!has_video && !mix_streams && *av && !strncmp(av, "bgstream", 8)) {
+
+            char bgfile[4096];
+            sprintf(bgfile,"%s",av+9);
+            if(strcmp(bgfile,"file:NOTFOUND")) {
+
+              LOGMSG("Got background file: %s", bgfile);
+
+              /* Background stream init */
+              if (!this->bg_stream.stream) {
+                LOGDBG("handle_control_playfile: Background stream init");
+                this->bg_stream.stream = xine_stream_new(this->class->xine, NULL, this->slave_stream->video_out);
+                xine_set_param(this->bg_stream.stream, XINE_PARAM_IGNORE_AUDIO, 1);
+                xine_set_param(this->bg_stream.stream, XINE_PARAM_AUDIO_CHANNEL_LOGICAL, -2);
+                xine_set_param(this->bg_stream.stream, XINE_PARAM_SPU_CHANNEL, -2);
+                xine_set_param(this->bg_stream.stream, XINE_PARAM_AUDIO_REPORT_LEVEL, 0);
+              }
+              if (!this->bg_stream.event_queue) {
+                LOGDBG("handle_control_playfile: Background event queue init");
+                this->bg_stream.event_queue = xine_event_new_queue(this->bg_stream.stream);
+                xine_event_create_listener_thread(this->bg_stream.event_queue, vdr_event_cb, this);
+              }
+
+              /* Open background file */
+              if (!xine_open(this->bg_stream.stream, bgfile) || !xine_play(this->bg_stream.stream, 0, 0)) {
+                LOGMSG("Error opening background file! (Permission denied ? Unknown format ?)");
+                if(this->fd_control >= 0) {
+                  /* Remote mode */
+                  char bgmrl[4096+256] = "";
+                  strcat(bgmrl, mrlbase);
+                  strcat(bgmrl, bgfile + 5);
+                  LOGMSG("  -> trying to stream background file from server (%s) ...", bgmrl);
+                  if (!xine_open(this->bg_stream.stream, bgmrl) || !xine_play(this->bg_stream.stream, 0, 0))
+                    LOGMSG("Error streaming background file from server!");
+                }
+              }
+            } else {
+              LOGMSG("Did not get a background file.");
+            }
+
+            has_video = 1;
+          }
+
 	  this->funcs.fe_control(this->funcs.fe_handle, 
 				 has_video ? "NOVIDEO 1\r\n" : "NOVIDEO 0\r\n");
 	  if(!has_video && !mix_streams && *av && strcmp(av, "none")) {
@@ -2312,6 +2369,20 @@
     LOGMSG("PLAYFILE <STOP>: Closing slave stream");
     this->loop_play = 0;
     if(this->slave_stream) {
+
+      if(this->bg_stream.stream) {
+        LOGMSG("PLAYFILE <STOP>: Closing background stream");
+        xine_stop(this->bg_stream.stream);
+
+        if (this->bg_stream.event_queue) {
+          xine_event_dispose_queue (this->bg_stream.event_queue);
+          this->bg_stream.event_queue = NULL;
+        }
+        xine_close(this->bg_stream.stream);
+        xine_dispose(this->bg_stream.stream);
+        this->bg_stream.stream = NULL;
+      }
+
       xine_stop(this->slave_stream);
 
       if (this->slave_event_queue) {
@@ -3570,6 +3641,10 @@
 	  }
 #endif
 	}
+      } else if(event->stream == this->bg_stream.stream) {
+        LOGMSG("XINE_EVENT_UI_PLAYBACK_FINISHED (background stream)");
+        /* This does not work for remote frontends/http streams? xine_open needed? */
+        xine_play(this->bg_stream.stream, 0, 0);
       }
       break;
 
@@ -4678,6 +4753,21 @@
 
   /* stop slave stream */
   if (this->slave_stream) {
+
+    /* stop background stream */
+    if(this->bg_stream.stream) {
+      LOGMSG("dispose: Closing background stream");
+      xine_stop(this->bg_stream.stream);
+
+      if (this->bg_stream.event_queue) {
+        xine_event_dispose_queue (this->bg_stream.event_queue);
+        this->bg_stream.event_queue = NULL;
+      }
+      xine_close(this->bg_stream.stream);
+      xine_dispose(this->bg_stream.stream);
+      this->bg_stream.stream = NULL;
+    }
+
     LOGMSG("dispose: Closing slave stream");
     if (this->slave_event_queue) 
       xine_event_dispose_queue (this->slave_event_queue);
