diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp
index 6e006053c417f971204f47a4984899ac666214a9..ab7fbde24f52504abb7789deec022d8515851b20 100644
--- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp
@@ -93,7 +93,7 @@ QString CMakeBuildConfiguration::buildDirectory() const
 {
     QString buildDirectory = m_buildDirectory;
     if (buildDirectory.isEmpty())
-        buildDirectory = cmakeTarget()->cmakeProject()->sourceDirectory() + "/qtcreator-build";
+        buildDirectory = target()->project()->projectDirectory() + "/qtcreator-build";
     return buildDirectory;
 }
 
@@ -221,7 +221,7 @@ CMakeBuildConfiguration *CMakeBuildConfigurationFactory::create(ProjectExplorer:
     cleanMakeStep->setClean(true);
 
     CMakeOpenProjectWizard copw(cmtarget->cmakeProject()->projectManager(),
-                                cmtarget->cmakeProject()->sourceDirectory(),
+                                cmtarget->project()->projectDirectory(),
                                 bc->buildDirectory(),
                                 bc->environment());
     if (copw.exec() != QDialog::Accepted) {
diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
index 0ef66e8f20ec8aa453a0a11dbf51413e629561b9..f9094c975e8377faaed20dc0c70bb0d4df1f5296 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
@@ -156,11 +156,6 @@ void CMakeProject::changeBuildDirectory(CMakeBuildConfiguration *bc, const QStri
     parseCMakeLists();
 }
 
-QString CMakeProject::sourceDirectory() const
-{
-    return QFileInfo(m_fileName).absolutePath();
-}
-
 bool CMakeProject::parseCMakeLists()
 {
     if (!activeTarget() ||
@@ -198,7 +193,7 @@ bool CMakeProject::parseCMakeLists()
             projectFiles.insert(node->path());
     } else {
         // Manually add the CMakeLists.txt file
-        QString cmakeListTxt = sourceDirectory() + "/CMakeLists.txt";
+        QString cmakeListTxt = projectDirectory() + "/CMakeLists.txt";
         fileList.append(new ProjectExplorer::FileNode(cmakeListTxt, ProjectExplorer::ProjectFileType, false));
         projectFiles.insert(cmakeListTxt);
     }
@@ -240,7 +235,7 @@ bool CMakeProject::parseCMakeLists()
             allIncludePaths.append(headerPath.path());
     }
     // This explicitly adds -I. to the include paths
-    allIncludePaths.append(sourceDirectory());
+    allIncludePaths.append(projectDirectory());
 
     allIncludePaths.append(cbpparser.includeFiles());
     CppTools::CppModelManagerInterface *modelmanager =
@@ -479,7 +474,7 @@ bool CMakeProject::fromMap(const QVariantMap &map)
         // Ask the user for where he wants to build it
         // and the cmake command line
 
-        CMakeOpenProjectWizard copw(m_manager, sourceDirectory(), ProjectExplorer::Environment::systemEnvironment());
+        CMakeOpenProjectWizard copw(m_manager, projectDirectory(), ProjectExplorer::Environment::systemEnvironment());
         if (copw.exec() != QDialog::Accepted)
             return false;
 
@@ -641,7 +636,7 @@ void CMakeBuildSettingsWidget::init(BuildConfiguration *bc)
 {
     m_buildConfiguration = static_cast<CMakeBuildConfiguration *>(bc);
     m_pathLineEdit->setText(m_buildConfiguration->buildDirectory());
-    if (m_buildConfiguration->buildDirectory() == m_project->sourceDirectory())
+    if (m_buildConfiguration->buildDirectory() == m_project->projectDirectory())
         m_changeButton->setEnabled(false);
     else
         m_changeButton->setEnabled(true);
@@ -650,7 +645,7 @@ void CMakeBuildSettingsWidget::init(BuildConfiguration *bc)
 void CMakeBuildSettingsWidget::openChangeBuildDirectoryDialog()
 {
     CMakeOpenProjectWizard copw(m_project->projectManager(),
-                                m_project->sourceDirectory(),
+                                m_project->projectDirectory(),
                                 m_buildConfiguration->buildDirectory(),
                                 m_buildConfiguration->environment());
     if (copw.exec() == QDialog::Accepted) {
diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.h b/src/plugins/cmakeprojectmanager/cmakeproject.h
index 62612c0f7c7b52b4f92ed537a94db49ecb9162b5..407bd58d5f897522a90fe740c566bd0ebc6bb5ee 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.h
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.h
@@ -97,8 +97,6 @@ public:
 
     CMakeBuildTarget buildTargetForTitle(const QString &title);
 
-    QString sourceDirectory() const;
-
     bool parseCMakeLists();
 
 signals:
diff --git a/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp b/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp
index b35000b40e409ef2bf5d2a6018d06d5235997f43..72c96f8da880b3d543ef3c4477a4a763ed58c095 100644
--- a/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp
+++ b/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp
@@ -77,7 +77,7 @@ QVariantMap GenericBuildConfiguration::toMap() const
 
 bool GenericBuildConfiguration::fromMap(const QVariantMap &map)
 {
-    m_buildDirectory = map.value(QLatin1String(BUILD_DIRECTORY_KEY)).toString();
+    m_buildDirectory = map.value(QLatin1String(BUILD_DIRECTORY_KEY), target()->project()->projectDirectory()).toString();
 
     return BuildConfiguration::fromMap(map);
 }
@@ -90,8 +90,7 @@ ProjectExplorer::Environment GenericBuildConfiguration::environment() const
 QString GenericBuildConfiguration::buildDirectory() const
 {
     // Convert to absolute path when necessary
-    const QFileInfo projectFile(target()->project()->file()->fileName());
-    const QDir projectDir(projectFile.path());
+    const QDir projectDir(target()->project()->projectDirectory());
     return projectDir.absoluteFilePath(m_buildDirectory);
 }
 
diff --git a/src/plugins/genericprojectmanager/generictarget.cpp b/src/plugins/genericprojectmanager/generictarget.cpp
index cabd75cfbeaaed6d4fdcef3737673cd6561b632f..d62630317e9ec95b298b8c8a10d07387dc7368a5 100644
--- a/src/plugins/genericprojectmanager/generictarget.cpp
+++ b/src/plugins/genericprojectmanager/generictarget.cpp
@@ -141,8 +141,7 @@ GenericTarget *GenericTargetFactory::create(ProjectExplorer::Project *parent, co
 
     makeStep->setBuildTarget("all", /* on = */ true);
 
-    const QFileInfo fileInfo(genericproject->file()->fileName());
-    bc->setBuildDirectory(fileInfo.absolutePath());
+    bc->setBuildDirectory(genericproject->projectDirectory());
 
     t->addBuildConfiguration(bc);
 
diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp
index 9ca03a39934c293b782e08da6691dccd9749bb04..fb6793b9d557ce178a2f5fbcad6ece10ffe62359 100644
--- a/src/plugins/projectexplorer/project.cpp
+++ b/src/plugins/projectexplorer/project.cpp
@@ -227,6 +227,12 @@ QVariantMap Project::toMap() const
     return map;
 }
 
+QString Project::projectDirectory() const
+{
+    QFileInfo info(file()->fileName());
+    return info.absoluteDir().path();
+}
+
 bool Project::fromMap(const QVariantMap &map)
 {
     if (map.contains(QLatin1String(EDITOR_SETTINGS_KEY))) {
diff --git a/src/plugins/projectexplorer/project.h b/src/plugins/projectexplorer/project.h
index 87599ab702cc9683c0466d293c4fc5976c331a49..10b6bb3953f922fab2ef085acd37fba66605567b 100644
--- a/src/plugins/projectexplorer/project.h
+++ b/src/plugins/projectexplorer/project.h
@@ -128,6 +128,9 @@ public:
     //       creating new BuilConfigurations.
     virtual QVariantMap toMap() const;
 
+    // The directory that holds the project file. This includes the absolute path.
+    QString projectDirectory() const;
+
 signals:
     void fileListChanged();
 
diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp
index 91536d39bd292fc7df2579efcd219ac47906fb51..40be6f84bc30fef808db7f482384d0765fdcd018 100644
--- a/src/plugins/projectexplorer/projectexplorer.cpp
+++ b/src/plugins/projectexplorer/projectexplorer.cpp
@@ -912,8 +912,7 @@ void ProjectExplorerPlugin::newProject()
 
     QString defaultLocation;
     if (currentProject()) {
-        const QFileInfo file(currentProject()->file()->fileName());
-        QDir dir = file.dir();
+        QDir dir(currentProject()->projectDirectory());
         dir.cdUp();
         defaultLocation = dir.absolutePath();
     }
diff --git a/src/plugins/qt4projectmanager/externaleditors.cpp b/src/plugins/qt4projectmanager/externaleditors.cpp
index 8025bde6e283fcfbb20fea1673aaa0c374028572..d79f6f2b93068e29c0fc83e5a4ff38b23be5c41b 100644
--- a/src/plugins/qt4projectmanager/externaleditors.cpp
+++ b/src/plugins/qt4projectmanager/externaleditors.cpp
@@ -146,7 +146,7 @@ bool ExternalQtEditor::getEditorLaunchData(const QString &fileName,
         Qt4BuildConfiguration *qt4bc = project->activeTarget()->activeBuildConfiguration();
         const QtVersion *qtVersion = qt4bc->qtVersion();
         data->binary = (qtVersion->*commandAccessor)();
-        data->workingDirectory = QFileInfo(project->file()->fileName()).absolutePath();
+        data->workingDirectory = project->projectDirectory();
     } else {
         data->workingDirectory.clear();
         data->binary = Utils::SynchronousProcess::locateBinary(fallbackBinary);
diff --git a/src/plugins/qt4projectmanager/projectloadwizard.cpp b/src/plugins/qt4projectmanager/projectloadwizard.cpp
index b54438e5d94913030d3901e945b92ccd973ba8a2..d1c8e55014a44b1f710cc5ad0673717ebf49dacd 100644
--- a/src/plugins/qt4projectmanager/projectloadwizard.cpp
+++ b/src/plugins/qt4projectmanager/projectloadwizard.cpp
@@ -53,7 +53,7 @@ ProjectLoadWizard::ProjectLoadWizard(Qt4Project *project, QWidget *parent, Qt::W
 {
     setWindowTitle(tr("Import existing build settings"));
     QtVersionManager * vm = QtVersionManager::instance();
-    QString directory = QFileInfo(project->file()->fileName()).absolutePath();
+    QString directory = project->projectDirectory();
     QString importVersion =  QtVersionManager::findQMakeBinaryFromMakefile(directory);
 
     if (!importVersion.isNull()) {
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp
index 47fe16422319d246e2ca2257b8134aa28b320124..b970eb7a01c43dadda5c5f4d959078d8ca2dfc6a 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp
@@ -164,8 +164,7 @@ QVariantMap MaemoRunConfiguration::toMap() const
 
     map.insert(SimulatorPathKey, m_simulatorPath);
 
-    const QDir &dir = QFileInfo(qt4Target()->qt4Project()->file()->fileName())
-        .absoluteDir();
+    const QDir dir = QDir(target()->project()->projectDirectory());
     map.insert(ProFileKey, dir.relativeFilePath(m_proFilePath));
 
     return map;
@@ -196,8 +195,7 @@ bool MaemoRunConfiguration::fromMap(const QVariantMap &map)
 
     m_simulatorPath = map.value(SimulatorPathKey).toString();
 
-    const QDir &dir = QFileInfo(qt4Target()->qt4Project()->file()->fileName())
-        .absoluteDir();
+    const QDir dir = QDir(target()->project()->projectDirectory());
     m_proFilePath = dir.filePath(map.value(ProFileKey).toString());
 
     return true;
@@ -405,7 +403,7 @@ void MaemoRunConfiguration::updateSimulatorInformation() const
             "simulator image.").arg(m_simulatorPath);
     }
 
-    QDir dir(m_simulatorPath);
+    QDir dir = QDir(m_simulatorPath);
     if (!m_simulatorPath.isEmpty() && dir.exists(m_simulatorPath)) {
         const QStringList &files = dir.entryList(QDir::Files | QDir::NoSymLinks
             | QDir::NoDotAndDotDot);
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp
index f427645c444eb85b0f155b0d56617c47edd54fcd..8b06d7ca500c4d28dfd3bb578d8b3e77096345ca 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp
@@ -201,7 +201,7 @@ QWidget *S60DeviceRunConfiguration::configurationWidget()
 QVariantMap S60DeviceRunConfiguration::toMap() const
 {
     QVariantMap map(ProjectExplorer::RunConfiguration::toMap());
-    const QDir projectDir = QFileInfo(target()->project()->file()->fileName()).absoluteDir();
+    const QDir projectDir = QDir(target()->project()->projectDirectory());
 
     map.insert(QLatin1String(PRO_FILE_KEY), projectDir.relativeFilePath(m_proFilePath));
     map.insert(QLatin1String(SIGNING_MODE_KEY), (int)m_signingMode);
@@ -215,7 +215,7 @@ QVariantMap S60DeviceRunConfiguration::toMap() const
 
 bool S60DeviceRunConfiguration::fromMap(const QVariantMap &map)
 {
-    const QDir projectDir = QFileInfo(target()->project()->file()->fileName()).absoluteDir();
+    const QDir projectDir = QDir(target()->project()->projectDirectory());
 
     m_proFilePath = projectDir.filePath(map.value(QLatin1String(PRO_FILE_KEY)).toString());
     m_signingMode = static_cast<SigningMode>(map.value(QLatin1String(SIGNING_MODE_KEY)).toInt());
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp
index 5c1c10355cd0b671701e87966c47e5b3995dcff4..d6b1c54d9df880dc5a8bf85bce6c4be0bfd05fd4 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp
@@ -134,14 +134,14 @@ QWidget *S60EmulatorRunConfiguration::configurationWidget()
 QVariantMap S60EmulatorRunConfiguration::toMap() const
 {
     QVariantMap map(ProjectExplorer::RunConfiguration::toMap());
-    const QDir projectDir = QFileInfo(target()->project()->file()->fileName()).absoluteDir();
+    const QDir projectDir = QDir(target()->project()->projectDirectory());
     map.insert(QLatin1String(PRO_FILE_KEY), projectDir.relativeFilePath(m_proFilePath));
     return map;
 }
 
 bool S60EmulatorRunConfiguration::fromMap(const QVariantMap &map)
 {
-    const QDir projectDir = QFileInfo(target()->project()->file()->fileName()).absoluteDir();
+    const QDir projectDir = QDir(target()->project()->projectDirectory());
     m_proFilePath = projectDir.filePath(map.value(QLatin1String(PRO_FILE_KEY)).toString());
 
     return RunConfiguration::fromMap(map);
diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
index 5926a0f6b0616d81945146dbb5f941fd922fc87a..3e857f59fbe130f23360a697c1ab2fde3dec4271 100644
--- a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
@@ -190,7 +190,7 @@ QString Qt4BuildConfiguration::buildDirectory() const
     if (m_shadowBuild)
         workingDirectory = m_buildDirectory;
     if (workingDirectory.isEmpty())
-        workingDirectory = QFileInfo(target()->project()->file()->fileName()).absolutePath();
+        workingDirectory = target()->project()->projectDirectory();
     return workingDirectory;
 }
 
diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp
index 536080086f5ab0f9d92802ad7bcf303a30560245..739ccd8d063bd486e7fb920377291acbe2ed7b8e 100644
--- a/src/plugins/qt4projectmanager/qt4project.cpp
+++ b/src/plugins/qt4projectmanager/qt4project.cpp
@@ -1128,7 +1128,7 @@ void Qt4Project::notifyChanged(const QString &name)
 //    // adjust the build directory of the sub-project.
 //    if (project()->file()->fileName().startsWith(qtSourceDir) && qtSourceDir != currentQtDir) {
 //        project()->setValue(buildConfiguration, "useShadowBuild", true);
-//        QString buildDir = QFileInfo(project()->file()->fileName()).absolutePath();
+//        QString buildDir = project()->projectDirectory();
 //        buildDir.replace(qtSourceDir, currentQtDir);
 //        project()->setValue(buildConfiguration, "buildDirectory", buildDir);
 //        project()->setValue(buildConfiguration, "autoShadowBuild", true);
diff --git a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp
index 96781714567e3b1727c6ea5fc3dbee84560ac538..142e6cee0b93b3e14479f9e031d2a9b129bb556d 100644
--- a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp
+++ b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp
@@ -249,7 +249,7 @@ void Qt4ProjectConfigWidget::buildDirectoryChanged()
 
 void Qt4ProjectConfigWidget::onBeforeBeforeShadowBuildDirBrowsed()
 {
-    QString initialDirectory = QFileInfo(m_buildConfiguration->target()->project()->file()->fileName()).absolutePath();
+    QString initialDirectory = m_buildConfiguration->target()->project()->projectDirectory();
     if (!initialDirectory.isEmpty())
         m_ui->shadowBuildDirEdit->setInitialBrowsePathBackup(initialDirectory);
 }
@@ -320,7 +320,7 @@ void Qt4ProjectConfigWidget::updateImportLabel()
     }
 
     QString sourceDirectory =
-            QFileInfo(m_buildConfiguration->qt4Target()->qt4Project()->file()->fileName()).absolutePath();
+            m_buildConfiguration->target()->project()->projectDirectory();
     if (!sourceDirectory.endsWith('/'))
         sourceDirectory.append('/');
     bool invalidBuildDirectory = m_buildConfiguration->shadowBuild()
diff --git a/src/plugins/qt4projectmanager/qt4runconfiguration.cpp b/src/plugins/qt4projectmanager/qt4runconfiguration.cpp
index 604dbe80fad37e2f794877503aeb7110668a8919..826ab256a98781010029c80100408bebc4b1756c 100644
--- a/src/plugins/qt4projectmanager/qt4runconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt4runconfiguration.cpp
@@ -446,7 +446,7 @@ QWidget *Qt4RunConfiguration::configurationWidget()
 
 QVariantMap Qt4RunConfiguration::toMap() const
 {
-    const QDir projectDir = QFileInfo(target()->project()->file()->fileName()).absoluteDir();
+    const QDir projectDir = QDir(target()->project()->projectDirectory());
     QVariantMap map(LocalApplicationRunConfiguration::toMap());
     map.insert(QLatin1String(COMMAND_LINE_ARGUMENTS_KEY), m_commandLineArguments);
     map.insert(QLatin1String(PRO_FILE_KEY), projectDir.relativeFilePath(m_proFilePath));
@@ -462,7 +462,7 @@ QVariantMap Qt4RunConfiguration::toMap() const
 
 bool Qt4RunConfiguration::fromMap(const QVariantMap &map)
 {
-    const QDir projectDir = QFileInfo(target()->project()->file()->fileName()).absoluteDir();
+    const QDir projectDir = QDir(target()->project()->projectDirectory());
     m_commandLineArguments = map.value(QLatin1String(COMMAND_LINE_ARGUMENTS_KEY)).toStringList();
     m_proFilePath = projectDir.filePath(map.value(QLatin1String(PRO_FILE_KEY)).toString());
     m_userSetName = map.value(QLatin1String(USER_SET_NAME_KEY), false).toBool();
diff --git a/src/plugins/vcsbase/vcsbaseplugin.cpp b/src/plugins/vcsbase/vcsbaseplugin.cpp
index 2dc0eae9649b9f991decc2ba4195f12896b29719..bfa7f80ddecd5b7ecdc9db727df1979bb9fadd05 100644
--- a/src/plugins/vcsbase/vcsbaseplugin.cpp
+++ b/src/plugins/vcsbase/vcsbaseplugin.cpp
@@ -197,7 +197,7 @@ void StateListener::slotStateChanged()
     // Check for project, find the control
     Core::IVersionControl *projectControl = 0;
     if (const ProjectExplorer::Project *currentProject = pe->currentProject()) {
-        state.currentProjectPath = QFileInfo(currentProject->file()->fileName()).absolutePath();
+        state.currentProjectPath = currentProject->projectDirectory();
         state.currentProjectName = currentProject->displayName();
         projectControl = vcsManager->findVersionControlForDirectory(state.currentProjectPath,
                                                                     &state.currentProjectTopLevel);