diff --git a/src/plugins/clearcase/clearcaseplugin.cpp b/src/plugins/clearcase/clearcaseplugin.cpp
index 0ad3228d7aa8eaf81e7eacbc9d5b72e239fc0f43..70315932a1b14171031ea85e2ce6d892c1b30361 100644
--- a/src/plugins/clearcase/clearcaseplugin.cpp
+++ b/src/plugins/clearcase/clearcaseplugin.cpp
@@ -1253,12 +1253,12 @@ void ClearCasePlugin::annotateCurrentFile()
     vcsAnnotate(state.currentFileTopLevel(), state.relativeCurrentFile());
 }
 
-void ClearCasePlugin::annotateVersion(const QString &file,
-                                       const QString &revision,
-                                       int lineNr)
+void ClearCasePlugin::annotateVersion(const QString &workingDirectory,
+                                      const QString &file,
+                                      const QString &revision,
+                                      int lineNr)
 {
-    const QFileInfo fi(file);
-    vcsAnnotate(fi.absolutePath(), fi.fileName(), revision, lineNr);
+    vcsAnnotate(workingDirectory, file, revision, lineNr);
 }
 
 void ClearCasePlugin::vcsAnnotate(const QString &workingDir, const QString &file,
@@ -1402,8 +1402,8 @@ IEditor *ClearCasePlugin::showOutputInEditor(const QString& title, const QString
                  <<  "Size= " << output.size() <<  " Type=" << editorType << debugCodec(codec);
     QString s = title;
     IEditor *editor = EditorManager::openEditorWithContents(id, &s, output.toUtf8());
-    connect(editor, SIGNAL(annotateRevisionRequested(QString,QString,int)),
-            this, SLOT(annotateVersion(QString,QString,int)));
+    connect(editor, SIGNAL(annotateRevisionRequested(QString,QString,QString,int)),
+            this, SLOT(annotateVersion(QString,QString,QString,int)));
     ClearCaseEditor *e = qobject_cast<ClearCaseEditor*>(editor->widget());
     if (!e)
         return 0;
diff --git a/src/plugins/clearcase/clearcaseplugin.h b/src/plugins/clearcase/clearcaseplugin.h
index fb011182da2c8a0d196851123c625fead17d9caa..6d62e2e5e88fe6a9b720841351ebb427ddb75998 100644
--- a/src/plugins/clearcase/clearcaseplugin.h
+++ b/src/plugins/clearcase/clearcaseplugin.h
@@ -185,7 +185,7 @@ private slots:
     void startCheckInCurrentFile();
     void historyCurrentFile();
     void annotateCurrentFile();
-    void annotateVersion(const QString &file, const QString &revision, int lineNumber);
+    void annotateVersion(const QString &workingDirectory, const QString &file, const QString &revision, int lineNumber);
     void describe(const QString &source, const QString &changeNr);
     void viewStatus();
     void checkInSelected();
diff --git a/src/plugins/cvs/cvscontrol.cpp b/src/plugins/cvs/cvscontrol.cpp
index e4ddcfd3804d5f8f357cd3bb73ad6c4f1106b9e0..87fdc2cf242bdb794b51b0795de8b988612d6edb 100644
--- a/src/plugins/cvs/cvscontrol.cpp
+++ b/src/plugins/cvs/cvscontrol.cpp
@@ -148,7 +148,8 @@ bool CvsControl::vcsRemoveSnapshot(const QString &, const QString &)
 
 bool CvsControl::vcsAnnotate(const QString &file, int line)
 {
-    m_plugin->vcsAnnotate(file, QString(), line);
+    const QFileInfo fi(file);
+    m_plugin->vcsAnnotate(fi.absolutePath(), fi.fileName(), QString(), line);
     return true;
 }
 
diff --git a/src/plugins/cvs/cvsplugin.cpp b/src/plugins/cvs/cvsplugin.cpp
index fdbd7ea1c3670fd193d62b04854ffb68756b0624..646bc6b08717312971fad1bf3f84fea203767072 100644
--- a/src/plugins/cvs/cvsplugin.cpp
+++ b/src/plugins/cvs/cvsplugin.cpp
@@ -923,10 +923,10 @@ void CvsPlugin::annotateCurrentFile()
     annotate(state.currentFileTopLevel(), state.relativeCurrentFile());
 }
 
-void CvsPlugin::vcsAnnotate(const QString &file, const QString &revision, int lineNumber)
+void CvsPlugin::vcsAnnotate(const QString &workingDirectory, const QString &file,
+                            const QString &revision, int lineNumber)
 {
-    const QFileInfo fi(file);
-    annotate(fi.absolutePath(), fi.fileName(), revision, lineNumber);
+    annotate(workingDirectory, file, revision, lineNumber);
 }
 
 bool CvsPlugin::edit(const QString &topLevel, const QStringList &files)
@@ -1274,8 +1274,8 @@ IEditor *CvsPlugin::showOutputInEditor(const QString& title, const QString &outp
                  <<  "source=" << source << "Size= " << output.size() <<  " Type=" << editorType << debugCodec(codec);
     QString s = title;
     IEditor *editor = EditorManager::openEditorWithContents(id, &s, output.toUtf8());
-    connect(editor, SIGNAL(annotateRevisionRequested(QString,QString,int)),
-            this, SLOT(vcsAnnotate(QString,QString,int)));
+    connect(editor, SIGNAL(annotateRevisionRequested(QString,QString,QString,int)),
+            this, SLOT(vcsAnnotate(QString,QString,QString,int)));
     CvsEditor *e = qobject_cast<CvsEditor*>(editor->widget());
     if (!e)
         return 0;
diff --git a/src/plugins/cvs/cvsplugin.h b/src/plugins/cvs/cvsplugin.h
index 9608cd2e1bdc6af8653d24af916e34714989a90f..ba5aad89b8ff6d1fb79ecf9b6a0ec26d0feb94d7 100644
--- a/src/plugins/cvs/cvsplugin.h
+++ b/src/plugins/cvs/cvsplugin.h
@@ -96,7 +96,8 @@ public:
     static CvsPlugin *instance();
 
 public slots:
-    void vcsAnnotate(const QString &file, const QString &revision /* = QString() */, int lineNumber);
+    void vcsAnnotate(const QString &workingDirectory, const QString &file,
+                     const QString &revision, int lineNumber);
 
 private slots:
     void addCurrentFile();
diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp
index 87fb48d6f3c588a8c201d606860ae67d6213e3ec..bd6327ec92cbf555dc7c10dad169c7ee5df4956a 100644
--- a/src/plugins/git/gitclient.cpp
+++ b/src/plugins/git/gitclient.cpp
@@ -1038,8 +1038,8 @@ VcsBase::VcsBaseEditorWidget *GitClient::createVcsEditor(
                                                                               m_msgWait.toUtf8());
     outputEditor->document()->setProperty(registerDynamicProperty, dynamicPropertyValue);
     rc = VcsBase::VcsBaseEditorWidget::getVcsBaseEditor(outputEditor);
-    connect(rc, SIGNAL(annotateRevisionRequested(QString,QString,int)),
-            this, SLOT(slotBlameRevisionRequested(QString,QString,int)));
+    connect(rc, SIGNAL(annotateRevisionRequested(QString,QString,QString,int)),
+            this, SLOT(slotBlameRevisionRequested(QString,QString,QString,int)));
     QTC_ASSERT(rc, return 0);
     rc->setSource(source);
     if (codecType == CodecSource) {
@@ -1461,15 +1461,15 @@ void GitClient::saveSettings()
     settings()->writeSettings(Core::ICore::settings());
 }
 
-void GitClient::slotBlameRevisionRequested(const QString &source, QString change, int lineNumber)
+void GitClient::slotBlameRevisionRequested(const QString &workingDirectory, const QString &file,
+                                           QString change, int lineNumber)
 {
     // This might be invoked with a verbose revision description
     // "SHA1 author subject" from the annotation context menu. Strip the rest.
     const int blankPos = change.indexOf(QLatin1Char(' '));
     if (blankPos != -1)
         change.truncate(blankPos);
-    const QFileInfo fi(source);
-    blame(fi.absolutePath(), QStringList(), fi.fileName(), change, lineNumber);
+    blame(workingDirectory, QStringList(), file, change, lineNumber);
 }
 
 QTextCodec *GitClient::getSourceCodec(const QString &file) const
diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h
index 610a08498edbd2ddee7c96097f90b80d9f6a46cc..7517f2629a58c2a5a5458ded42e2bec65ed70e7c 100644
--- a/src/plugins/git/gitclient.h
+++ b/src/plugins/git/gitclient.h
@@ -335,7 +335,8 @@ public slots:
     void saveSettings();
 
 private slots:
-    void slotBlameRevisionRequested(const QString &source, QString change, int lineNumber);
+    void slotBlameRevisionRequested(const QString &workingDirectory, const QString &file,
+                                    QString change, int lineNumber);
     void finishSubmoduleUpdate();
     void fetchFinished(const QVariant &cookie);
 
diff --git a/src/plugins/perforce/perforceplugin.cpp b/src/plugins/perforce/perforceplugin.cpp
index a4e42e28bdd551293bc221bcfb4617e41b020e7e..ec8e13e5eea63e2659244272f71af68c60c21bfc 100644
--- a/src/plugins/perforce/perforceplugin.cpp
+++ b/src/plugins/perforce/perforceplugin.cpp
@@ -692,10 +692,10 @@ void PerforcePlugin::annotate()
     }
 }
 
-void PerforcePlugin::vcsAnnotate(const QString &file, const QString &revision, int lineNumber)
+void PerforcePlugin::vcsAnnotate(const QString &workingDirectory, const QString &file,
+                                 const QString &revision, int lineNumber)
 {
-    const QFileInfo fi(file);
-    annotate(fi.absolutePath(), fi.fileName(), revision, lineNumber);
+    annotate(workingDirectory, file, revision, lineNumber);
 }
 
 void PerforcePlugin::annotate(const QString &workingDir,
@@ -1166,8 +1166,8 @@ Core::IEditor *PerforcePlugin::showOutputInEditor(const QString &title, const QS
                  <<  "Size= " << output.size() <<  " Type=" << editorType << debugCodec(codec);
     QString s = title;
     Core::IEditor *editor = Core::EditorManager::openEditorWithContents(id, &s, output.toUtf8());
-    connect(editor, SIGNAL(annotateRevisionRequested(QString,QString,int)),
-            this, SLOT(vcsAnnotate(QString,QString,int)));
+    connect(editor, SIGNAL(annotateRevisionRequested(QString,QString,QString,int)),
+            this, SLOT(vcsAnnotate(QString,QString,QString,int)));
     PerforceEditor *e = qobject_cast<PerforceEditor*>(editor->widget());
     if (!e)
         return 0;
diff --git a/src/plugins/perforce/perforceplugin.h b/src/plugins/perforce/perforceplugin.h
index 33d8f4737b0e93cde1252c144f51b13644ad85db..71e0a6e39d7ff2c87a2403a481fa87ef1bf89b30 100644
--- a/src/plugins/perforce/perforceplugin.h
+++ b/src/plugins/perforce/perforceplugin.h
@@ -105,7 +105,8 @@ public:
 
 public slots:
     void describe(const QString &source, const QString &n);
-    void vcsAnnotate(const QString &file, const QString &revision /* = QString() */, int lineNumber);
+    void vcsAnnotate(const QString &workingDirectory, const QString &file,
+                     const QString &revision, int lineNumber);
     void p4Diff(const Perforce::Internal::PerforceDiffParameters &p);
 
 private slots:
diff --git a/src/plugins/perforce/perforceversioncontrol.cpp b/src/plugins/perforce/perforceversioncontrol.cpp
index 19303a66fa843f8ea1fa643e2c4c4547aa5b3c29..a6477335916f7b92c2d491b39a8fdd57c0326738 100644
--- a/src/plugins/perforce/perforceversioncontrol.cpp
+++ b/src/plugins/perforce/perforceversioncontrol.cpp
@@ -147,7 +147,8 @@ bool PerforceVersionControl::vcsRemoveSnapshot(const QString &, const QString &)
 
 bool PerforceVersionControl::vcsAnnotate(const QString &file, int line)
 {
-    m_plugin->vcsAnnotate(file, QString(), line);
+    const QFileInfo fi(file);
+    m_plugin->vcsAnnotate(fi.absolutePath(), fi.fileName(), QString(), line);
     return true;
 }
 
diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp
index d41c1b24286adfdb3760667a917fdea59b2d0882..5f060a2081a3c034eae5b95c30ba846da553b876 100644
--- a/src/plugins/subversion/subversionplugin.cpp
+++ b/src/plugins/subversion/subversionplugin.cpp
@@ -940,12 +940,12 @@ void SubversionPlugin::annotateCurrentFile()
     vcsAnnotate(state.currentFileTopLevel(), state.relativeCurrentFile());
 }
 
-void SubversionPlugin::annotateVersion(const QString &file,
+void SubversionPlugin::annotateVersion(const QString &workingDirectory,
+                                       const QString &file,
                                        const QString &revision,
                                        int lineNr)
 {
-    const QFileInfo fi(file);
-    vcsAnnotate(fi.absolutePath(), fi.fileName(), revision, lineNr);
+    vcsAnnotate(workingDirectory, file, revision, lineNr);
 }
 
 void SubversionPlugin::vcsAnnotate(const QString &workingDir, const QString &file,
@@ -1177,8 +1177,8 @@ Core::IEditor *SubversionPlugin::showOutputInEditor(const QString &title, const
                  <<  "Size= " << output.size() <<  " Type=" << editorType << debugCodec(codec);
     QString s = title;
     Core::IEditor *editor = Core::EditorManager::openEditorWithContents(id, &s, output.toUtf8());
-    connect(editor, SIGNAL(annotateRevisionRequested(QString,QString,int)),
-            this, SLOT(annotateVersion(QString,QString,int)));
+    connect(editor, SIGNAL(annotateRevisionRequested(QString,QString,QString,int)),
+            this, SLOT(annotateVersion(QString,QString,QString,int)));
     SubversionEditor *e = qobject_cast<SubversionEditor*>(editor->widget());
     if (!e)
         return 0;
diff --git a/src/plugins/subversion/subversionplugin.h b/src/plugins/subversion/subversionplugin.h
index f0664cc5c62130e3fb20932b2a983bc23cda64c7..81a89b668eaa1d5a32b423a21eeb57346f5cf4b7 100644
--- a/src/plugins/subversion/subversionplugin.h
+++ b/src/plugins/subversion/subversionplugin.h
@@ -131,7 +131,7 @@ private slots:
     void revertAll();
     void filelogCurrentFile();
     void annotateCurrentFile();
-    void annotateVersion(const QString &file, const QString &revision, int lineNumber);
+    void annotateVersion(const QString &workingDirectory, const QString &file, const QString &revision, int lineNumber);
     void projectStatus();
     void describe(const QString &source, const QString &changeNr);
     void slotDescribe();
diff --git a/src/plugins/vcsbase/vcsbaseclient.cpp b/src/plugins/vcsbase/vcsbaseclient.cpp
index feb4c5588bc78e53973af97f5ac965971102b611..e68ae7c15992933d7886d2deb4856c0a34a23420 100644
--- a/src/plugins/vcsbase/vcsbaseclient.cpp
+++ b/src/plugins/vcsbase/vcsbaseclient.cpp
@@ -90,7 +90,8 @@ public:
     VcsBaseClientPrivate(VcsBaseClient *client, VcsBaseClientSettings *settings);
 
     void statusParser(const QString &text);
-    void annotateRevision(QString source, QString change, int lineNumber);
+    void annotateRevision(const QString &workingDirectory, const QString &file,
+                          QString change, int lineNumber);
     void saveSettings();
 
     void bindCommandToEditor(Command *cmd, VcsBaseEditorWidget *editor);
@@ -125,15 +126,15 @@ void VcsBaseClientPrivate::statusParser(const QString &text)
     emit m_client->parsedStatus(lineInfoList);
 }
 
-void VcsBaseClientPrivate::annotateRevision(QString source, QString change, int lineNumber)
+void VcsBaseClientPrivate::annotateRevision(const QString &workingDirectory,  const QString &file,
+                                            QString change, int lineNumber)
 {
     // This might be invoked with a verbose revision description
     // "SHA1 author subject" from the annotation context menu. Strip the rest.
     const int blankPos = change.indexOf(QLatin1Char(' '));
     if (blankPos != -1)
         change.truncate(blankPos);
-    const QFileInfo fi(source);
-    m_client->annotate(fi.absolutePath(), fi.fileName(), change, lineNumber);
+    m_client->annotate(workingDirectory, file, change, lineNumber);
 }
 
 void VcsBaseClientPrivate::saveSettings()
@@ -574,8 +575,8 @@ VcsBase::VcsBaseEditorWidget *VcsBaseClient::createVcsEditor(Core::Id kind, QStr
         outputEditor = Core::EditorManager::openEditorWithContents(kind, &title, progressMsg.toUtf8());
         outputEditor->document()->setProperty(registerDynamicProperty, dynamicPropertyValue);
         baseEditor = VcsBase::VcsBaseEditorWidget::getVcsBaseEditor(outputEditor);
-        connect(baseEditor, SIGNAL(annotateRevisionRequested(QString,QString,int)),
-                this, SLOT(annotateRevision(QString,QString,int)));
+        connect(baseEditor, SIGNAL(annotateRevisionRequested(QString,QString,QString,int)),
+                this, SLOT(annotateRevision(QString,QString,QString,int)));
         QTC_ASSERT(baseEditor, return 0);
         baseEditor->setSource(source);
         if (setSourceCodec)
diff --git a/src/plugins/vcsbase/vcsbaseclient.h b/src/plugins/vcsbase/vcsbaseclient.h
index f4c9bf957f35ed45bb37ddceec6df4d58a4aa37d..2d3ff336a03252ab40e080c7abcc777983deef20 100644
--- a/src/plugins/vcsbase/vcsbaseclient.h
+++ b/src/plugins/vcsbase/vcsbaseclient.h
@@ -194,7 +194,7 @@ private:
     VcsBaseClientPrivate *d;
 
     Q_PRIVATE_SLOT(d, void statusParser(QString))
-    Q_PRIVATE_SLOT(d, void annotateRevision(QString, QString, int))
+    Q_PRIVATE_SLOT(d, void annotateRevision(QString, QString, QString, int))
     Q_PRIVATE_SLOT(d, void saveSettings())
     Q_PRIVATE_SLOT(d, void commandFinishedGotoLine(QWidget *))
 };
diff --git a/src/plugins/vcsbase/vcsbaseeditor.cpp b/src/plugins/vcsbase/vcsbaseeditor.cpp
index 0c415cf8ebe7dff6f7695f043dd29c19148e500f..766c02a6d57b3acdc137fe858508a39275267891 100644
--- a/src/plugins/vcsbase/vcsbaseeditor.cpp
+++ b/src/plugins/vcsbase/vcsbaseeditor.cpp
@@ -158,7 +158,8 @@ public:
 
 signals:
     void describeRequested(const QString &source, const QString &change);
-    void annotateRevisionRequested(const QString &source, const QString &change, int line);
+    void annotateRevisionRequested(const QString &workingDirectory, const QString &file,
+                                   const QString &change, int line);
 
 private:
     Core::Id m_id;
@@ -818,8 +819,8 @@ TextEditor::BaseTextEditor *VcsBaseEditorWidget::createEditor()
     // Pass on signals.
     connect(this, SIGNAL(describeRequested(QString,QString)),
             editor, SIGNAL(describeRequested(QString,QString)));
-    connect(this, SIGNAL(annotateRevisionRequested(QString,QString,int)),
-            editor, SIGNAL(annotateRevisionRequested(QString,QString,int)));
+    connect(this, SIGNAL(annotateRevisionRequested(QString,QString,QString,int)),
+            editor, SIGNAL(annotateRevisionRequested(QString,QString,QString,int)));
     return editor;
 }
 
@@ -1412,9 +1413,11 @@ void VcsBaseEditorWidget::addDiffActions(QMenu *, const DiffChunk &)
 
 void VcsBaseEditorWidget::slotAnnotateRevision()
 {
-    if (const QAction *a = qobject_cast<const QAction *>(sender()))
-        emit annotateRevisionRequested(source(), a->data().toString(),
-                                       editor()->currentLine());
+    if (const QAction *a = qobject_cast<const QAction *>(sender())) {
+        QFileInfo fi(source());
+        emit annotateRevisionRequested(fi.absolutePath(), fi.fileName(),
+                                       a->data().toString(), currentLine);
+    }
 }
 
 QStringList VcsBaseEditorWidget::annotationPreviousVersions(const QString &) const
diff --git a/src/plugins/vcsbase/vcsbaseeditor.h b/src/plugins/vcsbase/vcsbaseeditor.h
index ae2587c88a91cbbc1bd24257bd5d806ecbc470dd..ccc0ee97f14fb708494dc60dd420def06d9c89b3 100644
--- a/src/plugins/vcsbase/vcsbaseeditor.h
+++ b/src/plugins/vcsbase/vcsbaseeditor.h
@@ -202,7 +202,8 @@ signals:
     // handled by the editor manager for convenience. They are emitted
     // for LogOutput/AnnotateOutput content types.
     void describeRequested(const QString &source, const QString &change);
-    void annotateRevisionRequested(const QString &source, const QString &change, int lineNumber);
+    void annotateRevisionRequested(const QString &workingDirectory, const QString &file,
+                                   const QString &change, int lineNumber);
     void diffChunkApplied(const VcsBase::DiffChunk &dc);
     void diffChunkReverted(const VcsBase::DiffChunk &dc);