diff --git a/src/libtomahawk/widgets/NetworkActivityWidget.cpp b/src/libtomahawk/widgets/NetworkActivityWidget.cpp
index 34926a275..209f39683 100644
--- a/src/libtomahawk/widgets/NetworkActivityWidget.cpp
+++ b/src/libtomahawk/widgets/NetworkActivityWidget.cpp
@@ -19,16 +19,28 @@
 #include "NetworkActivityWidget.h"
 #include "ui_NetworkActivityWidget.h"
 
+#include "Pipeline.h"
+#include "database/Database.h"
+#include "database/DatabaseCommand_NetworkCharts.h"
+#include "playlist/PlaylistChartItemDelegate.h"
 #include "utils/AnimatedSpinner.h"
 #include "utils/TomahawkUtilsGui.h"
 
+#include <QDateTime>
+#include <QStandardItemModel>
 #include <QtConcurrentRun>
 
+#define NETWORKCHARTS_NUM_TRACKS 100
+#define NETWORKCHARTS_WEEK_CHARTS "week"
+#define NETWORKCHARTS_MONTH_CHARTS "month"
+#define NETWORKCHARTS_YEAR_CHARTS "year"
+
+using namespace Tomahawk;
+
 NetworkActivityWidget::NetworkActivityWidget( QWidget *parent )
     : QWidget( parent )
     , ui( new Ui::NetworkActivityWidget )
-    //, m_sortedProxy( 0 )
-    //, m_loading( true )
+    , m_sortedProxy( 0 )
 {
     ui->setupUi( this );
 
@@ -37,31 +49,30 @@ NetworkActivityWidget::NetworkActivityWidget( QWidget *parent )
     TomahawkUtils::unmarginLayout( ui->horizontalLayout->layout() );
     TomahawkUtils::unmarginLayout( ui->breadCrumbLeft->layout() );
 
-//    m_crumbModelLeft = new QStandardItemModel( this );
-//    m_sortedProxy = new QSortFilterProxyModel( this );
-//    m_sortedProxy->setDynamicSortFilter( true );
-//    m_sortedProxy->setFilterCaseSensitivity( Qt::CaseInsensitive );
+    m_crumbModelLeft = new QStandardItemModel( this );
+    m_sortedProxy = new QSortFilterProxyModel( this );
+    m_sortedProxy->setDynamicSortFilter( true );
+    m_sortedProxy->setFilterCaseSensitivity( Qt::CaseInsensitive );
 
     ui->breadCrumbLeft->setRootIcon( TomahawkUtils::defaultPixmap( TomahawkUtils::NetworkActivity, TomahawkUtils::Original ) );
-//    connect( ui->breadCrumbLeft, SIGNAL( activateIndex( QModelIndex ) ), SLOT( leftCrumbIndexChanged( QModelIndex ) ) );
+    connect( ui->breadCrumbLeft, SIGNAL( activateIndex( QModelIndex ) ), SLOT( leftCrumbIndexChanged( QModelIndex ) ) );
 
     ui->tracksViewLeft->setHeaderHidden( true );
     ui->tracksViewLeft->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
-//    PlaylistChartItemDelegate* del = new PlaylistChartItemDelegate( ui->tracksViewLeft, ui->tracksViewLeft->proxyModel() );
-//    ui->tracksViewLeft->setItemDelegate( del );
+    PlaylistChartItemDelegate* del = new PlaylistChartItemDelegate( ui->tracksViewLeft, ui->tracksViewLeft->proxyModel() );
+    ui->tracksViewLeft->setItemDelegate( del );
     ui->tracksViewLeft->setUniformRowHeights( false );
 
     m_playlistInterface = ui->tracksViewLeft->playlistInterface();
 
     // Lets have a spinner until loaded
     ui->breadCrumbLeft->setVisible( false );
-    m_spinner = QSharedPointer<AnimatedSpinner>( new AnimatedSpinner( ui->tracksViewLeft ) );
+    m_spinner = new AnimatedSpinner( ui->tracksViewLeft );
     m_spinner->fadeIn();
 }
 
 NetworkActivityWidget::~NetworkActivityWidget()
 {
-    delete ui;
 }
 
 Tomahawk::playlistinterface_ptr
@@ -73,7 +84,9 @@ NetworkActivityWidget::playlistInterface() const
 bool
 NetworkActivityWidget::jumpToCurrentTrack()
 {
-    // TODO
+    if ( ui->tracksViewLeft->model() && ui->tracksViewLeft->jumpToCurrentTrack() )
+        return true;
+
     return false;
 }
 
@@ -84,7 +97,127 @@ NetworkActivityWidget::fetchData()
     QtConcurrent::run( this, &NetworkActivityWidget::actualFetchData );
 }
 
+void
+NetworkActivityWidget::weeklyCharts( const QList<Tomahawk::track_ptr>& tracks )
+{
+    QSharedPointer<QMutexLocker> locker = QSharedPointer<QMutexLocker>( new QMutexLocker( &m_retrieveMutex ) );
+    m_weeklyChartsModel = new PlaylistModel( ui->tracksViewLeft );
+    m_weeklyChartsModel->startLoading();
+    // Pipeline::instance()->resolve( tracks );
+    m_weeklyChartsModel->appendTracks( tracks );
+    m_weeklyChartsModel->finishLoading();
+
+    checkDone( locker );
+}
+
+void
+NetworkActivityWidget::monthlyCharts( const QList<Tomahawk::track_ptr>& tracks )
+{
+    QSharedPointer<QMutexLocker> locker = QSharedPointer<QMutexLocker>( new QMutexLocker( &m_retrieveMutex ) );
+    m_monthlyChartsModel = new PlaylistModel( ui->tracksViewLeft );
+    m_monthlyChartsModel->startLoading();
+    // Pipeline::instance()->resolve( tracks );
+    m_monthlyChartsModel->appendTracks( tracks );
+    m_monthlyChartsModel->finishLoading();
+
+    checkDone( locker );
+}
+
+void
+NetworkActivityWidget::yearlyCharts( const QList<Tomahawk::track_ptr>& tracks )
+{
+    QSharedPointer<QMutexLocker> locker = QSharedPointer<QMutexLocker>( new QMutexLocker( &m_retrieveMutex ) );
+    m_yearlyChartsModel = new PlaylistModel( ui->tracksViewLeft );
+    m_yearlyChartsModel->startLoading();
+    // Pipeline::instance()->resolve( tracks );
+    m_yearlyChartsModel->appendTracks( tracks );
+    m_yearlyChartsModel->finishLoading();
+
+    checkDone( locker );
+}
+
+void
+NetworkActivityWidget::leftCrumbIndexChanged( QModelIndex index )
+{
+    QStandardItem* item = m_crumbModelLeft->itemFromIndex( m_sortedProxy->mapToSource( index ) );
+    if ( !item )
+        return;
+    if ( !item->data( Breadcrumb::ChartIdRole ).isValid() )
+        return;
+
+    const QString chartId = item->data( Breadcrumb::ChartIdRole ).toString();
+    if ( chartId == NETWORKCHARTS_WEEK_CHARTS )
+    {
+        ui->tracksViewLeft->proxyModel()->setStyle( PlayableProxyModel::Large );
+        ui->tracksViewLeft->setPlaylistModel( m_weeklyChartsModel );
+        ui->tracksViewLeft->proxyModel()->sort( -1 );
+    }
+    else if ( chartId == NETWORKCHARTS_MONTH_CHARTS )
+    {
+        ui->tracksViewLeft->proxyModel()->setStyle( PlayableProxyModel::Large );
+        ui->tracksViewLeft->setPlaylistModel( m_monthlyChartsModel );
+        ui->tracksViewLeft->proxyModel()->sort( -1 );
+    }
+    else if ( chartId == NETWORKCHARTS_YEAR_CHARTS )
+    {
+        ui->tracksViewLeft->proxyModel()->setStyle( PlayableProxyModel::Large );
+        ui->tracksViewLeft->setPlaylistModel( m_yearlyChartsModel );
+        ui->tracksViewLeft->proxyModel()->sort( -1 );
+    }
+}
+
 void
 NetworkActivityWidget::actualFetchData()
 {
+    QDateTime to = QDateTime::currentDateTime();
+
+    // Weekly charts
+    QDateTime weekAgo = to.addDays( -7 );
+    DatabaseCommand_NetworkCharts* weekCharts = new DatabaseCommand_NetworkCharts( weekAgo, to );
+    weekCharts->setLimit( NETWORKCHARTS_NUM_TRACKS );
+    connect( weekCharts, SIGNAL( done( QList<Tomahawk::track_ptr> ) ), SLOT( weeklyCharts( QList<Tomahawk::track_ptr> ) ) );
+    Database::instance()->enqueue( QSharedPointer< DatabaseCommand >( weekCharts ) );
+
+    // Monthly charts
+    QDateTime monthAgo = to.addMonths( -1 );
+    DatabaseCommand_NetworkCharts* monthCharts = new DatabaseCommand_NetworkCharts( monthAgo, to );
+    monthCharts->setLimit( NETWORKCHARTS_NUM_TRACKS );
+    connect( monthCharts, SIGNAL( done( QList<Tomahawk::track_ptr> ) ), SLOT( monthlyCharts( QList<Tomahawk::track_ptr> ) ) );
+    Database::instance()->enqueue( QSharedPointer< DatabaseCommand >( monthCharts ) );
+
+    // Yearly charts
+    QDateTime yearAgo = to.addYears( -1 );
+    DatabaseCommand_NetworkCharts* yearCharts = new DatabaseCommand_NetworkCharts( yearAgo, to );
+    yearCharts->setLimit( NETWORKCHARTS_NUM_TRACKS );
+    connect( yearCharts, SIGNAL( done( QList<Tomahawk::track_ptr> ) ), SLOT( yearlyCharts( QList<Tomahawk::track_ptr> ) ) );
+    Database::instance()->enqueue( QSharedPointer< DatabaseCommand >( yearCharts ) );
+}
+
+void
+NetworkActivityWidget::checkDone( QSharedPointer<QMutexLocker> )
+{
+    if ( !m_weeklyChartsModel.isNull() && !m_yearlyChartsModel.isNull() && !m_monthlyChartsModel.isNull() )
+    {
+        // All charts are loaded, do the remaining work UI work.
+
+        // Build up breadcrumb
+        QStandardItem* rootItem = m_crumbModelLeft->invisibleRootItem();
+        QStandardItem* chartItem = new QStandardItem( tr( "Charts" ) );
+        rootItem->appendRow( chartItem );
+        QStandardItem* weekItem = new QStandardItem( tr( "Last Week" ) );
+        weekItem->setData( NETWORKCHARTS_WEEK_CHARTS, Breadcrumb::ChartIdRole );
+        chartItem->appendRow( weekItem );
+        QStandardItem* monthItem = new QStandardItem( tr( "Last Month" ) );
+        monthItem->setData( NETWORKCHARTS_MONTH_CHARTS, Breadcrumb::ChartIdRole );
+        chartItem->appendRow( monthItem );
+        QStandardItem* yearItem = new QStandardItem( tr( "Last Year" ) );
+        yearItem->setData( NETWORKCHARTS_YEAR_CHARTS, Breadcrumb::ChartIdRole );
+        chartItem->appendRow( yearItem );
+        m_sortedProxy->setSourceModel( m_crumbModelLeft );
+        m_sortedProxy->sort( 0, Qt::AscendingOrder );
+        ui->breadCrumbLeft->setModel( m_sortedProxy );
+
+        m_spinner->fadeOut();
+        ui->breadCrumbLeft->setVisible( true );
+    }
 }
diff --git a/src/libtomahawk/widgets/NetworkActivityWidget.h b/src/libtomahawk/widgets/NetworkActivityWidget.h
index 92b6e5fa7..904bb886b 100644
--- a/src/libtomahawk/widgets/NetworkActivityWidget.h
+++ b/src/libtomahawk/widgets/NetworkActivityWidget.h
@@ -22,6 +22,10 @@
 #include "ViewPage.h"
 
 class AnimatedSpinner;
+class PlaylistModel;
+class QModelIndex;
+class QStandardItemModel;
+class QSortFilterProxyModel;
 namespace Ui
 {
     class NetworkActivityWidget;
@@ -45,14 +49,29 @@ public:
     void fetchData();
 signals:
     
-public slots:
+private slots:
+    void weeklyCharts( const QList<Tomahawk::track_ptr>& );
+    void monthlyCharts( const QList<Tomahawk::track_ptr>& );
+    void yearlyCharts( const QList<Tomahawk::track_ptr>& );
+
+    void leftCrumbIndexChanged( QModelIndex );
 
 private:
     void actualFetchData();
+    void checkDone( QSharedPointer<QMutexLocker> );
 
-    Ui::NetworkActivityWidget* ui;
+    QMutex m_retrieveMutex;
+
+    QSharedPointer<Ui::NetworkActivityWidget> ui;
     Tomahawk::playlistinterface_ptr m_playlistInterface;
-    QSharedPointer<AnimatedSpinner> m_spinner;
+    AnimatedSpinner* m_spinner;
+    QStandardItemModel* m_crumbModelLeft;
+    QSortFilterProxyModel* m_sortedProxy;
+
+    QPointer<PlaylistModel> m_weeklyChartsModel;
+    QPointer<PlaylistModel> m_monthlyChartsModel;
+    QPointer<PlaylistModel> m_yearlyChartsModel;
+
 };
 
 #endif // NETWORKACTIVITYWIDGET_H