diff --git a/src/plugins/cvs/cvsplugin.cpp b/src/plugins/cvs/cvsplugin.cpp
index 147c522ab5867ea06293a0c2edc33042f7cbc889..0c2e16d1ebf1a20721be75122a61c716ab2eb1ca 100644
--- a/src/plugins/cvs/cvsplugin.cpp
+++ b/src/plugins/cvs/cvsplugin.cpp
@@ -1075,6 +1075,7 @@ Core::IEditor * CVSPlugin::showOutputInEditor(const QString& title, const QStrin
         return 0;
     s.replace(QLatin1Char(' '), QLatin1Char('_'));
     e->setSuggestedFileName(s);
+    e->setForceReadOnly(true);
     if (!source.isEmpty())
         e->setSource(source);
     if (codec)
diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp
index 15e12d441f9c6e6fc3f3d7b95287b9296bf5d423..dd38c8c189ab90c8c97963497dd2d80aa53089cf 100644
--- a/src/plugins/git/gitclient.cpp
+++ b/src/plugins/git/gitclient.cpp
@@ -195,6 +195,7 @@ VCSBase::VCSBaseEditor
             rc->setCodec(VCSBase::VCSBaseEditor::getCodec(source));
     }
     m_core->editorManager()->activateEditor(outputEditor);
+    rc->setForceReadOnly(true);
     return rc;
 }
 
diff --git a/src/plugins/mercurial/mercurialclient.cpp b/src/plugins/mercurial/mercurialclient.cpp
index caf4f0bfc0a863b9a3714562975ee0360e753ee9..85eb7f4b43eea622650cd6cdee6e035a1e93097f 100644
--- a/src/plugins/mercurial/mercurialclient.cpp
+++ b/src/plugins/mercurial/mercurialclient.cpp
@@ -586,6 +586,7 @@ VCSBase::VCSBaseEditor *MercurialClient::createVCSEditor(const QString &kind, QS
     }
 
     core->editorManager()->activateEditor(outputEditor);
+    baseEditor->setForceReadOnly(true);
     return baseEditor;
 }
 
diff --git a/src/plugins/perforce/perforceplugin.cpp b/src/plugins/perforce/perforceplugin.cpp
index eef5f6827b15f48b4be6eeba19e1028338743e29..c9d01fde7bd109984cd91bfea20582a22b5f7e7c 100644
--- a/src/plugins/perforce/perforceplugin.cpp
+++ b/src/plugins/perforce/perforceplugin.cpp
@@ -1180,6 +1180,7 @@ Core::IEditor * PerforcePlugin::showOutputInEditor(const QString& title, const Q
     PerforceEditor *e = qobject_cast<PerforceEditor*>(editor->widget());
     if (!e)
         return 0;
+    e->setForceReadOnly(true);
     e->setSource(source);
     s.replace(QLatin1Char(' '), QLatin1Char('_'));
     e->setSuggestedFileName(s);
diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp
index a29483bd189843fe0701898aaaa19a6f148ea870..60173d28d061f6e26d6410a1349f30b25a621611 100644
--- a/src/plugins/subversion/subversionplugin.cpp
+++ b/src/plugins/subversion/subversionplugin.cpp
@@ -1120,6 +1120,7 @@ Core::IEditor * SubversionPlugin::showOutputInEditor(const QString& title, const
     SubversionEditor *e = qobject_cast<SubversionEditor*>(editor->widget());
     if (!e)
         return 0;
+    e->setForceReadOnly(true);
     s.replace(QLatin1Char(' '), QLatin1Char('_'));
     e->setSuggestedFileName(s);
     if (!source.isEmpty())
diff --git a/src/plugins/vcsbase/vcsbaseeditor.cpp b/src/plugins/vcsbase/vcsbaseeditor.cpp
index 67b3e80901bc4ff33952fdba91284d45d929e3bd..ad9745a6b70510b7dedcce74fa23bda3ed38b583 100644
--- a/src/plugins/vcsbase/vcsbaseeditor.cpp
+++ b/src/plugins/vcsbase/vcsbaseeditor.cpp
@@ -82,7 +82,8 @@ public:
     Core::IEditor *duplicate(QWidget * /*parent*/) { return 0; }
     QString id() const { return m_id; }
 
-    bool isTemporary() const { return true; }
+    bool isTemporary() const { return m_temporary; }
+    void setTemporary(bool t) { m_temporary = t; }
 
 signals:
     void describeRequested(const QString &source, const QString &change);
@@ -91,12 +92,14 @@ signals:
 private:
     QString m_id;
     QList<int> m_context;
+    bool m_temporary;
 };
 
 VCSBaseEditorEditable::VCSBaseEditorEditable(VCSBaseEditor *editor,
                                              const VCSBaseEditorParameters *type)  :
     BaseTextEditorEditable(editor),
-    m_id(type->id)
+    m_id(type->id),
+    m_temporary(false)
 {
     Core::UniqueIDManager *uidm = Core::UniqueIDManager::instance();
     m_context << uidm->uniqueIdentifier(QLatin1String(type->context))
@@ -118,8 +121,6 @@ public:
     virtual QWidget *toolBar()                { return m_toolBar; }
     QComboBox *diffFileBrowseComboBox() const  { return m_diffFileBrowseComboBox; }
 
-    bool isTemporary() const { return true; }
-
 private:
     QToolBar *m_toolBar;
     QComboBox *m_diffFileBrowseComboBox;
@@ -181,7 +182,6 @@ VCSBaseEditor::VCSBaseEditor(const VCSBaseEditorParameters *type, QWidget *paren
     if (VCSBase::Constants::Internal::debug)
         qDebug() << "VCSBaseEditor::VCSBaseEditor" << type->type << type->id;
 
-    setReadOnly(true);
     viewport()->setMouseTracking(true);
     setBaseTextDocument(new Internal::VCSBaseTextDocument);
     setMimeType(QLatin1String(d->m_parameters->mimeType));
@@ -212,6 +212,23 @@ VCSBaseEditor::~VCSBaseEditor()
     delete d;
 }
 
+void VCSBaseEditor::setForceReadOnly(bool b)
+{
+    Internal::VCSBaseTextDocument *vbd = qobject_cast<Internal::VCSBaseTextDocument*>(baseTextDocument());
+    VCSBaseEditorEditable *eda = qobject_cast<VCSBaseEditorEditable *>(editableInterface());
+    QTC_ASSERT(vbd != 0 && eda != 0, return);
+    setReadOnly(b);
+    vbd->setForceReadOnly(b);
+    eda->setTemporary(b);
+}
+
+bool VCSBaseEditor::isForceReadOnly() const
+{
+    const Internal::VCSBaseTextDocument *vbd = qobject_cast<const Internal::VCSBaseTextDocument*>(baseTextDocument());
+    QTC_ASSERT(vbd, return false);
+    return vbd->isForceReadOnly();
+}
+
 QString VCSBaseEditor::source() const
 {
     return d->m_source;
@@ -502,7 +519,9 @@ void VCSBaseEditor::mouseDoubleClickEvent(QMouseEvent *e)
 
 void VCSBaseEditor::keyPressEvent(QKeyEvent *e)
 {
-    if (e->key() == Qt::Key_Enter || e->key() == Qt::Key_Return) {
+    // Do not intercept return in editable patches.
+    if (d->m_parameters->type == DiffOutput && isReadOnly()
+        && (e->key() == Qt::Key_Enter || e->key() == Qt::Key_Return)) {
         jumpToChangeFromDiff(textCursor());
         return;
     }
diff --git a/src/plugins/vcsbase/vcsbaseeditor.h b/src/plugins/vcsbase/vcsbaseeditor.h
index c6062298bd37b668a086b480d77f4d36a51a1523..19aa82ab7af55a84c503268f19929d91ccd910be 100644
--- a/src/plugins/vcsbase/vcsbaseeditor.h
+++ b/src/plugins/vcsbase/vcsbaseeditor.h
@@ -105,6 +105,13 @@ public:
 
     virtual ~VCSBaseEditor();
 
+    /* Force read-only: Make it a read-only, temporary file.
+     * Should be set to true by version control views. It is not on
+     * by default since it should not  trigger when patches are opened as
+     * files. */
+    void setForceReadOnly(bool b);
+    bool isForceReadOnly() const;
+
     QString source() const;
     void setSource(const  QString &source);
 
diff --git a/src/plugins/vcsbase/vcsbasetextdocument.cpp b/src/plugins/vcsbase/vcsbasetextdocument.cpp
index 3a5590e145d375afb74d78dd7a10aad180e2c563..6a409b8fb38515f23e0b0ad86c9bf90582c6aef5 100644
--- a/src/plugins/vcsbase/vcsbasetextdocument.cpp
+++ b/src/plugins/vcsbase/vcsbasetextdocument.cpp
@@ -31,16 +31,31 @@
 
 using namespace VCSBase::Internal;
 
-VCSBaseTextDocument::VCSBaseTextDocument()
+VCSBaseTextDocument::VCSBaseTextDocument() :
+    m_forceReadOnly(false)
 {
 }
 
 bool VCSBaseTextDocument::isReadOnly() const
 {
-    return true;
+    return m_forceReadOnly ?
+            true :
+            TextEditor::BaseTextDocument::isReadOnly();
 }
 
 bool VCSBaseTextDocument::isModified() const
 {
-    return false;
+    return m_forceReadOnly ?
+            false :
+            TextEditor::BaseTextDocument::isModified();
+}
+
+void VCSBaseTextDocument::setForceReadOnly(bool b)
+{
+    m_forceReadOnly = b;
+}
+
+bool VCSBaseTextDocument::isForceReadOnly() const
+{
+    return m_forceReadOnly;
 }
diff --git a/src/plugins/vcsbase/vcsbasetextdocument.h b/src/plugins/vcsbase/vcsbasetextdocument.h
index f7bdd403f1ca5639abc31fccf264284136093be5..46845f080449e31d144b9ea96726e1993576daa6 100644
--- a/src/plugins/vcsbase/vcsbasetextdocument.h
+++ b/src/plugins/vcsbase/vcsbasetextdocument.h
@@ -44,6 +44,12 @@ public:
 
     bool isReadOnly() const;
     bool isModified() const;
+
+    void setForceReadOnly(bool b);
+    bool isForceReadOnly() const;
+
+private:
+    bool m_forceReadOnly;
 };
 
 } // namespace Internal