diff --git a/src/plugins/analyzerbase/analyzerutils.cpp b/src/plugins/analyzerbase/analyzerutils.cpp
index ac75620a81f16fa36752ccc5c4bab35e8d5ba2b8..2872b23353cd8d2fa5dec5d6a5c1daab19eb4ec3 100644
--- a/src/plugins/analyzerbase/analyzerutils.cpp
+++ b/src/plugins/analyzerbase/analyzerutils.cpp
@@ -74,7 +74,7 @@ CPlusPlus::Symbol *AnalyzerUtils::findSymbolUnderCursor()
     widget->convertPosition(pos, &line, &column);
 
     const CPlusPlus::Snapshot &snapshot = CppTools::CppModelManager::instance()->snapshot();
-    CPlusPlus::Document::Ptr doc = snapshot.document(widget->textDocument()->filePath());
+    CPlusPlus::Document::Ptr doc = snapshot.document(widget->textDocument()->filePath().toString());
     QTC_ASSERT(doc, return 0);
 
     // fetch the expression's code
diff --git a/src/plugins/android/androidmanifestdocument.cpp b/src/plugins/android/androidmanifestdocument.cpp
index ea12428ca009f6a8e76ae7c31cbd7b6e5cd52786..cf7cfee3a99f769e7e005a56c0d03e3db67645b0 100644
--- a/src/plugins/android/androidmanifestdocument.cpp
+++ b/src/plugins/android/androidmanifestdocument.cpp
@@ -56,14 +56,12 @@ bool AndroidManifestDocument::save(QString *errorString, const QString &fileName
 
 QString AndroidManifestDocument::defaultPath() const
 {
-    QFileInfo fi(filePath());
-    return fi.absolutePath();
+    return filePath().toFileInfo().absolutePath();
 }
 
 QString AndroidManifestDocument::suggestedFileName() const
 {
-    QFileInfo fi(filePath());
-    return fi.fileName();
+    return filePath().toFileInfo().fileName();
 }
 
 bool AndroidManifestDocument::isModified() const
diff --git a/src/plugins/android/androidmanifesteditorwidget.cpp b/src/plugins/android/androidmanifesteditorwidget.cpp
index f02ae1d413b68174de96846af05def6f079c4581..f1b51507d2eb615366f968e557a70800d7acefab 100644
--- a/src/plugins/android/androidmanifesteditorwidget.cpp
+++ b/src/plugins/android/androidmanifesteditorwidget.cpp
@@ -476,7 +476,7 @@ bool AndroidManifestEditorWidget::eventFilter(QObject *obj, QEvent *event)
 
 void AndroidManifestEditorWidget::updateTargetComboBox()
 {
-    const QString docPath(m_textEditorWidget->textDocument()->filePath());
+    const QString docPath(m_textEditorWidget->textDocument()->filePath().toString());
     ProjectExplorer::Project *project = androidProject(docPath);
     QStringList items;
     if (project) {
@@ -577,7 +577,7 @@ void AndroidManifestEditorWidget::preSave()
         syncToEditor();
 
     if (m_setAppName && m_appNameInStringsXml) {
-        QString baseDir = QFileInfo(m_textEditorWidget->textDocument()->filePath()).absolutePath();
+        QString baseDir = m_textEditorWidget->textDocument()->filePath().toFileInfo().absolutePath();
         QString fileName = baseDir + QLatin1String("/res/values/strings.xml");
         QFile f(fileName);
         if (f.open(QIODevice::ReadOnly)) {
@@ -601,7 +601,7 @@ void AndroidManifestEditorWidget::preSave()
         m_setAppName = false;
     }
 
-    QString baseDir = QFileInfo(m_textEditorWidget->textDocument()->filePath()).absolutePath();
+    QString baseDir = m_textEditorWidget->textDocument()->filePath().toFileInfo().absolutePath();
     if (!m_lIconPath.isEmpty()) {
         copyIcon(LowDPI, baseDir, m_lIconPath);
         m_lIconPath.clear();
@@ -695,7 +695,7 @@ void AndroidManifestEditorWidget::updateInfoBar()
 
 void AndroidManifestEditorWidget::updateSdkVersions()
 {
-    const QString docPath(m_textEditorWidget->textDocument()->filePath());
+    const QString docPath(m_textEditorWidget->textDocument()->filePath().toString());
     QPair<int, int> apiLevels = AndroidManager::apiLevelRange();
     for (int i = apiLevels.first; i < apiLevels.second + 1; ++i)
         m_androidMinSdkVersion->addItem(tr("API %1: %2")
@@ -766,7 +766,7 @@ void AndroidManifestEditorWidget::syncToWidgets(const QDomDocument &doc)
     setApiLevel(m_androidMinSdkVersion, usesSdkElement, QLatin1String("android:minSdkVersion"));
     setApiLevel(m_androidTargetSdkVersion, usesSdkElement, QLatin1String("android:targetSdkVersion"));
 
-    QString baseDir = QFileInfo(m_textEditorWidget->textDocument()->filePath()).absolutePath();
+    QString baseDir = m_textEditorWidget->textDocument()->filePath().toFileInfo().absolutePath();
     QString fileName = baseDir + QLatin1String("/res/values/strings.xml");
 
     QDomElement applicationElement = manifest.firstChildElement(QLatin1String("application"));
diff --git a/src/plugins/android/javaeditor.cpp b/src/plugins/android/javaeditor.cpp
index 9413dd39de8de733cdcbd21c7c75167d9c20695b..c8194db4926a92815744b32f3dacce4ee62584bd 100644
--- a/src/plugins/android/javaeditor.cpp
+++ b/src/plugins/android/javaeditor.cpp
@@ -71,14 +71,12 @@ JavaDocument::JavaDocument()
 
 QString JavaDocument::defaultPath() const
 {
-    QFileInfo fi(filePath());
-    return fi.absolutePath();
+    return filePath().toFileInfo().absolutePath();
 }
 
 QString JavaDocument::suggestedFileName() const
 {
-    QFileInfo fi(filePath());
-    return fi.fileName();
+    return filePath().toFileInfo().fileName();
 }
 
 
diff --git a/src/plugins/autotoolsprojectmanager/autotoolsprojectfile.cpp b/src/plugins/autotoolsprojectmanager/autotoolsprojectfile.cpp
index b2cc63e9426a906bc8135c7edbdad1d4f24afc4a..0131421794369e0cc613a39ab19a78dcf723bebc 100644
--- a/src/plugins/autotoolsprojectmanager/autotoolsprojectfile.cpp
+++ b/src/plugins/autotoolsprojectmanager/autotoolsprojectfile.cpp
@@ -43,7 +43,7 @@ AutotoolsProjectFile::AutotoolsProjectFile(AutotoolsProject *project, const QStr
 {
     setId("Autotools.ProjectFile");
     setMimeType(QLatin1String(Constants::MAKEFILE_MIMETYPE));
-    setFilePath(fileName);
+    setFilePath(Utils::FileName::fromString(fileName));
 }
 
 bool AutotoolsProjectFile::save(QString *errorString, const QString &fileName, bool autoSave)
diff --git a/src/plugins/autotoolsprojectmanager/autotoolsprojectnode.cpp b/src/plugins/autotoolsprojectmanager/autotoolsprojectnode.cpp
index 3964c1c22488ac0a706159a82d9cb797548375b4..6f6d395f756780f706f42e3a204be52e589c0ecf 100644
--- a/src/plugins/autotoolsprojectmanager/autotoolsprojectnode.cpp
+++ b/src/plugins/autotoolsprojectmanager/autotoolsprojectnode.cpp
@@ -40,7 +40,7 @@ using namespace AutotoolsProjectManager::Internal;
 using namespace ProjectExplorer;
 
 AutotoolsProjectNode::AutotoolsProjectNode(AutotoolsProject *project, Core::IDocument *projectFile) :
-    ProjectNode(projectFile->filePath()),
+    ProjectNode(projectFile->filePath().toString()),
     m_project(project),
     m_projectFile(projectFile)
 {
diff --git a/src/plugins/bazaar/bazaarplugin.cpp b/src/plugins/bazaar/bazaarplugin.cpp
index f6d537b3e640ec58326997c3e9fa2f04f1c7f34c..e077ed5c0bc9f765666e1d139f742d6a3fee7e1f 100644
--- a/src/plugins/bazaar/bazaarplugin.cpp
+++ b/src/plugins/bazaar/bazaarplugin.cpp
@@ -746,7 +746,7 @@ bool BazaarPlugin::submitEditorAboutToClose()
         // Whether local commit or not
         if (commitWidget->isLocalOptionEnabled())
             extraOptions += QLatin1String("--local");
-        m_client->commit(m_submitRepository, files, editorDocument->filePath(), extraOptions);
+        m_client->commit(m_submitRepository, files, editorDocument->filePath().toString(), extraOptions);
     }
     return true;
 }
diff --git a/src/plugins/beautifier/beautifierplugin.cpp b/src/plugins/beautifier/beautifierplugin.cpp
index 1d996022209f8770b5820235a14f83d2751a8d87..a398dbb75ead7d356a1049a986798ec22c357b7c 100644
--- a/src/plugins/beautifier/beautifierplugin.cpp
+++ b/src/plugins/beautifier/beautifierplugin.cpp
@@ -233,7 +233,7 @@ void BeautifierPlugin::formatCurrentFile(const Command &command)
             watcher, &QFutureWatcher<FormatTask>::cancel);
     connect(watcher, SIGNAL(finished()), m_asyncFormatMapper, SLOT(map()));
     m_asyncFormatMapper->setMapping(watcher, watcher);
-    const QString filePath = widget->textDocument()->filePath();
+    const QString filePath = widget->textDocument()->filePath().toString();
     watcher->setFuture(QtConcurrent::run(&BeautifierPlugin::formatAsync, this,
                                          FormatTask(widget, filePath, sourceData, command)));
 }
diff --git a/src/plugins/bineditor/bineditorplugin.cpp b/src/plugins/bineditor/bineditorplugin.cpp
index 63843f76ea44b29ad3b34ec190750561e14ac579..85786c21e432eae7e3601845bb33538c335b2545 100644
--- a/src/plugins/bineditor/bineditorplugin.cpp
+++ b/src/plugins/bineditor/bineditorplugin.cpp
@@ -61,6 +61,7 @@
 #include <utils/reloadpromptutils.h>
 #include <utils/qtcassert.h>
 
+using namespace Utils;
 using namespace Core;
 
 namespace BinEditor {
@@ -256,9 +257,8 @@ public:
     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
-                = fn.isEmpty() ? filePath() : fn;
-        if (m_widget->save(errorString, filePath(), fileNameToUse)) {
+        const FileName fileNameToUse = fn.isEmpty() ? filePath() : FileName::fromString(fn);
+        if (m_widget->save(errorString, filePath().toString(), fileNameToUse.toString())) {
             setFilePath(fileNameToUse);
             return true;
         } else {
@@ -281,7 +281,7 @@ public:
             return false;
         if (file.open(QIODevice::ReadOnly)) {
             file.close();
-            setFilePath(fileName);
+            setFilePath(Utils::FileName::fromString(fileName));
             m_widget->setSizes(offset, file.size());
             return true;
         }
@@ -297,10 +297,10 @@ public:
 private slots:
     void provideData(quint64 block)
     {
-        const QString fn = filePath();
+        const FileName fn = filePath();
         if (fn.isEmpty())
             return;
-        QFile file(fn);
+        QFile file(fn.toString());
         if (file.open(QIODevice::ReadOnly)) {
             int blockSize = m_widget->dataBlockSize();
             file.seek(block * blockSize);
@@ -313,13 +313,13 @@ private slots:
         } else {
             QMessageBox::critical(Core::ICore::mainWindow(), tr("File Error"),
                                   tr("Cannot open %1: %2").arg(
-                                        QDir::toNativeSeparators(fn), file.errorString()));
+                                        fn.toUserOutput(), file.errorString()));
         }
     }
 
     void provideNewRange(quint64 offset)
     {
-        open(0, filePath(), offset);
+        open(0, filePath().toString(), offset);
     }
 
 public:
@@ -332,11 +332,10 @@ public:
                                                                        : m_widget->isModified(); }
 
     bool isFileReadOnly() const {
-        const QString fn = filePath();
+        const FileName fn = filePath();
         if (fn.isEmpty())
             return false;
-        const QFileInfo fi(fn);
-        return !fi.isWritable();
+        return !fn.toFileInfo().isWritable();
     }
 
     bool isSaveAsAllowed() const { return true; }
@@ -350,7 +349,7 @@ public:
             emit aboutToReload();
             int cPos = m_widget->cursorPosition();
             m_widget->clear();
-            const bool success = open(errorString, filePath());
+            const bool success = open(errorString, filePath().toString());
             m_widget->setCursorPosition(cPos);
             emit reloadFinished(success);
             return success;
diff --git a/src/plugins/bookmarks/bookmarkmanager.cpp b/src/plugins/bookmarks/bookmarkmanager.cpp
index 3e9a3aef89509da1a5f126a81517d08c64d1f7c8..43dd21b83e4afd3dd30653e5807caff96532507f 100644
--- a/src/plugins/bookmarks/bookmarkmanager.cpp
+++ b/src/plugins/bookmarks/bookmarkmanager.cpp
@@ -437,7 +437,7 @@ void BookmarkManager::toggleBookmark(bool)
     if (!editor)
         return;
 
-    toggleBookmark(editor->document()->filePath(), editor->currentLine());
+    toggleBookmark(editor->document()->filePath().toString(), editor->currentLine());
 }
 
 void BookmarkManager::toggleBookmark(const QString &fileName, int lineNumber)
@@ -555,7 +555,7 @@ void BookmarkManager::documentPrevNext(bool next)
     if (editorLine <= 0)
         return;
 
-    QFileInfo fi(editor->document()->filePath());
+    const QFileInfo fi = editor->document()->filePath().toFileInfo();
     if (!m_bookmarksMap.contains(fi.path()))
         return;
 
@@ -646,7 +646,7 @@ BookmarkManager::State BookmarkManager::state() const
     if (!editor)
         return HasBookMarks;
 
-    const QFileInfo fi(editor->document()->filePath());
+    const QFileInfo fi = editor->document()->filePath().toFileInfo();
 
     const DirectoryFileBookmarksMap::const_iterator dit = m_bookmarksMap.constFind(fi.path());
     if (dit == m_bookmarksMap.constEnd())
@@ -849,7 +849,7 @@ void BookmarkManager::loadBookmarks()
 
 void BookmarkManager::handleBookmarkTooltipRequest(IEditor *editor, const QPoint &pos, int line)
 {
-    Bookmark *mark = findBookmark(editor->document()->filePath(), line);
+    Bookmark *mark = findBookmark(editor->document()->filePath().toString(), line);
     operateTooltip(editor->widget(), pos, mark);
 }
 
diff --git a/src/plugins/bookmarks/bookmarksplugin.cpp b/src/plugins/bookmarks/bookmarksplugin.cpp
index 9a5a5f071f85e0002ddb240a30c7d1a8e5576bad..4d1a1b68363806d4a6d6be5c790c60820ce53807 100644
--- a/src/plugins/bookmarks/bookmarksplugin.cpp
+++ b/src/plugins/bookmarks/bookmarksplugin.cpp
@@ -110,7 +110,7 @@ bool BookmarksPlugin::initialize(const QStringList & /*arguments*/, QString *)
 
     connect(m_toggleAction, &QAction::triggered, [this]() {
         if (BaseTextEditor *editor = BaseTextEditor::currentTextEditor())
-            m_bookmarkManager->toggleBookmark(editor->document()->filePath(), editor->currentLine());
+            m_bookmarkManager->toggleBookmark(editor->document()->filePath().toString(), editor->currentLine());
     });
 
     connect(m_prevAction, &QAction::triggered, m_bookmarkManager, &BookmarkManager::prev);
@@ -165,7 +165,7 @@ void BookmarksPlugin::editorOpened(IEditor *editor)
         connect(widget, &TextEditorWidget::markRequested, m_bookmarkManager,
                 [this, editor](TextEditorWidget *, int line, TextMarkRequestKind kind) {
                     if (kind == BookmarkRequest && editor->document())
-                        m_bookmarkManager->toggleBookmark(editor->document()->filePath(), line);
+                        m_bookmarkManager->toggleBookmark(editor->document()->filePath().toString(), line);
                 });
 
 
@@ -196,7 +196,7 @@ void BookmarksPlugin::requestContextMenu(TextEditorWidget *widget,
         return;
 
     m_bookmarkMarginActionLineNumber = lineNumber;
-    m_bookmarkMarginActionFileName = widget->textDocument()->filePath();
+    m_bookmarkMarginActionFileName = widget->textDocument()->filePath().toString();
 
     menu->addAction(m_bookmarkMarginAction);
     if (m_bookmarkManager->hasBookmarkInPosition(m_bookmarkMarginActionFileName, m_bookmarkMarginActionLineNumber))
diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp
index e7ded2e40b5272d6d2a58e1232acf080eb275ade..afc47ecd33cf441ca927f38c64fbb7827caa51c8 100644
--- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp
+++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp
@@ -94,7 +94,7 @@ namespace ClangCodeModel {
 
 ClangEditorDocumentProcessor::ClangEditorDocumentProcessor(TextEditor::TextDocument *document)
     : BaseEditorDocumentProcessor(document)
-    , m_parser(document->filePath())
+    , m_parser(document->filePath().toString())
     , m_parserRevision(0)
     , m_semanticHighlighter(document)
     , m_builtinProcessor(document, /*enableSemanticHighlighter=*/ false)
@@ -112,7 +112,7 @@ ClangEditorDocumentProcessor::ClangEditorDocumentProcessor(TextEditor::TextDocum
             const int lastLine = baseTextDocument()->document()->blockCount();
 
             CreateMarkers *createMarkers = CreateMarkers::create(m_parser.semanticMarker(),
-                                                                 baseTextDocument()->filePath(),
+                                                                 baseTextDocument()->filePath().toString(),
                                                                  firstLine, lastLine);
             return createMarkers->start();
         });
diff --git a/src/plugins/clangcodemodel/clangutils.cpp b/src/plugins/clangcodemodel/clangutils.cpp
index 7d37540f2199f970d066f7b92f72259816a181a1..82cbbd5483bf1110ed9f4095a5ce5cedc97682b6 100644
--- a/src/plugins/clangcodemodel/clangutils.cpp
+++ b/src/plugins/clangcodemodel/clangutils.cpp
@@ -76,7 +76,7 @@ UnsavedFiles createUnsavedFiles(WorkingCopy workingCopy)
 
     QSet< ::Utils::FileName> modifiedFiles;
     foreach (IDocument *doc, Core::DocumentManager::modifiedDocuments())
-        modifiedFiles.insert(::Utils::FileName::fromString(doc->filePath()));
+        modifiedFiles.insert(doc->filePath());
 
     UnsavedFiles result;
     QHashIterator< ::Utils::FileName, QPair<QByteArray, unsigned> > wcIter = workingCopy.iterator();
diff --git a/src/plugins/classview/classviewmanager.cpp b/src/plugins/classview/classviewmanager.cpp
index 56f6350b5e73cea54602767c39cafc6d8b830c22..f70cb60fbabfc24f9d4a2062315d74e712819472 100644
--- a/src/plugins/classview/classviewmanager.cpp
+++ b/src/plugins/classview/classviewmanager.cpp
@@ -455,7 +455,7 @@ void Manager::gotoLocations(const QList<QVariant> &list)
         auto textEditor = qobject_cast<TextEditor::BaseTextEditor *>(EditorManager::currentEditor());
         if (textEditor) {
             // check if current cursor position is a known location of the symbol
-            const QString fileName = textEditor->document()->filePath();
+            const QString fileName = textEditor->document()->filePath().toString();
             int line;
             int column;
             textEditor->convertPosition(textEditor->position(), &line, &column);
diff --git a/src/plugins/clearcase/clearcaseplugin.cpp b/src/plugins/clearcase/clearcaseplugin.cpp
index a2d864a406d8d531c01f2cc1067186f5986eb491..cf6e22db37de2fc17140af77bcbc4b8b8a1f9924 100644
--- a/src/plugins/clearcase/clearcaseplugin.cpp
+++ b/src/plugins/clearcase/clearcaseplugin.cpp
@@ -633,7 +633,7 @@ bool ClearCasePlugin::submitEditorAboutToClose()
 
     // Submit editor closing. Make it write out the check in message
     // and retrieve files
-    const QFileInfo editorFile(editorDocument->filePath());
+    const QFileInfo editorFile = editorDocument->filePath().toFileInfo();
     const QFileInfo changeFile(m_checkInMessageFileName);
     if (editorFile.absoluteFilePath() != changeFile.absoluteFilePath())
         return true; // Oops?!
diff --git a/src/plugins/cmakeprojectmanager/cmakeeditor.cpp b/src/plugins/cmakeprojectmanager/cmakeeditor.cpp
index fa19445743dfbd2edbbbdf1ed2c147813c7b1fa6..3acf67486701dfda4d70e736dc21fd7b38a0b476 100644
--- a/src/plugins/cmakeprojectmanager/cmakeeditor.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeeditor.cpp
@@ -85,7 +85,7 @@ void CMakeEditor::finalizeInitialization()
         info.setCustomButtonInfo(tr("Build now"), [document]() {
             foreach (Project *p, SessionManager::projects()) {
                 if (CMakeProject *cmakeProject = qobject_cast<CMakeProject *>(p)) {
-                    if (cmakeProject->isProjectFile(document->filePath())) {
+                    if (cmakeProject->isProjectFile(document->filePath().toString())) {
                         ProjectExplorerPlugin::buildProject(cmakeProject);
                         break;
                     }
@@ -212,7 +212,7 @@ CMakeEditorWidget::Link CMakeEditorWidget::findLinkAt(const QTextCursor &cursor,
 
     // TODO: Resolve variables
 
-    QDir dir(QFileInfo(textDocument()->filePath()).absolutePath());
+    QDir dir(textDocument()->filePath().toFileInfo().absolutePath());
     QString fileName = dir.filePath(buffer);
     QFileInfo fi(fileName);
     if (fi.exists()) {
@@ -252,14 +252,12 @@ CMakeDocument::CMakeDocument()
 
 QString CMakeDocument::defaultPath() const
 {
-    QFileInfo fi(filePath());
-    return fi.absolutePath();
+    return filePath().toFileInfo().absolutePath();
 }
 
 QString CMakeDocument::suggestedFileName() const
 {
-    QFileInfo fi(filePath());
-    return fi.fileName();
+    return filePath().toFileInfo().fileName();
 }
 
 //
diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
index 6a87c17da785dd01ff7589289e15f78dea2b54ab..cd23330aa58b550c99d8816c4d9bd21e34cfbfcb 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
@@ -233,7 +233,7 @@ bool CMakeProject::parseCMakeLists()
 
     CMakeBuildConfiguration *activeBC = static_cast<CMakeBuildConfiguration *>(activeTarget()->activeBuildConfiguration());
     foreach (Core::IDocument *document, Core::DocumentModel::openedDocuments())
-        if (isProjectFile(document->filePath()))
+        if (isProjectFile(document->filePath().toString()))
             document->infoBar()->removeInfo("CMakeEditor.RunCMake");
 
     // Find cbp file
@@ -741,7 +741,7 @@ CMakeFile::CMakeFile(CMakeProject *parent, QString fileName)
 {
     setId("Cmake.ProjectFile");
     setMimeType(QLatin1String(Constants::CMAKEPROJECTMIMETYPE));
-    setFilePath(fileName);
+    setFilePath(Utils::FileName::fromString(fileName));
 }
 
 bool CMakeFile::save(QString *errorString, const QString &fileName, bool autoSave)
diff --git a/src/plugins/coreplugin/dialogs/readonlyfilesdialog.cpp b/src/plugins/coreplugin/dialogs/readonlyfilesdialog.cpp
index b8632e4183af7c8c734566655aac203110183745..2c860bb65208e66d43ded2306ce355a4615ea80b 100644
--- a/src/plugins/coreplugin/dialogs/readonlyfilesdialog.cpp
+++ b/src/plugins/coreplugin/dialogs/readonlyfilesdialog.cpp
@@ -162,7 +162,7 @@ ReadOnlyFilesDialog::ReadOnlyFilesDialog(IDocument *document, QWidget *parent,
     : QDialog(parent)
     , d(new ReadOnlyFilesDialogPrivate(this, document, displaySaveAs))
 {
-    d->initDialog(QStringList(document->filePath()));
+    d->initDialog(QStringList(document->filePath().toString()));
 }
 
 ReadOnlyFilesDialog::ReadOnlyFilesDialog(const QList<IDocument *> &documents, QWidget *parent)
@@ -171,7 +171,7 @@ ReadOnlyFilesDialog::ReadOnlyFilesDialog(const QList<IDocument *> &documents, QW
 {
     QStringList files;
     foreach (IDocument *document, documents)
-        files << document->filePath();
+        files << document->filePath().toString();
     d->initDialog(files);
 }
 
diff --git a/src/plugins/coreplugin/dialogs/saveitemsdialog.cpp b/src/plugins/coreplugin/dialogs/saveitemsdialog.cpp
index ac8d73d7bf247b346723f71d6ffd15729b2ae3cc..ed186e78447dc921f00fdfa8aec1287a7cb66588 100644
--- a/src/plugins/coreplugin/dialogs/saveitemsdialog.cpp
+++ b/src/plugins/coreplugin/dialogs/saveitemsdialog.cpp
@@ -63,7 +63,7 @@ SaveItemsDialog::SaveItemsDialog(QWidget *parent,
     foreach (IDocument *document, items) {
         QString visibleName;
         QString directory;
-        QString fileName = document->filePath();
+        QString fileName = document->filePath().toString();
         if (fileName.isEmpty()) {
             visibleName = document->suggestedFileName();
         } else {
diff --git a/src/plugins/coreplugin/documentmanager.cpp b/src/plugins/coreplugin/documentmanager.cpp
index e7ace44aedad8255eecfcff4624f6ad18f89b003..c62af65b3cb54894773ee0a0e6eb8bfcdea330c6 100644
--- a/src/plugins/coreplugin/documentmanager.cpp
+++ b/src/plugins/coreplugin/documentmanager.cpp
@@ -44,6 +44,7 @@
 #include <coreplugin/editormanager/ieditorfactory.h>
 #include <coreplugin/editormanager/iexternaleditor.h>
 
+#include <utils/fileutils.h>
 #include <utils/hostosinfo.h>
 #include <utils/qtcassert.h>
 #include <utils/pathchooser.h>
@@ -265,8 +266,8 @@ static void addFileInfo(const QString &fileName, IDocument *document, bool isLin
    (The added file names are guaranteed to be absolute and cleaned.) */
 static void addFileInfo(IDocument *document)
 {
-    const QString fixedName = DocumentManager::fixFileName(document->filePath(), DocumentManager::KeepLinks);
-    const QString fixedResolvedName = DocumentManager::fixFileName(document->filePath(), DocumentManager::ResolveLinks);
+    const QString fixedName = DocumentManager::fixFileName(document->filePath().toString(), DocumentManager::KeepLinks);
+    const QString fixedResolvedName = DocumentManager::fixFileName(document->filePath().toString(), DocumentManager::ResolveLinks);
     addFileInfo(fixedResolvedName, document, false);
     if (fixedName != fixedResolvedName)
         addFileInfo(fixedName, document, true);
@@ -285,7 +286,8 @@ void DocumentManager::addDocuments(const QList<IDocument *> &documents, bool add
         foreach (IDocument *document, documents) {
             if (document && !d->m_documentsWithoutWatch.contains(document)) {
                 connect(document, SIGNAL(destroyed(QObject*)), m_instance, SLOT(documentDestroyed(QObject*)));
-                connect(document, SIGNAL(filePathChanged(QString,QString)), m_instance, SLOT(filePathChanged(QString,QString)));
+                connect(document, &IDocument::filePathChanged,
+                        m_instance, &DocumentManager::filePathChanged);
                 d->m_documentsWithoutWatch.append(document);
             }
         }
@@ -296,7 +298,7 @@ void DocumentManager::addDocuments(const QList<IDocument *> &documents, bool add
         if (document && !d->m_documentsWithWatch.contains(document)) {
             connect(document, SIGNAL(changed()), m_instance, SLOT(checkForNewFileName()));
             connect(document, SIGNAL(destroyed(QObject*)), m_instance, SLOT(documentDestroyed(QObject*)));
-            connect(document, SIGNAL(filePathChanged(QString,QString)), m_instance, SLOT(filePathChanged(QString,QString)));
+            connect(document, &IDocument::filePathChanged, m_instance, &DocumentManager::filePathChanged);
             addFileInfo(document);
         }
     }
@@ -387,20 +389,20 @@ void DocumentManager::renamedFile(const QString &from, const QString &to)
     foreach (IDocument *document, documentsToRename) {
         d->m_blockedIDocument = document;
         removeFileInfo(document);
-        document->setFilePath(to);
+        document->setFilePath(Utils::FileName::fromString(to));
         addFileInfo(document);
         d->m_blockedIDocument = 0;
     }
     emit m_instance->allDocumentsRenamed(from, to);
 }
 
-void DocumentManager::filePathChanged(const QString &oldName, const QString &newName)
+void DocumentManager::filePathChanged(const Utils::FileName &oldName, const Utils::FileName &newName)
 {
     IDocument *doc = qobject_cast<IDocument *>(sender());
     QTC_ASSERT(doc, return);
     if (doc == d->m_blockedIDocument)
         return;
-    emit m_instance->documentRenamed(doc, oldName, newName);
+    emit m_instance->documentRenamed(doc, oldName.toString(), newName.toString());
 }
 
 /*!
@@ -564,7 +566,7 @@ static bool saveModifiedFilesHelper(const QList<IDocument *> &documents,
 
     foreach (IDocument *document, documents) {
         if (document && document->isModified()) {
-            QString name = document->filePath();
+            QString name = document->filePath().toString();
             if (name.isEmpty())
                 name = document->suggestedFileName();
 
@@ -634,7 +636,7 @@ static bool saveModifiedFilesHelper(const QList<IDocument *> &documents,
 bool DocumentManager::saveDocument(IDocument *document, const QString &fileName, bool *isReadOnly)
 {
     bool ret = true;
-    QString effName = fileName.isEmpty() ? document->filePath() : fileName;
+    QString effName = fileName.isEmpty() ? document->filePath().toString() : fileName;
     expectFileChange(effName); // This only matters to other IDocuments which refer to this file
     bool addWatcher = removeDocument(document); // So that our own IDocument gets no notification at all
 
@@ -721,7 +723,7 @@ QString DocumentManager::getSaveAsFileName(const IDocument *document, const QStr
 {
     if (!document)
         return QLatin1String("");
-    QString absoluteFilePath = document->filePath();
+    QString absoluteFilePath = document->filePath().toString();
     const QFileInfo fi(absoluteFilePath);
     QString path;
     QString fileName;
@@ -1063,7 +1065,7 @@ void DocumentManager::checkForReload()
                     success = document->reload(&errorString, IDocument::FlagReload, IDocument::TypeContents);
                 } else {
                     // Ask about content change
-                    previousReloadAnswer = Utils::reloadPrompt(document->filePath(), document->isModified(),
+                    previousReloadAnswer = Utils::reloadPrompt(document->filePath().toString(), document->isModified(),
                                                                ICore::dialogParent());
                     switch (previousReloadAnswer) {
                     case Utils::ReloadAll:
@@ -1086,13 +1088,13 @@ void DocumentManager::checkForReload()
                 while (unhandled) {
                     if (previousDeletedAnswer != Utils::FileDeletedCloseAll) {
                         previousDeletedAnswer =
-                                Utils::fileDeletedPrompt(document->filePath(),
+                                Utils::fileDeletedPrompt(document->filePath().toString(),
                                                          trigger == IDocument::TriggerExternal,
                                                          QApplication::activeWindow());
                     }
                     switch (previousDeletedAnswer) {
                     case Utils::FileDeletedSave:
-                        documentsToSave.insert(document, document->filePath());
+                        documentsToSave.insert(document, document->filePath().toString());
                         unhandled = false;
                         break;
                     case Utils::FileDeletedSaveAs:
@@ -1115,7 +1117,7 @@ void DocumentManager::checkForReload()
         }
         if (!success) {
             if (errorString.isEmpty())
-                errorStrings << tr("Cannot reload %1").arg(QDir::toNativeSeparators(document->filePath()));
+                errorStrings << tr("Cannot reload %1").arg(document->filePath().toUserOutput());
             else
                 errorStrings << errorString;
         }
diff --git a/src/plugins/coreplugin/documentmanager.h b/src/plugins/coreplugin/documentmanager.h
index d0dd6058c34a940931dfc24715cae507aff25ce2..79c41a362bffc465943220c599cab784e7e19ed6 100644
--- a/src/plugins/coreplugin/documentmanager.h
+++ b/src/plugins/coreplugin/documentmanager.h
@@ -43,6 +43,8 @@ class QMainWindow;
 class QMenu;
 QT_END_NAMESPACE
 
+namespace Utils { class FileName; }
+
 namespace Core {
 
 class IContext;
@@ -160,7 +162,6 @@ protected:
 
 private slots:
     void documentDestroyed(QObject *obj);
-    void filePathChanged(const QString &oldName, const QString &newName);
     void checkForNewFileName();
     void checkForReload();
     void changedFile(const QString &file);
@@ -169,6 +170,8 @@ private:
     explicit DocumentManager(QObject *parent);
     ~DocumentManager();
 
+    void filePathChanged(const Utils::FileName &oldName, const Utils::FileName &newName);
+
     friend class Core::Internal::MainWindow;
 };
 
diff --git a/src/plugins/coreplugin/editormanager/documentmodel.cpp b/src/plugins/coreplugin/editormanager/documentmodel.cpp
index b6c88e1983c014be95e1103ec770fb315ab9b192..d80ebacd393b1d8c87577315f1dfc001266a775e 100644
--- a/src/plugins/coreplugin/editormanager/documentmodel.cpp
+++ b/src/plugins/coreplugin/editormanager/documentmodel.cpp
@@ -130,7 +130,7 @@ QAbstractItemModel *DocumentModel::model()
 
 QString DocumentModel::Entry::fileName() const
 {
-    return document ? document->filePath() : m_fileName;
+    return document ? document->filePath().toString() : m_fileName;
 }
 
 QString DocumentModel::Entry::displayName() const
@@ -400,13 +400,10 @@ QVariant DocumentModelPrivate::data(const QModelIndex &index, int role) const
     case Qt::DecorationRole:
     {
         bool showLock = false;
-        if (e->document) {
-            showLock = e->document->filePath().isEmpty()
-                    ? false
-                    : e->document->isFileReadOnly();
-        } else {
+        if (e->document)
+            showLock = e->document->filePath().isEmpty() ? false : e->document->isFileReadOnly();
+        else
             showLock = !QFileInfo(e->m_fileName).isWritable();
-        }
         return showLock ? m_lockedIcon : QIcon();
     }
     case Qt::ToolTipRole:
diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp
index 013ce279e82aace1e50d9ff7d6a2976c78422a7a..4925a692bec3cd92c46437cbcee17c7f97e51bef 100644
--- a/src/plugins/coreplugin/editormanager/editormanager.cpp
+++ b/src/plugins/coreplugin/editormanager/editormanager.cpp
@@ -492,7 +492,7 @@ void EditorManagerPrivate::init()
     globalMacroExpander()->registerFileVariables(kCurrentDocumentPrefix, tr("Current document"),
         []() -> QString {
             IDocument *document = EditorManager::currentDocument();
-            return document ? document->filePath() : QString();
+            return document ? document->filePath().toString() : QString();
         });
 
     globalMacroExpander()->registerIntVariable(kCurrentDocumentXPos,
@@ -930,7 +930,7 @@ void EditorManagerPrivate::addEditor(IEditor *editor)
         const bool addWatcher = !isTemporary;
         DocumentManager::addDocument(editor->document(), addWatcher);
         if (!isTemporary)
-            DocumentManager::addToRecentFiles(editor->document()->filePath(),
+            DocumentManager::addToRecentFiles(editor->document()->filePath().toString(),
                                               editor->document()->id());
     }
     emit m_instance->editorOpened(editor);
@@ -988,7 +988,7 @@ IEditor *EditorManagerPrivate::duplicateEditor(IEditor *editor)
 
     IEditor *duplicate = editor->duplicate();
     duplicate->restoreState(editor->saveState());
-    emit m_instance->editorCreated(duplicate, duplicate->document()->filePath());
+    emit m_instance->editorCreated(duplicate, duplicate->document()->filePath().toString());
     addEditor(duplicate);
     return duplicate;
 }
@@ -1077,7 +1077,7 @@ void EditorManagerPrivate::activateView(EditorView *view)
 void EditorManagerPrivate::restoreEditorState(IEditor *editor)
 {
     QTC_ASSERT(editor, return);
-    QString fileName = editor->document()->filePath();
+    QString fileName = editor->document()->filePath().toString();
     editor->restoreState(d->m_editorStates.value(fileName).toByteArray());
 }
 
@@ -1253,7 +1253,7 @@ void EditorManagerPrivate::addDocumentToRecentFiles(IDocument *document)
     DocumentModel::Entry *entry = DocumentModel::entryForDocument(document);
     if (!entry)
         return;
-    DocumentManager::addToRecentFiles(document->filePath(), entry->id());
+    DocumentManager::addToRecentFiles(document->filePath().toString(), entry->id());
 }
 
 void EditorManagerPrivate::updateAutoSave()
@@ -1275,9 +1275,9 @@ void EditorManagerPrivate::updateMakeWritableWarning()
         // Do this after setWriteWarning so we don't re-evaluate this part even
         // if we do not really show a warning.
         bool promptVCS = false;
-        const QString directory = QFileInfo(document->filePath()).absolutePath();
+        const QString directory = document->filePath().toFileInfo().absolutePath();
         IVersionControl *versionControl = VcsManager::findVersionControlForDirectory(directory);
-        if (versionControl && versionControl->openSupportMode(document->filePath()) != IVersionControl::NoOpen) {
+        if (versionControl && versionControl->openSupportMode(document->filePath().toString()) != IVersionControl::NoOpen) {
             if (versionControl->settingsFlags() & IVersionControl::AutoOpen) {
                 vcsOpenCurrentEditor();
                 ww = false;
@@ -1368,7 +1368,7 @@ void EditorManagerPrivate::updateWindowTitleForDocument(IDocument *document, QWi
     QString windowTitle;
     const QString dashSep = QLatin1String(" - ");
 
-    QString filePath = document ? QFileInfo(document->filePath()).absoluteFilePath()
+    QString filePath = document ? document->filePath().toFileInfo().absoluteFilePath()
                               : QString();
 
     const QString windowTitleAddition = d->m_titleAdditionHandler
@@ -1473,12 +1473,12 @@ void EditorManagerPrivate::vcsOpenCurrentEditor()
     if (!document)
         return;
 
-    const QString directory = QFileInfo(document->filePath()).absolutePath();
+    const QString directory = document->filePath().toFileInfo().absolutePath();
     IVersionControl *versionControl = VcsManager::findVersionControlForDirectory(directory);
-    if (!versionControl || versionControl->openSupportMode(document->filePath()) == IVersionControl::NoOpen)
+    if (!versionControl || versionControl->openSupportMode(document->filePath().toString()) == IVersionControl::NoOpen)
         return;
 
-    if (!versionControl->vcsOpen(document->filePath())) {
+    if (!versionControl->vcsOpen(document->filePath().toString())) {
         // TODO: wrong dialog parent
         QMessageBox::warning(ICore::mainWindow(), tr("Cannot Open File"),
                              tr("Cannot open the file for editing with VCS."));
@@ -1550,7 +1550,7 @@ void EditorManagerPrivate::autoSave()
         if (document->filePath().isEmpty()) // FIXME: save them to a dedicated directory
             continue;
         QString errorString;
-        if (!document->autoSave(&errorString, autoSaveName(document->filePath())))
+        if (!document->autoSave(&errorString, autoSaveName(document->filePath().toString())))
             errors << errorString;
     }
     if (!errors.isEmpty())
@@ -1577,7 +1577,7 @@ void EditorManagerPrivate::handleContextChange(const QList<IContext *> &context)
         QTimer::singleShot(0, d, SLOT(setCurrentEditorFromContextChange()));
     } else {
         if (editor && !editor->document()->isTemporary())
-            DocumentManager::setCurrentFile(editor->document()->filePath());
+            DocumentManager::setCurrentFile(editor->document()->filePath().toString());
         updateActions();
     }
 }
@@ -1653,7 +1653,7 @@ bool EditorManagerPrivate::saveDocument(IDocument *document)
 
     document->checkPermissions();
 
-    const QString &fileName = document->filePath();
+    const QString &fileName = document->filePath().toString();
 
     if (fileName.isEmpty())
         return saveDocumentAs(document);
@@ -1689,7 +1689,7 @@ bool EditorManagerPrivate::saveDocumentAs(IDocument *document)
 
     const QString filter = MimeDatabase::allFiltersString();
     QString selectedFilter =
-        MimeDatabase::findByFile(QFileInfo(document->filePath())).filterString();
+        MimeDatabase::findByFile(document->filePath().toFileInfo()).filterString();
     if (selectedFilter.isEmpty())
         selectedFilter = MimeDatabase::findByType(document->mimeType()).filterString();
     const QString &absoluteFilePath =
@@ -1698,7 +1698,7 @@ bool EditorManagerPrivate::saveDocumentAs(IDocument *document)
     if (absoluteFilePath.isEmpty())
         return false;
 
-    if (absoluteFilePath != document->filePath()) {
+    if (absoluteFilePath != document->filePath().toString()) {
         // close existing editors for the new file name
         IDocument *otherDocument = DocumentModel::documentForFilePath(absoluteFilePath);
         if (otherDocument)
@@ -1734,7 +1734,7 @@ void EditorManagerPrivate::revertToSaved(IDocument *document)
 {
     if (!document)
         return;
-    const QString fileName =  document->filePath();
+    const QString fileName =  document->filePath().toString();
     if (fileName.isEmpty())
         return;
     if (document->isModified()) {
@@ -1824,7 +1824,7 @@ void EditorManagerPrivate::setCurrentEditorFromContextChange()
     d->m_scheduledCurrentEditor = 0;
     setCurrentEditor(newCurrent);
     if (!newCurrent->document()->isTemporary())
-        DocumentManager::setCurrentFile(newCurrent->document()->filePath());
+        DocumentManager::setCurrentFile(newCurrent->document()->filePath().toString());
 
 }
 
@@ -2096,7 +2096,7 @@ bool EditorManager::closeEditors(const QList<IEditor*> &editorsToClose, bool ask
                 && !editor->document()->isTemporary()) {
             QByteArray state = editor->saveState();
             if (!state.isEmpty())
-                d->m_editorStates.insert(editor->document()->filePath(), QVariant(state));
+                d->m_editorStates.insert(editor->document()->filePath().toString(), QVariant(state));
         }
 
         EditorManagerPrivate::removeEditor(editor);
@@ -2468,7 +2468,7 @@ QByteArray EditorManager::saveState()
             IEditor *editor = DocumentModel::editorsForDocument(document).first();
             QByteArray state = editor->saveState();
             if (!state.isEmpty())
-                d->m_editorStates.insert(document->filePath(), QVariant(state));
+                d->m_editorStates.insert(document->filePath().toString(), QVariant(state));
         }
     }
 
diff --git a/src/plugins/coreplugin/editormanager/editorview.cpp b/src/plugins/coreplugin/editormanager/editorview.cpp
index d54be3dd3e18eee6620e05d0fdfcb1f51f5fa6d5..fc0a312460a1544538dfe384bd9eca3ebaa2776f 100644
--- a/src/plugins/coreplugin/editormanager/editorview.cpp
+++ b/src/plugins/coreplugin/editormanager/editorview.cpp
@@ -219,7 +219,7 @@ void EditorView::updateEditorHistory(IEditor *editor, QList<EditLocation> &histo
 
     EditLocation location;
     location.document = document;
-    location.fileName = document->filePath();
+    location.fileName = document->filePath().toString();
     location.id = document->id();
     location.state = QVariant(state);
 
@@ -440,7 +440,7 @@ void EditorView::addCurrentPositionToNavigationHistory(const QByteArray &saveSta
 
     EditLocation location;
     location.document = document;
-    location.fileName = document->filePath();
+    location.fileName = document->filePath().toString();
     location.id = document->id();
     location.state = QVariant(state);
     m_currentNavigationHistoryPosition = qMin(m_currentNavigationHistoryPosition, m_navigationHistory.size()); // paranoia
@@ -495,7 +495,7 @@ void EditorView::updateCurrentPositionInNavigationHistory()
         location = &m_navigationHistory[m_navigationHistory.size()-1];
     }
     location->document = document;
-    location->fileName = document->filePath();
+    location->fileName = document->filePath().toString();
     location->id = document->id();
     location->state = QVariant(editor->saveState());
 }
@@ -810,10 +810,14 @@ QByteArray SplitterOrView::saveState() const
             stream << QByteArray("empty");
         } else if (e == EditorManager::currentEditor()) {
             stream << QByteArray("currenteditor")
-                    << e->document()->filePath() << e->document()->id().toString() << e->saveState();
+                   << e->document()->filePath().toString()
+                   << e->document()->id().toString()
+                   << e->saveState();
         } else {
             stream << QByteArray("editor")
-                    << e->document()->filePath() << e->document()->id().toString() << e->saveState();
+                   << e->document()->filePath().toString()
+                   << e->document()->id().toString()
+                   << e->saveState();
         }
     }
     return bytes;
diff --git a/src/plugins/coreplugin/editormanager/openeditorswindow.cpp b/src/plugins/coreplugin/editormanager/openeditorswindow.cpp
index 0a51d68a6dfa3ca5efb3ae91b81dbc780cd31616..c17216132025c191b26dce122a3656253102d03a 100644
--- a/src/plugins/coreplugin/editormanager/openeditorswindow.cpp
+++ b/src/plugins/coreplugin/editormanager/openeditorswindow.cpp
@@ -233,7 +233,7 @@ void OpenEditorsWindow::addHistoryItems(const QList<EditLocation> &history, Edit
         item->setIcon(0, !hi.document->filePath().isEmpty() && hi.document->isFileReadOnly()
                       ? DocumentModel::lockedIcon() : m_emptyIcon);
         item->setText(0, title);
-        item->setToolTip(0, hi.document->filePath());
+        item->setToolTip(0, hi.document->filePath().toString());
         item->setData(0, Qt::UserRole, QVariant::fromValue(hi.document.data()));
         item->setData(0, Qt::UserRole+1, QVariant::fromValue(view));
         item->setTextAlignment(0, Qt::AlignLeft);
diff --git a/src/plugins/coreplugin/editortoolbar.cpp b/src/plugins/coreplugin/editortoolbar.cpp
index b18376abc13e2e82814a82eb9cfe5b3feaa388b5..a2f4018832d610b5ecb1f335a577fa213df7ccb1 100644
--- a/src/plugins/coreplugin/editortoolbar.cpp
+++ b/src/plugins/coreplugin/editortoolbar.cpp
@@ -424,12 +424,11 @@ void EditorToolBar::updateDocumentStatus(IDocument *document)
     if (document->filePath().isEmpty())
         d->m_dragHandle->setIcon(QIcon());
     else
-        d->m_dragHandle->setIcon(FileIconProvider::icon(QFileInfo(document->filePath())));
+        d->m_dragHandle->setIcon(FileIconProvider::icon(document->filePath().toFileInfo()));
 
-    d->m_editorList->setToolTip(
-            document->filePath().isEmpty()
-            ? document->displayName()
-            : QDir::toNativeSeparators(document->filePath()));
+    d->m_editorList->setToolTip(document->filePath().isEmpty()
+                                ? document->displayName()
+                                : document->filePath().toUserOutput());
 }
 
 bool EditorToolBar::eventFilter(QObject *obj, QEvent *event)
diff --git a/src/plugins/coreplugin/externaltool.cpp b/src/plugins/coreplugin/externaltool.cpp
index c3fe3ae4bddc207fa582993c4bf2c50fcb3843ba..5be334964412ed9e94a4f6f80394555319be03f5 100644
--- a/src/plugins/coreplugin/externaltool.cpp
+++ b/src/plugins/coreplugin/externaltool.cpp
@@ -591,7 +591,7 @@ void ExternalToolRunner::run()
     }
     if (m_tool->modifiesCurrentDocument()) {
         if (IDocument *document = EditorManager::currentDocument()) {
-            m_expectedFileName = document->filePath();
+            m_expectedFileName = document->filePath().toString();
             if (!DocumentManager::saveModifiedDocument(document)) {
                 deleteLater();
                 return;
diff --git a/src/plugins/coreplugin/idocument.cpp b/src/plugins/coreplugin/idocument.cpp
index 4bd5484d80effac05f7f2bcc311f90455347bec9..a953eebd5179292518051337b460d76e258d58b5 100644
--- a/src/plugins/coreplugin/idocument.cpp
+++ b/src/plugins/coreplugin/idocument.cpp
@@ -82,7 +82,7 @@ public:
 
     Id id;
     QString mimeType;
-    QString filePath;
+    Utils::FileName filePath;
     QString displayName;
     QString autoSaveName;
     InfoBar *infoBar;
@@ -127,7 +127,7 @@ bool IDocument::setContents(const QByteArray &contents)
     return false;
 }
 
-QString IDocument::filePath() const
+Utils::FileName IDocument::filePath() const
 {
     return d->filePath;
 }
@@ -154,7 +154,7 @@ bool IDocument::isFileReadOnly() const
 {
     if (filePath().isEmpty())
         return false;
-    return !QFileInfo(filePath()).isWritable();
+    return !filePath().toFileInfo().isWritable();
 }
 
 /*!
@@ -244,11 +244,11 @@ InfoBar *IDocument::infoBar()
     signals. Can be reimplemented by subclasses to do more.
     \sa filePath()
 */
-void IDocument::setFilePath(const QString &filePath)
+void IDocument::setFilePath(const Utils::FileName &filePath)
 {
     if (d->filePath == filePath)
         return;
-    QString oldName = d->filePath;
+    Utils::FileName oldName = d->filePath;
     d->filePath = filePath;
     emit filePathChanged(oldName, d->filePath);
     emit changed();
@@ -263,7 +263,7 @@ QString IDocument::displayName() const
 {
     if (!d->displayName.isEmpty())
         return d->displayName;
-    return QFileInfo(d->filePath).fileName();
+    return d->filePath.toFileInfo().fileName();
 }
 
 /*!
diff --git a/src/plugins/coreplugin/idocument.h b/src/plugins/coreplugin/idocument.h
index 8e88a9cc5278b0e0cca8a8549c243a7dcd09b181..2a04fd441e892959ce561c9bb103b1ceec21bb06 100644
--- a/src/plugins/coreplugin/idocument.h
+++ b/src/plugins/coreplugin/idocument.h
@@ -34,6 +34,8 @@
 #include "core_global.h"
 #include "id.h"
 
+#include <utils/fileutils.h>
+
 #include <QObject>
 
 namespace Core {
@@ -88,8 +90,8 @@ public:
     virtual bool save(QString *errorString, const QString &fileName = QString(), bool autoSave = false) = 0;
     virtual bool setContents(const QByteArray &contents);
 
-    QString filePath() const;
-    virtual void setFilePath(const QString &filePath);
+    Utils::FileName filePath() const;
+    virtual void setFilePath(const Utils::FileName &filePath);
     QString displayName() const;
     void setDisplayName(const QString &name);
 
@@ -128,7 +130,7 @@ signals:
     void aboutToReload();
     void reloadFinished(bool success);
 
-    void filePathChanged(const QString &oldName, const QString &newName);
+    void filePathChanged(const Utils::FileName &oldName, const Utils::FileName &newName);
 
 private:
     Internal::IDocumentPrivate *d;
diff --git a/src/plugins/coreplugin/locator/filesystemfilter.cpp b/src/plugins/coreplugin/locator/filesystemfilter.cpp
index 81215c1bad0ca02a30ec96d6fb23083176b2b09b..d4aff295e0814cebbc2dcdf6ef7fbc6421616cfa 100644
--- a/src/plugins/coreplugin/locator/filesystemfilter.cpp
+++ b/src/plugins/coreplugin/locator/filesystemfilter.cpp
@@ -69,7 +69,7 @@ void FileSystemFilter::prepareSearch(const QString &entry)
     Q_UNUSED(entry)
     IDocument *document= EditorManager::currentDocument();
     if (document && !document->filePath().isEmpty()) {
-        QFileInfo info(document->filePath());
+        const QFileInfo info = document->filePath().toFileInfo();
         m_currentDocumentDirectory = info.absolutePath() + QLatin1Char('/');
     } else {
         m_currentDocumentDirectory.clear();
diff --git a/src/plugins/cppeditor/cppcodemodelinspectordialog.cpp b/src/plugins/cppeditor/cppcodemodelinspectordialog.cpp
index 7c189f52e29fc6710f26a1ef676a981360fe2b87..7826148d309173e508784259b63d77383dbc6ed1 100644
--- a/src/plugins/cppeditor/cppcodemodelinspectordialog.cpp
+++ b/src/plugins/cppeditor/cppcodemodelinspectordialog.cpp
@@ -71,7 +71,7 @@ TextEditor::BaseTextEditor *currentEditor()
 QString fileInCurrentEditor()
 {
     if (TextEditor::BaseTextEditor *editor = currentEditor())
-        return editor->document()->filePath();
+        return editor->document()->filePath().toString();
     return QString();
 }
 
@@ -1364,7 +1364,7 @@ void CppCodeModelInspectorDialog::refresh()
     TextEditor::BaseTextEditor *editor = currentEditor();
     EditorDocumentHandle *editorDocument = 0;
     if (editor) {
-        const QString editorFilePath = editor->document()->filePath();
+        const QString editorFilePath = editor->document()->filePath().toString();
         editorDocument = cmmi->editorDocument(editorFilePath);
         if (auto *documentProcessor = BaseEditorDocumentProcessor::get(editorFilePath)) {
             const CPlusPlus::Snapshot editorSnapshot = documentProcessor->snapshot();
diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp
index 3ea97b7324834fdc52ad6e23bdd30c1d34bb0cc3..e01f08c85cb24f1e80877026859dcb8fec5ff8c7 100644
--- a/src/plugins/cppeditor/cppeditor.cpp
+++ b/src/plugins/cppeditor/cppeditor.cpp
@@ -637,7 +637,7 @@ AssistInterface *CppEditorWidget::createAssistInterface(AssistKind kind, AssistR
         if (CppCompletionAssistProvider *cap =
                 qobject_cast<CppCompletionAssistProvider *>(cppEditorDocument()->completionAssistProvider())) {
             return cap->createAssistInterface(
-                            textDocument()->filePath(),
+                            textDocument()->filePath().toString(),
                             document(),
                             cppEditorDocument()->isObjCEnabled(),
                             position(),
@@ -766,7 +766,7 @@ void CppEditorWidget::abortDeclDefLink()
 
 void CppEditorWidget::showPreProcessorWidget()
 {
-    const Utils::FileName fileName = Utils::FileName::fromString(textDocument()->filePath());
+    const Utils::FileName fileName = textDocument()->filePath();
 
     // Check if this editor belongs to a project
     QList<ProjectPart::Ptr> projectParts = d->m_modelManager->projectPart(fileName);
@@ -775,7 +775,7 @@ void CppEditorWidget::showPreProcessorWidget()
     if (projectParts.isEmpty())
         projectParts << d->m_modelManager->fallbackProjectPart();
 
-    CppPreProcessorDialog preProcessorDialog(this, textDocument()->filePath(), projectParts);
+    CppPreProcessorDialog preProcessorDialog(this, textDocument()->filePath().toString(), projectParts);
     if (preProcessorDialog.exec() == QDialog::Accepted) {
         cppEditorDocument()->setPreprocessorSettings(
                     preProcessorDialog.projectPart(),
diff --git a/src/plugins/cppeditor/cppeditordocument.cpp b/src/plugins/cppeditor/cppeditordocument.cpp
index 987ee522a5612ddc6d8755c91fe708c2dbc3f400..3c68be7acfa70ae338bdbe57a79946bee33ff568 100644
--- a/src/plugins/cppeditor/cppeditordocument.cpp
+++ b/src/plugins/cppeditor/cppeditordocument.cpp
@@ -68,14 +68,14 @@ class CppEditorDocumentHandle : public CppTools::EditorDocumentHandle
 public:
     CppEditorDocumentHandle(CppEditor::Internal::CppEditorDocument *cppEditorDocument)
         : m_cppEditorDocument(cppEditorDocument)
-        , m_registrationFilePath(cppEditorDocument->filePath())
+        , m_registrationFilePath(cppEditorDocument->filePath().toString())
     {
         mm()->registerEditorDocument(this);
     }
 
     ~CppEditorDocumentHandle() { mm()->unregisterEditorDocument(m_registrationFilePath); }
 
-    QString filePath() const { return m_cppEditorDocument->filePath(); }
+    QString filePath() const { return m_cppEditorDocument->filePath().toString(); }
     QByteArray contents() const { return m_cppEditorDocument->contentsText(); }
     unsigned revision() const { return m_cppEditorDocument->contentsRevision(); }
 
@@ -105,8 +105,8 @@ CppEditorDocument::CppEditorDocument()
 
     connect(this, SIGNAL(aboutToReload()), this, SLOT(onAboutToReload()));
     connect(this, SIGNAL(reloadFinished(bool)), this, SLOT(onReloadFinished()));
-    connect(this, SIGNAL(filePathChanged(QString,QString)),
-            this, SLOT(onFilePathChanged(QString,QString)));
+    connect(this, &IDocument::filePathChanged,
+            this, &CppEditorDocument::onFilePathChanged);
 
     m_processorTimer.setSingleShot(true);
     m_processorTimer.setInterval(processDocumentIntervalInMs);
@@ -196,12 +196,13 @@ void CppEditorDocument::onReloadFinished()
     m_fileIsBeingReloaded = false;
 }
 
-void CppEditorDocument::onFilePathChanged(const QString &oldPath, const QString &newPath)
+void CppEditorDocument::onFilePathChanged(const Utils::FileName &oldPath,
+                                          const Utils::FileName &newPath)
 {
     Q_UNUSED(oldPath);
 
     if (!newPath.isEmpty()) {
-        setMimeType(Core::MimeDatabase::findByFile(QFileInfo(newPath)).type());
+        setMimeType(Core::MimeDatabase::findByFile(newPath.toFileInfo()).type());
 
         disconnect(this, SIGNAL(contentsChanged()), this, SLOT(scheduleProcessDocument()));
         connect(this, SIGNAL(contentsChanged()), this, SLOT(scheduleProcessDocument()));
@@ -250,8 +251,8 @@ void CppEditorDocument::updatePreprocessorSettings()
 
     const QString prefix = QLatin1String(Constants::CPP_PREPROCESSOR_PROJECT_PREFIX);
     const QString &projectFile = ProjectExplorer::SessionManager::value(
-                prefix + filePath()).toString();
-    const QString directivesKey = projectFile + QLatin1Char(',') + filePath();
+                prefix + filePath().toString()).toString();
+    const QString directivesKey = projectFile + QLatin1Char(',') + filePath().toString();
     const QByteArray additionalDirectives = ProjectExplorer::SessionManager::value(
                 directivesKey).toString().toUtf8();
 
diff --git a/src/plugins/cppeditor/cppeditordocument.h b/src/plugins/cppeditor/cppeditordocument.h
index ace78a6548ac6289711c3843d34a8afa87e1555f..5fea5353738c64132ad1d80d20f5e2f402162566 100644
--- a/src/plugins/cppeditor/cppeditordocument.h
+++ b/src/plugins/cppeditor/cppeditordocument.h
@@ -84,7 +84,7 @@ protected:
 
 private slots:
     void invalidateFormatterCache();
-    void onFilePathChanged(const QString &oldPath, const QString &newPath);
+    void onFilePathChanged(const Utils::FileName &oldPath, const Utils::FileName &newPath);
     void onMimeTypeChanged();
 
     void onAboutToReload();
diff --git a/src/plugins/cppeditor/cppeditoroutline.cpp b/src/plugins/cppeditor/cppeditoroutline.cpp
index a5d1c776fc86b5bd63481489eb542707eef2947b..7b26ac198e41a2a9656ca8ad743c341c60d0557d 100644
--- a/src/plugins/cppeditor/cppeditoroutline.cpp
+++ b/src/plugins/cppeditor/cppeditoroutline.cpp
@@ -195,7 +195,7 @@ void CppEditorOutline::updateNow()
         return;
 
     const CPlusPlus::Snapshot snapshot = cmmi->snapshot();
-    const QString filePath = m_editorWidget->textDocument()->filePath();
+    const QString filePath = m_editorWidget->textDocument()->filePath().toString();
     CPlusPlus::Document::Ptr document = snapshot.document(filePath);
     if (!document)
         return;
diff --git a/src/plugins/cppeditor/cppelementevaluator.cpp b/src/plugins/cppeditor/cppelementevaluator.cpp
index 32960691de035c1304018ca83adfe3dec6d399d5..7d0ce8f3f9306a19c3d450a200789dc92d3471af 100644
--- a/src/plugins/cppeditor/cppelementevaluator.cpp
+++ b/src/plugins/cppeditor/cppelementevaluator.cpp
@@ -88,7 +88,7 @@ void CppElementEvaluator::execute()
         return;
 
     const Snapshot &snapshot = m_modelManager->snapshot();
-    Document::Ptr doc = snapshot.document(m_editor->textDocument()->filePath());
+    Document::Ptr doc = snapshot.document(m_editor->textDocument()->filePath().toString());
     if (!doc)
         return;
 
diff --git a/src/plugins/cppeditor/cppfollowsymbolundercursor.cpp b/src/plugins/cppeditor/cppfollowsymbolundercursor.cpp
index 0f52de09fa3d2b712411ddca75da9ebefe339628..ac0600554b64393ad196a94a3d4d1eeca31c3381 100644
--- a/src/plugins/cppeditor/cppfollowsymbolundercursor.cpp
+++ b/src/plugins/cppeditor/cppfollowsymbolundercursor.cpp
@@ -550,7 +550,7 @@ TextEditorWidget::Link FollowSymbolUnderCursor::findLink(const QTextCursor &curs
     }
 
     // Now we prefer the doc from the snapshot with macros expanded.
-    Document::Ptr doc = snapshot.document(m_widget->textDocument()->filePath());
+    Document::Ptr doc = snapshot.document(m_widget->textDocument()->filePath().toString());
     if (!doc) {
         doc = documentFromSemanticInfo;
         if (!doc)
@@ -645,7 +645,7 @@ TextEditorWidget::Link FollowSymbolUnderCursor::findLink(const QTextCursor &curs
             if (Symbol *d = r.declaration()) {
                 if (d->isDeclaration() || d->isFunction()) {
                     const QString fileName = QString::fromUtf8(d->fileName(), d->fileNameLength());
-                    if (m_widget->textDocument()->filePath() == fileName) {
+                    if (m_widget->textDocument()->filePath().toString() == fileName) {
                         if (unsigned(lineNumber) == d->line()
                             && unsigned(positionInBlock) >= d->column()) { // TODO: check the end
                             result = r; // take the symbol under cursor.
diff --git a/src/plugins/cppeditor/cppincludehierarchy.cpp b/src/plugins/cppeditor/cppincludehierarchy.cpp
index ce5d145a1b7b9a4ce5f5939a202b456cc111e1b0..d4f6865e0793b65e9dd76e6c4b92e90c0214b439 100644
--- a/src/plugins/cppeditor/cppincludehierarchy.cpp
+++ b/src/plugins/cppeditor/cppincludehierarchy.cpp
@@ -118,12 +118,12 @@ void CppIncludeHierarchyWidget::perform()
         return;
 
     m_model->clear();
-    m_model->buildHierarchy(m_editor, widget->textDocument()->filePath());
+    m_model->buildHierarchy(m_editor, widget->textDocument()->filePath().toString());
     if (m_model->isEmpty())
         return;
 
     m_inspectedFile->setText(widget->textDocument()->displayName());
-    m_inspectedFile->setLink(TextEditorWidget::Link(widget->textDocument()->filePath()));
+    m_inspectedFile->setLink(TextEditorWidget::Link(widget->textDocument()->filePath().toString()));
 
     //expand "Includes"
     m_treeView->expand(m_model->index(0, 0));
diff --git a/src/plugins/cppeditor/cppincludehierarchymodel.cpp b/src/plugins/cppeditor/cppincludehierarchymodel.cpp
index a7fb9780bb094d33944d0ee94051a746952bacae..07bbe84e5e35ebe0920847d1ab69a07f668f081d 100644
--- a/src/plugins/cppeditor/cppincludehierarchymodel.cpp
+++ b/src/plugins/cppeditor/cppincludehierarchymodel.cpp
@@ -174,7 +174,7 @@ void CppIncludeHierarchyModel::fetchMore(const QModelIndex &parent)
         return;
 
     if (parentItem->needChildrenPopulate()) {
-        const QString editorFilePath = m_editor->document()->filePath();
+        const QString editorFilePath = m_editor->document()->filePath().toString();
         QSet<QString> cyclic;
         cyclic << editorFilePath;
         CppIncludeHierarchyItem *item = parentItem->parent();
@@ -285,7 +285,7 @@ void CppIncludeHierarchyModel::buildHierarchyIncludes(const QString &currentFile
     if (!m_editor)
         return;
 
-    const QString editorFilePath = m_editor->document()->filePath();
+    const QString editorFilePath = m_editor->document()->filePath().toString();
     auto *documentProcessor = BaseEditorDocumentProcessor::get(editorFilePath);
     QTC_ASSERT(documentProcessor, return);
     const Snapshot editorDocumentSnapshot = documentProcessor->snapshot();
diff --git a/src/plugins/cppeditor/cppquickfixassistant.cpp b/src/plugins/cppeditor/cppquickfixassistant.cpp
index b9a2c867e642b8ebe5cc7493f26ecc7cb768f01c..6bfb0e5d516d25088f1a9609482a696e574389b0 100644
--- a/src/plugins/cppeditor/cppquickfixassistant.cpp
+++ b/src/plugins/cppeditor/cppquickfixassistant.cpp
@@ -77,7 +77,7 @@ QList<TextEditor::QuickFixFactory *> CppQuickFixAssistProvider::quickFixFactorie
 CppQuickFixInterface::CppQuickFixInterface(CppEditorWidget *editor,
                                                        TextEditor::AssistReason reason)
     : AssistInterface(editor->document(), editor->position(),
-                      editor->textDocument()->filePath(), reason)
+                      editor->textDocument()->filePath().toString(), reason)
     , m_editor(editor)
     , m_semanticInfo(editor->semanticInfo())
     , m_snapshot(CppTools::CppModelManager::instance()->snapshot())
diff --git a/src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp b/src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp
index 2637efc51decb8cef79e205624902d9c25ced3d1..685febfe69b953fefa83c2d68fe51ea58491e795 100644
--- a/src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp
+++ b/src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp
@@ -344,7 +344,7 @@ F2TestCase::F2TestCase(CppEditorAction action,
     BaseTextEditor *currentTextEditor = dynamic_cast<BaseTextEditor*>(currentEditor);
     QVERIFY(currentTextEditor);
 
-    QCOMPARE(currentTextEditor->document()->filePath(), targetTestFile->filePath());
+    QCOMPARE(currentTextEditor->document()->filePath().toString(), targetTestFile->filePath());
     int expectedLine, expectedColumn;
     currentTextEditor->convertPosition(targetTestFile->m_targetCursorPosition,
                                        &expectedLine, &expectedColumn);
diff --git a/src/plugins/cpptools/baseeditordocumentprocessor.h b/src/plugins/cpptools/baseeditordocumentprocessor.h
index 866508eaab8a5f2470ab9364e184e7d65520504b..edc9924f7ba3b15d45a0ac7f8a0dc24dd89f9b26 100644
--- a/src/plugins/cpptools/baseeditordocumentprocessor.h
+++ b/src/plugins/cpptools/baseeditordocumentprocessor.h
@@ -87,7 +87,7 @@ protected:
                           CppTools::WorkingCopy workingCopy);
 
     // Convenience
-    QString filePath() const { return m_baseTextDocument->filePath(); }
+    QString filePath() const { return m_baseTextDocument->filePath().toString(); }
     unsigned revision() const { return static_cast<unsigned>(textDocument()->revision()); }
     QTextDocument *textDocument() const { return m_baseTextDocument->document(); }
 
diff --git a/src/plugins/cpptools/builtineditordocumentprocessor.cpp b/src/plugins/cpptools/builtineditordocumentprocessor.cpp
index 758c7083dbdb4bdc63edccb9ad0a421292033105..f81094e11028ecc9ea43f67adb749fbdcf1f49a3 100644
--- a/src/plugins/cpptools/builtineditordocumentprocessor.cpp
+++ b/src/plugins/cpptools/builtineditordocumentprocessor.cpp
@@ -128,7 +128,7 @@ BuiltinEditorDocumentProcessor::BuiltinEditorDocumentProcessor(
         TextEditor::TextDocument *document,
         bool enableSemanticHighlighter)
     : BaseEditorDocumentProcessor(document)
-    , m_parser(document->filePath())
+    , m_parser(document->filePath().toString())
     , m_codeWarningsUpdated(false)
     , m_semanticHighlighter(enableSemanticHighlighter
                             ? new CppTools::SemanticHighlighter(document)
diff --git a/src/plugins/cpptools/cppcompletion_test.cpp b/src/plugins/cpptools/cppcompletion_test.cpp
index a676a5efeca582f88b3bde6bec67ecfeff6a9e2f..5d3d54b2a1428bb9799aef6d0e5e108241d7e03c 100644
--- a/src/plugins/cpptools/cppcompletion_test.cpp
+++ b/src/plugins/cpptools/cppcompletion_test.cpp
@@ -105,7 +105,7 @@ public:
     {
         QStringList completions;
         CppCompletionAssistInterface *ai
-            = new CppCompletionAssistInterface(m_editorWidget->textDocument()->filePath(),
+            = new CppCompletionAssistInterface(m_editorWidget->textDocument()->filePath().toString(),
                                                m_editorWidget->document(), m_position,
                                                ExplicitlyInvoked, m_snapshot,
                                                ProjectPart::HeaderPaths());
diff --git a/src/plugins/cpptools/cppcurrentdocumentfilter.cpp b/src/plugins/cpptools/cppcurrentdocumentfilter.cpp
index 306e77f68390e07582235ea236bbf8e78e8c3fe5..2317bed64708f52c724eb0b6c9dba5e43ba88a51 100644
--- a/src/plugins/cpptools/cppcurrentdocumentfilter.cpp
+++ b/src/plugins/cpptools/cppcurrentdocumentfilter.cpp
@@ -133,7 +133,7 @@ void CppCurrentDocumentFilter::onCurrentEditorChanged(Core::IEditor *currentEdit
 {
     QMutexLocker locker(&m_mutex);
     if (currentEditor)
-        m_currentFileName = currentEditor->document()->filePath();
+        m_currentFileName = currentEditor->document()->filePath().toString();
     else
         m_currentFileName.clear();
     m_itemsOfCurrentDoc.clear();
@@ -145,7 +145,7 @@ void CppCurrentDocumentFilter::onEditorAboutToClose(Core::IEditor *editorAboutTo
         return;
 
     QMutexLocker locker(&m_mutex);
-    if (m_currentFileName == editorAboutToClose->document()->filePath()) {
+    if (m_currentFileName == editorAboutToClose->document()->filePath().toString()) {
         m_currentFileName.clear();
         m_itemsOfCurrentDoc.clear();
     }
diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index a2c263ee0a5bd9d04e24d1fc53fe163bece7f66e..7568a32e7c07448fafadc4faddc1c1a6a76d516e 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -699,7 +699,7 @@ void CppModelManager::updateCppEditorDocuments() const
     QSet<Core::IDocument *> visibleCppEditorDocuments;
     foreach (Core::IEditor *editor, Core::EditorManager::visibleEditors()) {
         if (Core::IDocument *document = editor->document()) {
-            if (EditorDocumentHandle *cppEditorDocument = editorDocument(document->filePath())) {
+            if (EditorDocumentHandle *cppEditorDocument = editorDocument(document->filePath().toString())) {
                 visibleCppEditorDocuments.insert(document);
                 cppEditorDocument->processor()->run();
             }
@@ -711,7 +711,7 @@ void CppModelManager::updateCppEditorDocuments() const
         = Core::DocumentModel::openedDocuments().toSet();
     invisibleCppEditorDocuments.subtract(visibleCppEditorDocuments);
     foreach (Core::IDocument *document, invisibleCppEditorDocuments) {
-        if (EditorDocumentHandle *cppEditorDocument = editorDocument(document->filePath()))
+        if (EditorDocumentHandle *cppEditorDocument = editorDocument(document->filePath().toString()))
             cppEditorDocument->setNeedsRefresh(true);
     }
 }
@@ -887,7 +887,8 @@ void CppModelManager::onCurrentEditorChanged(Core::IEditor *editor)
     if (!editor || !editor->document())
         return;
 
-    if (EditorDocumentHandle *cppEditorDocument = editorDocument(editor->document()->filePath())) {
+    if (EditorDocumentHandle *cppEditorDocument =
+            editorDocument(editor->document()->filePath().toString())) {
         if (cppEditorDocument->needsRefresh()) {
             cppEditorDocument->setNeedsRefresh(false);
             cppEditorDocument->processor()->run();
diff --git a/src/plugins/cpptools/cppmodelmanager_test.cpp b/src/plugins/cpptools/cppmodelmanager_test.cpp
index c1ec0a33f98c3a1ce67d4fea092fa10ab69535de..cd9d078a3cb5b91539348c9ca0b88eeb02c80a93 100644
--- a/src/plugins/cpptools/cppmodelmanager_test.cpp
+++ b/src/plugins/cpptools/cppmodelmanager_test.cpp
@@ -989,7 +989,7 @@ void CppToolsPlugin::test_modelmanager_defines_per_editor()
         QCOMPARE(Core::DocumentModel::openedDocuments().size(), 1);
         QVERIFY(mm->isCppEditor(editor));
 
-        const QString filePath = editor->document()->filePath();
+        const QString filePath = editor->document()->filePath().toString();
         BaseEditorDocumentParser *parser = BaseEditorDocumentParser::get(filePath);
         parser->setEditorDefines(editorDefines.toUtf8());
         parser->update(mm->workingCopy());
diff --git a/src/plugins/cpptools/cppsourceprocessor_test.cpp b/src/plugins/cpptools/cppsourceprocessor_test.cpp
index d40fcfb889d89ad875ffddadd6711148346a6d65..ecc0899fcc7d83ba35d2ee37816a95ece2735e9f 100644
--- a/src/plugins/cpptools/cppsourceprocessor_test.cpp
+++ b/src/plugins/cpptools/cppsourceprocessor_test.cpp
@@ -134,7 +134,7 @@ void CppToolsPlugin::test_cppsourceprocessor_includes_cyclic()
     testCase.closeEditorAtEndOfTestCase(editor);
 
     // Check editor snapshot
-    const QString filePath = editor->document()->filePath();
+    const QString filePath = editor->document()->filePath().toString();
     auto *processor = BaseEditorDocumentProcessor::get(filePath);
     QVERIFY(processor);
     Snapshot snapshot = processor->snapshot();
diff --git a/src/plugins/cpptools/cpptoolsplugin.cpp b/src/plugins/cpptools/cpptoolsplugin.cpp
index 0ed79950c70708ba4f3a8918d4fab0b028522868..fdd2f51de77ce168279f3240c84c831ff62c24fd 100644
--- a/src/plugins/cpptools/cpptoolsplugin.cpp
+++ b/src/plugins/cpptools/cpptoolsplugin.cpp
@@ -236,7 +236,7 @@ void CppToolsPlugin::switchHeaderSource()
 void CppToolsPlugin::switchHeaderSourceInNextSplit()
 {
     QString otherFile = correspondingHeaderOrSource(
-                EditorManager::currentDocument()->filePath());
+                EditorManager::currentDocument()->filePath().toString());
     if (!otherFile.isEmpty())
         EditorManager::openEditor(otherFile, Id(), EditorManager::OpenInOtherSplit);
 }
diff --git a/src/plugins/cpptools/cpptoolsreuse.cpp b/src/plugins/cpptools/cpptoolsreuse.cpp
index cfb29dc401f9b89ca4117ce1211eb9783e7288f8..f64a31ffdba9520a66cff8cfa21162cce99ae3c3 100644
--- a/src/plugins/cpptools/cpptoolsreuse.cpp
+++ b/src/plugins/cpptools/cpptoolsreuse.cpp
@@ -196,7 +196,7 @@ void switchHeaderSource()
 {
     const Core::IDocument *currentDocument = Core::EditorManager::currentDocument();
     QTC_ASSERT(currentDocument, return);
-    const QString otherFile = correspondingHeaderOrSource(currentDocument->filePath());
+    const QString otherFile = correspondingHeaderOrSource(currentDocument->filePath().toString());
     if (!otherFile.isEmpty())
         Core::EditorManager::openEditor(otherFile);
 }
diff --git a/src/plugins/cvs/cvsplugin.cpp b/src/plugins/cvs/cvsplugin.cpp
index 630616c0b1efd5405cc0ee00b9d22d5483eff51f..0c7502afea1bef4acbcb04ea83cc57c220bbed5f 100644
--- a/src/plugins/cvs/cvsplugin.cpp
+++ b/src/plugins/cvs/cvsplugin.cpp
@@ -492,7 +492,7 @@ bool CvsPlugin::submitEditorAboutToClose()
 
     // Submit editor closing. Make it write out the commit message
     // and retrieve files
-    const QFileInfo editorFile(editorDocument->filePath());
+    const QFileInfo editorFile = editorDocument->filePath().toFileInfo();
     const QFileInfo changeFile(m_commitMessageFileName);
     if (editorFile.absoluteFilePath() != changeFile.absoluteFilePath())
         return true; // Oops?!
diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
index 709fe0a04c549287f1e6ce07654984462a278b0a..715ae0bc2fb6eb04030900b30a8317b13bb6a272 100644
--- a/src/plugins/debugger/debuggerplugin.cpp
+++ b/src/plugins/debugger/debuggerplugin.cpp
@@ -568,7 +568,7 @@ static bool currentTextEditorPosition(ContextData *data)
         return false;
     const TextDocument *document = textEditor->textDocument();
     QTC_ASSERT(document, return false);
-    data->fileName = document->filePath();
+    data->fileName = document->filePath().toString();
     if (document->property(Constants::OPENED_WITH_DISASSEMBLY).toBool()) {
         int lineNumber = textEditor->currentLine();
         QString line = textEditor->textDocument()->plainText()
@@ -1722,7 +1722,7 @@ void DebuggerPluginPrivate::requestContextMenu(TextEditorWidget *widget,
 
     BreakpointModelId id = BreakpointModelId();
     TextDocument *document = widget->textDocument();
-    args.fileName = document->filePath();
+    args.fileName = document->filePath().toString();
     if (document->property(Constants::OPENED_WITH_DISASSEMBLY).toBool()) {
         QString line = document->plainText()
             .section(QLatin1Char('\n'), lineNumber - 1, lineNumber - 1);
@@ -1842,7 +1842,7 @@ void DebuggerPluginPrivate::toggleBreakpoint()
         quint64 address = DisassemblerLine::addressFromDisassemblyLine(line);
         toggleBreakpointByAddress(address);
     } else if (lineNumber >= 0) {
-        toggleBreakpointByFileAndLine(textEditor->document()->filePath(), lineNumber);
+        toggleBreakpointByFileAndLine(textEditor->document()->filePath().toString(), lineNumber);
     }
 }
 
@@ -1899,7 +1899,7 @@ void DebuggerPluginPrivate::requestMark(TextEditorWidget *widget, int lineNumber
         quint64 address = DisassemblerLine::addressFromDisassemblyLine(line);
         toggleBreakpointByAddress(address);
     } else {
-        toggleBreakpointByFileAndLine(document->filePath(), lineNumber);
+        toggleBreakpointByFileAndLine(document->filePath().toString(), lineNumber);
     }
 }
 
@@ -1981,7 +1981,7 @@ void DebuggerPluginPrivate::cleanupViews()
             bool keepIt = true;
             if (document->isModified())
                 keepIt = true;
-            else if (document->filePath().contains(_("qeventdispatcher")))
+            else if (document->filePath().toString().contains(_("qeventdispatcher")))
                 keepIt = false;
             else if (isMemory)
                 keepIt = !closeMemory;
diff --git a/src/plugins/debugger/debuggertooltipmanager.cpp b/src/plugins/debugger/debuggertooltipmanager.cpp
index c13853924862463bc27d72055eadaeedfffe0129..f4dba546e9468bfe1f3ac54dec93f18010a5aec9 100644
--- a/src/plugins/debugger/debuggertooltipmanager.cpp
+++ b/src/plugins/debugger/debuggertooltipmanager.cpp
@@ -1189,7 +1189,7 @@ void DebuggerToolTipManager::slotUpdateVisibleToolTips()
         return;
     }
 
-    const QString fileName = toolTipEditor->textDocument()->filePath();
+    const QString fileName = toolTipEditor->textDocument()->filePath().toString();
     if (fileName.isEmpty()) {
         hideAllToolTips();
         return;
@@ -1339,7 +1339,7 @@ static void slotTooltipOverrideRequested
 
     DebuggerToolTipContext context;
     context.engineType = engine->objectName();
-    context.fileName = editorWidget->textDocument()->filePath();
+    context.fileName = editorWidget->textDocument()->filePath().toString();
     context.position = pos;
     editorWidget->convertPosition(pos, &context.line, &context.column);
     QString raw = cppExpressionAt(editorWidget, context.position, &context.line, &context.column,
diff --git a/src/plugins/debugger/qml/qmlinspectoradapter.cpp b/src/plugins/debugger/qml/qmlinspectoradapter.cpp
index 207a706673b5cf60f283b9f3bf7c40657ac5dadf..1566780dbc80d2944972f479b08c2f3e33ee1277 100644
--- a/src/plugins/debugger/qml/qmlinspectoradapter.cpp
+++ b/src/plugins/debugger/qml/qmlinspectoradapter.cpp
@@ -299,7 +299,7 @@ void QmlInspectorAdapter::createPreviewForEditor(Core::IEditor *newEditor)
             != QmlJSEditor::Constants::C_QMLJSEDITOR_ID)
         return;
 
-    QString filename = newEditor->document()->filePath();
+    QString filename = newEditor->document()->filePath().toString();
     QmlJS::ModelManagerInterface *modelManager =
             QmlJS::ModelManagerInterface::instance();
     if (modelManager) {
@@ -330,7 +330,7 @@ void QmlInspectorAdapter::createPreviewForEditor(Core::IEditor *newEditor)
             connect(preview, SIGNAL(reloadRequest()),
                     this, SLOT(onReload()));
 
-            m_textPreviews.insert(newEditor->document()->filePath(), preview);
+            m_textPreviews.insert(newEditor->document()->filePath().toString(), preview);
             preview->associateEditor(newEditor);
             preview->updateDebugIds();
         }
@@ -340,7 +340,7 @@ void QmlInspectorAdapter::createPreviewForEditor(Core::IEditor *newEditor)
 void QmlInspectorAdapter::removePreviewForEditor(Core::IEditor *editor)
 {
     if (QmlLiveTextPreview *preview
-            = m_textPreviews.value(editor->document()->filePath())) {
+            = m_textPreviews.value(editor->document()->filePath().toString())) {
         preview->unassociateEditor(editor);
     }
 }
@@ -364,7 +364,7 @@ void QmlInspectorAdapter::updatePendingPreviewDocuments(QmlJS::Document::Ptr doc
     Core::IEditor *editor = editors.takeFirst();
     createPreviewForEditor(editor);
     QmlLiveTextPreview *preview
-            = m_textPreviews.value(editor->document()->filePath());
+            = m_textPreviews.value(editor->document()->filePath().toString());
     foreach (Core::IEditor *editor, editors)
         preview->associateEditor(editor);
 }
@@ -460,7 +460,7 @@ void QmlInspectorAdapter::initializePreviews()
             QList<Core::IEditor *> editors = Core::DocumentModel::editorsForDocument(document);
             createPreviewForEditor(editors.takeFirst());
             QmlLiveTextPreview *preview
-                    = m_textPreviews.value(document->filePath());
+                    = m_textPreviews.value(document->filePath().toString());
             foreach (Core::IEditor *editor, editors)
                 preview->associateEditor(editor);
         }
diff --git a/src/plugins/debugger/sourceutils.cpp b/src/plugins/debugger/sourceutils.cpp
index eec4b595cf66d8b534ae5ad27d24c81389053ff1..d4deb12e5504c6ec6248a7732ab2a664540a17de 100644
--- a/src/plugins/debugger/sourceutils.cpp
+++ b/src/plugins/debugger/sourceutils.cpp
@@ -264,7 +264,7 @@ bool getUninitializedVariables(const Snapshot &snapshot,
 bool isCppEditor(TextEditorWidget *editorWidget)
 {
     const TextDocument *document = editorWidget->textDocument();
-    return ProjectFile::classify(document->filePath()) != ProjectFile::Unclassified;
+    return ProjectFile::classify(document->filePath().toString()) != ProjectFile::Unclassified;
 }
 
 QString cppFunctionAt(const QString &fileName, int line, int column)
@@ -305,7 +305,7 @@ QString cppExpressionAt(TextEditorWidget *editorWidget, int pos,
     }
 
     if (!expr.isEmpty()) {
-        QString fileName = editorWidget->textDocument()->filePath();
+        QString fileName = editorWidget->textDocument()->filePath().toString();
         const Snapshot snapshot = CppModelManager::instance()->snapshot();
         if (const Document::Ptr document = snapshot.document(fileName)) {
             QString func = document->functionAt(*line, *column, scopeFromLine, scopeToLine);
diff --git a/src/plugins/designer/formeditorplugin.cpp b/src/plugins/designer/formeditorplugin.cpp
index 771775242c855f9f122c1b8b660c035869d3e351..8a13cef2f2f74a77e1e31e90910c807d9bf7d693 100644
--- a/src/plugins/designer/formeditorplugin.cpp
+++ b/src/plugins/designer/formeditorplugin.cpp
@@ -147,7 +147,7 @@ void FormEditorPlugin::initializeTemplates()
 static QString currentFile()
 {
     if (const IDocument *document = EditorManager::currentDocument()) {
-        const QString fileName = document->filePath();
+        const QString fileName = document->filePath().toString();
         if (!fileName.isEmpty() && QFileInfo(fileName).isFile())
             return fileName;
     }
diff --git a/src/plugins/designer/formwindoweditor.cpp b/src/plugins/designer/formwindoweditor.cpp
index 4e538dad76e8f09997ff627999993800168b254d..ab287d5a09c1bce412715d8b15a0d86af3116a68 100644
--- a/src/plugins/designer/formwindoweditor.cpp
+++ b/src/plugins/designer/formwindoweditor.cpp
@@ -95,7 +95,7 @@ bool FormWindowEditor::open(QString *errorString, const QString &fileName, const
     form->setDirty(fileName != realFileName);
 
     document->syncXmlFromFormWindow();
-    document->setFilePath(absfileName);
+    document->setFilePath(Utils::FileName::fromString(absfileName));
     document->setShouldAutoSave(false);
     document->resourceHandler()->updateResources(true);
 
diff --git a/src/plugins/designer/formwindowfile.cpp b/src/plugins/designer/formwindowfile.cpp
index 0719a91f41f39cf692ad4ed35079b5052e953d0e..3c26340f9a63e28bdf3435810118a69eee2bb793 100644
--- a/src/plugins/designer/formwindowfile.cpp
+++ b/src/plugins/designer/formwindowfile.cpp
@@ -44,6 +44,8 @@
 #include <QDebug>
 #include <QTextCodec>
 
+using namespace Utils;
+
 namespace Designer {
 namespace Internal {
 
@@ -64,13 +66,13 @@ FormWindowFile::FormWindowFile(QDesignerFormWindowInterface *form, QObject *pare
     connect(m_formWindow, SIGNAL(changed()), SLOT(updateIsModified()));
 
     m_resourceHandler = new ResourceHandler(form);
-    connect(this, SIGNAL(filePathChanged(QString,QString)),
+    connect(this, SIGNAL(filePathChanged(Utils::FileName,Utils::FileName)),
             m_resourceHandler, SLOT(updateResources()));
 }
 
 bool FormWindowFile::save(QString *errorString, const QString &name, bool autoSave)
 {
-    const QString actualName = name.isEmpty() ? filePath() : name;
+    const FileName actualName = name.isEmpty() ? filePath() : FileName::fromString(name);
 
     if (Designer::Constants::Internal::debug)
         qDebug() << Q_FUNC_INFO << name << "->" << actualName;
@@ -80,11 +82,10 @@ bool FormWindowFile::save(QString *errorString, const QString &name, bool autoSa
     if (actualName.isEmpty())
         return false;
 
-    const QFileInfo fi(actualName);
     const QString oldFormName = m_formWindow->fileName();
     if (!autoSave)
-        m_formWindow->setFileName(fi.absoluteFilePath());
-    const bool writeOK = writeFile(actualName, errorString);
+        m_formWindow->setFileName(actualName.toString());
+    const bool writeOK = writeFile(actualName.toString(), errorString);
     m_shouldAutoSave = false;
     if (autoSave)
         return writeOK;
@@ -95,7 +96,7 @@ bool FormWindowFile::save(QString *errorString, const QString &name, bool autoSa
     }
 
     m_formWindow->setDirty(false);
-    setFilePath(fi.absoluteFilePath());
+    setFilePath(actualName);
     updateIsModified();
 
     return true;
@@ -135,9 +136,9 @@ bool FormWindowFile::setContents(const QByteArray &contents)
     return true;
 }
 
-void FormWindowFile::setFilePath(const QString &newName)
+void FormWindowFile::setFilePath(const FileName &newName)
 {
-    m_formWindow->setFileName(newName);
+    m_formWindow->setFileName(newName.toString());
     IDocument::setFilePath(newName);
 }
 
@@ -173,7 +174,7 @@ bool FormWindowFile::reload(QString *errorString, ReloadFlag flag, ChangeType ty
         emit changed();
     } else {
         emit aboutToReload();
-        emit reloadRequested(errorString, filePath());
+        emit reloadRequested(errorString, filePath().toString());
         const bool success = errorString->isEmpty();
         emit reloadFinished(success);
         return success;
diff --git a/src/plugins/designer/formwindowfile.h b/src/plugins/designer/formwindowfile.h
index bcbc617f17bb56f3335e20aa5f2ea16f52060d74..c4fa847267017bca6a4cfcf8faab242e77cdb7ef 100644
--- a/src/plugins/designer/formwindowfile.h
+++ b/src/plugins/designer/formwindowfile.h
@@ -77,7 +77,7 @@ signals:
     void reloadRequested(QString *errorString, const QString &);
 
 public slots:
-    void setFilePath(const QString &);
+    void setFilePath(const Utils::FileName &);
     void setShouldAutoSave(bool sad = true) { m_shouldAutoSave = sad; }
     void updateIsModified();
 
diff --git a/src/plugins/designer/gotoslot_test.cpp b/src/plugins/designer/gotoslot_test.cpp
index 54950c6907dc8114138993a452c5fd538bcdf806..a0ab9b1b894a1d6045407466923fc0682dbcb9f4 100644
--- a/src/plugins/designer/gotoslot_test.cpp
+++ b/src/plugins/designer/gotoslot_test.cpp
@@ -178,12 +178,12 @@ public:
         integration->emitNavigateToSlot(QLatin1String("pushButton"), QLatin1String("clicked()"),
                                         QStringList());
 
-        QCOMPARE(EditorManager::currentDocument()->filePath(), cppFile);
+        QCOMPARE(EditorManager::currentDocument()->filePath().toString(), cppFile);
         QVERIFY(EditorManager::currentDocument()->isModified());
 
         // Wait for updated documents
         foreach (TextEditor::BaseTextEditor *editor, editors) {
-            const QString filePath = editor->document()->filePath();
+            const QString filePath = editor->document()->filePath().toString();
             if (auto parser = BuiltinEditorDocumentParser::get(filePath)) {
                 forever {
                     if (Document::Ptr document = parser->document()) {
diff --git a/src/plugins/designer/qtcreatorintegration.cpp b/src/plugins/designer/qtcreatorintegration.cpp
index 689b36dcb39f96d63703159177bc5123cc11727b..303fc32f8c0672475d78393b89646c9fd5ab61f1 100644
--- a/src/plugins/designer/qtcreatorintegration.cpp
+++ b/src/plugins/designer/qtcreatorintegration.cpp
@@ -510,7 +510,7 @@ bool QtCreatorIntegration::navigateToSlot(const QString &objectName,
 {
     typedef QMap<int, Document::Ptr> DocumentMap;
 
-    const QString currentUiFile = FormEditorW::activeEditor()->document()->filePath();
+    const QString currentUiFile = FormEditorW::activeEditor()->document()->filePath().toString();
 #if 0
     return Designer::Internal::navigateToSlot(currentUiFile, objectName, signalSignature, parameterNames, errorMessage);
 #endif
diff --git a/src/plugins/diffeditor/diffeditordocument.cpp b/src/plugins/diffeditor/diffeditordocument.cpp
index 3aaedf549a421f3f5358cdb595da61c2bb4e82c7..0f10016e1e4837492ebe182826a8ca7ac46e0bc9 100644
--- a/src/plugins/diffeditor/diffeditordocument.cpp
+++ b/src/plugins/diffeditor/diffeditordocument.cpp
@@ -90,7 +90,7 @@ bool DiffEditorDocument::save(QString *errorString, const QString &fileName, boo
     DiffEditorManager::removeDocument(this);
     const QFileInfo fi(fileName);
     setTemporary(false);
-    setFilePath(QDir::cleanPath(fi.absoluteFilePath()));
+    setFilePath(Utils::FileName::fromString(fi.absoluteFilePath()));
     setDisplayName(QString());
     return true;
 }
@@ -100,7 +100,7 @@ bool DiffEditorDocument::reload(QString *errorString, ReloadFlag flag, ChangeTyp
     Q_UNUSED(type)
     if (flag == FlagIgnore)
         return true;
-    return open(errorString, filePath());
+    return open(errorString, filePath().toString());
 }
 
 bool DiffEditorDocument::open(QString *errorString, const QString &fileName)
@@ -120,7 +120,7 @@ bool DiffEditorDocument::open(QString *errorString, const QString &fileName)
 
     const QFileInfo fi(fileName);
     setTemporary(false);
-    setFilePath(QDir::cleanPath(fi.absoluteFilePath()));
+    setFilePath(Utils::FileName::fromString(fi.absoluteFilePath()));
     m_controller->setDiffFiles(fileDataList, fi.absolutePath());
     return true;
 }
diff --git a/src/plugins/fakevim/fakevimplugin.cpp b/src/plugins/fakevim/fakevimplugin.cpp
index 099fae162663297e1d9cdfba8f6a4753c47f2176..12aeb452ace77489a3b228bf3ec79c89c10b59b7 100644
--- a/src/plugins/fakevim/fakevimplugin.cpp
+++ b/src/plugins/fakevim/fakevimplugin.cpp
@@ -1810,7 +1810,7 @@ void FakeVimPluginPrivate::editorOpened(IEditor *editor)
     connect(ICore::instance(), SIGNAL(saveSettingsRequested()),
         SLOT(writeSettings()));
 
-    handler->setCurrentFileName(editor->document()->filePath());
+    handler->setCurrentFileName(editor->document()->filePath().toString());
     handler->installEventFilter();
 
     // pop up the bar
@@ -1970,7 +1970,7 @@ void FakeVimPluginPrivate::handleExCommand(bool *handled, const ExCommand &cmd)
         // :w[rite]
         IEditor *editor = m_editorToHandler.key(handler);
         const QString fileName = handler->currentFileName();
-        if (editor && editor->document()->filePath() == fileName) {
+        if (editor && editor->document()->filePath().toString() == fileName) {
             // Handle that as a special case for nicer interaction with core
             DocumentManager::saveDocument(editor->document());
             // Check result by reading back.
diff --git a/src/plugins/genericprojectmanager/genericproject.cpp b/src/plugins/genericprojectmanager/genericproject.cpp
index ab70c94facb5793a4afe197387c18c009d2563bf..e4d61047aa2219aff41e88c1306eeb437824575e 100644
--- a/src/plugins/genericprojectmanager/genericproject.cpp
+++ b/src/plugins/genericprojectmanager/genericproject.cpp
@@ -447,7 +447,7 @@ GenericProjectFile::GenericProjectFile(GenericProject *parent, QString fileName,
 {
     setId("Generic.ProjectFile");
     setMimeType(QLatin1String(Constants::GENERICMIMETYPE));
-    setFilePath(fileName);
+    setFilePath(Utils::FileName::fromString(fileName));
 }
 
 bool GenericProjectFile::save(QString *, const QString &, bool)
diff --git a/src/plugins/genericprojectmanager/genericprojectnodes.cpp b/src/plugins/genericprojectmanager/genericprojectnodes.cpp
index 36bb164bfbd3784f6a3cafa677b6d897add74893..3b2970971a6d3022b954f39a6d23eb5be414b631 100644
--- a/src/plugins/genericprojectmanager/genericprojectnodes.cpp
+++ b/src/plugins/genericprojectmanager/genericprojectnodes.cpp
@@ -43,9 +43,11 @@ namespace GenericProjectManager {
 namespace Internal {
 
 GenericProjectNode::GenericProjectNode(GenericProject *project, Core::IDocument *projectFile)
-    : ProjectNode(projectFile->filePath()), m_project(project), m_projectFile(projectFile)
+    : ProjectNode(projectFile->filePath().toString())
+    , m_project(project)
+    , m_projectFile(projectFile)
 {
-    setDisplayName(QFileInfo(projectFile->filePath()).completeBaseName());
+    setDisplayName(projectFile->filePath().toFileInfo().completeBaseName());
 }
 
 Core::IDocument *GenericProjectNode::projectFile() const
@@ -55,7 +57,7 @@ Core::IDocument *GenericProjectNode::projectFile() const
 
 QString GenericProjectNode::projectFilePath() const
 {
-    return m_projectFile->filePath();
+    return m_projectFile->filePath().toString();
 }
 
 QHash<QString, QStringList> sortFilesIntoPaths(const QString &base, const QSet<QString> &files)
diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp
index 38b9795ca09ed6656a0446d3ef4a062cb43561e9..1ea6220e0072e3c294eb62b5361ea512d66382ee 100644
--- a/src/plugins/git/gitclient.cpp
+++ b/src/plugins/git/gitclient.cpp
@@ -698,7 +698,7 @@ static inline QString msgCannotLaunch(const QString &binary)
 static inline QString currentDocumentPath()
 {
     if (IDocument *document= EditorManager::currentDocument())
-        return QFileInfo(document->filePath()).path();
+        return document->filePath().toFileInfo().path();
     return QString();
 }
 
diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp
index 547132b1c5ab7db0a459f3d30bb430168bf0cf89..472166bea4487b7718c7fac32dea56dc6859e493 100644
--- a/src/plugins/git/gitplugin.cpp
+++ b/src/plugins/git/gitplugin.cpp
@@ -1035,7 +1035,7 @@ bool GitPlugin::submitEditorAboutToClose()
     QTC_ASSERT(editorDocument, return true);
     // Submit editor closing. Make it write out the commit message
     // and retrieve files
-    const QFileInfo editorFile(editorDocument->filePath());
+    const QFileInfo editorFile = editorDocument->filePath().toFileInfo();
     const QFileInfo changeFile(m_commitMessageFileName);
     // Paranoia!
     if (editorFile.absoluteFilePath() != changeFile.absoluteFilePath())
diff --git a/src/plugins/glsleditor/glsleditor.cpp b/src/plugins/glsleditor/glsleditor.cpp
index 817a3be8d38bf9de42517d334228ec927a21b790..3f3af8751c61ad36b98c26a70b594d20b9127ca3 100644
--- a/src/plugins/glsleditor/glsleditor.cpp
+++ b/src/plugins/glsleditor/glsleditor.cpp
@@ -313,7 +313,7 @@ AssistInterface *GlslEditorWidget::createAssistInterface(
     if (kind == Completion)
         return new GlslCompletionAssistInterface(document(),
                                                  position(),
-                                                 textDocument()->filePath(),
+                                                 textDocument()->filePath().toString(),
                                                  reason,
                                                  textDocument()->mimeType(),
                                                  m_glslDocument);
diff --git a/src/plugins/imageviewer/imageviewer.cpp b/src/plugins/imageviewer/imageviewer.cpp
index 2850efddf49abee856f5590b36119d3c57eb3f23..ab3b264899277a821cd8b6c209b60a105e22b416 100644
--- a/src/plugins/imageviewer/imageviewer.cpp
+++ b/src/plugins/imageviewer/imageviewer.cpp
@@ -126,7 +126,7 @@ bool ImageViewer::open(QString *errorString, const QString &fileName, const QStr
         *errorString = tr("Cannot open image file %1.").arg(QDir::toNativeSeparators(realFileName));
         return false;
     }
-    d->file->setFilePath(fileName);
+    d->file->setFilePath(Utils::FileName::fromString(fileName));
     d->ui_toolbar.toolButtonPlayPause->setVisible(d->imageView->isAnimated());
     setPaused(!d->imageView->isAnimated());
     // d_ptr->file->setMimeType
diff --git a/src/plugins/imageviewer/imageviewerfile.cpp b/src/plugins/imageviewer/imageviewerfile.cpp
index a3b1191b86924ac5baaf7043e31bfa6622bf4657..c7963b7bf3901a680dcfd5a729b1e7217f82ef2c 100644
--- a/src/plugins/imageviewer/imageviewerfile.cpp
+++ b/src/plugins/imageviewer/imageviewerfile.cpp
@@ -65,7 +65,7 @@ bool ImageViewerFile::reload(QString *errorString,
         emit changed();
         return true;
     }
-    return m_editor->open(errorString, filePath(), filePath());
+    return m_editor->open(errorString, filePath().toString(), filePath().toString());
 }
 
 bool ImageViewerFile::save(QString *errorString, const QString &fileName, bool autoSave)
diff --git a/src/plugins/mercurial/mercurialplugin.cpp b/src/plugins/mercurial/mercurialplugin.cpp
index 5b57e492c3b663ec3fc9364b8aacb3600f4e58e7..c736c0763ab65aa5e4fca09ca0449656aa7ebb7c 100644
--- a/src/plugins/mercurial/mercurialplugin.cpp
+++ b/src/plugins/mercurial/mercurialplugin.cpp
@@ -638,7 +638,7 @@ bool MercurialPlugin::submitEditorAboutToClose()
         QStringList extraOptions;
         if (!commitEditor->committerInfo().isEmpty())
             extraOptions << QLatin1String("-u") << commitEditor->committerInfo();
-        m_client->commit(m_submitRepository, files, editorFile->filePath(),
+        m_client->commit(m_submitRepository, files, editorFile->filePath().toString(),
                          extraOptions);
     }
     return true;
diff --git a/src/plugins/projectexplorer/editorconfiguration.cpp b/src/plugins/projectexplorer/editorconfiguration.cpp
index cc5e050118e19de1031752d10f2d941dab178b5b..2bb35c810764464f20ac0a6439fa191131dd1270 100644
--- a/src/plugins/projectexplorer/editorconfiguration.cpp
+++ b/src/plugins/projectexplorer/editorconfiguration.cpp
@@ -281,7 +281,7 @@ void EditorConfiguration::setUseGlobalSettings(bool use)
     d->m_defaultCodeStyle->setCurrentDelegate(use ? TextEditorSettings::codeStyle() : 0);
     foreach (Core::IEditor *editor, Core::DocumentModel::editorsForOpenedDocuments()) {
         if (TextEditorWidget *widget = qobject_cast<TextEditorWidget *>(editor->widget())) {
-            Project *project = SessionManager::projectForFile(editor->document()->filePath());
+            Project *project = SessionManager::projectForFile(editor->document()->filePath().toString());
             if (project && project->editorConfiguration() == this)
                 switchSettings(widget);
         }
diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp
index 1c73409d91884b8fc52773b26e560969bb8d98ff..fa1f1c392e655f18e410734ad24b0d4c8878ec11 100644
--- a/src/plugins/projectexplorer/project.cpp
+++ b/src/plugins/projectexplorer/project.cpp
@@ -134,7 +134,7 @@ Core::Id Project::id() const
 
 Utils::FileName Project::projectFilePath() const
 {
-    return Utils::FileName::fromString(document()->filePath());
+    return document()->filePath();
 }
 
 bool Project::hasActiveBuildSettings() const
diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp
index 5d3a7edfedcca2092974577350a594bb54dd5537..30e251459af9b22bd8f72ddef895d9db2f368577 100644
--- a/src/plugins/projectexplorer/projectexplorer.cpp
+++ b/src/plugins/projectexplorer/projectexplorer.cpp
@@ -1120,11 +1120,11 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
     expander->registerFileVariables(Constants::VAR_CURRENTPROJECT_PREFIX,
         tr("Current project's main file"),
         [this]() -> QString {
-            QString projectFilePath;
+            Utils::FileName projectFilePath;
             if (Project *project = ProjectTree::currentProject())
                 if (IDocument *doc = project->document())
                     projectFilePath = doc->filePath();
-            return projectFilePath;
+            return projectFilePath.toString();
         });
 
     expander->registerVariable(Constants::VAR_CURRENTPROJECT_BUILDPATH,
@@ -1242,7 +1242,7 @@ void ProjectExplorerPlugin::loadAction()
     // for your special convenience, we preselect a pro file if it is
     // the current file
     if (const IDocument *document = EditorManager::currentDocument()) {
-        const QString fn = document->filePath();
+        const QString fn = document->filePath().toString();
         const bool isProject = dd->m_profileMimeTypes.contains(document->mimeType());
         dir = isProject ? fn : QFileInfo(fn).absolutePath();
     }
@@ -1304,7 +1304,7 @@ void ProjectExplorerPlugin::unloadProject(Project *project)
     if (!DocumentManager::saveModifiedDocumentSilently(document))
         return;
 
-    dd->addToRecentProjects(document->filePath(), project->displayName());
+    dd->addToRecentProjects(document->filePath().toString(), project->displayName());
 
     SessionManager::removeProject(project);
     m_instance->updateActions();
diff --git a/src/plugins/projectexplorer/projecttree.cpp b/src/plugins/projectexplorer/projecttree.cpp
index 7e2974b78992692f1abaeced5c9fc9f0a83957cd..2b470344e97f6978337f137dd6eab113538cb9e5 100644
--- a/src/plugins/projectexplorer/projecttree.cpp
+++ b/src/plugins/projectexplorer/projecttree.cpp
@@ -333,7 +333,7 @@ void ProjectTree::updateExternalFileWarning()
     }
     if (!infoBar->canInfoBeAdded(externalFileId))
         return;
-    Utils::FileName fileName = Utils::FileName::fromString(document->filePath());
+    const Utils::FileName fileName = document->filePath();
     const QList<Project *> projects = SessionManager::projects();
     if (projects.isEmpty())
         return;
diff --git a/src/plugins/projectexplorer/session.cpp b/src/plugins/projectexplorer/session.cpp
index 9d2fa0acb92fd0837cc14a3de5ce78dc58dd8f59..3e2c47895272b0d5cbddcf955fa8e82a9cf94d2a 100644
--- a/src/plugins/projectexplorer/session.cpp
+++ b/src/plugins/projectexplorer/session.cpp
@@ -607,7 +607,7 @@ void SessionManager::configureEditor(Core::IEditor *editor, const QString &fileN
 void SessionManager::configureEditors(Project *project)
 {
     foreach (IDocument *document, DocumentModel::openedDocuments()) {
-        if (d->projectContainsFile(project, document->filePath())) {
+        if (d->projectContainsFile(project, document->filePath().toString())) {
             foreach (IEditor *editor, DocumentModel::editorsForDocument(document)) {
                 if (TextEditor::BaseTextEditor *textEditor = qobject_cast<TextEditor::BaseTextEditor*>(editor)) {
                         project->editorConfiguration()->configureEditor(textEditor);
diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp
index e6db73238bef9d030ee7fd6bd5f8b1e5f12f8583..3fa7e633b22124eef734a3af83420ecae6b2a50c 100644
--- a/src/plugins/qbsprojectmanager/qbsproject.cpp
+++ b/src/plugins/qbsprojectmanager/qbsproject.cpp
@@ -157,7 +157,7 @@ QString QbsProject::displayName() const
 IDocument *QbsProject::document() const
 {
     foreach (IDocument *doc, m_qbsDocuments) {
-        if (doc->filePath() == m_fileName)
+        if (doc->filePath().toString() == m_fileName)
             return doc;
     }
     QTC_ASSERT(false, return 0);
@@ -211,7 +211,7 @@ public:
         : m_document(0)
     {
         foreach (Core::IDocument * const doc, documents) {
-            if (doc->filePath() == filePath) {
+            if (doc->filePath().toString() == filePath) {
                 m_document = doc;
                 break;
             }
@@ -226,7 +226,7 @@ public:
     {
         QTC_ASSERT(m_document, return);
         Core::DocumentManager::addDocument(m_document);
-        Core::DocumentManager::unexpectFileChange(m_document->filePath());
+        Core::DocumentManager::unexpectFileChange(m_document->filePath().toString());
     }
 
 private:
@@ -658,7 +658,7 @@ void QbsProject::updateDocuments(const QSet<QString> &files)
     QTC_ASSERT(!newFiles.isEmpty(), newFiles << m_fileName);
     QSet<QString> oldFiles;
     foreach (IDocument *doc, m_qbsDocuments)
-        oldFiles.insert(doc->filePath());
+        oldFiles.insert(doc->filePath().toString());
 
     QSet<QString> filesToAdd = newFiles;
     filesToAdd.subtract(oldFiles);
@@ -667,7 +667,7 @@ void QbsProject::updateDocuments(const QSet<QString> &files)
 
     QSet<IDocument *> currentDocuments = m_qbsDocuments;
     foreach (IDocument *doc, currentDocuments) {
-        if (filesToRemove.contains(doc->filePath())) {
+        if (filesToRemove.contains(doc->filePath().toString())) {
             m_qbsDocuments.remove(doc);
             delete doc;
         }
diff --git a/src/plugins/qbsprojectmanager/qbsprojectfile.cpp b/src/plugins/qbsprojectmanager/qbsprojectfile.cpp
index ebb608f09a50547aa08da41920178934335fe929..1eb44dee0e2741dd030305a6fc2300b74f7262a9 100644
--- a/src/plugins/qbsprojectmanager/qbsprojectfile.cpp
+++ b/src/plugins/qbsprojectmanager/qbsprojectfile.cpp
@@ -41,7 +41,7 @@ QbsProjectFile::QbsProjectFile(QbsProject *parent, QString fileName) : Core::IDo
 {
     setId("Qbs.ProjectFile");
     setMimeType(QLatin1String(Constants::MIME_TYPE));
-    setFilePath(fileName);
+    setFilePath(Utils::FileName::fromString(fileName));
 }
 
 QbsProjectFile::~QbsProjectFile()
diff --git a/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp b/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp
index 20ebb8862a84c925ece578c57d75c4c6a61a943b..6750c80a23d320b30e4ea21ef5c1dc8a90c4a24c 100644
--- a/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp
+++ b/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp
@@ -71,13 +71,13 @@ namespace Internal {
 static Node *currentEditorNode()
 {
     Core::IDocument *doc = Core::EditorManager::currentDocument();
-    return doc ? SessionManager::nodeForFile(doc->filePath()) : 0;
+    return doc ? SessionManager::nodeForFile(doc->filePath().toString()) : 0;
 }
 
 static QbsProject *currentEditorProject()
 {
     Core::IDocument *doc = Core::EditorManager::currentDocument();
-    return doc ? qobject_cast<QbsProject *>(SessionManager::projectForFile(doc->filePath())) : 0;
+    return doc ? qobject_cast<QbsProject *>(SessionManager::projectForFile(doc->filePath().toString())) : 0;
 }
 
 QbsProjectManagerPlugin::QbsProjectManagerPlugin() :
diff --git a/src/plugins/qmakeprojectmanager/profileeditor.cpp b/src/plugins/qmakeprojectmanager/profileeditor.cpp
index adb7b2731a92b4474f9d40153208c5b12539e2cf..07fb0256493dd219515ef8eea4e8cf25879df605 100644
--- a/src/plugins/qmakeprojectmanager/profileeditor.cpp
+++ b/src/plugins/qmakeprojectmanager/profileeditor.cpp
@@ -137,7 +137,7 @@ ProFileEditorWidget::Link ProFileEditorWidget::findLinkAt(const QTextCursor &cur
         }
     }
 
-    QDir dir(QFileInfo(textDocument()->filePath()).absolutePath());
+    QDir dir(textDocument()->filePath().toFileInfo().absolutePath());
     QString fileName = dir.filePath(buffer);
     QFileInfo fi(fileName);
     if (fi.exists()) {
@@ -185,14 +185,12 @@ ProFileDocument::ProFileDocument()
 
 QString ProFileDocument::defaultPath() const
 {
-    QFileInfo fi(filePath());
-    return fi.absolutePath();
+    return filePath().toFileInfo().absolutePath();
 }
 
 QString ProFileDocument::suggestedFileName() const
 {
-    QFileInfo fi(filePath());
-    return fi.fileName();
+    return filePath().toFileInfo().fileName();
 }
 
 //
diff --git a/src/plugins/qmakeprojectmanager/qmakenodes.cpp b/src/plugins/qmakeprojectmanager/qmakenodes.cpp
index 1da974b1f1a44e0bf15812e8af8a03903a0fc15a..10504b3586f8eded3ce0a28f0f68ebd0423680bb 100644
--- a/src/plugins/qmakeprojectmanager/qmakenodes.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakenodes.cpp
@@ -244,7 +244,7 @@ QmakePriFile::QmakePriFile(QmakeProjectManager::QmakePriFileNode *qmakePriFile)
 {
     setId("Qmake.PriFile");
     setMimeType(QLatin1String(QmakeProjectManager::Constants::PROFILE_MIMETYPE));
-    setFilePath(m_priFile->path());
+    setFilePath(Utils::FileName::fromString(m_priFile->path()));
 }
 
 bool QmakePriFile::save(QString *errorString, const QString &fileName, bool autoSave)
diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.cpp b/src/plugins/qmakeprojectmanager/qmakeproject.cpp
index 75bdda5ab7fc78c89525b90e1ad7e92e90d29582..f9bc634c25b7a2f1bd4ba3b446edd8f371ff3e05 100644
--- a/src/plugins/qmakeprojectmanager/qmakeproject.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakeproject.cpp
@@ -283,7 +283,7 @@ QmakeProjectFile::QmakeProjectFile(const QString &filePath, QObject *parent)
 {
     setId("Qmake.ProFile");
     setMimeType(QLatin1String(QmakeProjectManager::Constants::PROFILE_MIMETYPE));
-    setFilePath(filePath);
+    setFilePath(Utils::FileName::fromString(filePath));
 }
 
 bool QmakeProjectFile::save(QString *, const QString &, bool)
@@ -414,7 +414,7 @@ bool QmakeProject::fromMap(const QVariantMap &map)
 
     m_manager->registerProject(this);
 
-    m_rootProjectNode = new QmakeProFileNode(this, m_fileInfo->filePath(), this);
+    m_rootProjectNode = new QmakeProFileNode(this, m_fileInfo->filePath().toString(), this);
     m_rootProjectNode->registerWatcher(m_nodesWatcher);
 
     // We have the profile nodes now, so we know the runconfigs!
@@ -1048,7 +1048,7 @@ void QmakeProject::destroyProFileReader(QtSupport::ProFileReader *reader)
 {
     delete reader;
     if (!--m_qmakeGlobalsRefCnt) {
-        QString dir = QFileInfo(m_fileInfo->filePath()).absolutePath();
+        QString dir = m_fileInfo->filePath().toFileInfo().absolutePath();
         if (!dir.endsWith(QLatin1Char('/')))
             dir += QLatin1Char('/');
         QtSupport::ProFileCacheManager::instance()->discardFiles(dir);
diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectmanager.cpp b/src/plugins/qmakeprojectmanager/qmakeprojectmanager.cpp
index c12f9da501fbdaef4f4b0506cfd2976e943707ac..f889ea2b723a23d2a7bc1c23bf698fbb7c9d4c70 100644
--- a/src/plugins/qmakeprojectmanager/qmakeprojectmanager.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakeprojectmanager.cpp
@@ -135,7 +135,7 @@ void QmakeManager::setContextFile(ProjectExplorer::FileNode *file)
 void QmakeManager::addLibrary()
 {
     if (auto editor = qobject_cast<BaseTextEditor *>(Core::EditorManager::currentEditor()))
-        addLibrary(editor->document()->filePath(), editor);
+        addLibrary(editor->document()->filePath().toString(), editor);
 }
 
 void QmakeManager::addLibraryContextMenu()
@@ -231,7 +231,7 @@ void QmakeManager::buildFileContextMenu()
 void QmakeManager::buildFile()
 {
     if (Core::IDocument *currentDocument= Core::EditorManager::currentDocument()) {
-        const QString file = currentDocument->filePath();
+        const QString file = currentDocument->filePath().toString();
         FileNode *node  = qobject_cast<FileNode *>(SessionManager::nodeForFile(file));
         Project *project = SessionManager::projectForFile(file);
 
diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp b/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp
index fa464df46af08ab16f36d64c65d42f79b3dc2e90..ddb3ba7226b1625e03025c4c66529a459924cc90 100644
--- a/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp
@@ -392,7 +392,7 @@ void QmakeProjectManagerPlugin::updateBuildFileAction()
     bool enabled = false;
 
     if (Core::IDocument *currentDocument= Core::EditorManager::currentDocument()) {
-        QString file = currentDocument->filePath();
+        QString file = currentDocument->filePath().toString();
         Node *node  = SessionManager::nodeForFile(file);
         Project *project = SessionManager::projectForFile(file);
         m_buildFileAction->setParameter(QFileInfo(file).fileName());
diff --git a/src/plugins/qmldesigner/components/componentcore/crumblebar.cpp b/src/plugins/qmldesigner/components/componentcore/crumblebar.cpp
index 776e2892bc3781c1f1e5b262bf4ac4d3662f1782..6711604bfbb9dac7c2ac4d8e5ba3b6b046ec42c5 100644
--- a/src/plugins/qmldesigner/components/componentcore/crumblebar.cpp
+++ b/src/plugins/qmldesigner/components/componentcore/crumblebar.cpp
@@ -65,7 +65,7 @@ static CrumbleBarInfo createCrumbleBarInfoFromModelNode(const ModelNode &modelNo
 {
     CrumbleBarInfo crumbleBarInfo;
     crumbleBarInfo.displayName = componentIdForModelNode(modelNode);
-    crumbleBarInfo.fileName = currentDesignDocument()->textEditor()->document()->filePath();
+    crumbleBarInfo.fileName = currentDesignDocument()->textEditor()->document()->filePath().toString();
     crumbleBarInfo.modelNode = modelNode;
 
     return crumbleBarInfo;
diff --git a/src/plugins/qmldesigner/components/integration/designdocument.cpp b/src/plugins/qmldesigner/components/integration/designdocument.cpp
index b32c5db707f5ffed311316ff2394cc01cc894b7f..f5f873270ffb9474a3262b598939f1be1dcf1b00 100644
--- a/src/plugins/qmldesigner/components/integration/designdocument.cpp
+++ b/src/plugins/qmldesigner/components/integration/designdocument.cpp
@@ -194,22 +194,22 @@ QString DesignDocument::simplfiedDisplayName() const
     return list.last();
 }
 
-void DesignDocument::updateFileName(const QString & /*oldFileName*/, const QString &newFileName)
+void DesignDocument::updateFileName(const Utils::FileName & /*oldFileName*/, const Utils::FileName &newFileName)
 {
     if (m_documentModel)
-        m_documentModel->setFileUrl(QUrl::fromLocalFile(newFileName));
+        m_documentModel->setFileUrl(QUrl::fromLocalFile(newFileName.toString()));
 
     if (m_inFileComponentModel)
-        m_inFileComponentModel->setFileUrl(QUrl::fromLocalFile(newFileName));
+        m_inFileComponentModel->setFileUrl(QUrl::fromLocalFile(newFileName.toString()));
 
-    viewManager().setItemLibraryViewResourcePath(QFileInfo(newFileName).absolutePath());
+    viewManager().setItemLibraryViewResourcePath(newFileName.toFileInfo().absolutePath());
 
     emit displayNameChanged(displayName());
 }
 
 QString DesignDocument::fileName() const
 {
-    return editor()->document()->filePath();
+    return editor()->document()->filePath().toString();
 }
 
 ProjectExplorer::Kit *DesignDocument::currentKit() const
@@ -243,7 +243,7 @@ void DesignDocument::loadDocument(QPlainTextEdit *edit)
 
     m_inFileComponentTextModifier.reset();
 
-    updateFileName(QString(), fileName());
+    updateFileName(Utils::FileName(), Utils::FileName::fromString(fileName()));
 
     m_documentLoaded = true;
 }
@@ -581,9 +581,8 @@ RewriterView *DesignDocument::rewriterView() const
 void DesignDocument::setEditor(Core::IEditor *editor)
 {
     m_textEditor = editor;
-    connect(editor->document(),
-            SIGNAL(filePathChanged(QString,QString)),
-            SLOT(updateFileName(QString,QString)));
+    connect(editor->document(), &Core::IDocument::filePathChanged,
+            this, &DesignDocument::updateFileName);
 
     updateActiveQtVersion();
 }
diff --git a/src/plugins/qmldesigner/components/integration/designdocument.h b/src/plugins/qmldesigner/components/integration/designdocument.h
index 7ff027235a7084fc6ff563823a76c5662dd2a35d..923089c62fc5f7259b5b77ab213a435dfd6bb9f0 100644
--- a/src/plugins/qmldesigner/components/integration/designdocument.h
+++ b/src/plugins/qmldesigner/components/integration/designdocument.h
@@ -126,7 +126,7 @@ public slots:
     void changeToMaster();
 
 private slots:
-    void updateFileName(const QString &oldFileName, const QString &newFileName);
+    void updateFileName(const Utils::FileName &oldFileName, const Utils::FileName &newFileName);
 
 private: // functions
     void changeToInFileComponentModel(ComponentTextModifier *textModifer);
diff --git a/src/plugins/qmldesigner/designmodewidget.cpp b/src/plugins/qmldesigner/designmodewidget.cpp
index f32557ba2ff168da4fb2664f35c21ec3d7595b19..3dadf47733f50d940b1317e024a8453ae12b1cf7 100644
--- a/src/plugins/qmldesigner/designmodewidget.cpp
+++ b/src/plugins/qmldesigner/designmodewidget.cpp
@@ -509,7 +509,7 @@ void DesignModeWidget::resizeEvent(QResizeEvent *event)
 void DesignModeWidget::setupNavigatorHistory(Core::IEditor *editor)
 {
     if (!m_keepNavigatorHistory)
-        addNavigatorHistoryEntry(editor->document()->filePath());
+        addNavigatorHistoryEntry(editor->document()->filePath().toString());
 
     const bool canGoBack = m_navigatorHistoryCounter > 0;
     const bool canGoForward = m_navigatorHistoryCounter < (m_navigatorHistory.size() - 1);
diff --git a/src/plugins/qmldesigner/qmldesignerplugin.cpp b/src/plugins/qmldesigner/qmldesignerplugin.cpp
index 337268887fa001840dade32cf9cc8dd904897a09..9ae249083ff21ed872f49dee1b68fa7aa25e897e 100644
--- a/src/plugins/qmldesigner/qmldesignerplugin.cpp
+++ b/src/plugins/qmldesigner/qmldesignerplugin.cpp
@@ -366,7 +366,7 @@ static bool checkIfEditorIsQtQuick(Core::IEditor *editor)
     if (editor)
     if (editor && editor->document()->id() == QmlJSEditor::Constants::C_QMLJSEDITOR_ID) {
         QmlJS::ModelManagerInterface *modelManager = QmlJS::ModelManagerInterface::instance();
-        QmlJS::Document::Ptr document = modelManager->ensuredGetDocumentForPath(editor->document()->filePath());
+        QmlJS::Document::Ptr document = modelManager->ensuredGetDocumentForPath(editor->document()->filePath().toString());
         if (!document.isNull())
             return document->language() == QmlJS::Dialect::QmlQtQuick1
                     || document->language() == QmlJS::Dialect::QmlQtQuick2
diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp
index 381dd05e892d7ecddf1da6e60f3b3da3b6a1c871..85652d9c6e7b79dee240948d340651f37aea02de 100644
--- a/src/plugins/qmljseditor/qmljseditor.cpp
+++ b/src/plugins/qmljseditor/qmljseditor.cpp
@@ -224,7 +224,7 @@ void QmlJSEditorWidget::updateCodeWarnings(QmlJS::Document::Ptr doc)
 void QmlJSEditorWidget::modificationChanged(bool changed)
 {
     if (!changed && m_modelManager)
-        m_modelManager->fileChangedOnDisk(textDocument()->filePath());
+        m_modelManager->fileChangedOnDisk(textDocument()->filePath().toString());
 }
 
 void QmlJSEditorWidget::jumpToOutlineElement(int /*index*/)
@@ -641,12 +641,12 @@ TextEditorWidget::Link QmlJSEditorWidget::findLinkAt(const QTextCursor &cursor,
 
 void QmlJSEditorWidget::findUsages()
 {
-    m_findReferences->findUsages(textDocument()->filePath(), textCursor().position());
+    m_findReferences->findUsages(textDocument()->filePath().toString(), textCursor().position());
 }
 
 void QmlJSEditorWidget::renameUsages()
 {
-    m_findReferences->renameUsages(textDocument()->filePath(), textCursor().position());
+    m_findReferences->renameUsages(textDocument()->filePath().toString(), textCursor().position());
 }
 
 void QmlJSEditorWidget::showContextPane()
@@ -846,7 +846,7 @@ AssistInterface *QmlJSEditorWidget::createAssistInterface(
     if (assistKind == TextEditor::Completion) {
         return new QmlJSCompletionAssistInterface(document(),
                                                   position(),
-                                                  textDocument()->filePath(),
+                                                  textDocument()->filePath().toString(),
                                                   reason,
                                                   m_qmlJsEditorDocument->semanticInfo());
     } else if (assistKind == TextEditor::QuickFix) {
diff --git a/src/plugins/qmljseditor/qmljseditordocument.cpp b/src/plugins/qmljseditor/qmljseditordocument.cpp
index 44b0b71fa6213cc38e12d041f6de047c2294dace..b56bfb44ef58bcc4c9239016f542170e83b46f27 100644
--- a/src/plugins/qmljseditor/qmljseditordocument.cpp
+++ b/src/plugins/qmljseditor/qmljseditordocument.cpp
@@ -451,7 +451,7 @@ QmlJSEditorDocumentPrivate::QmlJSEditorDocumentPrivate(QmlJSEditorDocument *pare
     m_updateOutlineModelTimer.setSingleShot(true);
     connect(&m_updateOutlineModelTimer, SIGNAL(timeout()), this, SLOT(updateOutlineModel()));
 
-    modelManager->updateSourceFiles(QStringList(parent->filePath()), false);
+    modelManager->updateSourceFiles(QStringList(parent->filePath().toString()), false);
 }
 
 QmlJSEditorDocumentPrivate::~QmlJSEditorDocumentPrivate()
@@ -468,13 +468,13 @@ void QmlJSEditorDocumentPrivate::invalidateFormatterCache()
 
 void QmlJSEditorDocumentPrivate::reparseDocument()
 {
-    ModelManagerInterface::instance()->updateSourceFiles(QStringList() << q->filePath(),
-                                                                false);
+    ModelManagerInterface::instance()->updateSourceFiles(QStringList(q->filePath().toString()),
+                                                         false);
 }
 
 void QmlJSEditorDocumentPrivate::onDocumentUpdated(Document::Ptr doc)
 {
-    if (q->filePath() != doc->fileName())
+    if (q->filePath().toString() != doc->fileName())
         return;
 
     // text document has changed, simply wait for the next onDocumentUpdated
diff --git a/src/plugins/qmljseditor/qmljsquickfixassist.cpp b/src/plugins/qmljseditor/qmljsquickfixassist.cpp
index a2c7a431090ac4f2c19242141b4b7609013df425..3f4055f0e3d936be5ddcb27af175cb076d6dc8a9 100644
--- a/src/plugins/qmljseditor/qmljsquickfixassist.cpp
+++ b/src/plugins/qmljseditor/qmljsquickfixassist.cpp
@@ -50,7 +50,7 @@ using namespace Internal;
 QmlJSQuickFixAssistInterface::QmlJSQuickFixAssistInterface(QmlJSEditorWidget *editor,
                                                            TextEditor::AssistReason reason)
     : AssistInterface(editor->document(), editor->position(),
-                      editor->textDocument()->filePath(), reason)
+                      editor->textDocument()->filePath().toString(), reason)
     , m_semanticInfo(editor->qmlJsEditorDocument()->semanticInfo())
     , m_currentFile(QmlJSRefactoringChanges::file(editor, m_semanticInfo.document))
 {}
diff --git a/src/plugins/qmljseditor/qmloutlinemodel.cpp b/src/plugins/qmljseditor/qmloutlinemodel.cpp
index d5fb9140631d93efa7182ec914581214a8d1d059..1be83168852bec68f6b68890aa6ec114dd9624a8 100644
--- a/src/plugins/qmljseditor/qmloutlinemodel.cpp
+++ b/src/plugins/qmljseditor/qmloutlinemodel.cpp
@@ -336,7 +336,7 @@ QMimeData *QmlOutlineModel::mimeData(const QModelIndexList &indexes) const
         QModelIndex index = indexes.at(i);
 
         AST::SourceLocation location = sourceLocation(index);
-        data->addFile(m_editorDocument->filePath(), location.startLine,
+        data->addFile(m_editorDocument->filePath().toString(), location.startLine,
                       location.startColumn - 1 /*editors have 0-based column*/);
 
         QList<int> rowPath;
diff --git a/src/plugins/qmljstools/qmljsmodelmanager.cpp b/src/plugins/qmljstools/qmljsmodelmanager.cpp
index ac4ab52c41d23b119d68d9a1da213db87f0eb377..7729f166b3bade581ddbbd8d34fd72a12a0272c2 100644
--- a/src/plugins/qmljstools/qmljsmodelmanager.cpp
+++ b/src/plugins/qmljstools/qmljsmodelmanager.cpp
@@ -251,7 +251,7 @@ ModelManagerInterface::WorkingCopy ModelManager::workingCopyInternal() const
 {
     WorkingCopy workingCopy;
     foreach (IDocument *document, DocumentModel::openedDocuments()) {
-        const QString key = document->filePath();
+        const QString key = document->filePath().toString();
         if (TextEditor::TextDocument *textDocument = qobject_cast<TextEditor::TextDocument *>(document)) {
             // TODO the language should be a property on the document, not the editor
             if (DocumentModel::editorsForDocument(document).first()->context().contains(ProjectExplorer::Constants::LANG_QMLJS))
diff --git a/src/plugins/qmlprojectmanager/qmlprojectfile.cpp b/src/plugins/qmlprojectmanager/qmlprojectfile.cpp
index 4294a65e7ec58d5c1ba70e3cc8184fd444fa3409..321b32ead81c0d03038e3bc8733029d5bec94888 100644
--- a/src/plugins/qmlprojectmanager/qmlprojectfile.cpp
+++ b/src/plugins/qmlprojectmanager/qmlprojectfile.cpp
@@ -36,7 +36,7 @@
 namespace QmlProjectManager {
 namespace Internal {
 
-QmlProjectFile::QmlProjectFile(QmlProject *parent, QString fileName)
+QmlProjectFile::QmlProjectFile(QmlProject *parent, const QString &fileName)
     : Core::IDocument(parent),
       m_project(parent)
 {
@@ -44,7 +44,7 @@ QmlProjectFile::QmlProjectFile(QmlProject *parent, QString fileName)
     QTC_CHECK(!fileName.isEmpty());
     setId("Qml.ProjectFile");
     setMimeType(QLatin1String(Constants::QMLPROJECT_MIMETYPE));
-    setFilePath(fileName);
+    setFilePath(Utils::FileName::fromString(fileName));
 }
 
 QmlProjectFile::~QmlProjectFile()
diff --git a/src/plugins/qmlprojectmanager/qmlprojectfile.h b/src/plugins/qmlprojectmanager/qmlprojectfile.h
index feb4e77d01b9b1ef3cfa2e7652b8571d259c284a..e1b5fbffc65fae79f9e342b0570800fc291dc319 100644
--- a/src/plugins/qmlprojectmanager/qmlprojectfile.h
+++ b/src/plugins/qmlprojectmanager/qmlprojectfile.h
@@ -44,7 +44,7 @@ class QmlProjectFile : public Core::IDocument
     Q_OBJECT
 
 public:
-    QmlProjectFile(QmlProject *parent, QString fileName);
+    QmlProjectFile(QmlProject *parent, const QString &fileName);
     virtual ~QmlProjectFile();
 
     virtual bool save(QString *errorString, const QString &fileName, bool autoSave);
diff --git a/src/plugins/qmlprojectmanager/qmlprojectnodes.cpp b/src/plugins/qmlprojectmanager/qmlprojectnodes.cpp
index c36a42dec2962599dfd29ac4f43dbcbf75c0da55..89b3c70a9d278ca175b6ade6156078ef6cbf8a27 100644
--- a/src/plugins/qmlprojectmanager/qmlprojectnodes.cpp
+++ b/src/plugins/qmlprojectmanager/qmlprojectnodes.cpp
@@ -42,11 +42,11 @@ namespace QmlProjectManager {
 namespace Internal {
 
 QmlProjectNode::QmlProjectNode(QmlProject *project, Core::IDocument *projectFile)
-    : ProjectExplorer::ProjectNode(QFileInfo(projectFile->filePath()).absoluteFilePath()),
+    : ProjectExplorer::ProjectNode(projectFile->filePath().toString()),
       m_project(project),
       m_projectFile(projectFile)
 {
-    setDisplayName(QFileInfo(projectFile->filePath()).completeBaseName());
+    setDisplayName(projectFile->filePath().toFileInfo().completeBaseName());
     // make overlay
     const QSize desiredSize = QSize(16, 16);
     const QIcon projectBaseIcon(QLatin1String(":/qmlproject/images/qmlfolder.png"));
@@ -63,7 +63,7 @@ Core::IDocument *QmlProjectNode::projectFile() const
 { return m_projectFile; }
 
 QString QmlProjectNode::projectFilePath() const
-{ return m_projectFile->filePath(); }
+{ return m_projectFile->filePath().toString(); }
 
 void QmlProjectNode::refresh()
 {
diff --git a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp
index 3d0eabf9af4dd789cbaf5b02d381d8cf33a91836..fdf637da7a6e42957237757fdd3d8de7533bfc83 100644
--- a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp
+++ b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp
@@ -257,7 +257,7 @@ void QmlProjectRunConfiguration::changeCurrentFile(IEditor *editor)
         editor = EditorManager::currentEditor();
 
     if (editor)
-        m_currentFileFilename = editor->document()->filePath();
+        m_currentFileFilename = editor->document()->filePath().toString();
     updateEnabled();
 }
 
@@ -267,7 +267,7 @@ void QmlProjectRunConfiguration::updateEnabled()
     if (mainScriptSource() == FileInEditor) {
         IDocument *document = EditorManager::currentDocument();
         if (document) {
-            m_currentFileFilename = document->filePath();
+            m_currentFileFilename = document->filePath().toString();
             if (MimeDatabase::findByFile(mainScript()).type() == QLatin1String("application/x-qml"))
                 qmlFileFound = true;
         }
diff --git a/src/plugins/qnx/bardescriptordocument.cpp b/src/plugins/qnx/bardescriptordocument.cpp
index bb53862c5c2d1f375466fc3f3185e9163d6fc333..263556eded52c3a0237235e7eecec2c908ed7331 100644
--- a/src/plugins/qnx/bardescriptordocument.cpp
+++ b/src/plugins/qnx/bardescriptordocument.cpp
@@ -68,7 +68,7 @@ bool BarDescriptorDocument::open(QString *errorString, const QString &fileName)
     if (read(fileName, &contents, errorString) != Utils::TextFileFormat::ReadSuccess)
         return false;
 
-    setFilePath(fileName);
+    setFilePath(Utils::FileName::fromString(fileName));
 
     const bool result = loadContent(contents, false);
 
@@ -83,7 +83,7 @@ bool BarDescriptorDocument::save(QString *errorString, const QString &fn, bool a
     QTC_ASSERT(!autoSave, return false);
     QTC_ASSERT(fn.isEmpty(), return false);
 
-    const bool result = write(filePath(), xmlSource(), errorString);
+    const bool result = write(filePath().toString(), xmlSource(), errorString);
     if (!result)
         return false;
 
@@ -94,14 +94,12 @@ bool BarDescriptorDocument::save(QString *errorString, const QString &fn, bool a
 
 QString BarDescriptorDocument::defaultPath() const
 {
-    QFileInfo fi(filePath());
-    return fi.absolutePath();
+    return filePath().toFileInfo().absolutePath();
 }
 
 QString BarDescriptorDocument::suggestedFileName() const
 {
-    QFileInfo fi(filePath());
-    return fi.fileName();
+    return filePath().toFileInfo().fileName();
 }
 
 bool BarDescriptorDocument::shouldAutoSave() const
@@ -135,7 +133,7 @@ bool BarDescriptorDocument::reload(QString *errorString, Core::IDocument::Reload
     if (flag == Core::IDocument::FlagIgnore)
         return true;
 
-    return open(errorString, filePath());
+    return open(errorString, filePath().toString());
 }
 
 QString BarDescriptorDocument::xmlSource() const
diff --git a/src/plugins/qnx/bardescriptoreditor.cpp b/src/plugins/qnx/bardescriptoreditor.cpp
index 188ef97158a734bf756386552dcc2307bdbae85e..b6d6ff81badd3c2b33a83e1bf3caac475c52f7ce 100644
--- a/src/plugins/qnx/bardescriptoreditor.cpp
+++ b/src/plugins/qnx/bardescriptoreditor.cpp
@@ -112,7 +112,7 @@ bool BarDescriptorEditor::open(QString *errorString, const QString &fileName, co
     if (result) {
         BarDescriptorEditorWidget *editorWidget = qobject_cast<BarDescriptorEditorWidget *>(widget());
         QTC_ASSERT(editorWidget, return false);
-        editorWidget->setFilePath(fileName);
+        editorWidget->setFilePath(Utils::FileName::fromString(fileName));
     }
 
     return result;
diff --git a/src/plugins/qnx/bardescriptoreditorwidget.cpp b/src/plugins/qnx/bardescriptoreditorwidget.cpp
index 525fb1f57f845fd651add95d1cc887cf5d7aae71..d0de2eef492dfbd1c004db4c08519905a94a1f8e 100644
--- a/src/plugins/qnx/bardescriptoreditorwidget.cpp
+++ b/src/plugins/qnx/bardescriptoreditorwidget.cpp
@@ -192,7 +192,7 @@ TextEditor::TextEditorWidget *BarDescriptorEditorWidget::sourceWidget() const
     return m_xmlSourceWidget;
 }
 
-void BarDescriptorEditorWidget::setFilePath(const QString &filePath)
+void BarDescriptorEditorWidget::setFilePath(const Utils::FileName &filePath)
 {
     Core::IDocument *doc = m_xmlSourceWidget->textDocument();
     if (doc)
@@ -211,7 +211,7 @@ void BarDescriptorEditorWidget::updateDocumentContent()
 
     if (!result) {
         ProjectExplorer::TaskHub::addTask(ProjectExplorer::Task::Error, errorMsg, Constants::QNX_TASK_CATEGORY_BARDESCRIPTOR,
-                                          Utils::FileName::fromString(barDescriptorDocument()->filePath()), errorLine);
+                                          Utils::FileName::fromString(barDescriptorDocument()->filePath().toString()), errorLine);
         ProjectExplorer::TaskHub::requestPopup();
     }
 }
diff --git a/src/plugins/qnx/bardescriptoreditorwidget.h b/src/plugins/qnx/bardescriptoreditorwidget.h
index dd893d037403d1fbf375fecd88730623ae98aaf4..95fd4fe101369c0c48eb5693d08a80b8a8745360 100644
--- a/src/plugins/qnx/bardescriptoreditorwidget.h
+++ b/src/plugins/qnx/bardescriptoreditorwidget.h
@@ -64,7 +64,7 @@ public:
 
     TextEditor::TextEditorWidget *sourceWidget() const;
 
-    void setFilePath(const QString &filePath);
+    void setFilePath(const Utils::FileName &filePath);
 
 signals:
     void changed(BarDescriptorDocument::Tag tag, const QVariant &value);
diff --git a/src/plugins/qnx/bardescriptorfilenodemanager.cpp b/src/plugins/qnx/bardescriptorfilenodemanager.cpp
index 008241f236b8c655255c3b4e17c5b46f34c79cb2..0d47584e7020c9a6b7ef3d3e1a289902315b6688 100644
--- a/src/plugins/qnx/bardescriptorfilenodemanager.cpp
+++ b/src/plugins/qnx/bardescriptorfilenodemanager.cpp
@@ -170,7 +170,7 @@ void BarDescriptorFileNodeManager::updateBarDescriptorNodes(ProjectExplorer::Pro
                         Core::MessageManager::write(tr("Cannot save bar descriptor file: %1").arg(errorMessage));
                         continue;
                     } else {
-                        oldDocument->setFilePath(package.appDescriptorPath());
+                        oldDocument->setFilePath(Utils::FileName::fromString(package.appDescriptorPath()));
 
                         if (!oldDocument->reload(&errorMessage, Core::IDocument::FlagReload, Core::IDocument::TypeContents))
                             Core::MessageManager::write(tr("Cannot reload bar descriptor file: %1").arg(errorMessage));
diff --git a/src/plugins/qtsupport/uicodemodelsupport.cpp b/src/plugins/qtsupport/uicodemodelsupport.cpp
index 888b0846225f28e5c4bccbc0f1a99043f8a9ebeb..9c3a1f6dc465774ce81b7bd35da425e23e572235 100644
--- a/src/plugins/qtsupport/uicodemodelsupport.cpp
+++ b/src/plugins/qtsupport/uicodemodelsupport.cpp
@@ -411,7 +411,7 @@ void UiCodeModelManager::editorIsAboutToClose(Core::IEditor *editor)
         if (isFormWindowDocument(m_lastEditor->document())) {
             disconnect(m_lastEditor->document(), SIGNAL(changed()), this, SLOT(uiDocumentContentsHasChanged()));
             if (m_dirty) {
-                updateContents(m_lastEditor->document()->filePath(),
+                updateContents(m_lastEditor->document()->filePath().toString(),
                                formWindowEditorContents(m_lastEditor));
                 m_dirty = false;
             }
@@ -427,7 +427,7 @@ void UiCodeModelManager::editorWasChanged(Core::IEditor *editor)
         disconnect(m_lastEditor->document(), SIGNAL(changed()), this, SLOT(uiDocumentContentsHasChanged()));
 
         if (m_dirty) {
-            updateContents(m_lastEditor->document()->filePath(),
+            updateContents(m_lastEditor->document()->filePath().toString(),
                            formWindowEditorContents(m_lastEditor));
             m_dirty = false;
         }
diff --git a/src/plugins/resourceeditor/resourceeditorw.cpp b/src/plugins/resourceeditor/resourceeditorw.cpp
index dc9fae45b104968fa39318a77512d51669046093..207a823346f63383a318f2efced5c16eccb09f8d 100644
--- a/src/plugins/resourceeditor/resourceeditorw.cpp
+++ b/src/plugins/resourceeditor/resourceeditorw.cpp
@@ -54,6 +54,8 @@
 #include <QInputDialog>
 #include <QClipboard>
 
+using namespace Utils;
+
 namespace ResourceEditor {
 namespace Internal {
 
@@ -68,7 +70,7 @@ ResourceEditorDocument::ResourceEditorDocument(ResourceEditorW *parent) :
 {
     setId(ResourceEditor::Constants::RESOURCEEDITOR_ID);
     setMimeType(QLatin1String(ResourceEditor::Constants::C_RESOURCE_MIMETYPE));
-    setFilePath(parent->m_resourceEditor->fileName());
+    setFilePath(FileName::fromString(parent->m_resourceEditor->fileName()));
     if (debugResourceEditorW)
         qDebug() <<  "ResourceEditorFile::ResourceEditorFile()";
 }
@@ -145,7 +147,7 @@ bool ResourceEditorW::open(QString *errorString, const QString &fileName, const
         return false;
     }
 
-    m_resourceDocument->setFilePath(fileName);
+    m_resourceDocument->setFilePath(FileName::fromString(fileName));
     m_resourceDocument->setBlockDirtyChanged(false);
     m_resourceEditor->setDirty(fileName != realFileName);
     m_shouldAutoSave = false;
@@ -158,23 +160,23 @@ bool ResourceEditorDocument::save(QString *errorString, const QString &name, boo
     if (debugResourceEditorW)
         qDebug(">ResourceEditorW::save: %s", qPrintable(name));
 
-    const QString oldFileName = filePath();
-    const QString actualName = name.isEmpty() ? oldFileName : name;
+    const FileName oldFileName = filePath();
+    const FileName actualName = name.isEmpty() ? oldFileName : FileName::fromString(name);
     if (actualName.isEmpty())
         return false;
 
     m_blockDirtyChanged = true;
-    m_parent->m_resourceEditor->setFileName(actualName);
+    m_parent->m_resourceEditor->setFileName(actualName.toString());
     if (!m_parent->m_resourceEditor->save()) {
         *errorString = m_parent->m_resourceEditor->errorMessage();
-        m_parent->m_resourceEditor->setFileName(oldFileName);
+        m_parent->m_resourceEditor->setFileName(oldFileName.toString());
         m_blockDirtyChanged = false;
         return false;
     }
 
     m_parent->m_shouldAutoSave = false;
     if (autoSave) {
-        m_parent->m_resourceEditor->setFileName(oldFileName);
+        m_parent->m_resourceEditor->setFileName(oldFileName.toString());
         m_parent->m_resourceEditor->setDirty(true);
         m_blockDirtyChanged = false;
         return true;
@@ -194,7 +196,7 @@ QString ResourceEditorDocument::plainText() const
 
 bool ResourceEditorDocument::setContents(const QByteArray &contents)
 {
-    Utils::TempFileSaver saver;
+    TempFileSaver saver;
     saver.write(contents);
     if (!saver.finalize(Core::ICore::mainWindow()))
         return false;
@@ -206,10 +208,10 @@ bool ResourceEditorDocument::setContents(const QByteArray &contents)
     return rc;
 }
 
-void ResourceEditorDocument::setFilePath(const QString &newName)
+void ResourceEditorDocument::setFilePath(const FileName &newName)
 {
-    if (newName != m_parent->m_resourceEditor->fileName())
-        m_parent->m_resourceEditor->setFileName(newName);
+    if (newName.toString() != m_parent->m_resourceEditor->fileName())
+        m_parent->m_resourceEditor->setFileName(newName.toString());
     IDocument::setFilePath(newName);
 }
 
@@ -246,7 +248,7 @@ bool ResourceEditorDocument::reload(QString *errorString, ReloadFlag flag, Chang
         emit changed();
     } else {
         emit aboutToReload();
-        QString fn = filePath();
+        QString fn = filePath().toString();
         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 908a93650610059c808678eb1c846a123dc8770f..7eac71e9bbc4c00ed0dc7d8a765761a014300ffd 100644
--- a/src/plugins/resourceeditor/resourceeditorw.h
+++ b/src/plugins/resourceeditor/resourceeditorw.h
@@ -65,7 +65,7 @@ public:
     bool reload(QString *errorString, ReloadFlag flag, ChangeType type);
     QString defaultPath() const;
     QString suggestedFileName() const;
-    void setFilePath(const QString &newName);
+    void setFilePath(const Utils::FileName &newName);
     void setBlockDirtyChanged(bool value);
 
 public slots:
diff --git a/src/plugins/resourceeditor/resourcenode.cpp b/src/plugins/resourceeditor/resourcenode.cpp
index cd5f855ac4d88b49ec2f208886c08b49757cc5fb..452c0503dbf110a062587b4b946706758b25ff86 100644
--- a/src/plugins/resourceeditor/resourcenode.cpp
+++ b/src/plugins/resourceeditor/resourcenode.cpp
@@ -445,7 +445,7 @@ ResourceFileWatcher::ResourceFileWatcher(ResourceTopLevelNode *node)
 {
     setId("ResourceNodeWatcher");
     setMimeType(QLatin1String(ResourceEditor::Constants::C_RESOURCE_MIMETYPE));
-    setFilePath(node->path());
+    setFilePath(Utils::FileName::fromString(node->path()));
 }
 
 bool ResourceFileWatcher::save(QString *errorString, const QString &fileName, bool autoSave)
diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp
index 7e69673bb083019b50256ff5fbb54304c3dc09d7..d462a52da35ed40b7ce4f82ae56077b145687b6a 100644
--- a/src/plugins/subversion/subversionplugin.cpp
+++ b/src/plugins/subversion/subversionplugin.cpp
@@ -468,7 +468,7 @@ bool SubversionPlugin::submitEditorAboutToClose()
 
     // Submit editor closing. Make it write out the commit message
     // and retrieve files
-    const QFileInfo editorFile(editorDocument->filePath());
+    const QFileInfo editorFile = editorDocument->filePath().toFileInfo();
     const QFileInfo changeFile(m_commitMessageFileName);
     if (editorFile.absoluteFilePath() != changeFile.absoluteFilePath())
         return true; // Oops?!
diff --git a/src/plugins/tasklist/taskfile.cpp b/src/plugins/tasklist/taskfile.cpp
index d3cd980b588a107c5fc13ffaad870a58580bd0ad..5882c36017e16036cc0d989975087c7142e90cdc 100644
--- a/src/plugins/tasklist/taskfile.cpp
+++ b/src/plugins/tasklist/taskfile.cpp
@@ -92,12 +92,12 @@ bool TaskFile::reload(QString *errorString, ReloadFlag flag, ChangeType type)
         deleteLater();
         return true;
     }
-    return open(errorString, filePath());
+    return open(errorString, filePath().toString());
 }
 
 bool TaskFile::open(QString *errorString, const QString &fileName)
 {
-    setFilePath(fileName);
+    setFilePath(Utils::FileName::fromString(fileName));
     return TaskListPlugin::loadFile(errorString, m_baseDir, fileName);
 }
 
diff --git a/src/plugins/tasklist/tasklistplugin.cpp b/src/plugins/tasklist/tasklistplugin.cpp
index 3b28f9e8d4866db55f03ecec94cb200b44536ba5..b06a2595ebd91b8b3ce784a166cf892f72114aee 100644
--- a/src/plugins/tasklist/tasklistplugin.cpp
+++ b/src/plugins/tasklist/tasklistplugin.cpp
@@ -169,7 +169,7 @@ static bool parseTaskFile(QString *errorString, const QString &base, const QStri
 Core::IDocument *TaskListPlugin::openTasks(const QString &base, const QString &fileName)
 {
     foreach (TaskFile *doc, m_openFiles) {
-        if (doc->filePath() == fileName)
+        if (doc->filePath().toString() == fileName)
             return doc;
     }
 
diff --git a/src/plugins/texteditor/codecselector.cpp b/src/plugins/texteditor/codecselector.cpp
index 0011f188a892cb3ebb2fa8f1fb9d6df9f061c884..cdf09bccbab56f62828775b81f8676d5c1c2f45f 100644
--- a/src/plugins/texteditor/codecselector.cpp
+++ b/src/plugins/texteditor/codecselector.cpp
@@ -78,7 +78,9 @@ CodecSelector::CodecSelector(QWidget *parent, TextDocument *doc)
     QString decodingErrorHint;
     if (m_hasDecodingError)
         decodingErrorHint = QLatin1Char('\n') + tr("The following encodings are likely to fit:");
-    m_label->setText(tr("Select encoding for \"%1\".%2").arg(QFileInfo(doc->filePath()).fileName()).arg(decodingErrorHint));
+    m_label->setText(tr("Select encoding for \"%1\".%2")
+                     .arg(doc->filePath().toFileInfo().fileName())
+                     .arg(decodingErrorHint));
 
     m_listWidget = new CodecListWidget(this);
     m_listWidget->setActivationMode(Utils::DoubleClickActivation);
diff --git a/src/plugins/texteditor/findincurrentfile.cpp b/src/plugins/texteditor/findincurrentfile.cpp
index b6546cd7d02f8de1f1397e1ddfd1e2959d489612..1c54e1c064000ddc43ba27cd7a36f4aef8fcf3e7 100644
--- a/src/plugins/texteditor/findincurrentfile.cpp
+++ b/src/plugins/texteditor/findincurrentfile.cpp
@@ -73,18 +73,18 @@ Utils::FileIterator *FindInCurrentFile::files(const QStringList &nameFilters,
 
 QVariant FindInCurrentFile::additionalParameters() const
 {
-    return qVariantFromValue(m_currentDocument->filePath());
+    return qVariantFromValue(m_currentDocument->filePath().toString());
 }
 
 QString FindInCurrentFile::label() const
 {
-    return tr("File \"%1\":").arg(QFileInfo(m_currentDocument->filePath()).fileName());
+    return tr("File \"%1\":").arg(m_currentDocument->filePath().toFileInfo().fileName());
 }
 
 QString FindInCurrentFile::toolTip() const
 {
     // %2 is filled by BaseFileFind::runNewSearch
-    return tr("File path: %1\n%2").arg(QDir::toNativeSeparators(m_currentDocument->filePath()));
+    return tr("File path: %1\n%2").arg(m_currentDocument->filePath().toUserOutput());
 }
 
 bool FindInCurrentFile::isEnabled() const
diff --git a/src/plugins/texteditor/refactoringchanges.cpp b/src/plugins/texteditor/refactoringchanges.cpp
index a85132c096b3d5c024f5869928034181adea0a4e..4c34d25293ab03fda2364f79280ff9ecbbc2120d 100644
--- a/src/plugins/texteditor/refactoringchanges.cpp
+++ b/src/plugins/texteditor/refactoringchanges.cpp
@@ -161,7 +161,7 @@ RefactoringFile::RefactoringFile(QTextDocument *document, const QString &fileNam
 { }
 
 RefactoringFile::RefactoringFile(TextEditorWidget *editor)
-    : m_fileName(editor->textDocument()->filePath())
+    : m_fileName(editor->textDocument()->filePath().toString())
     , m_document(0)
     , m_editor(editor)
     , m_openEditor(false)
diff --git a/src/plugins/texteditor/textdocument.cpp b/src/plugins/texteditor/textdocument.cpp
index 9e312eb29c8f7d3e5b3fe76f9b8defa5af7fe5df..d9b5e25023732081e2cb5bd591551eb1e9fc5153 100644
--- a/src/plugins/texteditor/textdocument.cpp
+++ b/src/plugins/texteditor/textdocument.cpp
@@ -231,7 +231,7 @@ QMap<QString, QString> TextDocument::openedTextDocumentContents()
         TextDocument *textEditorDocument = qobject_cast<TextDocument *>(document);
         if (!textEditorDocument)
             continue;
-        QString fileName = textEditorDocument->filePath();
+        QString fileName = textEditorDocument->filePath().toString();
         workingCopy[fileName] = textEditorDocument->plainText();
     }
     return workingCopy;
@@ -244,7 +244,7 @@ QMap<QString, QTextCodec *> TextDocument::openedTextDocumentEncodings()
         TextDocument *textEditorDocument = qobject_cast<TextDocument *>(document);
         if (!textEditorDocument)
             continue;
-        QString fileName = textEditorDocument->filePath();
+        QString fileName = textEditorDocument->filePath().toString();
         workingCopy[fileName] = const_cast<QTextCodec *>(textEditorDocument->codec());
     }
     return workingCopy;
@@ -466,7 +466,7 @@ bool TextDocument::save(QString *errorString, const QString &saveFileName, bool
         cursor.endEditBlock();
       }
 
-    QString fName = filePath();
+    QString fName = filePath().toString();
     if (!saveFileName.isEmpty())
         fName = saveFileName;
 
@@ -509,7 +509,7 @@ bool TextDocument::save(QString *errorString, const QString &saveFileName, bool
     // inform about the new filename
     const QFileInfo fi(fName);
     d->m_document.setModified(false); // also triggers update of the block revisions
-    setFilePath(QDir::cleanPath(fi.absoluteFilePath()));
+    setFilePath(Utils::FileName::fromUserInput(fi.absoluteFilePath()));
     emit changed();
     return true;
 }
@@ -524,12 +524,11 @@ bool TextDocument::shouldAutoSave() const
     return d->m_autoSaveRevision != d->m_document.revision();
 }
 
-void TextDocument::setFilePath(const QString &newName)
+void TextDocument::setFilePath(const Utils::FileName &newName)
 {
     if (newName == filePath())
         return;
-    const QFileInfo fi(newName);
-    IDocument::setFilePath(QDir::cleanPath(fi.absoluteFilePath()));
+    IDocument::setFilePath(Utils::FileName::fromUserInput(newName.toFileInfo().absoluteFilePath()));
 }
 
 bool TextDocument::isFileReadOnly() const
@@ -548,8 +547,7 @@ void TextDocument::checkPermissions()
 {
     bool previousReadOnly = d->m_fileIsReadOnly;
     if (!filePath().isEmpty()) {
-        const QFileInfo fi(filePath());
-        d->m_fileIsReadOnly = !fi.isWritable();
+        d->m_fileIsReadOnly = !filePath().toFileInfo().isWritable();
     } else {
         d->m_fileIsReadOnly = false;
     }
@@ -598,7 +596,7 @@ bool TextDocument::open(QString *errorString, const QString &fileName, const QSt
         documentLayout->lastSaveRevision = d->m_autoSaveRevision = d->m_document.revision();
         d->updateRevisions();
         d->m_document.setModified(fileName != realFileName);
-        setFilePath(QDir::cleanPath(fi.absoluteFilePath()));
+        setFilePath(Utils::FileName::fromUserInput(fi.absoluteFilePath()));
     }
     return readResult == Utils::TextFileFormat::ReadSuccess
            || readResult == Utils::TextFileFormat::ReadEncodingError;
@@ -620,7 +618,7 @@ bool TextDocument::reload(QString *errorString)
     if (documentLayout)
         marks = documentLayout->documentClosing(); // removes text marks non-permanently
 
-    bool success = open(errorString, filePath(), filePath());
+    bool success = open(errorString, filePath().toString(), filePath().toString());
 
     if (documentLayout)
         documentLayout->documentReloaded(marks, this); // re-adds text marks
diff --git a/src/plugins/texteditor/textdocument.h b/src/plugins/texteditor/textdocument.h
index e82e33f0faa262f2432140f1a181e9a89d3d089e..72a8f17119277a77ce60b40d295bc82b299e0ac2 100644
--- a/src/plugins/texteditor/textdocument.h
+++ b/src/plugins/texteditor/textdocument.h
@@ -111,7 +111,7 @@ public:
     bool isSaveAsAllowed() const;
     void checkPermissions();
     bool reload(QString *errorString, ReloadFlag flag, ChangeType type);
-    void setFilePath(const QString &newName);
+    void setFilePath(const Utils::FileName &newName);
 
     QString defaultPath() const;
     QString suggestedFileName() const;
diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp
index 243616be0972d42fc4896d8404e82c2734002dcf..28a328ae3e69950dfb0471cf57a2611ce627d665 100644
--- a/src/plugins/texteditor/texteditor.cpp
+++ b/src/plugins/texteditor/texteditor.cpp
@@ -2733,7 +2733,7 @@ void TextEditorWidgetPrivate::updateCodeFoldingVisible()
 
 void TextEditorWidgetPrivate::reconfigure()
 {
-    q->configureMimeType(MimeDatabase::findByFile(m_document->filePath()));
+    q->configureMimeType(MimeDatabase::findByFile(m_document->filePath().toString()));
 }
 
 bool TextEditorWidget::codeFoldingVisible() const
@@ -5360,7 +5360,7 @@ bool TextEditorWidget::openLink(const Link &link, bool inNextSplit)
     if (!link.hasValidTarget())
         return false;
 
-    if (!inNextSplit && textDocument()->filePath() == link.targetFileName) {
+    if (!inNextSplit && textDocument()->filePath().toString() == link.targetFileName) {
         EditorManager::addCurrentPositionToNavigationHistory();
         gotoLine(link.targetLine, link.targetColumn);
         setFocus();
@@ -7094,7 +7094,7 @@ AssistInterface *TextEditorWidget::createAssistInterface(AssistKind kind,
                                                              AssistReason reason) const
 {
     Q_UNUSED(kind);
-    return new AssistInterface(document(), position(), d->m_document->filePath(), reason);
+    return new AssistInterface(document(), position(), d->m_document->filePath().toString(), reason);
 }
 
 QString TextEditorWidget::foldReplacementText(const QTextBlock &) const
@@ -7198,7 +7198,7 @@ void TextEditorWidget::configureMimeType(const MimeType &mimeType)
                 setCodeFoldingSupported(true);
             }
         } else {
-            const QString &fileName = textDocument()->filePath();
+            const QString &fileName = textDocument()->filePath().toString();
             if (TextEditorSettings::highlighterSettings().isIgnoredFilePattern(fileName))
                 d->m_isMissingSyntaxDefinition = false;
         }
diff --git a/src/plugins/texteditor/textmark.cpp b/src/plugins/texteditor/textmark.cpp
index 2a33f888d77c190b8353eacaf7b76cab064b7718..9f8a729fa8bcfdbacf1b00de5a296abf013ddf9b 100644
--- a/src/plugins/texteditor/textmark.cpp
+++ b/src/plugins/texteditor/textmark.cpp
@@ -214,10 +214,10 @@ void TextMarkRegistry::editorOpened(Core::IEditor *editor)
     auto document = qobject_cast<TextDocument *>(editor ? editor->document() : 0);
     if (!document)
         return;
-    if (!m_marks.contains(FileName::fromString(document->filePath())))
+    if (!m_marks.contains(document->filePath()))
         return;
 
-    foreach (TextMark *mark, m_marks.value(FileName::fromString(document->filePath())))
+    foreach (TextMark *mark, m_marks.value(document->filePath()))
         document->addMark(mark);
 }
 
diff --git a/src/plugins/todo/todoitemsprovider.cpp b/src/plugins/todo/todoitemsprovider.cpp
index 24ddabdeecfdd1ecddb10d26373a450ec8caff16..ed63c80e9b25d1c7ab885ab152e1c19a2f31a8de 100644
--- a/src/plugins/todo/todoitemsprovider.cpp
+++ b/src/plugins/todo/todoitemsprovider.cpp
@@ -81,7 +81,7 @@ void TodoItemsProvider::updateList()
     // Show only items of the current file if any
     if (m_settings.scanningScope == ScanningScopeCurrentFile) {
         if (m_currentEditor)
-            m_itemsList = m_itemsHash.value(m_currentEditor->document()->filePath());
+            m_itemsList = m_itemsHash.value(m_currentEditor->document()->filePath().toString());
     // Show only items of the startup project if any
     } else {
         if (m_startupProject)
diff --git a/src/plugins/valgrind/callgrindtool.cpp b/src/plugins/valgrind/callgrindtool.cpp
index 23b2d2775d8c3169d5927251ccdd155a35e6596c..48e2ff8b15b22bb9877674a0544ab544db332aa2 100644
--- a/src/plugins/valgrind/callgrindtool.cpp
+++ b/src/plugins/valgrind/callgrindtool.cpp
@@ -872,7 +872,7 @@ void CallgrindToolPrivate::requestContextMenu(TextEditorWidget *widget, int line
     // find callgrind text mark that corresponds to this editor's file and line number
     const Function *func = 0;
     foreach (CallgrindTextMark *textMark, m_textMarks) {
-        if (textMark->fileName() == widget->textDocument()->filePath() && textMark->lineNumber() == line) {
+        if (textMark->fileName() == widget->textDocument()->filePath().toString() && textMark->lineNumber() == line) {
             func = textMark->function();
             break;
         }
diff --git a/src/plugins/vcsbase/submiteditorfile.cpp b/src/plugins/vcsbase/submiteditorfile.cpp
index 84cab62a4d268c913a666edd3ecbff9b075c87f5..71a1b40dd5b67eab3e744f53549eacb6c641453f 100644
--- a/src/plugins/vcsbase/submiteditorfile.cpp
+++ b/src/plugins/vcsbase/submiteditorfile.cpp
@@ -38,6 +38,7 @@
 
 using namespace VcsBase;
 using namespace VcsBase::Internal;
+using namespace Utils;
 
 /*!
     \class VcsBase::Internal::SubmitEditorFile
@@ -71,15 +72,15 @@ void SubmitEditorFile::setModified(bool modified)
 
 bool SubmitEditorFile::save(QString *errorString, const QString &fileName, bool autoSave)
 {
-    const QString fName = fileName.isEmpty() ? filePath() : fileName;
-    Utils::FileSaver saver(fName, QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text);
+    const FileName fName = fileName.isEmpty() ? filePath() : FileName::fromString(fileName);
+    FileSaver saver(fName.toString(),
+                    QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text);
     saver.write(m_editor->fileContents());
     if (!saver.finalize(errorString))
         return false;
     if (autoSave)
         return true;
-    const QFileInfo fi(fName);
-    setFilePath(fi.absoluteFilePath());
+    setFilePath(FileName::fromUserInput(fName.toFileInfo().absoluteFilePath()));
     setModified(false);
     if (!errorString->isEmpty())
         return false;
diff --git a/src/plugins/vcsbase/vcsbaseeditor.cpp b/src/plugins/vcsbase/vcsbaseeditor.cpp
index 1c999c9ee323d0d0d2f21d8b65a9e69edbedf959..8755a4c0914e6551894ecb4b3fb42ec9bdc254b3 100644
--- a/src/plugins/vcsbase/vcsbaseeditor.cpp
+++ b/src/plugins/vcsbase/vcsbaseeditor.cpp
@@ -1221,7 +1221,7 @@ static QTextCodec *findProjectCodec(const QString &dir)
         const ProjectList::const_iterator pcend = projects.constEnd();
         for (ProjectList::const_iterator it = projects.constBegin(); it != pcend; ++it)
             if (const Core::IDocument *document = (*it)->document())
-                if (document->filePath().startsWith(dir)) {
+                if (document->filePath().toString().startsWith(dir)) {
                     QTextCodec *codec = (*it)->editorConfiguration()->textCodec();
                     return codec;
                 }
@@ -1267,7 +1267,7 @@ int VcsBaseEditor::lineNumberOfCurrentEditor(const QString &currentFile)
         return -1;
     if (!currentFile.isEmpty()) {
         const Core::IDocument *idocument  = ed->document();
-        if (!idocument || idocument->filePath() != currentFile)
+        if (!idocument || idocument->filePath().toString() != currentFile)
             return -1;
     }
     const BaseTextEditor *eda = qobject_cast<const BaseTextEditor *>(ed);
diff --git a/src/plugins/vcsbase/vcsbaseplugin.cpp b/src/plugins/vcsbase/vcsbaseplugin.cpp
index 461312d461b104b6a4fa5ee6f9d0d7d0ad1d55ae..d17ee8e210a20415cf342b4ea38302892eed6fe8 100644
--- a/src/plugins/vcsbase/vcsbaseplugin.cpp
+++ b/src/plugins/vcsbase/vcsbaseplugin.cpp
@@ -261,7 +261,7 @@ void StateListener::slotStateChanged()
     if (!currentDocument) {
         state.currentFile.clear();
     } else {
-        state.currentFile = currentDocument->filePath();
+        state.currentFile = currentDocument->filePath().toString();
         if (state.currentFile.isEmpty() || currentDocument->isTemporary())
             state.currentFile = VcsBasePlugin::source(currentDocument);
     }
@@ -676,7 +676,7 @@ void VcsBasePlugin::createRepository()
     // Find current starting directory
     QString directory;
     if (const Project *currentProject = ProjectTree::currentProject())
-        directory = QFileInfo(currentProject->document()->filePath()).absolutePath();
+        directory = currentProject->document()->filePath().toFileInfo().absolutePath();
     // Prompt for a directory that is not under version control yet
     QWidget *mw = ICore::mainWindow();
     do {
diff --git a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp
index 31b0d0389bea544cb05e4c25bbece341f4eb4bc5..0574bc1e3ff396d055cd1a83424e04a016f4e5c3 100644
--- a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp
+++ b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp
@@ -372,7 +372,7 @@ bool VcsBaseSubmitEditor::open(QString *errorString, const QString &fileName, co
     if (!setFileContents(text.toUtf8()))
         return false;
 
-    d->m_file->setFilePath(QFileInfo(fileName).absoluteFilePath());
+    d->m_file->setFilePath(Utils::FileName::fromString(fileName));
     d->m_file->setModified(fileName != realFileName);
     return true;
 }