diff --git a/src/libs/utils/submiteditorwidget.cpp b/src/libs/utils/submiteditorwidget.cpp
index db559a2c102dc67db0018d343aaccc6b20b32a4b..687813c197b68508cd4b6a070e75817c38e46e80 100644
--- a/src/libs/utils/submiteditorwidget.cpp
+++ b/src/libs/utils/submiteditorwidget.cpp
@@ -230,17 +230,34 @@ void SubmitEditorWidget::unregisterActions(QAction *editorUndoAction,  QAction *
     }
 }
 
-QString SubmitEditorWidget::trimmedDescriptionText() const
+// Make sure we have one terminating NL
+static inline QString trimMessageText(const QString &t)
 {
-    // Make sure we have one terminating NL
-    QString text = descriptionText().trimmed();
-    text += QLatin1Char('\n');
-    return text;
+    QString rc = t.trimmed();
+    rc += QLatin1Char('\n');
+    return rc;
+}
+
+// Extract the wrapped text from a text edit, which performs
+// the wrapping only optically.
+static QString wrappedText(const QTextEdit *e)
+{
+    const QChar newLine = QLatin1Char('\n');
+    QString rc;
+    QTextCursor cursor(e->document());
+    cursor.movePosition(QTextCursor::Start);    
+    while (!cursor.atEnd()) {
+        cursor.select(QTextCursor::LineUnderCursor);
+        rc += cursor.selectedText();
+        rc += newLine;
+        cursor.movePosition(QTextCursor::Right);
+    }
+    return rc;
 }
 
 QString SubmitEditorWidget::descriptionText() const
 {
-    QString rc = 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 SubmitEditorWidgetPrivate::FieldEntry &fe, m_d->m_fieldEntries) {
         const QString fieldText = fe.second->text().trimmed();
diff --git a/src/libs/utils/submiteditorwidget.h b/src/libs/utils/submiteditorwidget.h
index 98094adfcc7180ba6b4545d83dcc0c15b7ea76df..9ed5ecfb115d01d7a3f8b409a29749b11ca20c16 100644
--- a/src/libs/utils/submiteditorwidget.h
+++ b/src/libs/utils/submiteditorwidget.h
@@ -87,8 +87,6 @@ public:
 
     QString descriptionText() const;
     void setDescriptionText(const QString &text);
-    // Should be used to normalize newlines.
-    QString trimmedDescriptionText() const;
 
     int fileNameColumn() const;
     void setFileNameColumn(int c);
diff --git a/src/plugins/perforce/perforcesubmiteditor.cpp b/src/plugins/perforce/perforcesubmiteditor.cpp
index 98a9a511acbfc783787da57b77a9a0c207abefbf..dd3b53d4af328e07394181165b95cb256be9f7c8 100644
--- a/src/plugins/perforce/perforcesubmiteditor.cpp
+++ b/src/plugins/perforce/perforcesubmiteditor.cpp
@@ -152,7 +152,7 @@ void PerforceSubmitEditor::updateEntries()
     const QString newLine = QString(QLatin1Char('\n'));
     const QString tab = QString(QLatin1Char('\t'));
 
-    QStringList lines = submitEditorWidget()->trimmedDescriptionText().split(newLine);
+    QStringList lines = submitEditorWidget()->descriptionText().split(newLine);
     while (lines.last().isEmpty())
         lines.removeLast();
     // Description
diff --git a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp
index 555e7576a61f9538c0c0792ddfe8e7747a723782..e696f46b126e17ac92758783f677aeedf86b17d2 100644
--- a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp
+++ b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp
@@ -391,7 +391,7 @@ bool VCSBaseSubmitEditor::save(const QString &fileName)
 
 QString VCSBaseSubmitEditor::fileContents() const
 {
-    return m_d->m_widget->trimmedDescriptionText();
+    return m_d->m_widget->descriptionText();
 }
 
 bool VCSBaseSubmitEditor::setFileContents(const QString &contents)