diff --git a/src/plugins/autotoolsprojectmanager/autotoolsprojectfile.cpp b/src/plugins/autotoolsprojectmanager/autotoolsprojectfile.cpp
index f1d51367b36c06dcc737195b7682395af040caa4..052bab1d02ecd21406cd7f451cedf7d51e79ad10 100644
--- a/src/plugins/autotoolsprojectmanager/autotoolsprojectfile.cpp
+++ b/src/plugins/autotoolsprojectmanager/autotoolsprojectfile.cpp
@@ -38,9 +38,9 @@ using namespace AutotoolsProjectManager::Internal;
 
 AutotoolsProjectFile::AutotoolsProjectFile(AutotoolsProject *project, const QString &fileName) :
     Core::IDocument(project),
-    m_project(project),
-    m_fileName(fileName)
+    m_project(project)
 {
+    setFileName(fileName);
 }
 
 bool AutotoolsProjectFile::save(QString *errorString, const QString &fileName, bool autoSave)
@@ -52,11 +52,6 @@ bool AutotoolsProjectFile::save(QString *errorString, const QString &fileName, b
     return false;
 }
 
-QString AutotoolsProjectFile::fileName() const
-{
-    return m_fileName;
-}
-
 QString AutotoolsProjectFile::defaultPath() const
 {
     return QString();
@@ -90,8 +85,3 @@ bool AutotoolsProjectFile::reload(QString *errorString, ReloadFlag flag, ChangeT
 
     return false;
 }
-
-void AutotoolsProjectFile::rename(const QString &newName)
-{
-    Q_UNUSED(newName);
-}
diff --git a/src/plugins/autotoolsprojectmanager/autotoolsprojectfile.h b/src/plugins/autotoolsprojectmanager/autotoolsprojectfile.h
index 4c69c7472c6d2c052dbfc656fb61395f5f9d0507..74babf09624144269d7afaf09cb734d5f6b46aab 100644
--- a/src/plugins/autotoolsprojectmanager/autotoolsprojectfile.h
+++ b/src/plugins/autotoolsprojectmanager/autotoolsprojectfile.h
@@ -57,18 +57,15 @@ public:
     AutotoolsProjectFile(AutotoolsProject *project, const QString &fileName);
 
     bool save(QString *errorString, const QString &fileName, bool autoSave);
-    QString fileName() const;
     QString defaultPath() const;
     QString suggestedFileName() const;
     QString mimeType() const;
     bool isModified() const;
     bool isSaveAsAllowed() const;
     bool reload(QString *errorString, ReloadFlag flag, ChangeType type);
-    void rename(const QString &newName);
 
 private:
     AutotoolsProject *m_project;
-    QString m_fileName;
 };
 
 } // namespace Internal
diff --git a/src/plugins/bineditor/bineditorplugin.cpp b/src/plugins/bineditor/bineditorplugin.cpp
index 3998c3d2e3a523883682d318cc6f9e2d80f0440f..1d1d41132025e47535d0054b654949c5f6be828f 100644
--- a/src/plugins/bineditor/bineditorplugin.cpp
+++ b/src/plugins/bineditor/bineditorplugin.cpp
@@ -195,25 +195,22 @@ public:
         return QLatin1String(Constants::C_BINEDITOR_MIMETYPE);
     }
 
-    bool save(QString *errorString, const QString &fileName, bool autoSave)
+    bool save(QString *errorString, const QString &fn, bool autoSave)
     {
         QTC_ASSERT(!autoSave, return true); // bineditor does not support autosave - it would be a bit expensive
         const QString fileNameToUse
-            = fileName.isEmpty() ? m_fileName : fileName;
-        if (m_widget->save(errorString, m_fileName, fileNameToUse)) {
-            m_fileName = fileNameToUse;
-            m_widget->editor()->setDisplayName(QFileInfo(fileNameToUse).fileName());
-            emit changed();
+                = fn.isEmpty() ? fileName() : fn;
+        if (m_widget->save(errorString, fileName(), fileNameToUse)) {
+            setFileName(fileNameToUse);
             return true;
         } else {
             return false;
         }
     }
 
-    void rename(const QString &newName) {
-        m_fileName = newName;
-        m_widget->editor()->setDisplayName(QFileInfo(fileName()).fileName());
-        emit changed();
+    void setFileName(const QString &newName) {
+        m_widget->editor()->setDisplayName(QFileInfo(newName).fileName());
+        IDocument::setFileName(newName);
     }
 
     bool open(QString *errorString, const QString &fileName, quint64 offset = 0) {
@@ -231,9 +228,8 @@ public:
             return false;
         if (file.open(QIODevice::ReadOnly)) {
             file.close();
-            m_fileName = fileName;
+            setFileName(fileName);
             m_widget->setSizes(offset, file.size());
-            m_widget->editor()->setDisplayName(QFileInfo(fileName).fileName());
             return true;
         }
         QString errStr = tr("Cannot open %1: %2").arg(
@@ -248,9 +244,10 @@ public:
 private slots:
     void provideData(quint64 block)
     {
-        if (m_fileName.isEmpty())
+        const QString fn = fileName();
+        if (fn.isEmpty())
             return;
-        QFile file(m_fileName);
+        QFile file(fn);
         if (file.open(QIODevice::ReadOnly)) {
             int blockSize = m_widget->dataBlockSize();
             file.seek(block * blockSize);
@@ -263,23 +260,17 @@ private slots:
         } else {
             QMessageBox::critical(Core::ICore::mainWindow(), tr("File Error"),
                                   tr("Cannot open %1: %2").arg(
-                                        QDir::toNativeSeparators(m_fileName), file.errorString()));
+                                        QDir::toNativeSeparators(fn), file.errorString()));
         }
     }
 
     void provideNewRange(quint64 offset)
     {
-        open(0, m_fileName, offset);
+        open(0, fileName(), offset);
     }
 
 public:
 
-    void setFilename(const QString &filename) {
-        m_fileName = filename;
-    }
-
-    QString fileName() const { return m_fileName; }
-
     QString defaultPath() const { return QString(); }
 
     QString suggestedFileName() const { return QString(); }
@@ -287,9 +278,10 @@ public:
     bool isModified() const { return m_widget->isMemoryView() ? false : m_widget->isModified(); }
 
     bool isFileReadOnly() const {
-        if (m_widget->isMemoryView() || m_fileName.isEmpty())
+        const QString fn = fileName();
+        if (m_widget->isMemoryView() || fn.isEmpty())
             return false;
-        const QFileInfo fi(m_fileName);
+        const QFileInfo fi(fn);
         return !fi.isWritable();
     }
 
@@ -302,7 +294,7 @@ public:
             emit changed();
         } else {
             emit aboutToReload();
-            const bool success = open(errorString, m_fileName);
+            const bool success = open(errorString, fileName());
             emit reloadFinished(success);
             return success;
         }
@@ -311,7 +303,6 @@ public:
 
 private:
     BinEditorWidget *m_widget;
-    QString m_fileName;
 };
 
 class BinEditor : public Core::IEditor
@@ -358,7 +349,7 @@ public:
 
     bool createNew(const QString & /* contents */ = QString()) {
         m_widget->clear();
-        m_file->setFilename(QString());
+        m_file->setFileName(QString());
         return true;
     }
     bool open(QString *errorString, const QString &fileName, const QString &realFileName) {
diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
index 810371761bebd5f140422698e63429577a4b2c07..daa70d370826285d6f18e1e56322d970b76a311b 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
@@ -105,7 +105,7 @@ CMakeProject::CMakeProject(CMakeManager *manager, const QString &fileName)
     : m_manager(manager),
       m_activeTarget(0),
       m_fileName(fileName),
-      m_rootNode(new CMakeProjectNode(m_fileName)),
+      m_rootNode(new CMakeProjectNode(fileName)),
       m_lastEditor(0)
 {
     setProjectContext(Core::Context(CMakeProjectManager::Constants::PROJECTCONTEXT));
@@ -897,9 +897,9 @@ void CMakeProject::buildStateChanged(ProjectExplorer::Project *project)
 // CMakeFile
 
 CMakeFile::CMakeFile(CMakeProject *parent, QString fileName)
-    : Core::IDocument(parent), m_project(parent), m_fileName(fileName)
+    : Core::IDocument(parent), m_project(parent)
 {
-
+    setFileName(fileName);
 }
 
 bool CMakeFile::save(QString *errorString, const QString &fileName, bool autoSave)
@@ -912,11 +912,6 @@ bool CMakeFile::save(QString *errorString, const QString &fileName, bool autoSav
     return false;
 }
 
-QString CMakeFile::fileName() const
-{
-    return m_fileName;
-}
-
 QString CMakeFile::defaultPath() const
 {
     return QString();
@@ -943,13 +938,6 @@ bool CMakeFile::isSaveAsAllowed() const
     return false;
 }
 
-void CMakeFile::rename(const QString &newName)
-{
-    Q_ASSERT(false);
-    Q_UNUSED(newName);
-    // Can't happen....
-}
-
 Core::IDocument::ReloadBehavior CMakeFile::reloadBehavior(ChangeTrigger state, ChangeType type) const
 {
     Q_UNUSED(state)
diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.h b/src/plugins/cmakeprojectmanager/cmakeproject.h
index f19422dcfc7c340eeaa96ebc29d57427a3070722..543f3bdc8fbe7ced4a0e5cf368c2eb308264f524 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.h
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.h
@@ -204,7 +204,6 @@ public:
     CMakeFile(CMakeProject *parent, QString fileName);
 
     bool save(QString *errorString, const QString &fileName, bool autoSave);
-    QString fileName() const;
 
     QString defaultPath() const;
     QString suggestedFileName() const;
@@ -216,11 +215,8 @@ public:
     ReloadBehavior reloadBehavior(ChangeTrigger state, ChangeType type) const;
     bool reload(QString *errorString, ReloadFlag flag, ChangeType type);
 
-    void rename(const QString &newName);
-
 private:
     CMakeProject *m_project;
-    QString m_fileName;
 };
 
 class CMakeBuildSettingsWidget : public ProjectExplorer::NamedWidget
diff --git a/src/plugins/coreplugin/documentmanager.cpp b/src/plugins/coreplugin/documentmanager.cpp
index 4f10f5143013ab23dc916166283648ba84de4156..b53b1a6882b0db9356a06d2be333b1ed31a945ee 100644
--- a/src/plugins/coreplugin/documentmanager.cpp
+++ b/src/plugins/coreplugin/documentmanager.cpp
@@ -385,7 +385,7 @@ void DocumentManager::renamedFile(const QString &from, const QString &to)
     foreach (IDocument *document, documentsToRename) {
         d->m_blockedIDocument = document;
         removeFileInfo(document);
-        document->rename(to);
+        document->setFileName(to);
         addFileInfo(document);
         d->m_blockedIDocument = 0;
     }
diff --git a/src/plugins/coreplugin/idocument.cpp b/src/plugins/coreplugin/idocument.cpp
index 01ec58af3ec345505e530c5fc8cc0ae1e1db0f23..f737e2268149cc9c44f91698d258da57741f12b1 100644
--- a/src/plugins/coreplugin/idocument.cpp
+++ b/src/plugins/coreplugin/idocument.cpp
@@ -34,6 +34,13 @@
 #include <QFile>
 #include <QFileInfo>
 
+/*!
+    \fn QString Core::IDocument::fileName() const
+    Returns the absolute path of the file that this document refers to. May be empty for
+    non-file documents.
+    \sa setFileName()
+*/
+
 namespace Core {
 
 IDocument::IDocument(QObject *parent) : QObject(parent), m_infoBar(0), m_hasWriteWarning(false), m_restored(false)
@@ -110,4 +117,20 @@ InfoBar *IDocument::infoBar()
     return m_infoBar;
 }
 
+/*!
+    Set absolute file path for this file to \a fileName. Can be empty.
+    The default implementation sets the file name and sends fileNameChanged() and changed()
+    signals. Can be reimplemented by subclasses to do more.
+    \sa fileName()
+*/
+void IDocument::setFileName(const QString &fileName)
+{
+    if (m_fileName == fileName)
+        return;
+    QString oldName = m_fileName;
+    m_fileName = fileName;
+    emit fileNameChanged(oldName, m_fileName);
+    emit changed();
+}
+
 } // namespace Core
diff --git a/src/plugins/coreplugin/idocument.h b/src/plugins/coreplugin/idocument.h
index c543366316fc8f985ae53202330075df5535f7fc..36889a8ec9edf4c27c8f0c26a8b21d9d46f48362 100644
--- a/src/plugins/coreplugin/idocument.h
+++ b/src/plugins/coreplugin/idocument.h
@@ -82,7 +82,8 @@ public:
     virtual ~IDocument();
 
     virtual bool save(QString *errorString, const QString &fileName = QString(), bool autoSave = false) = 0;
-    virtual QString fileName() const = 0;
+    QString fileName() const { return m_fileName; }
+    virtual void setFileName(const QString &fileName);
     virtual bool isFileReadOnly() const;
 
     virtual QString defaultPath() const = 0;
@@ -95,7 +96,6 @@ public:
 
     virtual ReloadBehavior reloadBehavior(ChangeTrigger state, ChangeType type) const;
     virtual bool reload(QString *errorString, ReloadFlag flag, ChangeType type) = 0;
-    virtual void rename(const QString &newName) = 0;
 
     virtual void checkPermissions();
 
@@ -117,6 +117,7 @@ signals:
     void fileNameChanged(const QString &oldName, const QString &newName);
 
 private:
+    QString m_fileName;
     QString m_autoSaveName;
     InfoBar *m_infoBar;
     bool m_hasWriteWarning;
diff --git a/src/plugins/designer/formwindowfile.cpp b/src/plugins/designer/formwindowfile.cpp
index 1aa35fc472108aad2dd63f1e42d9a1fdebbb741f..dd4e7caf02d81ef02127654a817ba219968b047a 100644
--- a/src/plugins/designer/formwindowfile.cpp
+++ b/src/plugins/designer/formwindowfile.cpp
@@ -94,31 +94,21 @@ bool FormWindowFile::save(QString *errorString, const QString &name, bool autoSa
         return false;
     }
 
-    const QString oldFileName = m_fileName;
-    m_fileName = fi.absoluteFilePath();
     emit setDisplayName(fi.fileName());
     m_formWindow->setDirty(false);
-    emit fileNameChanged(oldFileName, m_fileName);
+    setFileName(fi.absoluteFilePath());
     emit changed();
     emit saved();
 
     return true;
 }
 
-void FormWindowFile::rename(const QString &newName)
+void FormWindowFile::setFileName(const QString &newName)
 {
     m_formWindow->setFileName(newName);
     QFileInfo fi(newName);
-    const QString oldFileName = m_fileName;
-    m_fileName = fi.absoluteFilePath();
     emit setDisplayName(fi.fileName());
-    emit fileNameChanged(oldFileName, m_fileName);
-    emit changed();
-}
-
-QString FormWindowFile::fileName() const
-{
-    return m_fileName;
+    IDocument::setFileName(fi.absoluteFilePath());
 }
 
 bool FormWindowFile::shouldAutoSave() const
@@ -144,7 +134,7 @@ bool FormWindowFile::reload(QString *errorString, ReloadFlag flag, ChangeType ty
         emit changed();
     } else {
         emit aboutToReload();
-        emit reload(errorString, m_fileName);
+        emit reload(errorString, fileName());
         const bool success = errorString->isEmpty();
         emit reloadFinished(success);
         return success;
@@ -157,12 +147,12 @@ QString FormWindowFile::defaultPath() const
     return QString();
 }
 
-void FormWindowFile::setSuggestedFileName(const QString &fileName)
+void FormWindowFile::setSuggestedFileName(const QString &fn)
 {
     if (Designer::Constants::Internal::debug)
-        qDebug() << Q_FUNC_INFO << m_fileName << fileName;
+        qDebug() << Q_FUNC_INFO << fileName() << fn;
 
-    m_suggestedName = fileName;
+    m_suggestedName = fn;
 }
 
 QString FormWindowFile::suggestedFileName() const
@@ -175,16 +165,11 @@ QString FormWindowFile::mimeType() const
     return m_mimeType;
 }
 
-bool FormWindowFile::writeFile(const QString &fileName, QString *errorString) const
+bool FormWindowFile::writeFile(const QString &fn, QString *errorString) const
 {
     if (Designer::Constants::Internal::debug)
-        qDebug() << Q_FUNC_INFO << m_fileName << fileName;
-    return write(fileName, format(), m_formWindow->contents(), errorString);
-}
-
-void FormWindowFile::setFileName(const QString &fname)
-{
-    m_fileName = fname;
+        qDebug() << Q_FUNC_INFO << fileName() << fn;
+    return write(fn, format(), m_formWindow->contents(), errorString);
 }
 
 QDesignerFormWindowInterface *FormWindowFile::formWindow() const
diff --git a/src/plugins/designer/formwindowfile.h b/src/plugins/designer/formwindowfile.h
index 9df02334b7494ac466e2563c1f142866f1a53096..3228a381bc3046b3fde6bada6eb07f659f67fb02 100644
--- a/src/plugins/designer/formwindowfile.h
+++ b/src/plugins/designer/formwindowfile.h
@@ -51,7 +51,6 @@ public:
 
     // IDocument
     virtual bool save(QString *errorString, const QString &fileName, bool autoSave);
-    virtual QString fileName() const;
     virtual bool shouldAutoSave() const;
     virtual bool isModified() const;
     virtual bool isSaveAsAllowed() const;
@@ -59,7 +58,6 @@ public:
     virtual QString defaultPath() const;
     virtual QString suggestedFileName() const;
     virtual QString mimeType() const;
-    virtual void rename(const QString &newName);
 
     // Internal
     void setSuggestedFileName(const QString &fileName);
@@ -84,7 +82,6 @@ private slots:
 private:
     const QString m_mimeType;
 
-    QString m_fileName;
     QString m_suggestedName;
     bool m_shouldAutoSave;
     // Might actually go out of scope before the IEditor due
diff --git a/src/plugins/diffeditor/diffeditorfile.cpp b/src/plugins/diffeditor/diffeditorfile.cpp
index ede0392bd294641b48abf7724c2568b99fab46b6..1825eea7756b0cb5681b098476ca91ad098b9eca 100644
--- a/src/plugins/diffeditor/diffeditorfile.cpp
+++ b/src/plugins/diffeditor/diffeditorfile.cpp
@@ -41,20 +41,6 @@ DiffEditorFile::DiffEditorFile(const QString &mimeType, QObject *parent) :
 {
 }
 
-void DiffEditorFile::rename(const QString &newName)
-{
-    Q_UNUSED(newName);
-    return;
-}
-
-void DiffEditorFile::setFileName(const QString &name)
-{
-    if (m_fileName == name)
-        return;
-    m_fileName = name;
-    emit changed();
-}
-
 void DiffEditorFile::setModified(bool modified)
 {
     if (m_modified == modified)
diff --git a/src/plugins/diffeditor/diffeditorfile.h b/src/plugins/diffeditor/diffeditorfile.h
index 4a45fb4aa5c84dc78563b1062f4822b75b037ec4..081253e6f9ec2faa3a37dd7331df2163769902eb 100644
--- a/src/plugins/diffeditor/diffeditorfile.h
+++ b/src/plugins/diffeditor/diffeditorfile.h
@@ -48,7 +48,6 @@ public:
     explicit DiffEditorFile(const QString &mimeType,
                               QObject *parent = 0);
 
-    QString fileName() const { return m_fileName; }
     QString defaultPath() const { return QString(); }
     QString suggestedFileName() const { return QString(); }
 
@@ -58,9 +57,7 @@ public:
     bool save(QString *errorString, const QString &fileName, bool autoSave);
     ReloadBehavior reloadBehavior(ChangeTrigger state, ChangeType type) const;
     bool reload(QString *errorString, ReloadFlag flag, ChangeType type);
-    void rename(const QString &newName);
 
-    void setFileName(const QString &name);
     void setModified(bool modified = true);
 
 signals:
@@ -69,7 +66,6 @@ signals:
 private:
     const QString m_mimeType;
     bool m_modified;
-    QString m_fileName;
 };
 
 } // namespace Internal
diff --git a/src/plugins/genericprojectmanager/genericproject.cpp b/src/plugins/genericprojectmanager/genericproject.cpp
index afa10b6b59cdc0ccd171b6cb8b15a6517815ec27..2f36899ba7160ca7c33c23cfffc02d22316a42b9 100644
--- a/src/plugins/genericprojectmanager/genericproject.cpp
+++ b/src/plugins/genericprojectmanager/genericproject.cpp
@@ -455,18 +455,14 @@ bool GenericProject::fromMap(const QVariantMap &map)
 GenericProjectFile::GenericProjectFile(GenericProject *parent, QString fileName, GenericProject::RefreshOptions options)
     : IDocument(parent),
       m_project(parent),
-      m_fileName(fileName),
       m_options(options)
-{ }
-
-bool GenericProjectFile::save(QString *, const QString &, bool)
 {
-    return false;
+    setFileName(fileName);
 }
 
-QString GenericProjectFile::fileName() const
+bool GenericProjectFile::save(QString *, const QString &, bool)
 {
-    return m_fileName;
+    return false;
 }
 
 QString GenericProjectFile::defaultPath() const
@@ -494,13 +490,6 @@ bool GenericProjectFile::isSaveAsAllowed() const
     return false;
 }
 
-void GenericProjectFile::rename(const QString &newName)
-{
-    // Can't happen
-    Q_UNUSED(newName);
-    QTC_CHECK(false);
-}
-
 IDocument::ReloadBehavior GenericProjectFile::reloadBehavior(ChangeTrigger state, ChangeType type) const
 {
     Q_UNUSED(state)
diff --git a/src/plugins/genericprojectmanager/genericproject.h b/src/plugins/genericprojectmanager/genericproject.h
index 917a69482f0ab9dd9dd7b8e2f60d5419d84d7fae..f4f2fb54573a0834355d515d06430e4d2e8b4061 100644
--- a/src/plugins/genericprojectmanager/genericproject.h
+++ b/src/plugins/genericprojectmanager/genericproject.h
@@ -128,7 +128,6 @@ public:
     GenericProjectFile(GenericProject *parent, QString fileName, GenericProject::RefreshOptions options);
 
     bool save(QString *errorString, const QString &fileName, bool autoSave);
-    QString fileName() const;
 
     QString defaultPath() const;
     QString suggestedFileName() const;
@@ -136,14 +135,12 @@ public:
 
     bool isModified() const;
     bool isSaveAsAllowed() const;
-    void rename(const QString &newName);
 
     ReloadBehavior reloadBehavior(ChangeTrigger state, ChangeType type) const;
     bool reload(QString *errorString, ReloadFlag flag, ChangeType type);
 
 private:
     GenericProject *m_project;
-    QString m_fileName;
     GenericProject::RefreshOptions m_options;
 };
 
diff --git a/src/plugins/imageviewer/imageviewerfile.cpp b/src/plugins/imageviewer/imageviewerfile.cpp
index 0f3850f8961fe38fcee43b0e30c5eda930a76933..36da85b7f7a1ea40f475a12a2b9ffbd9e7ef3707 100644
--- a/src/plugins/imageviewer/imageviewerfile.cpp
+++ b/src/plugins/imageviewer/imageviewerfile.cpp
@@ -61,7 +61,7 @@ bool ImageViewerFile::reload(QString *errorString,
         emit changed();
         return true;
     }
-    return m_editor->open(errorString, m_fileName, m_fileName);
+    return m_editor->open(errorString, fileName(), fileName());
 }
 
 bool ImageViewerFile::save(QString *errorString, const QString &fileName, bool autoSave)
@@ -72,18 +72,10 @@ bool ImageViewerFile::save(QString *errorString, const QString &fileName, bool a
     return false;
 }
 
-void ImageViewerFile::rename(const QString &newName)
+void ImageViewerFile::setFileName(const QString &newName)
 {
-    const QString oldFilename = m_fileName;
-    m_fileName = newName;
-    m_editor->setDisplayName(QFileInfo(m_fileName).fileName());
-    emit fileNameChanged(oldFilename, newName);
-    emit changed();
-}
-
-QString ImageViewerFile::fileName() const
-{
-    return m_fileName;
+    m_editor->setDisplayName(QFileInfo(newName).fileName());
+    IDocument::setFileName(newName);
 }
 
 QString ImageViewerFile::defaultPath() const
@@ -117,11 +109,5 @@ void ImageViewerFile::setMimetype(const QString &mimetype)
     emit changed();
 }
 
-void ImageViewerFile::setFileName(const QString &filename)
-{
-    m_fileName = filename;
-    emit changed();
-}
-
 } // namespace Internal
 } // namespace ImageViewer
diff --git a/src/plugins/imageviewer/imageviewerfile.h b/src/plugins/imageviewer/imageviewerfile.h
index ab913de68aea990f4c3d3b0e7108d6f0ed0845a3..bc2c254d29eda0d352e50d1aeddfa6cb42175e2c 100644
--- a/src/plugins/imageviewer/imageviewerfile.h
+++ b/src/plugins/imageviewer/imageviewerfile.h
@@ -46,8 +46,7 @@ public:
     explicit ImageViewerFile(ImageViewer *parent = 0);
 
     bool save(QString *errorString, const QString &fileName, bool autoSave);
-    void rename(const QString &newName);
-    QString fileName() const;
+    void setFileName(const QString &newName);
 
     QString defaultPath() const;
     QString suggestedFileName() const;
@@ -60,10 +59,8 @@ public:
     bool reload(QString *errorString, ReloadFlag flag, ChangeType type);
 
     void setMimetype(const QString &mimetype);
-    void setFileName(const QString &filename);
 
 private:
-    QString m_fileName;
     QString m_mimeType;
     ImageViewer *m_editor;
 };
diff --git a/src/plugins/madde/maemoglobal.h b/src/plugins/madde/maemoglobal.h
index 61a2fed058f408d8160d1ed359b25dbbbccb215e..33cdf9ad6a756af53f21520d67cbcd26c109bb7a 100644
--- a/src/plugins/madde/maemoglobal.h
+++ b/src/plugins/madde/maemoglobal.h
@@ -56,10 +56,12 @@ class WatchableFile : public Core::IDocument
     Q_OBJECT
 public:
     WatchableFile(const QString &fileName, QObject *parent = 0)
-        : Core::IDocument(parent), m_fileName(fileName) {}
+        : Core::IDocument(parent)
+    {
+        setFileName(fileName);
+    }
 
     bool save(QString *, const QString &, bool) { return false; }
-    QString fileName() const { return m_fileName; }
     QString defaultPath() const { return QString(); }
     QString suggestedFileName() const { return QString(); }
     QString mimeType() const { return QLatin1String("text/plain"); }
@@ -67,13 +69,9 @@ public:
     bool isSaveAsAllowed() const { return false; }
     ReloadBehavior reloadBehavior(ChangeTrigger, ChangeType) const { return BehaviorSilent; }
     bool reload(QString *, ReloadFlag, ChangeType) { emit modified(); return true; }
-    void rename(const QString &) {}
 
 signals:
     void modified();
-
-private:
-    QString m_fileName;
 };
 
 class MaemoGlobal
diff --git a/src/plugins/qbsprojectmanager/qbsprojectfile.cpp b/src/plugins/qbsprojectmanager/qbsprojectfile.cpp
index 14ea3b3e961b851e065db0bdcca73aad0e15568b..aa9aad6c64a0e21079ae45e2581ca247fe9ffa29 100644
--- a/src/plugins/qbsprojectmanager/qbsprojectfile.cpp
+++ b/src/plugins/qbsprojectmanager/qbsprojectfile.cpp
@@ -36,9 +36,10 @@ namespace QbsProjectManager {
 namespace Internal {
 
 QbsProjectFile::QbsProjectFile(QbsProject *parent, QString fileName) : Core::IDocument(parent),
-    m_project(parent),
-    m_fileName(fileName)
-{ }
+    m_project(parent)
+{
+    setFileName(fileName);
+}
 
 QbsProjectFile::~QbsProjectFile()
 { }
@@ -48,11 +49,6 @@ bool QbsProjectFile::save(QString *, const QString &, bool)
     return false;
 }
 
-QString QbsProjectFile::fileName() const
-{
-    return m_fileName;
-}
-
 bool QbsProjectFile::isReadOnly() const
 {
     return true;
@@ -100,13 +96,6 @@ bool QbsProjectFile::reload(QString *errorString, ReloadFlag flag, ChangeType ty
     return true;
 }
 
-void QbsProjectFile::rename(const QString &newName)
-{
-    // Can't happen
-    Q_UNUSED(newName);
-    Q_ASSERT(false);
-}
-
 } // namespace Internal
 } // namespace QbsProjectManager
 
diff --git a/src/plugins/qbsprojectmanager/qbsprojectfile.h b/src/plugins/qbsprojectmanager/qbsprojectfile.h
index bc45062b3cdc5bf3794cf4844431475d0822004b..6eea01516848e6c7e1e43dac00eb3bb58ac98a7e 100644
--- a/src/plugins/qbsprojectmanager/qbsprojectfile.h
+++ b/src/plugins/qbsprojectmanager/qbsprojectfile.h
@@ -46,7 +46,6 @@ public:
     ~QbsProjectFile();
 
     bool save(QString *errorString, const QString &fileName, bool autoSave);
-    QString fileName() const;
     bool isReadOnly() const;
 
     QString defaultPath() const;
@@ -58,11 +57,9 @@ public:
 
     ReloadBehavior reloadBehavior(ChangeTrigger state, ChangeType type) const;
     bool reload(QString *errorString, ReloadFlag flag, ChangeType type);
-    void rename(const QString &newName);
 
 private:
     QbsProject *m_project;
-    QString m_fileName;
 };
 
 } // namespace Internal
diff --git a/src/plugins/qmlprojectmanager/qmlprojectfile.cpp b/src/plugins/qmlprojectmanager/qmlprojectfile.cpp
index 93ca0ccac8cf00af2a83ffea2c5b7d1734b97caa..c85ddddbb45cc08b746891422959a8735b5804e5 100644
--- a/src/plugins/qmlprojectmanager/qmlprojectfile.cpp
+++ b/src/plugins/qmlprojectmanager/qmlprojectfile.cpp
@@ -37,11 +37,11 @@ namespace Internal {
 
 QmlProjectFile::QmlProjectFile(QmlProject *parent, QString fileName)
     : Core::IDocument(parent),
-      m_project(parent),
-      m_fileName(fileName)
+      m_project(parent)
 {
     QTC_CHECK(m_project);
     QTC_CHECK(!fileName.isEmpty());
+    setFileName(fileName);
 }
 
 QmlProjectFile::~QmlProjectFile()
@@ -53,18 +53,6 @@ bool QmlProjectFile::save(QString *, const QString &, bool)
     return false;
 }
 
-void QmlProjectFile::rename(const QString &newName)
-{
-    // Can't happen...
-    Q_UNUSED(newName);
-    Q_ASSERT(false);
-}
-
-QString QmlProjectFile::fileName() const
-{
-    return m_fileName;
-}
-
 QString QmlProjectFile::defaultPath() const
 {
     return QString();
diff --git a/src/plugins/qmlprojectmanager/qmlprojectfile.h b/src/plugins/qmlprojectmanager/qmlprojectfile.h
index 36c5a3c7e445dd0b18739655661e34267b702b34..842d9f52971e97d82cb366b5d9b4f4e0252ace9e 100644
--- a/src/plugins/qmlprojectmanager/qmlprojectfile.h
+++ b/src/plugins/qmlprojectmanager/qmlprojectfile.h
@@ -47,8 +47,6 @@ public:
     virtual ~QmlProjectFile();
 
     virtual bool save(QString *errorString, const QString &fileName, bool autoSave);
-    virtual QString fileName() const;
-    virtual void rename(const QString &newName);
 
     virtual QString defaultPath() const;
     virtual QString suggestedFileName() const;
@@ -62,7 +60,6 @@ public:
 
 private:
     QmlProject *m_project;
-    QString m_fileName;
 };
 
 } // namespace Internal
diff --git a/src/plugins/qnx/bardescriptordocument.cpp b/src/plugins/qnx/bardescriptordocument.cpp
index 7b78bf77486779212724d1b0d47eeb368e320a65..6ba4da0566342bb4d4870cbd3c08299efef727b4 100644
--- a/src/plugins/qnx/bardescriptordocument.cpp
+++ b/src/plugins/qnx/bardescriptordocument.cpp
@@ -94,8 +94,7 @@ bool BarDescriptorDocument::open(QString *errorString, const QString &fileName)
     if (read(fileName, &contents, errorString) != Utils::TextFileFormat::ReadSuccess)
         return false;
 
-    m_fileName = fileName;
-    m_editorWidget->editor()->setDisplayName(QFileInfo(fileName).fileName());
+    setFileName(fileName);
 
     bool result = loadContent(contents);
 
@@ -105,12 +104,12 @@ bool BarDescriptorDocument::open(QString *errorString, const QString &fileName)
     return result;
 }
 
-bool BarDescriptorDocument::save(QString *errorString, const QString &fileName, bool autoSave)
+bool BarDescriptorDocument::save(QString *errorString, const QString &fn, bool autoSave)
 {
     QTC_ASSERT(!autoSave, return false);
-    QTC_ASSERT(fileName.isEmpty(), return false);
+    QTC_ASSERT(fn.isEmpty(), return false);
 
-    bool result = write(m_fileName, xmlSource(), errorString);
+    bool result = write(fileName(), xmlSource(), errorString);
     if (!result)
         return false;
 
@@ -119,11 +118,6 @@ bool BarDescriptorDocument::save(QString *errorString, const QString &fileName,
     return true;
 }
 
-QString BarDescriptorDocument::fileName() const
-{
-    return m_fileName;
-}
-
 QString BarDescriptorDocument::defaultPath() const
 {
     QFileInfo fi(fileName());
@@ -172,16 +166,13 @@ bool BarDescriptorDocument::reload(QString *errorString, Core::IDocument::Reload
     if (flag == Core::IDocument::FlagIgnore)
         return true;
 
-    return open(errorString, m_fileName);
+    return open(errorString, fileName());
 }
 
-void BarDescriptorDocument::rename(const QString &newName)
+void BarDescriptorDocument::setFileName(const QString &newName)
 {
-    const QString oldFilename = m_fileName;
-    m_fileName = newName;
-    m_editorWidget->editor()->setDisplayName(QFileInfo(m_fileName).fileName());
-    emit fileNameChanged(oldFilename, newName);
-    emit changed();
+    m_editorWidget->editor()->setDisplayName(QFileInfo(newName).fileName());
+    IDocument::setFileName(newName);
 }
 
 QString BarDescriptorDocument::xmlSource() const
diff --git a/src/plugins/qnx/bardescriptordocument.h b/src/plugins/qnx/bardescriptordocument.h
index 1f271801b798516c6f20a41f3e369333e929632e..b8fb3a0d08e24db3c0507b6934d7b2ac363187c2 100644
--- a/src/plugins/qnx/bardescriptordocument.h
+++ b/src/plugins/qnx/bardescriptordocument.h
@@ -58,7 +58,6 @@ public:
 
     bool open(QString *errorString, const QString &fileName);
     bool save(QString *errorString, const QString &fileName = QString(), bool autoSave = false);
-    QString fileName() const;
 
     QString defaultPath() const;
     QString suggestedFileName() const;
@@ -70,7 +69,7 @@ public:
 
     ReloadBehavior reloadBehavior(ChangeTrigger state, ChangeType type) const;
     bool reload(QString *errorString, ReloadFlag flag, ChangeType type);
-    void rename(const QString &newName);
+    void setFileName(const QString &newName);
 
     QString xmlSource() const;
     bool loadContent(const QString &xmlSource, QString *errorMessage = 0, int *errorLine = 0);
@@ -82,8 +81,6 @@ private:
 
     QList<BarDescriptorDocumentAbstractNodeHandler *> m_nodeHandlers;
 
-    QString m_fileName;
-
     BarDescriptorEditorWidget *m_editorWidget;
 };
 
diff --git a/src/plugins/qt4projectmanager/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp
index b66cb033e3ce7ace59af8c24af4f8b8db1eed2ff..e8beaceb8da894c1da42394b9360161737da46c6 100644
--- a/src/plugins/qt4projectmanager/qt4nodes.cpp
+++ b/src/plugins/qt4projectmanager/qt4nodes.cpp
@@ -173,7 +173,7 @@ using namespace Qt4ProjectManager::Internal;
 Qt4PriFile::Qt4PriFile(Qt4ProjectManager::Qt4PriFileNode *qt4PriFile)
     : IDocument(qt4PriFile), m_priFile(qt4PriFile)
 {
-
+    setFileName(m_priFile->path());
 }
 
 bool Qt4PriFile::save(QString *errorString, const QString &fileName, bool autoSave)
@@ -184,18 +184,6 @@ bool Qt4PriFile::save(QString *errorString, const QString &fileName, bool autoSa
     return false;
 }
 
-void Qt4PriFile::rename(const QString &newName)
-{
-    // Can't happen
-    Q_ASSERT(false);
-    Q_UNUSED(newName);
-}
-
-QString Qt4PriFile::fileName() const
-{
-    return m_priFile->path();
-}
-
 QString Qt4PriFile::defaultPath() const
 {
     return QString();
diff --git a/src/plugins/qt4projectmanager/qt4nodes.h b/src/plugins/qt4projectmanager/qt4nodes.h
index b2e4967861f59c03f6cc32bca985dc77b8405d0b..e8828c5edcc04b3ea3dcbd41603ec9734e0ba71d 100644
--- a/src/plugins/qt4projectmanager/qt4nodes.h
+++ b/src/plugins/qt4projectmanager/qt4nodes.h
@@ -227,8 +227,6 @@ class Qt4PriFile : public Core::IDocument
 public:
     Qt4PriFile(Qt4PriFileNode *qt4PriFile);
     virtual bool save(QString *errorString, const QString &fileName, bool autoSave);
-    virtual QString fileName() const;
-    virtual void rename(const QString &newName);
 
     virtual QString defaultPath() const;
     virtual QString suggestedFileName() const;
diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp
index 8922ad874ae9a338c026131157d69ec50f72844f..bb5c147d04787835032917005e116a8ce8e3c7f9 100644
--- a/src/plugins/qt4projectmanager/qt4project.cpp
+++ b/src/plugins/qt4projectmanager/qt4project.cpp
@@ -120,8 +120,6 @@ public:
     Qt4ProjectFile(const QString &filePath, QObject *parent = 0);
 
     bool save(QString *errorString, const QString &fileName, bool autoSave);
-    QString fileName() const;
-    virtual void rename(const QString &newName);
 
     QString defaultPath() const;
     QString suggestedFileName() const;
@@ -135,7 +133,6 @@ public:
 
 private:
     const QString m_mimeType;
-    QString m_filePath;
 };
 
 /// Watches folders for Qt4PriFile nodes
@@ -270,9 +267,9 @@ void ProjectFilesVisitor::visitFolderNode(FolderNode *folderNode)
 namespace Internal {
 Qt4ProjectFile::Qt4ProjectFile(const QString &filePath, QObject *parent)
     : Core::IDocument(parent),
-      m_mimeType(QLatin1String(Qt4ProjectManager::Constants::PROFILE_MIMETYPE)),
-      m_filePath(filePath)
+      m_mimeType(QLatin1String(Qt4ProjectManager::Constants::PROFILE_MIMETYPE))
 {
+    setFileName(filePath);
 }
 
 bool Qt4ProjectFile::save(QString *, const QString &, bool)
@@ -281,18 +278,6 @@ bool Qt4ProjectFile::save(QString *, const QString &, bool)
     return false;
 }
 
-void Qt4ProjectFile::rename(const QString &newName)
-{
-    // Can't happen
-    Q_UNUSED(newName);
-    Q_ASSERT(false);
-}
-
-QString Qt4ProjectFile::fileName() const
-{
-    return m_filePath;
-}
-
 QString Qt4ProjectFile::defaultPath() const
 {
     return QString();
diff --git a/src/plugins/resourceeditor/resourceeditorw.cpp b/src/plugins/resourceeditor/resourceeditorw.cpp
index 1b49ad1e3ca3b08a30facdd783fc7a4202372a97..f7442cb7b9fb454d150d98efeb4f7a42599814ed 100644
--- a/src/plugins/resourceeditor/resourceeditorw.cpp
+++ b/src/plugins/resourceeditor/resourceeditorw.cpp
@@ -65,6 +65,7 @@ ResourceEditorDocument::ResourceEditorDocument(ResourceEditorW *parent) :
     m_mimeType(QLatin1String(ResourceEditor::Constants::C_RESOURCE_MIMETYPE)),
     m_parent(parent)
 {
+    setFileName(parent->m_resourceEditor->fileName());
     if (debugResourceEditorW)
         qDebug() <<  "ResourceEditorFile::ResourceEditorFile()";
 }
@@ -142,7 +143,7 @@ bool ResourceEditorW::createNew(const QString &contents)
         return false;
 
     const bool rc = m_resourceEditor->load(saver.fileName());
-    m_resourceEditor->setFileName(QString());
+    m_resourceDocument->setFileName(QString());
     m_shouldAutoSave = false;
     if (debugResourceEditorW)
         qDebug() <<  "ResourceEditorW::createNew: " << contents << " (" << saver.fileName() << ") returns " << rc;
@@ -168,9 +169,8 @@ bool ResourceEditorW::open(QString *errorString, const QString &fileName, const
         return false;
     }
 
-    m_resourceEditor->setFileName(fileName);
+    m_resourceDocument->setFileName(fileName);
     m_resourceEditor->setDirty(fileName != realFileName);
-    setDisplayName(fi.fileName());
     m_shouldAutoSave = false;
     m_diskIo = false;
 
@@ -205,19 +205,22 @@ bool ResourceEditorDocument::save(QString *errorString, const QString &name, boo
         return true;
     }
 
-    m_parent->setDisplayName(QFileInfo(actualName).fileName());
+    setFileName(actualName);
     m_parent->m_diskIo = false;
 
     emit changed();
     return true;
 }
 
-void ResourceEditorDocument::rename(const QString &newName)
+void ResourceEditorDocument::setFileName(const QString &newName)
 {
-    const QString oldName = m_parent->m_resourceEditor->fileName();
-    m_parent->m_resourceEditor->setFileName(newName);
-    emit fileNameChanged(oldName, newName); // TODO Are there other cases where the ressource file name changes?
-    emit changed();
+    if (newName != m_parent->m_resourceEditor->fileName())
+        m_parent->m_resourceEditor->setFileName(newName);
+    if (newName.isEmpty())
+        m_parent->setDisplayName(m_parent->tr("untitled"));
+    else
+        m_parent->setDisplayName(QFileInfo(newName).fileName());
+    IDocument::setFileName(newName);
 }
 
 Core::Id ResourceEditorW::id() const
@@ -230,11 +233,6 @@ QWidget *ResourceEditorW::toolBar()
     return m_toolBar;
 }
 
-QString ResourceEditorDocument::fileName() const
-{
-    return m_parent->m_resourceEditor->fileName();
-}
-
 bool ResourceEditorDocument::shouldAutoSave() const
 {
     return m_parent->m_shouldAutoSave;
@@ -258,7 +256,7 @@ bool ResourceEditorDocument::reload(QString *errorString, ReloadFlag flag, Chang
         emit changed();
     } else {
         emit aboutToReload();
-        QString fn = m_parent->m_resourceEditor->fileName();
+        QString fn = fileName();
         const bool success = m_parent->open(errorString, fn, fn);
         emit reloadFinished(success);
         return success;
diff --git a/src/plugins/resourceeditor/resourceeditorw.h b/src/plugins/resourceeditor/resourceeditorw.h
index 22d71f69c88bdc352d6809dde5e71431dac85923..ef174ed5c7de1057a20055b2d89510483275baa6 100644
--- a/src/plugins/resourceeditor/resourceeditorw.h
+++ b/src/plugins/resourceeditor/resourceeditorw.h
@@ -55,15 +55,14 @@ public:
 
     //IDocument
     bool save(QString *errorString, const QString &fileName, bool autoSave);
-    QString fileName() const;
     bool shouldAutoSave() const;
     bool isModified() const;
     bool isSaveAsAllowed() const;
     bool reload(QString *errorString, ReloadFlag flag, ChangeType type);
     QString defaultPath() const;
     QString suggestedFileName() const;
-    virtual QString mimeType() const;
-    virtual void rename(const QString &newName);
+    QString mimeType() const;
+    void setFileName(const QString &newName);
 
 private:
     const QString m_mimeType;
diff --git a/src/plugins/tasklist/taskfile.cpp b/src/plugins/tasklist/taskfile.cpp
index cd0aaeaf14a43f83a181c43265eca24c1f1b41d0..f329d3b980e9247c639519f1e2e7f069ccd651a0 100644
--- a/src/plugins/tasklist/taskfile.cpp
+++ b/src/plugins/tasklist/taskfile.cpp
@@ -53,11 +53,6 @@ bool TaskFile::save(QString *errorString, const QString &fileName, bool autoSave
     return false;
 }
 
-QString TaskFile::fileName() const
-{
-    return m_fileName;
-}
-
 QString TaskFile::defaultPath() const
 {
     return QString();
@@ -100,18 +95,13 @@ bool TaskFile::reload(QString *errorString, ReloadFlag flag, ChangeType type)
         deleteLater();
         return true;
     }
-    return open(errorString, m_fileName);
-}
-
-void TaskFile::rename(const QString &newName)
-{
-    Q_UNUSED(newName);
+    return open(errorString, fileName());
 }
 
 bool TaskFile::open(QString *errorString, const QString &fileName)
 {
-    m_fileName = fileName;
-    return TaskList::TaskListPlugin::instance()->loadFile(errorString, m_context, m_fileName);
+    setFileName(fileName);
+    return TaskList::TaskListPlugin::instance()->loadFile(errorString, m_context, fileName);
 }
 
 ProjectExplorer::Project *TaskFile::context() const
diff --git a/src/plugins/tasklist/taskfile.h b/src/plugins/tasklist/taskfile.h
index a0f917531dc3c81413ac931f77f42d65cce2e9f2..268d607feec8d57f3c373cf33a57e797c4af5861 100644
--- a/src/plugins/tasklist/taskfile.h
+++ b/src/plugins/tasklist/taskfile.h
@@ -46,7 +46,6 @@ public:
     ~TaskFile();
 
     bool save(QString *errorString, const QString &fileName, bool autoSave);
-    QString fileName() const;
 
     QString defaultPath() const;
     QString suggestedFileName() const;
@@ -57,7 +56,6 @@ public:
 
     ReloadBehavior reloadBehavior(ChangeTrigger state, ChangeType type) const;
     bool reload(QString *errorString, ReloadFlag flag, ChangeType type);
-    void rename(const QString &newName);
 
     bool open(QString *errorString, const QString &fileName);
 
@@ -65,7 +63,6 @@ public:
     void setContext(ProjectExplorer::Project *context);
 
 private:
-    QString m_fileName;
     ProjectExplorer::Project *m_context;
 };
 
diff --git a/src/plugins/texteditor/basetextdocument.cpp b/src/plugins/texteditor/basetextdocument.cpp
index 64fb4359302aa571e5509e6cfe6206d630746169..ee85d15753c480238ae833725f34c39feddc70d3 100644
--- a/src/plugins/texteditor/basetextdocument.cpp
+++ b/src/plugins/texteditor/basetextdocument.cpp
@@ -57,7 +57,6 @@ class BaseTextDocumentPrivate
 public:
     explicit BaseTextDocumentPrivate(BaseTextDocument *q);
 
-    QString m_fileName;
     QString m_defaultPath;
     QString m_suggestedFileName;
     QString m_mimeType;
@@ -159,11 +158,6 @@ const ExtraEncodingSettings &BaseTextDocument::extraEncodingSettings() const
     return d->m_extraEncodingSettings;
 }
 
-QString BaseTextDocument::fileName() const
-{
-    return d->m_fileName;
-}
-
 bool BaseTextDocument::isSaveAsAllowed() const
 {
     return true;
@@ -214,7 +208,7 @@ ITextMarkable *BaseTextDocument::documentMarker() const
  * If autosave is true, the cursor will be restored and some signals suppressed
  * and we do not clean up the text file (cleanWhitespace(), ensureFinalNewLine()).
  */
-bool BaseTextDocument::save(QString *errorString, const QString &fileName, bool autoSave)
+bool BaseTextDocument::save(QString *errorString, const QString &saveFileName, bool autoSave)
 {
     QTextCursor cursor(d->m_document);
 
@@ -252,9 +246,9 @@ bool BaseTextDocument::save(QString *errorString, const QString &fileName, bool
         cursor.endEditBlock();
       }
 
-    QString fName = d->m_fileName;
-    if (!fileName.isEmpty())
-        fName = fileName;
+    QString fName = fileName();
+    if (!saveFileName.isEmpty())
+        fName = saveFileName;
 
     // check if UTF8-BOM has to be added or removed
     Utils::TextFileFormat saveFormat = format();
@@ -294,11 +288,8 @@ bool BaseTextDocument::save(QString *errorString, const QString &fileName, bool
 
     // inform about the new filename
     const QFileInfo fi(fName);
-    const QString oldFileName = d->m_fileName;
-    d->m_fileName = QDir::cleanPath(fi.absoluteFilePath());
     d->m_document->setModified(false);
-    emit fileNameChanged(oldFileName, d->m_fileName);
-    emit titleChanged(fi.fileName());
+    setFileName(QDir::cleanPath(fi.absoluteFilePath()));
     emit changed();
     return true;
 }
@@ -308,19 +299,18 @@ bool BaseTextDocument::shouldAutoSave() const
     return d->m_autoSaveRevision != d->m_document->revision();
 }
 
-void BaseTextDocument::rename(const QString &newName)
+void BaseTextDocument::setFileName(const QString &newName)
 {
+    if (newName == fileName())
+        return;
     const QFileInfo fi(newName);
-    const QString oldFileName = d->m_fileName;
-    d->m_fileName = QDir::cleanPath(fi.absoluteFilePath());
-    emit fileNameChanged(oldFileName, d->m_fileName);
+    IDocument::setFileName(QDir::cleanPath(fi.absoluteFilePath()));
     emit titleChanged(fi.fileName());
-    emit changed();
 }
 
 bool BaseTextDocument::isFileReadOnly() const
 {
-    if (d->m_fileName.isEmpty()) //have no corresponding file, so editing is ok
+    if (fileName().isEmpty()) //have no corresponding file, so editing is ok
         return false;
     return d->m_fileIsReadOnly;
 }
@@ -333,8 +323,8 @@ bool BaseTextDocument::isModified() const
 void BaseTextDocument::checkPermissions()
 {
     bool previousReadOnly = d->m_fileIsReadOnly;
-    if (!d->m_fileName.isEmpty()) {
-        const QFileInfo fi(d->m_fileName);
+    if (!fileName().isEmpty()) {
+        const QFileInfo fi(fileName());
         d->m_fileIsReadOnly = !fi.isWritable();
     } else {
         d->m_fileIsReadOnly = false;
@@ -353,9 +343,6 @@ bool BaseTextDocument::open(QString *errorString, const QString &fileName, const
     if (!fileName.isEmpty()) {
         const QFileInfo fi(fileName);
         d->m_fileIsReadOnly = !fi.isWritable();
-        d->m_fileName = QDir::cleanPath(fi.absoluteFilePath());
-
-        title = fi.fileName();
         readResult = read(realFileName, &content, errorString);
 
         d->m_document->setModified(false);
@@ -388,8 +375,7 @@ bool BaseTextDocument::open(QString *errorString, const QString &fileName, const
         QTC_ASSERT(documentLayout, return true);
         documentLayout->lastSaveRevision = d->m_autoSaveRevision = d->m_document->revision();
         d->m_document->setModified(fileName != realFileName);
-        emit titleChanged(title);
-        emit changed();
+        setFileName(QDir::cleanPath(fi.absoluteFilePath()));
     }
     return readResult == Utils::TextFileFormat::ReadSuccess
            || readResult == Utils::TextFileFormat::ReadEncodingError;
@@ -411,7 +397,7 @@ bool BaseTextDocument::reload(QString *errorString)
     if (documentLayout)
         marks = documentLayout->documentClosing(); // removes text marks non-permanently
 
-    bool success = open(errorString, d->m_fileName, d->m_fileName);
+    bool success = open(errorString, fileName(), fileName());
 
     if (documentLayout)
         documentLayout->documentReloaded(marks); // readds text marks
diff --git a/src/plugins/texteditor/basetextdocument.h b/src/plugins/texteditor/basetextdocument.h
index 3e9e90688b76dd2b40dcf97e4685c7295df3b8f2..5f374dc2f0172238b9078dbe0546d7e6c62aefba 100644
--- a/src/plugins/texteditor/basetextdocument.h
+++ b/src/plugins/texteditor/basetextdocument.h
@@ -76,7 +76,6 @@ public:
 
     // IDocument implementation.
     virtual bool save(QString *errorString, const QString &fileName, bool autoSave);
-    virtual QString fileName() const;
     virtual bool shouldAutoSave() const;
     virtual bool isFileReadOnly() const;
     virtual bool isModified() const;
@@ -85,7 +84,7 @@ public:
     bool reload(QString *errorString, ReloadFlag flag, ChangeType type);
     virtual QString mimeType() const;
     void setMimeType(const QString &mt);
-    virtual void rename(const QString &newName);
+    void setFileName(const QString &newName);
 
     virtual QString defaultPath() const;
     virtual QString suggestedFileName() const;
diff --git a/src/plugins/vcsbase/submiteditorfile.cpp b/src/plugins/vcsbase/submiteditorfile.cpp
index c07e604c1be200a4086017b09f41d68be471383b..f4f43966d0ef2899aeaf5e8b585db4d7fcbae3db 100644
--- a/src/plugins/vcsbase/submiteditorfile.cpp
+++ b/src/plugins/vcsbase/submiteditorfile.cpp
@@ -46,21 +46,6 @@ SubmitEditorFile::SubmitEditorFile(const QString &mimeType, QObject *parent) :
 {
 }
 
-void SubmitEditorFile::rename(const QString &newName)
-{
-    Q_UNUSED(newName);
-    // We can't be renamed
-    return;
-}
-
-void SubmitEditorFile::setFileName(const QString &name)
-{
-    if (m_fileName == name)
-        return;
-    m_fileName = name;
-    emit changed();
-}
-
 void SubmitEditorFile::setModified(bool modified)
 {
     if (m_modified == modified)
diff --git a/src/plugins/vcsbase/submiteditorfile.h b/src/plugins/vcsbase/submiteditorfile.h
index 51887946a1364fa93a0106f72de8c594bfab8dce..ae0b0ab80ddf64174e5a3b77020877b3a6acab55 100644
--- a/src/plugins/vcsbase/submiteditorfile.h
+++ b/src/plugins/vcsbase/submiteditorfile.h
@@ -42,7 +42,6 @@ public:
     explicit SubmitEditorFile(const QString &mimeType,
                               QObject *parent = 0);
 
-    QString fileName() const { return m_fileName; }
     QString defaultPath() const { return QString(); }
     QString suggestedFileName() const { return QString(); }
 
@@ -52,9 +51,7 @@ public:
     bool save(QString *errorString, const QString &fileName, bool autoSave);
     ReloadBehavior reloadBehavior(ChangeTrigger state, ChangeType type) const;
     bool reload(QString *errorString, ReloadFlag flag, ChangeType type);
-    void rename(const QString &newName);
 
-    void setFileName(const QString &name);
     void setModified(bool modified = true);
 
 signals:
@@ -63,7 +60,6 @@ signals:
 private:
     const QString m_mimeType;
     bool m_modified;
-    QString m_fileName;
 };