diff --git a/include/vlc_configuration.h b/include/vlc_configuration.h
index c0ee83a..ab55ac0 100644
--- a/include/vlc_configuration.h
+++ b/include/vlc_configuration.h
@@ -67,6 +67,7 @@ extern "C" {
 #define CONFIG_ITEM_MODULE_LIST_CAT         0x00B0  /* Module option */
 #define CONFIG_ITEM_FONT                    0x00C0  /* Font option */
 #define CONFIG_ITEM_PASSWORD                0x00D0  /* Password option (*) */
+#define CONFIG_ITEM_SKIN                    0x00E0  /* Skin choser */
 
 #define CONFIG_ITEM                         0x00F0
 
@@ -373,6 +374,9 @@ VLC_EXPORT( int, vlc_config_set, (module_config_t *, int, ...) );
     add_string_inner( CONFIG_ITEM_MODULE_LIST, name, text, longtext, advc, p_callback, value ); \
     vlc_config_set (p_config, VLC_CONFIG_CAPABILITY, (const char *)(psz_caps))
 
+#define add_skin_choser( name, value, p_callback, text, longtext, advc ) \
+    add_string_inner( CONFIG_ITEM_SKIN, name, text, longtext, advc, p_callback, value )
+
 #ifndef __PLUGIN__
 #define add_module_cat( name, i_subcategory, value, p_callback, text, longtext, advc ) \
     add_string_inner( CONFIG_ITEM_MODULE_CAT, name, text, longtext, advc, p_callback, value ); \
diff --git a/modules/gui/qt4/components/preferences_widgets.cpp b/modules/gui/qt4/components/preferences_widgets.cpp
index e346fd0..905d820 100644
--- a/modules/gui/qt4/components/preferences_widgets.cpp
+++ b/modules/gui/qt4/components/preferences_widgets.cpp
@@ -47,6 +47,7 @@
 #include <QTreeWidgetItem>
 #include <QSignalMapper>
 #include <QDialogButtonBox>
+#include <QListWidget>
 
 #define MINWIDTH_BOX 90
 #define LAST_COLUMN 10
@@ -133,6 +134,10 @@ ConfigControl *ConfigControl::createControl( vlc_object_t *p_this,
         p_control = new DirectoryConfigControl( p_this, p_item, parent, l,
                                                 line, false );
         break;
+    case CONFIG_ITEM_SKIN:
+        p_control = new SkinChoserControl( p_this, p_item, parent, l,
+                                           line, false);
+        break;
 #if 0
     case CONFIG_ITEM_FONT:
         p_control = new FontConfigControl( p_this, p_item, parent, l,
@@ -337,6 +342,65 @@ void DirectoryConfigControl::updateField()
     text->setText( dir );
 }
 
+SkinChoserList::SkinChoserList( QWidget *parent, vlc_object_t *_p_this ) : QListWidget ( parent )
+{
+    p_this = _p_this;
+
+    setIconSize( QSize( 200, 80 ) );
+
+    QDir dir;
+    QString path( config_GetDataDir() );
+    path.append( "/skins2" );
+    dir.setPath( path );
+    dir.setFilter( QDir::Files );
+    QFileInfoList list = dir.entryInfoList();
+
+    path = QString( p_this->p_libvlc->psz_datadir );
+    path.append( "/skins2" );
+    dir.setPath( path );
+    dir.setFilter( QDir::Files );
+    list += dir.entryInfoList();
+
+    for( int i = 0; i < list.size(); ++i )
+    {
+         QFileInfo fileInfo = list.at(i);
+         if( fileInfo.completeSuffix() == "vlt" )
+             new SkinItem( QIcon(/*preview.png*/), fileInfo.baseName(), fileInfo.absoluteFilePath(), this);
+    }
+
+    connect( this, SIGNAL( itemClicked(QListWidgetItem *) ), this, SLOT( change(QListWidgetItem *) ) );
+}
+
+void SkinChoserList::change( QListWidgetItem *it )
+{
+    SkinItem *item = dynamic_cast<SkinItem*> ( it );
+    char *file = config_GetPsz( p_this, "skins2-last" );
+    msg_Dbg( p_this, "old skin: %s", file );
+    msg_Dbg( p_this, "new skin: %s", qtu( item->getPath() ) );
+
+    config_PutPsz( p_this, "skins2-last", qtu( item->getPath() ) );
+
+    /* TODO: reload skin */
+}
+
+SkinChoserControl::SkinChoserControl( vlc_object_t *_p_this,
+                                      module_config_t *_p_item,
+                                      QWidget *_parent, QGridLayout *l,
+                                      int &line, bool _pwd ) :
+                VStringConfigControl( _p_this, _p_item, _parent )
+{
+    p_this = _p_this;
+
+    label = new QLabel( qtr(p_item->psz_text) );
+    list = new SkinChoserList( _parent, p_this );
+
+    QVBoxLayout *layout = new QVBoxLayout;
+    layout->addWidget( label );
+    layout->addWidget( list );
+
+    l->addLayout( layout, line, 0 );
+}
+
 #if 0
 #include <QFontDialog>
 
diff --git a/modules/gui/qt4/components/preferences_widgets.hpp b/modules/gui/qt4/components/preferences_widgets.hpp
index ee0bee1..99eeb97 100644
--- a/modules/gui/qt4/components/preferences_widgets.hpp
+++ b/modules/gui/qt4/components/preferences_widgets.hpp
@@ -47,7 +47,7 @@
 #include <QPushButton>
 #include <QVector>
 #include <QDialog>
-
+#include <QListWidget>
 
 class QFile;
 class QTreeWidget;
@@ -316,6 +316,52 @@ public slots:
     virtual void updateField();
 };
 
+class SkinItem : public QListWidgetItem
+{
+public:
+    SkinItem( QIcon i, QString n, QString p, QListWidget *parent ) :
+              QListWidgetItem( i, n, parent ) {
+              path = p;
+              }
+    ~SkinItem () {}
+    QString getPath (void) { return path; }
+private:
+    QString path;
+};
+
+class SkinChoserList : public QListWidget
+{
+    Q_OBJECT
+    public:
+        SkinChoserList ( QWidget *parent, vlc_object_t *_p_this );
+        ~SkinChoserList () {}
+    public slots:
+        void change(QListWidgetItem *it);
+    private:
+        vlc_object_t *p_this;
+};
+
+class SkinChoserControl : public VStringConfigControl
+{
+    Q_OBJECT;
+public:
+    SkinChoserControl( vlc_object_t *, module_config_t *, QWidget *,
+                        QGridLayout *, int&, bool pwd);
+    virtual ~SkinChoserControl() {};
+    virtual QString getValue() { 
+        if( list->selectedItems().count() == 1 )
+        {
+            SkinItem *item = dynamic_cast<SkinItem*> (list->selectedItems().first());
+            return item->getPath();
+        } else
+            return "";
+    };
+
+private:
+    QLabel *label;
+    SkinChoserList *list;
+};
+
 #if 0
 class FontConfigControl : public FileConfigControl
 {
diff --git a/modules/gui/skins2/src/skin_main.cpp b/modules/gui/skins2/src/skin_main.cpp
index 26c3f17..30b4a55 100644
--- a/modules/gui/skins2/src/skin_main.cpp
+++ b/modules/gui/skins2/src/skin_main.cpp
@@ -422,12 +422,10 @@ static int onTaskBarChange( vlc_object_t *pObj, const char *pVariable,
     return VLC_SUCCESS;
 }
 
-
 //---------------------------------------------------------------------------
 // Module descriptor
 //---------------------------------------------------------------------------
-#define SKINS2_LAST      N_("Skin to use")
-#define SKINS2_LAST_LONG N_("Path to the skin to use.")
+
 #define SKINS2_CONFIG      N_("Config of last used skin")
 #define SKINS2_CONFIG_LONG N_("Windows configuration of the last skin used. " \
         "This option is updated automatically, do not touch it." )
@@ -441,13 +439,12 @@ static int onTaskBarChange( vlc_object_t *pObj, const char *pVariable,
     " correctly.")
 #define SKINS2_PLAYLIST N_("Use a skinned playlist")
 #define SKINS2_PLAYLIST_LONG N_("Use a skinned playlist")
+#define SKINS2_CHOSER      N_("Skin to use")
+#define SKINS2_CHOSER_LONG N_("Skin to use")
 
 vlc_module_begin();
     set_category( CAT_INTERFACE );
     set_subcategory( SUBCAT_INTERFACE_MAIN );
-    add_file( "skins2-last", "", NULL, SKINS2_LAST, SKINS2_LAST_LONG,
-              VLC_TRUE );
-        change_autosave();
     add_string( "skins2-config", "", NULL, SKINS2_CONFIG, SKINS2_CONFIG_LONG,
                 VLC_TRUE );
         change_autosave();
@@ -463,6 +460,10 @@ vlc_module_begin();
 
     add_bool( "skinned-playlist", VLC_TRUE, NULL, SKINS2_PLAYLIST,
               SKINS2_PLAYLIST_LONG, VLC_FALSE );
+    add_skin_choser( "skins2-last", "",  NULL, SKINS2_CHOSER,
+                     SKINS2_CHOSER_LONG, VLC_FALSE );
+        change_autosave();
+
     set_shortname( _("Skins"));
     set_description( _("Skinnable Interface") );
     set_capability( "interface", 30 );
diff --git a/modules/gui/wxwidgets/dialogs/preferences_widgets.cpp b/modules/gui/wxwidgets/dialogs/preferences_widgets.cpp
index 34ca3fc..faa7308 100644
--- a/modules/gui/wxwidgets/dialogs/preferences_widgets.cpp
+++ b/modules/gui/wxwidgets/dialogs/preferences_widgets.cpp
@@ -51,6 +51,7 @@ ConfigControl *CreateConfigControl( vlc_object_t *p_this,
         break;
 
     case CONFIG_ITEM_STRING:
+    case CONFIG_ITEM_SKIN:
         if( !p_item->i_list )
         {
             p_control = new StringConfigControl( p_this, p_item, parent );
diff --git a/src/config/core.c b/src/config/core.c
index 3b8d91c..cab994c 100644
--- a/src/config/core.c
+++ b/src/config/core.c
@@ -71,7 +71,8 @@ int IsConfigStringType (int type)
     {
         CONFIG_ITEM_STRING, CONFIG_ITEM_FILE, CONFIG_ITEM_MODULE,
         CONFIG_ITEM_DIRECTORY, CONFIG_ITEM_MODULE_CAT, CONFIG_ITEM_PASSWORD,
-        CONFIG_ITEM_MODULE_LIST, CONFIG_ITEM_MODULE_LIST_CAT
+        CONFIG_ITEM_MODULE_LIST, CONFIG_ITEM_MODULE_LIST_CAT,
+        CONFIG_ITEM_SKIN
     };
 
     /* NOTE: this needs to be changed if we ever get more than 255 types */
@@ -141,6 +142,7 @@ int __config_GetType( vlc_object_t *p_this, const char *psz_name )
         break;
 
     case CONFIG_ITEM_FILE:
+    case CONFIG_ITEM_SKIN:
         i_type = VLC_VAR_FILE;
         break;
 
