diff --git a/src/libtomahawk/CMakeLists.txt b/src/libtomahawk/CMakeLists.txt
index 7db019b14..cfd5b83d4 100644
--- a/src/libtomahawk/CMakeLists.txt
+++ b/src/libtomahawk/CMakeLists.txt
@@ -184,6 +184,7 @@ set( libSources
     FuncTimeout.cpp
     Playlist.cpp
     PlaylistPlaylistInterface.cpp
+    MetaPlaylistInterface.cpp
     Resolver.cpp
     ExternalResolver.cpp
     Query.cpp
diff --git a/src/libtomahawk/MetaPlaylistInterface.cpp b/src/libtomahawk/MetaPlaylistInterface.cpp
new file mode 100644
index 000000000..98dc5626e
--- /dev/null
+++ b/src/libtomahawk/MetaPlaylistInterface.cpp
@@ -0,0 +1,181 @@
+/* === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===
+ *
+ *   Copyright 2012, Christian Muehlhaeuser <muesli@tomahawk-player.org>
+ *
+ *   Tomahawk is free software: you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation, either version 3 of the License, or
+ *   (at your option) any later version.
+ *
+ *   Tomahawk is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with Tomahawk. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "MetaPlaylistInterface.h"
+#include "Result.h"
+#include "Pipeline.h"
+#include "Source.h"
+#include "utils/Logger.h"
+
+using namespace Tomahawk;
+
+
+MetaPlaylistInterface::MetaPlaylistInterface()
+    : Tomahawk::PlaylistInterface()
+{
+}
+
+
+MetaPlaylistInterface::~MetaPlaylistInterface()
+{
+}
+
+
+void
+MetaPlaylistInterface::addChildInterface( const Tomahawk::playlistinterface_ptr& interface )
+{
+    m_childInterfaces << interface;
+
+    if ( m_childInterfaces.count() == 1 )
+    {
+        connect( interface.data(), SIGNAL( repeatModeChanged( Tomahawk::PlaylistModes::RepeatMode ) ),
+                                   SIGNAL( repeatModeChanged( Tomahawk::PlaylistModes::RepeatMode ) ) );
+
+        connect( interface.data(), SIGNAL( shuffleModeChanged( bool ) ),
+                                   SIGNAL( shuffleModeChanged( bool ) ) );
+    }
+}
+
+
+QList< Tomahawk::query_ptr >
+MetaPlaylistInterface::tracks() const
+{
+    if ( m_childInterfaces.count() )
+        return m_childInterfaces.first()->tracks();
+    else
+        return QList< Tomahawk::query_ptr >();
+}
+
+
+int
+MetaPlaylistInterface::trackCount() const
+{
+    if ( m_childInterfaces.count() )
+        return m_childInterfaces.first()->trackCount();
+    else
+        return 0;
+}
+
+
+result_ptr
+MetaPlaylistInterface::currentItem() const
+{
+    if ( m_childInterfaces.count() )
+        return m_childInterfaces.first()->currentItem();
+    else
+        return Tomahawk::result_ptr();
+}
+
+
+qint64
+MetaPlaylistInterface::siblingIndex( int itemsAway, qint64 rootIndex ) const
+{
+    if ( m_childInterfaces.count() )
+        return m_childInterfaces.first()->siblingIndex( itemsAway, rootIndex );
+    else
+        return -1;
+}
+
+
+Tomahawk::query_ptr
+MetaPlaylistInterface::queryAt( qint64 index ) const
+{
+    if ( m_childInterfaces.count() )
+        return m_childInterfaces.first()->queryAt( index );
+    else
+        return Tomahawk::query_ptr();
+}
+
+
+Tomahawk::result_ptr
+MetaPlaylistInterface::resultAt( qint64 index ) const
+{
+    if ( m_childInterfaces.count() )
+        return m_childInterfaces.first()->resultAt( index );
+    else
+        return Tomahawk::result_ptr();
+}
+
+
+qint64
+MetaPlaylistInterface::indexOfResult( const Tomahawk::result_ptr& result ) const
+{
+    if ( m_childInterfaces.count() )
+        return m_childInterfaces.first()->indexOfResult( result );
+    else
+        return -1;
+}
+
+
+qint64
+MetaPlaylistInterface::indexOfQuery( const Tomahawk::query_ptr& query ) const
+{
+    if ( m_childInterfaces.count() )
+        return m_childInterfaces.first()->indexOfQuery( query );
+    else
+        return -1;
+}
+
+
+PlaylistModes::RepeatMode
+MetaPlaylistInterface::repeatMode() const
+{
+    if ( m_childInterfaces.count() )
+        return m_childInterfaces.first()->repeatMode();
+    else
+        return PlaylistModes::NoRepeat;
+}
+
+
+bool
+MetaPlaylistInterface::shuffled() const
+{
+    if ( m_childInterfaces.count() )
+        return m_childInterfaces.first()->shuffled();
+    else
+        return false;
+}
+
+
+bool
+MetaPlaylistInterface::hasChildInterface( const Tomahawk::playlistinterface_ptr& interface )
+{
+    foreach ( const Tomahawk::playlistinterface_ptr& iface, m_childInterfaces )
+    {
+        if ( iface == interface || iface->hasChildInterface( interface ) )
+            return true;
+    }
+
+    return false;
+}
+
+
+void
+MetaPlaylistInterface::setRepeatMode( PlaylistModes::RepeatMode mode )
+{
+    if ( m_childInterfaces.count() )
+        return m_childInterfaces.first()->setRepeatMode( mode );
+}
+
+
+void
+MetaPlaylistInterface::setShuffled( bool enabled )
+{
+    if ( m_childInterfaces.count() )
+        return m_childInterfaces.first()->setShuffled( enabled );
+}
diff --git a/src/libtomahawk/MetaPlaylistInterface.h b/src/libtomahawk/MetaPlaylistInterface.h
new file mode 100644
index 000000000..cf7bb9030
--- /dev/null
+++ b/src/libtomahawk/MetaPlaylistInterface.h
@@ -0,0 +1,66 @@
+/* === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===
+ *
+ *   Copyright 2012, Christian Muehlhaeuser <muesli@tomahawk-player.org>
+ *
+ *   Tomahawk is free software: you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation, either version 3 of the License, or
+ *   (at your option) any later version.
+ *
+ *   Tomahawk is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with Tomahawk. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef METAPLAYLISTINTERFACE_H
+#define METAPLAYLISTINTERFACE_H
+
+#include <QtCore/QModelIndex>
+
+#include "PlaylistInterface.h"
+#include "playlist/PlayableItem.h"
+#include "Typedefs.h"
+#include "DllMacro.h"
+
+namespace Tomahawk
+{
+
+class DLLEXPORT MetaPlaylistInterface : public PlaylistInterface
+{
+Q_OBJECT
+
+public:
+    explicit MetaPlaylistInterface();
+    virtual ~MetaPlaylistInterface();
+
+    void addChildInterface( const Tomahawk::playlistinterface_ptr& interface );
+
+    virtual QList< Tomahawk::query_ptr > tracks() const;
+    virtual int trackCount() const;
+    virtual Tomahawk::result_ptr currentItem() const;
+    virtual qint64 siblingIndex( int itemsAway, qint64 rootIndex = -1 ) const;
+    virtual Tomahawk::result_ptr resultAt( qint64 index ) const;
+    virtual Tomahawk::query_ptr queryAt( qint64 index ) const;
+    virtual qint64 indexOfResult( const Tomahawk::result_ptr& result ) const;
+    virtual qint64 indexOfQuery( const Tomahawk::query_ptr& query ) const;
+
+    virtual PlaylistModes::RepeatMode repeatMode() const;
+    virtual bool shuffled() const;
+
+    virtual bool hasChildInterface( const Tomahawk::playlistinterface_ptr& interface );
+
+public slots:
+    virtual void setRepeatMode( PlaylistModes::RepeatMode mode );
+    virtual void setShuffled( bool enabled );
+
+private:
+    QList< Tomahawk::playlistinterface_ptr > m_childInterfaces;
+};
+
+}
+
+#endif // METAPLAYLISTINTERFACE_H