diff --git a/src/plugins/cpptools/cppfilesettingspage.cpp b/src/plugins/cpptools/cppfilesettingspage.cpp
index cb2a39949d3f86162bdf79c53e18502f0119c127..5a9affa451b81b8c92a7ea78c2bd452e3de542ca 100644
--- a/src/plugins/cpptools/cppfilesettingspage.cpp
+++ b/src/plugins/cpptools/cppfilesettingspage.cpp
@@ -51,6 +51,8 @@
 #include <QTextStream>
 #include <QFileDialog>
 
+static const char headerPrefixesKeyC[] = "HeaderPrefixes";
+static const char sourcePrefixesKeyC[] = "SourcePrefixes";
 static const char headerSuffixKeyC[] = "HeaderSuffix";
 static const char sourceSuffixKeyC[] = "SourceSuffix";
 static const char headerSearchPathsKeyC[] = "HeaderSearchPaths";
@@ -76,6 +78,8 @@ CppFileSettings::CppFileSettings() :
 void CppFileSettings::toSettings(QSettings *s) const
 {
     s->beginGroup(QLatin1String(Constants::CPPTOOLS_SETTINGSGROUP));
+    s->setValue(QLatin1String(headerPrefixesKeyC), headerPrefixes);
+    s->setValue(QLatin1String(sourcePrefixesKeyC), sourcePrefixes);
     s->setValue(QLatin1String(headerSuffixKeyC), headerSuffix);
     s->setValue(QLatin1String(sourceSuffixKeyC), sourceSuffix);
     s->setValue(QLatin1String(headerSearchPathsKeyC), headerSearchPaths);
@@ -97,7 +101,9 @@ void CppFileSettings::fromSettings(QSettings *s)
             << QDir::toNativeSeparators(QLatin1String("../Src"))
             << QLatin1String("..");
     s->beginGroup(QLatin1String(Constants::CPPTOOLS_SETTINGSGROUP));
-    headerSuffix= s->value(QLatin1String(headerSuffixKeyC), QLatin1String("h")).toString();
+    headerPrefixes = s->value(QLatin1String(headerPrefixesKeyC)).toStringList();
+    sourcePrefixes = s->value(QLatin1String(sourcePrefixesKeyC)).toStringList();
+    headerSuffix = s->value(QLatin1String(headerSuffixKeyC), QLatin1String("h")).toString();
     sourceSuffix = s->value(QLatin1String(sourceSuffixKeyC), QLatin1String("cpp")).toString();
     headerSearchPaths = s->value(QLatin1String(headerSearchPathsKeyC), defaultHeaderSearchPaths)
             .toStringList();
@@ -118,6 +124,8 @@ bool CppFileSettings::applySuffixesToMimeDB()
 bool CppFileSettings::equals(const CppFileSettings &rhs) const
 {
     return lowerCaseFiles == rhs.lowerCaseFiles
+           && headerPrefixes == rhs.headerPrefixes
+           && sourcePrefixes == rhs.sourcePrefixes
            && headerSuffix == rhs.headerSuffix
            && sourceSuffix == rhs.sourceSuffix
            && headerSearchPaths == rhs.headerSearchPaths
@@ -285,6 +293,8 @@ CppFileSettings CppFileSettingsWidget::settings() const
 {
     CppFileSettings rc;
     rc.lowerCaseFiles = m_ui->lowerCaseFileNamesCheckBox->isChecked();
+    rc.headerPrefixes = trimmedPaths(m_ui->headerPrefixesEdit->text());
+    rc.sourcePrefixes = trimmedPaths(m_ui->sourcePrefixesEdit->text());
     rc.headerSuffix = m_ui->headerSuffixComboBox->currentText();
     rc.sourceSuffix = m_ui->sourceSuffixComboBox->currentText();
     rc.headerSearchPaths = trimmedPaths(m_ui->headerSearchPathsEdit->text());
@@ -302,6 +312,8 @@ static inline void setComboText(QComboBox *cb, const QString &text, int defaultI
 void CppFileSettingsWidget::setSettings(const CppFileSettings &s)
 {
     m_ui->lowerCaseFileNamesCheckBox->setChecked(s.lowerCaseFiles);
+    m_ui->headerPrefixesEdit->setText(s.headerPrefixes.join(QLatin1String(",")));
+    m_ui->sourcePrefixesEdit->setText(s.sourcePrefixes.join(QLatin1String(",")));
     setComboText(m_ui->headerSuffixComboBox, s.headerSuffix);
     setComboText(m_ui->sourceSuffixComboBox, s.sourceSuffix);
     m_ui->headerSearchPathsEdit->setText(s.headerSearchPaths.join(QLatin1String(",")));
diff --git a/src/plugins/cpptools/cppfilesettingspage.h b/src/plugins/cpptools/cppfilesettingspage.h
index 0ca32842465694f97572264396a3dbdd15973235..92d509bae21c94096e2ae729253e3896b10de58a 100644
--- a/src/plugins/cpptools/cppfilesettingspage.h
+++ b/src/plugins/cpptools/cppfilesettingspage.h
@@ -49,8 +49,10 @@ struct CppFileSettings
 {
     CppFileSettings();
 
+    QStringList headerPrefixes;
     QString headerSuffix;
     QStringList headerSearchPaths;
+    QStringList sourcePrefixes;
     QString sourceSuffix;
     QStringList sourceSearchPaths;
     bool lowerCaseFiles;
diff --git a/src/plugins/cpptools/cppfilesettingspage.ui b/src/plugins/cpptools/cppfilesettingspage.ui
index 5ac560631956d1858a914f8f1f28ecc31be9524f..e11701a7846dd48de1114d1b240a766f1081a33b 100644
--- a/src/plugins/cpptools/cppfilesettingspage.ui
+++ b/src/plugins/cpptools/cppfilesettingspage.ui
@@ -7,7 +7,7 @@
     <x>0</x>
     <y>0</y>
     <width>547</width>
-    <height>305</height>
+    <height>363</height>
    </rect>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout">
@@ -23,7 +23,7 @@
       <string>Headers</string>
      </property>
      <layout class="QFormLayout" name="formLayout_2">
-      <item row="0" column="0">
+      <item row="2" column="0">
        <widget class="QLabel" name="headerSuffixLabel">
         <property name="text">
          <string>&amp;Suffix:</string>
@@ -33,7 +33,7 @@
         </property>
        </widget>
       </item>
-      <item row="0" column="1">
+      <item row="2" column="1">
        <widget class="QComboBox" name="headerSuffixComboBox">
         <property name="sizePolicy">
          <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
@@ -43,7 +43,7 @@
         </property>
        </widget>
       </item>
-      <item row="1" column="0">
+      <item row="3" column="0">
        <widget class="QLabel" name="headerSearchPathsLabel">
         <property name="text">
          <string>S&amp;earch paths:</string>
@@ -53,7 +53,7 @@
         </property>
        </widget>
       </item>
-      <item row="1" column="1">
+      <item row="3" column="1">
        <widget class="QLineEdit" name="headerSearchPathsEdit">
         <property name="toolTip">
          <string>Comma-separated list of header paths.
@@ -64,6 +64,25 @@ These paths are used in addition to current directory on Switch Header/Source.</
         </property>
        </widget>
       </item>
+      <item row="4" column="0">
+       <widget class="QLabel" name="headerPrefixesLabel">
+        <property name="text">
+         <string>&amp;Prefixes:</string>
+        </property>
+        <property name="buddy">
+         <cstring>headerSearchPathsEdit</cstring>
+        </property>
+       </widget>
+      </item>
+      <item row="4" column="1">
+       <widget class="QLineEdit" name="headerPrefixesEdit">
+        <property name="toolTip">
+         <string>Comma-separated list of header prefixes.
+
+These prefixes are used in addition to current file name on Switch Header/Source.</string>
+        </property>
+       </widget>
+      </item>
      </layout>
     </widget>
    </item>
@@ -79,7 +98,7 @@ These paths are used in addition to current directory on Switch Header/Source.</
       <string>Sources</string>
      </property>
      <layout class="QFormLayout" name="formLayout_3">
-      <item row="1" column="0">
+      <item row="3" column="0">
        <widget class="QLabel" name="sourceSuffixLabel">
         <property name="text">
          <string>S&amp;uffix:</string>
@@ -89,7 +108,7 @@ These paths are used in addition to current directory on Switch Header/Source.</
         </property>
        </widget>
       </item>
-      <item row="1" column="1">
+      <item row="3" column="1">
        <widget class="QComboBox" name="sourceSuffixComboBox">
         <property name="sizePolicy">
          <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
@@ -99,7 +118,7 @@ These paths are used in addition to current directory on Switch Header/Source.</
         </property>
        </widget>
       </item>
-      <item row="2" column="0">
+      <item row="4" column="0">
        <widget class="QLabel" name="sourceSearchPathsLabel">
         <property name="text">
          <string>Se&amp;arch paths:</string>
@@ -109,7 +128,7 @@ These paths are used in addition to current directory on Switch Header/Source.</
         </property>
        </widget>
       </item>
-      <item row="2" column="1">
+      <item row="4" column="1">
        <widget class="QLineEdit" name="sourceSearchPathsEdit">
         <property name="toolTip">
          <string>Comma-separated list of source paths.
@@ -120,6 +139,25 @@ These paths are used in addition to current directory on Switch Header/Source.</
         </property>
        </widget>
       </item>
+      <item row="5" column="0">
+       <widget class="QLabel" name="sourcePrefixesLabel">
+        <property name="text">
+         <string>P&amp;refixes:</string>
+        </property>
+        <property name="buddy">
+         <cstring>sourceSearchPathsEdit</cstring>
+        </property>
+       </widget>
+      </item>
+      <item row="5" column="1">
+       <widget class="QLineEdit" name="sourcePrefixesEdit">
+        <property name="toolTip">
+         <string>Comma-separated list of source prefixes.
+
+These prefixes are used in addition to current file name on Switch Header/Source.</string>
+        </property>
+       </widget>
+      </item>
      </layout>
     </widget>
    </item>
diff --git a/src/plugins/cpptools/cppheadersource_test.cpp b/src/plugins/cpptools/cppheadersource_test.cpp
index c047d0fe43ab4b732707f7e83009241c42637d03..f5f719854491c5c1898ec41032546231abb62c68 100644
--- a/src/plugins/cpptools/cppheadersource_test.cpp
+++ b/src/plugins/cpptools/cppheadersource_test.cpp
@@ -29,6 +29,7 @@
 
 #include "cpptoolsplugin.h"
 #include "cpptoolsreuse.h"
+#include "cppfilesettingspage.h"
 
 #include <utils/fileutils.h>
 
@@ -81,16 +82,31 @@ void CppToolsPlugin::test_headersource_data()
     QTest::addColumn<QString>("headerFileName");
     QTest::newRow("samedir") << _("foo.cpp") << _("foo.h");
     QTest::newRow("includesub") << _("foo.cpp") << _("include/foo.h");
+    QTest::newRow("headerprefix") << _("foo.cpp") << _("testh_foo.h");
+    QTest::newRow("sourceprefixwsub") << _("testc_foo.cpp") << _("include/foo.h");
+    QTest::newRow("sourceAndHeaderPrefixWithBothsub") << _("src/testc_foo.cpp") << _("include/testh_foo.h");
 }
 
 void CppToolsPlugin::initTestCase()
 {
     QDir(baseTestDir()).mkpath(_("."));
+    m_fileSettings->headerSearchPaths.append(QLatin1String("include"));
+    m_fileSettings->headerSearchPaths.append(QLatin1String("../include"));
+    m_fileSettings->sourceSearchPaths.append(QLatin1String("src"));
+    m_fileSettings->sourceSearchPaths.append(QLatin1String("../src"));
+    m_fileSettings->headerPrefixes.append(QLatin1String("testh_"));
+    m_fileSettings->sourcePrefixes.append(QLatin1String("testc_"));
 }
 
 void CppToolsPlugin::cleanupTestCase()
 {
     Utils::FileUtils::removeRecursively(Utils::FileName::fromString(baseTestDir()));
+    m_fileSettings->headerSearchPaths.removeLast();
+    m_fileSettings->headerSearchPaths.removeLast();
+    m_fileSettings->sourceSearchPaths.removeLast();
+    m_fileSettings->sourceSearchPaths.removeLast();
+    m_fileSettings->headerPrefixes.removeLast();
+    m_fileSettings->sourcePrefixes.removeLast();
 }
 
 } // namespace Internal
diff --git a/src/plugins/cpptools/cpptoolsplugin.cpp b/src/plugins/cpptools/cpptoolsplugin.cpp
index 8dc5e4c95e996046689d6eb65889b8fd2e9643fb..e46947124578acab93bcd66cf463a98d2f820906 100644
--- a/src/plugins/cpptools/cpptoolsplugin.cpp
+++ b/src/plugins/cpptools/cpptoolsplugin.cpp
@@ -106,6 +106,17 @@ const QStringList &CppToolsPlugin::sourceSearchPaths()
     return m_instance->m_fileSettings->sourceSearchPaths;
 }
 
+const QStringList &CppToolsPlugin::headerPrefixes()
+{
+    return m_instance->m_fileSettings->headerPrefixes;
+}
+
+const QStringList &CppToolsPlugin::sourcePrefixes()
+{
+    return m_instance->m_fileSettings->sourcePrefixes;
+}
+
+
 bool CppToolsPlugin::initialize(const QStringList &arguments, QString *error)
 {
     Q_UNUSED(arguments)
@@ -256,6 +267,28 @@ static QStringList baseNameWithAllSuffixes(const QString &baseName, const QStrin
     return result;
 }
 
+static QStringList baseNamesWithAllPrefixes(const QStringList &baseNames, bool isHeader)
+{
+    QStringList result;
+    const QStringList &sourcePrefixes = m_instance->sourcePrefixes();
+    const QStringList &headerPrefixes = m_instance->headerPrefixes();
+
+    foreach (const QString &name, baseNames) {
+        foreach (const QString &prefix, isHeader ? headerPrefixes : sourcePrefixes) {
+            if (name.startsWith(prefix)) {
+                QString nameWithoutPrefix = name.mid(prefix.size());
+                result += nameWithoutPrefix;
+                foreach (const QString &prefix, isHeader ? sourcePrefixes : headerPrefixes)
+                    result += prefix + nameWithoutPrefix;
+            }
+        }
+        foreach (const QString &prefix, isHeader ? sourcePrefixes : headerPrefixes)
+            result += prefix + name;
+
+    }
+    return result;
+}
+
 static QStringList baseDirWithAllDirectories(const QDir &baseDir, const QStringList &directories)
 {
     QStringList result;
@@ -346,6 +379,8 @@ QString correspondingHeaderOrSource(const QString &fileName, bool *wasHeader)
                                              : m_instance->headerSearchPaths();
     candidateDirs += baseDirWithAllDirectories(absoluteDir, searchPaths);
 
+    candidateFileNames += baseNamesWithAllPrefixes(candidateFileNames, isHeader);
+
     // Try to find a file in the same or sibling directories first
     foreach (const QString &candidateDir, candidateDirs) {
         foreach (const QString &candidateFileName, candidateFileNames) {
diff --git a/src/plugins/cpptools/cpptoolsplugin.h b/src/plugins/cpptools/cpptoolsplugin.h
index d99fcb738b7e7e69ebaef28d17693eee8629b52c..0f8ab1e6d17136569d9386674b8a7b25827db15e 100644
--- a/src/plugins/cpptools/cpptoolsplugin.h
+++ b/src/plugins/cpptools/cpptoolsplugin.h
@@ -63,6 +63,8 @@ public:
     static CppToolsPlugin *instance();
     static const QStringList &headerSearchPaths();
     static const QStringList &sourceSearchPaths();
+    static const QStringList &headerPrefixes();
+    static const QStringList &sourcePrefixes();
     static void clearHeaderSourceCache();
 
     bool initialize(const QStringList &arguments, QString *errorMessage);