diff --git a/src/plugins/bazaar/bazaarplugin.cpp b/src/plugins/bazaar/bazaarplugin.cpp
index 417761c1044411c7dc019ce1bfe7c77e95aac349..aecfa62604a37ac8522c2bfcfb30528711920205 100644
--- a/src/plugins/bazaar/bazaarplugin.cpp
+++ b/src/plugins/bazaar/bazaarplugin.cpp
@@ -112,7 +112,7 @@ static const VcsBase::VcsBaseSubmitEditorParameters submitEditorParameters = {
 BazaarPlugin *BazaarPlugin::m_instance = 0;
 
 BazaarPlugin::BazaarPlugin()
-    : VcsBase::VcsBasePlugin(Constants::COMMIT_ID),
+    : VcsBase::VcsBasePlugin(),
       m_optionsPage(0),
       m_client(0),
       m_commandLocator(0),
@@ -517,7 +517,7 @@ void BazaarPlugin::createSubmitEditorActions()
 
 void BazaarPlugin::commit()
 {
-    if (VcsBase::VcsBaseSubmitEditor::raiseSubmitEditor())
+    if (raiseSubmitEditor())
         return;
 
     const VcsBase::VcsBasePluginState state = currentState();
@@ -566,6 +566,7 @@ void BazaarPlugin::showCommitWidget(const QList<VcsBase::VcsBaseClient::StatusIt
         outputWindow->appendError(tr("Unable to create a commit editor."));
         return;
     }
+    setSubmitEditor(commitEditor);
 
     commitEditor->registerActions(m_editorUndo, m_editorRedo, m_editorCommit, m_editorDiff);
     connect(commitEditor, SIGNAL(diffSelectedFiles(QStringList)),
@@ -653,12 +654,12 @@ void BazaarPlugin::commitFromEditor()
     Core::ICore::editorManager()->closeEditor();
 }
 
-bool BazaarPlugin::submitEditorAboutToClose(VcsBase::VcsBaseSubmitEditor *submitEditor)
+bool BazaarPlugin::submitEditorAboutToClose()
 {
-    Core::IDocument *editorDocument = submitEditor->document();
-    const CommitEditor *commitEditor = qobject_cast<const CommitEditor *>(submitEditor);
-    if (!editorDocument || !commitEditor)
-        return true;
+    CommitEditor *commitEditor = qobject_cast<CommitEditor *>(submitEditor());
+    QTC_ASSERT(commitEditor, return true);
+    Core::IDocument *editorDocument = commitEditor->document();
+    QTC_ASSERT(editorDocument, return true);
 
     bool dummyPrompt = m_bazaarSettings.boolValue(BazaarSettings::promptOnSubmitKey);
     const VcsBase::VcsBaseSubmitEditor::PromptSubmitResult response =
@@ -690,7 +691,7 @@ bool BazaarPlugin::submitEditorAboutToClose(VcsBase::VcsBaseSubmitEditor *submit
                 *iFile = parts.last();
         }
 
-        const BazaarCommitWidget *commitWidget = commitEditor->commitWidget();
+        BazaarCommitWidget *commitWidget = commitEditor->commitWidget();
         QStringList extraOptions;
         // Author
         if (!commitWidget->committer().isEmpty())
diff --git a/src/plugins/bazaar/bazaarplugin.h b/src/plugins/bazaar/bazaarplugin.h
index 60a562d274f03d368053a53a45ffa535cd264651..0baa0157c1497204b538c8138fe31ee4fe544d33 100644
--- a/src/plugins/bazaar/bazaarplugin.h
+++ b/src/plugins/bazaar/bazaarplugin.h
@@ -115,7 +115,7 @@ private slots:
 
 protected:
     void updateActions(VcsBase::VcsBasePlugin::ActionState);
-    bool submitEditorAboutToClose(VcsBase::VcsBaseSubmitEditor *submitEditor);
+    bool submitEditorAboutToClose();
 
 private:
     // Methods
diff --git a/src/plugins/bazaar/commiteditor.cpp b/src/plugins/bazaar/commiteditor.cpp
index 2ba32a59a42637f033a28f02959a9a5cd615b96c..b41a04012f6819c3d25eba6de56203f4ef388432 100644
--- a/src/plugins/bazaar/commiteditor.cpp
+++ b/src/plugins/bazaar/commiteditor.cpp
@@ -43,12 +43,6 @@ CommitEditor::CommitEditor(const VcsBase::VcsBaseSubmitEditorParameters *paramet
     setDisplayName(tr("Commit Editor"));
 }
 
-const BazaarCommitWidget *CommitEditor::commitWidget() const
-{
-    CommitEditor *nonConstThis = const_cast<CommitEditor *>(this);
-    return static_cast<const BazaarCommitWidget *>(nonConstThis->widget());
-}
-
 BazaarCommitWidget *CommitEditor::commitWidget()
 {
     return static_cast<BazaarCommitWidget *>(widget());
diff --git a/src/plugins/bazaar/commiteditor.h b/src/plugins/bazaar/commiteditor.h
index 483fb819bb40cbebc7c9c1df083afdee88dcbf9f..491d4557af3767488023650ef65c6f4b125ea010 100644
--- a/src/plugins/bazaar/commiteditor.h
+++ b/src/plugins/bazaar/commiteditor.h
@@ -54,10 +54,9 @@ public:
                    const QString &userName, const QString &email,
                    const QList<VcsBase::VcsBaseClient::StatusItem> &repoStatus);
 
-    const BazaarCommitWidget *commitWidget() const;
+    BazaarCommitWidget *commitWidget();
 
 private:
-    BazaarCommitWidget *commitWidget();
     VcsBase::SubmitFileModel *m_fileModel;
 };
 
diff --git a/src/plugins/clearcase/clearcaseplugin.cpp b/src/plugins/clearcase/clearcaseplugin.cpp
index 2412ca1cc3b4199fa3008419f9c8a3aba72356b3..3c74ad1a5b49407eab19dc97a55c0f5e1bbd8fdc 100644
--- a/src/plugins/clearcase/clearcaseplugin.cpp
+++ b/src/plugins/clearcase/clearcaseplugin.cpp
@@ -469,15 +469,15 @@ bool ClearCasePlugin::initialize(const QStringList & /*arguments */, QString *er
 }
 
 // called before closing the submit editor
-bool ClearCasePlugin::submitEditorAboutToClose(VcsBase::VcsBaseSubmitEditor *submitEditor)
+bool ClearCasePlugin::submitEditorAboutToClose()
 {
     if (!isCheckInEditorOpen())
         return true;
 
-    Core::IDocument *editorDocument = submitEditor->document();
-    ClearCaseSubmitEditor *editor = qobject_cast<ClearCaseSubmitEditor *>(submitEditor);
-    if (!editorDocument || !editor)
-        return true;
+    ClearCaseSubmitEditor *editor = qobject_cast<ClearCaseSubmitEditor *>(submitEditor());
+    QTC_ASSERT(editor, return true);
+    Core::IDocument *editorDocument = editor->document();
+    QTC_ASSERT(editorDocument, return true);
 
     // Submit editor closing. Make it write out the check in message
     // and retrieve files
@@ -1030,7 +1030,7 @@ void ClearCasePlugin::startCheckInActivity()
  * check in will start. */
 void ClearCasePlugin::startCheckIn(const QString &workingDir, const QStringList &files)
 {
-    if (VcsBase::VcsBaseSubmitEditor::raiseSubmitEditor())
+    if (raiseSubmitEditor())
         return;
     VcsBase::VcsBaseOutputWindow *outputwindow = VcsBase::VcsBaseOutputWindow::instance();
 
@@ -1059,6 +1059,7 @@ void ClearCasePlugin::startCheckIn(const QString &workingDir, const QStringList
     m_checkInView = workingDir;
     // Create a submit editor and set file list
     ClearCaseSubmitEditor *editor = openClearCaseSubmitEditor(m_checkInMessageFileName, m_viewData.isUcm);
+    setSubmitEditor(editor);
     editor->setStatusList(files);
 
     if (m_viewData.isUcm && (files.size() == 1)) {
diff --git a/src/plugins/clearcase/clearcaseplugin.h b/src/plugins/clearcase/clearcaseplugin.h
index 0a469b69daae63eb72ccba6ddd79b5ce2c8621f2..842e2602f3d432f391830caaed965dd4f6fca2dc 100644
--- a/src/plugins/clearcase/clearcaseplugin.h
+++ b/src/plugins/clearcase/clearcaseplugin.h
@@ -201,7 +201,7 @@ private slots:
 
 protected:
     void updateActions(VcsBase::VcsBasePlugin::ActionState);
-    bool submitEditorAboutToClose(VcsBase::VcsBaseSubmitEditor *submitEditor);
+    bool submitEditorAboutToClose();
     QString ccGet(const QString &workingDir, const QString &file, const QString &prefix = QString());
     QList<QStringPair> ccGetActivities() const;
 
diff --git a/src/plugins/cvs/cvsplugin.cpp b/src/plugins/cvs/cvsplugin.cpp
index ea0ee3911bd5fe660e7ccceee3f4b8cc269bb4e2..75d3e09dfccf8f6598e9cc1c0a29430081b59bdf 100644
--- a/src/plugins/cvs/cvsplugin.cpp
+++ b/src/plugins/cvs/cvsplugin.cpp
@@ -162,7 +162,7 @@ static inline bool messageBoxQuestion(const QString &title, const QString &quest
 CvsPlugin *CvsPlugin::m_cvsPluginInstance = 0;
 
 CvsPlugin::CvsPlugin() :
-    VcsBasePlugin(Constants::CVSCOMMITEDITOR_ID),
+    VcsBasePlugin(),
     m_commandLocator(0),
     m_addAction(0),
     m_deleteAction(0),
@@ -450,15 +450,15 @@ bool CvsPlugin::initialize(const QStringList &arguments, QString *errorMessage)
     return true;
 }
 
-bool CvsPlugin::submitEditorAboutToClose(VcsBaseSubmitEditor *submitEditor)
+bool CvsPlugin::submitEditorAboutToClose()
 {
     if (!isCommitEditorOpen())
         return true;
 
-    IDocument *editorDocument = submitEditor->document();
-    const CvsSubmitEditor *editor = qobject_cast<CvsSubmitEditor *>(submitEditor);
-    if (!editorDocument || !editor)
-        return true;
+    CvsSubmitEditor *editor = qobject_cast<CvsSubmitEditor *>(submitEditor());
+    QTC_ASSERT(editor, return true);
+    IDocument *editorDocument = editor->document();
+    QTC_ASSERT(editorDocument, return true);
 
     // Submit editor closing. Make it write out the commit message
     // and retrieve files
@@ -759,7 +759,7 @@ void CvsPlugin::startCommitAll()
  * commit will start. */
 void CvsPlugin::startCommit(const QString &workingDir, const QStringList &files)
 {
-    if (VcsBaseSubmitEditor::raiseSubmitEditor())
+    if (raiseSubmitEditor())
         return;
     if (isCommitEditorOpen()) {
         VcsBaseOutputWindow::instance()->appendWarning(tr("Another commit is currently being executed."));
@@ -804,6 +804,7 @@ void CvsPlugin::startCommit(const QString &workingDir, const QStringList &files)
     m_commitMessageFileName = saver.fileName();
     // Create a submit editor and set file list
     CvsSubmitEditor *editor = openCVSSubmitEditor(m_commitMessageFileName);
+    setSubmitEditor(editor);
     editor->setCheckScriptWorkingDirectory(m_commitRepository);
     editor->setStateList(statusOutput);
 }
diff --git a/src/plugins/cvs/cvsplugin.h b/src/plugins/cvs/cvsplugin.h
index ec8235ae47e05ab408c0d2ff9b41c57d6d077d55..09b8a43522060e6201151702e7f14600b8392d6c 100644
--- a/src/plugins/cvs/cvsplugin.h
+++ b/src/plugins/cvs/cvsplugin.h
@@ -131,7 +131,7 @@ private slots:
 
 protected:
     void updateActions(VcsBase::VcsBasePlugin::ActionState);
-    bool submitEditorAboutToClose(VcsBase::VcsBaseSubmitEditor *submitEditor);
+    bool submitEditorAboutToClose();
 
 private:
     bool isCommitEditorOpen() const;
diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp
index f80b661a6b011e89402171a740d03616d587752b..ef1053ca415d6baaf1a036002f2ee17b81485c30 100644
--- a/src/plugins/git/gitplugin.cpp
+++ b/src/plugins/git/gitplugin.cpp
@@ -125,7 +125,7 @@ using namespace Git::Internal;
 GitPlugin *GitPlugin::m_instance = 0;
 
 GitPlugin::GitPlugin() :
-    VcsBase::VcsBasePlugin(Git::Constants::GITSUBMITEDITOR_ID),
+    VcsBase::VcsBasePlugin(),
     m_commandLocator(0),
     m_submitCurrentAction(0),
     m_diffSelectedFilesAction(0),
@@ -843,7 +843,7 @@ void GitPlugin::startCommit()
 
 void GitPlugin::startCommit(bool amend)
 {
-    if (VcsBase::VcsBaseSubmitEditor::raiseSubmitEditor())
+    if (raiseSubmitEditor())
         return;
     if (isCommitEditorOpen()) {
         VcsBase::VcsBaseOutputWindow::instance()->appendWarning(tr("Another submit is currently being executed."));
@@ -904,6 +904,7 @@ Core::IEditor *GitPlugin::openSubmitEditor(const QString &fileName, const Commit
                                                 Core::EditorManager::ModeSwitch);
     GitSubmitEditor *submitEditor = qobject_cast<GitSubmitEditor*>(editor);
     QTC_ASSERT(submitEditor, return 0);
+    setSubmitEditor(submitEditor);
     // The actions are for some reason enabled by the context switching
     // mechanism. Disable them correctly.
     submitEditor->registerActions(m_undoAction, m_redoAction, m_submitCurrentAction, m_diffSelectedFilesAction);
@@ -924,14 +925,14 @@ void GitPlugin::submitCurrentLog()
     Core::ICore::editorManager()->closeEditor();
 }
 
-bool GitPlugin::submitEditorAboutToClose(VcsBase::VcsBaseSubmitEditor *submitEditor)
+bool GitPlugin::submitEditorAboutToClose()
 {
     if (!isCommitEditorOpen())
         return false;
-    Core::IDocument *editorDocument = submitEditor->document();
-    const GitSubmitEditor *editor = qobject_cast<GitSubmitEditor *>(submitEditor);
-    if (!editorDocument || !editor)
-        return true;
+    GitSubmitEditor *editor = qobject_cast<GitSubmitEditor *>(submitEditor());
+    QTC_ASSERT(editor, return true);
+    Core::IDocument *editorDocument = editor->document();
+    QTC_ASSERT(editorDocument, return true);
     // Submit editor closing. Make it write out the commit message
     // and retrieve files
     const QFileInfo editorFile(editorDocument->fileName());
diff --git a/src/plugins/git/gitplugin.h b/src/plugins/git/gitplugin.h
index d52e75a54c6acd050dc0098316e118d1ec24542c..711b81acd7ddc78c729d863aa0760114d3f5251c 100644
--- a/src/plugins/git/gitplugin.h
+++ b/src/plugins/git/gitplugin.h
@@ -149,7 +149,7 @@ private slots:
 #endif
 protected:
     void updateActions(VcsBase::VcsBasePlugin::ActionState);
-    bool submitEditorAboutToClose(VcsBase::VcsBaseSubmitEditor *submitEditor);
+    bool submitEditorAboutToClose();
 
 private:
     inline ParameterActionCommandPair
diff --git a/src/plugins/mercurial/mercurialplugin.cpp b/src/plugins/mercurial/mercurialplugin.cpp
index ebdb31a91377a38d048ace1aea6d3f22ff5bafb2..e076c81dd72497235d20b43a036ea09d6ac057ab 100644
--- a/src/plugins/mercurial/mercurialplugin.cpp
+++ b/src/plugins/mercurial/mercurialplugin.cpp
@@ -115,7 +115,7 @@ static const VcsBaseSubmitEditorParameters submitEditorParameters = {
 MercurialPlugin *MercurialPlugin::m_instance = 0;
 
 MercurialPlugin::MercurialPlugin() :
-        VcsBasePlugin(Constants::COMMIT_ID),
+    VcsBasePlugin(),
         optionsPage(0),
         m_client(0),
         core(0),
@@ -534,7 +534,7 @@ void MercurialPlugin::createSubmitEditorActions()
 
 void MercurialPlugin::commit()
 {
-    if (VcsBaseSubmitEditor::raiseSubmitEditor())
+    if (raiseSubmitEditor())
         return;
 
     const VcsBasePluginState state = currentState();
@@ -578,6 +578,7 @@ void MercurialPlugin::showCommitWidget(const QList<VcsBaseClient::StatusItem> &s
 
     QTC_ASSERT(qobject_cast<CommitEditor *>(editor), return);
     CommitEditor *commitEditor = static_cast<CommitEditor *>(editor);
+    setSubmitEditor(commitEditor);
 
     commitEditor->registerActions(editorUndo, editorRedo, editorCommit, editorDiff);
     connect(commitEditor, SIGNAL(diffSelectedFiles(QStringList)),
@@ -606,12 +607,12 @@ void MercurialPlugin::commitFromEditor()
     Core::ICore::editorManager()->closeEditor();
 }
 
-bool MercurialPlugin::submitEditorAboutToClose(VcsBaseSubmitEditor *submitEditor)
+bool MercurialPlugin::submitEditorAboutToClose()
 {
-    Core::IDocument *editorFile = submitEditor->document();
-    CommitEditor *commitEditor = qobject_cast<CommitEditor *>(submitEditor);
-    if (!editorFile || !commitEditor)
-        return true;
+    CommitEditor *commitEditor = qobject_cast<CommitEditor *>(submitEditor());
+    QTC_ASSERT(commitEditor, return true);
+    Core::IDocument *editorFile = commitEditor->document();
+    QTC_ASSERT(editorFile, return true);
 
     bool dummyPrompt = mercurialSettings.boolValue(MercurialSettings::promptOnSubmitKey);
     const VcsBaseSubmitEditor::PromptSubmitResult response =
diff --git a/src/plugins/mercurial/mercurialplugin.h b/src/plugins/mercurial/mercurialplugin.h
index a6c1265969be4a6e2955e1e17f42a0c41b6395d3..824bc04eb1fd1f7a7b777e1447d6df904f2c7cad 100644
--- a/src/plugins/mercurial/mercurialplugin.h
+++ b/src/plugins/mercurial/mercurialplugin.h
@@ -125,7 +125,7 @@ private slots:
 
 protected:
     void updateActions(VcsBase::VcsBasePlugin::ActionState);
-    bool submitEditorAboutToClose(VcsBase::VcsBaseSubmitEditor *submitEditor);
+    bool submitEditorAboutToClose();
 
 private:
     void createMenu();
diff --git a/src/plugins/perforce/perforceplugin.cpp b/src/plugins/perforce/perforceplugin.cpp
index c74d8004b76ec2908aa77ee94ed0d08c73d3e0d2..dbf348790488be2099c679048d55216505c3869b 100644
--- a/src/plugins/perforce/perforceplugin.cpp
+++ b/src/plugins/perforce/perforceplugin.cpp
@@ -176,7 +176,7 @@ PerforceResponse::PerforceResponse() :
 PerforcePlugin *PerforcePlugin::m_perforcePluginInstance = NULL;
 
 PerforcePlugin::PerforcePlugin() :
-    VcsBase::VcsBasePlugin(Constants::PERFORCE_SUBMIT_EDITOR_ID),
+    VcsBase::VcsBasePlugin(),
     m_commandLocator(0),
     m_editAction(0),
     m_addAction(0),
@@ -596,7 +596,7 @@ void PerforcePlugin::printOpenedFileList()
 void PerforcePlugin::startSubmitProject()
 {
 
-    if (VcsBase::VcsBaseSubmitEditor::raiseSubmitEditor())
+    if (raiseSubmitEditor())
         return;
 
     if (isCommitEditorOpen()) {
@@ -661,6 +661,7 @@ Core::IEditor *PerforcePlugin::openPerforceSubmitEditor(const QString &fileName,
     Core::IEditor *editor = Core::EditorManager::openEditor(fileName, Constants::PERFORCE_SUBMIT_EDITOR_ID,
                                                       Core::EditorManager::ModeSwitch);
     PerforceSubmitEditor *submitEditor = static_cast<PerforceSubmitEditor*>(editor);
+    setSubmitEditor(submitEditor);
     submitEditor->restrictToProjectFiles(depotFileNames);
     submitEditor->registerActions(m_undoAction, m_redoAction, m_submitCurrentLogAction, m_diffSelectedFiles);
     connect(submitEditor, SIGNAL(diffSelectedFiles(QStringList)), this, SLOT(slotSubmitDiff(QStringList)));
@@ -1321,14 +1322,14 @@ bool PerforcePlugin::isCommitEditorOpen() const
     return !m_commitMessageFileName.isEmpty();
 }
 
-bool PerforcePlugin::submitEditorAboutToClose(VcsBase::VcsBaseSubmitEditor *submitEditor)
+bool PerforcePlugin::submitEditorAboutToClose()
 {
     if (!isCommitEditorOpen())
         return true;
-    Core::IDocument *editorDocument = submitEditor->document();
-    const PerforceSubmitEditor *perforceEditor = qobject_cast<PerforceSubmitEditor *>(submitEditor);
-    if (!editorDocument || !perforceEditor)
-        return true;
+    PerforceSubmitEditor *perforceEditor = qobject_cast<PerforceSubmitEditor *>(submitEditor());
+    QTC_ASSERT(perforceEditor, return true);
+    Core::IDocument *editorDocument = perforceEditor->document();
+    QTC_ASSERT(editorDocument, return true);
     // Prompt the user. Force a prompt unless submit was actually invoked (that
     // is, the editor was closed or shutdown).
     bool wantsPrompt = m_settings.promptToSubmit();
@@ -1371,7 +1372,7 @@ bool PerforcePlugin::submitEditorAboutToClose(VcsBase::VcsBaseSubmitEditor *subm
     }
     VcsBase::VcsBaseOutputWindow::instance()->append(submitResponse.stdOut);
     if (submitResponse.stdOut.contains(QLatin1String("Out of date files must be resolved or reverted)")))
-        QMessageBox::warning(submitEditor->widget(), tr("Pending change"), tr("Could not submit the change, because your workspace was out of date. Created a pending submit instead."));
+        QMessageBox::warning(perforceEditor->widget(), tr("Pending change"), tr("Could not submit the change, because your workspace was out of date. Created a pending submit instead."));
 
     cleanCommitMessageFile();
     return true;
diff --git a/src/plugins/perforce/perforceplugin.h b/src/plugins/perforce/perforceplugin.h
index bfde3f71a253337d20701f5ed4f2346288bc9622..8eeb1e232e3328af5b172c5c9a0ab64ec9259ab4 100644
--- a/src/plugins/perforce/perforceplugin.h
+++ b/src/plugins/perforce/perforceplugin.h
@@ -142,7 +142,7 @@ private slots:
 #endif
 protected:
     void updateActions(VcsBase::VcsBasePlugin::ActionState);
-    bool submitEditorAboutToClose(VcsBase::VcsBaseSubmitEditor *submitEditor);
+    bool submitEditorAboutToClose();
 
 
 private:
diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp
index 5c6f4b72e4de6b55e5e5191a3db823da4341b143..1dce476c37fffb4593ff74c6ed1b26040cc16a35 100644
--- a/src/plugins/subversion/subversionplugin.cpp
+++ b/src/plugins/subversion/subversionplugin.cpp
@@ -186,7 +186,7 @@ static inline QStringList svnDirectories()
 SubversionPlugin *SubversionPlugin::m_subversionPluginInstance = 0;
 
 SubversionPlugin::SubversionPlugin() :
-    VcsBase::VcsBasePlugin(Subversion::Constants::SUBVERSIONCOMMITEDITOR_ID),
+    VcsBase::VcsBasePlugin(),
     m_svnDirectories(svnDirectories()),
     m_commandLocator(0),
     m_addAction(0),
@@ -455,15 +455,15 @@ bool SubversionPlugin::initialize(const QStringList & /*arguments */, QString *e
     return true;
 }
 
-bool SubversionPlugin::submitEditorAboutToClose(VcsBase::VcsBaseSubmitEditor *submitEditor)
+bool SubversionPlugin::submitEditorAboutToClose()
 {
     if (!isCommitEditorOpen())
         return true;
 
-    Core::IDocument *editorDocument = submitEditor->document();
-    const SubversionSubmitEditor *editor = qobject_cast<SubversionSubmitEditor *>(submitEditor);
-    if (!editorDocument || !editor)
-        return true;
+    SubversionSubmitEditor *editor = qobject_cast<SubversionSubmitEditor *>(submitEditor());
+    QTC_ASSERT(editor, return true);
+    Core::IDocument *editorDocument = editor->document();
+    QTC_ASSERT(editorDocument, return true);
 
     // Submit editor closing. Make it write out the commit message
     // and retrieve files
@@ -623,6 +623,7 @@ SubversionSubmitEditor *SubversionPlugin::openSubversionSubmitEditor(const QStri
                                                             Core::EditorManager::ModeSwitch);
     SubversionSubmitEditor *submitEditor = qobject_cast<SubversionSubmitEditor*>(editor);
     QTC_CHECK(submitEditor);
+    setSubmitEditor(submitEditor);
     submitEditor->registerActions(m_submitUndoAction, m_submitRedoAction, m_submitCurrentLogAction, m_submitDiffAction);
     connect(submitEditor, SIGNAL(diffSelectedFiles(QStringList)), this, SLOT(diffCommitFiles(QStringList)));
     submitEditor->setCheckScriptWorkingDirectory(m_commitRepository);
@@ -766,7 +767,7 @@ void SubversionPlugin::startCommitProject()
  * commit will start. */
 void SubversionPlugin::startCommit(const QString &workingDir, const QStringList &files)
 {
-    if (VcsBase::VcsBaseSubmitEditor::raiseSubmitEditor())
+    if (raiseSubmitEditor())
         return;
     if (isCommitEditorOpen()) {
         VcsBase::VcsBaseOutputWindow::instance()->appendWarning(tr("Another commit is currently being executed."));
diff --git a/src/plugins/subversion/subversionplugin.h b/src/plugins/subversion/subversionplugin.h
index b10c489b6edff125d9ae55f3b5d748de8dfa6acf..2020313a60cc7435fce2ef3ea003c7771e4c9e83 100644
--- a/src/plugins/subversion/subversionplugin.h
+++ b/src/plugins/subversion/subversionplugin.h
@@ -144,7 +144,7 @@ private slots:
 
 protected:
     void updateActions(VcsBase::VcsBasePlugin::ActionState);
-    bool submitEditorAboutToClose(VcsBase::VcsBaseSubmitEditor *submitEditor);
+    bool submitEditorAboutToClose();
 
 private:
     inline bool isCommitEditorOpen() const;
diff --git a/src/plugins/vcsbase/vcsbaseplugin.cpp b/src/plugins/vcsbase/vcsbaseplugin.cpp
index 11991ac5753ba88ad10138944fcc49f26e498c53..7193f0deff5ad6a47ec8bedcdebf07bab9f8d1e8 100644
--- a/src/plugins/vcsbase/vcsbaseplugin.cpp
+++ b/src/plugins/vcsbase/vcsbaseplugin.cpp
@@ -490,11 +490,11 @@ VCSBASE_EXPORT QDebug operator<<(QDebug in, const VcsBasePluginState &state)
 
 struct VcsBasePluginPrivate
 {
-    explicit VcsBasePluginPrivate(const Core::Id submitEditorId);
+    explicit VcsBasePluginPrivate();
 
     inline bool supportsRepositoryCreation() const;
 
-    const Core::Id m_submitEditorId;
+    QPointer<VcsBaseSubmitEditor> m_submitEditor;
     Core::IVersionControl *m_versionControl;
     VcsBasePluginState m_state;
     int m_actionState;
@@ -507,8 +507,7 @@ struct VcsBasePluginPrivate
     static Internal::StateListener *m_listener;
 };
 
-VcsBasePluginPrivate::VcsBasePluginPrivate(const Core::Id submitEditorId) :
-    m_submitEditorId(submitEditorId),
+VcsBasePluginPrivate::VcsBasePluginPrivate() :
     m_versionControl(0),
     m_actionState(-1),
     m_testSnapshotAction(0),
@@ -525,8 +524,8 @@ bool VcsBasePluginPrivate::supportsRepositoryCreation() const
 
 Internal::StateListener *VcsBasePluginPrivate::m_listener = 0;
 
-VcsBasePlugin::VcsBasePlugin(const Core::Id submitEditorId) :
-    d(new VcsBasePluginPrivate(submitEditorId))
+VcsBasePlugin::VcsBasePlugin() :
+    d(new VcsBasePluginPrivate())
 {
 }
 
@@ -561,9 +560,11 @@ void VcsBasePlugin::extensionsInitialized()
 void VcsBasePlugin::slotSubmitEditorAboutToClose(VcsBaseSubmitEditor *submitEditor, bool *result)
 {
     if (debug)
-        qDebug() << this << d->m_submitEditorId.name() << "Closing submit editor" << submitEditor << submitEditor->id().name();
-    if (submitEditor->id() == d->m_submitEditorId)
-        *result = submitEditorAboutToClose(submitEditor);
+        qDebug() << this << "plugin's submit editor"
+                 << d->m_submitEditor << (d->m_submitEditor ? d->m_submitEditor->id().name() : "")
+                 << "closing submit editor" << submitEditor << submitEditor->id().name();
+    if (submitEditor == d->m_submitEditor)
+        *result = submitEditorAboutToClose();
 }
 
 Core::IVersionControl *VcsBasePlugin::versionControl() const
@@ -673,6 +674,26 @@ void VcsBasePlugin::createRepository()
     }
 }
 
+void VcsBasePlugin::setSubmitEditor(VcsBaseSubmitEditor *submitEditor)
+{
+    d->m_submitEditor = submitEditor;
+}
+
+VcsBaseSubmitEditor *VcsBasePlugin::submitEditor() const
+{
+    return d->m_submitEditor;
+}
+
+bool VcsBasePlugin::raiseSubmitEditor() const
+{
+    if (!d->m_submitEditor)
+        return false;
+    Core::EditorManager::activateEditor(
+                d->m_submitEditor,
+                Core::EditorManager::IgnoreNavigationHistory | Core::EditorManager::ModeSwitch);
+    return true;
+}
+
 // For internal tests: Create actions driving IVersionControl's snapshot interface.
 QList<QAction*> VcsBasePlugin::createSnapShotTestActions()
 {
diff --git a/src/plugins/vcsbase/vcsbaseplugin.h b/src/plugins/vcsbase/vcsbaseplugin.h
index ae018d9933afc6c17083a30528232a3b23076932..630f1d907a5f0dce82503de056c8b48f2c049e80 100644
--- a/src/plugins/vcsbase/vcsbaseplugin.h
+++ b/src/plugins/vcsbase/vcsbaseplugin.h
@@ -127,7 +127,7 @@ class VCSBASE_EXPORT VcsBasePlugin : public ExtensionSystem::IPlugin
     Q_OBJECT
 
 protected:
-    explicit VcsBasePlugin(const Core::Id submitEditorId);
+    explicit VcsBasePlugin();
 
     void initializeVcs(Core::IVersionControl *vc);
     virtual void extensionsInitialized();
@@ -207,10 +207,20 @@ public slots:
 protected:
     enum ActionState { NoVcsEnabled, OtherVcsEnabled, VcsEnabled };
 
+    // Sets the current submit editor for this specific version control plugin.
+    // The plugin automatically checks if the submit editor is closed and calls
+    // submitEditorAboutToClose().
+    // The method raiseSubmitEditor can be used to check for a running submit editor and raise it.
+    void setSubmitEditor(VcsBaseSubmitEditor *submitEditor);
+    // Current submit editor set through setSubmitEditor, if it wasn't closed inbetween
+    VcsBaseSubmitEditor *submitEditor() const;
+    // Tries to raise the submit editor set through setSubmitEditor. Returns true if that was found.
+    bool raiseSubmitEditor() const;
+
     // Implement to enable the plugin menu actions according to state.
     virtual void updateActions(ActionState as) = 0;
-    // Implement to start the submit process.
-    virtual bool submitEditorAboutToClose(VcsBaseSubmitEditor *submitEditor) = 0;
+    // Implement to start the submit process, use submitEditor() to get the submit editor instance.
+    virtual bool submitEditorAboutToClose() = 0;
 
     // A helper to enable the VCS menu action according to state:
     // NoVcsEnabled    -> visible, enabled if repository creation is supported
diff --git a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp
index 34c390200c58608d144912787db74c41a6dc2112..3383b72f3578b7c70b206e909eb047d828050d44 100644
--- a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp
+++ b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp
@@ -589,12 +589,12 @@ VcsBaseSubmitEditor::PromptSubmitResult
                                           const QString &checkFailureQuestion,
                                           bool *promptSetting,
                                           bool forcePrompt,
-                                          bool canCommitOnFailure) const
+                                          bool canCommitOnFailure)
 {
-    SubmitEditorWidget *submitWidget =
-            static_cast<SubmitEditorWidget *>(const_cast<VcsBaseSubmitEditor *>(this)->widget());
+    SubmitEditorWidget *submitWidget = static_cast<SubmitEditorWidget *>(this->widget());
 
-    raiseSubmitEditor();
+    Core::EditorManager::activateEditor(
+                this, Core::EditorManager::IgnoreNavigationHistory | Core::EditorManager::ModeSwitch);
 
     QString errorMessage;
     QMessageBox::StandardButton answer = QMessageBox::Yes;
@@ -814,23 +814,4 @@ void VcsBaseSubmitEditor::filterUntrackedFilesOfProject(const QString &repositor
     }
 }
 
-// Helper to raise an already open submit editor to prevent opening twice.
-bool VcsBaseSubmitEditor::raiseSubmitEditor()
-{
-    // Nothing to do?
-    if (Core::IEditor *ce = Core::EditorManager::currentEditor())
-        if (qobject_cast<VcsBaseSubmitEditor*>(ce))
-            return true;
-    // Try to activate a hidden one
-    Core::EditorManager *em = Core::EditorManager::instance();
-    foreach (Core::IEditor *e, em->openedEditors()) {
-        if (qobject_cast<VcsBaseSubmitEditor*>(e)) {
-            Core::EditorManager::activateEditor(e,
-                Core::EditorManager::IgnoreNavigationHistory | Core::EditorManager::ModeSwitch);
-            return true;
-        }
-    }
-    return false;
-}
-
 } // namespace VcsBase
diff --git a/src/plugins/vcsbase/vcsbasesubmiteditor.h b/src/plugins/vcsbase/vcsbasesubmiteditor.h
index 59d89a98994d2852a6991afcd8ce8d39a7a01b6a..a12e9e7c625fde049b40281b1b21ad89b654da3b 100644
--- a/src/plugins/vcsbase/vcsbasesubmiteditor.h
+++ b/src/plugins/vcsbase/vcsbasesubmiteditor.h
@@ -92,7 +92,7 @@ public:
                                     const QString &checkFailureQuestion,
                                     bool *promptSetting,
                                     bool forcePrompt = false,
-                                    bool canCommitOnFailure = true) const;
+                                    bool canCommitOnFailure = true);
 
     QAbstractItemView::SelectionMode fileListSelectionMode() const;
     void setFileListSelectionMode(QAbstractItemView::SelectionMode sm);
@@ -145,9 +145,6 @@ public:
     // that are actually part of the current project(s).
     static void filterUntrackedFilesOfProject(const QString &repositoryDirectory, QStringList *untrackedFiles);
 
-    // Helper to raise an already open submit editor to prevent opening twice.
-    static bool raiseSubmitEditor();
-
 signals:
     void diffSelectedFiles(const QStringList &files);
     void diffSelectedFiles(const QList<int> &rows);