diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp
index a3bce5276fee7f00a8c0461d91310c83187fbfe7..de7ada34f0d2c6a1468f71de6c0d250e24541ac0 100644
--- a/src/plugins/coreplugin/editormanager/editormanager.cpp
+++ b/src/plugins/coreplugin/editormanager/editormanager.cpp
@@ -768,7 +768,7 @@ bool EditorManager::closeEditors(const QList<IEditor*> &editorsToClose, bool ask
         foreach (ICoreListener *listener, listeners) {
             if (!listener->editorAboutToClose(editor)) {
                 editorAccepted = false;
-                closingFailed = false;
+                closingFailed = true;
                 break;
             }
         }
@@ -802,7 +802,8 @@ bool EditorManager::closeEditors(const QList<IEditor*> &editorsToClose, bool ask
     // remove the editors
     foreach (IEditor *editor, acceptedEditors) {
         emit editorAboutToClose(editor);
-        if (!editor->file()->fileName().isEmpty()) {
+        if (!editor->file()->fileName().isEmpty()
+                && !editor->isTemporary()) {
             QByteArray state = editor->saveState();
             if (!state.isEmpty())
                 m_d->m_editorStates.insert(editor->file()->fileName(), QVariant(state));
diff --git a/src/plugins/coreplugin/editormanager/editorview.cpp b/src/plugins/coreplugin/editormanager/editorview.cpp
index ea165c02a833c4cf8102213448dfa5c037fb700a..75db54bcdef217cd6affcfc35bbaeb9370073ec7 100644
--- a/src/plugins/coreplugin/editormanager/editorview.cpp
+++ b/src/plugins/coreplugin/editormanager/editorview.cpp
@@ -803,14 +803,26 @@ QByteArray SplitterOrView::saveState() const
         IEditor* e = editor();
         EditorManager *em = CoreImpl::instance()->editorManager();
 
-        if (e && e == em->currentEditor()) {
+        // don't save state of temporary or ad-hoc editors
+        if (e && (e->isTemporary() || e->file()->fileName().isEmpty())) {
+            // look for another editor that is more suited
+            e = 0;
+            foreach (IEditor *otherEditor, editors()) {
+                if (!otherEditor->isTemporary() && !otherEditor->file()->fileName().isEmpty()) {
+                    e = otherEditor;
+                    break;
+                }
+            }
+        }
+
+        if (!e) {
+            stream << QByteArray("empty");
+        } else if (e == em->currentEditor()) {
             stream << QByteArray("currenteditor")
                     << e->file()->fileName() << e->id() << e->saveState();
-        } else if (e) {
+        } else {
             stream << QByteArray("editor")
                     << e->file()->fileName() << e->id() << e->saveState();
-        } else {
-            stream << QByteArray("empty");
         }
     }
     return bytes;