diff --git a/src/plugins/git/giteditor.cpp b/src/plugins/git/giteditor.cpp
index 181172e36ef019d3d670a392fd2f2c6387735a40..4f0b8314c673ec3bb80263cc9538f9f2285984c2 100644
--- a/src/plugins/git/giteditor.cpp
+++ b/src/plugins/git/giteditor.cpp
@@ -366,5 +366,19 @@ bool GitEditor::supportChangeLinks() const
             || (editor()->id() == Git::Constants::GIT_REBASE_EDITOR_ID);
 }
 
+QString GitEditor::fileNameForLine(int line) const
+{
+    // 7971b6e7 share/qtcreator/dumper/dumper.py   (hjk
+    QTextBlock block = document()->findBlockByLineNumber(line - 1);
+    QTC_ASSERT(block.isValid(), return source());
+    static QRegExp renameExp(QLatin1String("^" CHANGE_PATTERN "\\s+([^(]+)"));
+    if (renameExp.indexIn(block.text()) != -1) {
+        const QString fileName = renameExp.cap(1).trimmed();
+        if (!fileName.isEmpty())
+            return fileName;
+    }
+    return source();
+}
+
 } // namespace Internal
 } // namespace Git
diff --git a/src/plugins/git/giteditor.h b/src/plugins/git/giteditor.h
index 1ed80c7ccfc62c3cb6f6bfdb2c400dc7f0572f7c..84b53992214000b345977ad16d5b6b484d97e9f8 100644
--- a/src/plugins/git/giteditor.h
+++ b/src/plugins/git/giteditor.h
@@ -74,6 +74,7 @@ private:
     void addChangeActions(QMenu *menu, const QString &change);
     QString revisionSubject(const QTextBlock &inBlock) const;
     bool supportChangeLinks() const;
+    QString fileNameForLine(int line) const;
 
     mutable QRegExp m_changeNumberPattern;
     QString m_currentChange;
diff --git a/src/plugins/vcsbase/vcsbaseeditor.cpp b/src/plugins/vcsbase/vcsbaseeditor.cpp
index a7be34a5a9aae8120952c373de3338ca99bee75f..fe72592fb148e554fd1e9119a5c1b0e4750c0e07 100644
--- a/src/plugins/vcsbase/vcsbaseeditor.cpp
+++ b/src/plugins/vcsbase/vcsbaseeditor.cpp
@@ -684,6 +684,12 @@ bool VcsBaseEditorWidget::supportChangeLinks() const
     }
 }
 
+QString VcsBaseEditorWidget::fileNameForLine(int line) const
+{
+    Q_UNUSED(line);
+    return source();
+}
+
 void VcsBaseEditorWidget::init()
 {
     d->m_editor = editor();
@@ -1414,8 +1420,13 @@ void VcsBaseEditorWidget::addDiffActions(QMenu *, const DiffChunk &)
 void VcsBaseEditorWidget::slotAnnotateRevision()
 {
     if (const QAction *a = qobject_cast<const QAction *>(sender())) {
-        QFileInfo fi(source());
-        emit annotateRevisionRequested(fi.absolutePath(), fi.fileName(),
+        const int currentLine = editor()->currentLine();
+        const QString fileName = fileNameForLine(currentLine);
+        QString workingDirectory = d->m_workingDirectory;
+        if (workingDirectory.isEmpty())
+            workingDirectory = QFileInfo(fileName).absolutePath();
+        emit annotateRevisionRequested(workingDirectory,
+                                       QDir(workingDirectory).relativeFilePath(fileName),
                                        a->data().toString(), currentLine);
     }
 }
diff --git a/src/plugins/vcsbase/vcsbaseeditor.h b/src/plugins/vcsbase/vcsbaseeditor.h
index b932defb3312c65c20ddcc0a6549de33e66bbc34..7c0654dae64fa2ca4f51a4a7c582215c09a7b397 100644
--- a/src/plugins/vcsbase/vcsbaseeditor.h
+++ b/src/plugins/vcsbase/vcsbaseeditor.h
@@ -107,6 +107,7 @@ protected:
     // Pattern for log entry. hash/revision number must be in the first capture group
     void setLogEntryPattern(const QRegExp &pattern);
     virtual bool supportChangeLinks() const;
+    virtual QString fileNameForLine(int line) const;
 
 public:
     virtual void init();