diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp
index 7b01f88626de53dbab4069c6c6d8f50ba404ee07..27116010458d47e957ab64a1f88fc46437ba4ec4 100644
--- a/src/plugins/coreplugin/editormanager/editormanager.cpp
+++ b/src/plugins/coreplugin/editormanager/editormanager.cpp
@@ -698,9 +698,9 @@ bool EditorManager::closeEditors(const QList<IEditor*> editorsToClose, bool askA
         if (cancelled)
             return false;
         if (!list.isEmpty()) {
+            closingFailed = true;
             QSet<IEditor*> skipSet = editorsForFiles(list).toSet();
             acceptedEditors = acceptedEditors.toSet().subtract(skipSet).toList();
-            closingFailed = false;
         }
     }
     if (acceptedEditors.isEmpty())
@@ -1203,23 +1203,35 @@ bool EditorManager::saveFile(IEditor *editor)
     file->checkPermissions();
 
     const QString &fileName = file->fileName();
-    if (!fileName.isEmpty() && file->isReadOnly()) {
+
+    if (fileName.isEmpty())
+        return saveFileAs(editor);
+
+    bool success = false;
+
+    // try saving, no matter what isReadOnly tells us
+    m_d->m_core->fileManager()->blockFileChange(file);
+    success = file->save(fileName);
+    m_d->m_core->fileManager()->unblockFileChange(file);
+
+    if (!success) {
         MakeWritableResult answer =
                 makeEditorWritable(editor);
         if (answer == Failed)
             return false;
         if (answer == SavedAs)
             return true;
-    }
 
-    if (file->isReadOnly() || fileName.isEmpty())
-        return saveFileAs(editor);
+        file->checkPermissions();
+
+        m_d->m_core->fileManager()->blockFileChange(file);
+        success = file->save(fileName);
+        m_d->m_core->fileManager()->unblockFileChange(file);
+    }
 
-    m_d->m_core->fileManager()->blockFileChange(file);
-    const bool success = file->save(fileName);
-    m_d->m_core->fileManager()->unblockFileChange(file);
     if (success)
         m_d->m_core->fileManager()->addToRecentFiles(editor->file()->fileName());
+
     return success;
 }
 
@@ -1241,7 +1253,7 @@ EditorManager::ReadOnlyAction
 
     QPushButton *saveAsButton = 0;
     if (displaySaveAsButton)
-        msgBox.addButton(QObject::tr("Save as ..."), QMessageBox::ActionRole);
+        saveAsButton = msgBox.addButton(QObject::tr("Save as ..."), QMessageBox::ActionRole);
 
     msgBox.setDefaultButton(sccButton ? sccButton : makeWritableButton);
     msgBox.exec();
@@ -1310,6 +1322,7 @@ bool EditorManager::saveFileAs(IEditor *editor)
     m_d->m_core->fileManager()->blockFileChange(editor->file());
     const bool success = editor->file()->save(absoluteFilePath);
     m_d->m_core->fileManager()->unblockFileChange(editor->file());
+    editor->file()->checkPermissions();
 
     if (success)
         m_d->m_core->fileManager()->addToRecentFiles(editor->file()->fileName());
diff --git a/src/plugins/coreplugin/filemanager.cpp b/src/plugins/coreplugin/filemanager.cpp
index b42611b2217c28fd829ee6de8dbc4b95949b84f3..a851fa792dfbd7e1a5c8fab378676d7ff941b2d7 100644
--- a/src/plugins/coreplugin/filemanager.cpp
+++ b/src/plugins/coreplugin/filemanager.cpp
@@ -394,6 +394,7 @@ QList<IFile *> FileManager::saveModifiedFiles(const QList<IFile *> &files,
                 if (!fileName.isEmpty()) {
                     blockFileChange(file);
                     ok = file->save(fileName);
+                    file->checkPermissions();
                     unblockFileChange(file);
                 }
                 if (!ok)
diff --git a/src/plugins/coreplugin/mainwindow.cpp b/src/plugins/coreplugin/mainwindow.cpp
index 3c552a83aae494b90966a4287b9df67f6a92839d..3ddf4fc75c2aaa5e841c5d4b4fef8a1a5b3b6bf0 100644
--- a/src/plugins/coreplugin/mainwindow.cpp
+++ b/src/plugins/coreplugin/mainwindow.cpp
@@ -354,8 +354,8 @@ void MainWindow::closeEvent(QCloseEvent *event)
 
     // Save opened files
     bool cancelled;
-    fileManager()->saveModifiedFiles(fileManager()->modifiedFiles(), &cancelled);
-    if (cancelled) {
+    QList<IFile*> notSaved = fileManager()->saveModifiedFiles(fileManager()->modifiedFiles(), &cancelled);
+    if (cancelled || !notSaved.isEmpty()) {
         event->ignore();
         return;
     }
diff --git a/src/plugins/texteditor/basetextdocument.cpp b/src/plugins/texteditor/basetextdocument.cpp
index 55b9e143792280d9aed4aea59c39486d7f3eb859..17141e8cc3de4c11c9bb2090bf8e22459fcd7c56 100644
--- a/src/plugins/texteditor/basetextdocument.cpp
+++ b/src/plugins/texteditor/basetextdocument.cpp
@@ -163,18 +163,7 @@ 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++;
-#endif
-
         m_fileIsReadOnly = !fi.isWritable();
-
-#ifdef Q_OS_WIN
-        qt_ntfs_permission_lookup--;
-#endif
-
     } else {
         m_fileIsReadOnly = false;
     }