diff --git a/src/libs/utils/submiteditorwidget.cpp b/src/libs/utils/submiteditorwidget.cpp
index 10cade5c2e199f5adc962a735e81fc037d61328e..3b5c88b2b1dc698e2bde2a2aa64766ddccb081a1 100644
--- a/src/libs/utils/submiteditorwidget.cpp
+++ b/src/libs/utils/submiteditorwidget.cpp
@@ -172,6 +172,8 @@ SubmitEditorWidget::SubmitEditorWidget(QWidget *parent) :
     m_d->m_ui.description->setWordWrapMode(QTextOption::WordWrap);
     connect(m_d->m_ui.description, SIGNAL(customContextMenuRequested(QPoint)),
             this, SLOT(editorCustomContextMenuRequested(QPoint)));
+    connect(m_d->m_ui.description, SIGNAL(textChanged()),
+            this, SLOT(updateSubmitAction()));
 
     // File List
     m_d->m_ui.fileView->setContextMenuPolicy(Qt::CustomContextMenu);
@@ -291,11 +293,12 @@ static QString wrappedText(const QTextEdit *e)
 
 QString SubmitEditorWidget::descriptionText() const
 {
-    QString rc = trimMessageText(lineWrap() ? wrappedText(m_d->m_ui.description) : m_d->m_ui.description->toPlainText());
+    QString rc = trimMessageText(lineWrap() ? wrappedText(m_d->m_ui.description) :
+                                              m_d->m_ui.description->toPlainText());
     // append field entries
     foreach(const SubmitFieldWidget *fw, m_d->m_fieldWidgets)
         rc += fw->fieldValues();
-    return rc;
+    return cleanupDescription(rc);
 }
 
 void SubmitEditorWidget::setDescriptionText(const QString &text)
@@ -495,6 +498,11 @@ unsigned SubmitEditorWidget::checkedFilesCount() const
     return checkedCount;
 }
 
+QString SubmitEditorWidget::cleanupDescription(const QString &input) const
+{
+    return input;
+}
+
 void SubmitEditorWidget::changeEvent(QEvent *e)
 {
     QWidget::changeEvent(e);
diff --git a/src/libs/utils/submiteditorwidget.h b/src/libs/utils/submiteditorwidget.h
index c5bee5e357c32545d2f557b2b4c2f8d867963230..a02b024091b4b5c3d23db66ef348ab313ae8ca8e 100644
--- a/src/libs/utils/submiteditorwidget.h
+++ b/src/libs/utils/submiteditorwidget.h
@@ -139,6 +139,7 @@ public slots:
     void uncheckAll();
 
 protected:
+    virtual QString cleanupDescription(const QString &) const;
     virtual void changeEvent(QEvent *e);
     void insertTopWidget(QWidget *w);
 
diff --git a/src/plugins/git/gitsubmiteditor.cpp b/src/plugins/git/gitsubmiteditor.cpp
index 8452142e7e4dbb2da2b57cc087ad8becc29e2ec5..f624f977c1f4bc871d018f8c41f729dec47f875c 100644
--- a/src/plugins/git/gitsubmiteditor.cpp
+++ b/src/plugins/git/gitsubmiteditor.cpp
@@ -120,25 +120,6 @@ void GitSubmitEditor::slotDiffSelected(const QStringList &files)
         emit diff(unstagedFiles, stagedFiles);
 }
 
-QString GitSubmitEditor::fileContents() const
-{
-    // We need to manually purge out comment lines starting with
-    // hash '#' since git does not do that when using -F.
-    const QChar newLine = QLatin1Char('\n');
-    const QChar hash = QLatin1Char('#');
-    QString message = VCSBase::VCSBaseSubmitEditor::fileContents();
-    for (int pos = 0; pos < message.size(); ) {
-        const int newLinePos = message.indexOf(newLine, pos);
-        const int startOfNextLine = newLinePos == -1 ? message.size() : newLinePos + 1;
-        if (message.at(pos) == hash) {
-            message.remove(pos, startOfNextLine - pos);
-        } else {
-            pos = startOfNextLine;
-        }
-    }
-    return message;
-}
-
 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 cf867a3c8e7fb912e37b7519c4d46eea4ae90a83..5f196a982bff316b915eb08527bec837e6ae9b57 100644
--- a/src/plugins/git/gitsubmiteditor.h
+++ b/src/plugins/git/gitsubmiteditor.h
@@ -54,8 +54,6 @@ public:
     void setCommitData(const CommitData &);
     GitSubmitEditorPanelData panelData() const;
 
-    virtual QString fileContents() const;
-
 signals:
     void diff(const QStringList &unstagedFiles, const QStringList &stagedFiles);
 
diff --git a/src/plugins/git/gitsubmiteditorwidget.cpp b/src/plugins/git/gitsubmiteditorwidget.cpp
index 25e1a66693a0a15bd952c08c1d34ee2a14bba3f6..2fad91460ce1d2118da0346a6d4a5428fb6e0433 100644
--- a/src/plugins/git/gitsubmiteditorwidget.cpp
+++ b/src/plugins/git/gitsubmiteditorwidget.cpp
@@ -151,12 +151,35 @@ void GitSubmitEditorWidget::setPanelData(const GitSubmitEditorPanelData &data)
 
 bool GitSubmitEditorWidget::canSubmit() const
 {
+    QString message = cleanupDescription(descriptionText()).trimmed();
+
     if (m_gitSubmitPanelUi.invalidAuthorLabel->isVisible()
-        || m_gitSubmitPanelUi.invalidEmailLabel->isVisible())
+        || m_gitSubmitPanelUi.invalidEmailLabel->isVisible()
+        || message.isEmpty())
         return false;
     return SubmitEditorWidget::canSubmit();
 }
 
+QString GitSubmitEditorWidget::cleanupDescription(const QString &input) const
+{
+    // We need to manually purge out comment lines starting with
+    // hash '#' since git does not do that when using -F.
+    const QChar newLine = QLatin1Char('\n');
+    const QChar hash = QLatin1Char('#');
+    QString message = input;
+    for (int pos = 0; pos < message.size(); ) {
+        const int newLinePos = message.indexOf(newLine, pos);
+        const int startOfNextLine = newLinePos == -1 ? message.size() : newLinePos + 1;
+        if (message.at(pos) == hash) {
+            message.remove(pos, startOfNextLine - pos);
+        } else {
+            pos = startOfNextLine;
+        }
+    }
+    return message;
+
+}
+
 void GitSubmitEditorWidget::authorInformationChanged()
 {
     bool bothEmpty = m_gitSubmitPanelUi.authorLineEdit->text().isEmpty() &&
diff --git a/src/plugins/git/gitsubmiteditorwidget.h b/src/plugins/git/gitsubmiteditorwidget.h
index 64e4c5aac3c90d3e1937d84adcdc3833082ac6dc..16de5f3a480249753931212043ccb3f9af4dd6df 100644
--- a/src/plugins/git/gitsubmiteditorwidget.h
+++ b/src/plugins/git/gitsubmiteditorwidget.h
@@ -67,6 +67,7 @@ public:
 
 protected:
     bool canSubmit() const;
+    QString cleanupDescription(const QString &) const;
 
 private slots:
     void authorInformationChanged();