diff --git a/src/plugins/cpptools/cpptoolsplugin.cpp b/src/plugins/cpptools/cpptoolsplugin.cpp
index 2ae47b1143c34928bcf07ce3f0c88d917ae231bb..c08b639e47f8b4bbdb49249650322838dde207be 100644
--- a/src/plugins/cpptools/cpptoolsplugin.cpp
+++ b/src/plugins/cpptools/cpptoolsplugin.cpp
@@ -261,13 +261,16 @@ static int commonStringLength(const QString &s1, const QString &s2)
 
 QString CppToolsPlugin::correspondingHeaderOrSourceI(const QString &fileName) const
 {
+    const QFileInfo fi(fileName);
+    if (m_headerSourceMapping.contains(fi.absoluteFilePath()))
+        return m_headerSourceMapping.value(fi.absoluteFilePath());
+
     const Core::ICore *core = Core::ICore::instance();
     const Core::MimeDatabase *mimeDatase = core->mimeDatabase();
     ProjectExplorer::ProjectExplorerPlugin *explorer =
        ProjectExplorer::ProjectExplorerPlugin::instance();
     ProjectExplorer::Project *project = (explorer ? explorer->currentProject() : 0);
 
-    const QFileInfo fi(fileName);
     const FileType type = fileType(mimeDatase, fi);
 
     if (debug)
@@ -298,8 +301,11 @@ QString CppToolsPlugin::correspondingHeaderOrSourceI(const QString &fileName) co
     // Try to find a file in the same directory first
     foreach (const QString &candidateFileName, candidateFileNames) {
         const QFileInfo candidateFi(absoluteDir, candidateFileName);
-        if (candidateFi.isFile())
+        if (candidateFi.isFile()) {
+            m_headerSourceMapping[fi.absoluteFilePath()] = candidateFi.absoluteFilePath();
+            m_headerSourceMapping[candidateFi.absoluteFilePath()] = fi.absoluteFilePath();
             return candidateFi.absoluteFilePath();
+        }
     }
 
     // Find files in the project
@@ -320,6 +326,8 @@ QString CppToolsPlugin::correspondingHeaderOrSourceI(const QString &fileName) co
         if (!bestFileName.isEmpty()) {
             const QFileInfo candidateFi(bestFileName);
             Q_ASSERT(candidateFi.isFile());
+            m_headerSourceMapping[fi.absoluteFilePath()] = candidateFi.absoluteFilePath();
+            m_headerSourceMapping[candidateFi.absoluteFilePath()] = fi.absoluteFilePath();
             return candidateFi.absoluteFilePath();
         }
     }
diff --git a/src/plugins/cpptools/cpptoolsplugin.h b/src/plugins/cpptools/cpptoolsplugin.h
index cd0ef75b59fe4ae722684d2d83f0e7f2f354d3c4..28088e6df5a9a5ef713c368630ce11665e82d200 100644
--- a/src/plugins/cpptools/cpptoolsplugin.h
+++ b/src/plugins/cpptools/cpptoolsplugin.h
@@ -44,6 +44,7 @@
 #include <QtCore/QFutureInterface>
 #include <QtCore/QPointer>
 #include <QtCore/QFutureWatcher>
+#include <QtCore/QHash>
 
 QT_BEGIN_NAMESPACE
 class QFileInfo;
@@ -97,6 +98,7 @@ private:
     CppModelManager *m_modelManager;
     QSharedPointer<CppFileSettings> m_fileSettings;
     CppToolsSettings *m_settings;
+    mutable QHash<QString, QString> m_headerSourceMapping;
 };
 
 } // namespace Internal