diff --git a/src/libs/utils/buildablehelperlibrary.cpp b/src/libs/utils/buildablehelperlibrary.cpp
index 672e83afc6466d8d273961c49a128cbf6b3d2ec4..24e8f5e90b6aeba5f5b5a7a0d68961532364261c 100644
--- a/src/libs/utils/buildablehelperlibrary.cpp
+++ b/src/libs/utils/buildablehelperlibrary.cpp
@@ -297,20 +297,24 @@ bool BuildableHelperLibrary::getHelperFileInfoFor(const QStringList &validBinary
 QString BuildableHelperLibrary::byInstallDataHelper(const QString &sourcePath,
                                                     const QStringList &sourceFileNames,
                                                     const QStringList &installDirectories,
-                                                    const QStringList &validBinaryFilenames)
+                                                    const QStringList &validBinaryFilenames,
+                                                    bool acceptOutdatedHelper)
 {
     // find the latest change to the sources
     QDateTime sourcesModified;
-    foreach (const QString &sourceFileName, sourceFileNames) {
-        const QDateTime fileModified = QFileInfo(sourcePath + sourceFileName).lastModified();
-        if (fileModified.isValid() && (!sourcesModified.isValid() || fileModified > sourcesModified))
-            sourcesModified = fileModified;
+    if (!acceptOutdatedHelper) {
+        foreach (const QString &sourceFileName, sourceFileNames) {
+            const QDateTime fileModified = QFileInfo(sourcePath + sourceFileName).lastModified();
+            if (fileModified.isValid() && (!sourcesModified.isValid() || fileModified > sourcesModified))
+                sourcesModified = fileModified;
+        }
     }
 
     // We pretend that the lastmodified of gdbmacros.cpp is 5 minutes before what the file system says
     // Because afer a installation from the package the modified dates of gdbmacros.cpp
     // and the actual library are close to each other, but not deterministic in one direction
-    sourcesModified = sourcesModified.addSecs(-300);
+    if (sourcesModified.isValid())
+        sourcesModified = sourcesModified.addSecs(-300);
 
     // look for the newest helper library in the different locations
     QString newestHelper;
@@ -318,7 +322,8 @@ QString BuildableHelperLibrary::byInstallDataHelper(const QString &sourcePath,
     QFileInfo fileInfo;
     foreach(const QString &installDirectory, installDirectories) {
         if (getHelperFileInfoFor(validBinaryFilenames, installDirectory, &fileInfo)) {
-            if (fileInfo.lastModified() > newestHelperModified) {
+            if (!newestHelperModified.isValid()
+                    || (fileInfo.lastModified() > newestHelperModified)) {
                 newestHelper = fileInfo.filePath();
                 newestHelperModified = fileInfo.lastModified();
             }
diff --git a/src/libs/utils/buildablehelperlibrary.h b/src/libs/utils/buildablehelperlibrary.h
index 13626da8ec707c3f40be427fab828b9841571fbd..ea4eefdcce99f162bfca1d7e3ad00ab1c100a642 100644
--- a/src/libs/utils/buildablehelperlibrary.h
+++ b/src/libs/utils/buildablehelperlibrary.h
@@ -61,7 +61,8 @@ public:
     static QString byInstallDataHelper(const QString &sourcePath,
                                        const QStringList &sourceFileNames,
                                        const QStringList &installDirectories,
-                                       const QStringList &validBinaryFilenames);
+                                       const QStringList &validBinaryFilenames,
+                                       bool acceptOutdatedHelper);
 
     static bool copyFiles(const QString &sourcePath, const QStringList &files,
                           const QString &targetDirectory, QString *errorMessage);
diff --git a/src/plugins/projectexplorer/debugginghelper.cpp b/src/plugins/projectexplorer/debugginghelper.cpp
index 2fd06bc58bc303517b76bb039969af3636ca09d2..57cf1add651aa5f063b4a9b3c77f6c711c43fd34 100644
--- a/src/plugins/projectexplorer/debugginghelper.cpp
+++ b/src/plugins/projectexplorer/debugginghelper.cpp
@@ -101,7 +101,7 @@ QString DebuggingHelperLibrary::debuggingHelperLibraryByInstallData(const QStrin
     const QStringList directories = DebuggingHelperLibrary::debuggingHelperLibraryDirectories(qtInstallData);
     const QStringList binFilenames = validBinaryFilenames();
 
-    return byInstallDataHelper(sourcePath(), sourceFileNames(), directories, binFilenames);
+    return byInstallDataHelper(sourcePath(), sourceFileNames(), directories, binFilenames, false);
 }
 
 QString DebuggingHelperLibrary::copy(const QString &qtInstallData,
diff --git a/src/plugins/qt4projectmanager/qmldebugginglibrary.cpp b/src/plugins/qt4projectmanager/qmldebugginglibrary.cpp
index f7d33b6ecf8e529e9540abe5d03ba723d11f1cf2..379275c73b5dcfe9fbf8625320293f1e2e082d70 100644
--- a/src/plugins/qt4projectmanager/qmldebugginglibrary.cpp
+++ b/src/plugins/qt4projectmanager/qmldebugginglibrary.cpp
@@ -62,7 +62,7 @@ QString QmlDebuggingLibrary::libraryByInstallData(const QString &qtInstallData,
     }
     binFilenames << QLatin1String("libQmlJSDebugger.a");
 
-    return byInstallDataHelper(sourcePath(), sourceFileNames(), directories, binFilenames);
+    return byInstallDataHelper(sourcePath(), sourceFileNames(), directories, binFilenames, false);
 }
 
 bool QmlDebuggingLibrary::canBuild(const QtVersion *qtVersion)
diff --git a/src/plugins/qt4projectmanager/qmldumptool.cpp b/src/plugins/qt4projectmanager/qmldumptool.cpp
index 27b8450ee954660c58fa4a9b3e47c608b396a247..84dc13a48ab1e2a9ee858f036c1780ee71d3f951 100644
--- a/src/plugins/qt4projectmanager/qmldumptool.cpp
+++ b/src/plugins/qt4projectmanager/qmldumptool.cpp
@@ -175,14 +175,20 @@ static inline QStringList validBinaryFilenames(bool debugBuild)
     return list;
 }
 
+static bool hasPrivateHeaders(const QString &qtInstallHeaders) {
+    const QString header = qtInstallHeaders
+            + QLatin1String("/QtDeclarative/private/qdeclarativemetatype_p.h");
+    return QFile::exists(header);
+}
+
 bool QmlDumpTool::canBuild(const QtVersion *qtVersion)
 {
     const QString installHeaders = qtVersion->versionInfo().value("QT_INSTALL_HEADERS");
-    const QString header = installHeaders + QLatin1String("/QtDeclarative/private/qdeclarativemetatype_p.h");
+
     return (qtVersion->supportsTargetId(Constants::DESKTOP_TARGET_ID)
             || (qtVersion->supportsTargetId(Constants::QT_SIMULATOR_TARGET_ID)
                 && (qtVersion->qtVersion() > QtVersionNumber(4, 7, 1))))
-            && QFile::exists(header);
+            && hasPrivateHeaders(installHeaders);
 }
 
 static QtVersion *qtVersionForProject(ProjectExplorer::Project *project)
@@ -234,7 +240,8 @@ QString QmlDumpTool::toolForProject(ProjectExplorer::Project *project, bool debu
     QtVersion *version = qtVersionForProject(project);
     if (version) {
         QString qtInstallData = version->versionInfo().value("QT_INSTALL_DATA");
-        QString toolPath = toolByInstallData(qtInstallData, debugDump);
+        QString qtInstallHeaders = version->versionInfo().value("QT_INSTALL_HEADERS");
+        QString toolPath = toolByInstallData(qtInstallData, qtInstallHeaders, debugDump);
         return toolPath;
     }
 
@@ -258,17 +265,17 @@ static QStringList sourceFileNames()
     return files;
 }
 
-QString QmlDumpTool::toolByInstallData(const QString &qtInstallData, bool debugDump)
+QString QmlDumpTool::toolByInstallData(const QString &qtInstallData, const QString &qtInstallHeaders,
+                                       bool debugDump)
 {
     if (!Core::ICore::instance())
         return QString();
 
-    const QString mainFilename = Core::ICore::instance()->resourcePath()
-            + QLatin1String("/qml/qmldump/main.cpp");
     const QStringList directories = installDirectories(qtInstallData);
     const QStringList binFilenames = validBinaryFilenames(debugDump);
 
-    return byInstallDataHelper(sourcePath(), sourceFileNames(), directories, binFilenames);
+    return byInstallDataHelper(sourcePath(), sourceFileNames(), directories, binFilenames,
+                               !hasPrivateHeaders(qtInstallHeaders));
 }
 
 QStringList QmlDumpTool::locationsByInstallData(const QString &qtInstallData, bool debugDump)
diff --git a/src/plugins/qt4projectmanager/qmldumptool.h b/src/plugins/qt4projectmanager/qmldumptool.h
index eca3a7a5f569becbba830fdbb43a4d68e752db11..c60c2bc4f99947e97a872e9d76286de0fa7e870c 100644
--- a/src/plugins/qt4projectmanager/qmldumptool.h
+++ b/src/plugins/qt4projectmanager/qmldumptool.h
@@ -53,7 +53,8 @@ class QT4PROJECTMANAGER_EXPORT QmlDumpTool : public Utils::BuildableHelperLibrar
 public:
     static bool canBuild(const QtVersion *qtVersion);
     static QString toolForProject(ProjectExplorer::Project *project, bool debugDump);
-    static QString toolByInstallData(const QString &qtInstallData, bool debugDump);
+    static QString toolByInstallData(const QString &qtInstallData, const QString &qtInstallHeaders,
+                                     bool debugDump);
     static QStringList locationsByInstallData(const QString &qtInstallData, bool debugDump);
 
     // Build the helpers and return the output log/errormessage.
diff --git a/src/plugins/qt4projectmanager/qmlobservertool.cpp b/src/plugins/qt4projectmanager/qmlobservertool.cpp
index d9db94f41a253aaf459c80df494f2d6f985bdd86..42295a4a55915372278240dde851c4ad7d7dc9d3 100644
--- a/src/plugins/qt4projectmanager/qmlobservertool.cpp
+++ b/src/plugins/qt4projectmanager/qmlobservertool.cpp
@@ -86,7 +86,7 @@ QString QmlObserverTool::toolByInstallData(const QString &qtInstallData)
     const QStringList directories = installDirectories(qtInstallData);
     const QStringList binFilenames = validBinaryFilenames();
 
-    return byInstallDataHelper(sourcePath(), sourceFileNames(), directories, binFilenames);
+    return byInstallDataHelper(sourcePath(), sourceFileNames(), directories, binFilenames, false);
 }
 
 QStringList QmlObserverTool::locationsByInstallData(const QString &qtInstallData)
diff --git a/src/plugins/qt4projectmanager/qtversionmanager.cpp b/src/plugins/qt4projectmanager/qtversionmanager.cpp
index 8c5c1345fe950915f4e64ba24dd74987676bead9..6bfb61d952fbe0378cc9ea0d68f840818befff30 100644
--- a/src/plugins/qt4projectmanager/qtversionmanager.cpp
+++ b/src/plugins/qt4projectmanager/qtversionmanager.cpp
@@ -1271,11 +1271,14 @@ void QtVersion::updateVersionInfo() const
 
     if (m_versionInfo.contains("QT_INSTALL_DATA")) {
         QString qtInstallData = m_versionInfo.value("QT_INSTALL_DATA");
+        QString qtHeaderData = m_versionInfo.value("QT_INSTALL_HEADERS");
         m_versionInfo.insert("QMAKE_MKSPECS", QDir::cleanPath(qtInstallData+"/mkspecs"));
 
         if (!qtInstallData.isEmpty()) {
             m_hasDebuggingHelper = !DebuggingHelperLibrary::debuggingHelperLibraryByInstallData(qtInstallData).isEmpty();
-            m_hasQmlDump = !QmlDumpTool::toolByInstallData(qtInstallData, false).isEmpty() || !QmlDumpTool::toolByInstallData(qtInstallData, true).isEmpty();
+            m_hasQmlDump
+                    = !QmlDumpTool::toolByInstallData(qtInstallData, qtHeaderData, false).isEmpty()
+                    || !QmlDumpTool::toolByInstallData(qtInstallData, qtHeaderData, true).isEmpty();
             m_hasQmlDebuggingLibrary
                     = !QmlDebuggingLibrary::libraryByInstallData(qtInstallData, false).isEmpty()
                 || !QmlDebuggingLibrary::libraryByInstallData(qtInstallData, true).isEmpty();
@@ -1975,9 +1978,10 @@ QString QtVersion::gdbDebuggingHelperLibrary() const
 QString QtVersion::qmlDumpTool(bool debugVersion) const
 {
     QString qtInstallData = versionInfo().value("QT_INSTALL_DATA");
+    QString qtHeaderData = versionInfo().value("QT_INSTALL_HEADERS");
     if (qtInstallData.isEmpty())
         return QString();
-    return QmlDumpTool::toolByInstallData(qtInstallData, debugVersion);
+    return QmlDumpTool::toolByInstallData(qtInstallData, qtHeaderData, debugVersion);
 }
 
 QString QtVersion::qmlDebuggingHelperLibrary(bool debugVersion) const