diff --git a/src/libtomahawk/collection.cpp b/src/libtomahawk/collection.cpp
index fef020495..a229562d5 100644
--- a/src/libtomahawk/collection.cpp
+++ b/src/libtomahawk/collection.cpp
@@ -171,12 +171,6 @@ Collection::station( const QString& guid )
     return m_stations.value( guid, dynplaylist_ptr() );
 }
 
-QList< query_ptr >
-Collection::tracks()
-{
-    return m_tracks;
-}
-
 
 void
 Collection::setPlaylists( const QList<Tomahawk::playlist_ptr>& plists )
@@ -226,8 +220,8 @@ Collection::setTracks( const QList<Tomahawk::query_ptr>& tracks )
 {
 //    qDebug() << Q_FUNC_INFO << tracks.count() << name();
 
-    m_tracks << tracks;
     emit tracksAdded( tracks );
+    emit changed();
 }
 
 
@@ -235,8 +229,9 @@ void
 Collection::delTracks( const QStringList& files )
 {
     qDebug() << Q_FUNC_INFO << files.count() << name();
+    emit changed();
 
-    QList<Tomahawk::query_ptr> tracks;
+/*    QList<Tomahawk::query_ptr> tracks;
     int i = 0;
     foreach ( const query_ptr& query, m_tracks )
     {
@@ -263,7 +258,7 @@ Collection::delTracks( const QStringList& files )
     }
 
     tDebug() << "Emitting tracks removed:" << tracks.size();
-    emit tracksRemoved( tracks );
+    emit tracksRemoved( tracks );*/
 }
 
 
diff --git a/src/libtomahawk/collection.h b/src/libtomahawk/collection.h
index 5a06cc600..7bc713313 100644
--- a/src/libtomahawk/collection.h
+++ b/src/libtomahawk/collection.h
@@ -55,9 +55,8 @@ public:
     virtual QString name() const;
 
     virtual void loadPlaylists() { qDebug() << Q_FUNC_INFO; }
-    virtual void loadTracks() { qDebug() << Q_FUNC_INFO; }
-    virtual void loadAutoPlaylists() { qDebug() << Q_FUNC_INFO ; }
-    virtual void loadStations() { qDebug() << Q_FUNC_INFO ; }
+    virtual void loadAutoPlaylists() { qDebug() << Q_FUNC_INFO; }
+    virtual void loadStations() { qDebug() << Q_FUNC_INFO; }
 
     virtual Tomahawk::playlist_ptr playlist( const QString& guid );
     virtual Tomahawk::dynplaylist_ptr autoPlaylist( const QString& guid );
@@ -75,7 +74,6 @@ public:
     virtual QList< Tomahawk::playlist_ptr > playlists() { return m_playlists.values(); }
     virtual QList< Tomahawk::dynplaylist_ptr > autoPlaylists() { return m_autoplaylists.values(); }
     virtual QList< Tomahawk::dynplaylist_ptr > stations() { return m_stations.values(); }
-    virtual QList< Tomahawk::query_ptr > tracks();
 
     const source_ptr& source() const;
     unsigned int lastmodified() const { return m_lastmodified; }
@@ -93,6 +91,8 @@ signals:
     void stationsAdded( const QList<Tomahawk::dynplaylist_ptr>& );
     void stationsDeleted( const QList<Tomahawk::dynplaylist_ptr>& );
 
+    void changed();
+
 public slots:
     virtual void addTracks( const QList<QVariant>& newitems ) = 0;
     virtual void removeTracks( const QDir& dir ) = 0;
@@ -103,7 +103,6 @@ public slots:
 
     void setTracks( const QList<Tomahawk::query_ptr>& tracks );
     void delTracks( const QStringList& files );
-    void resetTrackCache() { m_tracks.clear(); m_isLoaded = false; }
 
 protected:
     QString m_name;
@@ -113,7 +112,6 @@ private:
     bool m_isLoaded;
 
     source_ptr m_source;
-    QList< Tomahawk::query_ptr > m_tracks;
     QHash< QString, Tomahawk::playlist_ptr > m_playlists;
     QHash< QString, Tomahawk::dynplaylist_ptr > m_autoplaylists;
     QHash< QString, Tomahawk::dynplaylist_ptr > m_stations;
diff --git a/src/libtomahawk/database/databasecollection.cpp b/src/libtomahawk/database/databasecollection.cpp
index d62271c6f..2ecb03e56 100644
--- a/src/libtomahawk/database/databasecollection.cpp
+++ b/src/libtomahawk/database/databasecollection.cpp
@@ -72,7 +72,7 @@ DatabaseCollection::loadStations()
     Database::instance()->enqueue( QSharedPointer<DatabaseCommand>( cmd ) );}
 
 
-void
+/*void
 DatabaseCollection::loadTracks()
 {
     qDebug() << Q_FUNC_INFO << source()->userName();
@@ -84,7 +84,7 @@ DatabaseCollection::loadTracks()
                     SLOT( setTracks( QList<Tomahawk::query_ptr> ) ) );
 
     Database::instance()->enqueue( QSharedPointer<DatabaseCommand>( cmd ) );
-}
+}*/
 
 
 void
@@ -143,7 +143,7 @@ DatabaseCollection::stations()
 }
 
 
-QList< Tomahawk::query_ptr >
+/*QList< Tomahawk::query_ptr >
 DatabaseCollection::tracks()
 {
     if ( !isLoaded() )
@@ -152,7 +152,7 @@ DatabaseCollection::tracks()
     }
 
     return Collection::tracks();
-}
+}*/
 
 
 void DatabaseCollection::autoPlaylistCreated( const source_ptr& source, const QVariantList& data )
diff --git a/src/libtomahawk/database/databasecollection.h b/src/libtomahawk/database/databasecollection.h
index d20480d6d..8ddfe8e58 100644
--- a/src/libtomahawk/database/databasecollection.h
+++ b/src/libtomahawk/database/databasecollection.h
@@ -38,13 +38,11 @@ public:
         qDebug() << Q_FUNC_INFO;
     }
 
-    virtual void loadTracks();
     virtual void loadPlaylists();
     virtual void loadAutoPlaylists();
     virtual void loadStations();
 
     virtual QList< Tomahawk::playlist_ptr > playlists();
-    virtual QList< Tomahawk::query_ptr > tracks();
     virtual QList< Tomahawk::dynplaylist_ptr > autoPlaylists();
     virtual QList< Tomahawk::dynplaylist_ptr > stations();
 
diff --git a/src/libtomahawk/playlist/collectionflatmodel.cpp b/src/libtomahawk/playlist/collectionflatmodel.cpp
index 57f7156c5..9759ed1f8 100644
--- a/src/libtomahawk/playlist/collectionflatmodel.cpp
+++ b/src/libtomahawk/playlist/collectionflatmodel.cpp
@@ -72,15 +72,13 @@ CollectionFlatModel::addCollection( const collection_ptr& collection, bool sendN
     if( sendNotifications )
         emit loadingStarted();
 
-    if ( collection->isLoaded() )
-    {
-        onTracksAdded( collection->tracks() );
-    }
-    else
-    {
-        collection->tracks(); // data will arrive via signals
-        m_loadingCollections << collection.data();
-    }
+    DatabaseCommand_AllTracks* cmd = new DatabaseCommand_AllTracks( collection );
+    connect( cmd, SIGNAL( tracks( QList<Tomahawk::query_ptr>, QVariant ) ),
+                    SLOT( onTracksAdded( QList<Tomahawk::query_ptr> ) ), Qt::QueuedConnection );
+
+    Database::instance()->enqueue( QSharedPointer<DatabaseCommand>( cmd ) );
+
+    m_loadingCollections << collection.data();
 
     if ( collection->source()->isLocal() )
         setTitle( tr( "My Collection" ) );
diff --git a/src/libtomahawk/playlist/treemodel.cpp b/src/libtomahawk/playlist/treemodel.cpp
index a9c4a0b1d..41920f2fb 100644
--- a/src/libtomahawk/playlist/treemodel.cpp
+++ b/src/libtomahawk/playlist/treemodel.cpp
@@ -23,6 +23,7 @@
 #include <QNetworkReply>
 
 #include "source.h"
+#include "sourcelist.h"
 #include "audio/audioengine.h"
 #include "database/databasecommand_allalbums.h"
 #include "database/databasecommand_alltracks.h"
@@ -553,6 +554,14 @@ TreeModel::addAllCollections()
 
     Database::instance()->enqueue( QSharedPointer<DatabaseCommand>( cmd ) );
 
+    connect( SourceList::instance(), SIGNAL( sourceAdded( Tomahawk::source_ptr ) ), SLOT( onSourceAdded( Tomahawk::source_ptr ) ) );
+
+    QList<Tomahawk::source_ptr> sources = SourceList::instance()->sources();
+    foreach ( const source_ptr& source, sources )
+    {
+        connect( source->collection().data(), SIGNAL( changed() ), SLOT( onCollectionChanged() ) );
+    }
+
     m_title = tr( "All Artists" );
 }
 
@@ -659,6 +668,8 @@ TreeModel::addCollection( const collection_ptr& collection )
 
     Database::instance()->enqueue( QSharedPointer<DatabaseCommand>( cmd ) );
 
+    connect( collection.data(), SIGNAL( changed() ), SLOT( onCollectionChanged() ) );
+
     if ( !collection->source()->avatar().isNull() )
         setIcon( collection->source()->avatar() );
 
@@ -694,6 +705,25 @@ TreeModel::addFilteredCollection( const collection_ptr& collection, unsigned int
 }
 
 
+void
+TreeModel::onSourceAdded( const Tomahawk::source_ptr& source )
+{
+    connect( source->collection().data(), SIGNAL( changed() ), SLOT( onCollectionChanged() ) );
+}
+
+
+void
+TreeModel::onCollectionChanged()
+{
+    clear();
+
+    if ( m_collection )
+        addCollection( m_collection );
+    else
+        addAllCollections();
+}
+
+
 void
 TreeModel::onArtistsAdded( const QList<Tomahawk::artist_ptr>& artists )
 {
diff --git a/src/libtomahawk/playlist/treemodel.h b/src/libtomahawk/playlist/treemodel.h
index 3973b396f..cab628a5f 100644
--- a/src/libtomahawk/playlist/treemodel.h
+++ b/src/libtomahawk/playlist/treemodel.h
@@ -154,6 +154,9 @@ private slots:
 
     void onDataChanged();
 
+    void onSourceAdded( const Tomahawk::source_ptr& source );
+    void onCollectionChanged();
+
 private:
     QPersistentModelIndex m_currentIndex;
     TreeModelItem* m_rootItem;
diff --git a/src/libtomahawk/sourcelist.h b/src/libtomahawk/sourcelist.h
index 9a714c17f..cfd452513 100644
--- a/src/libtomahawk/sourcelist.h
+++ b/src/libtomahawk/sourcelist.h
@@ -69,6 +69,7 @@ private slots:
 
     void latchedOn( const Tomahawk::source_ptr& );
     void latchedOff( const Tomahawk::source_ptr& );
+
 private:
     void add( const Tomahawk::source_ptr& source );
 
diff --git a/src/libtomahawk/sourceplaylistinterface.cpp b/src/libtomahawk/sourceplaylistinterface.cpp
index 87915af64..28a7abdec 100644
--- a/src/libtomahawk/sourceplaylistinterface.cpp
+++ b/src/libtomahawk/sourceplaylistinterface.cpp
@@ -35,9 +35,11 @@ SourcePlaylistInterface::SourcePlaylistInterface( Tomahawk::source_ptr& source )
     connect( source.data(), SIGNAL( playbackStarted( const Tomahawk::query_ptr& ) ), SLOT( onSourcePlaybackStarted( const Tomahawk::query_ptr& ) ) );
 }
 
+
 SourcePlaylistInterface::~SourcePlaylistInterface()
 {}
 
+
 Tomahawk::result_ptr
 SourcePlaylistInterface::siblingItem( int itemsAway )
 {
@@ -67,12 +69,14 @@ SourcePlaylistInterface::nextItem()
     return m_currentItem;
 }
 
+
 result_ptr
 SourcePlaylistInterface::currentItem() const
 {
     return m_currentItem;
 }
 
+
 bool
 SourcePlaylistInterface::hasNextItem()
 {
@@ -87,7 +91,8 @@ SourcePlaylistInterface::hasNextItem()
 QList<Tomahawk::query_ptr>
 SourcePlaylistInterface::tracks()
 {
-    return m_source->collection()->tracks();
+    QList<Tomahawk::query_ptr> tracks;
+    return tracks; // FIXME
 }