diff --git a/src/plugins/cpptools/cpptoolsplugin.cpp b/src/plugins/cpptools/cpptoolsplugin.cpp
index 51a72835b152dac79c72c6b302613448c4346350..94e91f75c7cdaf8df5b48be06600f8658f496f0d 100644
--- a/src/plugins/cpptools/cpptoolsplugin.cpp
+++ b/src/plugins/cpptools/cpptoolsplugin.cpp
@@ -170,24 +170,24 @@ void CppToolsPlugin::switchHeaderSource()
         editorManager->openEditor(otherFile);
 }
 
-QFileInfo CppToolsPlugin::findFile(const QDir &dir, const QString &name,
-                                   const ProjectExplorer::Project *project) const
+static QFileInfo findFileInProject(const QString &name,
+                                   const ProjectExplorer::Project *project)
 {
     if (debug)
-        qDebug() << Q_FUNC_INFO << dir << name;
-
-    QFileInfo fileInSameDir(dir, name);
-    if (project && !fileInSameDir.isFile()) {
-        QString pattern = QString(1, QLatin1Char('/'));
-        pattern += name;
-        const QStringList projectFiles = project->files(ProjectExplorer::Project::AllFiles);
-        const QStringList::const_iterator pcend = projectFiles.constEnd();
-        for (QStringList::const_iterator it = projectFiles.constBegin(); it != pcend; ++it)
-            if (it->endsWith(pattern))
-                return QFileInfo(*it);
+        qDebug() << Q_FUNC_INFO << name << project;
+
+    if (!project)
         return QFileInfo();
+
+    QString pattern = QString(1, QLatin1Char('/'));
+    pattern += name;
+    const QStringList projectFiles = project->files(ProjectExplorer::Project::AllFiles);
+    const QStringList::const_iterator pcend = projectFiles.constEnd();
+    for (QStringList::const_iterator it = projectFiles.constBegin(); it != pcend; ++it) {
+        if (it->endsWith(pattern))
+            return QFileInfo(*it);
     }
-    return fileInSameDir;
+    return QFileInfo();
 }
 
 // Figure out file type
@@ -237,6 +237,19 @@ static QStringList matchingCandidateSuffixes(const Core::MimeDatabase *mimeDatas
     return QStringList();
 }
 
+static QStringList baseNameWithAllSuffixes(const QString &baseName, const QStringList &suffixes)
+{
+    QStringList result;
+    const QChar dot = QLatin1Char('.');
+    foreach (const QString &suffix, suffixes) {
+        QString fileName = baseName;
+        fileName += dot;
+        fileName += suffix;
+        result += fileName;
+    }
+    return result;
+}
+
 QString CppToolsPlugin::correspondingHeaderOrSourceI(const QString &fileName) const
 {
     const Core::ICore *core = Core::ICore::instance();
@@ -254,49 +267,41 @@ QString CppToolsPlugin::correspondingHeaderOrSourceI(const QString &fileName) co
     if (type == UnknownType)
         return QString();
 
-    const QDir absoluteDir = fi.absoluteDir();
     const QString baseName = fi.completeBaseName();
+    const QString privateHeaderSuffix = QLatin1String("_p");
     const QStringList suffixes = matchingCandidateSuffixes(mimeDatase, type);
 
-    const QString privateHeaderSuffix = QLatin1String("_p");
-    const QChar dot = QLatin1Char('.');
-    // Check base matches 'source.h'-> 'source.cpp' and vice versa
-    const QStringList::const_iterator scend = suffixes.constEnd();
-    for (QStringList::const_iterator it = suffixes.constBegin(); it != scend; ++it) {
-        QString candidate = baseName;
-        candidate += dot;
-        candidate += *it;
-        const QFileInfo candidateFi = findFile(absoluteDir, candidate, project);
-        if (candidateFi.isFile())
-            return candidateFi.absoluteFilePath();
-    }
+    QStringList candidateFileNames = baseNameWithAllSuffixes(baseName, suffixes);
     if (type == HeaderFile) {
-        // 'source_p.h': try 'source.cpp'
         if (baseName.endsWith(privateHeaderSuffix)) {
             QString sourceBaseName = baseName;
             sourceBaseName.truncate(sourceBaseName.size() - privateHeaderSuffix.size());
-            for (QStringList::const_iterator it = suffixes.constBegin(); it != scend; ++it) {
-                QString candidate = sourceBaseName;
-                candidate += dot;
-                candidate += *it;
-                const QFileInfo candidateFi = findFile(absoluteDir, candidate, project);
-                if (candidateFi.isFile())
-                    return candidateFi.absoluteFilePath();
-            }
+            candidateFileNames += baseNameWithAllSuffixes(sourceBaseName, suffixes);
         }
     } else {
-        // 'source.cpp': try 'source_p.h'
-        const QStringList::const_iterator scend = suffixes.constEnd();
-        for (QStringList::const_iterator it = suffixes.constBegin(); it != scend; ++it) {
-            QString candidate = baseName;
-            candidate += privateHeaderSuffix;
-            candidate += dot;
-            candidate += *it;
-            const QFileInfo candidateFi = findFile(absoluteDir, candidate, project);
+        QString privateHeaderBaseName = baseName;
+        privateHeaderBaseName.append(privateHeaderSuffix);
+        candidateFileNames += baseNameWithAllSuffixes(privateHeaderBaseName, suffixes);
+    }
+
+    const QDir absoluteDir = fi.absoluteDir();
+
+    // Try to find a file in the same directory first
+    foreach (const QString &fileName, candidateFileNames) {
+        const QFileInfo candidateFi(absoluteDir, fileName);
+        if (candidateFi.isFile())
+            return candidateFi.absoluteFilePath();
+    }
+
+    // Find files in the project
+    if (project) {
+        foreach (const QString &fileName, candidateFileNames) {
+            const QFileInfo candidateFi = findFileInProject(fileName, project);
             if (candidateFi.isFile())
                 return candidateFi.absoluteFilePath();
         }
     }
+
     return QString();
 }
 
diff --git a/src/plugins/cpptools/cpptoolsplugin.h b/src/plugins/cpptools/cpptoolsplugin.h
index 232d878bdc053a5afbc1ba636dab47bf4aa14981..33854d2be76b43bd00cbe6b744a3713d133b0c39 100644
--- a/src/plugins/cpptools/cpptoolsplugin.h
+++ b/src/plugins/cpptools/cpptoolsplugin.h
@@ -78,7 +78,6 @@ private slots:
 
 private:
     QString correspondingHeaderOrSourceI(const QString &fileName) const;
-    QFileInfo findFile(const QDir &dir, const QString &name, const ProjectExplorer::Project *project) const;
 
     CppModelManager *m_modelManager;
     QSharedPointer<CppFileSettings> m_fileSettings;