diff --git a/modules/gui/skins/controls/playlist.cpp b/modules/gui/skins/controls/playlist.cpp
index b44486cb33db927f6a8f589513ef6bbcdae8602e..b03b079b6180ddae14e2afcce8bb731196bc2ccf 100644
--- a/modules/gui/skins/controls/playlist.cpp
+++ b/modules/gui/skins/controls/playlist.cpp
@@ -2,7 +2,7 @@
  * playlist.cpp: Playlist control
  *****************************************************************************
  * Copyright (C) 2003 VideoLAN
- * $Id: playlist.cpp,v 1.14 2003/06/09 14:04:20 asmax Exp $
+ * $Id: playlist.cpp,v 1.15 2003/06/23 20:35:36 asmax Exp $
  *
  * Authors: Olivier Teulière <ipkiss@via.ecp.fr>
  *          Emmanuel Puig    <karibu@via.ecp.fr>
@@ -79,6 +79,7 @@ ControlPlayList::ControlPlayList( string id, bool visible, int width,
 
     // Scroll
     StartIndex  = 0;
+
 }
 //---------------------------------------------------------------------------
 ControlPlayList::~ControlPlayList()
diff --git a/modules/gui/skins/src/skin_main.cpp b/modules/gui/skins/src/skin_main.cpp
index c18235c8f6d6660a6a958418109e35fa3f69d01a..87366de8336da7a7ed0780b8f7e4176435fee162 100644
--- a/modules/gui/skins/src/skin_main.cpp
+++ b/modules/gui/skins/src/skin_main.cpp
@@ -2,7 +2,7 @@
  * skin-main.cpp: skins plugin for VLC
  *****************************************************************************
  * Copyright (C) 2003 VideoLAN
- * $Id: skin_main.cpp,v 1.41 2003/06/22 17:52:12 gbazin Exp $
+ * $Id: skin_main.cpp,v 1.42 2003/06/23 20:35:36 asmax Exp $
  *
  * Authors: Olivier Teulière <ipkiss@via.ecp.fr>
  *          Emmanuel Puig    <karibu@via.ecp.fr>
@@ -333,7 +333,6 @@ static void Run( intf_thread_t *p_intf )
 
     msg_Dbg( p_intf, "Load theme time : %i ms", OSAPI_GetTime() - a );
 
-    // Refresh the whole interface
     OSAPI_PostMessage( NULL, VLC_INTF_REFRESH, 0, (int)true );
 
     OSRun( p_intf );
@@ -390,8 +389,6 @@ int SkinManage( intf_thread_t *p_intf )
         p_intf->p_sys->p_input = NULL;
     }
 
-    OSAPI_PostMessage( NULL, VLC_INTF_REFRESH, 0, (long)false );
-
 #if !defined(MODULE_NAME_IS_basic_skins) //FIXME
     // Update the log window
     p_intf->p_sys->p_dialogs->MessagesDlg->UpdateLog();
@@ -419,7 +416,6 @@ int SkinManage( intf_thread_t *p_intf )
             p_intf->p_sys->p_theme->EvtBank->Get( "volume_refresh" ),
             (long)( volume * SLIDER_RANGE / AOUT_VOLUME_MAX ) );
 
-
         // Refresh slider
         // if( p_input->stream.b_seekable && p_intf->p_sys->b_playing )
         if( p_input->stream.b_seekable )
diff --git a/modules/gui/skins/src/vlcproc.cpp b/modules/gui/skins/src/vlcproc.cpp
index cb06a65ac9cf77612cc4b6974ad100e14aabd3db..773c1560226bc84373bd655ec336d48a929e0097 100644
--- a/modules/gui/skins/src/vlcproc.cpp
+++ b/modules/gui/skins/src/vlcproc.cpp
@@ -2,7 +2,7 @@
  * vlcproc.cpp: VlcProc class
  *****************************************************************************
  * Copyright (C) 2003 VideoLAN
- * $Id: vlcproc.cpp,v 1.38 2003/06/22 12:46:49 asmax Exp $
+ * $Id: vlcproc.cpp,v 1.39 2003/06/23 20:35:36 asmax Exp $
  *
  * Authors: Olivier Teulière <ipkiss@via.ecp.fr>
  *          Emmanuel Puig    <karibu@via.ecp.fr>
@@ -46,11 +46,28 @@
 //---------------------------------------------------------------------------
 VlcProc::VlcProc( intf_thread_t *_p_intf )
 {
-    p_intf = _p_intf;
+    p_intf = _p_intf; 
+    
+    playlist_t *p_playlist = (playlist_t *)vlc_object_find( p_intf, 
+        VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
+    if( p_playlist != NULL )
+    {
+        // We want to be noticed of playlit changes
+        var_AddCallback( p_playlist, "intf-change", RefreshCallback, this );
+        vlc_object_release( p_playlist );   
+    }
 }
 //---------------------------------------------------------------------------
 VlcProc::~VlcProc()
 {
+    // Remove the refresh callback
+    playlist_t *p_playlist = (playlist_t *)vlc_object_find( p_intf, 
+        VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
+    if( p_playlist != NULL )
+    {
+        var_DelCallback( p_playlist, "intf-change", RefreshCallback, this );
+        vlc_object_release( p_playlist );
+    }
 }
 //---------------------------------------------------------------------------
 bool VlcProc::EventProc( Event *evt )
@@ -145,7 +162,7 @@ bool VlcProc::EventProc( Event *evt )
             return true;
 
         case VLC_INTF_REFRESH:
-            InterfaceRefresh( (bool)evt->GetParam2() );
+            InterfaceRefresh();
             return true;
 
         case VLC_TEST_ALL_CLOSED:
@@ -225,7 +242,16 @@ bool VlcProc::IsClosing()
 //---------------------------------------------------------------------------
 // Private methods
 //---------------------------------------------------------------------------
-void VlcProc::InterfaceRefresh( bool All )
+
+// Refresh callback
+int VlcProc::RefreshCallback( vlc_object_t *p_this, const char *psz_variable,
+        vlc_value_t old_val, vlc_value_t new_val, void *param )
+{
+    ( (VlcProc*)param )->InterfaceRefresh();
+    return VLC_SUCCESS;
+}
+
+void VlcProc::InterfaceRefresh()
 {
     // Shortcut pointers
     intf_sys_t  *Sys      = p_intf->p_sys;
@@ -308,7 +334,6 @@ void VlcProc::InterfaceRefresh( bool All )
             Sys->i_size  = 0;
         }
     }
-
 }
 //---------------------------------------------------------------------------
 void VlcProc::EnabledEvent( string type, bool state )
diff --git a/modules/gui/skins/src/vlcproc.h b/modules/gui/skins/src/vlcproc.h
index 34035b5585b45fc68ad6a504584132a4f6a644da..57f2a3ea238352e0e27a48218f2e24919a579c21 100644
--- a/modules/gui/skins/src/vlcproc.h
+++ b/modules/gui/skins/src/vlcproc.h
@@ -2,7 +2,7 @@
  * vlcproc.h: VlcProc class
  *****************************************************************************
  * Copyright (C) 2003 VideoLAN
- * $Id: vlcproc.h,v 1.7 2003/06/09 12:33:16 asmax Exp $
+ * $Id: vlcproc.h,v 1.8 2003/06/23 20:35:36 asmax Exp $
  *
  * Authors: Olivier Teulière <ipkiss@via.ecp.fr>
  *          Emmanuel Puig    <karibu@via.ecp.fr>
@@ -52,7 +52,10 @@ class VlcProc
         void ChangeVolume( unsigned int msg, long param );
         void AddNetworkUDP( int port );
 
-        void InterfaceRefresh( bool All = false );
+        static int RefreshCallback( vlc_object_t *p_this, 
+            const char *psz_variable, vlc_value_t old_val, vlc_value_t new_val, 
+            void *param );
+        void InterfaceRefresh();
         void EnabledEvent( string type, bool state );
 
     public:
diff --git a/src/playlist/playlist.c b/src/playlist/playlist.c
index 384a91f67efaab7714a675aef961b7f7b7190cd5..5a2de7843509ca008c989e62c9a8fb3a7f2a40ab 100644
--- a/src/playlist/playlist.c
+++ b/src/playlist/playlist.c
@@ -2,7 +2,7 @@
  * playlist.c : Playlist management functions
  *****************************************************************************
  * Copyright (C) 1999-2001 VideoLAN
- * $Id: playlist.c,v 1.36 2003/05/26 19:06:47 gbazin Exp $
+ * $Id: playlist.c,v 1.37 2003/06/23 20:35:36 asmax Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *
@@ -557,6 +557,7 @@ static void SkipItem( playlist_t *p_playlist, int i_arg )
 {
     int i_oldindex = p_playlist->i_index;
     vlc_bool_t b_random;
+    vlc_value_t val;
 
     /* If the playlist is empty, there is no current item */
     if( p_playlist->i_size == 0 )
@@ -604,6 +605,9 @@ static void SkipItem( playlist_t *p_playlist, int i_arg )
     {
         p_playlist->i_index = p_playlist->i_size - 1;
     }
+
+    val.b_bool = VLC_TRUE;
+    var_Set( p_playlist, "intf-change", val );
 }
 
 /*****************************************************************************