diff --git a/src/plugins/bazaar/bazaarplugin.cpp b/src/plugins/bazaar/bazaarplugin.cpp
index 6c5989eb4e2ded97a3ec88bbe98493c731feb5a0..5144d36a79a7d1cc5ce1cd1bce5b8a80519186b3 100644
--- a/src/plugins/bazaar/bazaarplugin.cpp
+++ b/src/plugins/bazaar/bazaarplugin.cpp
@@ -108,7 +108,8 @@ static const VcsBase::VcsBaseSubmitEditorParameters submitEditorParameters = {
     Constants::COMMITMIMETYPE,
     Constants::COMMIT_ID,
     Constants::COMMIT_DISPLAY_NAME,
-    Constants::COMMIT_ID
+    Constants::COMMIT_ID,
+    VcsBase::VcsBaseSubmitEditorParameters::DiffFiles
 };
 
 
diff --git a/src/plugins/clearcase/clearcaseplugin.cpp b/src/plugins/clearcase/clearcaseplugin.cpp
index 27ac04307c0eaadf199137ffca7b79a46586fcd2..aa85372c1dd64b94333eb4129515a4c43f6e826a 100644
--- a/src/plugins/clearcase/clearcaseplugin.cpp
+++ b/src/plugins/clearcase/clearcaseplugin.cpp
@@ -258,7 +258,8 @@ static const VcsBase::VcsBaseSubmitEditorParameters submitParameters = {
     ClearCase::Constants::CLEARCASE_SUBMIT_MIMETYPE,
     ClearCase::Constants::CLEARCASECHECKINEDITOR_ID,
     ClearCase::Constants::CLEARCASECHECKINEDITOR_DISPLAY_NAME,
-    ClearCase::Constants::CLEARCASECHECKINEDITOR
+    ClearCase::Constants::CLEARCASECHECKINEDITOR,
+    VcsBase::VcsBaseSubmitEditorParameters::DiffFiles
 };
 
 bool ClearCasePlugin::initialize(const QStringList & /*arguments */, QString *errorMessage)
diff --git a/src/plugins/cvs/cvsplugin.cpp b/src/plugins/cvs/cvsplugin.cpp
index 91097dcec949619bb57146a325b9a06070c045d7..4da18516c744cd69acab15a5502b295125e673cc 100644
--- a/src/plugins/cvs/cvsplugin.cpp
+++ b/src/plugins/cvs/cvsplugin.cpp
@@ -213,7 +213,8 @@ static const VcsBaseSubmitEditorParameters submitParameters = {
     Constants::CVS_SUBMIT_MIMETYPE,
     Constants::CVSCOMMITEDITOR_ID,
     Constants::CVSCOMMITEDITOR_DISPLAY_NAME,
-    Constants::CVSCOMMITEDITOR
+    Constants::CVSCOMMITEDITOR,
+    VcsBase::VcsBaseSubmitEditorParameters::DiffFiles
 };
 
 bool CvsPlugin::initialize(const QStringList &arguments, QString *errorMessage)
diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp
index 2dc0a05f59304bbbdd254d504ab9354b59f1554e..e4ffae16283823decba93408fe1c41bd771766ad 100644
--- a/src/plugins/git/gitplugin.cpp
+++ b/src/plugins/git/gitplugin.cpp
@@ -175,7 +175,8 @@ static const VcsBase::VcsBaseSubmitEditorParameters submitParameters = {
     Git::Constants::SUBMIT_MIMETYPE,
     Git::Constants::GITSUBMITEDITOR_ID,
     Git::Constants::GITSUBMITEDITOR_DISPLAY_NAME,
-    Git::Constants::C_GITSUBMITEDITOR
+    Git::Constants::C_GITSUBMITEDITOR,
+    VcsBase::VcsBaseSubmitEditorParameters::DiffRows
 };
 
 // Create a parameter action
diff --git a/src/plugins/git/gitsubmiteditor.cpp b/src/plugins/git/gitsubmiteditor.cpp
index 51e9121364f914f79d9d37821d6ce272cb311a81..0803e16cd5e21557827ee73402503f010028d84a 100644
--- a/src/plugins/git/gitsubmiteditor.cpp
+++ b/src/plugins/git/gitsubmiteditor.cpp
@@ -85,7 +85,7 @@ GitSubmitEditor::GitSubmitEditor(const VcsBase::VcsBaseSubmitEditorParameters *p
     m_model(0),
     m_amend(false)
 {
-    connect(this, SIGNAL(diffSelectedFiles(QStringList)), this, SLOT(slotDiffSelected(QStringList)));
+    connect(this, SIGNAL(diffSelectedFiles(QList<int>)), this, SLOT(slotDiffSelected(QList<int>)));
 }
 
 GitSubmitEditorWidget *GitSubmitEditor::submitEditorWidget()
@@ -131,24 +131,21 @@ void GitSubmitEditor::setAmend(bool amend)
     setEmptyFileListEnabled(amend); // Allow for just correcting the message
 }
 
-void GitSubmitEditor::slotDiffSelected(const QStringList &files)
+void GitSubmitEditor::slotDiffSelected(const QList<int> &rows)
 {
     // Sort it apart into unmerged/staged/unstaged files
     QStringList unmergedFiles;
     QStringList unstagedFiles;
     QStringList stagedFiles;
-    const int rowCount = m_model->rowCount();
-    for (int r = 0; r < rowCount; r++) {
-        const QString fileName = m_model->file(r);
-        if (files.contains(fileName)) {
-            const FileStates state = static_cast<FileStates>(m_model->extraData(r).toInt());
-            if (state & UnmergedFile)
-                unmergedFiles.push_back(fileName);
-            else if (state & StagedFile)
-                stagedFiles.push_back(fileName);
-            else if (state != UntrackedFile)
-                unstagedFiles.push_back(fileName);
-        }
+    foreach (int row, rows) {
+        const QString fileName = m_model->file(row);
+        const FileStates state = static_cast<FileStates>(m_model->extraData(row).toInt());
+        if (state & UnmergedFile)
+            unmergedFiles.push_back(fileName);
+        else if (state & StagedFile)
+            stagedFiles.push_back(fileName);
+        else if (state != UntrackedFile)
+            unstagedFiles.push_back(fileName);
     }
     if (!unstagedFiles.empty() || !stagedFiles.empty())
         emit diff(unstagedFiles, stagedFiles);
diff --git a/src/plugins/git/gitsubmiteditor.h b/src/plugins/git/gitsubmiteditor.h
index 79c43473280ed52a82b7470eeee6316ab924c842..4e6fb734c13ebc3f6ac15f8a58246d6c9437e4dd 100644
--- a/src/plugins/git/gitsubmiteditor.h
+++ b/src/plugins/git/gitsubmiteditor.h
@@ -64,7 +64,7 @@ protected:
     void updateFileModel();
 
 private slots:
-    void slotDiffSelected(const QStringList &);
+    void slotDiffSelected(const QList<int> &rows);
 
 private:
     inline GitSubmitEditorWidget *submitEditorWidget();
diff --git a/src/plugins/mercurial/mercurialplugin.cpp b/src/plugins/mercurial/mercurialplugin.cpp
index f2a23d86020721fceab319b91592e1ff0647edc7..a17451c371c369e06a6863addd9d2977a21d316c 100644
--- a/src/plugins/mercurial/mercurialplugin.cpp
+++ b/src/plugins/mercurial/mercurialplugin.cpp
@@ -108,7 +108,8 @@ static const VcsBaseSubmitEditorParameters submitEditorParameters = {
     Constants::COMMITMIMETYPE,
     Constants::COMMIT_ID,
     Constants::COMMIT_DISPLAY_NAME,
-    Constants::COMMIT_ID
+    Constants::COMMIT_ID,
+    VcsBase::VcsBaseSubmitEditorParameters::DiffFiles
 };
 
 MercurialPlugin *MercurialPlugin::m_instance = 0;
diff --git a/src/plugins/perforce/perforceplugin.cpp b/src/plugins/perforce/perforceplugin.cpp
index d821a52e6b67d217d3f7eced82e7f1abeda05421..af684c9f46285c079a5ae1d675b7eaab16708217 100644
--- a/src/plugins/perforce/perforceplugin.cpp
+++ b/src/plugins/perforce/perforceplugin.cpp
@@ -211,7 +211,8 @@ static const VcsBase::VcsBaseSubmitEditorParameters submitParameters = {
     Perforce::Constants::SUBMIT_MIMETYPE,
     Perforce::Constants::PERFORCE_SUBMIT_EDITOR_ID,
     Perforce::Constants::PERFORCE_SUBMIT_EDITOR_DISPLAY_NAME,
-    Perforce::Constants::PERFORCESUBMITEDITOR_CONTEXT
+    Perforce::Constants::PERFORCESUBMITEDITOR_CONTEXT,
+    VcsBase::VcsBaseSubmitEditorParameters::DiffFiles
 };
 
 bool PerforcePlugin::initialize(const QStringList & /* arguments */, QString *errorMessage)
diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp
index c6369649730e0bd899b6b53da83ef498e5321455..ec8f7c5d6598259897f5fcf40c18713397a5c7c2 100644
--- a/src/plugins/subversion/subversionplugin.cpp
+++ b/src/plugins/subversion/subversionplugin.cpp
@@ -236,7 +236,8 @@ static const VcsBase::VcsBaseSubmitEditorParameters submitParameters = {
     Subversion::Constants::SUBVERSION_SUBMIT_MIMETYPE,
     Subversion::Constants::SUBVERSIONCOMMITEDITOR_ID,
     Subversion::Constants::SUBVERSIONCOMMITEDITOR_DISPLAY_NAME,
-    Subversion::Constants::SUBVERSIONCOMMITEDITOR
+    Subversion::Constants::SUBVERSIONCOMMITEDITOR,
+    VcsBase::VcsBaseSubmitEditorParameters::DiffFiles
 };
 
 bool SubversionPlugin::initialize(const QStringList & /*arguments */, QString *errorMessage)
diff --git a/src/plugins/vcsbase/submiteditorwidget.cpp b/src/plugins/vcsbase/submiteditorwidget.cpp
index e5b8ac7d1b1f66559d49497701eec4899878dc49..6c63ed67f103b2580ba25bfb18afef8787858276 100644
--- a/src/plugins/vcsbase/submiteditorwidget.cpp
+++ b/src/plugins/vcsbase/submiteditorwidget.cpp
@@ -403,20 +403,6 @@ SubmitFileModel *SubmitEditorWidget::fileModel() const
     return static_cast<SubmitFileModel *>(d->m_ui.fileView->model());
 }
 
-QStringList SubmitEditorWidget::selectedFiles() const
-{
-    const QList<int> selection = selectedRows(d->m_ui.fileView);
-    if (selection.empty())
-        return QStringList();
-
-    QStringList rc;
-    const SubmitFileModel *model = fileModel();
-    const int count = selection.size();
-    for (int i = 0; i < count; i++)
-        rc.push_back(model->file(selection.at(i)));
-    return rc;
-}
-
 QStringList SubmitEditorWidget::checkedFiles() const
 {
     QStringList rc;
@@ -437,15 +423,14 @@ Utils::CompletingTextEdit *SubmitEditorWidget::descriptionEdit() const
 
 void SubmitEditorWidget::triggerDiffSelected()
 {
-    const QStringList sel = selectedFiles();
+    const QList<int> sel = selectedRows(d->m_ui.fileView);
     if (!sel.empty())
         emit diffSelected(sel);
 }
 
 void SubmitEditorWidget::diffActivatedDelayed()
 {
-    const QStringList files = QStringList(fileModel()->file(d->m_activatedRow));
-    emit diffSelected(files);
+    emit diffSelected(QList<int>() << d->m_activatedRow);
 }
 
 void SubmitEditorWidget::diffActivated(const QModelIndex &index)
diff --git a/src/plugins/vcsbase/submiteditorwidget.h b/src/plugins/vcsbase/submiteditorwidget.h
index da09173df7c0dc11d8df05ce32e123e8bcded4fc..83dccf4d2bd1b396d06c5028fccb2c8a6c0bca76 100644
--- a/src/plugins/vcsbase/submiteditorwidget.h
+++ b/src/plugins/vcsbase/submiteditorwidget.h
@@ -95,9 +95,6 @@ public:
     // Files to be included in submit
     QStringList checkedFiles() const;
 
-    // Selected files for diff
-    QStringList selectedFiles() const;
-
     Utils::CompletingTextEdit *descriptionEdit() const;
 
     void addDescriptionEditContextMenuAction(QAction *a);
@@ -109,7 +106,7 @@ public:
     virtual bool canSubmit() const;
 
 signals:
-    void diffSelected(const QStringList &);
+    void diffSelected(const QList<int> &);
     void fileSelectionChanged(bool someFileSelected);
     void submitActionTextChanged(const QString &);
     void submitActionEnabledChanged(bool);
diff --git a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp
index c78c3de010ff187b3989b11b757519f51e793651..7506a080d436d695429eb6f22e2cb02caee25b52 100644
--- a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp
+++ b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp
@@ -210,7 +210,7 @@ VcsBaseSubmitEditor::VcsBaseSubmitEditor(const VcsBaseSubmitEditorParameters *pa
     connect(d->m_file, SIGNAL(saveMe(QString*,QString,bool)),
             this, SLOT(save(QString*,QString,bool)));
 
-    connect(d->m_widget, SIGNAL(diffSelected(QStringList)), this, SLOT(slotDiffSelectedVcsFiles(QStringList)));
+    connect(d->m_widget, SIGNAL(diffSelected(QList<int>)), this, SLOT(slotDiffSelectedVcsFiles(QList<int>)));
     connect(d->m_widget->descriptionEdit(), SIGNAL(textChanged()), this, SLOT(slotDescriptionChanged()));
 
     const CommonVcsSettings settings = VcsPlugin::instance()->settings();
@@ -540,9 +540,25 @@ SubmitFileModel *VcsBaseSubmitEditor::fileModel() const
     return d->m_widget->fileModel();
 }
 
-void VcsBaseSubmitEditor::slotDiffSelectedVcsFiles(const QStringList &rawList)
+QStringList VcsBaseSubmitEditor::rowsToFiles(const QList<int> &rows) const
 {
-     emit diffSelectedFiles(rawList);
+    if (rows.empty())
+        return QStringList();
+
+    QStringList rc;
+    const SubmitFileModel *model = fileModel();
+    const int count = rows.size();
+    for (int i = 0; i < count; i++)
+        rc.push_back(model->file(rows.at(i)));
+    return rc;
+}
+
+void VcsBaseSubmitEditor::slotDiffSelectedVcsFiles(const QList<int> &rawList)
+{
+    if (d->m_parameters->diffType == VcsBaseSubmitEditorParameters::DiffRows)
+        emit diffSelectedFiles(rawList);
+    else
+        emit diffSelectedFiles(rowsToFiles(rawList));
 }
 
 bool VcsBaseSubmitEditor::save(QString *errorString, const QString &fileName, bool autoSave)
diff --git a/src/plugins/vcsbase/vcsbasesubmiteditor.h b/src/plugins/vcsbase/vcsbasesubmiteditor.h
index eaeba204288b93a6bb4457820a2884175b9ffed0..0f696b5c1574f4944d4a1b4b7560da651b8e784f 100644
--- a/src/plugins/vcsbase/vcsbasesubmiteditor.h
+++ b/src/plugins/vcsbase/vcsbasesubmiteditor.h
@@ -56,6 +56,7 @@ public:
     const char *id;
     const char *displayName;
     const char *context;
+    enum DiffType { DiffRows, DiffFiles } diffType;
 };
 
 class VCSBASE_EXPORT VcsBaseSubmitEditor : public Core::IEditor
@@ -130,6 +131,7 @@ public:
     void setFileModel(SubmitFileModel *m, const QString &repositoryDirectory = QString());
     SubmitFileModel *fileModel() const;
     virtual void updateFileModel() { }
+    QStringList rowsToFiles(const QList<int> &rows) const;
 
     // Utilities returning some predefined icons for actions
     static QIcon diffIcon();
@@ -148,9 +150,10 @@ public:
 
 signals:
     void diffSelectedFiles(const QStringList &files);
+    void diffSelectedFiles(const QList<int> &rows);
 
 private slots:
-    void slotDiffSelectedVcsFiles(const QStringList &rawList);
+    void slotDiffSelectedVcsFiles(const QList<int> &rawList);
     bool save(QString *errorString, const QString &fileName, bool autoSave);
     void slotDescriptionChanged();
     void slotCheckSubmitMessage();