diff --git a/src/libtomahawk/database/DatabaseCommand.cpp b/src/libtomahawk/database/DatabaseCommand.cpp
index e287cfe45..b86fd2d53 100644
--- a/src/libtomahawk/database/DatabaseCommand.cpp
+++ b/src/libtomahawk/database/DatabaseCommand.cpp
@@ -29,6 +29,7 @@
 #include "DatabaseCommand_DeleteDynamicPlaylist.h"
 #include "DatabaseCommand_SetDynamicPlaylistRevision.h"
 #include "DatabaseCommand_SocialAction.h"
+#include "DatabaseCommand_ShareTrack.h"
 
 #include "utils/Logger.h"
 #include "DatabaseCommand_SetCollectionAttributes.h"
@@ -185,6 +186,13 @@ DatabaseCommand::factory( const QVariant& op, const source_ptr& source )
         QJson::QObjectHelper::qvariant2qobject( op.toMap(), cmd );
         return cmd;
     }
+    else if( name == "sharetrack" )
+    {
+        DatabaseCommand_ShareTrack * cmd = new DatabaseCommand_ShareTrack;
+        cmd->setSource( source );
+        QJson::QObjectHelper::qvariant2qobject( op.toMap(), cmd );
+        return cmd;
+    }
 
     qDebug() << "Unknown database command" << name;
 //    Q_ASSERT( false );
diff --git a/src/libtomahawk/database/DatabaseCommand_ShareTrack.cpp b/src/libtomahawk/database/DatabaseCommand_ShareTrack.cpp
index 18cacf101..b905b8835 100644
--- a/src/libtomahawk/database/DatabaseCommand_ShareTrack.cpp
+++ b/src/libtomahawk/database/DatabaseCommand_ShareTrack.cpp
@@ -66,14 +66,14 @@ DatabaseCommand_ShareTrack::exec( DatabaseImpl* dbi )
 void
 DatabaseCommand_ShareTrack::postCommitHook()
 {
-    if ( !m_query.isNull() )
-        return;
-
     if ( source()->isLocal() )
         Servent::instance()->triggerDBSync();
 
-    QString myDbid = Database::instance()->impl()->dbid();
-    QString sourceDbid = source()->userName(); //userName is actually a dbid -_-'
+    if ( !m_query.isNull() )
+        return;
+
+    QString myDbid = SourceList::instance()->getLocal()->nodeId();
+    QString sourceDbid = source()->nodeId();
     if ( myDbid != m_recipient || sourceDbid == m_recipient )
         return;
 
diff --git a/src/libtomahawk/database/DatabaseCommand_ShareTrack.h b/src/libtomahawk/database/DatabaseCommand_ShareTrack.h
index ecc351f75..6ab805857 100644
--- a/src/libtomahawk/database/DatabaseCommand_ShareTrack.h
+++ b/src/libtomahawk/database/DatabaseCommand_ShareTrack.h
@@ -28,7 +28,7 @@
 
 #include "DllMacro.h"
 
-class DatabaseCommand_ShareTrack : public DatabaseCommandLoggable
+class DLLEXPORT DatabaseCommand_ShareTrack : public DatabaseCommandLoggable
 {
     Q_OBJECT
     Q_PROPERTY( QString artist      READ artist     WRITE setArtist )
diff --git a/src/libtomahawk/playlist/InboxModel.h b/src/libtomahawk/playlist/InboxModel.h
index 0a9d50249..754b2ad20 100644
--- a/src/libtomahawk/playlist/InboxModel.h
+++ b/src/libtomahawk/playlist/InboxModel.h
@@ -30,8 +30,6 @@ public:
     explicit InboxModel( QObject* parent = 0 );
     virtual ~InboxModel();
 
-signals:
-
 public slots:
 
 };
diff --git a/src/sourcetree/items/SourceItem.cpp b/src/sourcetree/items/SourceItem.cpp
index 2afb47b48..e0e63b6fa 100644
--- a/src/sourcetree/items/SourceItem.cpp
+++ b/src/sourcetree/items/SourceItem.cpp
@@ -21,6 +21,9 @@
 #include "SourceItem.h"
 
 #include "CategoryItems.h"
+#include "database/Database.h"
+#include "database/DatabaseCommand_ShareTrack.h"
+#include "DropJob.h"
 #include "PlaylistItems.h"
 #include "ViewManager.h"
 #include "Playlist.h"
@@ -677,6 +680,21 @@ SourceItem::getRecentPlaysPage() const
 }
 
 
+void
+SourceItem::onTracksDropped( const QList< query_ptr >& queries )
+{
+    foreach ( const query_ptr& query, queries )
+    {
+        DatabaseCommand_ShareTrack* cmd =
+                new DatabaseCommand_ShareTrack( query, m_source->nodeId() );
+
+        Database::instance()->enqueue( QSharedPointer< DatabaseCommand >( cmd ) );
+    }
+    tDebug() << "I am" << SourceList::instance()->getLocal()->nodeId();
+    tDebug() << "Dropped tracks on source item" << text() << m_source->friendlyName() << m_source->nodeId();
+}
+
+
 CategoryItem*
 SourceItem::stationsCategory() const
 {
@@ -703,3 +721,43 @@ SourceItem::setPlaylistsCategory(CategoryItem* item)
 {
     m_playlists = item;
 }
+
+
+bool
+SourceItem::willAcceptDrag( const QMimeData* data ) const
+{
+    return DropJob::acceptsMimeData( data, DropJob::Track );
+}
+
+
+bool
+SourceItem::dropMimeData( const QMimeData* data, Qt::DropAction action )
+{
+    Q_UNUSED( action );
+
+    QList< Tomahawk::query_ptr > queries;
+    if ( !DropJob::acceptsMimeData( data, DropJob::Track ) )
+        return false;
+
+    if ( source()->isLocal() )
+        return false;
+
+    DropJob* dj = new DropJob();
+    dj->setDropTypes( DropJob::Track );
+
+    connect( dj, SIGNAL( tracks( QList< Tomahawk::query_ptr > ) ),
+             this, SLOT( onTracksDropped( QList< Tomahawk::query_ptr > ) ) );
+    dj->tracksFromMimeData( data, false, false );
+    return true;
+}
+
+
+SourceTreeItem::DropTypes
+SourceItem::supportedDropTypes( const QMimeData* data ) const
+{
+    if ( data->hasFormat( "application/tomahawk.result.list" ) ||
+         data->hasFormat( "application/tomahawk.query.list" ) )
+        return DropTypeThisTrack;
+
+    return DropTypesNone;
+}
diff --git a/src/sourcetree/items/SourceItem.h b/src/sourcetree/items/SourceItem.h
index 9501bcf76..16e2085f9 100644
--- a/src/sourcetree/items/SourceItem.h
+++ b/src/sourcetree/items/SourceItem.h
@@ -55,6 +55,10 @@ public:
     void setStationsCategory( CategoryItem* item );
     void setPlaylistsCategory( CategoryItem* item );
 
+    virtual bool willAcceptDrag( const QMimeData* data ) const;
+    virtual bool dropMimeData( const QMimeData* data, Qt::DropAction action );
+    virtual DropTypes supportedDropTypes( const QMimeData* data ) const;
+
 public slots:
     virtual void activate();
 
@@ -90,6 +94,8 @@ private slots:
     Tomahawk::ViewPage* recentPlaysClicked();
     Tomahawk::ViewPage* getRecentPlaysPage() const;
 
+    void onTracksDropped( const QList< Tomahawk::query_ptr >& queries );
+
 private:
     void playlistsAddedInternal( SourceTreeItem* parent, const QList< Tomahawk::dynplaylist_ptr >& playlists );
     template< typename T >