diff --git a/src/plugins/qt4projectmanager/profilereader.cpp b/src/plugins/qt4projectmanager/profilereader.cpp
index 826f44c469e1a8f5f1f39bfeca1df8846fbfe5b6..b5b447ad602c76f42273d283487f91fccbd055cb 100644
--- a/src/plugins/qt4projectmanager/profilereader.cpp
+++ b/src/plugins/qt4projectmanager/profilereader.cpp
@@ -35,7 +35,7 @@
 using namespace Qt4ProjectManager;
 using namespace Qt4ProjectManager::Internal;
 
-ProFileReader::ProFileReader() : ProFileEvaluator(&m_option)
+ProFileReader::ProFileReader(ProFileOption *option) : ProFileEvaluator(option)
 {
 }
 
@@ -45,14 +45,6 @@ ProFileReader::~ProFileReader()
         delete pf;
 }
 
-void ProFileReader::setQtVersion(const QtVersion *qtVersion)
-{
-    if (qtVersion)
-        m_option.properties = qtVersion->versionInfo();
-    else
-        m_option.properties.clear();
-}
-
 bool ProFileReader::readProFile(const QString &fileName)
 {
     //disable caching -> list of include files is not updated otherwise
diff --git a/src/plugins/qt4projectmanager/profilereader.h b/src/plugins/qt4projectmanager/profilereader.h
index 06c1d13598bdef9466541c9541afaa0361aca459..7e927d181b214acdb77dc9c5a1ea4174ab2a0162 100644
--- a/src/plugins/qt4projectmanager/profilereader.h
+++ b/src/plugins/qt4projectmanager/profilereader.h
@@ -31,7 +31,6 @@
 #define PROFILEREADER_H
 
 #include "profileevaluator.h"
-#include "qtversionmanager.h"
 
 #include <QtCore/QObject>
 #include <QtCore/QMap>
@@ -44,10 +43,9 @@ class ProFileReader : public QObject, public ProFileEvaluator
     Q_OBJECT
 
 public:
-    ProFileReader();
+    ProFileReader(ProFileOption *option);
     ~ProFileReader();
 
-    void setQtVersion(const QtVersion *qtVersion);
     bool readProFile(const QString &fileName);
     QList<ProFile*> includeFiles() const;
 
@@ -67,7 +65,6 @@ private:
 private:
     QMap<QString, ProFile *> m_includeFiles;
     QList<ProFile *> m_proFiles;
-    ProFileOption m_option;
 };
 
 } // namespace Internal
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp
index 5f121819d659863c607b158153314b1e6c856eab..39145af1628032e39074a4eb728e6ed5c9707403 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp
@@ -571,8 +571,7 @@ void MaemoRunConfiguration::updateTarget()
             return;
         }
 
-        QtVersion *qtVersion = qt4bc->qtVersion();
-        ProFileReader *reader = proFileNode->createProFileReader();
+        ProFileReader *reader = qt4Project->createProFileReader(proFileNode);
         reader->setCumulative(false);
 
         // Find out what flags we pass on to qmake
@@ -582,7 +581,7 @@ void MaemoRunConfiguration::updateTarget()
         reader->setConfigCommandLineArguments(addedUserConfigArguments, removedUserConfigArguments);
 
         if (!reader->readProFile(m_proFilePath)) {
-            delete reader;
+            qt4Project->destroyProFileReader(reader);
             Core::ICore::instance()->messageManager()->printToOutputPane(tr(
                 "Could not parse %1. The Maemo run configuration %2 "
                 "can not be started.").arg(m_proFilePath).arg(name()));
@@ -620,7 +619,7 @@ void MaemoRunConfiguration::updateTarget()
             target = QFileInfo(m_proFilePath).baseName();
 
         m_executable = QDir::cleanPath(baseDir + QLatin1Char('/') + target);
-        delete reader;
+        qt4Project->destroyProFileReader(reader);
     }
 
     emit targetInformationChanged();
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp
index 9b97d702346921f3fea6c05d1bdf107e8a1c5a74..bcff5409a0b50e046c9e1c776ffe414b60b43cbe 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp
@@ -288,8 +288,7 @@ void S60DeviceRunConfiguration::updateTarget()
         emit targetInformationChanged();
         return;
     }
-    QtVersion *qtVersion = qt4bc->qtVersion();
-    ProFileReader *reader = proFileNode->createProFileReader();
+    ProFileReader *reader = qt4Project()->createProFileReader(proFileNode);
     reader->setCumulative(false);
 
     // Find out what flags we pass on to qmake
@@ -299,7 +298,7 @@ void S60DeviceRunConfiguration::updateTarget()
     reader->setConfigCommandLineArguments(addedUserConfigArguments, removedUserConfigArguments);
 
     if (!reader->readProFile(m_proFilePath)) {
-        delete reader;
+        qt4Project()->destroyProFileReader(reader);
         Core::ICore::instance()->messageManager()->printToOutputPane(tr("Could not parse %1. The QtS60 Device run configuration %2 can not be started.").arg(m_proFilePath).arg(name()));
         return;
     }
@@ -346,7 +345,7 @@ void S60DeviceRunConfiguration::updateTarget()
     else
         m_target = QLatin1String("urel");
     m_baseFileName += QLatin1Char('_') + m_platform + QLatin1Char('_') + m_target;
-    delete reader;
+    qt4Project()->destroyProFileReader(reader);
     m_cachedTargetInformationValid = true;
     emit targetInformationChanged();
 }
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp
index 82bd78e2f29cf95020022024a1575401a47e4f47..dd565d164e205c71adedafdd0a2b7c2586753b5a 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp
@@ -135,8 +135,7 @@ void S60EmulatorRunConfiguration::updateTarget()
         emit targetInformationChanged();
         return;
     }
-    QtVersion *qtVersion = qt4bc->qtVersion();
-    ProFileReader *reader = proFileNode->createProFileReader();
+    ProFileReader *reader = qt4Project()->createProFileReader(proFileNode);
     reader->setCumulative(false);
 
     // Find out what flags we pass on to qmake
@@ -146,11 +145,12 @@ void S60EmulatorRunConfiguration::updateTarget()
     reader->setConfigCommandLineArguments(addedUserConfigArguments, removedUserConfigArguments);
 
     if (!reader->readProFile(m_proFilePath)) {
-        delete reader;
+        qt4Project()->destroyProFileReader(reader);
         Core::ICore::instance()->messageManager()->printToOutputPane(tr("Could not parse %1. The Qt for Symbian emulator run configuration %2 can not be started.").arg(m_proFilePath).arg(name()));
         return;
     }
 
+    QtVersion *qtVersion = qt4bc->qtVersion();
     QString baseDir = S60Manager::instance()->deviceForQtVersion(qtVersion).epocRoot;
     QString qmakeBuildConfig = "urel";
     if (qt4bc->qmakeBuildConfiguration() & QtVersion::DebugBuild)
@@ -165,7 +165,7 @@ void S60EmulatorRunConfiguration::updateTarget()
             QDir::cleanPath(baseDir + QLatin1Char('/') + target));
     m_executable += QLatin1String(".exe");
 
-    delete reader;
+    qt4Project()->destroyProFileReader(reader);
     m_cachedTargetInformationValid = true;
     emit targetInformationChanged();
 }
diff --git a/src/plugins/qt4projectmanager/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp
index 4f5864b816a4f6ec24cfc3bab34f40bb9295d581..f4f228f6e11a0f7b15e0cc41a69c7c7c17855b9c 100644
--- a/src/plugins/qt4projectmanager/qt4nodes.cpp
+++ b/src/plugins/qt4projectmanager/qt4nodes.cpp
@@ -560,10 +560,10 @@ void Qt4PriFileNode::changeFiles(const FileType fileType,
     if (filePaths.isEmpty())
         return;
 
-    ProFileReader *reader = m_qt4ProFileNode->createProFileReader();
+    ProFileReader *reader = m_project->createProFileReader(m_qt4ProFileNode);
     if (!reader->readProFile(m_qt4ProFileNode->path())) {
         m_project->proFileParseError(tr("Error while parsing file %1. Giving up.").arg(m_projectFilePath));
-        delete reader;
+        m_project->destroyProFileReader(reader);
         return;
     }
 
@@ -576,7 +576,7 @@ void Qt4PriFileNode::changeFiles(const FileType fileType,
 
     // Check for modified editors
     if (!saveModifiedEditors(m_projectFilePath)) {
-        delete reader;
+        m_project->destroyProFileReader(reader);
         return;
     }
 
@@ -661,7 +661,7 @@ void Qt4PriFileNode::changeFiles(const FileType fileType,
 
     // save file
     save(includeFile);
-    delete reader;
+    m_project->destroyProFileReader(reader);
 }
 
 void Qt4PriFileNode::save(ProFile *includeFile)
@@ -805,10 +805,10 @@ void Qt4ProFileNode::scheduleUpdate()
 
 void Qt4ProFileNode::update()
 {
-    ProFileReader *reader = createProFileReader();
+    ProFileReader *reader = m_project->createProFileReader(this);
     if (!reader->readProFile(m_projectFilePath)) {
         m_project->proFileParseError(tr("Error while parsing file %1. Giving up.").arg(m_projectFilePath));
-        delete reader;
+        m_project->destroyProFileReader(reader);
         invalidate();
         return;
     }
@@ -952,7 +952,7 @@ void Qt4ProFileNode::update()
         if (Qt4NodesWatcher *qt4Watcher = qobject_cast<Qt4NodesWatcher*>(watcher))
             emit qt4Watcher->proFileUpdated(this);
 
-    delete reader;
+    m_project->destroyProFileReader(reader);
 }
 
 namespace {
@@ -1084,23 +1084,6 @@ QStringList Qt4ProFileNode::updateUiFiles()
     return toUpdate;
 }
 
-ProFileReader *Qt4ProFileNode::createProFileReader() const
-{
-    ProFileReader *reader = new ProFileReader();
-    connect(reader, SIGNAL(errorFound(QString)),
-            m_project, SLOT(proFileParseError(QString)));
-
-    Qt4BuildConfiguration *qt4bc = m_project->activeQt4BuildConfiguration();
-
-    QtVersion *version = qt4bc->qtVersion();
-    if (version->isValid())
-        reader->setQtVersion(version);
-
-    reader->setOutputDir(buildDir());
-
-    return reader;
-}
-
 Qt4ProFileNode *Qt4ProFileNode::createSubProFileNode(const QString &path)
 {
     Qt4ProFileNode *subProFileNode = new Qt4ProFileNode(m_project, path);
diff --git a/src/plugins/qt4projectmanager/qt4nodes.h b/src/plugins/qt4projectmanager/qt4nodes.h
index f9bce3cf5a15b855eb6968382018c8d4c520097e..7eb524966269a1a73489cdc6ff9c4736878cab90 100644
--- a/src/plugins/qt4projectmanager/qt4nodes.h
+++ b/src/plugins/qt4projectmanager/qt4nodes.h
@@ -198,9 +198,6 @@ public:
 
     Qt4ProFileNode *findProFileFor(const QString &string);
 
-    //internal
-    ProFileReader *createProFileReader() const;
-
 public slots:
     void scheduleUpdate();
     void update();
diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp
index 3c5475efdbd94b5641600c214c8b3062d167f433..1d9a753dbc86d2bee3d88b6ccf6f5633fde4568c 100644
--- a/src/plugins/qt4projectmanager/qt4project.cpp
+++ b/src/plugins/qt4projectmanager/qt4project.cpp
@@ -320,7 +320,8 @@ Qt4Project::Qt4Project(Qt4Manager *manager, const QString& fileName) :
     m_fileInfo(new Qt4ProjectFile(this, fileName, this)),
     m_isApplication(true),
     m_projectFiles(new Qt4ProjectFiles),
-    m_lastActiveQt4BuildConfiguration(0)
+    m_lastActiveQt4BuildConfiguration(0),
+    m_proFileOption(0)
 {
     m_manager->registerProject(this);
 
@@ -855,6 +856,38 @@ void Qt4Project::proFileParseError(const QString &errorMessage)
     Core::ICore::instance()->messageManager()->printToOutputPane(errorMessage);
 }
 
+ProFileReader *Qt4Project::createProFileReader(Qt4ProFileNode *qt4ProFileNode)
+{
+    if (!m_proFileOption) {
+        m_proFileOption = new ProFileOption;
+        m_proFileOptionRefCnt = 0;
+
+        if (Qt4BuildConfiguration *qt4bc = activeQt4BuildConfiguration()) {
+            QtVersion *version = qt4bc->qtVersion();
+            if (version->isValid())
+                m_proFileOption->properties = version->versionInfo();
+        }
+    }
+    ++m_proFileOptionRefCnt;
+
+    ProFileReader *reader = new ProFileReader(m_proFileOption);
+    connect(reader, SIGNAL(errorFound(QString)),
+            this, SLOT(proFileParseError(QString)));
+
+    reader->setOutputDir(qt4ProFileNode->buildDir());
+
+    return reader;
+}
+
+void Qt4Project::destroyProFileReader(ProFileReader *reader)
+{
+    delete reader;
+    if (!--m_proFileOptionRefCnt) {
+        delete m_proFileOption;
+        m_proFileOption = 0;
+    }
+}
+
 Qt4ProFileNode *Qt4Project::rootProjectNode() const
 {
     return m_rootProjectNode;
diff --git a/src/plugins/qt4projectmanager/qt4project.h b/src/plugins/qt4projectmanager/qt4project.h
index 7b9b2249c3f15762c51f18b8f85c4201365459ae..fec4d5670a1309f3d98c729853b9b3c4041ef0ec 100644
--- a/src/plugins/qt4projectmanager/qt4project.h
+++ b/src/plugins/qt4projectmanager/qt4project.h
@@ -59,7 +59,7 @@ namespace CppTools {
 }
 
 QT_BEGIN_NAMESPACE
-class ProFile;
+class ProFileOption;
 QT_END_NAMESPACE
 
 namespace Qt4ProjectManager {
@@ -95,9 +95,6 @@ class Qt4ProjectFile : public Core::IFile
 {
     Q_OBJECT
 
-    // needed for createProFileReader
-    friend class Internal::Qt4RunConfiguration;
-
 public:
     Qt4ProjectFile(Qt4Project *project, const QString &filePath, QObject *parent = 0);
 
@@ -196,6 +193,9 @@ public:
     virtual QStringList includePaths(const QString &fileName) const;
     virtual QStringList frameworkPaths(const QString &fileName) const;
 
+    Internal::ProFileReader *createProFileReader(Internal::Qt4ProFileNode *qt4ProFileNode);
+    void destroyProFileReader(Internal::ProFileReader *reader);
+
 signals:
     /// convenience signal, emitted if either the active buildconfiguration emits
     /// targetInformationChanged() or if the active build configuration changes
@@ -262,6 +262,10 @@ private:
 
     friend class Qt4ProjectFile;
     friend class Internal::Qt4ProjectConfigWidget;
+
+    // cached data during project rescan
+    ProFileOption *m_proFileOption;
+    int m_proFileOptionRefCnt;
 };
 
 } // namespace Qt4ProjectManager
diff --git a/src/plugins/qt4projectmanager/qt4runconfiguration.cpp b/src/plugins/qt4projectmanager/qt4runconfiguration.cpp
index 8422e015180e7e4ab2b6a32e5e22479c74e9e5a3..d5eb28df2ef89afb3b3e3a7443a2e9b70a98954d 100644
--- a/src/plugins/qt4projectmanager/qt4runconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt4runconfiguration.cpp
@@ -572,7 +572,7 @@ void Qt4RunConfiguration::updateTarget()
         emit effectiveTargetInformationChanged();
         return;
     }
-    ProFileReader *reader = proFileNode->createProFileReader();
+    ProFileReader *reader = qt4Project()->createProFileReader(proFileNode);
     reader->setCumulative(false);
 
     // Find out what flags we pass on to qmake
@@ -582,7 +582,7 @@ void Qt4RunConfiguration::updateTarget()
     reader->setConfigCommandLineArguments(addedUserConfigArguments, removedUserConfigArguments);
 
     if (!reader->readProFile(m_proFilePath)) {
-        delete reader;
+        qt4Project()->destroyProFileReader(reader);
         Core::ICore::instance()->messageManager()->printToOutputPane(tr("Could not parse %1. The Qt4 run configuration %2 can not be started.").arg(m_proFilePath).arg(name()));
         return;
     }
@@ -636,7 +636,7 @@ void Qt4RunConfiguration::updateTarget()
     m_executable += QLatin1String(".exe");
 #endif
 
-    delete reader;
+    qt4Project()->destroyProFileReader(reader);
 
     m_cachedTargetInformationValid = true;
 
diff --git a/src/plugins/qt4projectmanager/qtversionmanager.cpp b/src/plugins/qt4projectmanager/qtversionmanager.cpp
index 2893b1fe1023b6af6831ec5390243eae6374cc05..db1888399f025050eebc8afeb17ebad5e7fbec51 100644
--- a/src/plugins/qt4projectmanager/qtversionmanager.cpp
+++ b/src/plugins/qt4projectmanager/qtversionmanager.cpp
@@ -1205,8 +1205,9 @@ void QtVersion::updateToolChainAndMkspec() const
 
 //    qDebug()<<"mkspec for "<<qmakeCommand()<<" is "<<m_mkspec<<m_mkspecFullPath;
 
-    ProFileReader *reader = new ProFileReader();
-    reader->setQtVersion(this);
+    ProFileOption option;
+    option.properties = versionInfo();
+    ProFileReader *reader = new ProFileReader(&option);
     reader->setCumulative(false);
     reader->setParsePreAndPostFiles(false);
     reader->readProFile(m_mkspecFullPath + "/qmake.conf");