diff --git a/src/libs/utils/buildablehelperlibrary.cpp b/src/libs/utils/buildablehelperlibrary.cpp
index 809aab9b85ecc7e6d8565c3f3eddad8cd07341e7..2a9ccafe643771ff718f69e9ead8b4f4c7821b64 100644
--- a/src/libs/utils/buildablehelperlibrary.cpp
+++ b/src/libs/utils/buildablehelperlibrary.cpp
@@ -110,33 +110,6 @@ QString BuildableHelperLibrary::qtVersionForQMake(const QString &qmakePath)
     return QString();
 }
 
-bool BuildableHelperLibrary::checkMinimumQtVersion(const QString &qtVersionString, int majorVersion, int minorVersion, int patchVersion)
-{
-    int major = -1;
-    int minor = -1;
-    int patch = -1;
-
-    // check format
-    static QRegExp qtVersionRegex(QLatin1String("^\\d+\\.\\d+\\.\\d+$"));
-    if (!qtVersionRegex.exactMatch(qtVersionString))
-        return false;
-
-    QStringList parts = qtVersionString.split(QLatin1Char('.'));
-    major = parts.at(0).toInt();
-    minor = parts.at(1).toInt();
-    patch = parts.at(2).toInt();
-
-    if (major == majorVersion) {
-        if (minor == minorVersion) {
-            if (patch >= patchVersion)
-                return true;
-        } else if (minor > minorVersion)
-            return true;
-    }
-
-    return false;
-}
-
 QStringList BuildableHelperLibrary::possibleQMakeCommands()
 {
     // On windows no one has renamed qmake, right?
diff --git a/src/plugins/qt4projectmanager/qmakestep.cpp b/src/plugins/qt4projectmanager/qmakestep.cpp
index 31594ef2dc4b6d0071eb8a2f3612050307fa2fec..cb73fd02421f122513922e1c9dd8d1da03ac2942 100644
--- a/src/plugins/qt4projectmanager/qmakestep.cpp
+++ b/src/plugins/qt4projectmanager/qmakestep.cpp
@@ -332,24 +332,13 @@ bool QMakeStep::isQmlDebuggingLibrarySupported(QString *reason) const
     if (qt4BuildConfiguration()->qtVersion()->hasQmlDebuggingLibrary())
         return true;
 
-    int major, minor, patch;
-    if (!qt4BuildConfiguration()->qtVersion()->versionNumbers(&major, &minor, &patch)) {
+    if (!qt4BuildConfiguration()->qtVersion()->isValid()) {
         if (reason)
             *reason = tr("Invalid Qt version.");
         return false;
     }
 
-    // only support 4.7.1 onwards
-    bool compatibleQt = false;
-    if (major == 4) {
-        if (minor == 7) {
-            if (patch >= 1)
-                compatibleQt = true;
-        } else if (minor > 7)
-            compatibleQt = true;
-    }
-
-    if (!compatibleQt) {
+    if (qt4BuildConfiguration()->qtVersion()->qtVersion() < QtVersionNumber(4, 7 ,0)) {
         if (reason)
             *reason = tr("Requires Qt 4.7.1 or newer.");
         return false;
diff --git a/src/plugins/qt4projectmanager/qmldebugginglibrary.cpp b/src/plugins/qt4projectmanager/qmldebugginglibrary.cpp
index 0e5ce3e92a31ff0c6a4713b30a6c697cf36775ff..0f4dfdf1a3ab2838dd9a29eca5ef125eedc2a0a0 100644
--- a/src/plugins/qt4projectmanager/qmldebugginglibrary.cpp
+++ b/src/plugins/qt4projectmanager/qmldebugginglibrary.cpp
@@ -68,7 +68,7 @@ QString QmlDebuggingLibrary::libraryByInstallData(const QString &qtInstallData,
 
 bool QmlDebuggingLibrary::canBuild(const QtVersion *qtVersion)
 {
-    return checkMinimumQtVersion(qtVersion->qtVersionString(), 4, 7, 1);
+    return qtVersion->qtVersion() >=  QtVersionNumber(4, 7, 1);
 }
 
 bool  QmlDebuggingLibrary::build(const QString &directory, const QString &makeCommand,
diff --git a/src/plugins/qt4projectmanager/qmldumptool.cpp b/src/plugins/qt4projectmanager/qmldumptool.cpp
index fc61c15c3ce21df8bbd4f2e1c5c81e309772e1ff..c4b6d51e12e749ad67648893b5261f6cbab54da3 100644
--- a/src/plugins/qt4projectmanager/qmldumptool.cpp
+++ b/src/plugins/qt4projectmanager/qmldumptool.cpp
@@ -168,8 +168,8 @@ bool QmlDumpTool::canBuild(const QtVersion *qtVersion)
     const QString header = installHeaders + QLatin1String("/QtDeclarative/private/qdeclarativemetatype_p.h");
     return (qtVersion->supportsTargetId(Constants::DESKTOP_TARGET_ID)
             || (qtVersion->supportsTargetId(Constants::QT_SIMULATOR_TARGET_ID)
-                && checkMinimumQtVersion(qtVersion->qtVersionString(), 4, 7, 1)))
-           && QFile::exists(header);
+                && (qtVersion->qtVersion() > QtVersionNumber(4, 7, 1))))
+            && QFile::exists(header);
 }
 
 static QtVersion *qtVersionForProject(ProjectExplorer::Project *project)
diff --git a/src/plugins/qt4projectmanager/qmlobservertool.cpp b/src/plugins/qt4projectmanager/qmlobservertool.cpp
index 6a71634fa2897615e0eaa3f1b32d7b43082331b6..45e51b0c59b4cbe73f55acb90bcfdb68033b3f17 100644
--- a/src/plugins/qt4projectmanager/qmlobservertool.cpp
+++ b/src/plugins/qt4projectmanager/qmlobservertool.cpp
@@ -59,7 +59,7 @@ bool QmlObserverTool::canBuild(const QtVersion *qtVersion)
 {
     return (qtVersion->supportsTargetId(Constants::DESKTOP_TARGET_ID)
             || qtVersion->supportsTargetId(Constants::QT_SIMULATOR_TARGET_ID))
-            && checkMinimumQtVersion(qtVersion->qtVersionString(), 4, 7, 1);
+            && (qtVersion->qtVersion() > QtVersionNumber(4, 7, 1));
 }
 
 QString QmlObserverTool::toolForProject(ProjectExplorer::Project *project)
diff --git a/src/plugins/qt4projectmanager/qtversionmanager.cpp b/src/plugins/qt4projectmanager/qtversionmanager.cpp
index 58e9e457f6f3d5c23f5e390f605ee12f711a57b9..8132e2502f76f1eaeefe42debd24c7ccda43d10b 100644
--- a/src/plugins/qt4projectmanager/qtversionmanager.cpp
+++ b/src/plugins/qt4projectmanager/qtversionmanager.cpp
@@ -104,10 +104,16 @@ static T *createToolChain(const QString &id)
     return 0;
 }
 
+
+// prefer newer qts otherwise compare on id
+bool qtVersionNumberCompare(QtVersion *a, QtVersion *b)
+{
+    return a->qtVersion() > b->qtVersion() || (a->qtVersion() == b->qtVersion() && a->uniqueId() < b->uniqueId());
+}
+
 // --------------------------------------------------------------------------
 // QtVersionManager
 // --------------------------------------------------------------------------
-
 QtVersionManager *QtVersionManager::m_self = 0;
 
 QtVersionManager::QtVersionManager()
@@ -193,10 +199,9 @@ QtVersionManager::QtVersionManager()
             }
         }
 
-        m_versions.append(version);
+        m_versions.insert(version->uniqueId(), version);
     }
     s->endArray();
-    updateUniqueIdToIndexMap();
 
     ++m_idcount;
     addNewVersionsFromInstaller();
@@ -226,12 +231,12 @@ QtVersionManager *QtVersionManager::instance()
 void QtVersionManager::addVersion(QtVersion *version)
 {
     QTC_ASSERT(version != 0, return);
-    if (m_versions.contains(version))
+    if (m_versions.contains(version->uniqueId()))
         return;
 
-    m_versions.append(version);
     int uniqueId = version->uniqueId();
-    m_uniqueIdToIndex.insert(uniqueId, m_versions.count() - 1);
+    m_versions.insert(uniqueId, version);
+
     emit qtVersionsChanged(QList<int>() << uniqueId);
     writeVersionsIntoSettings();
 }
@@ -239,10 +244,8 @@ void QtVersionManager::addVersion(QtVersion *version)
 void QtVersionManager::removeVersion(QtVersion *version)
 {
     QTC_ASSERT(version != 0, return);
-    m_versions.removeAll(version);
-    int uniqueId = version->uniqueId();
-    m_uniqueIdToIndex.remove(uniqueId);
-    emit qtVersionsChanged(QList<int>() << uniqueId);
+    m_versions.remove(version->uniqueId());
+    emit qtVersionsChanged(QList<int>() << version->uniqueId());
     writeVersionsIntoSettings();
     delete version;
 }
@@ -256,13 +259,14 @@ bool QtVersionManager::supportsTargetId(const QString &id) const
     return false;
 }
 
-QList<QtVersion *> QtVersionManager::versionsForTargetId(const QString &id) const
+QList<QtVersion *> QtVersionManager::versionsForTargetId(const QString &id, const QtVersionNumber &minimumQtVersion) const
 {
     QList<QtVersion *> targetVersions;
     foreach (QtVersion *version, m_versions) {
-        if (version->supportsTargetId(id))
+        if (version->supportsTargetId(id) && version->qtVersion() >= minimumQtVersion)
             targetVersions.append(version);
     }
+    qSort(targetVersions.begin(), targetVersions.end(), &qtVersionNumberCompare);
     return targetVersions;
 }
 
@@ -341,19 +345,13 @@ int QtVersionManager::getUniqueId()
     return m_idcount++;
 }
 
-void QtVersionManager::updateUniqueIdToIndexMap()
-{
-    m_uniqueIdToIndex.clear();
-    for (int i = 0; i < m_versions.size(); ++i)
-        m_uniqueIdToIndex.insert(m_versions.at(i)->uniqueId(), i);
-}
-
 void QtVersionManager::writeVersionsIntoSettings()
 {
     QSettings *s = Core::ICore::instance()->settings();
     s->beginWriteArray(QtVersionsSectionName);
+    QMap<int, QtVersion *>::const_iterator it = m_versions.constBegin();
     for (int i = 0; i < m_versions.size(); ++i) {
-        const QtVersion *version = m_versions.at(i);
+        const QtVersion *version = it.value();
         s->setArrayIndex(i);
         s->setValue("Name", version->displayName());
         // for downwards compat
@@ -365,13 +363,18 @@ void QtVersionManager::writeVersionsIntoSettings()
             s->setValue("autodetectionSource", version->autodetectionSource());
         s->setValue("S60SDKDirectory", version->s60SDKDirectory());
         s->setValue(QLatin1String("SBSv2Directory"), version->sbsV2Directory());
+        ++it;
     }
     s->endArray();
 }
 
 QList<QtVersion *> QtVersionManager::versions() const
 {
-    return m_versions;
+    QList<QtVersion *> versions;
+    foreach (QtVersion *version, m_versions)
+        versions << version;
+    qSort(versions.begin(), versions.end(), &qtVersionNumberCompare);
+    return versions;
 }
 
 QList<QtVersion *> QtVersionManager::validVersions() const
@@ -381,22 +384,21 @@ QList<QtVersion *> QtVersionManager::validVersions() const
         if (v->isValid())
             results.append(v);
     }
+    qSort(results.begin(), results.end(), &qtVersionNumberCompare);
     return results;
 }
 
 bool QtVersionManager::isValidId(int id) const
 {
-    int pos = m_uniqueIdToIndex.value(id, -1);
-    return (pos != -1);
+    return m_versions.contains(id);
 }
 
 QtVersion *QtVersionManager::version(int id) const
 {
-    int pos = m_uniqueIdToIndex.value(id, -1);
-    if (pos != -1)
-        return m_versions.at(pos);
-
-    return m_emptyVersion;
+    QMap<int, QtVersion *>::const_iterator it = m_versions.find(id);
+    if (it == m_versions.constEnd())
+        return m_emptyVersion;
+    return it.value();
 }
 
 // FIXME: Rework this!
@@ -449,7 +451,7 @@ void QtVersionManager::addNewVersionsFromInstaller()
                 }
 
                 if (!versionWasAlreadyInList) {
-                    m_versions.append(version);
+                    m_versions.insert(version->uniqueId(), version);
                 } else {
                     // clean up
                     delete version;
@@ -457,7 +459,6 @@ void QtVersionManager::addNewVersionsFromInstaller()
             }
         }
     }
-    updateUniqueIdToIndexMap();
     settings->setValue(QLatin1String("General/LastQtVersionUpdate"), QDateTime::currentDateTime());
 }
 
@@ -483,8 +484,7 @@ void QtVersionManager::updateSystemVersion()
                                        getUniqueId(),
                                        true,
                                        PATH_AUTODETECTION_SOURCE);
-    m_versions.prepend(version);
-    updateUniqueIdToIndexMap();
+    m_versions.insert(version->uniqueId(), version);
 }
 
 QtVersion *QtVersionManager::emptyVersion() const
@@ -519,14 +519,14 @@ void QtVersionManager::setNewQtVersions(QList<QtVersion *> newVersions)
     QList<QtVersion *> sortedNewVersions = newVersions;
     SortByUniqueId sortByUniqueId;
     qSort(sortedNewVersions.begin(), sortedNewVersions.end(), sortByUniqueId);
-    qSort(m_versions.begin(), m_versions.end(), sortByUniqueId);
 
     QList<int> changedVersions;
     // So we trying to find the minimal set of changed versions,
     // iterate over both sorted list
 
     // newVersions and oldVersions iterator
-    QList<QtVersion *>::const_iterator nit, nend, oit, oend;
+    QList<QtVersion *>::const_iterator nit, nend;
+    QMap<int, QtVersion *>::const_iterator oit, oend;
     nit = sortedNewVersions.constBegin();
     nend = sortedNewVersions.constEnd();
     oit = m_versions.constBegin();
@@ -561,11 +561,11 @@ void QtVersionManager::setNewQtVersions(QList<QtVersion *> newVersions)
 
     qDeleteAll(m_versions);
     m_versions.clear();
-    m_versions = newVersions;
+    foreach (QtVersion *v, sortedNewVersions)
+        m_versions.insert(v->uniqueId(), v);
 
     if (!changedVersions.isEmpty())
         updateDocumentation();
-    updateUniqueIdToIndexMap();
 
     updateExamples();
     writeVersionsIntoSettings();
@@ -837,26 +837,10 @@ QString QtVersion::qtVersionString() const
     return m_qtVersionString;
 }
 
-bool QtVersion::versionNumbers(int *majorNumber, int *minorNumber, int *patchNumber) const
+QtVersionNumber QtVersion::qtVersion() const
 {
-    const QString versionString = qtVersionString();
-    if (versionString.isEmpty())
-        return false;
-
-    // check format
-    static QRegExp qtVersionRegex(QLatin1String("^\\d+\\.\\d+\\.\\d+$"));
-    if (!qtVersionRegex.exactMatch(versionString))
-        return false;
-
-    QStringList parts = versionString.split(QLatin1Char('.'));
-    if (majorNumber)
-        *majorNumber = parts.at(0).toInt();
-    if (minorNumber)
-        *minorNumber = parts.at(1).toInt();
-    if (patchNumber)
-        *patchNumber = parts.at(2).toInt();
-
-    return true;
+    //todo cache this;
+    return QtVersionNumber(qtVersionString());
 }
 
 QHash<QString,QString> QtVersion::versionInfo() const
@@ -1951,3 +1935,87 @@ void QtVersion::invalidateCache()
 {
     m_versionInfoUpToDate = false;
 }
+
+///////////////
+// QtVersionNumber
+///////////////
+
+
+QtVersionNumber::QtVersionNumber(int ma, int mi, int p)
+    : majorVersion(ma), minorVersion(mi), patchVersion(p)
+{
+}
+
+QtVersionNumber::QtVersionNumber(const QString &versionString)
+{
+    if (!checkVersionString(versionString))
+        majorVersion = minorVersion = patchVersion = -1;
+
+    QStringList parts = versionString.split(QLatin1Char('.'));
+    majorVersion = parts.at(0).toInt();
+    minorVersion = parts.at(1).toInt();
+    patchVersion = parts.at(2).toInt();
+}
+
+QtVersionNumber::QtVersionNumber()
+{
+    majorVersion = minorVersion = patchVersion = -1;
+}
+
+
+bool QtVersionNumber::checkVersionString(const QString &version) const
+{
+    int dots = 0;
+    QString validChars = "0123456789.";
+    foreach (const QChar &c, version) {
+        if (!validChars.contains(c))
+            return false;
+        if (c == '.')
+            ++dots;
+    }
+    if (dots != 2)
+        return false;
+    return true;
+}
+
+bool QtVersionNumber::operator <(const QtVersionNumber &b) const
+{
+    if (majorVersion < b.majorVersion)
+        return true;
+    if (majorVersion > b.majorVersion)
+        return false;
+    if (minorVersion < b.minorVersion)
+        return true;
+    if (minorVersion > b.minorVersion)
+        return false;
+    if (patchVersion < b.patchVersion)
+        return true;
+    return false;
+}
+
+bool QtVersionNumber::operator >(const QtVersionNumber &b) const
+{
+    return b < *this;
+}
+
+bool QtVersionNumber::operator ==(const QtVersionNumber &b) const
+{
+    return majorVersion == b.majorVersion
+            && minorVersion == b.minorVersion
+            && patchVersion == b.patchVersion;
+}
+
+bool QtVersionNumber::operator !=(const QtVersionNumber &b) const
+{
+    return !(*this == b);
+}
+
+bool QtVersionNumber::operator <=(const QtVersionNumber &b) const
+{
+    return !(*this > b);
+}
+
+bool QtVersionNumber::operator >=(const QtVersionNumber &b) const
+{
+    return b <= *this;
+}
diff --git a/src/plugins/qt4projectmanager/qtversionmanager.h b/src/plugins/qt4projectmanager/qtversionmanager.h
index a2daba6889d92abe774dfb02f132335d20fef4b0..f8ca79ccf4e37f042b0d9c7b1128ad3224df923f 100644
--- a/src/plugins/qt4projectmanager/qtversionmanager.h
+++ b/src/plugins/qt4projectmanager/qtversionmanager.h
@@ -58,6 +58,27 @@ class QtOptionsPageWidget;
 class QtOptionsPage;
 }
 
+class QT4PROJECTMANAGER_EXPORT QtVersionNumber
+{
+public:
+    QtVersionNumber(int ma, int mi, int p);
+    QtVersionNumber(const QString &versionString);
+    QtVersionNumber();
+
+    int majorVersion;
+    int minorVersion;
+    int patchVersion;
+    bool operator <(const QtVersionNumber &b) const;
+    bool operator <=(const QtVersionNumber &b) const;
+    bool operator >(const QtVersionNumber &b) const;
+    bool operator >=(const QtVersionNumber &b) const;
+    bool operator !=(const QtVersionNumber &b) const;
+    bool operator ==(const QtVersionNumber &b) const;
+private:
+    bool checkVersionString(const QString &version) const;
+};
+
+
 class QT4PROJECTMANAGER_EXPORT QtVersion
 {
     friend class QtVersionManager;
@@ -106,8 +127,7 @@ public:
     void setQMakeCommand(const QString &path);
 
     QString qtVersionString() const;
-    bool versionNumbers(int *majorNumber, int *minorNumber, int *patchNumber) const;
-
+    QtVersionNumber qtVersion() const;
     // Returns the PREFIX, BINPREFIX, DOCPREFIX and similar information
     QHash<QString,QString> versionInfo() const;
 
@@ -260,7 +280,8 @@ public:
     bool supportsTargetId(const QString &id) const;
     // This returns a list of versions that support the target with the given id.
     // @return A list of QtVersions that supports a target. This list may be empty!
-    QList<QtVersion *> versionsForTargetId(const QString &id) const;
+
+    QList<QtVersion *> versionsForTargetId(const QString &id, const QtVersionNumber &minimumQtVersion = QtVersionNumber()) const;
     QSet<QString> supportedTargetIds() const;
 
     // Static Methods
@@ -299,8 +320,7 @@ private:
     void updateUniqueIdToIndexMap();
 
     QtVersion *m_emptyVersion;
-    QList<QtVersion *> m_versions;
-    QMap<int, int> m_uniqueIdToIndex;
+    QMap<int, QtVersion *> m_versions;
     int m_idcount;
     // managed by QtProjectManagerPlugin
     static QtVersionManager *m_self;