From 17a7bd17d08489453d6a679aab711a946e023ff3 Mon Sep 17 00:00:00 2001
From: Thomas Hartmann <Thomas.Hartmann@nokia.com>
Date: Wed, 18 Jan 2012 13:50:14 +0100
Subject: [PATCH] Wizards: allows filtering of wizards based on Qt version

Every wizard now implements requiredFeatures() to define a feature set.
If the feature set is not satisfied by the available Qt Versions,
the wizard is not shown in the create file/project dialog.

Every Qt version can define the provided feature set in availableFeatures()
defined in BaseQtVersion.

Change-Id: Ie9e2c210d19187b2296451948c36d274f2096623
Reviewed-by: Daniel Teske <daniel.teske@nokia.com>
Reviewed-by: Alessandro Portale <alessandro.portale@nokia.com>
---
 .../wizards/plaincapp-cmake/wizard.xml        |   2 +-
 .../templates/wizards/plaincapp/wizard.xml    |   3 +-
 .../wizards/plaincppapp-cmake/wizard.xml      |   2 +-
 .../templates/wizards/plaincppapp/wizard.xml  |   3 +-
 .../wizards/qtcreatorplugin/wizard.xml        |   3 +-
 src/plugins/coreplugin/basefilewizard.cpp     |  26 ++-
 src/plugins/coreplugin/basefilewizard.h       |   6 +
 src/plugins/coreplugin/coreplugin.pro         |   6 +-
 src/plugins/coreplugin/dialogs/iwizard.cpp    |  13 ++
 src/plugins/coreplugin/dialogs/iwizard.h      |   6 +
 src/plugins/coreplugin/dialogs/newdialog.cpp  |  28 +--
 src/plugins/coreplugin/featureprovider.cpp    | 111 ++++++++++++
 src/plugins/coreplugin/featureprovider.h      | 161 ++++++++++++++++++
 src/plugins/cppeditor/cppclasswizard.cpp      |   5 +
 src/plugins/cppeditor/cppclasswizard.h        |   2 +
 src/plugins/designer/cpp/formclasswizard.cpp  |   6 +
 src/plugins/designer/cpp/formclasswizard.h    |   2 +
 src/plugins/designer/formwizard.cpp           |   6 +
 src/plugins/designer/formwizard.h             |   2 +
 .../genericprojectwizard.cpp                  |   5 +
 .../genericprojectwizard.h                    |   1 +
 src/plugins/glsleditor/glslfilewizard.cpp     |   5 +
 src/plugins/glsleditor/glslfilewizard.h       |   2 +
 src/plugins/madde/maemoqtversion.cpp          |   9 +
 src/plugins/madde/maemoqtversion.h            |   2 +
 src/plugins/madde/qt4maemotargetfactory.cpp   |   2 -
 .../customwizard/customwizard.cpp             |   4 +
 .../customwizard/customwizard.h               |   2 +
 .../customwizard/customwizardparameters.cpp   |  15 ++
 src/plugins/qmljseditor/jsfilewizard.cpp      |   5 +
 src/plugins/qmljseditor/jsfilewizard.h        |   2 +
 .../qmlprojectapplicationwizard.cpp           |   5 +
 .../qmlprojectapplicationwizard.h             |   1 +
 .../buildconfigurationinfo.h                  |   2 +
 .../customwidgetwizard/customwidgetwizard.cpp |   7 +
 .../customwidgetwizard/customwidgetwizard.h   |   1 +
 .../qt-desktop/desktopqtversion.cpp           |   9 +
 .../qt-desktop/desktopqtversion.h             |   2 +
 .../qt-desktop/qt4desktoptargetfactory.cpp    |   8 +-
 .../qt-desktop/qt4simulatortargetfactory.cpp  |   6 +-
 .../qt-s60/qt4symbiantargetfactory.cpp        |   5 +-
 .../qt-s60/symbianqtversion.cpp               |  10 ++
 .../qt-s60/symbianqtversion.h                 |   2 +
 .../qt4projectmanagerconstants.h              |   5 -
 src/plugins/qt4projectmanager/qt4target.cpp   |   9 +
 .../wizards/consoleappwizard.cpp              |   6 +
 .../wizards/consoleappwizard.h                |   2 +
 .../wizards/emptyprojectwizard.cpp            |   5 +
 .../wizards/emptyprojectwizard.h              |   1 +
 .../wizards/guiappwizard.cpp                  |   6 +
 .../qt4projectmanager/wizards/guiappwizard.h  |   1 +
 .../wizards/html5appwizard.cpp                |   6 +
 .../wizards/html5appwizard.h                  |   1 +
 .../wizards/librarywizard.cpp                 |   5 +
 .../qt4projectmanager/wizards/librarywizard.h |   1 +
 .../wizards/mobileappwizard.cpp               |   8 +
 .../wizards/mobileappwizard.h                 |   1 +
 .../wizards/qtquickappwizard.cpp              |  21 +--
 .../wizards/qtquickappwizard.h                |   1 +
 .../wizards/subdirsprojectwizard.cpp          |   5 +
 .../wizards/subdirsprojectwizard.h            |   1 +
 .../wizards/targetsetuppage.cpp               |  13 +-
 .../wizards/targetsetuppage.h                 |   9 +-
 .../qt4projectmanager/wizards/testwizard.cpp  |   7 +
 .../qt4projectmanager/wizards/testwizard.h    |   1 +
 src/plugins/qtsupport/baseqtversion.cpp       |  15 ++
 src/plugins/qtsupport/baseqtversion.h         |   3 +
 src/plugins/qtsupport/qtsupportconstants.h    |  11 ++
 src/plugins/qtsupport/qtsupportplugin.cpp     |   4 +
 src/plugins/qtsupport/qtversionmanager.cpp    |  19 +++
 src/plugins/qtsupport/qtversionmanager.h      |  16 ++
 src/plugins/vcsbase/basecheckoutwizard.cpp    |   5 +
 src/plugins/vcsbase/basecheckoutwizard.h      |   2 +
 73 files changed, 640 insertions(+), 55 deletions(-)
 create mode 100644 src/plugins/coreplugin/featureprovider.cpp
 create mode 100644 src/plugins/coreplugin/featureprovider.h

diff --git a/share/qtcreator/templates/wizards/plaincapp-cmake/wizard.xml b/share/qtcreator/templates/wizards/plaincapp-cmake/wizard.xml
index d97b6ef5b61..4751aa86d77 100644
--- a/share/qtcreator/templates/wizards/plaincapp-cmake/wizard.xml
+++ b/share/qtcreator/templates/wizards/plaincapp-cmake/wizard.xml
@@ -37,7 +37,7 @@ the project file goes last.
 The "class" and "firstpage" attributes specify that it is a Qt 4 wizard and
 leave room for the Qt 4 target page.
 -->
-<wizard version="1" kind="project" firstpage="10" id="S.Plain C (CMake)" category="I.Projects">
+<wizard version="1" kind="project" firstpage="10" id="S.Plain C (CMake)" category="I.Projects" featuresRequired="QtSupport.Wizards.FeatureGenericCppEntryPoint">
     <icon>console.png</icon>
     <description>Creates a plain C project using CMake, not using the Qt library.</description>
     <displayname>Plain C Project (CMake Build)</displayname>;
diff --git a/share/qtcreator/templates/wizards/plaincapp/wizard.xml b/share/qtcreator/templates/wizards/plaincapp/wizard.xml
index a5b860245ec..057f84e7708 100644
--- a/share/qtcreator/templates/wizards/plaincapp/wizard.xml
+++ b/share/qtcreator/templates/wizards/plaincapp/wizard.xml
@@ -39,7 +39,8 @@ leave room for the Qt 4 target page.
 -->
 <wizard version="1" kind="project"
         class="qt4project" firstpage="10"
-        id="R.Plain C" category="I.Projects">
+        id="R.Plain C" category="I.Projects"
+        featuresRequired="QtSupport.Wizards.FeatureGenericCppEntryPoint">
     <icon>console.png</icon>
     <description>Creates a plain C project using qmake, not using the Qt library.</description>
     <displayname>Plain C Project</displayname>;
diff --git a/share/qtcreator/templates/wizards/plaincppapp-cmake/wizard.xml b/share/qtcreator/templates/wizards/plaincppapp-cmake/wizard.xml
index 7cfd1d5a3be..3c00bc218d3 100644
--- a/share/qtcreator/templates/wizards/plaincppapp-cmake/wizard.xml
+++ b/share/qtcreator/templates/wizards/plaincppapp-cmake/wizard.xml
@@ -37,7 +37,7 @@ the project file goes last.
 The "class" and "firstpage" attributes specify that it is a Qt 4 wizard and
 leave room for the Qt 4 target page.
 -->
-<wizard version="1" kind="project" firstpage="10" id="S.Plain C++ (CMake)" category="I.Projects">
+<wizard version="1" kind="project" firstpage="10" id="S.Plain C++ (CMake)" category="I.Projects" featuresRequired="QtSupport.Wizards.FeatureGenericCppEntryPoint">
     <icon>console.png</icon>
     <description>Creates a plain C++ project using CMake, not using the Qt library.</description>
     <displayname>Plain C++ Project (CMake Build)</displayname>;
diff --git a/share/qtcreator/templates/wizards/plaincppapp/wizard.xml b/share/qtcreator/templates/wizards/plaincppapp/wizard.xml
index 44cf3016fac..ba6168f5beb 100644
--- a/share/qtcreator/templates/wizards/plaincppapp/wizard.xml
+++ b/share/qtcreator/templates/wizards/plaincppapp/wizard.xml
@@ -39,7 +39,8 @@ leave room for the Qt 4 target page.
 -->
 <wizard version="1" kind="project"
         class="qt4project" firstpage="10"
-        id="R.Plain C++" category="I.Projects">
+        id="R.Plain C++" category="I.Projects"
+        featuresRequired="QtSupport.Wizards.FeatureGenericCppEntryPoint">
     <icon>console.png</icon>
     <description>Creates a plain C++ project using qmake, not using the Qt library.</description>
     <displayname>Plain C++ Project</displayname>;
diff --git a/share/qtcreator/templates/wizards/qtcreatorplugin/wizard.xml b/share/qtcreator/templates/wizards/qtcreatorplugin/wizard.xml
index ee16a8de346..e08c559c82f 100644
--- a/share/qtcreator/templates/wizards/qtcreatorplugin/wizard.xml
+++ b/share/qtcreator/templates/wizards/qtcreatorplugin/wizard.xml
@@ -39,7 +39,8 @@ leave room for the Qt 4 target page.
 -->
 <wizard version="1" kind="project"
         class="qt4project" firstpage="10"
-        id="R.QtCreatorPlugin" category="F.QtProjects">
+        id="R.QtCreatorPlugin" category="F.QtProjects"
+        featuresRequired="QtSupport.Wizards.FeatureGenericCppEntryPoint,QtSupport.Wizards.FeatureQt">
     <icon>qtcreator_logo_24.png</icon>
     <description>Creates a custom Qt Creator plugin.</description>
     <displayname>Qt Creator Plugin</displayname>;
diff --git a/src/plugins/coreplugin/basefilewizard.cpp b/src/plugins/coreplugin/basefilewizard.cpp
index 8f91bc9c84c..9f35f5c09fb 100644
--- a/src/plugins/coreplugin/basefilewizard.cpp
+++ b/src/plugins/coreplugin/basefilewizard.cpp
@@ -86,6 +86,7 @@ public:
     QString id;
     QString category;
     QString displayCategory;
+    Core::FeatureSet requiredFeatures;
 };
 
 BaseFileWizardParameterData::BaseFileWizardParameterData(IWizard::WizardKind k) :
@@ -145,7 +146,8 @@ CORE_EXPORT QDebug operator<<(QDebug d, const BaseFileWizardParameters &p)
                 << " Category: " << p.category()
                 << " DisplayName: " << p.displayName()
                 << " Description: " << p.description()
-                << " DisplayCategory: " << p.displayCategory();
+                << " DisplayCategory: " << p.displayCategory()
+                << " Required Features: " << p.requiredFeatures().toStringList();
     return d;
 }
 
@@ -214,6 +216,17 @@ QString BaseFileWizardParameters::displayCategory() const
     return m_d->displayCategory;
 }
 
+Core::FeatureSet BaseFileWizardParameters::requiredFeatures() const
+{
+    return m_d->requiredFeatures;
+}
+
+void BaseFileWizardParameters::setRequiredFeatures(Core::FeatureSet features)
+{
+
+    m_d->requiredFeatures = features;
+}
+
 void BaseFileWizardParameters::setDisplayCategory(const QString &v)
 {
     m_d->displayCategory = v;
@@ -349,6 +362,11 @@ BaseFileWizard::BaseFileWizard(const BaseFileWizardParameters &parameters,
 {
 }
 
+BaseFileWizardParameters BaseFileWizard::baseFileWizardParameters() const
+{
+    return d->m_parameters;
+}
+
 BaseFileWizard::~BaseFileWizard()
 {
     delete d;
@@ -497,6 +515,12 @@ void BaseFileWizard::runWizard(const QString &path, QWidget *parent)
         QMessageBox::critical(0, tr("File Generation Failure"), errorMessage);
 }
 
+
+Core::FeatureSet BaseFileWizard::requiredFeatures() const
+{
+    return d->m_parameters.requiredFeatures();
+}
+
 /*!
     \fn virtual QWizard *Core::BaseFileWizard::createWizardDialog(QWidget *parent,
                                                                   const QString &defaultPath,
diff --git a/src/plugins/coreplugin/basefilewizard.h b/src/plugins/coreplugin/basefilewizard.h
index 1539a90e1e3..80e353b1614 100644
--- a/src/plugins/coreplugin/basefilewizard.h
+++ b/src/plugins/coreplugin/basefilewizard.h
@@ -91,6 +91,9 @@ public:
     QString displayCategory() const;
     void setDisplayCategory(const QString &trCategory);
 
+    Core::FeatureSet requiredFeatures() const;
+    void setRequiredFeatures(Core::FeatureSet features);
+
 private:
     QSharedDataPointer<BaseFileWizardParameterData> m_d;
 };
@@ -115,6 +118,7 @@ public:
     virtual QString displayCategory() const;
 
     virtual void runWizard(const QString &path, QWidget *parent);
+    virtual Core::FeatureSet requiredFeatures() const;
 
     static QString buildFileName(const QString &path, const QString &baseName, const QString &extension);
     static void setupWizard(QWizard *);
@@ -125,6 +129,8 @@ protected:
 
     explicit BaseFileWizard(const BaseFileWizardParameters &parameters, QObject *parent = 0);
 
+    BaseFileWizardParameters baseFileWizardParameters() const;
+
     virtual QWizard *createWizardDialog(QWidget *parent,
                                         const QString &defaultPath,
                                         const WizardPageList &extensionPages) const = 0;
diff --git a/src/plugins/coreplugin/coreplugin.pro b/src/plugins/coreplugin/coreplugin.pro
index c65054df867..d2cc2b02b3e 100644
--- a/src/plugins/coreplugin/coreplugin.pro
+++ b/src/plugins/coreplugin/coreplugin.pro
@@ -95,7 +95,8 @@ SOURCES += mainwindow.cpp \
     mimetypesettings.cpp \
     dialogs/promptoverwritedialog.cpp \
     fileutils.cpp \
-    textfile.cpp
+    textfile.cpp \
+    featureprovider.cpp
 
 HEADERS += mainwindow.h \
     editmode.h \
@@ -192,7 +193,8 @@ HEADERS += mainwindow.h \
     fileutils.h \
     externaltoolmanager.h \
     textfile.h \
-    generatedfile.h
+    generatedfile.h \
+    featureprovider.h
 
 FORMS += dialogs/newdialog.ui \
     actionmanager/commandmappings.ui \
diff --git a/src/plugins/coreplugin/dialogs/iwizard.cpp b/src/plugins/coreplugin/dialogs/iwizard.cpp
index ec8c203d8f9..3dec333a5b9 100644
--- a/src/plugins/coreplugin/dialogs/iwizard.cpp
+++ b/src/plugins/coreplugin/dialogs/iwizard.cpp
@@ -35,6 +35,8 @@
 
 #include <extensionsystem/pluginmanager.h>
 
+#include <QtCore/QStringList>
+
 /*!
     \class Core::IWizard
     \mainclass
@@ -178,3 +180,14 @@ QList<IWizard*> IWizard::wizardsOfKind(WizardKind kind)
     return findWizards(WizardKindPredicate(kind));
 }
 
+bool IWizard::isAvailable() const
+{
+    FeatureSet availableFeatures;
+
+    const QList<Core::IFeatureProvider*> featureManagers = ExtensionSystem::PluginManager::instance()->getObjects<Core::IFeatureProvider>();
+
+    foreach (const Core::IFeatureProvider *featureManager, featureManagers)
+        availableFeatures |= featureManager->availableFeatures();
+
+    return availableFeatures.contains(requiredFeatures());
+}
diff --git a/src/plugins/coreplugin/dialogs/iwizard.h b/src/plugins/coreplugin/dialogs/iwizard.h
index 19966427474..991df2b820a 100644
--- a/src/plugins/coreplugin/dialogs/iwizard.h
+++ b/src/plugins/coreplugin/dialogs/iwizard.h
@@ -34,6 +34,8 @@
 #define IWIZARD_H
 
 #include <coreplugin/core_global.h>
+#include <coreplugin/featureprovider.h>
+
 #include <QtCore/QObject>
 
 QT_BEGIN_NAMESPACE
@@ -66,8 +68,12 @@ public:
     virtual QString category() const = 0;
     virtual QString displayCategory() const = 0;
 
+    virtual FeatureSet requiredFeatures() const = 0;
+
     virtual void runWizard(const QString &path, QWidget *parent) = 0;
 
+    bool isAvailable() const;
+
     // Utility to find all registered wizards
     static QList<IWizard*> allWizards();
     // Utility to find all registered wizards of a certain kind
diff --git a/src/plugins/coreplugin/dialogs/newdialog.cpp b/src/plugins/coreplugin/dialogs/newdialog.cpp
index e07a20be640..fc6cd2fe32b 100644
--- a/src/plugins/coreplugin/dialogs/newdialog.cpp
+++ b/src/plugins/coreplugin/dialogs/newdialog.cpp
@@ -37,7 +37,7 @@
 #include <utils/stylehelper.h>
 
 #include <coreplugin/coreconstants.h>
-#include <coreplugin/dialogs/iwizard.h>
+#include <coreplugin/featureprovider.h>
 
 #include <QtGui/QAbstractProxyModel>
 #include <QtGui/QItemSelectionModel>
@@ -249,19 +249,21 @@ void NewDialog::setWizards(QList<IWizard*> wizards)
             cit = categories.insert(categoryName, categoryItem);
         }
         // add item
-        QStandardItem *wizardItem = new QStandardItem(wizard->displayName());
-        QIcon wizardIcon;
-
-        // spacing hack. Add proper icons instead
-        if (wizard->icon().isNull()) {
-            wizardIcon = m_dummyIcon;
-        } else {
-            wizardIcon = wizard->icon();
+        if (wizard->isAvailable()) {
+            QStandardItem *wizardItem = new QStandardItem(wizard->displayName());
+            QIcon wizardIcon;
+
+            // spacing hack. Add proper icons instead
+            if (wizard->icon().isNull()) {
+                wizardIcon = m_dummyIcon;
+            } else {
+                wizardIcon = wizard->icon();
+            }
+            wizardItem->setIcon(wizardIcon);
+            wizardItem->setData(QVariant::fromValue(wizard), Qt::UserRole);
+            wizardItem->setFlags(Qt::ItemIsEnabled|Qt::ItemIsSelectable);
+            cit.value()->appendRow(wizardItem);
         }
-        wizardItem->setIcon(wizardIcon);
-        wizardItem->setData(QVariant::fromValue(wizard), Qt::UserRole);
-        wizardItem->setFlags(Qt::ItemIsEnabled|Qt::ItemIsSelectable);
-        cit.value()->appendRow(wizardItem);
     }
 
 
diff --git a/src/plugins/coreplugin/featureprovider.cpp b/src/plugins/coreplugin/featureprovider.cpp
new file mode 100644
index 00000000000..520b2e48210
--- /dev/null
+++ b/src/plugins/coreplugin/featureprovider.cpp
@@ -0,0 +1,111 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+**
+** GNU Lesser General Public License Usage
+**
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this file.
+** Please review the following information to ensure the GNU Lesser General
+** Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** Other Usage
+**
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**************************************************************************/
+
+#include "featureprovider.h"
+
+/*!
+    \class Core::IFeatureProvider
+    \mainclass
+
+    \brief The class IFeatureProvider defines an interface to manage features for wizards
+
+    The features provided by an object in the object pool implementing IFeatureProvider
+    will be respected by wizards implementing IWizard.
+
+    This feature set, provided by all instances of IFeatureProvider in the object pool, is checked against IWizard::requiredFeatures()
+    and only if all required features are available the wizard is displayed when creating a new file or project.
+
+    Qt4VersionManager creates an instance of IFeatureProvider and provides Qt specific features for the available
+    versions of Qt.
+
+    \sa Core::IWizard
+    \sa QtSupport::QtVersionManager
+*/
+
+
+/*!
+    \fn IFeatureProvider::IFeatureProvider()
+    \internal
+*/
+
+/*!
+    \fn IFeatureProvider::~IFeatureProvider()
+    \internal
+*/
+
+/*!
+    \fn FeatureProvider::Features availableFeatures() const;
+    Returns available features provided by this manager.
+    \sa FeatureProvider::Features
+*/
+
+/*!
+    \class Core::FeatureProvider::Feature
+
+    \brief This class describes a single Feature
+
+    This class describes a single Feature to be used
+    in Core::FeatureProvider::Features.
+
+    \sa Core::FeatureProvider::Features
+    \sa Core::IWizard
+    \sa QtSupport::QtVersionManager
+*/
+
+/*!
+    \class Core::FeatureProvider::Features
+
+    \brief This class is a set of features
+
+    Features is used to describe available or
+    required feature sets and behaves similar to QFlags.
+
+    But instead of enums Features relies on string ids
+    and is therefore extendable.
+
+    \sa Core::FeatureProvider::Feature
+    \sa Core::IWizard
+    \sa QtSupport::QtVersionManager
+*/
+
+
+/*!
+    \fn bool Features::~contains(const Feature &feature)()
+
+    \returns true if the \param features is available.
+*/
+
+/*!
+    \fn bool Features::~contains(const Features &features)()
+
+    \returns true if all \param features are available.
+*/
diff --git a/src/plugins/coreplugin/featureprovider.h b/src/plugins/coreplugin/featureprovider.h
new file mode 100644
index 00000000000..fcb48156549
--- /dev/null
+++ b/src/plugins/coreplugin/featureprovider.h
@@ -0,0 +1,161 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+**
+** GNU Lesser General Public License Usage
+**
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this file.
+** Please review the following information to ensure the GNU Lesser General
+** Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** Other Usage
+**
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**************************************************************************/
+
+#ifndef FEATUREMANAGER_H
+#define FEATUREMANAGER_H
+
+#include "core_global.h"
+
+#include <coreplugin/id.h>
+
+#include <QtCore/QObject>
+#include <QtCore/QSet>
+#include <QtCore/QStringList>
+
+
+namespace Utils {
+class AbstractMacroExpander;
+}
+
+namespace Core {
+
+class CORE_EXPORT FeatureSet;
+
+class CORE_EXPORT IFeatureProvider : public QObject
+{
+    Q_OBJECT
+
+public:
+    IFeatureProvider() {}
+    virtual ~IFeatureProvider() {}
+    virtual FeatureSet availableFeatures() const = 0;
+};
+
+class CORE_EXPORT Feature : public Id
+{
+friend class FeatureSet;
+public:
+    Feature(const char *name) : Id(name) {}
+    explicit Feature(const QString &name) : Id(name) {}
+};
+
+class CORE_EXPORT FeatureSet : private QSet<Feature>
+{
+public:
+    FeatureSet() {}
+
+    FeatureSet(const Feature &feature)
+    {
+        if (feature.toString().isEmpty())
+            return;
+
+        insert(feature);
+    }
+
+    FeatureSet(const FeatureSet &other) : QSet<Feature>(other) {}
+
+    FeatureSet &operator=(const FeatureSet &other)
+    {
+       QSet<Feature>::operator=(other);
+       return *this;
+    }
+
+    bool contains(const Feature &feature) const
+    {
+        return QSet<Feature>::contains(feature);
+    }
+
+    bool contains(const FeatureSet &features) const
+    {
+        return QSet<Feature>::contains(features);
+    }
+
+    void remove(const Feature &feature)
+    {
+        QSet<Feature>::remove(feature);
+    }
+
+    FeatureSet operator|(const Feature &feature) const
+    {
+        FeatureSet copy = *this;
+        if (feature.isValid())
+            copy.insert(feature);
+        return copy;
+    }
+
+    FeatureSet operator|(const FeatureSet &features) const
+    {
+        FeatureSet copy = *this;
+        if (!features.isEmpty())
+            copy.unite(features);
+        return copy;
+    }
+
+    FeatureSet &operator|=(const Feature &feature)
+    {
+        if (feature.isValid())
+           insert(feature);
+        return *this;
+    }
+
+    FeatureSet &operator|=(const FeatureSet &features)
+    {
+        if (!features.isEmpty())
+            unite(features);
+        return *this;
+    }
+
+    QStringList toStringList() const
+    {
+        QStringList stringList;
+        foreach (const Feature &feature, QSet<Feature>(*this))
+            stringList.append(feature.toString());
+        return stringList;
+    }
+};
+
+} // namespace Core
+
+/*
+The following operators have to be defined in the global namespace!
+Otherwise "using namespace Core" would hide other | operators
+defined in the global namespace (e. g. QFlags).
+*/
+
+inline Core::FeatureSet operator |(Core::Feature feature1, Core::Feature feature2)
+{ return Core::FeatureSet(feature1) | feature2; }
+
+inline Core::FeatureSet operator|(Core::Feature feature1, Core::FeatureSet feature2)
+{ return feature2 | feature1; }
+
+
+#endif // FEATUREANAGER_H
diff --git a/src/plugins/cppeditor/cppclasswizard.cpp b/src/plugins/cppeditor/cppclasswizard.cpp
index 4563376fe3d..3bdc3a1f6a9 100644
--- a/src/plugins/cppeditor/cppclasswizard.cpp
+++ b/src/plugins/cppeditor/cppclasswizard.cpp
@@ -155,6 +155,11 @@ CppClassWizard::CppClassWizard(const Core::BaseFileWizardParameters &parameters,
 {
 }
 
+Core::FeatureSet CppClassWizard::requiredFeatures() const
+{
+    return Core::FeatureSet();
+}
+
 QString CppClassWizard::sourceSuffix() const
 {
     return preferredSuffix(QLatin1String(Constants::CPP_SOURCE_MIMETYPE));
diff --git a/src/plugins/cppeditor/cppclasswizard.h b/src/plugins/cppeditor/cppclasswizard.h
index 4531c10dce5..9d6f1efa4cf 100644
--- a/src/plugins/cppeditor/cppclasswizard.h
+++ b/src/plugins/cppeditor/cppclasswizard.h
@@ -102,6 +102,8 @@ public:
     explicit CppClassWizard(const Core::BaseFileWizardParameters &parameters,
                             QObject *parent = 0);
 
+    virtual Core::FeatureSet requiredFeatures() const;
+
 protected:
     virtual QWizard *createWizardDialog(QWidget *parent,
                                         const QString &defaultPath,
diff --git a/src/plugins/designer/cpp/formclasswizard.cpp b/src/plugins/designer/cpp/formclasswizard.cpp
index d8bd28f99a3..f3a69e83ae4 100644
--- a/src/plugins/designer/cpp/formclasswizard.cpp
+++ b/src/plugins/designer/cpp/formclasswizard.cpp
@@ -35,6 +35,7 @@
 #include "designerconstants.h"
 #include "formwindoweditor.h"
 #include "qtdesignerformclasscodegenerator.h"
+#include <qtsupport/qtsupportconstants.h>
 
 #include <coreplugin/icore.h>
 #include <cppeditor/cppeditorconstants.h>
@@ -65,6 +66,11 @@ QString FormClassWizard::formSuffix() const
     return preferredSuffix(QLatin1String(Constants::FORM_MIMETYPE));
 }
 
+Core::FeatureSet FormClassWizard::requiredFeatures() const
+{
+    return Core::Feature(QtSupport::Constants::FEATURE_QWIDGETS);
+}
+
 QWizard *FormClassWizard::createWizardDialog(QWidget *parent,
                                              const QString &defaultPath,
                                              const WizardPageList &extensionPages) const
diff --git a/src/plugins/designer/cpp/formclasswizard.h b/src/plugins/designer/cpp/formclasswizard.h
index 2b9202ffc97..e6c8047dc13 100644
--- a/src/plugins/designer/cpp/formclasswizard.h
+++ b/src/plugins/designer/cpp/formclasswizard.h
@@ -55,6 +55,8 @@ public:
     QString sourceSuffix() const;
     QString formSuffix() const;
 
+    virtual Core::FeatureSet requiredFeatures() const;
+
 protected:
     virtual QWizard *createWizardDialog(QWidget *parent,
                                         const QString &defaultPath,
diff --git a/src/plugins/designer/formwizard.cpp b/src/plugins/designer/formwizard.cpp
index 3f8c190e710..9b44526ec4c 100644
--- a/src/plugins/designer/formwizard.cpp
+++ b/src/plugins/designer/formwizard.cpp
@@ -34,6 +34,7 @@
 #include "formwizarddialog.h"
 #include "formwindoweditor.h"
 #include "designerconstants.h"
+#include <qtsupport/qtsupportconstants.h>
 
 #include <QtCore/QDebug>
 
@@ -45,6 +46,11 @@ FormWizard::FormWizard(const BaseFileWizardParameters &parameters, QObject *pare
 {
 }
 
+Core::FeatureSet FormWizard::requiredFeatures() const
+{
+    return Core::Feature(QtSupport::Constants::FEATURE_QWIDGETS);
+}
+
 QWizard *FormWizard::createWizardDialog(QWidget *parent,
                                         const QString &defaultPath,
                                         const WizardPageList &extensionPages) const
diff --git a/src/plugins/designer/formwizard.h b/src/plugins/designer/formwizard.h
index 6ea6f76ed9b..ff14971fbf6 100644
--- a/src/plugins/designer/formwizard.h
+++ b/src/plugins/designer/formwizard.h
@@ -47,6 +47,8 @@ public:
 
     FormWizard(const BaseFileWizardParameters &parameters, QObject *parent);
 
+    virtual Core::FeatureSet requiredFeatures() const;
+
 protected:
     virtual QWizard *createWizardDialog(QWidget *parent,
                                         const QString &defaultPath,
diff --git a/src/plugins/genericprojectmanager/genericprojectwizard.cpp b/src/plugins/genericprojectmanager/genericprojectwizard.cpp
index 1749122bc6b..e1afafb78ae 100644
--- a/src/plugins/genericprojectmanager/genericprojectwizard.cpp
+++ b/src/plugins/genericprojectmanager/genericprojectwizard.cpp
@@ -116,6 +116,11 @@ GenericProjectWizard::GenericProjectWizard()
 GenericProjectWizard::~GenericProjectWizard()
 { }
 
+Core::FeatureSet GenericProjectWizard::requiredFeatures() const
+{
+    return Core::FeatureSet();
+}
+
 Core::BaseFileWizardParameters GenericProjectWizard::parameters()
 {
     Core::BaseFileWizardParameters parameters(ProjectWizard);
diff --git a/src/plugins/genericprojectmanager/genericprojectwizard.h b/src/plugins/genericprojectmanager/genericprojectwizard.h
index 1b2ec40d0ac..1cbc8cd391c 100644
--- a/src/plugins/genericprojectmanager/genericprojectwizard.h
+++ b/src/plugins/genericprojectmanager/genericprojectwizard.h
@@ -78,6 +78,7 @@ class GenericProjectWizard : public Core::BaseFileWizard
 public:
     GenericProjectWizard();
     virtual ~GenericProjectWizard();
+    virtual Core::FeatureSet requiredFeatures() const;
 
     static Core::BaseFileWizardParameters parameters();
 
diff --git a/src/plugins/glsleditor/glslfilewizard.cpp b/src/plugins/glsleditor/glslfilewizard.cpp
index eb5786a1e55..12fb4cdc0e4 100644
--- a/src/plugins/glsleditor/glslfilewizard.cpp
+++ b/src/plugins/glsleditor/glslfilewizard.cpp
@@ -63,6 +63,11 @@ GLSLFileWizard::GLSLFileWizard(const BaseFileWizardParameters &parameters,
 {
 }
 
+Core::FeatureSet GLSLFileWizard::requiredFeatures() const
+{
+    return Core::FeatureSet();
+}
+
 Core::GeneratedFiles GLSLFileWizard::generateFiles(const QWizard *w,
                                                  QString * /*errorMessage*/) const
 {
diff --git a/src/plugins/glsleditor/glslfilewizard.h b/src/plugins/glsleditor/glslfilewizard.h
index 26c4ff6f304..fc02ba9559d 100644
--- a/src/plugins/glsleditor/glslfilewizard.h
+++ b/src/plugins/glsleditor/glslfilewizard.h
@@ -55,6 +55,8 @@ public:
     explicit GLSLFileWizard(const BaseFileWizardParameters &parameters,
                             ShaderType shaderType, QObject *parent = 0);
 
+    virtual Core::FeatureSet requiredFeatures() const;
+
 protected:
     QString fileContents(const QString &baseName, ShaderType shaderType) const;
 
diff --git a/src/plugins/madde/maemoqtversion.cpp b/src/plugins/madde/maemoqtversion.cpp
index 4ab595d11e0..d33eb35b322 100644
--- a/src/plugins/madde/maemoqtversion.cpp
+++ b/src/plugins/madde/maemoqtversion.cpp
@@ -176,6 +176,15 @@ QString MaemoQtVersion::osType() const
     return m_osType;
 }
 
+Core::FeatureSet MaemoQtVersion::availableFeatures() const
+{
+    Core::FeatureSet features = QtSupport::BaseQtVersion::availableFeatures();
+    if (qtVersion() >= QtSupport::QtVersionNumber(4, 7, 4)) //no reliable test for components, yet.
+        features |= Core::FeatureSet(QtSupport::Constants::FEATURE_QTQUICK_COMPONENTS_MEEGO);
+    return features;
+}
+
+
 void MaemoQtVersion::addToEnvironment(Utils::Environment &env) const
 {
     const QString maddeRoot = MaemoGlobal::maddeRoot(qmakeCommand().toString());
diff --git a/src/plugins/madde/maemoqtversion.h b/src/plugins/madde/maemoqtversion.h
index b5b06206082..5f2f7ad30a3 100644
--- a/src/plugins/madde/maemoqtversion.h
+++ b/src/plugins/madde/maemoqtversion.h
@@ -60,6 +60,8 @@ public:
 
     bool supportsShadowBuilds() const;
     QString osType() const;
+    Core::FeatureSet availableFeatures() const;
+
 private:
     mutable QString m_systemRoot;
     mutable QString m_osType;
diff --git a/src/plugins/madde/qt4maemotargetfactory.cpp b/src/plugins/madde/qt4maemotargetfactory.cpp
index 4851677891d..e2eb6b1d681 100644
--- a/src/plugins/madde/qt4maemotargetfactory.cpp
+++ b/src/plugins/madde/qt4maemotargetfactory.cpp
@@ -165,8 +165,6 @@ QSet<QString> Qt4MaemoTargetFactory::targetFeatures(const QString & /*id*/) cons
 #ifndef Q_OS_WIN
     features << Qt4ProjectManager::Constants::SHADOWBUILD_TARGETFEATURE_ID;
 #endif
-    // how to check check whether the component set is really installed?
-    features << Qt4ProjectManager::Constants::QTQUICKCOMPONENTS_MEEGO_TARGETFEATURE_ID;
     return features;
 }
 
diff --git a/src/plugins/projectexplorer/customwizard/customwizard.cpp b/src/plugins/projectexplorer/customwizard/customwizard.cpp
index d93a7c986f3..5183cc7d338 100644
--- a/src/plugins/projectexplorer/customwizard/customwizard.cpp
+++ b/src/plugins/projectexplorer/customwizard/customwizard.cpp
@@ -252,6 +252,10 @@ Core::GeneratedFiles CustomWizard::generateFiles(const QWizard *dialog, QString
     return generateWizardFiles(errorMessage);
 }
 
+Core::FeatureSet CustomWizard::requiredFeatures() const
+{
+    return baseFileWizardParameters().requiredFeatures();
+}
 
 bool CustomWizard::writeFiles(const Core::GeneratedFiles &files, QString *errorMessage)
 {
diff --git a/src/plugins/projectexplorer/customwizard/customwizard.h b/src/plugins/projectexplorer/customwizard/customwizard.h
index 932dd7ed947..3462143ad89 100644
--- a/src/plugins/projectexplorer/customwizard/customwizard.h
+++ b/src/plugins/projectexplorer/customwizard/customwizard.h
@@ -94,6 +94,8 @@ public:
 
     virtual Core::GeneratedFiles generateFiles(const QWizard *w, QString *errorMessage) const;
 
+    virtual Core::FeatureSet requiredFeatures() const;
+
 
     // Register a factory for a derived custom widget
     static void registerFactory(const QString &name, const ICustomWizardFactoryPtr &f);
diff --git a/src/plugins/projectexplorer/customwizard/customwizardparameters.cpp b/src/plugins/projectexplorer/customwizard/customwizardparameters.cpp
index 951815a7113..265c38c0844 100644
--- a/src/plugins/projectexplorer/customwizard/customwizardparameters.cpp
+++ b/src/plugins/projectexplorer/customwizard/customwizardparameters.cpp
@@ -67,6 +67,7 @@ static const char firstPageAttributeC[] = "firstpage";
 static const char langAttributeC[] = "xml:lang";
 static const char categoryAttributeC[] = "category";
 static const char displayCategoryElementC[] = "displaycategory";
+static const char featuresRequiredC[] = "featuresRequired";
 static const char fieldPageTitleElementC[] = "fieldpagetitle";
 static const char fieldsElementC[] = "fields";
 static const char fieldElementC[] = "field";
@@ -486,6 +487,19 @@ static inline Core::IWizard::WizardKind kindAttribute(const QXmlStreamReader &r)
     return Core::IWizard::ProjectWizard;
 }
 
+static inline Core::FeatureSet requiredFeatures(const QXmlStreamReader &reader)
+{
+    Core::FeatureSet r;
+    QString value = reader.attributes().value(QLatin1String(featuresRequiredC)).toString();
+    QStringList stringList = value.split(QLatin1Char(','), QString::SkipEmptyParts);
+    Core::FeatureSet features;
+    foreach (const QString &string, stringList) {
+        Core::Feature feature(string);
+        features |= feature;
+    }
+    return features;
+}
+
 static inline QString msgError(const QXmlStreamReader &reader,
                                const QString &fileName,
                                const QString &what)
@@ -591,6 +605,7 @@ CustomWizardParameters::ParseResult
                     bp->setId(attributeValue(reader, idAttributeC));
                     bp->setCategory(attributeValue(reader, categoryAttributeC));
                     bp->setKind(kindAttribute(reader));
+                    bp->setRequiredFeatures(requiredFeatures(reader));
                     klass = attributeValue(reader, klassAttributeC);
                     firstPageId = integerAttributeValue(reader, firstPageAttributeC, -1);
                     break;
diff --git a/src/plugins/qmljseditor/jsfilewizard.cpp b/src/plugins/qmljseditor/jsfilewizard.cpp
index c6f56caf400..03db41910e4 100644
--- a/src/plugins/qmljseditor/jsfilewizard.cpp
+++ b/src/plugins/qmljseditor/jsfilewizard.cpp
@@ -98,6 +98,11 @@ JsFileWizard::JsFileWizard(const BaseFileWizardParameters &parameters,
 {
 }
 
+Core::FeatureSet JsFileWizard::requiredFeatures() const
+{
+    return Core::FeatureSet();
+}
+
 Core::GeneratedFiles JsFileWizard::generateFiles(const QWizard *w,
                                                  QString * /*errorMessage*/) const
 {
diff --git a/src/plugins/qmljseditor/jsfilewizard.h b/src/plugins/qmljseditor/jsfilewizard.h
index 44c69a912e5..6deca081ade 100644
--- a/src/plugins/qmljseditor/jsfilewizard.h
+++ b/src/plugins/qmljseditor/jsfilewizard.h
@@ -47,6 +47,8 @@ public:
     explicit JsFileWizard(const BaseFileWizardParameters &parameters,
                           QObject *parent = 0);
 
+    virtual Core::FeatureSet requiredFeatures() const;
+
 protected:
     QString fileContents(const QString &baseName, bool statelessLibrary) const;
 
diff --git a/src/plugins/qmlprojectmanager/qmlprojectapplicationwizard.cpp b/src/plugins/qmlprojectmanager/qmlprojectapplicationwizard.cpp
index 7ca639f2fbd..da222d03f30 100644
--- a/src/plugins/qmlprojectmanager/qmlprojectapplicationwizard.cpp
+++ b/src/plugins/qmlprojectmanager/qmlprojectapplicationwizard.cpp
@@ -64,6 +64,11 @@ QmlProjectApplicationWizard::QmlProjectApplicationWizard()
 QmlProjectApplicationWizard::~QmlProjectApplicationWizard()
 { }
 
+Core::FeatureSet QmlProjectApplicationWizard::requiredFeatures() const
+{
+    return Core::Feature(QtSupport::Constants::FEATURE_QT_QUICK);
+}
+
 Core::BaseFileWizardParameters QmlProjectApplicationWizard::parameters()
 {
     Core::BaseFileWizardParameters parameters(ProjectWizard);
diff --git a/src/plugins/qmlprojectmanager/qmlprojectapplicationwizard.h b/src/plugins/qmlprojectmanager/qmlprojectapplicationwizard.h
index c50532226ed..ea542094577 100644
--- a/src/plugins/qmlprojectmanager/qmlprojectapplicationwizard.h
+++ b/src/plugins/qmlprojectmanager/qmlprojectapplicationwizard.h
@@ -53,6 +53,7 @@ class QmlProjectApplicationWizard : public Core::BaseFileWizard
 public:
     QmlProjectApplicationWizard();
     virtual ~QmlProjectApplicationWizard();
+    virtual Core::FeatureSet requiredFeatures() const;
 
     static Core::BaseFileWizardParameters parameters();
 
diff --git a/src/plugins/qt4projectmanager/buildconfigurationinfo.h b/src/plugins/qt4projectmanager/buildconfigurationinfo.h
index 6cf166c98b8..5ad180bb9cb 100644
--- a/src/plugins/qt4projectmanager/buildconfigurationinfo.h
+++ b/src/plugins/qt4projectmanager/buildconfigurationinfo.h
@@ -34,6 +34,7 @@
 #define BUILDCONFIGURATIONINFO_H
 
 #include "qt4projectmanager_global.h"
+#include <coreplugin/featureprovider.h>
 #include <qtsupport/baseqtversion.h>
 
 namespace Qt4ProjectManager {
@@ -72,6 +73,7 @@ struct QT4PROJECTMANAGER_EXPORT BuildConfigurationInfo {
     static QList<BuildConfigurationInfo> importBuildConfigurations(const QString &proFilePath);
     static QList<BuildConfigurationInfo> checkForBuild(const QString &directory, const QString &proFilePath);
     static QList<BuildConfigurationInfo> filterBuildConfigurationInfos(const QList<BuildConfigurationInfo> &infos, const QString &id);
+    static QList<BuildConfigurationInfo> filterBuildConfigurationInfos(const QList<BuildConfigurationInfo> &infos, Core::FeatureSet features);
 };
 
 } // namespace Qt4ProjectManager
diff --git a/src/plugins/qt4projectmanager/customwidgetwizard/customwidgetwizard.cpp b/src/plugins/qt4projectmanager/customwidgetwizard/customwidgetwizard.cpp
index e3c88e27690..1239ed144c3 100644
--- a/src/plugins/qt4projectmanager/customwidgetwizard/customwidgetwizard.cpp
+++ b/src/plugins/qt4projectmanager/customwidgetwizard/customwidgetwizard.cpp
@@ -38,6 +38,8 @@
 
 #include <projectexplorer/projectexplorerconstants.h>
 
+#include <qtsupport/qtsupportconstants.h>
+
 #include <QtGui/QIcon>
 
 namespace Qt4ProjectManager {
@@ -53,6 +55,11 @@ CustomWidgetWizard::CustomWidgetWizard() :
 {
 }
 
+Core::FeatureSet CustomWidgetWizard::requiredFeatures() const
+{
+    return Core::Feature(QtSupport::Constants::FEATURE_QWIDGETS);
+}
+
 QWizard *CustomWidgetWizard::createWizardDialog(QWidget *parent,
                                                 const QString &defaultPath,
                                                 const WizardPageList &extensionPages) const
diff --git a/src/plugins/qt4projectmanager/customwidgetwizard/customwidgetwizard.h b/src/plugins/qt4projectmanager/customwidgetwizard/customwidgetwizard.h
index a6e49c60e82..e056e7f56e8 100644
--- a/src/plugins/qt4projectmanager/customwidgetwizard/customwidgetwizard.h
+++ b/src/plugins/qt4projectmanager/customwidgetwizard/customwidgetwizard.h
@@ -44,6 +44,7 @@ class CustomWidgetWizard : public QtWizard
 
 public:
     CustomWidgetWizard();
+    virtual Core::FeatureSet requiredFeatures() const;
 
 protected:
     virtual QWizard *createWizardDialog(QWidget *parent,
diff --git a/src/plugins/qt4projectmanager/qt-desktop/desktopqtversion.cpp b/src/plugins/qt4projectmanager/qt-desktop/desktopqtversion.cpp
index 4fe993ef181..56bd7584c0b 100644
--- a/src/plugins/qt4projectmanager/qt-desktop/desktopqtversion.cpp
+++ b/src/plugins/qt4projectmanager/qt-desktop/desktopqtversion.cpp
@@ -99,3 +99,12 @@ QString DesktopQtVersion::description() const
 {
     return QCoreApplication::translate("QtVersion", "Desktop", "Qt Version is meant for the desktop");
 }
+
+Core::FeatureSet DesktopQtVersion::availableFeatures() const
+{
+    Core::FeatureSet features = QtSupport::BaseQtVersion::availableFeatures();
+    if (qtVersion() >= QtSupport::QtVersionNumber(4, 7, 4)) //no reliable test for components, yet.
+        features |= Core::FeatureSet(QtSupport::Constants::FEATURE_QTQUICK_COMPONENTS_MEEGO)
+                | Core::FeatureSet(QtSupport::Constants::FEATURE_QTQUICK_COMPONENTS_SYMBIAN);
+    return features;
+}
diff --git a/src/plugins/qt4projectmanager/qt-desktop/desktopqtversion.h b/src/plugins/qt4projectmanager/qt-desktop/desktopqtversion.h
index 3031f286a49..edde9d93f2b 100644
--- a/src/plugins/qt4projectmanager/qt-desktop/desktopqtversion.h
+++ b/src/plugins/qt4projectmanager/qt-desktop/desktopqtversion.h
@@ -57,6 +57,8 @@ public:
     QSet<QString> supportedTargetIds() const;
 
     QString description() const;
+
+    Core::FeatureSet availableFeatures() const;
 };
 
 }
diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.cpp b/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.cpp
index 1b06c58e665..952d32b7e2e 100644
--- a/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.cpp
+++ b/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.cpp
@@ -164,11 +164,9 @@ ProjectExplorer::Target *Qt4DesktopTargetFactory::create(ProjectExplorer::Projec
 QSet<QString> Qt4DesktopTargetFactory::targetFeatures(const QString & /*id*/) const
 {
     QSet<QString> features;
-    features << QLatin1String(Constants::DESKTOP_TARGETFEATURE_ID)
-             << QLatin1String(Constants::SHADOWBUILD_TARGETFEATURE_ID)
-    // how to check check whether they component set is really installed?
-             << QLatin1String(Constants::QTQUICKCOMPONENTS_SYMBIAN_TARGETFEATURE_ID)
-             << QLatin1String(Constants::QTQUICKCOMPONENTS_MEEGO_TARGETFEATURE_ID);
+    features << QLatin1String(Constants::DESKTOP_TARGETFEATURE_ID);
+    features << QLatin1String(Constants::SHADOWBUILD_TARGETFEATURE_ID);
+
     return features;
 }
 
diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.cpp b/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.cpp
index 77e16c1f054..aaa2b8cb8e7 100644
--- a/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.cpp
+++ b/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.cpp
@@ -129,10 +129,8 @@ QSet<QString> Qt4SimulatorTargetFactory::targetFeatures(const QString & /*id*/)
     QSet<QString> features;
 
     features << QLatin1String(Constants::MOBILE_TARGETFEATURE_ID)
-             << QLatin1String(Constants::SHADOWBUILD_TARGETFEATURE_ID)
-    // how to check check whether the component set is really installed?
-             << QLatin1String(Constants::QTQUICKCOMPONENTS_SYMBIAN_TARGETFEATURE_ID)
-             << QLatin1String(Constants::QTQUICKCOMPONENTS_MEEGO_TARGETFEATURE_ID);
+             << QLatin1String(Constants::SHADOWBUILD_TARGETFEATURE_ID);
+
     return features;
 }
 
diff --git a/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.cpp b/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.cpp
index 6a2e88d10bb..1d63cec578d 100644
--- a/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.cpp
@@ -190,9 +190,8 @@ bool Qt4SymbianTargetFactory::selectByDefault(const QString &id) const
 QSet<QString> Qt4SymbianTargetFactory::targetFeatures(const QString & /*id*/) const
 {
     QSet<QString> features;
-    features << QLatin1String(Constants::MOBILE_TARGETFEATURE_ID)
-    // ideally we should check whether they're really installed
-             << QLatin1String(Constants::QTQUICKCOMPONENTS_SYMBIAN_TARGETFEATURE_ID);
+    features << QLatin1String(Constants::MOBILE_TARGETFEATURE_ID);
+
     return features;
 }
 
diff --git a/src/plugins/qt4projectmanager/qt-s60/symbianqtversion.cpp b/src/plugins/qt4projectmanager/qt-s60/symbianqtversion.cpp
index c90aadfd734..0a3b0e8d365 100644
--- a/src/plugins/qt4projectmanager/qt-s60/symbianqtversion.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/symbianqtversion.cpp
@@ -364,6 +364,16 @@ void SymbianQtVersion::setSystemRoot(const QString &root)
     }
 }
 
+Core::FeatureSet SymbianQtVersion::availableFeatures() const
+{
+    Core::FeatureSet features = QtSupport::BaseQtVersion::availableFeatures();
+    if (qtVersion() >= QtSupport::QtVersionNumber(4, 7, 4)) //no reliable test for components, yet.
+        features |= Core::FeatureSet(QtSupport::Constants::FEATURE_QTQUICK_COMPONENTS_SYMBIAN);
+    features.remove(Core::Feature(QtSupport::Constants::FEATURE_QT_CONSOLE));
+
+    return features;
+}
+
 QString SymbianQtVersion::systemRoot() const
 {
     return m_systemRoot;
diff --git a/src/plugins/qt4projectmanager/qt-s60/symbianqtversion.h b/src/plugins/qt4projectmanager/qt-s60/symbianqtversion.h
index c405d3845d2..fafecd9ed38 100644
--- a/src/plugins/qt4projectmanager/qt-s60/symbianqtversion.h
+++ b/src/plugins/qt4projectmanager/qt-s60/symbianqtversion.h
@@ -83,6 +83,8 @@ public:
 
     QtSupport::QtConfigWidget *createConfigurationWidget() const;
 
+    Core::FeatureSet availableFeatures() const;
+
 protected:
     QList<ProjectExplorer::Task> reportIssuesImpl(const QString &proFile, const QString &buildDir);
     void parseMkSpec(ProFileEvaluator *) const;
diff --git a/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h b/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h
index d1cccf292a5..1b114fc233c 100644
--- a/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h
+++ b/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h
@@ -85,11 +85,6 @@ const char QT_SIMULATOR_TARGET_ID[] = "Qt4ProjectManager.Target.QtSimulatorTarge
 const char MOBILE_TARGETFEATURE_ID[] = "Qt4ProjectManager.TargetFeature.Mobile";
 const char DESKTOP_TARGETFEATURE_ID[] = "Qt4ProjectManager.TargetFeature.Desktop";
 const char SHADOWBUILD_TARGETFEATURE_ID[] = "Qt4ProjectManager.TargetFeature.ShadowBuild";
-const char QTQUICKCOMPONENTS_SYMBIAN_TARGETFEATURE_ID[]
-                               = "Qt4ProjectManager.TargetFeature.QtQuickComponentsSymbian";
-const char QTQUICKCOMPONENTS_MEEGO_TARGETFEATURE_ID[]
-                               = "Qt4ProjectManager.TargetFeature.QtQuickComponentsMeego";
-
 
 // Tool chains:
 const char GCCE_TOOLCHAIN_ID[] = "Qt4ProjectManager.ToolChain.GCCE";
diff --git a/src/plugins/qt4projectmanager/qt4target.cpp b/src/plugins/qt4projectmanager/qt4target.cpp
index 79f38644b05..a206254ccc5 100644
--- a/src/plugins/qt4projectmanager/qt4target.cpp
+++ b/src/plugins/qt4projectmanager/qt4target.cpp
@@ -1176,6 +1176,15 @@ QList<BuildConfigurationInfo> BuildConfigurationInfo::filterBuildConfigurationIn
     return result;
 }
 
+QList<BuildConfigurationInfo> BuildConfigurationInfo::filterBuildConfigurationInfos(const QList<BuildConfigurationInfo> &infos, Core::FeatureSet features)
+{
+    QList<BuildConfigurationInfo> result;
+    foreach (const BuildConfigurationInfo &info, infos)
+        if (info.version->availableFeatures().contains(features))
+            result.append(info);
+    return result;
+}
+
 QList<BuildConfigurationInfo> BuildConfigurationInfo::importBuildConfigurations(const QString &proFilePath)
 {
     QList<BuildConfigurationInfo> result;
diff --git a/src/plugins/qt4projectmanager/wizards/consoleappwizard.cpp b/src/plugins/qt4projectmanager/wizards/consoleappwizard.cpp
index bd0a4da7fe1..7fca16190d2 100644
--- a/src/plugins/qt4projectmanager/wizards/consoleappwizard.cpp
+++ b/src/plugins/qt4projectmanager/wizards/consoleappwizard.cpp
@@ -37,6 +37,7 @@
 
 #include <projectexplorer/projectexplorerconstants.h>
 #include <cpptools/abstracteditorsupport.h>
+#include <qtsupport/qtsupportconstants.h>
 
 #include <QtGui/QIcon>
 #include <QtCore/QFileInfo>
@@ -107,5 +108,10 @@ Core::GeneratedFiles
     return Core::GeneratedFiles() <<  source << profile;
 }
 
+Core::FeatureSet ConsoleAppWizard::requiredFeatures() const
+{
+    return Core::Feature(QtSupport::Constants::FEATURE_GENERIC_CPP_ENTRY_POINT);
+}
+
 } // namespace Internal
 } // namespace Qt4ProjectManager
diff --git a/src/plugins/qt4projectmanager/wizards/consoleappwizard.h b/src/plugins/qt4projectmanager/wizards/consoleappwizard.h
index 64674e78569..91199489f25 100644
--- a/src/plugins/qt4projectmanager/wizards/consoleappwizard.h
+++ b/src/plugins/qt4projectmanager/wizards/consoleappwizard.h
@@ -54,6 +54,8 @@ protected:
 
     virtual Core::GeneratedFiles generateFiles(const QWizard *w,
                                                QString *errorMessage) const;
+
+    virtual Core::FeatureSet requiredFeatures() const;
 };
 
 } // namespace Internal
diff --git a/src/plugins/qt4projectmanager/wizards/emptyprojectwizard.cpp b/src/plugins/qt4projectmanager/wizards/emptyprojectwizard.cpp
index d30c6aeac6e..d6be96c9d45 100644
--- a/src/plugins/qt4projectmanager/wizards/emptyprojectwizard.cpp
+++ b/src/plugins/qt4projectmanager/wizards/emptyprojectwizard.cpp
@@ -52,6 +52,11 @@ EmptyProjectWizard::EmptyProjectWizard()
 {
 }
 
+Core::FeatureSet EmptyProjectWizard::requiredFeatures() const
+{
+    return Core::FeatureSet();
+}
+
 QWizard *EmptyProjectWizard::createWizardDialog(QWidget *parent,
                                               const QString &defaultPath,
                                               const WizardPageList &extensionPages) const
diff --git a/src/plugins/qt4projectmanager/wizards/emptyprojectwizard.h b/src/plugins/qt4projectmanager/wizards/emptyprojectwizard.h
index 37f04d47bb5..0adc2c253e2 100644
--- a/src/plugins/qt4projectmanager/wizards/emptyprojectwizard.h
+++ b/src/plugins/qt4projectmanager/wizards/emptyprojectwizard.h
@@ -44,6 +44,7 @@ class EmptyProjectWizard : public QtWizard
 
 public:
     EmptyProjectWizard();
+    virtual Core::FeatureSet requiredFeatures() const;
 
 protected:
     virtual QWizard *createWizardDialog(QWidget *parent,
diff --git a/src/plugins/qt4projectmanager/wizards/guiappwizard.cpp b/src/plugins/qt4projectmanager/wizards/guiappwizard.cpp
index f05fb63696e..0e89c521b07 100644
--- a/src/plugins/qt4projectmanager/wizards/guiappwizard.cpp
+++ b/src/plugins/qt4projectmanager/wizards/guiappwizard.cpp
@@ -40,6 +40,7 @@
 #include <coreplugin/icore.h>
 #include <extensionsystem/pluginmanager.h>
 #include <extensionsystem/invoker.h>
+#include <qtsupport/qtsupportconstants.h>
 
 #include <utils/fileutils.h>
 
@@ -95,6 +96,11 @@ GuiAppWizard::GuiAppWizard()
 {
 }
 
+Core::FeatureSet GuiAppWizard::requiredFeatures() const
+{
+    return Core::Feature(QtSupport::Constants::FEATURE_QWIDGETS);
+}
+
 GuiAppWizard::GuiAppWizard(const QString &id,
                            const QString &category,
                            const QString &displayCategory,
diff --git a/src/plugins/qt4projectmanager/wizards/guiappwizard.h b/src/plugins/qt4projectmanager/wizards/guiappwizard.h
index 8cd7a27b03c..893df770fd2 100644
--- a/src/plugins/qt4projectmanager/wizards/guiappwizard.h
+++ b/src/plugins/qt4projectmanager/wizards/guiappwizard.h
@@ -46,6 +46,7 @@ class GuiAppWizard : public QtWizard
 
 public:
     GuiAppWizard();
+    virtual Core::FeatureSet requiredFeatures() const;
 
 protected:
     GuiAppWizard(const QString &id,
diff --git a/src/plugins/qt4projectmanager/wizards/html5appwizard.cpp b/src/plugins/qt4projectmanager/wizards/html5appwizard.cpp
index 7e031471947..4c218c6929a 100644
--- a/src/plugins/qt4projectmanager/wizards/html5appwizard.cpp
+++ b/src/plugins/qt4projectmanager/wizards/html5appwizard.cpp
@@ -39,6 +39,7 @@
 #include "qt4projectmanagerconstants.h"
 
 #include <projectexplorer/projectexplorerconstants.h>
+#include <qtsupport/qtsupportconstants.h>
 #include <limits>
 
 #include <QtCore/QCoreApplication>
@@ -93,6 +94,11 @@ Html5AppWizard::~Html5AppWizard()
     delete d;
 }
 
+Core::FeatureSet Html5AppWizard::requiredFeatures() const
+{
+    return Core::Feature(QtSupport::Constants::FEATURE_GENERIC_CPP_ENTRY_POINT);
+}
+
 Core::BaseFileWizardParameters Html5AppWizard::parameters()
 {
     Core::BaseFileWizardParameters parameters(ProjectWizard);
diff --git a/src/plugins/qt4projectmanager/wizards/html5appwizard.h b/src/plugins/qt4projectmanager/wizards/html5appwizard.h
index 39168644c28..577b2c14fb2 100644
--- a/src/plugins/qt4projectmanager/wizards/html5appwizard.h
+++ b/src/plugins/qt4projectmanager/wizards/html5appwizard.h
@@ -45,6 +45,7 @@ class Html5AppWizard : public AbstractMobileAppWizard
 public:
     Html5AppWizard();
     virtual ~Html5AppWizard();
+    virtual Core::FeatureSet requiredFeatures() const;
 
 protected:
     QString fileToOpenPostGeneration() const;
diff --git a/src/plugins/qt4projectmanager/wizards/librarywizard.cpp b/src/plugins/qt4projectmanager/wizards/librarywizard.cpp
index 95dcf4dfa94..6852f6677c0 100644
--- a/src/plugins/qt4projectmanager/wizards/librarywizard.cpp
+++ b/src/plugins/qt4projectmanager/wizards/librarywizard.cpp
@@ -143,5 +143,10 @@ Core::GeneratedFiles LibraryWizard::generateFiles(const QWizard *w,
     return rc;
 }
 
+Core::FeatureSet LibraryWizard::requiredFeatures() const
+{
+    return Core::FeatureSet();
+}
+
 } // namespace Internal
 } // namespace Qt4ProjectManager
diff --git a/src/plugins/qt4projectmanager/wizards/librarywizard.h b/src/plugins/qt4projectmanager/wizards/librarywizard.h
index 1c180befcd9..a1183f092df 100644
--- a/src/plugins/qt4projectmanager/wizards/librarywizard.h
+++ b/src/plugins/qt4projectmanager/wizards/librarywizard.h
@@ -56,6 +56,7 @@ protected:
 
     virtual Core::GeneratedFiles generateFiles(const QWizard *w,
                                                QString *errorMessage) const;
+    virtual Core::FeatureSet requiredFeatures() const;
 };
 
 } // namespace Internal
diff --git a/src/plugins/qt4projectmanager/wizards/mobileappwizard.cpp b/src/plugins/qt4projectmanager/wizards/mobileappwizard.cpp
index 97d2aad1483..5702cfc4fd4 100644
--- a/src/plugins/qt4projectmanager/wizards/mobileappwizard.cpp
+++ b/src/plugins/qt4projectmanager/wizards/mobileappwizard.cpp
@@ -40,6 +40,8 @@
 #include <projectexplorer/projectexplorerconstants.h>
 #include <projectexplorer/task.h>
 
+#include <qtsupport/qtsupportconstants.h>
+
 #include <QtCore/QCoreApplication>
 #include <QtGui/QIcon>
 
@@ -89,6 +91,12 @@ MobileAppWizard::~MobileAppWizard()
     delete d;
 }
 
+Core::FeatureSet MobileAppWizard::requiredFeatures() const
+{
+    return Core::Feature(QtSupport::Constants::FEATURE_GENERIC_CPP_ENTRY_POINT)
+            | Core::Feature(QtSupport::Constants::FEATURE_QWIDGETS);
+}
+
 Core::BaseFileWizardParameters MobileAppWizard::parameters()
 {
     Core::BaseFileWizardParameters parameters(ProjectWizard);
diff --git a/src/plugins/qt4projectmanager/wizards/mobileappwizard.h b/src/plugins/qt4projectmanager/wizards/mobileappwizard.h
index bbe56ddb836..cbe4e7aecdf 100644
--- a/src/plugins/qt4projectmanager/wizards/mobileappwizard.h
+++ b/src/plugins/qt4projectmanager/wizards/mobileappwizard.h
@@ -45,6 +45,7 @@ class MobileAppWizard : public AbstractMobileAppWizard
 public:
     MobileAppWizard();
     virtual ~MobileAppWizard();
+    virtual Core::FeatureSet requiredFeatures() const;
 
 protected:
     QString fileToOpenPostGeneration() const;
diff --git a/src/plugins/qt4projectmanager/wizards/qtquickappwizard.cpp b/src/plugins/qt4projectmanager/wizards/qtquickappwizard.cpp
index 8cf8bca90ab..f2648a96abb 100644
--- a/src/plugins/qt4projectmanager/wizards/qtquickappwizard.cpp
+++ b/src/plugins/qt4projectmanager/wizards/qtquickappwizard.cpp
@@ -39,6 +39,7 @@
 #include "qt4projectmanagerconstants.h"
 
 #include <qtsupport/qtsupportconstants.h>
+#include <coreplugin/dialogs/iwizard.h>
 
 #include <QtCore/QCoreApplication>
 #include <QtGui/QIcon>
@@ -87,19 +88,12 @@ bool QtQuickAppWizardDialog::validateCurrentPage()
         setIgnoreGenericOptionsPage(false);
         if (m_componentOptionsPage->componentSet() == QtQuickApp::Symbian11Components) {
             setIgnoreGenericOptionsPage(true);
-            targetsPage()->setMinimumQtVersion(QtSupport::QtVersionNumber(4, 7, 4));
-            QSet<QString> requiredFeatures;
-            requiredFeatures << QLatin1String(Constants::QTQUICKCOMPONENTS_SYMBIAN_TARGETFEATURE_ID);
-            targetsPage()->setRequiredFeatures(requiredFeatures);
+            targetsPage()->setRequiredQtFeatures(Core::FeatureSet(QtSupport::Constants::FEATURE_QTQUICK_COMPONENTS_MEEGO));
         } else if (m_componentOptionsPage->componentSet() == QtQuickApp::Meego10Components) {
-            targetsPage()->setMinimumQtVersion(QtSupport::QtVersionNumber(4, 7, 4));
-            QSet<QString> requiredFeatures;
-            requiredFeatures << QLatin1String(Constants::QTQUICKCOMPONENTS_MEEGO_TARGETFEATURE_ID);
-            targetsPage()->setRequiredFeatures(requiredFeatures);
+            targetsPage()->setRequiredQtFeatures(Core::FeatureSet(QtSupport::Constants::FEATURE_QTQUICK_COMPONENTS_MEEGO));
         } else {
             targetsPage()->setMinimumQtVersion(QtSupport::QtVersionNumber(4, 7, 0));
-            QSet<QString> requiredFeatures;
-            targetsPage()->setRequiredFeatures(requiredFeatures);
+            targetsPage()->setRequiredQtFeatures(Core::FeatureSet());
         }
     }
     return AbstractMobileAppWizardDialog::validateCurrentPage();
@@ -126,6 +120,13 @@ QtQuickAppWizard::~QtQuickAppWizard()
     delete d;
 }
 
+Core::FeatureSet QtQuickAppWizard::requiredFeatures() const
+{
+    return Core::Feature(QtSupport::Constants::FEATURE_GENERIC_CPP_ENTRY_POINT) |
+            Core::Feature(QtSupport::Constants::FEATURE_QT_QUICK);
+
+}
+
 Core::BaseFileWizardParameters QtQuickAppWizard::parameters()
 {
     Core::BaseFileWizardParameters parameters(ProjectWizard);
diff --git a/src/plugins/qt4projectmanager/wizards/qtquickappwizard.h b/src/plugins/qt4projectmanager/wizards/qtquickappwizard.h
index e35ae7b4f95..60e7c595a9a 100644
--- a/src/plugins/qt4projectmanager/wizards/qtquickappwizard.h
+++ b/src/plugins/qt4projectmanager/wizards/qtquickappwizard.h
@@ -45,6 +45,7 @@ class QtQuickAppWizard : public AbstractMobileAppWizard
 public:
     QtQuickAppWizard();
     virtual ~QtQuickAppWizard();
+    virtual Core::FeatureSet requiredFeatures() const;
 
 protected:
     QString fileToOpenPostGeneration() const;
diff --git a/src/plugins/qt4projectmanager/wizards/subdirsprojectwizard.cpp b/src/plugins/qt4projectmanager/wizards/subdirsprojectwizard.cpp
index bdd887c7921..c9da43c7178 100644
--- a/src/plugins/qt4projectmanager/wizards/subdirsprojectwizard.cpp
+++ b/src/plugins/qt4projectmanager/wizards/subdirsprojectwizard.cpp
@@ -93,5 +93,10 @@ bool SubdirsProjectWizard::postGenerateFiles(const QWizard *w, const Core::Gener
     return true;
 }
 
+Core::FeatureSet SubdirsProjectWizard::requiredFeatures() const
+{
+    return Core::FeatureSet();
+}
+
 } // namespace Internal
 } // namespace Qt4ProjectManager
diff --git a/src/plugins/qt4projectmanager/wizards/subdirsprojectwizard.h b/src/plugins/qt4projectmanager/wizards/subdirsprojectwizard.h
index ec8667ac8b4..42695f2905b 100644
--- a/src/plugins/qt4projectmanager/wizards/subdirsprojectwizard.h
+++ b/src/plugins/qt4projectmanager/wizards/subdirsprojectwizard.h
@@ -53,6 +53,7 @@ protected:
     virtual Core::GeneratedFiles generateFiles(const QWizard *w,
                                                QString *errorMessage) const;
     virtual bool postGenerateFiles(const QWizard *, const Core::GeneratedFiles &l, QString *errorMessage);
+    virtual Core::FeatureSet requiredFeatures() const;
 };
 
 } // namespace Internal
diff --git a/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp b/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp
index 27a4c227f7f..ba96396dfe5 100644
--- a/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp
+++ b/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp
@@ -103,9 +103,14 @@ void TargetSetupPage::setPreferredFeatures(const QSet<QString> &featureIds)
     m_preferredFeatures = featureIds;
 }
 
-void TargetSetupPage::setRequiredFeatures(const QSet<QString> &featureIds)
+void TargetSetupPage::setRequiredTargetFeatures(const QSet<QString> &featureIds)
 {
-    m_requiredFeatures = featureIds;
+    m_requiredTargetFeatures = featureIds;
+}
+
+void TargetSetupPage::setRequiredQtFeatures(const Core::FeatureSet &features)
+{
+    m_requiredQtFeatures = features;
 }
 
 void TargetSetupPage::setMinimumQtVersion(const QtSupport::QtVersionNumber &number)
@@ -130,10 +135,12 @@ void TargetSetupPage::setupWidgets()
     foreach (Qt4BaseTargetFactory *factory, factories) {
         QStringList ids = factory->supportedTargetIds(0);
         foreach (const QString &id, ids) {
-            if (!factory->targetFeatures(id).contains(m_requiredFeatures))
+            if (!factory->targetFeatures(id).contains(m_requiredTargetFeatures))
                 continue;
 
             QList<BuildConfigurationInfo> infos = BuildConfigurationInfo::filterBuildConfigurationInfos(m_importInfos, id);
+            infos = BuildConfigurationInfo::filterBuildConfigurationInfos(infos, m_requiredQtFeatures);
+
             Qt4TargetSetupWidget *widget =
                     factory->createTargetSetupWidget(id, m_proFilePath,
                                                      m_minimumQtVersionNumber, m_maximumQtVersionNumber,
diff --git a/src/plugins/qt4projectmanager/wizards/targetsetuppage.h b/src/plugins/qt4projectmanager/wizards/targetsetuppage.h
index 357e29249d7..1ab03441bbf 100644
--- a/src/plugins/qt4projectmanager/wizards/targetsetuppage.h
+++ b/src/plugins/qt4projectmanager/wizards/targetsetuppage.h
@@ -36,6 +36,7 @@
 #include "../qt4target.h"
 #include "../qt4projectmanager_global.h"
 #include <qtsupport/qtversionmanager.h>
+#include <coreplugin/featureprovider.h>
 
 #include <QtCore/QString>
 #include <QtGui/QWizard>
@@ -77,7 +78,10 @@ public:
     void setPreferredFeatures(const QSet<QString> &featureIds);
     /// Sets the features a target must support
     /// call this before \sa initializePage()
-    void setRequiredFeatures(const QSet<QString> &featureIds);
+    void setRequiredTargetFeatures(const QSet<QString> &featureIds);
+    /// Sets the features a qt version must support
+    /// call this before \sa initializePage()
+    void setRequiredQtFeatures(const Core::FeatureSet &features);
     /// Sets the minimum qt version
     /// calls this before \sa initializePage()
     void setMinimumQtVersion(const QtSupport::QtVersionNumber &number);
@@ -102,7 +106,8 @@ private:
     void deleteWidgets();
 
     QSet<QString> m_preferredFeatures;
-    QSet<QString> m_requiredFeatures;
+    QSet<QString> m_requiredTargetFeatures;
+    Core::FeatureSet m_requiredQtFeatures;
     bool m_importSearch;
     QtSupport::QtVersionNumber m_minimumQtVersionNumber;
     QtSupport::QtVersionNumber m_maximumQtVersionNumber;
diff --git a/src/plugins/qt4projectmanager/wizards/testwizard.cpp b/src/plugins/qt4projectmanager/wizards/testwizard.cpp
index 0f63048772d..7c0383f18e9 100644
--- a/src/plugins/qt4projectmanager/wizards/testwizard.cpp
+++ b/src/plugins/qt4projectmanager/wizards/testwizard.cpp
@@ -35,6 +35,7 @@
 
 #include <cpptools/abstracteditorsupport.h>
 #include <projectexplorer/projectexplorerconstants.h>
+#include <qtsupport/qtsupportconstants.h>
 
 #include <utils/qtcassert.h>
 
@@ -186,5 +187,11 @@ Core::GeneratedFiles TestWizard::generateFiles(const QWizard *w, QString *errorM
     return Core::GeneratedFiles() <<  source << profile;
 }
 
+Core::FeatureSet TestWizard::requiredFeatures() const
+{
+    return Core::Feature(QtSupport::Constants::FEATURE_GENERIC_CPP_ENTRY_POINT) |
+            Core::Feature(QtSupport::Constants::FEATURE_QT);
+}
+
 } // namespace Internal
 } // namespace Qt4ProjectManager
diff --git a/src/plugins/qt4projectmanager/wizards/testwizard.h b/src/plugins/qt4projectmanager/wizards/testwizard.h
index 46a6d9c28e1..f48aa43f281 100644
--- a/src/plugins/qt4projectmanager/wizards/testwizard.h
+++ b/src/plugins/qt4projectmanager/wizards/testwizard.h
@@ -44,6 +44,7 @@ class TestWizard : public QtWizard
 
 public:
     TestWizard();
+    virtual Core::FeatureSet requiredFeatures() const;
 
 protected:
     virtual QWizard *createWizardDialog(QWidget *parent,
diff --git a/src/plugins/qtsupport/baseqtversion.cpp b/src/plugins/qtsupport/baseqtversion.cpp
index 679316be962..2ab646da991 100644
--- a/src/plugins/qtsupport/baseqtversion.cpp
+++ b/src/plugins/qtsupport/baseqtversion.cpp
@@ -44,6 +44,7 @@
 #include <projectexplorer/projectexplorer.h>
 #include <projectexplorer/projectexplorerconstants.h>
 #include <projectexplorer/toolchainmanager.h>
+#include <qtsupport/qtsupportconstants.h>
 
 #include <utils/persistentsettings.h>
 #include <utils/environment.h>
@@ -252,6 +253,20 @@ QString BaseQtVersion::defaultDisplayName(const QString &versionString, const Ut
         QCoreApplication::translate("QtVersion", "Qt %1 (%2)").arg(versionString, location);
 }
 
+Core::FeatureSet BaseQtVersion::availableFeatures() const
+{
+    Core::FeatureSet features = Core::FeatureSet(QtSupport::Constants::FEATURE_GENERIC_CPP_ENTRY_POINT) |
+            Core::FeatureSet(QtSupport::Constants::FEATURE_QWIDGETS)
+            | Core::FeatureSet(QtSupport::Constants::FEATURE_QT)
+            | Core::FeatureSet(QtSupport::Constants::FEATURE_QT_WEBKIT)
+            | Core::FeatureSet(QtSupport::Constants::FEATURE_QT_CONSOLE);
+
+     if (qtVersion() >= QtSupport::QtVersionNumber(4, 7, 0))
+         features |= Core::FeatureSet(QtSupport::Constants::FEATURE_QT_QUICK);
+
+     return features;
+}
+
 void BaseQtVersion::setId(int id)
 {
     m_id = id;
diff --git a/src/plugins/qtsupport/baseqtversion.h b/src/plugins/qtsupport/baseqtversion.h
index 91bc7b24a74..2cd871bb321 100644
--- a/src/plugins/qtsupport/baseqtversion.h
+++ b/src/plugins/qtsupport/baseqtversion.h
@@ -40,6 +40,7 @@
 #include <projectexplorer/abi.h>
 #include <projectexplorer/headerpath.h>
 #include <projectexplorer/task.h>
+#include <coreplugin/featureprovider.h>
 
 #include <QtCore/QVariantMap>
 #include <QtGui/QWidget>
@@ -214,6 +215,8 @@ public:
                                       const Utils::FileName &qmakePath,
                                       bool fromPath = false);
 
+    virtual Core::FeatureSet availableFeatures() const;
+
 protected:
     BaseQtVersion();
     BaseQtVersion(const Utils::FileName &path, bool isAutodetected = false, const QString &autodetectionSource = QString());
diff --git a/src/plugins/qtsupport/qtsupportconstants.h b/src/plugins/qtsupport/qtsupportconstants.h
index ed6b0bd5a9c..696ef55f301 100644
--- a/src/plugins/qtsupport/qtsupportconstants.h
+++ b/src/plugins/qtsupport/qtsupportconstants.h
@@ -47,6 +47,17 @@ const char DESKTOPQT[]   = "Qt4ProjectManager.QtVersion.Desktop";
 const char SIMULATORQT[] = "Qt4ProjectManager.QtVersion.Simulator";
 const char WINCEQT[]     = "Qt4ProjectManager.QtVersion.WinCE";
 
+//Qt Features
+const char FEATURE_QT[] = "QtSupport.Wizards.FeatureQt";
+const char FEATURE_QWIDGETS[] = "QtSupport.Wizards.FeatureQWidgets";
+const char FEATURE_QT_QUICK[] = "QtSupport.Wizards.FeatureQtQuick";
+const char FEATURE_QT_WEBKIT[] = "QtSupport.Wizards.FeatureQtWebkit";
+const char FEATURE_QT_CONSOLE[] = "QtSupport.Wizards.FeatureQtConsole";
+const char FEATURE_GENERIC_CPP_ENTRY_POINT[] ="QtSupport.Wizards.FeatureGenericCppEntryPoint";
+const char FEATURE_QTQUICK_COMPONENTS_SYMBIAN[] = "QtSupport.Wizards.FeatureQtQuickComponentsSymbian";
+const char FEATURE_QTQUICK_COMPONENTS_MEEGO[] = "QtSupport.Wizards.FeatureQtQuickComponentsMeego";
+
+
 // QML wizard categories
 // both the qt4projectmanager and the qmlprojectmanager do have qt quick wizards
 // so we define the category here
diff --git a/src/plugins/qtsupport/qtsupportplugin.cpp b/src/plugins/qtsupport/qtsupportplugin.cpp
index fe634b47d09..5ebf76147bb 100644
--- a/src/plugins/qtsupport/qtsupportplugin.cpp
+++ b/src/plugins/qtsupport/qtsupportplugin.cpp
@@ -57,6 +57,10 @@ bool QtSupportPlugin::initialize(const QStringList &arguments, QString *errorMes
 
     QtVersionManager *mgr = new QtVersionManager;
     addAutoReleasedObject(mgr);
+
+    QtFeatureProvider *featureMgr = new QtFeatureProvider;
+    addAutoReleasedObject(featureMgr);
+
     addAutoReleasedObject(new QtOptionsPage);
 
     ExamplesWelcomePage *welcomePage;
diff --git a/src/plugins/qtsupport/qtversionmanager.cpp b/src/plugins/qtsupport/qtversionmanager.cpp
index 31516ad0133..8e9e4bfacee 100644
--- a/src/plugins/qtsupport/qtversionmanager.cpp
+++ b/src/plugins/qtsupport/qtversionmanager.cpp
@@ -34,6 +34,8 @@
 
 #include "qtversionfactory.h"
 
+#include "qtsupportconstants.h"
+
 #include <projectexplorer/debugginghelper.h>
 // only for legay restore
 #include <projectexplorer/projectexplorerconstants.h>
@@ -600,6 +602,18 @@ QString QtVersionManager::popPendingGcceUpdate()
     return m_pendingGcceUpdates.takeFirst();
 }
 
+Core::FeatureSet QtVersionManager::availableFeatures() const
+{
+    Core::FeatureSet features;
+    foreach (BaseQtVersion *const qtVersion, validVersions()) {
+        if (qtVersion->isValid())
+            features |= qtVersion->availableFeatures();
+    }
+    if (validVersions().empty())
+        features |= Constants::FEATURE_GENERIC_CPP_ENTRY_POINT;
+    return features;
+}
+
 BaseQtVersion *QtVersionManager::version(int id) const
 {
     QMap<int, BaseQtVersion *>::const_iterator it = m_versions.find(id);
@@ -919,3 +933,8 @@ BaseQtVersion::QmakeBuildConfigs QtVersionManager::qmakeBuildConfigFromCmdArgs(Q
     }
     return result;
 }
+
+Core::FeatureSet QtFeatureProvider::availableFeatures() const
+{
+     return QtVersionManager::instance()->availableFeatures();
+}
diff --git a/src/plugins/qtsupport/qtversionmanager.h b/src/plugins/qtsupport/qtversionmanager.h
index fb46fcf31c0..8b0071d9113 100644
--- a/src/plugins/qtsupport/qtversionmanager.h
+++ b/src/plugins/qtsupport/qtversionmanager.h
@@ -111,6 +111,9 @@ public:
     // Compatibility with pre-2.2:
     QString popPendingMwcUpdate();
     QString popPendingGcceUpdate();
+
+    Core::FeatureSet availableFeatures() const;
+
 signals:
     // content of BaseQtVersion objects with qmake path might have changed
     void dumpUpdatedFor(const Utils::FileName &qmakeCommand);
@@ -159,6 +162,19 @@ private:
     QStringList m_pendingGcceUpdates;
 };
 
+namespace Internal {
+
+class QTSUPPORT_EXPORT QtFeatureProvider : public Core::IFeatureProvider
+{
+    Q_OBJECT
+
+public:
+    QtFeatureProvider() {}
+    virtual Core::FeatureSet availableFeatures() const;
+};
+
+}
+
 } // namespace Qt4ProjectManager
 
 #endif // QTVERSIONMANAGER_H
diff --git a/src/plugins/vcsbase/basecheckoutwizard.cpp b/src/plugins/vcsbase/basecheckoutwizard.cpp
index 3514613a173..e8f96224e2b 100644
--- a/src/plugins/vcsbase/basecheckoutwizard.cpp
+++ b/src/plugins/vcsbase/basecheckoutwizard.cpp
@@ -147,6 +147,11 @@ void BaseCheckoutWizard::runWizard(const QString &path, QWidget *parent)
     }
 }
 
+Core::FeatureSet BaseCheckoutWizard::requiredFeatures() const
+{
+    return Core::FeatureSet();
+}
+
 static inline QString msgNoProjectFiles(const QDir &dir, const QStringList &patterns)
 {
     return BaseCheckoutWizard::tr("Could not find any project files matching (%1) in the directory '%2'.").arg(patterns.join(QLatin1String(", ")), QDir::toNativeSeparators(dir.absolutePath()));
diff --git a/src/plugins/vcsbase/basecheckoutwizard.h b/src/plugins/vcsbase/basecheckoutwizard.h
index 57a0388781f..08e68a808f3 100644
--- a/src/plugins/vcsbase/basecheckoutwizard.h
+++ b/src/plugins/vcsbase/basecheckoutwizard.h
@@ -66,6 +66,8 @@ public:
 
     virtual void runWizard(const QString &path, QWidget *parent);
 
+    virtual Core::FeatureSet requiredFeatures() const;
+
     static QString openProject(const QString &path, QString *errorMessage);
 
 protected:
-- 
GitLab