diff --git a/src/plugins/git/git.pro b/src/plugins/git/git.pro
index 7f4ed2fc0ccb3ae49953a0c236dd9ecbb55e0fef..2bd1d00d9c45bef0543a4c4bbf3d3a608b761f58 100644
--- a/src/plugins/git/git.pro
+++ b/src/plugins/git/git.pro
@@ -20,7 +20,8 @@ HEADERS += gitplugin.h \
     gitversioncontrol.h \
     gitsettings.h \
     branchdialog.h \
-    branchmodel.h
+    branchmodel.h \
+    gitcommand.h
 SOURCES += gitplugin.cpp \
     gitoutputwindow.cpp \
     gitclient.cpp \
@@ -34,7 +35,8 @@ SOURCES += gitplugin.cpp \
     gitversioncontrol.cpp \
     gitsettings.cpp \
     branchdialog.cpp \
-    branchmodel.cpp
+    branchmodel.cpp \
+    gitcommand.cpp
 FORMS += changeselectiondialog.ui \
     settingspage.ui \
     gitsubmitpanel.ui \
diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp
index 0886d1336a657745df89bd8c66939377b307ffdf..1da0cee3fb0aea6314404c9b790fdde01e3dd0d4 100644
--- a/src/plugins/git/gitclient.cpp
+++ b/src/plugins/git/gitclient.cpp
@@ -32,6 +32,7 @@
 ***************************************************************************/
 
 #include "gitclient.h"
+#include "gitcommand.h"
 
 #include "commitdata.h"
 #include "gitconstants.h"
@@ -49,7 +50,6 @@
 #include <utils/qtcassert.h>
 #include <vcsbase/vcsbaseeditor.h>
 
-#include <QtCore/QFuture>
 #include <QtCore/QRegExp>
 #include <QtCore/QTemporaryFile>
 #include <QtCore/QTime>
@@ -61,7 +61,6 @@
 using namespace Git;
 using namespace Git::Internal;
 
-const char *const kGitCommand = "git";
 const char *const kGitDirectoryC = ".git";
 const char *const kBranchIndicatorC = "# On branch";
 
@@ -186,19 +185,45 @@ VCSBase::VCSBaseEditor
 
 void GitClient::diff(const QString &workingDirectory,
                      const QStringList &diffArgs,
-                     const QStringList &fileNames)
+                     const QStringList &unstagedFileNames,
+                     const QStringList &stagedFileNames)
 {
-      if (Git::Constants::debug)
-        qDebug() << "diff" << workingDirectory << fileNames;
-    QStringList arguments;
-    arguments << QLatin1String("diff") << diffArgs << QLatin1String("--") << fileNames;
 
+    if (Git::Constants::debug)
+        qDebug() << "diff" << workingDirectory << unstagedFileNames << stagedFileNames;
+
+    const QString binary = QLatin1String(Constants::GIT_BINARY);
     const QString kind = QLatin1String(Git::Constants::GIT_DIFF_EDITOR_KIND);
     const QString title = tr("Git Diff");
 
     VCSBase::VCSBaseEditor *editor = createVCSEditor(kind, title, workingDirectory, true, "originalFileName", workingDirectory);
-    executeGit(workingDirectory, arguments, editor);
 
+    // Create a batch of 2 commands to be run after each other in case
+    // we have a mixture of staged/unstaged files as is the case
+    // when using the submit dialog.
+    GitCommand *command = createCommand(workingDirectory, editor);
+    // Directory diff?
+    if (unstagedFileNames.empty() && stagedFileNames.empty()) {
+       QStringList arguments;
+       arguments << QLatin1String("diff") << diffArgs;
+       m_plugin->outputWindow()->append(formatCommand(binary, arguments));
+       command->addJob(arguments);
+    } else {
+        // Files diff.
+        if (!unstagedFileNames.empty()) {
+           QStringList arguments;
+           arguments << QLatin1String("diff") << diffArgs << QLatin1String("--") << unstagedFileNames;
+           m_plugin->outputWindow()->append(formatCommand(binary, arguments));
+           command->addJob(arguments);
+        }
+        if (!stagedFileNames.empty()) {
+           QStringList arguments;
+           arguments << QLatin1String("diff") << QLatin1String("--cached") << diffArgs << QLatin1String("--") << stagedFileNames;
+           m_plugin->outputWindow()->append(formatCommand(binary, arguments));
+           command->addJob(arguments);
+        }
+    }
+    command->execute();
 }
 
 void GitClient::diff(const QString &workingDirectory,
@@ -439,42 +464,47 @@ bool GitClient::synchronousShow(const QString &workingDirectory, const QString &
     return true;
 }
 
-
-void GitClient::executeGit(const QString &workingDirectory, const QStringList &arguments,
-                           VCSBase::VCSBaseEditor* editor,
-                           bool outputToWindow)
+// Factory function to create an asynchronous command
+GitCommand *GitClient::createCommand(const QString &workingDirectory,
+                             VCSBase::VCSBaseEditor* editor,
+                             bool outputToWindow)
 {
     if (Git::Constants::debug)
-        qDebug() << "executeGit" << workingDirectory << arguments << editor;
+        qDebug() << Q_FUNC_INFO << workingDirectory << editor;
 
     GitOutputWindow *outputWindow = m_plugin->outputWindow();
-    outputWindow->append(formatCommand(QLatin1String(kGitCommand), arguments));
 
-    QProcess process;
     ProjectExplorer::Environment environment = ProjectExplorer::Environment::systemEnvironment();
-
     if (m_settings.adoptPath)
         environment.set(QLatin1String("PATH"), m_settings.path);
 
-    GitCommand* command = new GitCommand();
+    GitCommand* command = new GitCommand(workingDirectory, environment);
     if (outputToWindow) {
         if (!editor) { // assume that the commands output is the important thing
-            connect(command, SIGNAL(outputText(QString)), this, SLOT(appendAndPopup(QString)));
             connect(command, SIGNAL(outputData(QByteArray)), this, SLOT(appendDataAndPopup(QByteArray)));
         } else {
-            connect(command, SIGNAL(outputText(QString)), outputWindow, SLOT(append(QString)));
             connect(command, SIGNAL(outputData(QByteArray)), outputWindow, SLOT(appendData(QByteArray)));
         }
     } else {
         QTC_ASSERT(editor, /**/);
-        connect(command, SIGNAL(outputText(QString)), editor, SLOT(setPlainText(QString)));
         connect(command, SIGNAL(outputData(QByteArray)), editor, SLOT(setPlainTextData(QByteArray)));
     }
 
     if (outputWindow)
         connect(command, SIGNAL(errorText(QString)), this, SLOT(appendAndPopup(QString)));
+    return command;
+}
 
-    command->execute(arguments, workingDirectory, environment);
+// Execute a single command
+void GitClient::executeGit(const QString &workingDirectory,
+                           const QStringList &arguments,
+                           VCSBase::VCSBaseEditor* editor,
+                           bool outputToWindow)
+{
+    m_plugin->outputWindow()->append(formatCommand(QLatin1String(Constants::GIT_BINARY), arguments));
+    GitCommand *command = createCommand(workingDirectory, editor, outputToWindow);
+    command->addJob(arguments);
+    command->execute();
 }
 
 void GitClient::appendDataAndPopup(const QByteArray &data)
@@ -497,7 +527,7 @@ bool GitClient::synchronousGit(const QString &workingDirectory,
 {
     if (Git::Constants::debug)
         qDebug() << "synchronousGit" << workingDirectory << arguments;
-    const QString binary = QLatin1String(kGitCommand);
+    const QString binary = QLatin1String(Constants::GIT_BINARY);
 
     if (logCommandToWindow)
         m_plugin->outputWindow()->append(formatCommand(binary, arguments));
@@ -973,67 +1003,3 @@ void GitClient::setSettings(const GitSettings &s)
     }
 }
 
-// ------------------------ GitCommand
-GitCommand::GitCommand()
-{
-}
-
-GitCommand::~GitCommand()
-{
-}
-
-void GitCommand::execute(const QStringList &arguments,
-                         const QString &workingDirectory,
-                         const ProjectExplorer::Environment &environment)
-{
-    if (Git::Constants::debug)
-        qDebug() << "GitCommand::execute" << workingDirectory << arguments;
-
-    // For some reason QtConcurrent::run() only works on this
-    QFuture<void> task = QtConcurrent::run(this, &GitCommand::run
-                                           , arguments
-                                           , workingDirectory
-                                           , environment);
-    QString taskName = QLatin1String("Git ") + arguments[0];
-
-    Core::ICore *core = ExtensionSystem::PluginManager::instance()->getObject<Core::ICore>();
-    core->progressManager()->addTask(task, taskName
-                            , QLatin1String("Git.action")
-                            , Core::ProgressManager::CloseOnSuccess);
-}
-
-void GitCommand::run(const QStringList &arguments,
-                     const QString &workingDirectory,
-                     const ProjectExplorer::Environment &environment)
-{
-    if (Git::Constants::debug)
-        qDebug() << "GitCommand::run" << workingDirectory << arguments;
-    QProcess process;
-    if (!workingDirectory.isEmpty())
-        process.setWorkingDirectory(workingDirectory);
-
-    ProjectExplorer::Environment env = environment;
-    if (env.toStringList().isEmpty())
-        env = ProjectExplorer::Environment::systemEnvironment();
-    process.setEnvironment(env.toStringList());
-
-    process.start(QLatin1String(kGitCommand), arguments);
-    if (!process.waitForFinished()) {
-        emit errorText(QLatin1String("Error: Git timed out"));
-        return;
-    }
-
-    const QByteArray output = process.readAllStandardOutput();
-    if (output.isEmpty()) {
-        if (arguments.at(0) == QLatin1String("diff"))
-            emit outputText(tr("The file does not differ from HEAD"));
-    } else {
-        emit outputData(output);
-    }
-    const QByteArray error = process.readAllStandardError();
-    if (!error.isEmpty())
-        emit errorText(QString::fromLocal8Bit(error));
-
-    // As it is used asynchronously, we need to delete ourselves
-    this->deleteLater();
-}
diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h
index 43a0957d913a68061de7c0917526f6a099db0a2a..8624797ec2c51d16acfc21859fd374722bc5e64e 100644
--- a/src/plugins/git/gitclient.h
+++ b/src/plugins/git/gitclient.h
@@ -38,7 +38,6 @@
 
 #include <coreplugin/iversioncontrol.h>
 #include <coreplugin/editormanager/ieditor.h>
-#include <projectexplorer/environment.h>
 
 #include <QtCore/QString>
 #include <QtCore/QStringList>
@@ -79,7 +78,8 @@ public:
     static QString findRepositoryForDirectory(const QString &dir);
 
     void diff(const QString &workingDirectory, const QStringList &diffArgs, const QString &fileName);
-    void diff(const QString &workingDirectory, const QStringList &diffArgs, const QStringList &fileNames);
+    void diff(const QString &workingDirectory, const QStringList &diffArgs,
+              const QStringList &unstagedFileNames, const QStringList &stagedFileNames= QStringList());
 
     void status(const QString &workingDirectory);
     void log(const QString &workingDirectory, const QString &fileName);
@@ -154,11 +154,14 @@ private:
                                                  const char *registerDynamicProperty,
                                                  const QString &dynamicPropertyValue) const;
 
+    GitCommand *createCommand(const QString &workingDirectory,
+                             VCSBase::VCSBaseEditor* editor = 0,
+                             bool outputToWindow = false);
 
     void executeGit(const QString &workingDirectory,
-                                           const QStringList &arguments,
-                                           VCSBase::VCSBaseEditor* editor = 0,
-                                           bool outputToWindow = false);
+                    const QStringList &arguments,
+                    VCSBase::VCSBaseEditor* editor = 0,
+                    bool outputToWindow = false);
 
     bool synchronousGit(const QString &workingDirectory,
                         const QStringList &arguments,
@@ -175,24 +178,6 @@ private:
     GitSettings   m_settings;
 };
 
-class GitCommand : public QObject
-{
-    Q_OBJECT
-public:
-    GitCommand();
-    ~GitCommand();
-    void execute(const QStringList &arguments,
-                 const QString &workingDirectory,
-                 const ProjectExplorer::Environment &environment);
-    void run(const QStringList &arguments,
-                 const QString &workingDirectory,
-                 const ProjectExplorer::Environment &environment);
-
-Q_SIGNALS:
-    void outputData(const QByteArray&);
-    void outputText(const QString&);
-    void errorText(const QString&);
-};
 
 } // namespace Internal
 } // namespace Git
diff --git a/src/plugins/git/gitcommand.cpp b/src/plugins/git/gitcommand.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..da9a2d1196a29908285dd394c59317004785ba06
--- /dev/null
+++ b/src/plugins/git/gitcommand.cpp
@@ -0,0 +1,138 @@
+/***************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact:  Qt Software Information (qt-info@nokia.com)
+**
+**
+** Non-Open Source Usage
+**
+** Licensees may use this file in accordance with the Qt Beta Version
+** License Agreement, Agreement version 2.2 provided with the Software or,
+** alternatively, in accordance with the terms contained in a written
+** agreement between you and Nokia.
+**
+** GNU General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the packaging
+** of this file.  Please review the following information to ensure GNU
+** General Public Licensing requirements will be met:
+**
+** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt GPL Exception
+** version 1.3, included in the file GPL_EXCEPTION.txt in this package.
+**
+***************************************************************************/
+
+#include "gitcommand.h"
+#include "gitconstants.h"
+
+#include <coreplugin/icore.h>
+#include <coreplugin/progressmanager/progressmanager.h>
+
+#include <QtCore/QDebug>
+#include <QtCore/QProcess>
+#include <QtCore/QFuture>
+#include <QtCore/QtConcurrentRun>
+
+namespace Git {
+namespace Internal {
+
+// Convert environment to list, default to system one.
+static inline QStringList environmentToList(const ProjectExplorer::Environment &environment)
+{
+    const QStringList list = environment.toStringList();
+    if (!list.empty())
+        return list;
+    return ProjectExplorer::Environment::systemEnvironment().toStringList();
+}
+
+GitCommand::Job::Job(const QStringList &a) :
+    arguments(a)
+{
+}
+
+GitCommand::GitCommand(const QString &workingDirectory,
+                        ProjectExplorer::Environment &environment)  :
+    m_workingDirectory(workingDirectory),
+    m_environment(environmentToList(environment))
+{
+}
+
+void GitCommand::addJob(const QStringList &arguments)
+{
+    m_jobs.push_back(Job(arguments));
+}
+
+void GitCommand::execute()
+{
+    if (Git::Constants::debug)
+        qDebug() << "GitCommand::execute" << m_workingDirectory << m_jobs.size();
+
+    if (m_jobs.empty())
+        return;
+
+    // For some reason QtConcurrent::run() only works on this
+    QFuture<void> task = QtConcurrent::run(this, &GitCommand::run);
+    const QString taskName = QLatin1String("Git ") + m_jobs.front().arguments.at(0);
+
+    Core::ICore *core = ExtensionSystem::PluginManager::instance()->getObject<Core::ICore>();
+    core->progressManager()->addTask(task, taskName,
+                                     QLatin1String("Git.action"),
+                                     Core::ProgressManager::CloseOnSuccess);
+}
+
+void GitCommand::run()
+{
+    if (Git::Constants::debug)
+        qDebug() << "GitCommand::run" << m_workingDirectory << m_jobs.size();
+    QProcess process;
+    if (!m_workingDirectory.isEmpty())
+        process.setWorkingDirectory(m_workingDirectory);
+
+    process.setEnvironment(m_environment);
+
+    QByteArray output;
+    QString error;
+
+    const int count = m_jobs.size();
+    bool ok = true;
+    for (int j = 0; j < count; j++) {
+        if (Git::Constants::debug)
+            qDebug() << "GitCommand::run" << j << '/' << count << m_jobs.at(j).arguments;
+
+        process.start(QLatin1String(Constants::GIT_BINARY), m_jobs.at(j).arguments);
+        if (!process.waitForFinished()) {
+            ok = false;
+            error += QLatin1String("Error: Git timed out");
+            break;
+        }
+
+        output += process.readAllStandardOutput();
+        error += QString::fromLocal8Bit(process.readAllStandardError());
+    }
+
+    // Special hack: Always produce output for diff
+    if (ok && output.isEmpty() && m_jobs.front().arguments.at(0) == QLatin1String("diff")) {
+        output += "The file does not differ from HEAD";
+    }
+
+    if (ok && !output.isEmpty())
+        emit outputData(output);
+
+    if (!error.isEmpty())
+        emit errorText(error);
+
+    // As it is used asynchronously, we need to delete ourselves
+    this->deleteLater();
+}
+
+} // namespace Internal
+} // namespace Git
diff --git a/src/plugins/git/gitcommand.h b/src/plugins/git/gitcommand.h
new file mode 100644
index 0000000000000000000000000000000000000000..c4df0615a07ffbe7caccf692e5f55849be3d23c3
--- /dev/null
+++ b/src/plugins/git/gitcommand.h
@@ -0,0 +1,79 @@
+/***************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact:  Qt Software Information (qt-info@nokia.com)
+**
+**
+** Non-Open Source Usage
+**
+** Licensees may use this file in accordance with the Qt Beta Version
+** License Agreement, Agreement version 2.2 provided with the Software or,
+** alternatively, in accordance with the terms contained in a written
+** agreement between you and Nokia.
+**
+** GNU General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the packaging
+** of this file.  Please review the following information to ensure GNU
+** General Public Licensing requirements will be met:
+**
+** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt GPL Exception
+** version 1.3, included in the file GPL_EXCEPTION.txt in this package.
+**
+***************************************************************************/
+
+#ifndef GITCOMMAND_H
+#define GITCOMMAND_H
+
+#include <projectexplorer/environment.h>
+
+#include <QtCore/QObject>
+
+namespace Git {
+namespace Internal {
+
+class GitCommand : public QObject
+{
+    Q_OBJECT
+public:
+    explicit GitCommand(const QString &workingDirectory,
+                        ProjectExplorer::Environment &environment);
+
+
+    void addJob(const QStringList &arguments);
+    void execute();
+
+private:
+    void run();
+
+Q_SIGNALS:
+    void outputData(const QByteArray&);
+    void errorText(const QString&);
+
+private:
+    struct Job {
+        explicit Job(const QStringList &a);
+
+        QStringList arguments;
+    };
+
+    QStringList environment() const;
+
+    const QString m_workingDirectory;
+    const QStringList m_environment;
+
+    QList<Job> m_jobs;
+};
+
+} // namespace Internal
+} // namespace Git
+#endif // GITCOMMAND_H
diff --git a/src/plugins/git/gitconstants.h b/src/plugins/git/gitconstants.h
index 6719221f4c0ec6a3f638d963dbc2b835b7f05683..4a07ebd71604cc678a2c9f7d402d360355a49f24 100644
--- a/src/plugins/git/gitconstants.h
+++ b/src/plugins/git/gitconstants.h
@@ -47,6 +47,7 @@ const char * const GITSUBMITEDITOR_KIND = "Git Submit Editor";
 const char * const SUBMIT_CURRENT = "Nokia.Git.SubmitCurrentLog";
 const char * const DIFF_SELECTED = "Nokia.Git.DiffSelectedFilesInLog";
 const char * const SUBMIT_MIMETYPE = "application/vnd.nokia.text.git.submit";
+const char * const GIT_BINARY = "git";
 
 const char * const DIFF_FILE_INDICATOR = "--- ";
 enum { debug = 0 };
diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp
index 159249760129369590c7eb4ee97855eb2b05a5e6..ddb70d0e2da7d217269fc3c37f7096896efd09e4 100644
--- a/src/plugins/git/gitplugin.cpp
+++ b/src/plugins/git/gitplugin.cpp
@@ -446,16 +446,9 @@ void GitPlugin::extensionsInitialized()
     m_projectExplorer = ExtensionSystem::PluginManager::instance()->getObject<ProjectExplorer::ProjectExplorerPlugin>();
 }
 
-void GitPlugin::submitEditorDiffStaged(const QStringList &files)
+void GitPlugin::submitEditorDiff(const QStringList &unstaged, const QStringList &staged)
 {
-    if (!files.empty())
-        m_gitClient->diff(m_submitRepository, QStringList(QLatin1String("--cached")), files);
-}
-
-void GitPlugin::submitEditorDiffUnstaged(const QStringList &files)
-{
-    if (!files.empty())
-        m_gitClient->diff(m_submitRepository, QStringList(), files);
+    m_gitClient->diff(m_submitRepository, QStringList(), unstaged, staged);
 }
 
 void GitPlugin::diffCurrentFile()
@@ -638,8 +631,7 @@ Core::IEditor *GitPlugin::openSubmitEditor(const QString &fileName, const Commit
     // mechanism. Disable them correctly.
     submitEditor->registerActions(m_undoAction, m_redoAction, m_submitCurrentAction, m_diffSelectedFilesAction);
     submitEditor->setCommitData(cd);
-    connect(submitEditor, SIGNAL(diffStaged(QStringList)), this, SLOT(submitEditorDiffStaged(QStringList)));
-    connect(submitEditor, SIGNAL(diffUnstaged(QStringList)), this, SLOT(submitEditorDiffUnstaged(QStringList)));
+    connect(submitEditor, SIGNAL(diff(QStringList,QStringList)), this, SLOT(submitEditorDiff(QStringList,QStringList)));
     return editor;
 }
 
diff --git a/src/plugins/git/gitplugin.h b/src/plugins/git/gitplugin.h
index 9fdde403d672ba6ec08a760ec8c956c95c37f655..0225e4a27231fb9528083651494a2faeec4a6b12 100644
--- a/src/plugins/git/gitplugin.h
+++ b/src/plugins/git/gitplugin.h
@@ -108,8 +108,7 @@ public slots:
 private slots:
     void                        diffCurrentFile();
     void                        diffCurrentProject();
-    void                        submitEditorDiffUnstaged(const QStringList &);
-    void                        submitEditorDiffStaged(const QStringList &);
+    void                        submitEditorDiff(const QStringList &unstaged, const QStringList &staged);
     void                        submitCurrentLog();
     void                        statusFile();
     void                        statusProject();
diff --git a/src/plugins/git/gitsubmiteditor.cpp b/src/plugins/git/gitsubmiteditor.cpp
index fbdc4e51325b415f23cbb18a62fedf1f2c351654..3566262bcae7d10b8b6f7c2f8d5ce55742886586 100644
--- a/src/plugins/git/gitsubmiteditor.cpp
+++ b/src/plugins/git/gitsubmiteditor.cpp
@@ -48,16 +48,14 @@ enum FileType { StagedFile , UnstagedFile, UntrackedFile };
 
 /* The problem with git is that no diff can be obtained to for a random
  * multiselection of staged/unstaged files; it requires the --cached
- * option for staged files. So, we set the file list to
- * single selection and sort the files manual according to a type
- * flag we add to the model. */
+ * option for staged files. So, we sort apart the diff file lists
+ * according to a type flag we add to the model. */
 
 GitSubmitEditor::GitSubmitEditor(const VCSBase::VCSBaseSubmitEditorParameters *parameters, QWidget *parent) :
     VCSBaseSubmitEditor(parameters, new GitSubmitEditorWidget(parent)),
     m_model(0)
 {
     setDisplayName(tr("Git Commit"));
-    setFileListSelectionMode(QAbstractItemView::SingleSelection);
     connect(this, SIGNAL(diffSelectedFiles(QStringList)), this, SLOT(slotDiffSelected(QStringList)));
 }
 
@@ -102,22 +100,29 @@ void GitSubmitEditor::setCommitData(const CommitData &d)
 
 void GitSubmitEditor::slotDiffSelected(const QStringList &files)
 {
-    QList<QStandardItem *> fileRow = m_model->findRow(files.front(), fileNameColumn());
-    if (fileRow.empty())
-        return;
-    const FileType ft = static_cast<FileType>(fileRow.front()->data(FileTypeRole).toInt());
-    switch (ft) {
-        case StagedFile:
-            emit diffStaged(files);
-            break;
-        case UnstagedFile:
-            emit diffUnstaged(files);
-            break;
-        case UntrackedFile:
-            break;
+    // Sort it apart into staged/unstaged files
+    QStringList unstagedFiles;
+    QStringList stagedFiles;
+    const int fileColumn = fileNameColumn();
+    const int rowCount = m_model->rowCount();
+    for (int r = 0; r < rowCount; r++) {
+        const QString fileName = m_model->item(r, fileColumn)->text();
+        if (files.contains(fileName)) {
+            const FileType ft = static_cast<FileType>(m_model->item(r, 0)->data(FileTypeRole).toInt());
+            switch (ft) {
+            case StagedFile:
+                stagedFiles.push_back(fileName);
+                break;
+            case UnstagedFile:
+                unstagedFiles.push_back(fileName);
+                break;
+            case UntrackedFile:
+                break;
+            }
+        }
     }
-
-
+    if (!unstagedFiles.empty() || !stagedFiles.empty())
+        emit diff(unstagedFiles, stagedFiles);
 }
 
 GitSubmitEditorPanelData GitSubmitEditor::panelData() const
diff --git a/src/plugins/git/gitsubmiteditor.h b/src/plugins/git/gitsubmiteditor.h
index 78b99682d0d2949d694084fe2813a18768472eae..5001eb4094acc3f12db7fb9e45998d8acb0ca82d 100644
--- a/src/plugins/git/gitsubmiteditor.h
+++ b/src/plugins/git/gitsubmiteditor.h
@@ -59,8 +59,7 @@ public:
     GitSubmitEditorPanelData panelData() const;
 
 signals:
-    void diffStaged(const QStringList &);
-    void diffUnstaged(const QStringList &);
+    void diff(const QStringList &unstagedFiles, const QStringList &stagedFiles);
 
 private slots:
     void slotDiffSelected(const QStringList &);
diff --git a/src/plugins/projectexplorer/environment.cpp b/src/plugins/projectexplorer/environment.cpp
index 9220564bba036e2ba88aa5a19b6ef8160f913254..6a3e144a79f4d05c39ff2855be496b3f7486cdd8 100644
--- a/src/plugins/projectexplorer/environment.cpp
+++ b/src/plugins/projectexplorer/environment.cpp
@@ -87,14 +87,16 @@ Environment::Environment(QStringList env)
     }
 }
 
-QStringList Environment::toStringList()
+QStringList Environment::toStringList() const
 {
     QStringList result;
-    QMap<QString, QString>::const_iterator it, end;
-    end = m_values.constEnd();
-    for (it = m_values.constBegin(); it != end; ++it)
-        result<<(it.key() + "=" + it.value());
-
+    const QMap<QString, QString>::const_iterator end = m_values.constEnd();
+    for (QMap<QString, QString>::const_iterator it = m_values.constBegin(); it != end; ++it) {
+        QString entry = it.key();
+        entry += QLatin1Char('=');
+        entry += it.value();
+        result.push_back(entry);
+    }
     return result;
 }
 
diff --git a/src/plugins/projectexplorer/environment.h b/src/plugins/projectexplorer/environment.h
index ba3aa9f161d6310555a6b18419305a8502df9e4c..5a574929fc2fc4dc2ede0b4edb3584c35f738610 100644
--- a/src/plugins/projectexplorer/environment.h
+++ b/src/plugins/projectexplorer/environment.h
@@ -65,7 +65,7 @@ public:
     explicit Environment(QStringList env);
     static Environment systemEnvironment();
 
-    QStringList toStringList();
+    QStringList toStringList() const;
     QString value(const QString &key) const;
     void set(const QString &key, const QString &value);
     void unset(const QString &key);