diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp
index 3eb7503ac8aed9dbf788b25c91a15524d8173dad..52f1a51195d5384fea48ec4a8ffb900bfb033a21 100644
--- a/src/plugins/coreplugin/editormanager/editormanager.cpp
+++ b/src/plugins/coreplugin/editormanager/editormanager.cpp
@@ -1201,6 +1201,8 @@ bool EditorManager::saveFile(IEditor *editor)
         return false;
 
     IFile *file = editor->file();
+    file->checkPermissions();
+
     const QString &fileName = file->fileName();
     if (!fileName.isEmpty() && file->isReadOnly()) {
         MakeWritableResult answer =
@@ -1270,6 +1272,7 @@ EditorManager::makeEditorWritable(IEditor *editor)
             QMessageBox::warning(m_d->m_core->mainWindow(), tr("Failed!"), tr("Could not open the file for edit with SCC."));
             return Failed;
         }
+        file->checkPermissions();
         return OpenedWithVersionControl;
     case RO_MakeWriteable: {
         const bool permsOk = QFile::setPermissions(fileName, QFile::permissions(fileName) | QFile::WriteUser);
@@ -1278,6 +1281,7 @@ EditorManager::makeEditorWritable(IEditor *editor)
             return Failed;
         }
     }
+        file->checkPermissions();
         return MadeWritable;
     case RO_SaveAs :
         return saveFileAs(editor) ? SavedAs : Failed;
diff --git a/src/plugins/coreplugin/ifile.h b/src/plugins/coreplugin/ifile.h
index 9dd658faf4e0ac436f43b941d65a143e4881f0e1..06179c16e5740c9b20e939f00838b8d27acda0ab 100644
--- a/src/plugins/coreplugin/ifile.h
+++ b/src/plugins/coreplugin/ifile.h
@@ -60,6 +60,8 @@ public:
 
     virtual void modified(ReloadBehavior *behavior) = 0;
 
+    virtual void checkPermissions() {}
+
 signals:
     void changed();
 };
diff --git a/src/plugins/texteditor/basetextdocument.cpp b/src/plugins/texteditor/basetextdocument.cpp
index 665dd5617aa72dcc61c2c067545eae7ce6f3947c..55b9e143792280d9aed4aea59c39486d7f3eb859 100644
--- a/src/plugins/texteditor/basetextdocument.cpp
+++ b/src/plugins/texteditor/basetextdocument.cpp
@@ -70,6 +70,7 @@ BaseTextDocument::BaseTextDocument()
 {
     m_documentMarker = new DocumentMarker(m_document);
     m_lineTerminatorMode = NativeLineTerminator;
+    m_fileIsReadOnly = false;
     m_isBinaryData = false;
     m_codec = QTextCodec::codecForLocale();
     m_hasDecodingError = false;
@@ -149,22 +150,34 @@ bool BaseTextDocument::isReadOnly() const
 
     const QFileInfo fi(m_fileName);
 
+    return m_fileIsReadOnly;
+
+}
+
+bool BaseTextDocument::isModified() const
+{
+    return m_document->isModified();
+}
+
+void BaseTextDocument::checkPermissions()
+{
+    if (!m_fileName.isEmpty()) {
+        const QFileInfo fi(m_fileName);
+
 #ifdef Q_OS_WIN
-    // Check for permissions on NTFS file systems
-    qt_ntfs_permission_lookup++;
+        // Check for permissions on NTFS file systems
+        qt_ntfs_permission_lookup++;
 #endif
 
-    const bool ro = !fi.isWritable();
+        m_fileIsReadOnly = !fi.isWritable();
 
 #ifdef Q_OS_WIN
-    qt_ntfs_permission_lookup--;
+        qt_ntfs_permission_lookup--;
 #endif
-    return ro;
-}
 
-bool BaseTextDocument::isModified() const
-{
-    return m_document->isModified();
+    } else {
+        m_fileIsReadOnly = false;
+    }
 }
 
 bool BaseTextDocument::open(const QString &fileName)
@@ -172,6 +185,7 @@ bool BaseTextDocument::open(const QString &fileName)
     QString title = tr("untitled");
     if (!fileName.isEmpty()) {
         const QFileInfo fi(fileName);
+        m_fileIsReadOnly = !fi.isWritable();
         m_fileName = fi.absoluteFilePath();
 
         QFile file(fileName);
diff --git a/src/plugins/texteditor/basetextdocument.h b/src/plugins/texteditor/basetextdocument.h
index a07528f11fa834979c3c6143ad82f267781a9b21..a8326514894c987766bc17272089e0abf780657e 100644
--- a/src/plugins/texteditor/basetextdocument.h
+++ b/src/plugins/texteditor/basetextdocument.h
@@ -83,6 +83,7 @@ public:
     virtual bool isReadOnly() const;
     virtual bool isModified() const;
     virtual bool isSaveAsAllowed() const { return true; }
+    virtual void checkPermissions();
     virtual void modified(Core::IFile::ReloadBehavior *behavior);
     virtual QString mimeType() const;
     void setMimeType(const QString &mt);
@@ -141,6 +142,7 @@ private:
     LineTerminatorMode m_lineTerminatorMode;
     QTextCodec *m_codec;
 
+    bool m_fileIsReadOnly;
     bool m_isBinaryData;
     bool m_hasDecodingError;
     QByteArray m_decodingErrorSample;
diff --git a/src/plugins/texteditor/basetexteditor.cpp b/src/plugins/texteditor/basetexteditor.cpp
index 0918c841548413fcf621e84439078b52d0f7db77..6a635c32dec01e3cf265f5dea00b462cc63b9dcf 100644
--- a/src/plugins/texteditor/basetexteditor.cpp
+++ b/src/plugins/texteditor/basetexteditor.cpp
@@ -1332,15 +1332,6 @@ void BaseTextEditorPrivate::setupDocumentSignals(BaseTextDocument *document)
     q->slotUpdateExtraAreaWidth();
 }
 
-#ifndef TEXTEDITOR_STANDALONE
-bool BaseTextEditorPrivate::needMakeWritableCheck() const
-{
-    return !m_document->isModified()
-            && !m_document->fileName().isEmpty()
-            && m_document->isReadOnly();
-}
-#endif
-
 bool Parenthesis::hasClosingCollapse(const Parentheses &parentheses)
 {
     return closeCollapseAtPos(parentheses) >= 0;
diff --git a/src/plugins/texteditor/basetexteditor_p.h b/src/plugins/texteditor/basetexteditor_p.h
index 80422f88a61c5030b15f6dcc25573928f545801b..86f43ff22d57cfe9f490a2761da238fb35d91518 100644
--- a/src/plugins/texteditor/basetexteditor_p.h
+++ b/src/plugins/texteditor/basetexteditor_p.h
@@ -142,9 +142,6 @@ public:
 #endif
     void setupDocumentSignals(BaseTextDocument *document);
     void updateLineSelectionColor();
-#ifndef TEXTEDITOR_STANDALONE
-    bool needMakeWritableCheck() const;
-#endif
 
     void print(QPrinter *printer);