diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp
index b82818a1633fd034449caf05cd304d8d8080fef7..850553992c7dcffba229ce2f4a446acd1effd899 100644
--- a/src/plugins/git/gitplugin.cpp
+++ b/src/plugins/git/gitplugin.cpp
@@ -808,8 +808,7 @@ Core::IEditor *GitPlugin::openSubmitEditor(const QString &fileName, const Commit
     submitEditor->setCheckScriptWorkingDirectory(m_submitRepository);
     const QString title = amend ? tr("Amend %1").arg(cd.amendSHA1) : tr("Git Commit");
     submitEditor->setDisplayName(title);
-    if (amend) // Allow for just correcting the message
-        submitEditor->setEmptyFileListEnabled(true);
+    submitEditor->setAmend(amend);
     connect(submitEditor, SIGNAL(diff(QStringList,QStringList)), this, SLOT(submitEditorDiff(QStringList,QStringList)));
     connect(submitEditor, SIGNAL(merge(QStringList)), this, SLOT(submitEditorMerge(QStringList)));
     return editor;
diff --git a/src/plugins/git/gitsubmiteditor.cpp b/src/plugins/git/gitsubmiteditor.cpp
index 2bb63d50e76e94f2793e5d40b1d54c06c938a22e..606ca9fb05fbe23f9805b15c2cc337ffd2ec738e 100644
--- a/src/plugins/git/gitsubmiteditor.cpp
+++ b/src/plugins/git/gitsubmiteditor.cpp
@@ -27,13 +27,16 @@
 **
 ****************************************************************************/
 
+#include "commitdata.h"
+#include "gitclient.h"
+#include "gitconstants.h"
+#include "gitplugin.h"
 #include "gitsubmiteditor.h"
 #include "gitsubmiteditorwidget.h"
-#include "gitconstants.h"
-#include "commitdata.h"
 
 #include <utils/qtcassert.h>
 #include <vcsbase/submitfilemodel.h>
+#include <vcsbase/vcsbaseoutputwindow.h>
 
 #include <QDebug>
 #include <QStringList>
@@ -49,7 +52,8 @@ namespace Internal {
 
 GitSubmitEditor::GitSubmitEditor(const VcsBase::VcsBaseSubmitEditorParameters *parameters, QWidget *parent) :
     VcsBaseSubmitEditor(parameters, new GitSubmitEditorWidget(parent)),
-    m_model(0)
+    m_model(0),
+    m_amend(false)
 {
     connect(this, SIGNAL(diffSelectedFiles(QStringList)), this, SLOT(slotDiffSelected(QStringList)));
 }
@@ -59,6 +63,25 @@ GitSubmitEditorWidget *GitSubmitEditor::submitEditorWidget()
     return static_cast<GitSubmitEditorWidget *>(widget());
 }
 
+static void mergeFileModels(VcsBase::SubmitFileModel *model, const VcsBase::SubmitFileModel *source)
+{
+    int j = 0;
+    for (int i = 0; i < model->rowCount() && j < source->rowCount(); ++i) {
+        CommitData::StateFilePair stateFile(
+                    static_cast<FileStates>(model->extraData(i).toInt()), model->file(i));
+        for (; j < source->rowCount(); ++j) {
+            CommitData::StateFilePair sourceStateFile(
+                        static_cast<FileStates>(source->extraData(j).toInt()), source->file(j));
+            if (stateFile == sourceStateFile) {
+                model->setChecked(i, source->checked(j));
+                break;
+            } else if (stateFile < sourceStateFile) {
+                break;
+            }
+        }
+    }
+}
+
 void GitSubmitEditor::setCommitData(const CommitData &d)
 {
     GitSubmitEditorWidget *w = submitEditorWidget();
@@ -67,7 +90,9 @@ void GitSubmitEditor::setCommitData(const CommitData &d)
     w->setHasUnmerged(false);
 
     m_commitEncoding = d.commitEncoding;
+    m_workingDirectory = d.panelInfo.repository;
 
+    VcsBase::SubmitFileModel *oldModel = m_model;
     m_model = new VcsBase::SubmitFileModel(this);
     if (!d.files.isEmpty()) {
         for (QList<CommitData::StateFilePair>::const_iterator it = d.files.constBegin();
@@ -87,9 +112,19 @@ void GitSubmitEditor::setCommitData(const CommitData &d)
                              QVariant(static_cast<int>(state)));
         }
     }
+    if (oldModel) {
+        mergeFileModels(m_model, oldModel);
+        delete oldModel;
+    }
     setFileModel(m_model, d.panelInfo.repository);
 }
 
+void GitSubmitEditor::setAmend(bool amend)
+{
+    m_amend = amend;
+    setEmptyFileListEnabled(amend); // Allow for just correcting the message
+}
+
 void GitSubmitEditor::slotDiffSelected(const QStringList &files)
 {
     // Sort it apart into unmerged/staged/unstaged files
@@ -116,6 +151,17 @@ void GitSubmitEditor::slotDiffSelected(const QStringList &files)
         emit merge(unmergedFiles);
 }
 
+void GitSubmitEditor::updateFileModel()
+{
+    GitClient *client = GitPlugin::instance()->gitClient();
+    QString errorMessage, commitTemplate;
+    CommitData data;
+    if (client->getCommitData(m_workingDirectory, m_amend, &commitTemplate, &data, &errorMessage))
+        setCommitData(data);
+    else
+        VcsBase::VcsBaseOutputWindow::instance()->append(errorMessage);
+}
+
 GitSubmitEditorPanelData GitSubmitEditor::panelData() const
 {
     return const_cast<GitSubmitEditor*>(this)->submitEditorWidget()->panelData();
diff --git a/src/plugins/git/gitsubmiteditor.h b/src/plugins/git/gitsubmiteditor.h
index 2cacaecc2e9fcf837f6c2fb8abb5c1903429d7e4..79c43473280ed52a82b7470eeee6316ab924c842 100644
--- a/src/plugins/git/gitsubmiteditor.h
+++ b/src/plugins/git/gitsubmiteditor.h
@@ -52,6 +52,7 @@ public:
     explicit GitSubmitEditor(const VcsBase::VcsBaseSubmitEditorParameters *parameters, QWidget *parent);
 
     void setCommitData(const CommitData &);
+    void setAmend(bool amend);
     GitSubmitEditorPanelData panelData() const;
 
 signals:
@@ -60,6 +61,7 @@ signals:
 
 protected:
     QByteArray fileContents() const;
+    void updateFileModel();
 
 private slots:
     void slotDiffSelected(const QStringList &);
@@ -69,6 +71,8 @@ private:
 
     VcsBase::SubmitFileModel *m_model;
     QString m_commitEncoding;
+    bool m_amend;
+    QString m_workingDirectory;
 };
 
 } // namespace Internal
diff --git a/src/plugins/vcsbase/submitfilemodel.cpp b/src/plugins/vcsbase/submitfilemodel.cpp
index dd24b0eaab5548b7f2648a452b3d7948b2634775..404540751381afafbf4f3ed6b621819f6c148d9c 100644
--- a/src/plugins/vcsbase/submitfilemodel.cpp
+++ b/src/plugins/vcsbase/submitfilemodel.cpp
@@ -117,6 +117,12 @@ bool SubmitFileModel::checked(int row) const
     return (item(row)->checkState() == Qt::Checked);
 }
 
+void SubmitFileModel::setChecked(int row, bool check)
+{
+    if (row >= 0 || row < rowCount())
+        item(row)->setCheckState(check ? Qt::Checked : Qt::Unchecked);
+}
+
 QVariant SubmitFileModel::extraData(int row) const
 {
     if (row < 0 || row >= rowCount())
diff --git a/src/plugins/vcsbase/submitfilemodel.h b/src/plugins/vcsbase/submitfilemodel.h
index 74579c0fc314a39f23a48e4daba628552ec8e712..8d3e03e69478c61832172fca66ab177bfd51d98b 100644
--- a/src/plugins/vcsbase/submitfilemodel.h
+++ b/src/plugins/vcsbase/submitfilemodel.h
@@ -62,6 +62,7 @@ public:
     QString state(int row) const;
     QString file(int row) const;
     bool checked(int row) const;
+    void setChecked(int row, bool check);
     QVariant extraData(int row) const;
 
     bool hasCheckedFiles() const;
diff --git a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp
index c41f984cbbeea433d8361601aa84927ce83d2d5e..ae6d2bedd2fe226d62887cd044a6afd68fc9c7cc 100644
--- a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp
+++ b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp
@@ -44,11 +44,12 @@
 #include <cplusplus/Symbol.h>
 #include <cplusplus/Symbols.h>
 #include <cplusplus/TranslationUnit.h>
-#include <coreplugin/idocument.h>
 #include <coreplugin/icore.h>
-#include <coreplugin/editormanager/editormanager.h>
 #include <coreplugin/id.h>
+#include <coreplugin/idocument.h>
+#include <coreplugin/mainwindow.h>
 #include <coreplugin/actionmanager/actionmanager.h>
+#include <coreplugin/editormanager/editormanager.h>
 #include <utils/completingtextedit.h>
 #include <utils/submiteditorwidget.h>
 #include <utils/checkablemessagebox.h>
@@ -238,6 +239,9 @@ VcsBaseSubmitEditor::VcsBaseSubmitEditor(const VcsBaseSubmitEditorParameters *pa
     connect(VcsPlugin::instance(),
             SIGNAL(settingsChanged(VcsBase::Internal::CommonVcsSettings)),
             this, SLOT(slotUpdateEditorSettings(VcsBase::Internal::CommonVcsSettings)));
+    connect(Core::EditorManager::instance(), SIGNAL(currentEditorChanged(Core::IEditor*)),
+            this, SLOT(slotRefreshCommitData()));
+    connect(Core::ICore::mainWindow(), SIGNAL(windowActivated()), this, SLOT(slotRefreshCommitData()));
 
     Aggregation::Aggregate *aggregate = new Aggregation::Aggregate;
     aggregate->add(new Find::BaseTextFind(d->m_widget->descriptionEdit()));
@@ -257,6 +261,12 @@ void VcsBaseSubmitEditor::slotUpdateEditorSettings(const CommonVcsSettings &s)
     setLineWrap(s.lineWrap);
 }
 
+void VcsBaseSubmitEditor::slotRefreshCommitData()
+{
+    if (Core::EditorManager::currentEditor() == this)
+        updateFileModel();
+}
+
 // Return a trimmed list of non-empty field texts
 static inline QStringList fieldTexts(const QString &fileContents)
 {
diff --git a/src/plugins/vcsbase/vcsbasesubmiteditor.h b/src/plugins/vcsbase/vcsbasesubmiteditor.h
index 7f608cef82c1a3f0f2620cee0fa3a452cca56622..90b9f58f8c9565b7f42b55e2a42e02041f10821d 100644
--- a/src/plugins/vcsbase/vcsbasesubmiteditor.h
+++ b/src/plugins/vcsbase/vcsbasesubmiteditor.h
@@ -134,6 +134,7 @@ public:
 
     void setFileModel(QAbstractItemModel *m, const QString &repositoryDirectory = QString());
     QAbstractItemModel *fileModel() const;
+    virtual void updateFileModel() { }
 
     // Utilities returning some predefined icons for actions
     static QIcon diffIcon();
@@ -161,6 +162,7 @@ private slots:
     void slotInsertNickName();
     void slotSetFieldNickName(int);
     void slotUpdateEditorSettings(const VcsBase::Internal::CommonVcsSettings &);
+    void slotRefreshCommitData();
 
 protected:
     /* These hooks allow for modifying the contents that goes to