diff --git a/modules/gui/qt4/components/playlist/playlist.cpp b/modules/gui/qt4/components/playlist/playlist.cpp
index 3598743f9525706bb253fb49bb87f6a555dab06c..0837d469ecaee264106da92276fb1b41a3a405be 100644
--- a/modules/gui/qt4/components/playlist/playlist.cpp
+++ b/modules/gui/qt4/components/playlist/playlist.cpp
@@ -141,6 +141,7 @@ PlaylistWidget::PlaylistWidget( intf_thread_t *_p_i, QWidget *_par )
     DCONNECT( selector, categoryActivated( playlist_item_t *, bool ),
               mainView, setRootItem( playlist_item_t *, bool ) );
     mainView->setRootItem( p_root, false );
+    CONNECT( selector, SDCategorySelected(bool), mainView, setWaiting(bool) );
 
     /* */
     split = new PlaylistSplitter( this );
diff --git a/modules/gui/qt4/components/playlist/selector.cpp b/modules/gui/qt4/components/playlist/selector.cpp
index 8b4c0ccd16d7307c9506addaff4aaa2770d8622a..6463176aeb16ba9044665f7450d10d6d174b4862 100644
--- a/modules/gui/qt4/components/playlist/selector.cpp
+++ b/modules/gui/qt4/components/playlist/selector.cpp
@@ -334,6 +334,7 @@ void PLSelector::createItems()
             selItem = addItem( SD_TYPE, *ppsz_longname );
         }
 
+        selItem->treeItem()->setData( 0, SD_CATEGORY_ROLE, *p_category );
         putSDData( selItem, *ppsz_name, *ppsz_longname );
         if ( ! icon.isNull() )
             selItem->treeItem()->setData( 0, Qt::DecorationRole, icon );
@@ -419,7 +420,13 @@ void PLSelector::setSource( QTreeWidgetItem *item )
 
     /* */
     if( pl_item )
+    {
         emit categoryActivated( pl_item, false );
+        emit SDCategorySelected(
+                    item->data( 0, SD_CATEGORY_ROLE ).toInt()
+                    & ( SD_CAT_INTERNET | SD_CAT_LAN )
+        );
+    }
 }
 
 PLSelItem * PLSelector::addItem (
diff --git a/modules/gui/qt4/components/playlist/selector.hpp b/modules/gui/qt4/components/playlist/selector.hpp
index b1755b9b93ff63493087fae63a01499bc83f5f89..2daaa5408c3fbcc1f208fd02c6c9e216c1a77c38 100644
--- a/modules/gui/qt4/components/playlist/selector.hpp
+++ b/modules/gui/qt4/components/playlist/selector.hpp
@@ -62,6 +62,7 @@ enum {
     IN_ITEM_ROLE,        //input_item_t->i_id
     SPECIAL_ROLE,        //SpecialData
     CAP_SEARCH_ROLE,
+    SD_CATEGORY_ROLE,
 };
 
 enum ItemAction {
@@ -154,6 +155,7 @@ private slots:
 
 signals:
     void categoryActivated( playlist_item_t *, bool );
+    void SDCategorySelected( bool );
 };
 
 #endif
diff --git a/modules/gui/qt4/components/playlist/standardpanel.cpp b/modules/gui/qt4/components/playlist/standardpanel.cpp
index 35e61175703f62ef5e92074010f138f69b5e39dc..739f0fdcaa1babd652e7ceb5489ade7ae7ed957b 100644
--- a/modules/gui/qt4/components/playlist/standardpanel.cpp
+++ b/modules/gui/qt4/components/playlist/standardpanel.cpp
@@ -33,6 +33,7 @@
 #include "components/playlist/ml_model.hpp"       /* MLModel */
 #include "components/playlist/views.hpp"          /* 3 views */
 #include "components/playlist/selector.hpp"       /* PLSelector */
+#include "util/customwidgets.hpp"                 /* PixmapAnimator */
 #include "menus.hpp"                              /* Popup */
 #include "input_manager.hpp"                      /* THEMIM */
 #include "dialogs_provider.hpp"                   /* THEDP */
@@ -87,6 +88,14 @@ StandardPLPanel::StandardPLPanel( PlaylistWidget *_parent,
     currentRootIndexId  = -1;
     lastActivatedId     = -1;
 
+    QList<QString> frames;
+    frames << ":/util/wait1";
+    frames << ":/util/wait2";
+    frames << ":/util/wait3";
+    frames << ":/util/wait4";
+    spinnerAnimation = new PixmapAnimator( this, frames );
+    CONNECT( spinnerAnimation, pixmapReady( const QPixmap & ), this, updateViewport() );
+
     /* Saved Settings */
     int i_savedViewMode = getSettings()->value( "Playlist/view-mode", TREE_VIEW ).toInt();
     i_zoom = getSettings()->value( "Playlist/zoom", 0 ).toInt();
@@ -503,6 +512,20 @@ bool StandardPLPanel::eventFilter ( QObject *obj, QEvent * event )
                                       "media source from the left."),
                                   QPalette::Text );
         }
+        else if ( spinnerAnimation->state() == PixmapAnimator::Running )
+        {
+            if ( currentView->model()->rowCount() )
+                spinnerAnimation->stop(); /* Trick until SD emits events */
+            else
+            {
+                QWidget *viewport = qobject_cast<QWidget *>( obj );
+                QStylePainter painter( viewport );
+                QPixmap *spinner = spinnerAnimation->getPixmap();
+                QPoint point = viewport->geometry().center();
+                point -= QPoint( spinner->size().width() / 2, spinner->size().height() / 2 );
+                painter.drawPixmap( point, *spinner );
+            }
+        }
     }
     return false;
 }
@@ -682,6 +705,23 @@ void StandardPLPanel::showView( int i_view )
     gotoPlayingItem();
 }
 
+void StandardPLPanel::setWaiting( bool b )
+{
+    if ( b )
+    {
+        spinnerAnimation->setLoopCount( 20 ); /* Trick until SD emits an event */
+        spinnerAnimation->start();
+    }
+    else
+        spinnerAnimation->stop();
+}
+
+void StandardPLPanel::updateViewport()
+{
+    /* A single update on parent widget won't work */
+    currentView->viewport()->repaint();
+}
+
 int StandardPLPanel::currentViewIndex() const
 {
     if( currentView == treeView )
diff --git a/modules/gui/qt4/components/playlist/standardpanel.hpp b/modules/gui/qt4/components/playlist/standardpanel.hpp
index 725d79ebb4b349a6869fb81eec6bf21a788d9cdf..b4af7791b3b57c8b592210bc0a06c1a8d8c4799e 100644
--- a/modules/gui/qt4/components/playlist/standardpanel.hpp
+++ b/modules/gui/qt4/components/playlist/standardpanel.hpp
@@ -53,6 +53,7 @@ class PicFlowView;
 class LocationBar;
 class PLSelector;
 class PlaylistWidget;
+class PixmapAnimator;
 
 class StandardPLPanel: public QWidget
 {
@@ -110,10 +111,14 @@ private:
     /* for popup */
     QModelIndex popupIndex;  /* FIXME: don't store here, pass as Action param */
 
+    /* Wait spinner */
+    PixmapAnimator *spinnerAnimation;
+
 public slots:
     void setRootItem( playlist_item_t *, bool );
     void browseInto( const QModelIndex& );
     void showView( int );
+    void setWaiting( bool ); /* spinner */
 
 private slots:
     void deleteSelection();
@@ -140,6 +145,7 @@ private slots:
     void toggleColumnShown( int );
 
     void cycleViews();
+    void updateViewport(); /* spinner */
 
 signals:
     void viewChanged( const QModelIndex& );