diff --git a/src/plugins/mercurial/mercurialclient.cpp b/src/plugins/mercurial/mercurialclient.cpp
index aa54e079259d3ec9934585fd51ed760e8d44469a..596a289525e610a398c7b6672c80226f05e72b59 100644
--- a/src/plugins/mercurial/mercurialclient.cpp
+++ b/src/plugins/mercurial/mercurialclient.cpp
@@ -48,9 +48,9 @@
 #include <QtCore/QtDebug>
 #include <QtCore/QFileInfo>
 #include <QtCore/QByteArray>
+#include <QtCore/QMetaType>
 
-using namespace Mercurial::Internal;
-using namespace Mercurial;
+Q_DECLARE_METATYPE(QVariant)
 
 inline Core::IEditor* locateEditor(const Core::ICore *core, const char *property, const QString &entry)
 {
@@ -60,10 +60,14 @@ inline Core::IEditor* locateEditor(const Core::ICore *core, const char *property
     return 0;
 }
 
+namespace Mercurial {
+namespace Internal  {
+
 MercurialClient::MercurialClient() :
     jobManager(0),
     core(Core::ICore::instance())
 {
+    qRegisterMetaType<QVariant>();
 }
 
 MercurialClient::~MercurialClient()
@@ -227,17 +231,18 @@ void MercurialClient::log(const QFileInfo &fileOrDir)
 
 void MercurialClient::revert(const QFileInfo &fileOrDir, const QString &revision)
 {
-    QStringList args(QLatin1String("revert"));
+    const QString filePath = fileOrDir.absoluteFilePath();
+    const QString workingDir = fileOrDir.isDir() ? filePath : fileOrDir.absolutePath();
 
+    QStringList args(QLatin1String("revert"));    
     if (!revision.isEmpty())
         args << QLatin1String("-r") << revision;
-    if (!fileOrDir.isDir())
-        args.append(fileOrDir.absoluteFilePath());
-    else
-        args.append(QLatin1String("--all"));
+    args.append(fileOrDir.isDir() ? QString(QLatin1String("--all")) : filePath);
 
-    QSharedPointer<HgTask> job(new HgTask(fileOrDir.isDir() ? fileOrDir.absoluteFilePath() :
-                                          fileOrDir.absolutePath(), args, false));
+    // Indicate repository change or file list
+    const QVariant cookie = fileOrDir.isDir() ? QVariant(filePath) : QVariant(QStringList(filePath));
+    QSharedPointer<HgTask> job(new HgTask(workingDir, args, false, cookie));
+    connect(job.data(), SIGNAL(succeeded(QVariant)), this, SIGNAL(changed(QVariant)), Qt::QueuedConnection);
     enqueueJob(job);
 }
 
@@ -310,7 +315,10 @@ void MercurialClient::pull(const QFileInfo &repositoryRoot, const QString &repos
     if (!repository.isEmpty())
         args.append(repository);
 
-    QSharedPointer<HgTask> job(new HgTask(repositoryRoot.absoluteFilePath(), args, false));
+    const QString path = repositoryRoot.absoluteFilePath();
+
+    QSharedPointer<HgTask> job(new HgTask(path, args, false, QVariant(path)));
+    connect(job.data(), SIGNAL(succeeded(QVariant)), this, SIGNAL(changed(QVariant)), Qt::QueuedConnection);
     enqueueJob(job);
 }
 
@@ -382,7 +390,9 @@ void MercurialClient::update(const QFileInfo &repositoryRoot, const QString &rev
     if (!revision.isEmpty())
         args << revision;
 
-    QSharedPointer<HgTask> job(new HgTask(repositoryRoot.absoluteFilePath(), args, false));
+    const QString path = repositoryRoot.absoluteFilePath();
+    QSharedPointer<HgTask> job(new HgTask(path, args, false, QVariant(path)));
+    connect(job.data(), SIGNAL(succeeded(QVariant)), this, SIGNAL(changed(QVariant)), Qt::QueuedConnection);
     enqueueJob(job);
 }
 
@@ -451,3 +461,6 @@ void MercurialClient::enqueueJob(const QSharedPointer<HgTask> &job)
     }
     jobManager->enqueueJob(job);
 }
+
+} // namespace Internal
+} // namespace Mercurial
diff --git a/src/plugins/mercurial/mercurialclient.h b/src/plugins/mercurial/mercurialclient.h
index bd0c9f8771e0d5db0cfa10e313bb282b681e84ba..87c5b25c6e8de100ee3aedf16ffd70bd4b7c8857 100644
--- a/src/plugins/mercurial/mercurialclient.h
+++ b/src/plugins/mercurial/mercurialclient.h
@@ -36,6 +36,7 @@
 
 QT_BEGIN_NAMESPACE
 class QFileInfo;
+class QVariant;
 QT_END_NAMESPACE
 
 namespace Core {
@@ -81,6 +82,8 @@ public:
 
 signals:
     void parsedStatus(const QList<QPair<QString, QString> > &statusList);
+    // Passes on changed signals from HgTask to Control.
+    void changed(const QVariant &v);
 
 public slots:
     void view(const QString &source, const QString &id);
diff --git a/src/plugins/mercurial/mercurialcontrol.cpp b/src/plugins/mercurial/mercurialcontrol.cpp
index a2303e02000075b08e248430c3762e3c1da130c3..8dd3cd94bbae09e9a8168777f0a9b87b193839bc 100644
--- a/src/plugins/mercurial/mercurialcontrol.cpp
+++ b/src/plugins/mercurial/mercurialcontrol.cpp
@@ -31,6 +31,8 @@
 #include "mercurialclient.h"
 
 #include <QtCore/QFileInfo>
+#include <QtCore/QVariant>
+#include <QtCore/QStringList>
 
 using namespace Mercurial::Internal;
 
@@ -107,3 +109,17 @@ bool MercurialControl::sccManaged(const QString &filename)
 {
     return mercurialClient->manifestSync(filename);
 }
+
+void MercurialControl::changed(const QVariant &v)
+{
+    switch (v.type()) {
+    case QVariant::String:
+        emit repositoryChanged(v.toString());
+        break;
+    case QVariant::StringList:
+        emit filesChanged(v.toStringList());
+        break;
+    default:
+        break;
+    }
+}
diff --git a/src/plugins/mercurial/mercurialcontrol.h b/src/plugins/mercurial/mercurialcontrol.h
index 2085a27d77d3c513ae086366dad4a1cdd74a751c..01c77e47bcf037e2b4a06af7d3dc8687411754ee 100644
--- a/src/plugins/mercurial/mercurialcontrol.h
+++ b/src/plugins/mercurial/mercurialcontrol.h
@@ -32,6 +32,10 @@
 
 #include <coreplugin/iversioncontrol.h>
 
+QT_BEGIN_NAMESPACE
+class QVariant;
+QT_END_NAMESPACE
+
 namespace Mercurial {
 namespace Internal {
 
@@ -56,6 +60,12 @@ public:
     bool vcsDelete(const QString &filename);
     bool sccManaged(const QString &filename);
 
+public slots:
+    // To be connected to the HgTask's success signal to emit the repository/
+    // files changed signals according to the variant's type:
+    // String -> repository, StringList -> files
+    void changed(const QVariant&);
+
 signals:
     void enabledChanged(bool);
 
diff --git a/src/plugins/mercurial/mercurialjobrunner.cpp b/src/plugins/mercurial/mercurialjobrunner.cpp
index 3b27594f339b9a21be2c60bf89ee1b7fcf8b2d00..29595a83d9646a9c41820449973c78284868014e 100644
--- a/src/plugins/mercurial/mercurialjobrunner.cpp
+++ b/src/plugins/mercurial/mercurialjobrunner.cpp
@@ -42,21 +42,34 @@
 using namespace Mercurial::Internal;
 using namespace Mercurial;
 
-HgTask::HgTask(const QString &repositoryRoot, const QStringList &arguments, bool emitRaw)
-        :   m_repositoryRoot(repositoryRoot),
-        arguments(arguments),
-        emitRaw(emitRaw),
-        editor(0)
+HgTask::HgTask(const QString &repositoryRoot,
+               const QStringList &arguments,
+               bool emitRaw,
+               const QVariant &cookie) :
+    m_repositoryRoot(repositoryRoot),
+    arguments(arguments),
+    emitRaw(emitRaw),
+    m_cookie(cookie),
+    editor(0)
+
 {
 }
 
-HgTask::HgTask(const QString &repositoryRoot, const QStringList &arguments, VCSBase::VCSBaseEditor *editor)
-        :   m_repositoryRoot(repositoryRoot),
-        arguments(arguments),
-        emitRaw(false),
-        editor(editor)
+HgTask::HgTask(const QString &repositoryRoot,
+               const QStringList &arguments,
+               VCSBase::VCSBaseEditor *editor,
+               const QVariant &cookie) :
+    m_repositoryRoot(repositoryRoot),
+    arguments(arguments),
+    emitRaw(false),
+    m_cookie(cookie),
+    editor(editor)
+{
+}
 
+void HgTask::emitSucceeded()
 {
+    emit succeeded(m_cookie);
 }
 
 MercurialJobRunner::MercurialJobRunner() :
@@ -206,6 +219,7 @@ void MercurialJobRunner::task(const QSharedPointer<HgTask> &job)
         if (stdOutput.isEmpty())
             stdOutput = hgProcess.readAllStandardError();
         emit output(stdOutput);
+        taskData->emitSucceeded();
     } else {
         emit error(QString::fromLocal8Bit(hgProcess.readAllStandardError()));
     }
diff --git a/src/plugins/mercurial/mercurialjobrunner.h b/src/plugins/mercurial/mercurialjobrunner.h
index bac9c650d57a92c1db523cc62d0d141e66b21dea..cdc484d4bfeda39273a4ece06339160ef0f749d6 100644
--- a/src/plugins/mercurial/mercurialjobrunner.h
+++ b/src/plugins/mercurial/mercurialjobrunner.h
@@ -36,6 +36,7 @@
 #include <QtCore/QWaitCondition>
 #include <QtCore/QStringList>
 #include <QtCore/QSharedPointer>
+#include <QtCore/QVariant>
 #include <QtCore/QString>
 
 namespace VCSBase {
@@ -51,9 +52,13 @@ class HgTask : public QObject
 {
     Q_OBJECT
 public:
-    HgTask(const QString &workingDir, const QStringList &arguments, bool emitRaw=false);
-    HgTask(const QString &workingDir, const QStringList &arguments,
-           VCSBase::VCSBaseEditor *editor);
+    explicit HgTask(const QString &workingDir,
+                    const QStringList &arguments,
+                    bool emitRaw=false,
+                    const QVariant &cookie = QVariant());
+    explicit HgTask(const QString &workingDir, const QStringList &arguments,
+                    VCSBase::VCSBaseEditor *editor,
+                    const QVariant &cookie = QVariant());
 
     bool shouldEmit() { return emitRaw; }
     VCSBase::VCSBaseEditor* displayEditor() { return editor; }
@@ -61,12 +66,17 @@ public:
     QString repositoryRoot() { return m_repositoryRoot; }
 
 signals:
+    void succeeded(const QVariant &cookie); // Use a queued connection
     void rawData(const QByteArray &data);
 
+public slots:
+    void emitSucceeded();
+
 private:
     const QString m_repositoryRoot;
     const QStringList arguments;
     const bool emitRaw;
+    const QVariant m_cookie;
     VCSBase::VCSBaseEditor *editor;
 };
 
diff --git a/src/plugins/mercurial/mercurialplugin.cpp b/src/plugins/mercurial/mercurialplugin.cpp
index 97f8df943765d6c6302615c0303476fe64dfea5b..49963698ec79341024daad77c01b6e290d37acfe 100644
--- a/src/plugins/mercurial/mercurialplugin.cpp
+++ b/src/plugins/mercurial/mercurialplugin.cpp
@@ -162,6 +162,7 @@ bool MercurialPlugin::initialize(const QStringList &arguments, QString *error_me
 
     mercurialVC = new MercurialControl(client);
     addAutoReleasedObject(mercurialVC);
+    connect(client, SIGNAL(changed(QVariant)), mercurialVC, SLOT(changed(QVariant)));
 
     static const char *describeSlot = SLOT(view(QString,QString));
     const int editorCount = sizeof(editorParameters)/sizeof(VCSBase::VCSBaseEditorParameters);
diff --git a/src/plugins/mercurial/mercurialplugin.h b/src/plugins/mercurial/mercurialplugin.h
index 84654eb1f9c0a6e0c16b5d7743ab90dbd3305179..fa3318d38ac5723b852c081b2b7c6908240335ce 100644
--- a/src/plugins/mercurial/mercurialplugin.h
+++ b/src/plugins/mercurial/mercurialplugin.h
@@ -153,7 +153,7 @@ private:
     OptionsPage *optionsPage;
     MercurialClient *client;
 
-    Core::IVersionControl *mercurialVC;
+    MercurialControl *mercurialVC;
     Core::ICore *core;
     Core::ActionManager *actionManager;
     Core::ActionContainer *mercurialContainer;