diff --git a/src/plugins/cmakeprojectmanager/cmaketarget.cpp b/src/plugins/cmakeprojectmanager/cmaketarget.cpp
index 55f9f8502435c4f863602e1acf203d98d8164509..655173f4c33c1b306332b0049178d4f45a63da6d 100644
--- a/src/plugins/cmakeprojectmanager/cmaketarget.cpp
+++ b/src/plugins/cmakeprojectmanager/cmaketarget.cpp
@@ -186,7 +186,7 @@ CMakeTargetFactory::~CMakeTargetFactory()
 {
 }
 
-QStringList CMakeTargetFactory::availableCreationIds(ProjectExplorer::Project *parent) const
+QStringList CMakeTargetFactory::supportedTargetIds(ProjectExplorer::Project *parent) const
 {
     if (!qobject_cast<CMakeProject *>(parent))
         return QStringList();
diff --git a/src/plugins/cmakeprojectmanager/cmaketarget.h b/src/plugins/cmakeprojectmanager/cmaketarget.h
index 4563fd8922068ff42d996bb13775e7d95635c8c5..a710dbb742dca601fe7e6115e4fb9e6e4731d5c8 100644
--- a/src/plugins/cmakeprojectmanager/cmaketarget.h
+++ b/src/plugins/cmakeprojectmanager/cmaketarget.h
@@ -89,7 +89,7 @@ public:
 
     bool supportsTargetId(const QString &id) const;
 
-    QStringList availableCreationIds(ProjectExplorer::Project *parent) const;
+    QStringList supportedTargetIds(ProjectExplorer::Project *parent) const;
     QString displayNameForId(const QString &id) const;
 
     bool canCreate(ProjectExplorer::Project *parent, const QString &id) const;
diff --git a/src/plugins/genericprojectmanager/generictarget.cpp b/src/plugins/genericprojectmanager/generictarget.cpp
index 3f609550178c53ebc5d014db02747fe33927aa62..ae5b402800d5308441d038bb90ece154a7273a46 100644
--- a/src/plugins/genericprojectmanager/generictarget.cpp
+++ b/src/plugins/genericprojectmanager/generictarget.cpp
@@ -121,7 +121,7 @@ bool GenericTargetFactory::supportsTargetId(const QString &id) const
     return id == QLatin1String(GENERIC_DESKTOP_TARGET_ID);
 }
 
-QStringList GenericTargetFactory::availableCreationIds(ProjectExplorer::Project *parent) const
+QStringList GenericTargetFactory::supportedTargetIds(ProjectExplorer::Project *parent) const
 {
     if (!qobject_cast<GenericProject *>(parent))
         return QStringList();
diff --git a/src/plugins/genericprojectmanager/generictarget.h b/src/plugins/genericprojectmanager/generictarget.h
index 07ad77f2032ea3b1f60575f2c99ea74171826c1d..3aa281b7e3174faa9c63b59929e57bbda9a1e3ea 100644
--- a/src/plugins/genericprojectmanager/generictarget.h
+++ b/src/plugins/genericprojectmanager/generictarget.h
@@ -91,7 +91,7 @@ public:
 
     bool supportsTargetId(const QString &id) const;
 
-    QStringList availableCreationIds(ProjectExplorer::Project *parent) const;
+    QStringList supportedTargetIds(ProjectExplorer::Project *parent) const;
     QString displayNameForId(const QString &id) const;
 
     bool canCreate(ProjectExplorer::Project *parent, const QString &id) const;
diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp
index c754be241daf4210f091011a52003517f4c64527..dcc632a14d1864cd6ee79470f71a15a0eaaff30a 100644
--- a/src/plugins/projectexplorer/project.cpp
+++ b/src/plugins/projectexplorer/project.cpp
@@ -63,7 +63,6 @@ namespace ProjectExplorer {
 class ProjectPrivate {
 public:
     ProjectPrivate();
-    QSet<QString> m_supportedTargetIds;
     QList<Target *> m_targets;
     Target *m_activeTarget;
     EditorConfiguration *m_editorConfiguration;
@@ -102,34 +101,6 @@ QString Project::makeUnique(const QString &preferredName, const QStringList &use
     return tryName;
 }
 
-QSet<QString> Project::supportedTargetIds() const
-{
-    return d->m_supportedTargetIds;
-}
-
-QSet<QString> Project::possibleTargetIds() const
-{
-    QSet<QString> result(d->m_supportedTargetIds);
-    foreach (ProjectExplorer::Target *t, targets())
-        result.remove(t->id());
-
-    return result;
-}
-
-bool Project::canAddTarget(const QString &id) const
-{
-    return possibleTargetIds().contains(id);
-}
-
-void Project::setSupportedTargetIds(const QSet<QString> &ids)
-{
-    if (ids == d->m_supportedTargetIds)
-        return;
-
-    d->m_supportedTargetIds = ids;
-    emit supportedTargetIdsChanged();
-}
-
 void Project::changeEnvironment()
 {
     Target *t(qobject_cast<Target *>(sender()));
@@ -280,26 +251,31 @@ bool Project::fromMap(const QVariantMap &map)
             qWarning() << key << "was not found in data.";
             return false;
         }
-       QVariantMap targetMap = map.value(key).toMap();
+        QVariantMap targetMap = map.value(key).toMap();
 
         QList<ITargetFactory *> factories =
                 ExtensionSystem::PluginManager::instance()->getObjects<ITargetFactory>();
 
         Target *t = 0;
-        foreach (ITargetFactory *factory, factories) {
-            if (factory->canRestore(this, targetMap)) {
-                t = factory->restore(this, targetMap);
-                break;
+
+        if(target(idFromMap(targetMap))) {
+            qWarning() << "Duplicated target id found, not restoring second target with id"<<idFromMap(targetMap)<<"(Continuing)";
+        } else {
+            foreach (ITargetFactory *factory, factories) {
+                if (factory->canRestore(this, targetMap)) {
+                    t = factory->restore(this, targetMap);
+                    break;
+                }
             }
-        }
 
-        if (!t) {
-            qWarning() << "Restoration of a target failed! (Continuing)";
-            continue;
+            if (!t) {
+                qWarning() << "Restoration of a target failed! (Continuing)";
+                continue;
+            }
+            addTarget(t);
+            if (i == active)
+                setActiveTarget(t);
         }
-        addTarget(t);
-        if (i == active)
-            setActiveTarget(t);
     }
     return true;
 }
diff --git a/src/plugins/projectexplorer/project.h b/src/plugins/projectexplorer/project.h
index 56621c925cee88f61846fe241a290f52b181178b..5e3b0004f748e56dc0095052e3908f926991c33a 100644
--- a/src/plugins/projectexplorer/project.h
+++ b/src/plugins/projectexplorer/project.h
@@ -82,13 +82,6 @@ public:
     EditorConfiguration *editorConfiguration() const;
 
     // Target:
-
-    // Note: You can only add a specific kind of target (identified by id)
-    //       once.
-    QSet<QString> supportedTargetIds() const;
-    QSet<QString> possibleTargetIds() const;
-    bool canAddTarget(const QString &id) const;
-
     void addTarget(Target *target);
     void removeTarget(Target *target);
 
@@ -136,8 +129,6 @@ signals:
     void removedTarget(ProjectExplorer::Target *target);
     void addedTarget(ProjectExplorer::Target *target);
 
-    void supportedTargetIdsChanged();
-
     /// convenience signal emitted if the activeBuildConfiguration emits environmentChanged
     /// or if the activeBuildConfiguration changes
     /// (which theoretically might happen due to the active target changing).
@@ -149,8 +140,6 @@ protected:
     // Note: Do not forget to call your base class' fromMap method!
     virtual bool fromMap(const QVariantMap &map);
 
-    void setSupportedTargetIds(const QSet<QString> &ids);
-
 private slots:
     void changeEnvironment();
 
diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp
index 94106572f7457ef4f3b7608a3b86213cbac8b2b4..88c2b27fabf416a9b68b5392c3cbb91addf56ef4 100644
--- a/src/plugins/projectexplorer/projectexplorer.cpp
+++ b/src/plugins/projectexplorer/projectexplorer.cpp
@@ -961,6 +961,7 @@ void ProjectExplorerPlugin::clearSession()
 
 void ProjectExplorerPlugin::extensionsInitialized()
 {
+    d->m_proWindow->extensionsInitialized();
     d->m_fileFactories = ProjectFileFactory::createFactories(&d->m_projectFilterString);
     foreach (ProjectFileFactory *pf, d->m_fileFactories) {
         d->m_profileMimeTypes += pf->mimeTypes();
diff --git a/src/plugins/projectexplorer/projectwindow.cpp b/src/plugins/projectexplorer/projectwindow.cpp
index ba2635e98fe3c939a6ef813456731f1367d70418..728c1c4ba5117142dbb35fd60b9b2571b1bbd6ad 100644
--- a/src/plugins/projectexplorer/projectwindow.cpp
+++ b/src/plugins/projectexplorer/projectwindow.cpp
@@ -42,6 +42,7 @@
 #include "projecttreewidget.h"
 #include "iprojectproperties.h"
 #include "targetsettingspanel.h"
+#include "target.h"
 
 #include <coreplugin/icore.h>
 #include <coreplugin/ifile.h>
@@ -261,6 +262,14 @@ ProjectWindow::~ProjectWindow()
 {
 }
 
+void ProjectWindow::extensionsInitialized()
+{
+    foreach (ITargetFactory *fac, ExtensionSystem::PluginManager::instance()->getObjects<ITargetFactory>())
+        connect(fac, SIGNAL(supportedTargetIdsChanged()),
+                this, SLOT(targetFactoriesChanged()));
+
+}
+
 void ProjectWindow::aboutToShutdown()
 {
     showProperties(-1, -1); // TODO that's a bit stupid, but otherwise stuff is still
@@ -268,6 +277,35 @@ void ProjectWindow::aboutToShutdown()
     disconnect(ProjectExplorerPlugin::instance()->session(), 0, this, 0);
 }
 
+void ProjectWindow::targetFactoriesChanged()
+{
+    bool changed = false;
+    int index = m_tabWidget->currentIndex();
+    QList<Project *> projects = m_tabIndexToProject;
+    foreach (ProjectExplorer::Project *project, projects) {
+        if (m_usesTargetPage.value(project) != useTargetPage(project)) {
+            changed = true;
+            deregisterProject(project);
+            registerProject(project);
+        }
+    }
+    if (changed)
+        m_tabWidget->setCurrentIndex(index);
+}
+
+bool ProjectWindow::useTargetPage(ProjectExplorer::Project *project)
+{
+    if (project->targets().size() > 1)
+        return true;
+    QStringList tmp;
+    foreach (ITargetFactory *fac, ExtensionSystem::PluginManager::instance()->getObjects<ITargetFactory>()) {
+        tmp.append(fac->supportedTargetIds(project));
+        if (tmp.size() > 1)
+            return true;
+    }
+    return false;
+}
+
 void ProjectWindow::registerProject(ProjectExplorer::Project *project)
 {
     if (!project || m_tabIndexToProject.contains(project))
@@ -284,7 +322,11 @@ void ProjectWindow::registerProject(ProjectExplorer::Project *project)
     }
 
     QStringList subtabs;
-    if (project->supportedTargetIds().count() <= 1) {
+
+    bool usesTargetPage = useTargetPage(project);
+    m_usesTargetPage.insert(project, usesTargetPage);
+
+    if (!usesTargetPage){
         // Show the target specific pages directly
         QList<ITargetPanelFactory *> factories =
                 ExtensionSystem::PluginManager::instance()->getObjects<ITargetPanelFactory>();
@@ -308,9 +350,6 @@ void ProjectWindow::registerProject(ProjectExplorer::Project *project)
 
     m_tabIndexToProject.insert(index, project);
     m_tabWidget->insertTab(index, project->displayName(), subtabs);
-
-    connect(project, SIGNAL(supportedTargetIdsChanged()),
-            this, SLOT(refreshProject()));
 }
 
 void ProjectWindow::deregisterProject(ProjectExplorer::Project *project)
@@ -319,9 +358,6 @@ void ProjectWindow::deregisterProject(ProjectExplorer::Project *project)
     if (index < 0)
         return;
 
-    disconnect(project, SIGNAL(supportedTargetIdsChanged()),
-               this, SLOT(refreshProject()));
-
     m_tabIndexToProject.removeAt(index);
     m_tabWidget->removeTab(index);
 }
@@ -336,19 +372,6 @@ void ProjectWindow::saveStatus()
     // TODO
 }
 
-void ProjectWindow::refreshProject()
-{
-    Project *project = qobject_cast<ProjectExplorer::Project *>(sender());
-    if (!m_tabIndexToProject.contains(project))
-        return;
-
-    // TODO this changes the subindex
-    int index = m_tabWidget->currentIndex();
-    deregisterProject(project);
-    registerProject(project);
-    m_tabWidget->setCurrentIndex(index);
-}
-
 void ProjectWindow::startupProjectChanged(ProjectExplorer::Project *p)
 {
     int index = m_tabIndexToProject.indexOf(p);
@@ -373,7 +396,8 @@ void ProjectWindow::showProperties(int index, int subIndex)
             = qobject_cast<TargetSettingsPanelWidget*>(m_currentWidget)) {
         m_previousTargetSubIndex = previousPanelWidget->currentSubIndex();
     }
-    if (project->supportedTargetIds().count() > 1) {
+
+    if (m_usesTargetPage.value(project)) {
         if (subIndex == 0) {
             // Targets page
             removeCurrentWidget();
diff --git a/src/plugins/projectexplorer/projectwindow.h b/src/plugins/projectexplorer/projectwindow.h
index 9c2976b99a359fe0a5166c30fc4d9ce44ee74dcc..ccf2576ffaa7de7f2cd6e164f0819042086cadfe 100644
--- a/src/plugins/projectexplorer/projectwindow.h
+++ b/src/plugins/projectexplorer/projectwindow.h
@@ -34,6 +34,7 @@
 #ifndef PROJECTWINDOW_H
 #define PROJECTWINDOW_H
 
+#include <QtCore/QMap>
 #include <QtGui/QScrollArea>
 
 QT_BEGIN_NAMESPACE
@@ -81,7 +82,9 @@ public:
     ~ProjectWindow();
 
     void aboutToShutdown();
+    void extensionsInitialized();
 private slots:
+    void targetFactoriesChanged();
     void showProperties(int index, int subIndex);
     void restoreStatus();
     void saveStatus();
@@ -89,15 +92,15 @@ private slots:
     void deregisterProject(ProjectExplorer::Project*);
     void startupProjectChanged(ProjectExplorer::Project *);
 
-    void refreshProject();
-
 private:
+    bool useTargetPage(ProjectExplorer::Project *project);
     void removeCurrentWidget();
 
     DoubleTabWidget *m_tabWidget;
     QStackedWidget *m_centralWidget;
     QWidget *m_currentWidget;
     QList<ProjectExplorer::Project *> m_tabIndexToProject;
+    QMap<ProjectExplorer::Project *, bool> m_usesTargetPage;
     int m_previousTargetSubIndex;
 };
 
diff --git a/src/plugins/projectexplorer/target.h b/src/plugins/projectexplorer/target.h
index 719b3ca06e608a920ba19fc0fc18608cac56f6c1..ce1dbe2fecb98517ee62241a1bb772eb059cef9c 100644
--- a/src/plugins/projectexplorer/target.h
+++ b/src/plugins/projectexplorer/target.h
@@ -159,10 +159,9 @@ public:
     explicit ITargetFactory(QObject *parent = 0);
     virtual ~ITargetFactory();
 
+    virtual QStringList supportedTargetIds(ProjectExplorer::Project *project) const = 0;
     virtual bool supportsTargetId(const QString &id) const = 0;
 
-    // used to show the list of possible additons to a target, returns a list of types
-    virtual QStringList availableCreationIds(Project *parent) const = 0;
     // used to translate the types to names to display to the user
     virtual QString displayNameForId(const QString &id) const = 0;
 
@@ -172,7 +171,7 @@ public:
     virtual Target *restore(Project *parent, const QVariantMap &map) = 0;
 
 signals:
-    void availableCreationIdsChanged();
+    void supportedTargetIdsChanged();
 };
 
 } // namespace ProjectExplorer
diff --git a/src/plugins/projectexplorer/targetsettingspanel.cpp b/src/plugins/projectexplorer/targetsettingspanel.cpp
index 865cefae9f735863ec724e213a6f3655fbdd5ff5..e3eff51eead5f167d57933c783d9d440d1f48bce 100644
--- a/src/plugins/projectexplorer/targetsettingspanel.cpp
+++ b/src/plugins/projectexplorer/targetsettingspanel.cpp
@@ -79,8 +79,14 @@ TargetSettingsPanelWidget::TargetSettingsPanelWidget(Project *project) :
 
     connect(m_project, SIGNAL(activeTargetChanged(ProjectExplorer::Target*)),
             this, SLOT(activeTargetChanged(ProjectExplorer::Target*)));
-    connect(m_project, SIGNAL(supportedTargetIdsChanged()),
-            this, SLOT(updateTargetAddAndRemoveButtons()));
+
+    QList<ITargetFactory *> factories =
+            ExtensionSystem::PluginManager::instance()->getObjects<ITargetFactory>();
+
+    foreach (ITargetFactory *fac, factories) {
+        connect(fac, SIGNAL(supportedTargetIdsChanged()),
+                this, SLOT(updateTargetAddAndRemoveButtons()));
+    }
 }
 
 TargetSettingsPanelWidget::~TargetSettingsPanelWidget()
@@ -204,6 +210,7 @@ void TargetSettingsPanelWidget::currentTargetChanged(int targetIndex, int subInd
 void TargetSettingsPanelWidget::addTarget(QAction *action)
 {
     QString id = action->data().toString();
+    Q_ASSERT(!m_project->target(id));
     QList<ITargetFactory *> factories =
             ExtensionSystem::PluginManager::instance()->getObjects<ITargetFactory>();
 
@@ -284,30 +291,26 @@ void TargetSettingsPanelWidget::updateTargetAddAndRemoveButtons()
     QList<ITargetFactory *> factories =
             ExtensionSystem::PluginManager::instance()->getObjects<ITargetFactory>();
 
-    foreach (const QString &id, m_project->possibleTargetIds()) {
-        QString displayName;
-        foreach (ITargetFactory *fac, factories) {
-            if (fac->supportsTargetId(id)) {
-                displayName = fac->displayNameForId(id);
-                break;
+    foreach (ITargetFactory *fac, factories) {
+        foreach (const QString &id, fac->supportedTargetIds(m_project)) {
+            if (m_project->target(id))
+                continue;
+            QString displayName = fac->displayNameForId(id);
+            QAction *action = new QAction(displayName, m_addMenu);
+            action->setData(QVariant(id));
+            bool added = false;
+            foreach(QAction *existing, m_addMenu->actions()) {
+                if (existing->text() > action->text()) {
+                    m_addMenu->insertAction(existing, action);
+                    added = true;
+                }
             }
-        }
-        if (displayName.isEmpty())
-            continue;
 
-        QAction *action = new QAction(displayName, m_addMenu);
-        action->setData(QVariant(id));
-        bool added = false;
-        foreach(QAction *existing, m_addMenu->actions()) {
-            if (existing->text() > action->text()) {
-                m_addMenu->insertAction(existing, action);
-                added = true;
-            }
+            if (!added)
+                m_addMenu->addAction(action);
         }
-
-        if (!added)
-            m_addMenu->addAction(action);
     }
+
     m_selector->setAddButtonEnabled(!m_addMenu->actions().isEmpty());
     m_selector->setRemoveButtonEnabled(m_project->targets().count() > 1);
 }
diff --git a/src/plugins/qmlprojectmanager/qmlproject.cpp b/src/plugins/qmlprojectmanager/qmlproject.cpp
index 69023ebaffbee4f35bab0a39d1e73ce8787dd448..a104b0261963c698ab46be7b6b5aa3e9be0fbbdf 100644
--- a/src/plugins/qmlprojectmanager/qmlproject.cpp
+++ b/src/plugins/qmlprojectmanager/qmlproject.cpp
@@ -58,7 +58,6 @@ QmlProject::QmlProject(Internal::Manager *manager, const QString &fileName)
       m_modelManager(ExtensionSystem::PluginManager::instance()->getObject<QmlJS::ModelManagerInterface>()),
       m_fileWatcher(new ProjectExplorer::FileWatcher(this))
 {
-    setSupportedTargetIds(QSet<QString>() << QLatin1String(Constants::QML_VIEWER_TARGET_ID));
     QFileInfo fileInfo(m_fileName);
     m_projectName = fileInfo.completeBaseName();
 
diff --git a/src/plugins/qmlprojectmanager/qmlprojecttarget.cpp b/src/plugins/qmlprojectmanager/qmlprojecttarget.cpp
index e01c8400d52895b942dc2c598750005605efdc14..3144ad3246696934dfe363bb8927587071d8589c 100644
--- a/src/plugins/qmlprojectmanager/qmlprojecttarget.cpp
+++ b/src/plugins/qmlprojectmanager/qmlprojecttarget.cpp
@@ -108,7 +108,7 @@ bool QmlProjectTargetFactory::supportsTargetId(const QString &id) const
     return id == QLatin1String(Constants::QML_VIEWER_TARGET_ID);
 }
 
-QStringList QmlProjectTargetFactory::availableCreationIds(ProjectExplorer::Project *parent) const
+QStringList QmlProjectTargetFactory::supportedTargetIds(ProjectExplorer::Project *parent) const
 {
     if (!qobject_cast<QmlProject *>(parent))
         return QStringList();
diff --git a/src/plugins/qmlprojectmanager/qmlprojecttarget.h b/src/plugins/qmlprojectmanager/qmlprojecttarget.h
index 7fc8aacebb40e8a19454f70d77df2f76843c18a5..843e4431cc3c4aec565880d610ad4f9a091c465e 100644
--- a/src/plugins/qmlprojectmanager/qmlprojecttarget.h
+++ b/src/plugins/qmlprojectmanager/qmlprojecttarget.h
@@ -76,7 +76,7 @@ public:
     ~QmlProjectTargetFactory();
 
     bool supportsTargetId(const QString &id) const;
-    QStringList availableCreationIds(ProjectExplorer::Project *parent) const;
+    QStringList supportedTargetIds(ProjectExplorer::Project *parent) const;
     QString displayNameForId(const QString &id) const;
 
     bool canCreate(ProjectExplorer::Project *parent, const QString &id) const;
diff --git a/src/plugins/qt4projectmanager/externaleditors.cpp b/src/plugins/qt4projectmanager/externaleditors.cpp
index 53d1b7ba1a343da6d61e4b68e81b517835c0c8c7..872f8bf5fd5460edb05d90a7403898f7f546699d 100644
--- a/src/plugins/qt4projectmanager/externaleditors.cpp
+++ b/src/plugins/qt4projectmanager/externaleditors.cpp
@@ -34,7 +34,6 @@
 #include "externaleditors.h"
 #include "qt4project.h"
 #include "qt4projectmanagerconstants.h"
-#include "qt4target.h"
 #include "qtversionmanager.h"
 #include "qt4buildconfiguration.h"
 
diff --git a/src/plugins/qt4projectmanager/projectloadwizard.cpp b/src/plugins/qt4projectmanager/projectloadwizard.cpp
index 0341cb19db8b92b6b8d80e2b7660027bb23cba03..5797e99b1742c4a2db9ffefd718a2dde286f80ba 100644
--- a/src/plugins/qt4projectmanager/projectloadwizard.cpp
+++ b/src/plugins/qt4projectmanager/projectloadwizard.cpp
@@ -32,16 +32,8 @@
 **************************************************************************/
 
 #include "projectloadwizard.h"
-
-#include "qt4project.h"
-#include "qmakestep.h"
-#include "qt4target.h"
-#include "makestep.h"
-#include "qt4buildconfiguration.h"
-#include "qt4projectmanagerconstants.h"
-#include "qtversionmanager.h"
-
 #include "wizards/targetsetuppage.h"
+#include "qt4project.h"
 
 #include <QtGui/QCheckBox>
 #include <QtGui/QHeaderView>
@@ -98,7 +90,7 @@ void ProjectLoadWizard::setupTargetPage()
         return;
 
     QList<TargetSetupPage::ImportInfo> importVersions = TargetSetupPage::scanDefaultProjectDirectories(m_project);
-    importVersions.append(TargetSetupPage::importInfosForKnownQtVersions());
+    importVersions.append(TargetSetupPage::importInfosForKnownQtVersions(m_project->file()->fileName()));
 
     m_targetSetupPage = new TargetSetupPage(this);
     m_targetSetupPage->setProFilePath(m_project->file()->fileName());
diff --git a/src/plugins/qt4projectmanager/qmakestep.h b/src/plugins/qt4projectmanager/qmakestep.h
index 67514439d7c4c2c88f72811bb36b7afaab1dafb6..a1e82bbc1d5e323934bc1a0a7594e3828985610e 100644
--- a/src/plugins/qt4projectmanager/qmakestep.h
+++ b/src/plugins/qt4projectmanager/qmakestep.h
@@ -47,8 +47,8 @@ class Project;
 }
 
 namespace Qt4ProjectManager {
-class Qt4Project;
 class Qt4BuildConfiguration;
+class Qt4Project;
 
 namespace Internal {
 
diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt-desktop.pri b/src/plugins/qt4projectmanager/qt-desktop/qt-desktop.pri
new file mode 100644
index 0000000000000000000000000000000000000000..d002792d25d1b32b3cc4ccc3187013a7e9c424c2
--- /dev/null
+++ b/src/plugins/qt4projectmanager/qt-desktop/qt-desktop.pri
@@ -0,0 +1,14 @@
+
+HEADERS += \
+    $$PWD/qt4runconfiguration.h \
+    $$PWD/qt4desktoptargetfactory.h \
+    $$PWD/qt4simulatortargetfactory.h \
+    $$PWD/qt4desktoptarget.h \
+    $$PWD/qt4simulatortarget.h
+
+SOURCES += \
+    $$PWD/qt4runconfiguration.cpp \
+    $$PWD/qt4desktoptargetfactory.cpp \
+    $$PWD/qt4simulatortargetfactory.cpp \
+    $$PWD/qt4desktoptarget.cpp \
+    $$PWD/qt4simulatortarget.cpp
diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptarget.cpp b/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptarget.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f4b8e47a8c293779f5967d9a15efab7521955012
--- /dev/null
+++ b/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptarget.cpp
@@ -0,0 +1,92 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, 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.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#include "qt4desktoptarget.h"
+#include "qt4project.h"
+#include "qt4runconfiguration.h"
+#include <projectexplorer/deployconfiguration.h>
+#include <projectexplorer/customexecutablerunconfiguration.h>
+#include <QtGui/QApplication>
+#include <QtGui/QStyle>
+
+using namespace Qt4ProjectManager;
+using namespace Qt4ProjectManager::Internal;
+
+Qt4DesktopTarget::Qt4DesktopTarget(Qt4Project *parent, const QString &id) :
+    Qt4BaseTarget(parent, id),
+    m_buildConfigurationFactory(new Qt4BuildConfigurationFactory(this)),
+    m_deployConfigurationFactory(new ProjectExplorer::DeployConfigurationFactory(this))
+{
+    setDisplayName(defaultDisplayName());
+    setIcon(qApp->style()->standardIcon(QStyle::SP_ComputerIcon));
+}
+
+Qt4DesktopTarget::~Qt4DesktopTarget()
+{
+}
+
+QString Qt4DesktopTarget::defaultDisplayName()
+{
+    return QApplication::translate("Qt4ProjectManager::Qt4Target", "Desktop", "Qt4 Desktop target display name");
+}
+
+Qt4BuildConfigurationFactory *Qt4DesktopTarget::buildConfigurationFactory() const
+{
+    return m_buildConfigurationFactory;
+}
+
+ProjectExplorer::DeployConfigurationFactory *Qt4DesktopTarget::deployConfigurationFactory() const
+{
+    return m_deployConfigurationFactory;
+}
+
+void Qt4DesktopTarget::createApplicationProFiles()
+{
+    removeUnconfiguredCustomExectutableRunConfigurations();
+
+    // We use the list twice
+    QList<Qt4ProFileNode *> profiles = qt4Project()->applicationProFiles();
+    QSet<QString> paths;
+    foreach (Qt4ProFileNode *pro, profiles)
+        paths << pro->path();
+
+    foreach (ProjectExplorer::RunConfiguration *rc, runConfigurations())
+        if (Qt4RunConfiguration *qt4rc = qobject_cast<Qt4RunConfiguration *>(rc)) {
+            paths.remove(qt4rc->proFilePath());
+        }
+
+    // Only add new runconfigurations if there are none.
+    foreach (const QString &path, paths)
+        addRunConfiguration(new Qt4RunConfiguration(this, path));
+
+    // Oh still none? Add a custom executable runconfiguration
+    if (runConfigurations().isEmpty()) {
+        addRunConfiguration(new ProjectExplorer::CustomExecutableRunConfiguration(this));
+    }
+}
diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptarget.h b/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptarget.h
new file mode 100644
index 0000000000000000000000000000000000000000..68ef63c35f1413f3c72c2b59fd6b062bd770a9a7
--- /dev/null
+++ b/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptarget.h
@@ -0,0 +1,63 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, 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.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#ifndef QT4DESKTOPTARGET_H
+#define QT4DESKTOPTARGET_H
+
+#include "qt4target.h"
+
+namespace Qt4ProjectManager {
+
+class Qt4Project;
+
+namespace Internal {
+
+class Qt4DesktopTarget : public Qt4BaseTarget
+{
+    friend class Qt4DesktopTargetFactory;
+    Q_OBJECT
+public:
+    explicit Qt4DesktopTarget(Qt4Project *parent, const QString &id);
+    virtual ~Qt4DesktopTarget();
+
+    Internal::Qt4BuildConfigurationFactory *buildConfigurationFactory() const;
+    ProjectExplorer::DeployConfigurationFactory *deployConfigurationFactory() const;
+
+    void createApplicationProFiles();
+
+    static QString defaultDisplayName();
+
+private:
+    Internal::Qt4BuildConfigurationFactory *m_buildConfigurationFactory;
+    ProjectExplorer::DeployConfigurationFactory *m_deployConfigurationFactory;
+};
+
+} // namespace Internal
+} // namespace Qt4ProjectManager
+#endif // QT4DESKTOPTARGET_H
diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.cpp b/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..681ccfee86b85a08cf5c2c61191f96d532ca698f
--- /dev/null
+++ b/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.cpp
@@ -0,0 +1,177 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, 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.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#include "qt4desktoptargetfactory.h"
+#include "qt4projectmanagerconstants.h"
+#include "qt4project.h"
+#include "qt4runconfiguration.h"
+#include "qt4desktoptarget.h"
+
+#include <projectexplorer/deployconfiguration.h>
+#include <projectexplorer/projectexplorerconstants.h>
+#include <projectexplorer/customexecutablerunconfiguration.h>
+#include <projectexplorer/projectexplorerconstants.h>
+
+#include <QtGui/QApplication>
+#include <QtGui/QStyle>
+
+using namespace Qt4ProjectManager;
+using namespace Qt4ProjectManager::Internal;
+using ProjectExplorer::idFromMap;
+
+Qt4DesktopTargetFactory::Qt4DesktopTargetFactory(QObject *parent) :
+    Qt4BaseTargetFactory(parent)
+{
+    connect(QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>)),
+            this, SIGNAL(supportedTargetIdsChanged()));
+}
+
+Qt4DesktopTargetFactory::~Qt4DesktopTargetFactory()
+{
+}
+
+bool Qt4DesktopTargetFactory::supportsTargetId(const QString &id) const
+{
+    return id == QLatin1String(Constants::DESKTOP_TARGET_ID);
+}
+
+QStringList Qt4DesktopTargetFactory::supportedTargetIds(ProjectExplorer::Project *parent) const
+{
+    if (!qobject_cast<Qt4Project *>(parent))
+        return QStringList();
+    if (!QtVersionManager::instance()->supportsTargetId(Constants::DESKTOP_TARGET_ID))
+        return QStringList();
+    return QStringList() << QLatin1String(Constants::DESKTOP_TARGET_ID);
+}
+
+QString Qt4DesktopTargetFactory::displayNameForId(const QString &id) const
+{
+    if (id == QLatin1String(Constants::DESKTOP_TARGET_ID))
+        return Qt4DesktopTarget::defaultDisplayName();
+    return QString();
+}
+
+bool Qt4DesktopTargetFactory::canCreate(ProjectExplorer::Project *parent, const QString &id) const
+{
+    if (!qobject_cast<Qt4Project *>(parent))
+        return false;
+    return supportsTargetId(id);
+}
+
+bool Qt4DesktopTargetFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const
+{
+    return canCreate(parent, idFromMap(map));
+}
+
+Qt4BaseTarget *Qt4DesktopTargetFactory::restore(ProjectExplorer::Project *parent, const QVariantMap &map)
+{
+    if (!canRestore(parent, map))
+        return 0;
+
+    Qt4Project *qt4project = static_cast<Qt4Project *>(parent);
+    Qt4DesktopTarget *target = new Qt4DesktopTarget(qt4project, QLatin1String("transient ID"));
+
+    if (target->fromMap(map))
+        return target;
+    delete target;
+    return 0;
+}
+
+QString Qt4DesktopTargetFactory::defaultShadowBuildDirectory(const QString &projectLocation, const QString &id)
+{
+    if (id != QLatin1String(Constants::DESKTOP_TARGET_ID))
+        return QString();
+
+    // currently we can't have the build directory to be deeper than the source directory
+    // since that is broken in qmake
+    // Once qmake is fixed we can change that to have a top directory and
+    // subdirectories per build. (Replacing "QChar('-')" with "QChar('/') )
+    return projectLocation + QLatin1String("-desktop");
+}
+
+QList<BuildConfigurationInfo> Qt4DesktopTargetFactory::availableBuildConfigurations(const QString &proFilePath)
+{
+    QList<BuildConfigurationInfo> infos;
+    QList<QtVersion *> knownVersions = QtVersionManager::instance()->versionsForTargetId(Constants::DESKTOP_TARGET_ID);
+
+    foreach (QtVersion *version, knownVersions) {
+        bool buildAll = version->defaultBuildConfig() & QtVersion::BuildAll;
+        QtVersion::QmakeBuildConfigs config = buildAll ? QtVersion::BuildAll : QtVersion::QmakeBuildConfig(0);
+
+        QString dir = defaultShadowBuildDirectory(Qt4Project::defaultTopLevelBuildDirectory(proFilePath), Constants::DESKTOP_TARGET_ID);
+        infos.append(BuildConfigurationInfo(version, config, QString(), dir));
+        infos.append(BuildConfigurationInfo(version, config | QtVersion::DebugBuild, QString(), dir));
+    }
+    return infos;
+}
+
+Qt4BaseTarget *Qt4DesktopTargetFactory::create(ProjectExplorer::Project *parent, const QString &id)
+{
+    if (!canCreate(parent, id))
+        return 0;
+
+    QList<QtVersion *> knownVersions = QtVersionManager::instance()->versionsForTargetId(id);
+    if (knownVersions.isEmpty())
+        return 0;
+
+    QtVersion *qtVersion = knownVersions.first();
+    bool buildAll = qtVersion->isValid() && (qtVersion->defaultBuildConfig() & QtVersion::BuildAll);
+    QtVersion::QmakeBuildConfigs config = buildAll ? QtVersion::BuildAll : QtVersion::QmakeBuildConfig(0);
+
+    QList<BuildConfigurationInfo> infos;
+    infos.append(BuildConfigurationInfo(qtVersion, config | QtVersion::DebugBuild, QString(), QString()));
+    infos.append(BuildConfigurationInfo(qtVersion, config, QString(), QString()));
+
+    return create(parent, id, infos);
+}
+
+Qt4BaseTarget *Qt4DesktopTargetFactory::create(ProjectExplorer::Project *parent, const QString &id, QList<BuildConfigurationInfo> infos)
+{
+    if (!canCreate(parent, id))
+        return 0;
+    Qt4DesktopTarget *t = new Qt4DesktopTarget(static_cast<Qt4Project *>(parent), id);
+
+    foreach (const BuildConfigurationInfo &info, infos) {
+        QString displayName = info.version->displayName() + QLatin1Char(' ');
+        displayName += (info.buildConfig & QtVersion::DebugBuild) ? tr("Debug") : tr("Release");
+        t->addQt4BuildConfiguration(displayName,
+                                    info.version,
+                                    info.buildConfig,
+                                    info.additionalArguments,
+                                    info.directory);
+    }
+
+    t->addDeployConfiguration(t->deployConfigurationFactory()->create(t, ProjectExplorer::Constants::DEFAULT_DEPLOYCONFIGURATION_ID));
+
+    t->createApplicationProFiles();
+
+    if (t->runConfigurations().isEmpty())
+        t->addRunConfiguration(new ProjectExplorer::CustomExecutableRunConfiguration(t));
+    return t;
+}
diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.h b/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.h
new file mode 100644
index 0000000000000000000000000000000000000000..b65d9716f7e7b85e60ba4da48065da1d2936ca45
--- /dev/null
+++ b/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.h
@@ -0,0 +1,61 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, 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.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#ifndef QT4DESKTOPTARGETFACTORY_H
+#define QT4DESKTOPTARGETFACTORY_H
+
+#include "qt4target.h"
+
+namespace Qt4ProjectManager {
+namespace Internal {
+class Qt4DesktopTargetFactory : public Qt4BaseTargetFactory
+{
+    Q_OBJECT
+public:
+    Qt4DesktopTargetFactory(QObject *parent = 0);
+    ~Qt4DesktopTargetFactory();
+
+    QStringList supportedTargetIds(ProjectExplorer::Project *parent) const;
+    QString displayNameForId(const QString &id) const;
+
+    bool canCreate(ProjectExplorer::Project *parent, const QString &id) const;
+    bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const;
+    Qt4ProjectManager::Qt4BaseTarget *restore(ProjectExplorer::Project *parent, const QVariantMap &map);
+    QString defaultShadowBuildDirectory(const QString &projectLocation, const QString &id);
+
+    virtual bool supportsTargetId(const QString &id) const;
+
+    QList<BuildConfigurationInfo> availableBuildConfigurations(const QString &proFilePath);
+    Qt4BaseTarget *create(ProjectExplorer::Project *parent, const QString &id);
+    Qt4BaseTarget *create(ProjectExplorer::Project *parent, const QString &id, QList<BuildConfigurationInfo> infos);
+};
+}
+}
+
+#endif // QT4DESKTOPTARGETFACTORY_H
diff --git a/src/plugins/qt4projectmanager/qt4runconfiguration.cpp b/src/plugins/qt4projectmanager/qt-desktop/qt4runconfiguration.cpp
similarity index 97%
rename from src/plugins/qt4projectmanager/qt4runconfiguration.cpp
rename to src/plugins/qt4projectmanager/qt-desktop/qt4runconfiguration.cpp
index 43d964de2aa55b8b8f778ba248bbf8fc27c436f1..ecae28a0911eda565b0dd3c355a1e428843559d8 100644
--- a/src/plugins/qt4projectmanager/qt4runconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt-desktop/qt4runconfiguration.cpp
@@ -41,6 +41,7 @@
 #include "qt4buildconfiguration.h"
 #include "qt4projectmanagerconstants.h"
 #include "qtoutputformatter.h"
+#include "qt4desktoptarget.h"
 
 #include <coreplugin/coreconstants.h>
 #include <coreplugin/icore.h>
@@ -100,7 +101,7 @@ QString pathToId(const QString &path)
 // Qt4RunConfiguration
 //
 
-Qt4RunConfiguration::Qt4RunConfiguration(Qt4Target *parent, const QString &proFilePath) :
+Qt4RunConfiguration::Qt4RunConfiguration(Qt4BaseTarget *parent, const QString &proFilePath) :
     LocalApplicationRunConfiguration(parent, QLatin1String(QT4_RC_ID)),
     m_proFilePath(proFilePath),
     m_runMode(Gui),
@@ -111,7 +112,7 @@ Qt4RunConfiguration::Qt4RunConfiguration(Qt4Target *parent, const QString &proFi
     ctor();
 }
 
-Qt4RunConfiguration::Qt4RunConfiguration(Qt4Target *parent, Qt4RunConfiguration *source) :
+Qt4RunConfiguration::Qt4RunConfiguration(Qt4BaseTarget *parent, Qt4RunConfiguration *source) :
     LocalApplicationRunConfiguration(parent, source),
     m_commandLineArguments(source->m_commandLineArguments),
     m_proFilePath(source->m_proFilePath),
@@ -129,9 +130,9 @@ Qt4RunConfiguration::~Qt4RunConfiguration()
 {
 }
 
-Qt4Target *Qt4RunConfiguration::qt4Target() const
+Qt4DesktopTarget *Qt4RunConfiguration::qt4Target() const
 {
-    return static_cast<Qt4Target *>(target());
+    return static_cast<Qt4DesktopTarget *>(target());
 }
 
 bool Qt4RunConfiguration::isEnabled(ProjectExplorer::BuildConfiguration * /* configuration */) const
@@ -719,7 +720,7 @@ Qt4RunConfigurationFactory::~Qt4RunConfigurationFactory()
 
 bool Qt4RunConfigurationFactory::canCreate(ProjectExplorer::Target *parent, const QString &id) const
 {
-    Qt4Target *t = qobject_cast<Qt4Target *>(parent);
+    Qt4DesktopTarget *t = qobject_cast<Qt4DesktopTarget *>(parent);
     if (!t)
         return false;
     if (t->id() != QLatin1String(Constants::DESKTOP_TARGET_ID))
@@ -731,13 +732,13 @@ ProjectExplorer::RunConfiguration *Qt4RunConfigurationFactory::create(ProjectExp
 {
     if (!canCreate(parent, id))
         return 0;
-    Qt4Target *t(static_cast<Qt4Target *>(parent));
+    Qt4DesktopTarget *t(static_cast<Qt4DesktopTarget *>(parent));
     return new Qt4RunConfiguration(t, pathFromId(id));
 }
 
 bool Qt4RunConfigurationFactory::canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const
 {
-    if (!qobject_cast<Qt4Target *>(parent))
+    if (!qobject_cast<Qt4DesktopTarget *>(parent))
         return false;
     if (parent->id() != QLatin1String(Constants::DESKTOP_TARGET_ID))
         return false;
@@ -749,8 +750,8 @@ ProjectExplorer::RunConfiguration *Qt4RunConfigurationFactory::restore(ProjectEx
 {
     if (!canRestore(parent, map))
         return 0;
-    Qt4Target *t(static_cast<Qt4Target *>(parent));
-    Qt4RunConfiguration *rc(new Qt4RunConfiguration(t, QString()));
+    Qt4DesktopTarget *t = static_cast<Qt4DesktopTarget *>(parent);
+    Qt4RunConfiguration *rc = new Qt4RunConfiguration(t, QString());
     if (rc->fromMap(map))
         return rc;
 
@@ -767,14 +768,14 @@ ProjectExplorer::RunConfiguration *Qt4RunConfigurationFactory::clone(ProjectExpl
 {
     if (!canClone(parent, source))
         return 0;
-    Qt4Target *t(static_cast<Qt4Target *>(parent));
-    Qt4RunConfiguration *old(static_cast<Qt4RunConfiguration *>(source));
+    Qt4DesktopTarget *t = static_cast<Qt4DesktopTarget *>(parent);
+    Qt4RunConfiguration *old = static_cast<Qt4RunConfiguration *>(source);
     return new Qt4RunConfiguration(t, old);
 }
 
 QStringList Qt4RunConfigurationFactory::availableCreationIds(ProjectExplorer::Target *parent) const
 {
-    Qt4Target *t(qobject_cast<Qt4Target *>(parent));
+    Qt4DesktopTarget *t = qobject_cast<Qt4DesktopTarget *>(parent);
     if (!t)
         return QStringList();
     if (t->id() != Constants::DESKTOP_TARGET_ID)
diff --git a/src/plugins/qt4projectmanager/qt4runconfiguration.h b/src/plugins/qt4projectmanager/qt-desktop/qt4runconfiguration.h
similarity index 97%
rename from src/plugins/qt4projectmanager/qt4runconfiguration.h
rename to src/plugins/qt4projectmanager/qt-desktop/qt4runconfiguration.h
index 86210b53c3ce8afb5aa55e413ccd56c3ce275369..182521bfa705caa75c20346b0109650002b104a5 100644
--- a/src/plugins/qt4projectmanager/qt4runconfiguration.h
+++ b/src/plugins/qt4projectmanager/qt-desktop/qt4runconfiguration.h
@@ -59,10 +59,12 @@ namespace ProjectExplorer {
 }
 
 namespace Qt4ProjectManager {
+
 class Qt4Project;
-class Qt4Target;
+class Qt4BaseTarget;
 
 namespace Internal {
+class Qt4DesktopTarget;
 class Qt4PriFileNode;
 class Qt4ProFileNode;
 class Qt4RunConfigurationFactory;
@@ -75,10 +77,10 @@ class Qt4RunConfiguration : public ProjectExplorer::LocalApplicationRunConfigura
     friend class Qt4RunConfigurationFactory;
 
 public:
-    Qt4RunConfiguration(Qt4Target *parent, const QString &proFilePath);
+    Qt4RunConfiguration(Qt4BaseTarget *parent, const QString &proFilePath);
     virtual ~Qt4RunConfiguration();
 
-    Qt4Target *qt4Target() const;
+    Qt4DesktopTarget *qt4Target() const;
 
     virtual bool isEnabled(ProjectExplorer::BuildConfiguration *configuration) const;
     using ProjectExplorer::LocalApplicationRunConfiguration::isEnabled;
@@ -119,7 +121,7 @@ private slots:
     void proFileInvalidated(Qt4ProjectManager::Internal::Qt4ProFileNode *pro);
 
 protected:
-    Qt4RunConfiguration(Qt4Target *parent, Qt4RunConfiguration *source);
+    Qt4RunConfiguration(Qt4BaseTarget *parent, Qt4RunConfiguration *source);
     virtual bool fromMap(const QVariantMap &map);
 
 private:
diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortarget.cpp b/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortarget.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..c15df4ccb4b36ceae836c70ef3f1ac786843f118
--- /dev/null
+++ b/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortarget.cpp
@@ -0,0 +1,96 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, 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.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#include "qt4simulatortarget.h"
+#include "qt4project.h"
+#include "qt4runconfiguration.h"
+
+#include <projectexplorer/customexecutablerunconfiguration.h>
+#include <projectexplorer/deployconfiguration.h>
+#include <QtGui/QApplication>
+
+using namespace Qt4ProjectManager;
+using namespace Qt4ProjectManager::Internal;
+
+
+// -------------------------------------------------------------------------
+// Qt4Target
+// -------------------------------------------------------------------------
+
+Qt4SimulatorTarget::Qt4SimulatorTarget(Qt4Project *parent, const QString &id) :
+    Qt4BaseTarget(parent, id),
+    m_buildConfigurationFactory(new Qt4BuildConfigurationFactory(this)),
+    m_deployConfigurationFactory(new ProjectExplorer::DeployConfigurationFactory(this))
+{
+    setDisplayName(defaultDisplayName());
+    setIcon(QIcon(":/projectexplorer/images/SymbianEmulator.png"));
+}
+
+Qt4SimulatorTarget::~Qt4SimulatorTarget()
+{
+}
+
+QString Qt4SimulatorTarget::defaultDisplayName()
+{
+    return QApplication::translate("Qt4ProjectManager::Qt4Target", "Qt Simulator", "Qt4 Simulator target display name");
+}
+
+Qt4BuildConfigurationFactory *Qt4SimulatorTarget::buildConfigurationFactory() const
+{
+    return m_buildConfigurationFactory;
+}
+
+ProjectExplorer::DeployConfigurationFactory *Qt4SimulatorTarget::deployConfigurationFactory() const
+{
+    return m_deployConfigurationFactory;
+}
+
+void Qt4SimulatorTarget::createApplicationProFiles()
+{
+    removeUnconfiguredCustomExectutableRunConfigurations();
+
+    // We use the list twice
+    QList<Qt4ProFileNode *> profiles = qt4Project()->applicationProFiles();
+    QSet<QString> paths;
+    foreach (Qt4ProFileNode *pro, profiles)
+        paths << pro->path();
+
+    foreach (ProjectExplorer::RunConfiguration *rc, runConfigurations())
+        if (Qt4RunConfiguration *qt4rc = qobject_cast<Qt4RunConfiguration *>(rc))
+            paths.remove(qt4rc->proFilePath());
+
+    // Only add new runconfigurations if there are none.
+    foreach (const QString &path, paths)
+        addRunConfiguration(new Qt4RunConfiguration(this, path));
+
+    // Oh still none? Add a custom executable runconfiguration
+    if (runConfigurations().isEmpty()) {
+        addRunConfiguration(new ProjectExplorer::CustomExecutableRunConfiguration(this));
+    }
+}
diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortarget.h b/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortarget.h
new file mode 100644
index 0000000000000000000000000000000000000000..c9b6858a7ac3c6ab9f162f418819c211d9bc391e
--- /dev/null
+++ b/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortarget.h
@@ -0,0 +1,64 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, 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.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#ifndef QT4SIMULATORTARGET_H
+#define QT4SIMULATORTARGET_H
+
+#include "qt4target.h"
+
+namespace Qt4ProjectManager {
+
+class Qt4Project;
+
+namespace Internal {
+
+class Qt4SimulatorTarget : public Qt4BaseTarget
+{
+    friend class Qt4SimulatorTargetFactory;
+    Q_OBJECT
+public:
+    explicit Qt4SimulatorTarget(Qt4Project *parent, const QString &id);
+    virtual ~Qt4SimulatorTarget();
+
+    Internal::Qt4BuildConfigurationFactory *buildConfigurationFactory() const;
+    ProjectExplorer::DeployConfigurationFactory *deployConfigurationFactory() const;
+
+    void createApplicationProFiles();
+
+    static QString defaultDisplayName();
+
+private:
+    Internal::Qt4BuildConfigurationFactory *m_buildConfigurationFactory;
+    ProjectExplorer::DeployConfigurationFactory *m_deployConfigurationFactory;
+};
+
+} // namespace Internal
+} // namespace Qt4ProjectManager
+
+#endif // QT4SIMULATORTARGET_H
diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.cpp b/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..0ce2888dca5d2f1394782d1e73d7c2bc191e0fa8
--- /dev/null
+++ b/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.cpp
@@ -0,0 +1,178 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, 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.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#include "qt4simulatortargetfactory.h"
+#include "qt4projectmanagerconstants.h"
+#include "qt4project.h"
+#include "qt4runconfiguration.h"
+#include "qt4simulatortarget.h"
+
+#include <projectexplorer/deployconfiguration.h>
+#include <projectexplorer/projectexplorerconstants.h>
+#include <projectexplorer/customexecutablerunconfiguration.h>
+
+#include <QtGui/QApplication>
+#include <QtGui/QStyle>
+
+using namespace Qt4ProjectManager;
+using namespace Qt4ProjectManager::Internal;
+using ProjectExplorer::idFromMap;
+
+// -------------------------------------------------------------------------
+// Qt4SimulatorTargetFactory
+// -------------------------------------------------------------------------
+
+Qt4SimulatorTargetFactory::Qt4SimulatorTargetFactory(QObject *parent) :
+    Qt4BaseTargetFactory(parent)
+{
+    connect(QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>)),
+            this, SIGNAL(supportedTargetIdsChanged()));
+}
+
+Qt4SimulatorTargetFactory::~Qt4SimulatorTargetFactory()
+{
+}
+
+bool Qt4SimulatorTargetFactory::supportsTargetId(const QString &id) const
+{
+    return id == QLatin1String(Constants::QT_SIMULATOR_TARGET_ID);
+}
+
+QStringList Qt4SimulatorTargetFactory::supportedTargetIds(ProjectExplorer::Project *parent) const
+{
+    if (!qobject_cast<Qt4Project *>(parent))
+        return QStringList();
+    if (!QtVersionManager::instance()->supportsTargetId(Constants::QT_SIMULATOR_TARGET_ID))
+        return QStringList();
+    return QStringList() << QLatin1String(Constants::QT_SIMULATOR_TARGET_ID);
+}
+
+QString Qt4SimulatorTargetFactory::displayNameForId(const QString &id) const
+{
+    if (id == QLatin1String(Constants::QT_SIMULATOR_TARGET_ID))
+        return Qt4SimulatorTarget::defaultDisplayName();
+    return QString();
+}
+
+bool Qt4SimulatorTargetFactory::canCreate(ProjectExplorer::Project *parent, const QString &id) const
+{
+    if (!qobject_cast<Qt4Project *>(parent))
+        return false;
+    return supportsTargetId(id);
+}
+
+bool Qt4SimulatorTargetFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const
+{
+    return canCreate(parent, idFromMap(map));
+}
+
+Qt4BaseTarget *Qt4SimulatorTargetFactory::restore(ProjectExplorer::Project *parent, const QVariantMap &map)
+{
+    if (!canRestore(parent, map))
+        return 0;
+
+    Qt4Project *qt4project = static_cast<Qt4Project *>(parent);
+    Qt4SimulatorTarget *target = new Qt4SimulatorTarget(qt4project, QLatin1String("transient ID"));
+    if (target->fromMap(map))
+        return target;
+    delete target;
+    return 0;
+}
+
+QString Qt4SimulatorTargetFactory::defaultShadowBuildDirectory(const QString &projectLocation, const QString &id)
+{
+    if (id != QLatin1String(Constants::QT_SIMULATOR_TARGET_ID))
+        return QString();
+
+    // currently we can't have the build directory to be deeper than the source directory
+    // since that is broken in qmake
+    // Once qmake is fixed we can change that to have a top directory and
+    // subdirectories per build. (Replacing "QChar('-')" with "QChar('/') )
+    return projectLocation + QLatin1String("-simulator");
+}
+
+QList<BuildConfigurationInfo> Qt4SimulatorTargetFactory::availableBuildConfigurations(const QString &proFilePath)
+{
+    QList<BuildConfigurationInfo> infos;
+    QList<QtVersion *> knownVersions = QtVersionManager::instance()->versionsForTargetId(Constants::QT_SIMULATOR_TARGET_ID);
+
+    foreach (QtVersion *version, knownVersions) {
+        bool buildAll = version->defaultBuildConfig() & QtVersion::BuildAll;
+        QtVersion::QmakeBuildConfigs config = buildAll ? QtVersion::BuildAll : QtVersion::QmakeBuildConfig(0);
+        QString dir = defaultShadowBuildDirectory(Qt4Project::defaultTopLevelBuildDirectory(proFilePath), Constants::QT_SIMULATOR_TARGET_ID);
+        infos.append(BuildConfigurationInfo(version, config, QString(), dir));
+        infos.append(BuildConfigurationInfo(version, config | QtVersion::DebugBuild, QString(), dir));
+    }
+    return infos;
+}
+
+Qt4BaseTarget *Qt4SimulatorTargetFactory::create(ProjectExplorer::Project *parent, const QString &id)
+{
+    if (!canCreate(parent, id))
+        return 0;
+
+    QList<QtVersion *> knownVersions = QtVersionManager::instance()->versionsForTargetId(id);
+    if (knownVersions.isEmpty())
+        return 0;
+
+    QtVersion *qtVersion = knownVersions.first();
+    bool buildAll = qtVersion->isValid() && (qtVersion->defaultBuildConfig() & QtVersion::BuildAll);
+    QtVersion::QmakeBuildConfigs config = buildAll ? QtVersion::BuildAll : QtVersion::QmakeBuildConfig(0);
+
+    QList<BuildConfigurationInfo> infos;
+    infos.append(BuildConfigurationInfo(qtVersion, config | QtVersion::DebugBuild, QString(), QString()));
+    infos.append(BuildConfigurationInfo(qtVersion, config, QString(), QString()));
+
+    return create(parent, id, infos);
+}
+
+Qt4BaseTarget *Qt4SimulatorTargetFactory::create(ProjectExplorer::Project *parent, const QString &id, QList<BuildConfigurationInfo> infos)
+{
+    if (!canCreate(parent, id))
+        return 0;
+    Qt4SimulatorTarget *t = new Qt4SimulatorTarget(static_cast<Qt4Project *>(parent), id);
+
+    foreach (const BuildConfigurationInfo &info, infos) {
+        QString displayName = info.version->displayName() + QLatin1Char(' ');
+        displayName += (info.buildConfig & QtVersion::DebugBuild) ? tr("Debug") : tr("Release");
+        t->addQt4BuildConfiguration(displayName,
+                                    info.version,
+                                    info.buildConfig,
+                                    info.additionalArguments,
+                                    info.directory);
+    }
+
+    t->addDeployConfiguration(t->deployConfigurationFactory()->create(t, ProjectExplorer::Constants::DEFAULT_DEPLOYCONFIGURATION_ID));
+
+    t->createApplicationProFiles();
+
+    if (t->runConfigurations().isEmpty())
+        t->addRunConfiguration(new ProjectExplorer::CustomExecutableRunConfiguration(t));
+    return t;
+}
diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.h b/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.h
new file mode 100644
index 0000000000000000000000000000000000000000..9b2df9d12b7a0b6eddbe487ef2ff33939863613d
--- /dev/null
+++ b/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.h
@@ -0,0 +1,64 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, 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.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#ifndef QT4SIMULATORTARGETFACTORY_H
+#define QT4SIMULATORTARGETFACTORY_H
+#include "qt4target.h"
+
+namespace Qt4ProjectManager {
+namespace Internal {
+
+class Qt4SimulatorTargetFactory : public Qt4BaseTargetFactory
+{
+    Q_OBJECT
+public:
+    Qt4SimulatorTargetFactory(QObject *parent = 0);
+    ~Qt4SimulatorTargetFactory();
+
+    bool supportsTargetId(const QString &id);
+
+    QStringList supportedTargetIds(ProjectExplorer::Project *parent) const;
+    QString displayNameForId(const QString &id) const;
+
+    bool canCreate(ProjectExplorer::Project *parent, const QString &id) const;
+    bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const;
+    Qt4ProjectManager::Qt4BaseTarget *restore(ProjectExplorer::Project *parent, const QVariantMap &map);
+    QString defaultShadowBuildDirectory(const QString &projectLocation, const QString &id);
+
+    virtual bool supportsTargetId(const QString &id) const;
+
+    QList<BuildConfigurationInfo> availableBuildConfigurations(const QString &proFilePath);
+    Qt4BaseTarget *create(ProjectExplorer::Project *parent, const QString &id);
+    Qt4BaseTarget *create(ProjectExplorer::Project *parent, const QString &id, QList<BuildConfigurationInfo> infos);
+};
+
+}
+}
+
+#endif // QT4SIMULATORTARGETFACTORY_H
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemodeployablelistmodel.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemodeployablelistmodel.cpp
index 073949e2eae75fd680b49af125072ddfbaba449e..320ba3669aa59e4e0abf725bc7a43d6f064d1b80 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemodeployablelistmodel.cpp
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemodeployablelistmodel.cpp
@@ -34,6 +34,7 @@
 #include "maemodeployablelistmodel.h"
 
 #include "maemoglobal.h"
+#include "qt4maemotarget.h"
 
 #include <projectexplorer/projectexplorer.h>
 #include <projectexplorer/session.h>
@@ -340,8 +341,8 @@ const QtVersion *MaemoDeployableListModel::qtVersion() const
     const ProjectExplorer::Project *const activeProject
         = ProjectExplorer::ProjectExplorerPlugin::instance()->session()->startupProject();
     QTC_ASSERT(activeProject, return 0);
-    const Qt4Target *const activeTarget
-        = qobject_cast<Qt4Target *>(activeProject->activeTarget());
+    const Qt4MaemoTarget *const activeTarget
+        = qobject_cast<Qt4MaemoTarget *>(activeProject->activeTarget());
     QTC_ASSERT(activeTarget, return 0);
     const Qt4BuildConfiguration *const bc
         = activeTarget->activeBuildConfiguration();
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemodeployables.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemodeployables.cpp
index f25b4b90cc281cc49e64d71573b1f281f28ff1a6..b664e9ea4e51e65321d52bf96ee1015e151c08d5 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemodeployables.cpp
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemodeployables.cpp
@@ -42,20 +42,20 @@
 #include "maemodeployables.h"
 
 #include "maemoprofilesupdatedialog.h"
+#include "qt4maemotarget.h"
 
 #include <profileevaluator.h>
 #include <projectexplorer/buildstep.h>
 #include <qt4projectmanager/qt4projectmanagerconstants.h>
 #include <qt4projectmanager/qt4buildconfiguration.h>
 #include <qt4projectmanager/qt4project.h>
-#include <qt4projectmanager/qt4target.h>
 
 #include <QtCore/QTimer>
 
 namespace Qt4ProjectManager {
 namespace Internal {
 
-MaemoDeployables::MaemoDeployables(const Qt4Target *target)
+MaemoDeployables::MaemoDeployables(const Qt4MaemoTarget *target)
     : m_target(target), m_updateTimer(new QTimer(this))
 {
     QTimer::singleShot(0, this, SLOT(init()));
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemodeployables.h b/src/plugins/qt4projectmanager/qt-maemo/maemodeployables.h
index 8f0712ac1a8bafcb22230fd4f0c69f2315c02879..df7e676e77cb3831d04dbc6d12124a477bf96eb9 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemodeployables.h
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemodeployables.h
@@ -53,16 +53,16 @@ QT_FORWARD_DECLARE_CLASS(QTimer)
 
 namespace Qt4ProjectManager {
 class Qt4BuildConfiguration;
-class Qt4Target;
 
 namespace Internal {
 class Qt4ProFileNode;
+class Qt4MaemoTarget;
 
 class MaemoDeployables : public QAbstractListModel
 {
     Q_OBJECT
 public:
-    MaemoDeployables(const Qt4Target *target);
+    MaemoDeployables(const Qt4MaemoTarget *target);
     ~MaemoDeployables();
     void setUnmodified();
     bool isModified() const;
@@ -84,7 +84,7 @@ private:
 
     QList<MaemoDeployableListModel *> m_listModels;
     UpdateSettingsMap m_updateSettings;
-    const Qt4Target * const m_target;
+    const Qt4MaemoTarget * const m_target;
     QTimer *const m_updateTimer;
 };
 
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemodeploystep.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemodeploystep.cpp
index 104ce44bacee89875c8d8cbf4c6db33e0021705b..3db09d24956067e4926895ae8e8cd30fde3fdfaa 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemodeploystep.cpp
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemodeploystep.cpp
@@ -41,6 +41,7 @@
 #include "maemorunconfiguration.h"
 #include "maemotoolchain.h"
 #include "maemousedportsgatherer.h"
+#include "qt4maemotarget.h"
 
 #include <coreplugin/ssh/sftpchannel.h>
 #include <coreplugin/ssh/sshconnection.h>
@@ -96,7 +97,7 @@ void MaemoDeployStep::ctor()
     const QList<DeployConfiguration *> &deployConfigs
         = target()->deployConfigurations();
     if (deployConfigs.isEmpty()) {
-        const Qt4Target * const qt4Target = qobject_cast<Qt4Target *>(target());
+        const Qt4MaemoTarget * const qt4Target = qobject_cast<Qt4MaemoTarget *>(target());
         Q_ASSERT(qt4Target);
         m_deployables = QSharedPointer<MaemoDeployables>(new MaemoDeployables(qt4Target));
     } else {
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemomanager.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemomanager.cpp
index bf2107e3f0309a016ec018b2b039bd6b3ecc80d0..32f118a93f128a5b9601b930c22e5f1177bff4a8 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemomanager.cpp
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemomanager.cpp
@@ -44,6 +44,7 @@
 #include "maemosettingspages.h"
 #include "maemotemplatesmanager.h"
 #include "maemotoolchain.h"
+#include "qt4maemotargetfactory.h"
 
 #include <extensionsystem/pluginmanager.h>
 #include <qt4projectmanager/qtversionmanager.h>
@@ -69,6 +70,7 @@ MaemoManager::MaemoManager()
     , m_deviceConfigurationsSettingsPage(new MaemoDeviceConfigurationsSettingsPage(this))
     , m_qemuSettingsPage(new MaemoQemuSettingsPage(this))
     , m_publishingFactoryFremantleFree(new MaemoPublishingWizardFactoryFremantleFree(this))
+    , m_maemoTargetFactory(new Qt4MaemoTargetFactory(this))
 {
     Q_ASSERT(!m_instance);
 
@@ -85,6 +87,7 @@ MaemoManager::MaemoManager()
     pluginManager->addObject(m_deviceConfigurationsSettingsPage);
     pluginManager->addObject(m_qemuSettingsPage);
     pluginManager->addObject(m_publishingFactoryFremantleFree);
+    pluginManager->addObject(m_maemoTargetFactory);
 }
 
 MaemoManager::~MaemoManager()
@@ -98,6 +101,7 @@ MaemoManager::~MaemoManager()
     pluginManager->removeObject(m_deviceConfigurationsSettingsPage);
     pluginManager->removeObject(m_qemuSettingsPage);
     pluginManager->removeObject(m_publishingFactoryFremantleFree);
+    pluginManager->removeObject(m_maemoTargetFactory);
 
     m_instance = 0;
 }
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemomanager.h b/src/plugins/qt4projectmanager/qt-maemo/maemomanager.h
index d3730b4df6681e74b1c8427ce8ece5d9ce1c6fa5..d8af50191aa03224dc628e48f90d7e74efc219cc 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemomanager.h
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemomanager.h
@@ -53,6 +53,7 @@ class MaemoRunConfigurationFactory;
 class MaemoDeviceConfigurationsSettingsPage;
 class MaemoQemuManager;
 class MaemoQemuSettingsPage;
+class Qt4MaemoTargetFactory;
 
 class MaemoManager : public QObject
 {
@@ -80,6 +81,7 @@ private:
     MaemoQemuSettingsPage *m_qemuSettingsPage;
     MaemoQemuManager *m_qemuRuntimeManager;
     MaemoPublishingWizardFactoryFremantleFree *m_publishingFactoryFremantleFree;
+    Qt4MaemoTargetFactory *m_maemoTargetFactory;
 };
 
     } // namespace Internal
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemoqemumanager.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemoqemumanager.cpp
index 4691c5db4d911a94b82e608066005c841d4245e2..22e7894982b1242c1b50e3cc822923857c053a9f 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemoqemumanager.cpp
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemoqemumanager.cpp
@@ -41,6 +41,7 @@
 #include "qtversionmanager.h"
 #include "qt4project.h"
 #include "qt4projectmanagerconstants.h"
+#include "qt4maemotarget.h"
 
 #include <coreplugin/actionmanager/actionmanager.h>
 #include <coreplugin/actionmanager/command.h>
@@ -506,7 +507,7 @@ void MaemoQemuManager::toggleStarterButton(Target *target)
 {
     int uniqueId = -1;
     if (target) {
-        if (Qt4Target *qt4Target = qobject_cast<Qt4Target*>(target)) {
+        if (Qt4MaemoTarget *qt4Target = qobject_cast<Qt4MaemoTarget*>(target)) {
             if (Qt4BuildConfiguration *bc = qt4Target->activeBuildConfiguration()) {
                 if (QtVersion *version = bc->qtVersion())
                     uniqueId = version->uniqueId();
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp
index 2e6c7e62e5621e6a6fc8054b3a9b09f3df763fa9..2f893175c8736b3d694ee2f9590a889c149b75b7 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp
@@ -40,6 +40,7 @@
 #include "maemoremotemountsmodel.h"
 #include "maemorunconfigurationwidget.h"
 #include "maemotoolchain.h"
+#include "qt4maemotarget.h"
 #include "qtoutputformatter.h"
 
 #include <coreplugin/icore.h>
@@ -65,7 +66,7 @@ const bool DefaultUseRemoteGdbValue = false;
 
 using namespace ProjectExplorer;
 
-MaemoRunConfiguration::MaemoRunConfiguration(Qt4Target *parent,
+MaemoRunConfiguration::MaemoRunConfiguration(Qt4BaseTarget *parent,
         const QString &proFilePath)
     : RunConfiguration(parent, QLatin1String(MAEMO_RC_ID))
     , m_proFilePath(proFilePath)
@@ -76,7 +77,7 @@ MaemoRunConfiguration::MaemoRunConfiguration(Qt4Target *parent,
     init();
 }
 
-MaemoRunConfiguration::MaemoRunConfiguration(Qt4Target *parent,
+MaemoRunConfiguration::MaemoRunConfiguration(Qt4BaseTarget *parent,
         MaemoRunConfiguration *source)
     : RunConfiguration(parent, source)
     , m_proFilePath(source->m_proFilePath)
@@ -114,9 +115,9 @@ MaemoRunConfiguration::~MaemoRunConfiguration()
 {
 }
 
-Qt4Target *MaemoRunConfiguration::qt4Target() const
+Qt4MaemoTarget *MaemoRunConfiguration::qt4Target() const
 {
-    return static_cast<Qt4Target *>(target());
+    return static_cast<Qt4MaemoTarget *>(target());
 }
 
 Qt4BuildConfiguration *MaemoRunConfiguration::activeQt4BuildConfiguration() const
@@ -443,5 +444,10 @@ void MaemoRunConfiguration::setSystemEnvironment(const Utils::Environment &envir
     }
 }
 
+QString MaemoRunConfiguration::proFilePath() const
+{
+    return m_proFilePath;
+}
+
 } // namespace Internal
 } // namespace Qt4ProjectManager
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.h b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.h
index e05f58168449cc06c3419edfc8aab66a40fa4432..4f112718471610d352691a1873e7db0a429c4ea3 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.h
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.h
@@ -51,11 +51,12 @@ namespace Qt4ProjectManager {
 
 class Qt4BuildConfiguration;
 class Qt4Project;
-class Qt4Target;
+class Qt4BaseTarget;
 
 namespace Internal {
 
 class Qt4ProFileNode;
+class Qt4MaemoTarget;
 
 class MaemoDeviceConfigListModel;
 class MaemoDeployStep;
@@ -77,14 +78,14 @@ public:
 
     enum DebuggingType { DebugCppOnly, DebugQmlOnly, DebugCppAndQml };
 
-    MaemoRunConfiguration(Qt4Target *parent, const QString &proFilePath);
+    MaemoRunConfiguration(Qt4BaseTarget *parent, const QString &proFilePath);
     virtual ~MaemoRunConfiguration();
 
     using ProjectExplorer::RunConfiguration::isEnabled;
     bool isEnabled(ProjectExplorer::BuildConfiguration *config) const;
     QWidget *createConfigurationWidget();
     ProjectExplorer::OutputFormatter *createOutputFormatter() const;
-    Qt4Target *qt4Target() const;
+    Qt4MaemoTarget *qt4Target() const;
     Qt4BuildConfiguration *activeQt4BuildConfiguration() const;
 
     MaemoDeployStep *deployStep() const;
@@ -126,6 +127,8 @@ public:
 
     int portsUsedByDebuggers() const;
 
+    QString proFilePath() const;
+
 signals:
     void deviceConfigurationChanged(ProjectExplorer::Target *target);
     void targetInformationChanged() const;
@@ -135,7 +138,7 @@ signals:
     void userEnvironmentChangesChanged(const QList<Utils::EnvironmentItem> &diff);
 
 protected:
-    MaemoRunConfiguration(Qt4Target *parent, MaemoRunConfiguration *source);
+    MaemoRunConfiguration(Qt4BaseTarget *parent, MaemoRunConfiguration *source);
     virtual bool fromMap(const QVariantMap &map);
     QString defaultDisplayName();
 
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfigurationwidget.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfigurationwidget.cpp
index 5bec1d09c9b06d36746f117cfc0e5280c585f3cc..3c8d04696b53993b0393b268f86bfdc755a8f417 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfigurationwidget.cpp
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfigurationwidget.cpp
@@ -42,6 +42,7 @@
 #include "maemoremotemountsmodel.h"
 #include "maemorunconfiguration.h"
 #include "maemosettingspages.h"
+#include "qt4maemotarget.h"
 
 #include <coreplugin/coreconstants.h>
 #include <coreplugin/icore.h>
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemorunfactories.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemorunfactories.cpp
index 5ab079c1aaf19584bdc2c942d0b7064c38e30177..f0e4f2745d193f284d625e6ecfc6554f1ffe6af8 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemorunfactories.cpp
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemorunfactories.cpp
@@ -40,6 +40,8 @@
 #include "maemoremotemountsmodel.h"
 #include "maemorunconfiguration.h"
 #include "maemoruncontrol.h"
+#include "maemotoolchain.h"
+#include "qt4maemotarget.h"
 
 #include <projectexplorer/projectexplorerconstants.h>
 #include <debugger/debuggerconstants.h>
@@ -74,7 +76,7 @@ MaemoRunConfigurationFactory::~MaemoRunConfigurationFactory()
 bool MaemoRunConfigurationFactory::canCreate(Target *parent,
     const QString &id) const
 {
-    Qt4Target *target = qobject_cast<Qt4Target *>(parent);
+    Qt4MaemoTarget *target = qobject_cast<Qt4MaemoTarget *>(parent);
     if (!target
         || target->id() != QLatin1String(Constants::MAEMO_DEVICE_TARGET_ID)) {
         return false;
@@ -85,7 +87,7 @@ bool MaemoRunConfigurationFactory::canCreate(Target *parent,
 bool MaemoRunConfigurationFactory::canRestore(Target *parent,
     const QVariantMap &map) const
 {
-    if (!qobject_cast<Qt4Target *>(parent))
+    if (!qobject_cast<Qt4MaemoTarget *>(parent))
         return false;
     return ProjectExplorer::idFromMap(map)
         .startsWith(QLatin1String(MAEMO_RC_ID));
@@ -99,7 +101,7 @@ bool MaemoRunConfigurationFactory::canClone(Target *parent,
 
 QStringList MaemoRunConfigurationFactory::availableCreationIds(Target *parent) const
 {
-    if (Qt4Target *t = qobject_cast<Qt4Target *>(parent)) {
+    if (Qt4MaemoTarget *t = qobject_cast<Qt4MaemoTarget *>(parent)) {
         if (t->id() == QLatin1String(Constants::MAEMO_DEVICE_TARGET_ID)) {
             return t->qt4Project()->
                 applicationProFilePathes(QLatin1String(MAEMO_RC_ID_PREFIX));
@@ -118,7 +120,7 @@ RunConfiguration *MaemoRunConfigurationFactory::create(Target *parent,
 {
     if (!canCreate(parent, id))
         return 0;
-    Qt4Target *pqt4parent = static_cast<Qt4Target *>(parent);
+    Qt4MaemoTarget *pqt4parent = static_cast<Qt4MaemoTarget *>(parent);
     return new MaemoRunConfiguration(pqt4parent, pathFromId(id));
 
 }
@@ -128,7 +130,7 @@ RunConfiguration *MaemoRunConfigurationFactory::restore(Target *parent,
 {
     if (!canRestore(parent, map))
         return 0;
-    Qt4Target *target = static_cast<Qt4Target *>(parent);
+    Qt4MaemoTarget *target = static_cast<Qt4MaemoTarget *>(parent);
     MaemoRunConfiguration *rc = new MaemoRunConfiguration(target, QString());
     if (rc->fromMap(map))
         return rc;
@@ -144,7 +146,7 @@ RunConfiguration *MaemoRunConfigurationFactory::clone(Target *parent,
         return 0;
 
     MaemoRunConfiguration *old = static_cast<MaemoRunConfiguration *>(source);
-    return new MaemoRunConfiguration(static_cast<Qt4Target *>(parent), old);
+    return new MaemoRunConfiguration(static_cast<Qt4MaemoTarget *>(parent), old);
 }
 
 // #pragma mark -- MaemoRunControlFactory
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemotemplatesmanager.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemotemplatesmanager.cpp
index 205dedd5ebefc9b1e58a739b0c46680edf2f39e4..a9bd9f8b454e8e671039ef39ccc16ca5c07a759d 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemotemplatesmanager.cpp
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemotemplatesmanager.cpp
@@ -38,6 +38,7 @@
 #include "maemodeploystep.h"
 #include "maemoglobal.h"
 #include "maemopackagecreationstep.h"
+#include "qt4maemotarget.h"
 
 #include <projectexplorer/project.h>
 #include <projectexplorer/projectexplorer.h>
@@ -119,7 +120,7 @@ bool MaemoTemplatesManager::handleTarget(ProjectExplorer::Target *target)
     if (!createDebianTemplatesIfNecessary(target))
         return false;
 
-    const Qt4Target * const qt4Target = qobject_cast<Qt4Target *>(target);
+    const Qt4MaemoTarget * const qt4Target = qobject_cast<Qt4MaemoTarget *>(target);
     const MaemoDeployStep * const deployStep
         = MaemoGlobal::buildStep<MaemoDeployStep>(qt4Target->activeDeployConfiguration());
     connect(deployStep->deployables().data(), SIGNAL(modelReset()), this,
@@ -186,7 +187,7 @@ bool MaemoTemplatesManager::createDebianTemplatesIfNecessary(const ProjectExplor
 
     QProcess dh_makeProc;
     QString error;
-    const Qt4Target * const qt4Target = qobject_cast<const Qt4Target *>(target);
+    const Qt4MaemoTarget * const qt4Target = qobject_cast<const Qt4MaemoTarget *>(target);
     Q_ASSERT_X(qt4Target, Q_FUNC_INFO, "Target ID does not match actual type.");
     const Qt4BuildConfiguration * const bc
         = qt4Target->activeBuildConfiguration();
@@ -339,9 +340,9 @@ bool MaemoTemplatesManager::adaptControlFileField(QByteArray &document,
     return updated;
 }
 
-bool MaemoTemplatesManager::updateDesktopFiles(const Qt4Target *target)
+bool MaemoTemplatesManager::updateDesktopFiles(const Qt4MaemoTarget *target)
 {
-    const Qt4Target * const qt4Target = qobject_cast<const Qt4Target *>(target);
+    const Qt4MaemoTarget * const qt4Target = qobject_cast<const Qt4MaemoTarget *>(target);
     Q_ASSERT_X(qt4Target, Q_FUNC_INFO,
         "Impossible: Target has Maemo id, but could not be cast to Qt4Target.");
     const QList<Qt4ProFileNode *> &applicationProjects
@@ -352,7 +353,7 @@ bool MaemoTemplatesManager::updateDesktopFiles(const Qt4Target *target)
     return success;
 }
 
-bool MaemoTemplatesManager::updateDesktopFile(const Qt4Target *target,
+bool MaemoTemplatesManager::updateDesktopFile(const Qt4MaemoTarget *target,
     Qt4ProFileNode *proFileNode)
 {
     const QString appName = proFileNode->targetInformation().target;
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemotemplatesmanager.h b/src/plugins/qt4projectmanager/qt-maemo/maemotemplatesmanager.h
index 0e81f8888b3d6d4a720c85a974e942ebabb2f0d8..8751b70334e7dc86df320e4ef4940474994185b7 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemotemplatesmanager.h
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemotemplatesmanager.h
@@ -50,10 +50,10 @@ class Target;
 
 namespace Qt4ProjectManager {
 class Qt4Project;
-class Qt4Target;
 
 namespace Internal {
 class Qt4ProFileNode;
+class Qt4MaemoTarget;
 
 class MaemoTemplatesManager : public QObject
 {
@@ -103,8 +103,8 @@ private:
     QString changeLogFilePath(const ProjectExplorer::Project *project) const;
     QString controlFilePath(const ProjectExplorer::Project *project) const;
     bool createDebianTemplatesIfNecessary(const ProjectExplorer::Target *target);
-    bool updateDesktopFiles(const Qt4Target *target);
-    bool updateDesktopFile(const Qt4Target *target,
+    bool updateDesktopFiles(const Qt4MaemoTarget *target);
+    bool updateDesktopFile(const Qt4MaemoTarget *target,
         Qt4ProFileNode *proFileNode);
     ProjectExplorer::Project *findProject(const QFileSystemWatcher *fsWatcher) const;
     void findLine(const QByteArray &string, QByteArray &document,
diff --git a/src/plugins/qt4projectmanager/qt-maemo/qt-maemo.pri b/src/plugins/qt4projectmanager/qt-maemo/qt-maemo.pri
index 19bfd7786526543344fdec5e2a89284f4441b597..26087aa920e0712f62bf82b57e601a573b0907af 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/qt-maemo.pri
+++ b/src/plugins/qt4projectmanager/qt-maemo/qt-maemo.pri
@@ -44,7 +44,10 @@ HEADERS += \
     $$PWD/maemoqemuruntime.h \
     $$PWD/maemoqemuruntimeparser.h \
     $$PWD/maemoqemusettingswidget.h \
-    $$PWD/maemoqemusettings.h
+    $$PWD/maemoqemusettings.h \
+    $$PWD/qt4maemotargetfactory.h \
+    $$PWD/qt4maemotarget.h \
+    $$PWD/qt4maemodeployconfiguration.h
 
 SOURCES += \
     $$PWD/maemoconfigtestdialog.cpp \
@@ -89,7 +92,10 @@ SOURCES += \
     $$PWD/maemopublisherfremantlefree.cpp \
     $$PWD/maemoqemuruntimeparser.cpp \
     $$PWD/maemoqemusettingswidget.cpp \
-    $$PWD/maemoqemusettings.cpp
+    $$PWD/maemoqemusettings.cpp \
+    $$PWD/qt4maemotargetfactory.cpp \
+    $$PWD/qt4maemotarget.cpp \
+    $$PWD/qt4maemodeployconfiguration.cpp
 
 FORMS += \
     $$PWD/maemoconfigtestdialog.ui \
diff --git a/src/plugins/qt4projectmanager/qt-maemo/qt4maemodeployconfiguration.cpp b/src/plugins/qt4projectmanager/qt-maemo/qt4maemodeployconfiguration.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..4b70bff1a7126637e47649423287402e5775af1d
--- /dev/null
+++ b/src/plugins/qt4projectmanager/qt-maemo/qt4maemodeployconfiguration.cpp
@@ -0,0 +1,57 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, 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.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+
+#include "maemodeploystep.h"
+#include "maemopackagecreationstep.h"
+#include "qt4maemodeployconfiguration.h"
+
+#include <projectexplorer/buildsteplist.h>
+#include <projectexplorer/target.h>
+
+using namespace Qt4ProjectManager;
+using namespace Qt4ProjectManager::Internal;
+
+Qt4MaemoDeployConfigurationFactory::Qt4MaemoDeployConfigurationFactory(QObject *parent) :
+    ProjectExplorer::DeployConfigurationFactory(parent)
+{ }
+
+ProjectExplorer::DeployConfiguration *Qt4MaemoDeployConfigurationFactory::create(ProjectExplorer::Target *parent, const QString &id)
+{
+    ProjectExplorer::DeployConfiguration *dc = ProjectExplorer::DeployConfigurationFactory::create(parent, id);
+
+    if (!dc)
+        return 0;
+
+    dc->setDefaultDisplayName(tr("Deploy to Maemo device"));
+    dc->stepList()->insertStep(0, new MaemoPackageCreationStep(dc->stepList()));
+    dc->stepList()->insertStep(1, new MaemoDeployStep(dc->stepList()));
+
+    return dc;
+}
diff --git a/src/plugins/qt4projectmanager/qt-maemo/qt4maemodeployconfiguration.h b/src/plugins/qt4projectmanager/qt-maemo/qt4maemodeployconfiguration.h
new file mode 100644
index 0000000000000000000000000000000000000000..69827256797d8e05e167cc144336d3f08888ef94
--- /dev/null
+++ b/src/plugins/qt4projectmanager/qt-maemo/qt4maemodeployconfiguration.h
@@ -0,0 +1,53 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, 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.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#ifndef QT4PROJECTMANAGER_QT4DEPLOYCONFIGURATION_H
+#define QT4PROJECTMANAGER_QT4DEPLOYCONFIGURATION_H
+
+#include <projectexplorer/deployconfiguration.h>
+
+namespace Qt4ProjectManager {
+namespace Internal {
+
+class Target;
+
+class Qt4MaemoDeployConfigurationFactory : public ProjectExplorer::DeployConfigurationFactory
+{
+    Q_OBJECT
+
+public:
+    explicit Qt4MaemoDeployConfigurationFactory(QObject *parent = 0);
+
+    ProjectExplorer::DeployConfiguration *create(ProjectExplorer::Target *parent, const QString &id);
+};
+
+} // namespace Internal
+} // namespace Qt4ProjectManager
+
+#endif // QT4PROJECTMANAGER_QT4DEPLOYCONFIGURATION_H
diff --git a/src/plugins/qt4projectmanager/qt-maemo/qt4maemotarget.cpp b/src/plugins/qt4projectmanager/qt-maemo/qt4maemotarget.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..bad562040a8078f8d8336ecfe4fdf6a42e0c7e7c
--- /dev/null
+++ b/src/plugins/qt4projectmanager/qt-maemo/qt4maemotarget.cpp
@@ -0,0 +1,102 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, 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.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+
+#include "maemorunconfiguration.h"
+#include "qt4project.h"
+#include "qt4maemotarget.h"
+#include "qt4maemodeployconfiguration.h"
+
+#include <projectexplorer/customexecutablerunconfiguration.h>
+#include <QtGui/QApplication>
+#include <QtGui/QIcon>
+
+using namespace Qt4ProjectManager;
+using namespace Qt4ProjectManager::Internal;
+
+Qt4MaemoTarget::Qt4MaemoTarget(Qt4Project *parent, const QString &id) :
+    Qt4BaseTarget(parent, id),
+    m_buildConfigurationFactory(new Qt4BuildConfigurationFactory(this)),
+    m_deployConfigurationFactory(new Qt4MaemoDeployConfigurationFactory(this))
+{
+    setDisplayName(defaultDisplayName());
+    setIcon(QIcon(":/projectexplorer/images/MaemoDevice.png"));
+}
+
+Qt4MaemoTarget::~Qt4MaemoTarget()
+{
+
+}
+
+QString Qt4MaemoTarget::defaultDisplayName()
+{
+    return QApplication::translate("Qt4ProjectManager::Qt4Target", "Maemo", "Qt4 Maemo target display name");
+}
+
+Qt4BuildConfigurationFactory *Qt4MaemoTarget::buildConfigurationFactory() const
+{
+    return m_buildConfigurationFactory;
+}
+
+ProjectExplorer::DeployConfigurationFactory *Qt4MaemoTarget::deployConfigurationFactory() const
+{
+    return m_deployConfigurationFactory;
+}
+
+QString Qt4MaemoTarget::defaultBuildDirectory() const
+{
+    //TODO why?
+#if defined(Q_OS_WIN)
+    return project()->projectDirectory();
+#endif
+    return Qt4BaseTarget::defaultBuildDirectory();
+}
+
+void Qt4MaemoTarget::createApplicationProFiles()
+{
+    removeUnconfiguredCustomExectutableRunConfigurations();
+
+    QList<Qt4ProFileNode *> profiles = qt4Project()->applicationProFiles();
+    QSet<QString> paths;
+    foreach (Qt4ProFileNode *pro, profiles)
+        paths << pro->path();
+
+    foreach (ProjectExplorer::RunConfiguration *rc, runConfigurations())
+        if (MaemoRunConfiguration *qt4rc = qobject_cast<MaemoRunConfiguration *>(rc))
+            paths.remove(qt4rc->proFilePath());
+
+    // Only add new runconfigurations if there are none.
+    foreach (const QString &path, paths)
+        addRunConfiguration(new MaemoRunConfiguration(this, path));
+
+    // Oh still none? Add a custom executable runconfiguration
+    if (runConfigurations().isEmpty()) {
+        addRunConfiguration(new ProjectExplorer::CustomExecutableRunConfiguration(this));
+    }
+}
diff --git a/src/plugins/qt4projectmanager/qt-maemo/qt4maemotarget.h b/src/plugins/qt4projectmanager/qt-maemo/qt4maemotarget.h
new file mode 100644
index 0000000000000000000000000000000000000000..d22918c033bfafdd9e6074d9063f09b02b6e494c
--- /dev/null
+++ b/src/plugins/qt4projectmanager/qt-maemo/qt4maemotarget.h
@@ -0,0 +1,64 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, 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.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#ifndef QT4MAEMOTARGET_H
+#define QT4MAEMOTARGET_H
+
+#include "qt4target.h"
+
+namespace Qt4ProjectManager {
+class Qt4Project;
+namespace Internal {
+class Qt4MaemoDeployConfigurationFactory;
+
+class Qt4MaemoTarget : public Qt4BaseTarget
+{
+    friend class Qt4MaemoTargetFactory;
+    Q_OBJECT
+public:
+    explicit Qt4MaemoTarget(Qt4Project *parent, const QString &id);
+    virtual ~Qt4MaemoTarget();
+
+    Internal::Qt4BuildConfigurationFactory *buildConfigurationFactory() const;
+    ProjectExplorer::DeployConfigurationFactory *deployConfigurationFactory() const;
+
+    QString defaultBuildDirectory() const;
+
+    void createApplicationProFiles();
+
+    static QString defaultDisplayName();
+
+private:
+    Internal::Qt4BuildConfigurationFactory *m_buildConfigurationFactory;
+    Internal::Qt4MaemoDeployConfigurationFactory *m_deployConfigurationFactory;
+};
+}
+}
+
+#endif // QT4MAEMOTARGET_H
diff --git a/src/plugins/qt4projectmanager/qt-maemo/qt4maemotargetfactory.cpp b/src/plugins/qt4projectmanager/qt-maemo/qt4maemotargetfactory.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..7e49fb506607ef5f69d5aed44a5262c848cad8ef
--- /dev/null
+++ b/src/plugins/qt4projectmanager/qt-maemo/qt4maemotargetfactory.cpp
@@ -0,0 +1,178 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, 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.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#include "qt4maemotargetfactory.h"
+#include "qt4project.h"
+#include "qt4projectmanagerconstants.h"
+#include "qt-maemo/maemodeploystep.h"
+#include "qt-maemo/maemopackagecreationstep.h"
+#include "qt-maemo/maemorunconfiguration.h"
+#include "qt-maemo/qt4maemotarget.h"
+
+#include <projectexplorer/deployconfiguration.h>
+#include <projectexplorer/projectexplorerconstants.h>
+#include <projectexplorer/customexecutablerunconfiguration.h>
+
+#include <QtGui/QApplication>
+
+using namespace Qt4ProjectManager;
+using namespace Qt4ProjectManager::Internal;
+using ProjectExplorer::idFromMap;
+
+// -------------------------------------------------------------------------
+// Qt4MaemoTargetFactory
+// -------------------------------------------------------------------------
+Qt4MaemoTargetFactory::Qt4MaemoTargetFactory(QObject *parent) :
+    Qt4BaseTargetFactory(parent)
+{
+    connect(QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>)),
+            this, SIGNAL(supportedTargetIdsChanged()));
+}
+
+Qt4MaemoTargetFactory::~Qt4MaemoTargetFactory()
+{
+}
+
+bool Qt4MaemoTargetFactory::supportsTargetId(const QString &id) const
+{
+    return id == QLatin1String(Constants::MAEMO_DEVICE_TARGET_ID);
+}
+
+QStringList Qt4MaemoTargetFactory::supportedTargetIds(ProjectExplorer::Project *parent) const
+{
+    if (!qobject_cast<Qt4Project *>(parent))
+        return QStringList();
+    if (!QtVersionManager::instance()->supportsTargetId(Constants::MAEMO_DEVICE_TARGET_ID))
+        return QStringList();
+    return QStringList() << QLatin1String(Constants::MAEMO_DEVICE_TARGET_ID);
+}
+
+QString Qt4MaemoTargetFactory::displayNameForId(const QString &id) const
+{
+    if (id == QLatin1String(Constants::MAEMO_DEVICE_TARGET_ID))
+        return Qt4MaemoTarget::defaultDisplayName();
+    return QString();
+}
+
+bool Qt4MaemoTargetFactory::canCreate(ProjectExplorer::Project *parent, const QString &id) const
+{
+    if (!qobject_cast<Qt4Project *>(parent))
+        return false;
+    return supportsTargetId(id);
+}
+
+bool Qt4MaemoTargetFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const
+{
+    return canCreate(parent, idFromMap(map));
+}
+
+Qt4BaseTarget *Qt4MaemoTargetFactory::restore(ProjectExplorer::Project *parent, const QVariantMap &map)
+{
+    if (!canRestore(parent, map))
+        return 0;
+
+    Qt4Project *qt4project = static_cast<Qt4Project *>(parent);
+    Qt4MaemoTarget *target = new Qt4MaemoTarget(qt4project, QLatin1String("transient ID"));
+
+    if (target->fromMap(map))
+        return target;
+    delete target;
+    return 0;
+}
+
+QString Qt4MaemoTargetFactory::defaultShadowBuildDirectory(const QString &projectLocation, const QString &id)
+{
+    if (id != QLatin1String(Constants::MAEMO_DEVICE_TARGET_ID))
+        return QString();
+
+    // currently we can't have the build directory to be deeper than the source directory
+    // since that is broken in qmake
+    // Once qmake is fixed we can change that to have a top directory and
+    // subdirectories per build. (Replacing "QChar('-')" with "QChar('/') )
+    return projectLocation + QLatin1String("-maemo");
+}
+
+QList<BuildConfigurationInfo> Qt4MaemoTargetFactory::availableBuildConfigurations(const QString &proFilePath)
+{
+    QList<BuildConfigurationInfo> infos;
+    QList<QtVersion *> knownVersions = QtVersionManager::instance()->versionsForTargetId(Constants::MAEMO_DEVICE_TARGET_ID);
+
+    foreach (QtVersion *version, knownVersions) {
+        bool buildAll = version->defaultBuildConfig() & QtVersion::BuildAll;
+        QtVersion::QmakeBuildConfigs config = buildAll ? QtVersion::BuildAll : QtVersion::QmakeBuildConfig(0);
+        QString dir = defaultShadowBuildDirectory(Qt4Project::defaultTopLevelBuildDirectory(proFilePath), Constants::MAEMO_DEVICE_TARGET_ID);
+        infos.append(BuildConfigurationInfo(version, config, QString(), dir));
+        infos.append(BuildConfigurationInfo(version, config | QtVersion::DebugBuild, QString(), dir));
+    }
+    return infos;
+}
+
+Qt4BaseTarget *Qt4MaemoTargetFactory::create(ProjectExplorer::Project *parent, const QString &id)
+{
+    if (!canCreate(parent, id))
+        return 0;
+
+    QList<QtVersion *> knownVersions = QtVersionManager::instance()->versionsForTargetId(id);
+    if (knownVersions.isEmpty())
+        return 0;
+
+    QtVersion *qtVersion = knownVersions.first();
+    bool buildAll = qtVersion->isValid() && (qtVersion->defaultBuildConfig() & QtVersion::BuildAll);
+    QtVersion::QmakeBuildConfigs config = buildAll ? QtVersion::BuildAll : QtVersion::QmakeBuildConfig(0);
+
+    QList<BuildConfigurationInfo> infos;
+    infos.append(BuildConfigurationInfo(qtVersion, config | QtVersion::DebugBuild, QString(), QString()));
+    infos.append(BuildConfigurationInfo(qtVersion, config, QString(), QString()));
+
+    return create(parent, id, infos);
+}
+
+Qt4BaseTarget *Qt4MaemoTargetFactory::create(ProjectExplorer::Project *parent, const QString &id, QList<BuildConfigurationInfo> infos)
+{
+    if (!canCreate(parent, id))
+        return 0;
+    Qt4MaemoTarget *t = new Qt4MaemoTarget(static_cast<Qt4Project *>(parent), id);
+    foreach (const BuildConfigurationInfo &info, infos) {
+        QString displayName = info.version->displayName() + QLatin1Char(' ');
+        displayName += (info.buildConfig & QtVersion::DebugBuild) ? tr("Debug") : tr("Release");
+        t->addQt4BuildConfiguration(displayName,
+                                    info.version,
+                                    info.buildConfig,
+                                    info.additionalArguments,
+                                    info.directory);
+    }
+
+    t->addDeployConfiguration(t->deployConfigurationFactory()->create(t, ProjectExplorer::Constants::DEFAULT_DEPLOYCONFIGURATION_ID));
+
+    t->createApplicationProFiles();
+
+    if (t->runConfigurations().isEmpty())
+        t->addRunConfiguration(new ProjectExplorer::CustomExecutableRunConfiguration(t));
+    return t;
+}
diff --git a/src/plugins/qt4projectmanager/qt-maemo/qt4maemotargetfactory.h b/src/plugins/qt4projectmanager/qt-maemo/qt4maemotargetfactory.h
new file mode 100644
index 0000000000000000000000000000000000000000..d27ce6dedacca9445c6825d92e9ddcdb0fd59c34
--- /dev/null
+++ b/src/plugins/qt4projectmanager/qt-maemo/qt4maemotargetfactory.h
@@ -0,0 +1,63 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, 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.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#ifndef QT4MAEMOTARGETFACTORY_H
+#define QT4MAEMOTARGETFACTORY_H
+
+#include "qt4target.h"
+
+namespace Qt4ProjectManager {
+namespace Internal {
+
+class Qt4MaemoTargetFactory : public Qt4BaseTargetFactory
+{
+    Q_OBJECT
+public:
+    Qt4MaemoTargetFactory(QObject *parent = 0);
+    ~Qt4MaemoTargetFactory();
+
+    QStringList supportedTargetIds(ProjectExplorer::Project *parent) const;
+    QString displayNameForId(const QString &id) const;
+
+    bool canCreate(ProjectExplorer::Project *parent, const QString &id) const;
+    bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const;
+    Qt4ProjectManager::Qt4BaseTarget *restore(ProjectExplorer::Project *parent, const QVariantMap &map);
+    QString defaultShadowBuildDirectory(const QString &projectLocation, const QString &id);
+
+    virtual bool supportsTargetId(const QString &id) const;
+
+    QList<BuildConfigurationInfo> availableBuildConfigurations(const QString &proFilePath);
+    Qt4BaseTarget *create(ProjectExplorer::Project *parent, const QString &id);
+    Qt4BaseTarget *create(ProjectExplorer::Project *parent, const QString &id, QList<BuildConfigurationInfo> infos);
+};
+
+} // namespace Internal
+} // namespace Qt4ProjectManager
+
+#endif // QT4MAEMOTARGETFACTORY_H
diff --git a/src/plugins/qt4projectmanager/qt-s60/qt-s60.pri b/src/plugins/qt4projectmanager/qt-s60/qt-s60.pri
index ed097c0ceee860a0e65de93a71b74372b9015d93..ebd09902b9d23f6c968466c6273c68b36c8260dd 100644
--- a/src/plugins/qt4projectmanager/qt-s60/qt-s60.pri
+++ b/src/plugins/qt4projectmanager/qt-s60/qt-s60.pri
@@ -25,7 +25,10 @@ SOURCES += $$PWD/s60devices.cpp \
     $$PWD/s60certificateinfo.cpp \
     $$PWD/certificatepathchooser.cpp \
     $$PWD/s60symbiancertificate.cpp \
-    $$PWD/s60certificatedetailsdialog.cpp
+    $$PWD/s60certificatedetailsdialog.cpp \
+    $$PWD/qt4symbiantargetfactory.cpp \
+    $$PWD/qt4symbiantarget.cpp
+
 HEADERS += $$PWD/s60devices.h \
     $$PWD/s60devicespreferencepane.h \
     $$PWD/s60manager.h \
@@ -50,7 +53,10 @@ HEADERS += $$PWD/s60devices.h \
     $$PWD/s60certificateinfo.h \
     $$PWD/certificatepathchooser.h \
     $$PWD/s60symbiancertificate.h \
-    $$PWD/s60certificatedetailsdialog.h
+    $$PWD/s60certificatedetailsdialog.h \
+    $$PWD/qt4symbiantargetfactory.h \
+    $$PWD/qt4symbiantarget.h
+
 FORMS += $$PWD/s60devicespreferencepane.ui \
     $$PWD/s60createpackagestep.ui \
     $$PWD/s60certificatedetailsdialog.ui
diff --git a/src/plugins/qt4projectmanager/qt-s60/qt4symbiantarget.cpp b/src/plugins/qt4projectmanager/qt-s60/qt4symbiantarget.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9028ac194d607dc3647723d48dc2e6e98077a63f
--- /dev/null
+++ b/src/plugins/qt4projectmanager/qt-s60/qt4symbiantarget.cpp
@@ -0,0 +1,247 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, 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.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#include "qt4symbiantarget.h"
+#include "qt4projectmanagerconstants.h"
+#include "qt4project.h"
+#include "qt-s60/s60deployconfiguration.h"
+#include "qt-s60/s60emulatorrunconfiguration.h"
+#include "qt-s60/s60devicerunconfiguration.h"
+
+#include <coreplugin/coreconstants.h>
+#include <projectexplorer/project.h>
+#include <projectexplorer/customexecutablerunconfiguration.h>
+#include <symbianutils/symbiandevicemanager.h>
+#include <QtGui/QPainter>
+#include <QtGui/QApplication>
+
+using namespace Qt4ProjectManager;
+using namespace Qt4ProjectManager::Internal;
+
+Qt4SymbianTarget::Qt4SymbianTarget(Qt4Project *parent, const QString &id) :
+    Qt4BaseTarget(parent, id),
+    m_connectedPixmap(QLatin1String(":/projectexplorer/images/ConnectionOn.png")),
+    m_disconnectedPixmap(QLatin1String(":/projectexplorer/images/ConnectionOff.png")),
+    m_buildConfigurationFactory(new Qt4BuildConfigurationFactory(this)),
+    m_deployConfigurationFactory(new S60DeployConfigurationFactory(this))
+{
+    setDisplayName(defaultDisplayName(id));
+    setIcon(iconForId(id));
+    connect(this, SIGNAL(addedDeployConfiguration(ProjectExplorer::DeployConfiguration*)),
+            this, SLOT(onAddedDeployConfiguration(ProjectExplorer::DeployConfiguration*)));
+    connect(this, SIGNAL(activeRunConfigurationChanged(ProjectExplorer::RunConfiguration*)),
+            this, SLOT(updateToolTipAndIcon()));
+}
+
+Qt4SymbianTarget::~Qt4SymbianTarget()
+{
+
+}
+
+QString Qt4SymbianTarget::defaultDisplayName(const QString &id)
+{
+    if (id == QLatin1String(Constants::S60_EMULATOR_TARGET_ID))
+        return QApplication::translate("Qt4ProjectManager::Qt4Target", "Symbian Emulator", "Qt4 Symbian Emulator target display name");
+    if (id == QLatin1String(Constants::S60_DEVICE_TARGET_ID))
+        return QApplication::translate("Qt4ProjectManager::Qt4Target", "Symbian Device", "Qt4 Symbian Device target display name");
+    return QString();
+}
+
+QIcon Qt4SymbianTarget::iconForId(const QString &id)
+{
+    if (id == QLatin1String(Constants::S60_EMULATOR_TARGET_ID))
+        return QIcon(":/projectexplorer/images/SymbianEmulator.png");
+    if (id == QLatin1String(Constants::S60_DEVICE_TARGET_ID))
+        return QIcon(":/projectexplorer/images/SymbianDevice.png");
+    return QIcon();
+}
+
+Qt4BuildConfigurationFactory *Qt4SymbianTarget::buildConfigurationFactory() const
+{
+    return m_buildConfigurationFactory;
+}
+
+ProjectExplorer::DeployConfigurationFactory *Qt4SymbianTarget::deployConfigurationFactory() const
+{
+    return m_deployConfigurationFactory;
+}
+
+QList<ProjectExplorer::ToolChainType> Qt4SymbianTarget::filterToolChainTypes(const QList<ProjectExplorer::ToolChainType> &candidates) const
+{
+    QList<ProjectExplorer::ToolChainType> tmp(candidates);
+    if (id() == QLatin1String(Constants::S60_EMULATOR_TARGET_ID)) {
+        if (tmp.contains(ProjectExplorer::ToolChain_WINSCW))
+            return QList<ProjectExplorer::ToolChainType>() << ProjectExplorer::ToolChain_WINSCW;
+        else
+            return QList<ProjectExplorer::ToolChainType>();
+    } else if (id() == QLatin1String(Constants::S60_DEVICE_TARGET_ID)) {
+        tmp.removeAll(ProjectExplorer::ToolChain_WINSCW);
+        return tmp;
+    }
+    return tmp;
+}
+
+ProjectExplorer::ToolChainType Qt4SymbianTarget::preferredToolChainType(const QList<ProjectExplorer::ToolChainType> &candidates) const
+{
+    ProjectExplorer::ToolChainType preferredType = ProjectExplorer::ToolChain_INVALID;
+    if (id() == QLatin1String(Constants::S60_EMULATOR_TARGET_ID) &&
+        candidates.contains(ProjectExplorer::ToolChain_WINSCW))
+        preferredType = ProjectExplorer::ToolChain_WINSCW;
+    if (!candidates.isEmpty())
+        preferredType = candidates.at(0);
+    return preferredType;
+}
+
+QString Qt4SymbianTarget::defaultBuildDirectory() const
+{
+    return project()->projectDirectory();
+}
+
+void Qt4SymbianTarget::createApplicationProFiles()
+{
+    removeUnconfiguredCustomExectutableRunConfigurations();
+
+    // We use the list twice
+    QList<Qt4ProFileNode *> profiles = qt4Project()->applicationProFiles();
+    QSet<QString> paths;
+    foreach (Qt4ProFileNode *pro, profiles)
+        paths << pro->path();
+
+    if (id() == QLatin1String(Constants::S60_EMULATOR_TARGET_ID)) {
+        foreach (ProjectExplorer::RunConfiguration *rc, runConfigurations())
+            if (S60EmulatorRunConfiguration *qt4rc = qobject_cast<S60EmulatorRunConfiguration *>(rc))
+                paths.remove(qt4rc->proFilePath());
+
+        // Only add new runconfigurations if there are none.
+        foreach (const QString &path, paths)
+            addRunConfiguration(new S60EmulatorRunConfiguration(this, path));
+    } else if (id() == QLatin1String(Constants::S60_DEVICE_TARGET_ID)) {
+        foreach (ProjectExplorer::RunConfiguration *rc, runConfigurations())
+            if (S60DeviceRunConfiguration *qt4rc = qobject_cast<S60DeviceRunConfiguration *>(rc))
+                paths.remove(qt4rc->proFilePath());
+
+        // Only add new runconfigurations if there are none.
+        foreach (const QString &path, paths)
+            addRunConfiguration(new S60DeviceRunConfiguration(this, path));
+    }
+
+    // Oh still none? Add a custom executable runconfiguration
+    if (runConfigurations().isEmpty()) {
+        addRunConfiguration(new ProjectExplorer::CustomExecutableRunConfiguration(this));
+    }
+}
+
+bool Qt4SymbianTarget::isSymbianConnectionAvailable(QString &tooltipText)
+{
+    const S60DeployConfiguration *s60DeployConf = qobject_cast<S60DeployConfiguration *>(activeDeployConfiguration());
+    if (!s60DeployConf)
+        return false;
+    switch (s60DeployConf->communicationChannel()) {
+    case S60DeployConfiguration::CommunicationSerialConnection: {
+        const SymbianUtils::SymbianDeviceManager *sdm = SymbianUtils::SymbianDeviceManager::instance();
+        const int deviceIndex = sdm->findByPortName(s60DeployConf->serialPortName());
+        if (deviceIndex == -1) {
+            tooltipText = tr("<b>Device:</b> Not connected");
+            return false;
+        } else {
+            // device connected
+            const SymbianUtils::SymbianDevice device = sdm->devices().at(deviceIndex);
+            tooltipText = device.additionalInformation().isEmpty() ?
+                                    tr("<b>Device:</b> %1").arg(device.friendlyName()) :
+                                    tr("<b>Device:</b> %1, %2").arg(device.friendlyName(), device.additionalInformation());
+            return true;
+        }
+    }
+    break;
+    case S60DeployConfiguration::CommunicationTcpConnection: {
+        if(!s60DeployConf->deviceAddress().isEmpty() && !s60DeployConf->devicePort().isEmpty()) {
+            tooltipText = tr("<b>IP address:</b> %1:%2").arg(s60DeployConf->deviceAddress(), s60DeployConf->devicePort());
+            return true;
+        }
+        return false;
+    }
+    break;
+    default:
+        break;
+    }
+    return false;
+}
+
+void Qt4SymbianTarget::onAddedDeployConfiguration(ProjectExplorer::DeployConfiguration *dc)
+{
+    Q_ASSERT(dc);
+    S60DeployConfiguration *deployConf(qobject_cast<S60DeployConfiguration *>(dc));
+    if (!deployConf)
+        return;
+    connect(deployConf, SIGNAL(serialPortNameChanged()),
+            this, SLOT(slotUpdateDeviceInformation()));
+    connect(deployConf, SIGNAL(communicationChannelChanged()),
+            this, SLOT(slotUpdateDeviceInformation()));
+    connect(deployConf, SIGNAL(deviceAddressChanged()),
+            this, SLOT(slotUpdateDeviceInformation()));
+    connect(deployConf, SIGNAL(devicePortChanged()),
+            this, SLOT(slotUpdateDeviceInformation()));
+}
+
+void Qt4SymbianTarget::slotUpdateDeviceInformation()
+{
+    S60DeployConfiguration *dc(qobject_cast<S60DeployConfiguration *>(sender()));
+    if (dc && dc == activeDeployConfiguration()) {
+        updateToolTipAndIcon();
+    }
+}
+
+void Qt4SymbianTarget::updateToolTipAndIcon()
+{
+    static const int TARGET_OVERLAY_ORIGINAL_SIZE = 32;
+
+    if (qobject_cast<S60DeployConfiguration *>(activeDeployConfiguration()))  {
+        QPixmap overlay;
+        QString tooltip;
+        if (isSymbianConnectionAvailable(tooltip))
+            overlay = m_connectedPixmap;
+        else
+            overlay = m_disconnectedPixmap;
+        setToolTip(tooltip);
+
+        double factor = Core::Constants::TARGET_ICON_SIZE / (double)TARGET_OVERLAY_ORIGINAL_SIZE;
+        QSize overlaySize(overlay.size().width()*factor, overlay.size().height()*factor);
+        QPixmap pixmap(Core::Constants::TARGET_ICON_SIZE, Core::Constants::TARGET_ICON_SIZE);
+        pixmap.fill(Qt::transparent);
+        QPainter painter(&pixmap);
+        painter.drawPixmap(Core::Constants::TARGET_ICON_SIZE - overlaySize.width(),
+                           Core::Constants::TARGET_ICON_SIZE - overlaySize.height(),
+                           overlay.scaled(overlaySize));
+
+        setOverlayIcon(QIcon(pixmap));
+    } else {
+        setToolTip(QString());
+        setOverlayIcon(QIcon());
+    }
+}
diff --git a/src/plugins/qt4projectmanager/qt-s60/qt4symbiantarget.h b/src/plugins/qt4projectmanager/qt-s60/qt4symbiantarget.h
new file mode 100644
index 0000000000000000000000000000000000000000..e4a2c9225becfa44184ba86941bca1f364b7751a
--- /dev/null
+++ b/src/plugins/qt4projectmanager/qt-s60/qt4symbiantarget.h
@@ -0,0 +1,79 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, 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.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#ifndef QT4SYMBIANTARGET_H
+#define QT4SYMBIANTARGET_H
+
+#include "qt4target.h"
+
+#include <QtGui/QPixmap>
+
+namespace Qt4ProjectManager {
+class Qt4Project;
+namespace Internal {
+
+
+class Qt4SymbianTarget : public Qt4BaseTarget
+{
+    friend class Qt4SymbianTargetFactory; // for from Map
+    Q_OBJECT
+public:
+    explicit Qt4SymbianTarget(Qt4Project *parent, const QString &id);
+    virtual ~Qt4SymbianTarget();
+
+    Internal::Qt4BuildConfigurationFactory *buildConfigurationFactory() const;
+    ProjectExplorer::DeployConfigurationFactory *deployConfigurationFactory() const;
+
+    QList<ProjectExplorer::ToolChainType> filterToolChainTypes(const QList<ProjectExplorer::ToolChainType> &candidates) const;
+    ProjectExplorer::ToolChainType preferredToolChainType(const QList<ProjectExplorer::ToolChainType> &candidates) const;
+
+    QString defaultBuildDirectory() const;
+
+    void createApplicationProFiles();
+
+    static QString defaultDisplayName(const QString &id);
+    static QIcon iconForId(const QString &id);
+private:
+     bool isSymbianConnectionAvailable(QString &tooltipText);
+
+private slots:
+    void onAddedDeployConfiguration(ProjectExplorer::DeployConfiguration *dc);
+    void slotUpdateDeviceInformation();
+    void updateToolTipAndIcon();
+
+private:
+    const QPixmap m_connectedPixmap;
+    const QPixmap m_disconnectedPixmap;
+
+    Internal::Qt4BuildConfigurationFactory *m_buildConfigurationFactory;
+    ProjectExplorer::DeployConfigurationFactory *m_deployConfigurationFactory;
+};
+} // namespace Internal
+} // namespace Qt4ProjectManager
+#endif // QT4SYMBIANTARGET_H
diff --git a/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.cpp b/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..901a0ec70b498d2af4f6f4a956a8c411f146666b
--- /dev/null
+++ b/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.cpp
@@ -0,0 +1,196 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, 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.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#include "qt4symbiantargetfactory.h"
+#include "qt4projectmanagerconstants.h"
+#include "qt4project.h"
+
+#include "qt-s60/s60deployconfiguration.h"
+#include "qt-s60/s60devicerunconfiguration.h"
+#include "qt-s60/s60emulatorrunconfiguration.h"
+#include "qt-s60/s60createpackagestep.h"
+#include "qt-s60/s60deploystep.h"
+#include "qt-s60/qt4symbiantarget.h"
+
+#include <projectexplorer/projectexplorerconstants.h>
+#include <projectexplorer/customexecutablerunconfiguration.h>
+
+using ProjectExplorer::idFromMap;
+using namespace Qt4ProjectManager;
+using namespace Qt4ProjectManager::Internal;
+
+// -------------------------------------------------------------------------
+// Qt4SymbianTargetFactory
+// -------------------------------------------------------------------------
+
+Qt4SymbianTargetFactory::Qt4SymbianTargetFactory(QObject *parent) :
+    Qt4BaseTargetFactory(parent)
+{
+    connect(QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>)),
+            this, SIGNAL(supportedTargetIdsChanged()));
+}
+
+Qt4SymbianTargetFactory::~Qt4SymbianTargetFactory()
+{
+}
+
+bool Qt4SymbianTargetFactory::supportsTargetId(const QString &id) const
+{
+    return id == QLatin1String(Constants::S60_DEVICE_TARGET_ID)
+            || id == QLatin1String(Constants::S60_EMULATOR_TARGET_ID);
+}
+
+QStringList Qt4SymbianTargetFactory::supportedTargetIds(ProjectExplorer::Project *parent) const
+{
+    if (!qobject_cast<Qt4Project *>(parent))
+        return QStringList();
+
+    QStringList ids;
+    if (QtVersionManager::instance()->supportsTargetId(Constants::S60_DEVICE_TARGET_ID))
+        ids << QLatin1String(Constants::S60_DEVICE_TARGET_ID);
+    if (QtVersionManager::instance()->supportsTargetId(Constants::S60_EMULATOR_TARGET_ID))
+        ids << QLatin1String(Constants::S60_EMULATOR_TARGET_ID);
+
+    return ids;
+}
+
+QString Qt4SymbianTargetFactory::displayNameForId(const QString &id) const
+{
+    return Qt4SymbianTarget::defaultDisplayName(id);
+}
+
+bool Qt4SymbianTargetFactory::canCreate(ProjectExplorer::Project *parent, const QString &id) const
+{
+    if (!qobject_cast<Qt4Project *>(parent))
+        return false;
+    return supportsTargetId(id);
+}
+
+bool Qt4SymbianTargetFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const
+{
+    return canCreate(parent, idFromMap(map));
+}
+
+Qt4BaseTarget *Qt4SymbianTargetFactory::restore(ProjectExplorer::Project *parent, const QVariantMap &map)
+{
+    if (!canRestore(parent, map))
+        return 0;
+
+    Qt4Project *qt4project = static_cast<Qt4Project *>(parent);
+    Qt4SymbianTarget *target = new Qt4SymbianTarget(qt4project, idFromMap(map));
+
+    if (target->fromMap(map))
+        return target;
+    delete target;
+    return 0;
+}
+
+QString Qt4SymbianTargetFactory::defaultShadowBuildDirectory(const QString &projectLocation, const QString &id)
+{
+    QString shortName = QLatin1String("unknown");
+    if (id == QLatin1String(Constants::S60_EMULATOR_TARGET_ID))
+        shortName = QLatin1String("symbian_emulator");
+    else if (id == QLatin1String(Constants::S60_DEVICE_TARGET_ID))
+        shortName = QLatin1String("symbian");
+
+    // currently we can't have the build directory to be deeper than the source directory
+    // since that is broken in qmake
+    // Once qmake is fixed we can change that to have a top directory and
+    // subdirectories per build. (Replacing "QChar('-')" with "QChar('/') )
+    return projectLocation + QChar('-') + shortName;
+}
+
+QList<BuildConfigurationInfo> Qt4SymbianTargetFactory::availableBuildConfigurations(const QString &proFilePath)
+{
+    QList<BuildConfigurationInfo> infos;
+    QList<QtVersion *> knownVersions = QtVersionManager::instance()->versionsForTargetId(Constants::S60_EMULATOR_TARGET_ID);
+
+    foreach (QtVersion *version, knownVersions) {
+        bool buildAll = version->defaultBuildConfig() & QtVersion::BuildAll;
+        QtVersion::QmakeBuildConfigs config = buildAll ? QtVersion::BuildAll : QtVersion::QmakeBuildConfig(0);
+        QString dir = defaultShadowBuildDirectory(Qt4Project::defaultTopLevelBuildDirectory(proFilePath), Constants::S60_EMULATOR_TARGET_ID);
+        infos.append(BuildConfigurationInfo(version, config | QtVersion::DebugBuild, QString(), dir));
+    }
+
+    knownVersions = QtVersionManager::instance()->versionsForTargetId(Constants::S60_DEVICE_TARGET_ID);
+    foreach (QtVersion *version, knownVersions) {
+        bool buildAll = version->defaultBuildConfig() & QtVersion::BuildAll;
+        QtVersion::QmakeBuildConfigs config = buildAll ? QtVersion::BuildAll : QtVersion::QmakeBuildConfig(0);
+        QString dir = defaultShadowBuildDirectory(Qt4Project::defaultTopLevelBuildDirectory(proFilePath), Constants::S60_DEVICE_TARGET_ID);
+        infos.append(BuildConfigurationInfo(version, config, QString(), dir));
+        infos.append(BuildConfigurationInfo(version, config | QtVersion::DebugBuild, QString(), dir));
+    }
+
+    return infos;
+}
+
+Qt4BaseTarget *Qt4SymbianTargetFactory::create(ProjectExplorer::Project *parent, const QString &id)
+{
+    if (!canCreate(parent, id))
+        return 0;
+
+    QList<QtVersion *> knownVersions = QtVersionManager::instance()->versionsForTargetId(id);
+    if (knownVersions.isEmpty())
+        return 0;
+
+    QtVersion *qtVersion = knownVersions.first();
+    bool buildAll = qtVersion->isValid() && (qtVersion->defaultBuildConfig() & QtVersion::BuildAll);
+    QtVersion::QmakeBuildConfigs config = buildAll ? QtVersion::BuildAll : QtVersion::QmakeBuildConfig(0);
+
+    QList<BuildConfigurationInfo> infos;
+    infos.append(BuildConfigurationInfo(qtVersion, config | QtVersion::DebugBuild, QString(), QString()));
+    if (id != Constants::S60_EMULATOR_TARGET_ID)
+        infos.append(BuildConfigurationInfo(qtVersion, config, QString(), QString()));
+
+    return create(parent, id, infos);
+}
+
+Qt4BaseTarget *Qt4SymbianTargetFactory::create(ProjectExplorer::Project *parent, const QString &id, QList<BuildConfigurationInfo> infos)
+{
+    if (!canCreate(parent, id))
+        return 0;
+    Qt4SymbianTarget *t = new Qt4SymbianTarget(static_cast<Qt4Project *>(parent), id);
+    foreach (const BuildConfigurationInfo &info, infos) {
+        QString displayName = info.version->displayName() + QLatin1Char(' ');
+        displayName += (info.buildConfig & QtVersion::DebugBuild) ? tr("Debug") : tr("Release");
+        t->addQt4BuildConfiguration(displayName,
+                                    info.version,
+                                    info.buildConfig,
+                                    info.additionalArguments,
+                                    info.directory);
+    }
+
+    t->addDeployConfiguration(t->deployConfigurationFactory()->create(t, ProjectExplorer::Constants::DEFAULT_DEPLOYCONFIGURATION_ID));
+
+    t->createApplicationProFiles();
+
+    if (t->runConfigurations().isEmpty())
+        t->addRunConfiguration(new ProjectExplorer::CustomExecutableRunConfiguration(t));
+    return t;
+}
diff --git a/src/plugins/qt4projectmanager/qt4deployconfiguration.h b/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.h
similarity index 57%
rename from src/plugins/qt4projectmanager/qt4deployconfiguration.h
rename to src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.h
index 46b21acfcb4b9664361a9e7eb5c7905342391a46..dbb5af9f3c33ad5efbaa52b9b1794b5c6dbab1fd 100644
--- a/src/plugins/qt4projectmanager/qt4deployconfiguration.h
+++ b/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.h
@@ -31,36 +31,37 @@
 **
 **************************************************************************/
 
-#ifndef QT4PROJECTMANAGER_QT4DEPLOYCONFIGURATION_H
-#define QT4PROJECTMANAGER_QT4DEPLOYCONFIGURATION_H
+#ifndef QT4SYMBIANTARGETFACTORY_H
+#define QT4SYMBIANTARGETFACTORY_H
 
-#include <projectexplorer/deployconfiguration.h>
+#include "qt4target.h"
 
 namespace Qt4ProjectManager {
 namespace Internal {
-
-class Target;
-class S60DeployConfigurationFactory;
-
-class Qt4DeployConfigurationFactory : public ProjectExplorer::DeployConfigurationFactory
+class Qt4SymbianTargetFactory : public Qt4BaseTargetFactory
 {
     Q_OBJECT
-
 public:
-    explicit Qt4DeployConfigurationFactory(QObject *parent = 0);
+    Qt4SymbianTargetFactory(QObject *parent = 0);
+    ~Qt4SymbianTargetFactory();
 
-    ProjectExplorer::DeployConfiguration *create(ProjectExplorer::Target *parent, const QString &id);
-    bool canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const;
-    ProjectExplorer::DeployConfiguration *restore(ProjectExplorer::Target *parent, const QVariantMap &map);
-    bool canClone(ProjectExplorer::Target *parent, ProjectExplorer::DeployConfiguration *product) const;
-    ProjectExplorer::DeployConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::DeployConfiguration *product);
+    QStringList supportedTargetIds(ProjectExplorer::Project *parent) const;
+    bool supportsTargetId(const QString &id) const;
+    QString displayNameForId(const QString &id) const;
 
-private:
-    S60DeployConfigurationFactory *m_s60DeployConfigurationFactory;
+    bool canCreate(ProjectExplorer::Project *parent, const QString &id) const;
+    bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const;
 
+    Qt4ProjectManager::Qt4BaseTarget *restore(ProjectExplorer::Project *parent, const QVariantMap &map);
+    Qt4BaseTarget *create(ProjectExplorer::Project *parent, const QString &id);
+    Qt4BaseTarget *create(ProjectExplorer::Project *parent, const QString &id, QList<BuildConfigurationInfo> infos);
+
+    QString defaultShadowBuildDirectory(const QString &projectLocation, const QString &id);
+    QList<BuildConfigurationInfo> availableBuildConfigurations(const QString &proFilePath);
 };
 
 } // namespace Internal
 } // namespace Qt4ProjectManager
 
-#endif // QT4PROJECTMANAGER_QT4DEPLOYCONFIGURATION_H
+
+#endif // QT4SYMBIANTARGETFACTORY_H
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.cpp
index fcbf9f6ddd41ef32c8580f8c92b8720bb240af5d..22a0ede8f089a0ac02af9165deffb16eb66aa31c 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.cpp
@@ -37,11 +37,14 @@
 #include "qt4target.h"
 #include "qt4projectmanagerconstants.h"
 #include "qt4buildconfiguration.h"
+#include "qt4symbiantarget.h"
 #include "s60createpackagestep.h"
+#include "s60deploystep.h"
 
 #include <utils/qtcassert.h>
 #include <symbianutils/symbiandevicemanager.h>
 
+#include <projectexplorer/buildconfiguration.h>
 #include <projectexplorer/buildsteplist.h>
 #include <projectexplorer/project.h>
 
@@ -278,9 +281,8 @@ QString S60DeployConfiguration::symbianTarget() const
 
 const QtVersion *S60DeployConfiguration::qtVersion() const
 {
-    if (const BuildConfiguration *bc = target()->activeBuildConfiguration())
-        if (const Qt4BuildConfiguration *qt4bc = qobject_cast<const Qt4BuildConfiguration *>(bc))
-            return qt4bc->qtVersion();
+    if (const Qt4BuildConfiguration *qt4bc = qt4Target()->activeBuildConfiguration())
+        return qt4bc->qtVersion();
     return 0;
 }
 
@@ -342,9 +344,9 @@ bool S60DeployConfiguration::fromMap(const QVariantMap &map)
     return true;
 }
 
-Qt4Target *S60DeployConfiguration::qt4Target() const
+Qt4SymbianTarget *S60DeployConfiguration::qt4Target() const
 {
-    return static_cast<Qt4Target *>(target());
+    return static_cast<Qt4SymbianTarget *>(target());
 }
 
 QString S60DeployConfiguration::serialPortName() const
@@ -436,7 +438,7 @@ S60DeployConfigurationFactory::~S60DeployConfigurationFactory()
 
 QStringList S60DeployConfigurationFactory::availableCreationIds(Target *parent) const
 {
-    Qt4Target *target = qobject_cast<Qt4Target *>(parent);
+    Qt4SymbianTarget *target = qobject_cast<Qt4SymbianTarget *>(parent);
     if (!target ||
         target->id() != QLatin1String(Constants::S60_DEVICE_TARGET_ID))
         return QStringList();
@@ -456,13 +458,18 @@ DeployConfiguration *S60DeployConfigurationFactory::create(Target *parent, const
     if (!canCreate(parent, id))
         return 0;
 
-    Qt4Target *t(static_cast<Qt4Target *>(parent));
-    return new S60DeployConfiguration(t);
+    Qt4SymbianTarget *t = static_cast<Qt4SymbianTarget *>(parent);
+    S60DeployConfiguration *dc = new S60DeployConfiguration(t);
+
+    dc->setDefaultDisplayName(tr("Deploy to Symbian device"));
+    dc->stepList()->insertStep(0, new S60CreatePackageStep(dc->stepList()));
+    dc->stepList()->insertStep(1, new S60DeployStep(dc->stepList()));
+    return dc;
 }
 
 bool S60DeployConfigurationFactory::canCreate(Target *parent, const QString& /*id*/) const
 {
-    Qt4Target *t = qobject_cast<Qt4Target *>(parent);
+    Qt4SymbianTarget * t = qobject_cast<Qt4SymbianTarget *>(parent);
     if (!t || t->id() != QLatin1String(Constants::S60_DEVICE_TARGET_ID))
         return false;
     return true;
@@ -470,7 +477,7 @@ bool S60DeployConfigurationFactory::canCreate(Target *parent, const QString& /*i
 
 bool S60DeployConfigurationFactory::canRestore(Target *parent, const QVariantMap& /*map*/) const
 {
-    Qt4Target *t = qobject_cast<Qt4Target *>(parent);
+    Qt4SymbianTarget * t = qobject_cast<Qt4SymbianTarget *>(parent);
     return t && t->id() == QLatin1String(Constants::S60_DEVICE_TARGET_ID);
 }
 
@@ -478,8 +485,8 @@ DeployConfiguration *S60DeployConfigurationFactory::restore(Target *parent, cons
 {
     if (!canRestore(parent, map))
         return 0;
-    Qt4Target *t(static_cast<Qt4Target *>(parent));
-    S60DeployConfiguration *dc(new S60DeployConfiguration(t));
+    Qt4SymbianTarget *t = static_cast<Qt4SymbianTarget *>(parent);
+    S60DeployConfiguration *dc = new S60DeployConfiguration(t);
     if (dc->fromMap(map))
         return dc;
 
@@ -489,7 +496,7 @@ DeployConfiguration *S60DeployConfigurationFactory::restore(Target *parent, cons
 
 bool S60DeployConfigurationFactory::canClone(Target *parent, DeployConfiguration *source) const
 {
-    if (!qobject_cast<Qt4Target *>(parent))
+    if (!qobject_cast<Qt4SymbianTarget *>(parent))
         return false;
     return source->id() == QLatin1String(S60_DC_ID);
 }
@@ -498,7 +505,7 @@ DeployConfiguration *S60DeployConfigurationFactory::clone(Target *parent, Deploy
 {
     if (!canClone(parent, source))
         return 0;
-    Qt4Target *t = static_cast<Qt4Target *>(parent);
-    S60DeployConfiguration *old = static_cast<S60DeployConfiguration *>(source);
+    Qt4SymbianTarget *t = static_cast<Qt4SymbianTarget *>(parent);
+    S60DeployConfiguration * old = static_cast<S60DeployConfiguration *>(source);
     return new S60DeployConfiguration(t, old);
 }
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.h b/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.h
index 1f2b780e4dc3adee0d5236e7f33b9964a8d8e2cf..13488707743a8361ba5ecd40c44c38d8c3b0f15c 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.h
+++ b/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.h
@@ -44,9 +44,9 @@ class RunConfiguration;
 
 namespace Qt4ProjectManager {
 class QtVersion;
-class Qt4Target;
 
 namespace Internal {
+class Qt4SymbianTarget;
 class Qt4ProFileNode;
 class S60DeployConfigurationFactory;
 class S60DeviceRunConfiguration;
@@ -70,7 +70,7 @@ public:
     ProjectExplorer::DeployConfigurationWidget *configurationWidget() const;
 
     const QtVersion *qtVersion() const;
-    Qt4Target *qt4Target() const;
+    Qt4SymbianTarget *qt4Target() const;
     ProjectExplorer::ToolChainType toolChainType() const;
 
     QString serialPortName() const;
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp
index 8c727672c5131f7c7d37fd12b6bf0187637033aa..f873bab9957d8dda991bf4740903b9875d8b11f6 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp
@@ -41,6 +41,7 @@
 #include "s60runconfigbluetoothstarter.h"
 #include "qt4projectmanagerconstants.h"
 #include "qtoutputformatter.h"
+#include "qt4symbiantarget.h"
 
 #include "tcftrkdevice.h"
 #include "tcftrkmessage.h"
@@ -126,7 +127,7 @@ bool isProcessRunning(const TcfTrkCommandResult &result, const QString &processN
 
 // ======== S60DeviceRunConfiguration
 
-S60DeviceRunConfiguration::S60DeviceRunConfiguration(Qt4Target *parent, const QString &proFilePath) :
+S60DeviceRunConfiguration::S60DeviceRunConfiguration(Qt4BaseTarget *parent, const QString &proFilePath) :
     RunConfiguration(parent,  QLatin1String(S60_DEVICE_RC_ID)),
     m_proFilePath(proFilePath),
     m_validParse(parent->qt4Project()->validParse(proFilePath))
@@ -134,7 +135,7 @@ S60DeviceRunConfiguration::S60DeviceRunConfiguration(Qt4Target *parent, const QS
     ctor();
 }
 
-S60DeviceRunConfiguration::S60DeviceRunConfiguration(Qt4Target *target, S60DeviceRunConfiguration *source) :
+S60DeviceRunConfiguration::S60DeviceRunConfiguration(Qt4BaseTarget *target, S60DeviceRunConfiguration *source) :
     RunConfiguration(target, source),
     m_proFilePath(source->m_proFilePath),
     m_commandLineArguments(source->m_commandLineArguments),
@@ -186,9 +187,9 @@ S60DeviceRunConfiguration::~S60DeviceRunConfiguration()
 {
 }
 
-Qt4Target *S60DeviceRunConfiguration::qt4Target() const
+Qt4SymbianTarget *S60DeviceRunConfiguration::qt4Target() const
 {
-    return static_cast<Qt4Target *>(target());
+    return static_cast<Qt4SymbianTarget *>(target());
 }
 
 ProjectExplorer::ToolChainType S60DeviceRunConfiguration::toolChainType(
@@ -428,6 +429,11 @@ void S60DeviceRunConfiguration::setCommandLineArguments(const QString &args)
     m_commandLineArguments = args;
 }
 
+QString S60DeviceRunConfiguration::proFilePath() const
+{
+    return m_proFilePath;
+}
+
 // ======== S60DeviceRunConfigurationFactory
 
 S60DeviceRunConfigurationFactory::S60DeviceRunConfigurationFactory(QObject *parent) :
@@ -441,7 +447,7 @@ S60DeviceRunConfigurationFactory::~S60DeviceRunConfigurationFactory()
 
 QStringList S60DeviceRunConfigurationFactory::availableCreationIds(Target *parent) const
 {
-    Qt4Target *target = qobject_cast<Qt4Target *>(parent);
+    Qt4SymbianTarget *target = qobject_cast<Qt4SymbianTarget *>(parent);
     if (!target || target->id() != QLatin1String(Constants::S60_DEVICE_TARGET_ID))
         return QStringList();
 
@@ -457,7 +463,7 @@ QString S60DeviceRunConfigurationFactory::displayNameForId(const QString &id) co
 
 bool S60DeviceRunConfigurationFactory::canCreate(Target *parent, const QString &id) const
 {
-    Qt4Target *t = qobject_cast<Qt4Target *>(parent);
+    Qt4SymbianTarget *t = qobject_cast<Qt4SymbianTarget *>(parent);
     if (!t || t->id() != QLatin1String(Constants::S60_DEVICE_TARGET_ID))
         return false;
     return t->qt4Project()->hasApplicationProFile(pathFromId(id));
@@ -468,13 +474,13 @@ RunConfiguration *S60DeviceRunConfigurationFactory::create(Target *parent, const
     if (!canCreate(parent, id))
         return 0;
 
-    Qt4Target *t = static_cast<Qt4Target *>(parent);
+    Qt4SymbianTarget *t = static_cast<Qt4SymbianTarget *>(parent);
     return new S60DeviceRunConfiguration(t, pathFromId(id));
 }
 
 bool S60DeviceRunConfigurationFactory::canRestore(Target *parent, const QVariantMap &map) const
 {
-    Qt4Target *t = qobject_cast<Qt4Target *>(parent);
+    Qt4SymbianTarget *t = qobject_cast<Qt4SymbianTarget *>(parent);
     if (!t || t->id() != QLatin1String(Constants::S60_DEVICE_TARGET_ID))
         return false;
     QString id = ProjectExplorer::idFromMap(map);
@@ -485,8 +491,8 @@ RunConfiguration *S60DeviceRunConfigurationFactory::restore(Target *parent, cons
 {
     if (!canRestore(parent, map))
         return 0;
-    Qt4Target *t = static_cast<Qt4Target *>(parent);
-    S60DeviceRunConfiguration *rc(new S60DeviceRunConfiguration(t, QString()));
+    Qt4SymbianTarget *t = static_cast<Qt4SymbianTarget *>(parent);
+    S60DeviceRunConfiguration *rc = new S60DeviceRunConfiguration(t, QString());
     if (rc->fromMap(map))
         return rc;
 
@@ -496,7 +502,7 @@ RunConfiguration *S60DeviceRunConfigurationFactory::restore(Target *parent, cons
 
 bool S60DeviceRunConfigurationFactory::canClone(Target *parent, RunConfiguration *source) const
 {
-    if (!qobject_cast<Qt4Target *>(parent))
+    if (!qobject_cast<Qt4SymbianTarget *>(parent))
         return false;
     return source->id() == QLatin1String(S60_DEVICE_RC_ID);
 }
@@ -505,7 +511,7 @@ RunConfiguration *S60DeviceRunConfigurationFactory::clone(Target *parent, RunCon
 {
     if (!canClone(parent, source))
         return 0;
-    Qt4Target *t = static_cast<Qt4Target *>(parent);
+    Qt4SymbianTarget *t = static_cast<Qt4SymbianTarget *>(parent);
     S60DeviceRunConfiguration *old = static_cast<S60DeviceRunConfiguration *>(source);
     return new S60DeviceRunConfiguration(t, old);
 }
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h
index ba355fa12eeb139c737c15a489646741b68b739a..e5f02d951b934d5dddca42e85b71fa25c85c4221 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h
+++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h
@@ -66,9 +66,10 @@ class TcfTrkEvent;
 
 namespace Qt4ProjectManager {
 class QtVersion;
-class Qt4Target;
+class Qt4BaseTarget;
 
 namespace Internal {
+class Qt4SymbianTarget;
 class Qt4ProFileNode;
 class S60DeviceRunConfigurationFactory;
 
@@ -78,10 +79,10 @@ class S60DeviceRunConfiguration : public ProjectExplorer::RunConfiguration
     friend class S60DeviceRunConfigurationFactory;
 
 public:
-    S60DeviceRunConfiguration(Qt4ProjectManager::Qt4Target *parent, const QString &proFilePath);
+    S60DeviceRunConfiguration(Qt4ProjectManager::Qt4BaseTarget *parent, const QString &proFilePath);
     virtual ~S60DeviceRunConfiguration();
 
-    Qt4Target *qt4Target() const;
+    Qt4SymbianTarget *qt4Target() const;
     const QtVersion *qtVersion() const;
 
     using ProjectExplorer::RunConfiguration::isEnabled;
@@ -106,11 +107,12 @@ public:
 
     QVariantMap toMap() const;
 
+    QString proFilePath() const;
 signals:
     void targetInformationChanged();
 
 protected:
-    S60DeviceRunConfiguration(Qt4ProjectManager::Qt4Target *parent, S60DeviceRunConfiguration *source);
+    S60DeviceRunConfiguration(Qt4ProjectManager::Qt4BaseTarget *parent, S60DeviceRunConfiguration *source);
     QString defaultDisplayName() const;
     virtual bool fromMap(const QVariantMap &map);
 private slots:
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp
index 0d41bdb638923c951c6ca1ba1bc6d9233bfb7955..a6e8728c8ff96e3a8e10c9ba15fde713ce3ed1a4 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp
@@ -36,6 +36,7 @@
 #include "qt4project.h"
 #include "qt4target.h"
 #include "s60manager.h"
+#include "qt4symbiantarget.h"
 #include "qt4projectmanagerconstants.h"
 #include "qtoutputformatter.h"
 
@@ -72,7 +73,7 @@ QString pathToId(const QString &path)
 
 // ======== S60EmulatorRunConfiguration
 
-S60EmulatorRunConfiguration::S60EmulatorRunConfiguration(Qt4Target *parent, const QString &proFilePath) :
+S60EmulatorRunConfiguration::S60EmulatorRunConfiguration(Qt4BaseTarget *parent, const QString &proFilePath) :
     RunConfiguration(parent, QLatin1String(S60_EMULATOR_RC_ID)),
     m_proFilePath(proFilePath),
     m_validParse(parent->qt4Project()->validParse(proFilePath))
@@ -80,7 +81,7 @@ S60EmulatorRunConfiguration::S60EmulatorRunConfiguration(Qt4Target *parent, cons
     ctor();
 }
 
-S60EmulatorRunConfiguration::S60EmulatorRunConfiguration(Qt4Target *parent, S60EmulatorRunConfiguration *source) :
+S60EmulatorRunConfiguration::S60EmulatorRunConfiguration(Qt4BaseTarget *parent, S60EmulatorRunConfiguration *source) :
     RunConfiguration(parent, source),
     m_proFilePath(source->m_proFilePath),
     m_validParse(source->m_validParse)
@@ -132,9 +133,9 @@ void S60EmulatorRunConfiguration::proFileUpdate(Qt4ProjectManager::Internal::Qt4
     emit targetInformationChanged();
 }
 
-Qt4Target *S60EmulatorRunConfiguration::qt4Target() const
+Qt4SymbianTarget *S60EmulatorRunConfiguration::qt4Target() const
 {
-    return static_cast<Qt4Target *>(target());
+    return static_cast<Qt4SymbianTarget *>(target());
 }
 
 bool S60EmulatorRunConfiguration::isEnabled(ProjectExplorer::BuildConfiguration *configuration) const
@@ -200,6 +201,11 @@ QString S60EmulatorRunConfiguration::executable() const
     return executable;
 }
 
+QString S60EmulatorRunConfiguration::proFilePath() const
+{
+    return m_proFilePath;
+}
+
 // ======== S60EmulatorRunConfigurationWidget
 
 S60EmulatorRunConfigurationWidget::S60EmulatorRunConfigurationWidget(S60EmulatorRunConfiguration *runConfiguration,
@@ -255,7 +261,7 @@ S60EmulatorRunConfigurationFactory::~S60EmulatorRunConfigurationFactory()
 
 bool S60EmulatorRunConfigurationFactory::canCreate(Target *parent, const QString &id) const
 {
-    Qt4Target * t(qobject_cast<Qt4Target *>(parent));
+    Qt4SymbianTarget *t = qobject_cast<Qt4SymbianTarget *>(parent);
     if (!t ||
         t->id() != QLatin1String(Constants::S60_EMULATOR_TARGET_ID))
         return false;
@@ -266,13 +272,13 @@ RunConfiguration *S60EmulatorRunConfigurationFactory::create(Target *parent, con
 {
     if (!canCreate(parent, id))
         return 0;
-    Qt4Target *t(static_cast<Qt4Target *>(parent));
+    Qt4SymbianTarget *t = static_cast<Qt4SymbianTarget *>(parent);
     return new S60EmulatorRunConfiguration(t, pathFromId(id));
 }
 
 bool S60EmulatorRunConfigurationFactory::canRestore(Target *parent, const QVariantMap &map) const
 {
-    Qt4Target * t(qobject_cast<Qt4Target *>(parent));
+    Qt4SymbianTarget *t = qobject_cast<Qt4SymbianTarget *>(parent);
     if (!t ||
         t->id() != QLatin1String(Constants::S60_EMULATOR_TARGET_ID))
         return false;
@@ -284,8 +290,8 @@ RunConfiguration *S60EmulatorRunConfigurationFactory::restore(Target *parent, co
 {
     if (!canRestore(parent, map))
         return 0;
-    Qt4Target *t(static_cast<Qt4Target *>(parent));
-    S60EmulatorRunConfiguration *rc(new S60EmulatorRunConfiguration(t, QString()));
+    Qt4SymbianTarget *t = static_cast<Qt4SymbianTarget *>(parent);
+    S60EmulatorRunConfiguration *rc = new S60EmulatorRunConfiguration(t, QString());
     if (rc->fromMap(map))
         return rc;
     delete rc;
@@ -301,13 +307,13 @@ RunConfiguration *S60EmulatorRunConfigurationFactory::clone(Target *parent, RunC
 {
     if (!canClone(parent, source))
         return 0;
-    Qt4Target *t(static_cast<Qt4Target *>(parent));
+    Qt4SymbianTarget *t = static_cast<Qt4SymbianTarget *>(parent);
     return new S60EmulatorRunConfiguration(t, QString());
 }
 
 QStringList S60EmulatorRunConfigurationFactory::availableCreationIds(Target *parent) const
 {
-    Qt4Target * t(qobject_cast<Qt4Target *>(parent));
+    Qt4SymbianTarget *t = qobject_cast<Qt4SymbianTarget *>(parent);
     if (!t ||
         t->id() != QLatin1String(Constants::S60_EMULATOR_TARGET_ID))
         return QStringList();
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.h b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.h
index b2a8faee71c1953e32e1308af0a6b89b935394ee..d81e7d2f1780fa6617dc38c74bbc7120fc82c05d 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.h
+++ b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.h
@@ -51,9 +51,10 @@ class DetailsWidget;
 
 namespace Qt4ProjectManager {
 class Qt4Project;
-class Qt4Target;
+class Qt4BaseTarget;
 
 namespace Internal {
+class Qt4SymbianTarget;
 class Qt4ProFileNode;
 class S60EmulatorRunConfigurationFactory;
 
@@ -63,10 +64,10 @@ class S60EmulatorRunConfiguration : public ProjectExplorer::RunConfiguration
     friend class S60EmulatorRunConfigurationFactory;
 
 public:
-    S60EmulatorRunConfiguration(Qt4ProjectManager::Qt4Target *parent, const QString &proFilePath);
+    S60EmulatorRunConfiguration(Qt4ProjectManager::Qt4BaseTarget *parent, const QString &proFilePath);
     virtual ~S60EmulatorRunConfiguration();
 
-    Qt4Target *qt4Target() const;
+    Qt4SymbianTarget *qt4Target() const;
 
     using ProjectExplorer::RunConfiguration::isEnabled;
     bool isEnabled(ProjectExplorer::BuildConfiguration *configuration) const;
@@ -78,6 +79,8 @@ public:
 
     QVariantMap toMap() const;
 
+    QString proFilePath() const;
+
 signals:
     void targetInformationChanged();
 
@@ -86,7 +89,7 @@ private slots:
     void proFileInvalidated(Qt4ProjectManager::Internal::Qt4ProFileNode *pro);
 
 protected:
-    S60EmulatorRunConfiguration(Qt4ProjectManager::Qt4Target *parent, S60EmulatorRunConfiguration *source);
+    S60EmulatorRunConfiguration(Qt4ProjectManager::Qt4BaseTarget *parent, S60EmulatorRunConfiguration *source);
     virtual bool fromMap(const QVariantMap &map);
 
 private:
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60manager.cpp b/src/plugins/qt4projectmanager/qt-s60/s60manager.cpp
index e3fb186b257311d08cee3dcb9a9693e8d99b3d71..cafee45fb76c29fd46889e1b2aeac33a3edd714e 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60manager.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/s60manager.cpp
@@ -42,6 +42,7 @@
 #include "s60devicerunconfiguration.h"
 #include "s60createpackagestep.h"
 #include "s60deploystep.h"
+#include "qt4symbiantargetfactory.h"
 
 #include <symbianutils/symbiandevicemanager.h>
 
@@ -130,6 +131,8 @@ S60Manager::S60Manager(QObject *parent)
                                             S60DeviceRunConfiguration>
                                             (QLatin1String(Debugger::Constants::DEBUGMODE),
                                              tr("Debug on Device"), parent));
+    addAutoReleasedObject(new Qt4SymbianTargetFactory);
+
     updateQtVersions();
     connect(m_devices, SIGNAL(qtVersionsChanged()),
             this, SLOT(updateQtVersions()));
diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
index e94a77124e15b8cfc6fd150494dfb407fe059b5d..d8b399eaf4c27c000466d67df0ea070f9b802d6a 100644
--- a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp
@@ -67,7 +67,7 @@ const char * const QT_VERSION_ID_KEY("Qt4ProjectManager.Qt4BuildConfiguration.Qt
 enum { debug = 0 };
 }
 
-Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4Target *target) :
+Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4BaseTarget *target) :
     BuildConfiguration(target, QLatin1String(QT4_BC_ID)),
     m_shadowBuild(true),
     m_qtVersionId(-1),
@@ -78,7 +78,7 @@ Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4Target *target) :
     ctor();
 }
 
-Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4Target *target, const QString &id) :
+Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4BaseTarget *target, const QString &id) :
     BuildConfiguration(target, id),
     m_shadowBuild(true),
     m_qtVersionId(-1),
@@ -89,7 +89,7 @@ Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4Target *target, const QString &i
     ctor();
 }
 
-Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4Target *target, Qt4BuildConfiguration *source) :
+Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4BaseTarget *target, Qt4BuildConfiguration *source) :
     BuildConfiguration(target, source),
     m_shadowBuild(source->m_shadowBuild),
     m_buildDirectory(source->m_buildDirectory),
@@ -205,9 +205,9 @@ void Qt4BuildConfiguration::pickValidQtVersion()
         setQtVersion(QtVersionManager::instance()->emptyVersion());
 }
 
-Qt4Target *Qt4BuildConfiguration::qt4Target() const
+Qt4BaseTarget *Qt4BuildConfiguration::qt4Target() const
 {
-    return static_cast<Qt4Target *>(target());
+    return static_cast<Qt4BaseTarget *>(target());
 }
 
 Utils::Environment Qt4BuildConfiguration::baseEnvironment() const
@@ -687,7 +687,7 @@ void Qt4BuildConfigurationFactory::update()
 
 QStringList Qt4BuildConfigurationFactory::availableCreationIds(ProjectExplorer::Target *parent) const
 {
-    if (!qobject_cast<Qt4Target *>(parent))
+    if (!qobject_cast<Qt4BaseTarget *>(parent))
         return QStringList();
 
     QStringList results;
@@ -709,7 +709,7 @@ QString Qt4BuildConfigurationFactory::displayNameForId(const QString &id) const
 
 bool Qt4BuildConfigurationFactory::canCreate(ProjectExplorer::Target *parent, const QString &id) const
 {
-    if (!qobject_cast<Qt4Target *>(parent))
+    if (!qobject_cast<Qt4BaseTarget *>(parent))
         return false;
     if (!m_versions.contains(id))
         return false;
@@ -730,7 +730,7 @@ BuildConfiguration *Qt4BuildConfigurationFactory::create(ProjectExplorer::Target
     QtVersion *version = QtVersionManager::instance()->version(info.versionId);
     Q_ASSERT(version);
 
-    Qt4Target *qt4Target = static_cast<Qt4Target *>(parent);
+    Qt4BaseTarget *qt4Target = static_cast<Qt4BaseTarget *>(parent);
 
     bool ok;
     QString buildConfigurationName = QInputDialog::getText(0,
@@ -757,7 +757,7 @@ BuildConfiguration *Qt4BuildConfigurationFactory::create(ProjectExplorer::Target
 
 bool Qt4BuildConfigurationFactory::canClone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const
 {
-    if (!qobject_cast<Qt4Target *>(parent))
+    if (!qobject_cast<Qt4BaseTarget *>(parent))
         return false;
     Qt4BuildConfiguration *qt4bc(qobject_cast<Qt4BuildConfiguration *>(source));
     if (!qt4bc)
@@ -774,15 +774,15 @@ BuildConfiguration *Qt4BuildConfigurationFactory::clone(Target *parent, BuildCon
 {
     if (!canClone(parent, source))
         return 0;
-    Qt4Target *target(static_cast<Qt4Target *>(parent));
+    Qt4BaseTarget *target = static_cast<Qt4BaseTarget *>(parent);
     Qt4BuildConfiguration *oldbc(static_cast<Qt4BuildConfiguration *>(source));
     return new Qt4BuildConfiguration(target, oldbc);
 }
 
 bool Qt4BuildConfigurationFactory::canRestore(Target *parent, const QVariantMap &map) const
 {
-    QString id(ProjectExplorer::idFromMap(map));
-    if (!qobject_cast<Qt4Target *>(parent))
+    QString id = ProjectExplorer::idFromMap(map);
+    if (!qobject_cast<Qt4BaseTarget *>(parent))
         return false;
     return id.startsWith(QLatin1String(QT4_BC_ID_PREFIX)) ||
            id == QLatin1String(QT4_BC_ID);
@@ -792,8 +792,8 @@ BuildConfiguration *Qt4BuildConfigurationFactory::restore(Target *parent, const
 {
     if (!canRestore(parent, map))
         return 0;
-    Qt4Target *target(static_cast<Qt4Target *>(parent));
-    Qt4BuildConfiguration *bc(new Qt4BuildConfiguration(target));
+    Qt4BaseTarget *target = static_cast<Qt4BaseTarget *>(parent);
+    Qt4BuildConfiguration *bc = new Qt4BuildConfiguration(target);
     if (bc->fromMap(map))
         return bc;
     delete bc;
diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.h b/src/plugins/qt4projectmanager/qt4buildconfiguration.h
index 449dfa1ef54b39ee7bf7bdc494656d662363ca9a..b7bf7c63928f76958c697ebe1efceaea6d2d61ff 100644
--- a/src/plugins/qt4projectmanager/qt4buildconfiguration.h
+++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.h
@@ -47,7 +47,7 @@ namespace Qt4ProjectManager {
 
 class QMakeStep;
 class MakeStep;
-class Qt4Target;
+class Qt4BaseTarget;
 
 namespace Internal {
 class Qt4ProFileNode;
@@ -60,10 +60,10 @@ class Qt4BuildConfiguration : public ProjectExplorer::BuildConfiguration
     friend class Internal::Qt4BuildConfigurationFactory;
 
 public:
-    explicit Qt4BuildConfiguration(Qt4Target *target);
+    explicit Qt4BuildConfiguration(Qt4BaseTarget *target);
     virtual ~Qt4BuildConfiguration();
 
-    Qt4Target *qt4Target() const;
+    Qt4BaseTarget *qt4Target() const;
 
     virtual Utils::Environment baseEnvironment() const;
 
@@ -150,8 +150,8 @@ private slots:
     void emitBuildDirectoryChanged();
 
 protected:
-    Qt4BuildConfiguration(Qt4Target *target, Qt4BuildConfiguration *source);
-    Qt4BuildConfiguration(Qt4Target *target, const QString &id);
+    Qt4BuildConfiguration(Qt4BaseTarget *target, Qt4BuildConfiguration *source);
+    Qt4BuildConfiguration(Qt4BaseTarget *target, const QString &id);
     virtual bool fromMap(const QVariantMap &map);
 
 private:
diff --git a/src/plugins/qt4projectmanager/qt4deployconfiguration.cpp b/src/plugins/qt4projectmanager/qt4deployconfiguration.cpp
deleted file mode 100644
index 7495f9e2c519e3dc866f1210d1bc0bfb8aa8c029..0000000000000000000000000000000000000000
--- a/src/plugins/qt4projectmanager/qt4deployconfiguration.cpp
+++ /dev/null
@@ -1,109 +0,0 @@
-/**************************************************************************
-**
-** This file is part of Qt Creator
-**
-** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
-**
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** No Commercial Usage
-**
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-**
-** Alternatively, 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.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**************************************************************************/
-
-#include "qt4deployconfiguration.h"
-
-#include "qt4projectmanagerconstants.h"
-#include "qt4target.h"
-#include "qt-maemo/maemodeploystep.h"
-#include "qt-maemo/maemopackagecreationstep.h"
-#include "qt-s60/s60createpackagestep.h"
-#include "qt-s60/s60deploystep.h"
-#include "qt-s60/s60deployconfiguration.h"
-
-#include <projectexplorer/buildsteplist.h>
-#include <projectexplorer/target.h>
-
-using namespace Qt4ProjectManager;
-using namespace Qt4ProjectManager::Internal;
-
-Qt4DeployConfigurationFactory::Qt4DeployConfigurationFactory(QObject *parent) :
-    ProjectExplorer::DeployConfigurationFactory(parent),
-    m_s60DeployConfigurationFactory(new S60DeployConfigurationFactory(this))
-{ }
-
-ProjectExplorer::DeployConfiguration *Qt4DeployConfigurationFactory::create(ProjectExplorer::Target *parent, const QString &id)
-{
-    ProjectExplorer::DeployConfiguration *dc = 0;
-    if (parent->id() == QLatin1String(Constants::S60_DEVICE_TARGET_ID))
-        dc = m_s60DeployConfigurationFactory->create(parent, id);
-    else
-        dc = ProjectExplorer::DeployConfigurationFactory::create(parent, id);
-
-    if (!dc)
-        return 0;
-
-    if (parent->id() == Constants::S60_DEVICE_TARGET_ID) {
-        dc->setDefaultDisplayName(tr("Deploy to Symbian device"));
-        dc->stepList()->insertStep(0, new S60CreatePackageStep(dc->stepList()));
-        dc->stepList()->insertStep(1, new S60DeployStep(dc->stepList()));
-    } else if (parent->id() == Constants::MAEMO_DEVICE_TARGET_ID) {
-        dc->setDefaultDisplayName(tr("Deploy to Maemo device"));
-        dc->stepList()->insertStep(0, new MaemoPackageCreationStep(dc->stepList()));
-        dc->stepList()->insertStep(1, new MaemoDeployStep(dc->stepList()));
-    }
-
-    return dc;
-}
-
-bool Qt4DeployConfigurationFactory::canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const
-{
-    if (parent->id() == Constants::S60_DEVICE_TARGET_ID)
-        return m_s60DeployConfigurationFactory->canRestore(parent, map);
-    else
-        return ProjectExplorer::DeployConfigurationFactory::canRestore(parent, map);
-}
-
-ProjectExplorer::DeployConfiguration *Qt4DeployConfigurationFactory::restore(ProjectExplorer::Target *parent, const QVariantMap &map)
-{
-    if (parent->id() == Constants::S60_DEVICE_TARGET_ID)
-        return m_s60DeployConfigurationFactory->restore(parent, map);
-    else
-        return ProjectExplorer::DeployConfigurationFactory::restore(parent, map);
-}
-
-bool Qt4DeployConfigurationFactory::canClone(ProjectExplorer::Target *parent, ProjectExplorer::DeployConfiguration *product) const
-{
-    if (parent->id() == Constants::S60_DEVICE_TARGET_ID)
-        return m_s60DeployConfigurationFactory->canClone(parent, product);
-    else
-        return ProjectExplorer::DeployConfigurationFactory::canClone(parent, product);
-}
-
-ProjectExplorer::DeployConfiguration *Qt4DeployConfigurationFactory::clone(ProjectExplorer::Target *parent, ProjectExplorer::DeployConfiguration *product)
-{
-    if (parent->id() == Constants::S60_DEVICE_TARGET_ID)
-        return m_s60DeployConfigurationFactory->clone(parent, product);
-    else
-        return ProjectExplorer::DeployConfigurationFactory::clone(parent, product);
-}
diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp
index fab6f8c7c94ff463f5b373f6aaf7051a64fe75f7..6a29d15103a00bdccd800f28c82020b4b32841bf 100644
--- a/src/plugins/qt4projectmanager/qt4project.cpp
+++ b/src/plugins/qt4projectmanager/qt4project.cpp
@@ -37,7 +37,6 @@
 #include "qt4projectmanager.h"
 #include "makestep.h"
 #include "qmakestep.h"
-#include "qt4runconfiguration.h"
 #include "qt4nodes.h"
 #include "qt4projectconfigwidget.h"
 #include "qt4projectmanagerconstants.h"
@@ -264,8 +263,6 @@ Qt4Project::Qt4Project(Qt4Manager *manager, const QString& fileName) :
     m_asyncUpdateTimer.setSingleShot(true);
     m_asyncUpdateTimer.setInterval(3000);
     connect(&m_asyncUpdateTimer, SIGNAL(timeout()), this, SLOT(asyncUpdate()));
-
-    setSupportedTargetIds(QtVersionManager::instance()->supportedTargetIds());
 }
 
 Qt4Project::~Qt4Project()
@@ -327,14 +324,12 @@ bool Qt4Project::fromMap(const QVariantMap &map)
     // This might be incorrect, need a full update
     updateCodeModels();
 
-    createApplicationProjects();
+    foreach (Target *t, targets())
+        static_cast<Qt4BaseTarget *>(t)->createApplicationProFiles();
 
     foreach (Target *t, targets())
         onAddedTarget(t);
 
-    setSupportedTargetIds(QtVersionManager::instance()->supportedTargetIds());
-
-
     connect(m_nodesWatcher, SIGNAL(proFileUpdated(Qt4ProjectManager::Internal::Qt4ProFileNode*,bool)),
             this, SIGNAL(proFileUpdated(Qt4ProjectManager::Internal::Qt4ProFileNode *,bool)));
 
@@ -349,32 +344,29 @@ bool Qt4Project::fromMap(const QVariantMap &map)
     connect(this, SIGNAL(addedTarget(ProjectExplorer::Target*)),
             this, SLOT(onAddedTarget(ProjectExplorer::Target*)));
 
-    connect(QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>)),
-            this, SLOT(qtVersionsChanged()));
-
     connect(this, SIGNAL(activeTargetChanged(ProjectExplorer::Target*)),
             this, SLOT(activeTargetWasChanged()));
 
     return true;
 }
 
-Qt4Target *Qt4Project::activeTarget() const
+Qt4BaseTarget *Qt4Project::activeTarget() const
 {
-    return static_cast<Qt4Target *>(Project::activeTarget());
+    return static_cast<Qt4BaseTarget *>(Project::activeTarget());
 }
 
 void Qt4Project::onAddedTarget(ProjectExplorer::Target *t)
 {
     Q_ASSERT(t);
-    Qt4Target *qt4target = qobject_cast<Qt4Target *>(t);
+    Qt4BaseTarget *qt4target = qobject_cast<Qt4BaseTarget *>(t);
     Q_ASSERT(qt4target);
     connect(qt4target, SIGNAL(buildDirectoryInitialized()),
             this, SIGNAL(buildDirectoryInitialized()));
-    connect(qt4target, SIGNAL(proFileEvaluateNeeded(Qt4ProjectManager::Qt4Target*)),
-            this, SLOT(proFileEvaluateNeeded(Qt4ProjectManager::Qt4Target*)));
+    connect(qt4target, SIGNAL(proFileEvaluateNeeded(Qt4ProjectManager::Qt4BaseTarget*)),
+            this, SLOT(proFileEvaluateNeeded(Qt4ProjectManager::Qt4BaseTarget*)));
 }
 
-void Qt4Project::proFileEvaluateNeeded(Qt4ProjectManager::Qt4Target *target)
+void Qt4Project::proFileEvaluateNeeded(Qt4ProjectManager::Qt4BaseTarget *target)
 {
     if (activeTarget() == target)
         scheduleAsyncUpdate();
@@ -606,11 +598,6 @@ void Qt4Project::updateQmlJSCodeModel()
     modelManager->updateProjectInfo(projectInfo);
 }
 
-void Qt4Project::qtVersionsChanged()
-{
-    setSupportedTargetIds(QtVersionManager::instance()->supportedTargetIds());
-}
-
 ///*!
 //  Updates complete project
 //  */
@@ -763,6 +750,8 @@ void Qt4Project::decrementPendingEvaluateFutures()
             m_asyncUpdateTimer.start();
         } else  if (m_asyncUpdateState != ShuttingDown){
             // After being done, we need to call:
+            foreach (Target *t, targets())
+                static_cast<Qt4BaseTarget *>(t)->createApplicationProFiles();
             updateFileList();
             updateCodeModels();
             if (debug)
@@ -1000,51 +989,6 @@ void Qt4Project::collectApplicationProFiles(QList<Qt4ProFileNode *> &list, Qt4Pr
     }
 }
 
-void Qt4Project::createApplicationProjects()
-{
-    foreach (Target *target, targets()) {
-        if (target->runConfigurations().count()) {
-            // Remove all run configurations which the new project wizard created
-            QList<RunConfiguration*> toRemove;
-            foreach (RunConfiguration * rc, target->runConfigurations()) {
-                CustomExecutableRunConfiguration *cerc = qobject_cast<CustomExecutableRunConfiguration *>(rc);
-                if (cerc && !cerc->isConfigured())
-                    toRemove.append(rc);
-            }
-            foreach (RunConfiguration *rc, toRemove)
-                target->removeRunConfiguration(rc);
-        }
-
-        // We use the list twice
-        QList<Qt4ProFileNode *> profiles = applicationProFiles();
-        QStringList paths;
-        foreach (Qt4ProFileNode *pro, profiles)
-            paths << pro->path();
-
-        foreach (RunConfiguration *rc, target->runConfigurations()) {
-            if (Qt4RunConfiguration *qt4rc = qobject_cast<Qt4RunConfiguration *>(rc)) {
-                if (!paths.contains(qt4rc->proFilePath())) {
-                    // A deleted .pro file? or a change template
-                    // We do remove those though
-                    target->removeRunConfiguration(rc);
-                }
-            }
-        }
-
-        // Only add new runconfigurations if there are none.
-        if (target->runConfigurations().isEmpty()) {
-            Qt4Target *qt4Target = static_cast<Qt4Target *>(target);
-            foreach (Qt4ProFileNode *qt4proFile, profiles) {
-                qt4Target->addRunConfigurationForPath(qt4proFile->path());
-            }
-        }
-        // Oh still none? Add a custom executable runconfiguration
-        if (target->runConfigurations().isEmpty()) {
-            target->addRunConfiguration(new ProjectExplorer::CustomExecutableRunConfiguration(target));
-        }
-    }
-}
-
 QList<Qt4ProFileNode *> Qt4Project::leafProFiles() const
 {
     QList<Qt4ProFileNode *> list;
diff --git a/src/plugins/qt4projectmanager/qt4project.h b/src/plugins/qt4projectmanager/qt4project.h
index f20cdeb7be23e568a5f7c6ab31df887ab312502e..f75a3d97d34fc3a24b6d3cf3248d52ab6961ff5b 100644
--- a/src/plugins/qt4projectmanager/qt4project.h
+++ b/src/plugins/qt4projectmanager/qt4project.h
@@ -59,7 +59,6 @@ namespace Internal {
     class FileItem;
     class Qt4ProFileNode;
     class Qt4PriFileNode;
-    class Qt4RunConfiguration;
     class GCCPreprocessor;
     struct Qt4ProjectFiles;
     class Qt4ProjectConfigWidget;
@@ -155,7 +154,7 @@ public:
     ProjectExplorer::IProjectManager *projectManager() const;
     Qt4Manager *qt4ProjectManager() const;
 
-    Qt4Target *activeTarget() const;
+    Qt4BaseTarget *activeTarget() const;
 
     QList<Core::IFile *> dependencies();     //NBS remove
     QList<ProjectExplorer::Project *>dependsOn();
@@ -210,18 +209,16 @@ protected:
     virtual bool fromMap(const QVariantMap &map);
 
 private slots:
-    void proFileEvaluateNeeded(Qt4ProjectManager::Qt4Target *target);
+    void proFileEvaluateNeeded(Qt4ProjectManager::Qt4BaseTarget *target);
 
     void asyncUpdate();
 
-    void qtVersionsChanged();
     void onAddedTarget(ProjectExplorer::Target *t);
     void activeTargetWasChanged();
 
 private:
     void scheduleAsyncUpdate();
 
-    void createApplicationProjects();
     void updateCodeModels();
     void updateCppCodeModel();
     void updateQmlJSCodeModel();
@@ -273,4 +270,5 @@ private:
 
 } // namespace Qt4ProjectManager
 
+
 #endif // QT4PROJECT_H
diff --git a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp
index 43cf95e18c35cc4b88dff5be23ffcc1ae8685262..cb25702b00071cbe4c7b8b769d222fe61cba641b 100644
--- a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp
+++ b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp
@@ -63,7 +63,7 @@ using namespace Qt4ProjectManager;
 using namespace Qt4ProjectManager::Internal;
 using ProjectExplorer::ToolChain;
 
-Qt4ProjectConfigWidget::Qt4ProjectConfigWidget(Qt4Target *target)
+Qt4ProjectConfigWidget::Qt4ProjectConfigWidget(Qt4BaseTarget *target)
     : BuildConfigWidget(),
       m_buildConfiguration(0),
       m_ignoreChange(false)
diff --git a/src/plugins/qt4projectmanager/qt4projectconfigwidget.h b/src/plugins/qt4projectmanager/qt4projectconfigwidget.h
index 2e01e2a9858f17b95328edc6dce345cb19ebe60c..cf2227bb87ebc2df881af1a461eb80551f428a9b 100644
--- a/src/plugins/qt4projectmanager/qt4projectconfigwidget.h
+++ b/src/plugins/qt4projectmanager/qt4projectconfigwidget.h
@@ -45,7 +45,7 @@ namespace Utils {
 }
 
 namespace Qt4ProjectManager {
-class Qt4Target;
+class Qt4BaseTarget;
 class Qt4BuildConfiguration;
 class Qt4Target;
 
@@ -58,7 +58,7 @@ class Qt4ProjectConfigWidget : public ProjectExplorer::BuildConfigWidget
 {
     Q_OBJECT
 public:
-    explicit Qt4ProjectConfigWidget(Qt4Target *target);
+    explicit Qt4ProjectConfigWidget(Qt4BaseTarget *target);
     ~Qt4ProjectConfigWidget();
 
     QString displayName() const;
diff --git a/src/plugins/qt4projectmanager/qt4projectmanager.pro b/src/plugins/qt4projectmanager/qt4projectmanager.pro
index 9e221211fdc7452795ee7e9948f780ed5f421f73..298a0259ba4a1cbaec6721ff0c950602593e0544 100644
--- a/src/plugins/qt4projectmanager/qt4projectmanager.pro
+++ b/src/plugins/qt4projectmanager/qt4projectmanager.pro
@@ -4,7 +4,7 @@ DEFINES += QT_CREATOR QT4PROJECTMANAGER_LIBRARY
 QT += network
 include(../../qtcreatorplugin.pri)
 include(qt4projectmanager_dependencies.pri)
-HEADERS += qt4deployconfiguration.h \
+HEADERS += \
     qtparser.h \
     qt4projectmanagerplugin.h \
     qt4projectmanager.h \
@@ -46,7 +46,6 @@ HEADERS += qt4deployconfiguration.h \
     qt4projectmanagerconstants.h \
     makestep.h \
     qmakestep.h \
-    qt4runconfiguration.h \
     qtmodulesinfo.h \
     qt4projectconfigwidget.h \
     projectloadwizard.h \
@@ -69,7 +68,6 @@ HEADERS += qt4deployconfiguration.h \
     profilecompletion.h \
     profilekeywords.h
 SOURCES += qt4projectmanagerplugin.cpp \
-    qt4deployconfiguration.cpp \
     qtparser.cpp \
     qt4projectmanager.cpp \
     qt4project.cpp \
@@ -109,7 +107,6 @@ SOURCES += qt4projectmanagerplugin.cpp \
     wizards/subdirsprojectwizarddialog.cpp \
     makestep.cpp \
     qmakestep.cpp \
-    qt4runconfiguration.cpp \
     qtmodulesinfo.cpp \
     qt4projectconfigwidget.cpp \
     projectloadwizard.cpp \
@@ -146,10 +143,13 @@ FORMS += makestep.ui \
     librarydetailswidget.ui
 RESOURCES += qt4projectmanager.qrc \
     wizards/wizards.qrc
+
 DEFINES += PROPARSER_THREAD_SAFE PROEVALUATOR_THREAD_SAFE
 include(../../shared/proparser/proparser.pri)
 include(qt-s60/qt-s60.pri)
 include(qt-maemo/qt-maemo.pri)
+include(qt-desktop/qt-desktop.pri)
 include(customwidgetwizard/customwidgetwizard.pri)
+
 DEFINES += QT_NO_CAST_TO_ASCII
 OTHER_FILES += Qt4ProjectManager.mimetypes.xml
diff --git a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp
index a92fe593e295d05a7987fee2be623199d287e23d..7ed77f57bf6a1672a489c7aba3c3b8838432079c 100644
--- a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp
+++ b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp
@@ -48,7 +48,6 @@
 #include "profileeditorfactory.h"
 #include "qt4projectmanagerconstants.h"
 #include "qt4project.h"
-#include "qt4runconfiguration.h"
 #include "profileeditor.h"
 #include "profilereader.h"
 #include "qtversionmanager.h"
@@ -59,6 +58,9 @@
 
 #include "qt-maemo/maemomanager.h"
 #include "qt-s60/s60manager.h"
+#include "qt-desktop/qt4desktoptargetfactory.h"
+#include "qt-desktop/qt4simulatortargetfactory.h"
+#include "qt-desktop/qt4runconfiguration.h"
 
 #include <coreplugin/uniqueidmanager.h>
 #include <coreplugin/icore.h>
@@ -151,7 +153,6 @@ bool Qt4ProjectManagerPlugin::initialize(const QStringList &arguments, QString *
     addAutoReleasedObject(new QMakeStepFactory);
     addAutoReleasedObject(new MakeStepFactory);
 
-    addAutoReleasedObject(new Qt4TargetFactory);
     addAutoReleasedObject(new Qt4RunConfigurationFactory);
 
 #ifdef Q_OS_MAC
@@ -164,6 +165,9 @@ bool Qt4ProjectManagerPlugin::initialize(const QStringList &arguments, QString *
     addAutoReleasedObject(new S60Manager);
     addAutoReleasedObject(new MaemoManager);
 
+    addAutoReleasedObject(new Qt4DesktopTargetFactory);
+    addAutoReleasedObject(new Qt4SimulatorTargetFactory);
+
     ProFileCompletion *completion = new ProFileCompletion;
     addAutoReleasedObject(completion);
     // Set completion settings and keep them up to date
diff --git a/src/plugins/qt4projectmanager/qt4target.cpp b/src/plugins/qt4projectmanager/qt4target.cpp
index ecc01b744f29b0d2d235e36b82835db7a46e1948..f966894a303f65ba03a9ee34e458e0164fc7a694 100644
--- a/src/plugins/qt4projectmanager/qt4target.cpp
+++ b/src/plugins/qt4projectmanager/qt4target.cpp
@@ -34,274 +34,115 @@
 #include "qt4target.h"
 
 #include "makestep.h"
-#include "profilereader.h"
 #include "qmakestep.h"
-#include "qt4deployconfiguration.h"
 #include "qt4project.h"
-#include "qt4runconfiguration.h"
 #include "qt4projectmanagerconstants.h"
-#include "qt-maemo/maemodeploystep.h"
-#include "qt-maemo/maemopackagecreationstep.h"
-#include "qt-maemo/maemorunconfiguration.h"
-#include "qt-s60/s60deployconfiguration.h"
-#include "qt-s60/s60devicerunconfiguration.h"
-#include "qt-s60/s60emulatorrunconfiguration.h"
-#include "qt-s60/s60createpackagestep.h"
-#include "qt-s60/s60deploystep.h"
 #include "qt4projectconfigwidget.h"
 
+#include <extensionsystem/pluginmanager.h>
 #include <projectexplorer/buildsteplist.h>
+#include <projectexplorer/runconfiguration.h>
 #include <projectexplorer/customexecutablerunconfiguration.h>
-#include <projectexplorer/toolchaintype.h>
 #include <projectexplorer/projectexplorerconstants.h>
-#include <coreplugin/coreconstants.h>
-#include <symbianutils/symbiandevicemanager.h>
 
-#include <QtGui/QApplication>
-#include <QtGui/QPixmap>
-#include <QtGui/QPainter>
-
-using namespace ProjectExplorer;
 using namespace Qt4ProjectManager;
 using namespace Qt4ProjectManager::Internal;
 
-namespace {
-
-QString displayNameForId(const QString &id) {
-    if (id == QLatin1String(Qt4ProjectManager::Constants::DESKTOP_TARGET_ID))
-        return QApplication::translate("Qt4ProjectManager::Internal::Qt4Target", "Desktop", "Qt4 Desktop target display name");
-    if (id == QLatin1String(Qt4ProjectManager::Constants::S60_EMULATOR_TARGET_ID))
-        return QApplication::translate("Qt4ProjectManager::Internal::Qt4Target", "Symbian Emulator", "Qt4 Symbian Emulator target display name");
-    if (id == QLatin1String(Qt4ProjectManager::Constants::S60_DEVICE_TARGET_ID))
-        return QApplication::translate("Qt4ProjectManager::Internal::Qt4Target", "Symbian Device", "Qt4 Symbian Device target display name");
-    if (id == QLatin1String(Qt4ProjectManager::Constants::MAEMO_DEVICE_TARGET_ID))
-        return QApplication::translate("Qt4ProjectManager::Internal::Qt4Target", "Maemo", "Qt4 Maemo target display name");
-    if (id == QLatin1String(Qt4ProjectManager::Constants::QT_SIMULATOR_TARGET_ID))
-        return QApplication::translate("Qt4ProjectManager::Internal::Qt4Target", "Qt Simulator", "Qt4 Simulator target display name");
-    return QString();
-}
-
-QIcon iconForId(const QString &id) {
-    if (id == QLatin1String(Qt4ProjectManager::Constants::DESKTOP_TARGET_ID))
-        return QIcon(qApp->style()->standardIcon(QStyle::SP_ComputerIcon));
-    if (id == QLatin1String(Qt4ProjectManager::Constants::S60_EMULATOR_TARGET_ID))
-        return QIcon(QLatin1String(":/projectexplorer/images/SymbianEmulator.png"));
-    if (id == QLatin1String(Qt4ProjectManager::Constants::S60_DEVICE_TARGET_ID))
-        return QIcon(QLatin1String(":/projectexplorer/images/SymbianDevice.png"));
-    if (id == QLatin1String(Qt4ProjectManager::Constants::MAEMO_DEVICE_TARGET_ID))
-        return QIcon(QLatin1String(":/projectexplorer/images/MaemoDevice.png"));
-    if (id == QLatin1String(Qt4ProjectManager::Constants::QT_SIMULATOR_TARGET_ID))
-        return QIcon(QLatin1String(":/projectexplorer/images/SymbianEmulator.png"));
-    return QIcon();
-}
-
-} // namespace
-
 // -------------------------------------------------------------------------
-// Qt4TargetFactory
+// Qt4BaseTargetFactory
 // -------------------------------------------------------------------------
 
-Qt4TargetFactory::Qt4TargetFactory(QObject *parent) :
+Qt4BaseTargetFactory::Qt4BaseTargetFactory(QObject *parent) :
     ITargetFactory(parent)
 {
-    connect(QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>)),
-            this, SIGNAL(availableCreationIdsChanged()));
-}
-
-Qt4TargetFactory::~Qt4TargetFactory()
-{
-}
-
-bool Qt4TargetFactory::supportsTargetId(const QString &id) const
-{
-    QSet<QString> ids;
-    ids << QLatin1String("Qt4ProjectManager.Target.DesktopTarget")
-        << QLatin1String("Qt4ProjectManager.Target.S60EmulatorTarget")
-        << QLatin1String("Qt4ProjectManager.Target.S60DeviceTarget")
-        << QLatin1String("Qt4ProjectManager.Target.MaemoDeviceTarget")
-        << QLatin1String("Qt4ProjectManager.Target.QtSimulatorTarget");
-    return ids.contains(id);
-}
-
-QStringList Qt4TargetFactory::availableCreationIds(ProjectExplorer::Project *parent) const
-{
-    if (!qobject_cast<Qt4Project *>(parent))
-        return QStringList();
 
-    QSet<QString> ids;
-    ids << QLatin1String("Qt4ProjectManager.Target.DesktopTarget")
-        << QLatin1String("Qt4ProjectManager.Target.S60EmulatorTarget")
-        << QLatin1String("Qt4ProjectManager.Target.S60DeviceTarget")
-        << QLatin1String("Qt4ProjectManager.Target.MaemoDeviceTarget")
-        << QLatin1String("Qt4ProjectManager.Target.QtSimulatorTarget");
-
-
-    return parent->possibleTargetIds().intersect(ids).toList();
-}
-
-QString Qt4TargetFactory::displayNameForId(const QString &id) const
-{
-    return ::displayNameForId(id);
 }
 
-bool Qt4TargetFactory::canCreate(ProjectExplorer::Project *parent, const QString &id) const
+Qt4BaseTargetFactory::~Qt4BaseTargetFactory()
 {
-    if (!qobject_cast<Qt4Project *>(parent))
-        return false;
-
-    return parent->canAddTarget(id);
-}
 
-Qt4Target *Qt4TargetFactory::create(ProjectExplorer::Project *parent, const QString &id)
-{
-    QList<QtVersion *> knownVersions = QtVersionManager::instance()->versionsForTargetId(id);
-    if (knownVersions.count() > 1)
-        knownVersions = knownVersions.mid(0, 1);
-    return create(parent, id, knownVersions);
 }
 
-Qt4Target *Qt4TargetFactory::create(ProjectExplorer::Project *parent, const QString &id, QList<QtVersion *> versions)
+Qt4BaseTargetFactory *Qt4BaseTargetFactory::qt4BaseTargetFactoryForId(const QString &id)
 {
-    QList<BuildConfigurationInfo> infos;
-    foreach (QtVersion *version, versions) {
-        bool buildAll = false;
-        if (version && version->isValid() && (version->defaultBuildConfig() & QtVersion::BuildAll))
-            buildAll = true;
-
-        if (buildAll) {
-            infos.append(BuildConfigurationInfo(version, QtVersion::BuildAll | QtVersion::DebugBuild));
-            infos.append(BuildConfigurationInfo(version, QtVersion::BuildAll));
-        } else {
-            infos.append(BuildConfigurationInfo(version, QtVersion::DebugBuild));
-            infos.append(BuildConfigurationInfo(version, QtVersion::QmakeBuildConfig(0)));
-        }
-    }
-
-    return create(parent, id, infos);
-}
-
-Qt4Target *Qt4TargetFactory::create(ProjectExplorer::Project *parent, const QString &id, QList<BuildConfigurationInfo> infos)
-{
-    if (!canCreate(parent, id))
-        return 0;
-
-    Qt4Project *qt4project = static_cast<Qt4Project *>(parent);
-    Qt4Target *t = new Qt4Target(qt4project, id);
-
-    QList<QtVersion *> knownVersions(QtVersionManager::instance()->versionsForTargetId(id));
-    if (knownVersions.isEmpty())
-        return t;
-
-    // count Qt versions:
-    int qtVersionCount = 0;
-    {
-        QSet<QtVersion *> differentVersions;
-        foreach (const BuildConfigurationInfo &info, infos) {
-            if (knownVersions.contains(info.version))
-                differentVersions.insert(info.version);
-        }
-        qtVersionCount = differentVersions.count();
+    QList<Qt4BaseTargetFactory *> factories = ExtensionSystem::PluginManager::instance()->getObjects<Qt4BaseTargetFactory>();
+    foreach (Qt4BaseTargetFactory *fac, factories) {
+        if (fac->supportsTargetId(id))
+            return fac;
     }
-
-    // Create Buildconfigurations:
-    foreach (const BuildConfigurationInfo &info, infos) {
-        if (!info.version || !knownVersions.contains(info.version))
-            continue;
-
-        QString displayName;
-
-        if (qtVersionCount > 1)
-            displayName = info.version->displayName() + QChar(' ');
-        displayName.append((info.buildConfig & QtVersion::DebugBuild) ? tr("Debug") : tr("Release"));
-
-        // Skip release builds for the symbian emulator.
-        if (id == QLatin1String(Constants::S60_EMULATOR_TARGET_ID) &&
-            !(info.buildConfig & QtVersion::DebugBuild))
-            continue;
-
-        t->addQt4BuildConfiguration(displayName, info.version, info.buildConfig, info.additionalArguments, info.directory);
-    }
-
-    t->addDeployConfiguration(t->deployConfigurationFactory()->create(t, ProjectExplorer::Constants::DEFAULT_DEPLOYCONFIGURATION_ID));
-
-    // create RunConfigurations:
-    QStringList pathes = qt4project->applicationProFilePathes();
-    foreach (const QString &path, pathes)
-        t->addRunConfigurationForPath(path);
-
-    if (t->runConfigurations().isEmpty())
-        t->addRunConfiguration(new CustomExecutableRunConfiguration(t));
-
-    return t;
-}
-
-bool Qt4TargetFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const
-{
-    return canCreate(parent, ProjectExplorer::idFromMap(map));
-}
-
-Qt4Target *Qt4TargetFactory::restore(ProjectExplorer::Project *parent, const QVariantMap &map)
-{
-    if (!canRestore(parent, map))
-        return 0;
-
-    Qt4Project *qt4project(static_cast<Qt4Project *>(parent));
-    Qt4Target *t(new Qt4Target(qt4project, QLatin1String("transient ID")));
-    if (t->fromMap(map))
-        return t;
-    delete t;
     return 0;
 }
 
 // -------------------------------------------------------------------------
-// Qt4Target
+// Qt4BaseTarget
 // -------------------------------------------------------------------------
 
-Qt4Target::Qt4Target(Qt4Project *parent, const QString &id) :
-    ProjectExplorer::Target(parent, id),
-    m_connectedPixmap(QLatin1String(":/projectexplorer/images/ConnectionOn.png")),
-    m_disconnectedPixmap(QLatin1String(":/projectexplorer/images/ConnectionOff.png")),
-    m_buildConfigurationFactory(new Qt4BuildConfigurationFactory(this)),
-    m_deployConfigurationFactory(new Qt4DeployConfigurationFactory(this))
+Qt4BaseTarget::Qt4BaseTarget(Qt4Project *parent, const QString &id) :
+    ProjectExplorer::Target(parent, id)
 {
-    connect(project(), SIGNAL(supportedTargetIdsChanged()),
-            this, SLOT(updateQtVersion()));
-
     connect(this, SIGNAL(activeBuildConfigurationChanged(ProjectExplorer::BuildConfiguration*)),
             this, SLOT(emitProFileEvaluateNeeded()));
     connect(this, SIGNAL(activeBuildConfigurationChanged(ProjectExplorer::BuildConfiguration*)),
             this, SIGNAL(environmentChanged()));
     connect(this, SIGNAL(addedBuildConfiguration(ProjectExplorer::BuildConfiguration*)),
             this, SLOT(onAddedBuildConfiguration(ProjectExplorer::BuildConfiguration*)));
-    connect(this, SIGNAL(addedDeployConfiguration(ProjectExplorer::DeployConfiguration*)),
-            this, SLOT(onAddedDeployConfiguration(ProjectExplorer::DeployConfiguration*)));
-    connect(this, SIGNAL(activeRunConfigurationChanged(ProjectExplorer::RunConfiguration*)),
-            this, SLOT(updateToolTipAndIcon()));
-
-    setDefaultDisplayName(displayNameForId(id));
-    setIcon(iconForId(id));
 }
 
-Qt4Target::~Qt4Target()
+Qt4BaseTarget::~Qt4BaseTarget()
 {
 }
 
-ProjectExplorer::BuildConfigWidget *Qt4Target::createConfigWidget()
+ProjectExplorer::BuildConfigWidget *Qt4BaseTarget::createConfigWidget()
 {
     return new Qt4ProjectConfigWidget(this);
 }
 
-Qt4BuildConfiguration *Qt4Target::activeBuildConfiguration() const
+Qt4BuildConfiguration *Qt4BaseTarget::activeBuildConfiguration() const
 {
     return static_cast<Qt4BuildConfiguration *>(Target::activeBuildConfiguration());
 }
 
-Qt4Project *Qt4Target::qt4Project() const
+Qt4Project *Qt4BaseTarget::qt4Project() const
 {
     return static_cast<Qt4Project *>(project());
 }
 
-Qt4BuildConfiguration *Qt4Target::addQt4BuildConfiguration(QString displayName, QtVersion *qtversion,
+QList<ProjectExplorer::ToolChainType> Qt4BaseTarget::filterToolChainTypes(const QList<ProjectExplorer::ToolChainType> &candidates) const
+{
+    return candidates;
+}
+
+ProjectExplorer::ToolChainType Qt4BaseTarget::preferredToolChainType(const QList<ProjectExplorer::ToolChainType> &candidates) const
+{
+    ProjectExplorer::ToolChainType preferredType = ProjectExplorer::ToolChain_INVALID;
+    if (!candidates.isEmpty())
+        preferredType = candidates.at(0);
+    return preferredType;
+}
+
+QString Qt4BaseTarget::defaultBuildDirectory() const
+{
+    Qt4BaseTargetFactory *fac = Qt4BaseTargetFactory::qt4BaseTargetFactoryForId(id());
+    return fac->defaultShadowBuildDirectory(qt4Project()->defaultTopLevelBuildDirectory(), id());
+}
+
+void Qt4BaseTarget::removeUnconfiguredCustomExectutableRunConfigurations()
+{
+    if (runConfigurations().count()) {
+        // Remove all run configurations which the new project wizard created
+        QList<ProjectExplorer::RunConfiguration*> toRemove;
+        foreach (ProjectExplorer::RunConfiguration * rc, runConfigurations()) {
+            ProjectExplorer::CustomExecutableRunConfiguration *cerc
+                    = qobject_cast<ProjectExplorer::CustomExecutableRunConfiguration *>(rc);
+            if (cerc && !cerc->isConfigured())
+                toRemove.append(rc);
+        }
+        foreach (ProjectExplorer::RunConfiguration *rc, toRemove)
+            removeRunConfiguration(rc);
+    }
+}
+
+Qt4BuildConfiguration *Qt4BaseTarget::addQt4BuildConfiguration(QString displayName, QtVersion *qtversion,
                                                            QtVersion::QmakeBuildConfigs qmakeBuildConfiguration,
                                                            QString additionalArguments,
                                                            QString directory)
@@ -313,8 +154,8 @@ Qt4BuildConfiguration *Qt4Target::addQt4BuildConfiguration(QString displayName,
     Qt4BuildConfiguration *bc = new Qt4BuildConfiguration(this);
     bc->setDefaultDisplayName(displayName);
 
-    BuildStepList *buildSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD);
-    BuildStepList *cleanSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN);
+    ProjectExplorer::BuildStepList *buildSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD);
+    ProjectExplorer::BuildStepList *cleanSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN);
     Q_ASSERT(buildSteps);
     Q_ASSERT(cleanSteps);
 
@@ -348,103 +189,7 @@ Qt4BuildConfiguration *Qt4Target::addQt4BuildConfiguration(QString displayName,
     return bc;
 }
 
-Qt4BuildConfigurationFactory *Qt4Target::buildConfigurationFactory() const
-{
-    return m_buildConfigurationFactory;
-}
-
-ProjectExplorer::DeployConfigurationFactory *Qt4Target::deployConfigurationFactory() const
-{
-    return m_deployConfigurationFactory;
-}
-
-void Qt4Target::addRunConfigurationForPath(const QString &proFilePath)
-{
-    if (id() == QLatin1String(Constants::DESKTOP_TARGET_ID) ||
-        id() == QLatin1String(Constants::QT_SIMULATOR_TARGET_ID))
-        addRunConfiguration(new Qt4RunConfiguration(this, proFilePath));
-    else if (id() == QLatin1String(Constants::S60_EMULATOR_TARGET_ID))
-        addRunConfiguration(new S60EmulatorRunConfiguration(this, proFilePath));
-    else if (id() == QLatin1String(Constants::S60_DEVICE_TARGET_ID))
-        addRunConfiguration(new S60DeviceRunConfiguration(this, proFilePath));
-    else if (id() == QLatin1String(Constants::MAEMO_DEVICE_TARGET_ID))
-        addRunConfiguration(new MaemoRunConfiguration(this, proFilePath));
-}
-
-QList<ProjectExplorer::ToolChainType> Qt4Target::filterToolChainTypes(const QList<ProjectExplorer::ToolChainType> &candidates) const
-{
-    QList<ProjectExplorer::ToolChainType> tmp(candidates);
-    if (id() == QLatin1String(Constants::S60_EMULATOR_TARGET_ID)) {
-        if (tmp.contains(ProjectExplorer::ToolChain_WINSCW))
-            return QList<ProjectExplorer::ToolChainType>() << ProjectExplorer::ToolChain_WINSCW;
-        else
-            return QList<ProjectExplorer::ToolChainType>();
-    } else if (id() == QLatin1String(Constants::S60_DEVICE_TARGET_ID)) {
-        tmp.removeAll(ProjectExplorer::ToolChain_WINSCW);
-        return tmp;
-    }
-    return tmp;
-}
-
-ProjectExplorer::ToolChainType Qt4Target::preferredToolChainType(const QList<ProjectExplorer::ToolChainType> &candidates) const
-{
-    ProjectExplorer::ToolChainType preferredType = ProjectExplorer::ToolChain_INVALID;
-    if (id() == QLatin1String(Constants::S60_EMULATOR_TARGET_ID) &&
-        candidates.contains(ProjectExplorer::ToolChain_WINSCW))
-        preferredType = ProjectExplorer::ToolChain_WINSCW;
-    if (!candidates.isEmpty())
-        preferredType = candidates.at(0);
-    return preferredType;
-}
-
-QString Qt4Target::defaultBuildDirectory() const
-{
-    if (id() == QLatin1String(Constants::S60_DEVICE_TARGET_ID)
-        || id() == QLatin1String(Constants::S60_EMULATOR_TARGET_ID)
-#if defined(Q_OS_WIN)
-        || id() == QLatin1String(Constants::MAEMO_DEVICE_TARGET_ID)
-#endif
-        )
-        return project()->projectDirectory();
-
-    return defaultShadowBuildDirectory(qt4Project()->defaultTopLevelBuildDirectory(), id());
-}
-
-QString Qt4Target::defaultShadowBuildDirectory(const QString &projectLocation, const QString &id)
-{
-    QString shortName = QLatin1String("unknown");
-    if (id == QLatin1String(Constants::DESKTOP_TARGET_ID))
-        shortName = QLatin1String("desktop");
-    else if (id == QLatin1String(Constants::S60_EMULATOR_TARGET_ID))
-        shortName = QLatin1String("symbian_emulator");
-    else if (id == QLatin1String(Constants::S60_DEVICE_TARGET_ID))
-        shortName = QLatin1String("symbian");
-    else if (id == QLatin1String(Constants::MAEMO_DEVICE_TARGET_ID))
-        shortName = QLatin1String("maemo");
-    else if (id == QLatin1String(Constants::QT_SIMULATOR_TARGET_ID))
-        shortName = QLatin1String("simulator");
-
-    // currently we can't have the build directory to be deeper then the source directory
-    // since that is broken in qmake
-    // Once qmake is fixed we can change that to have a top directory and
-    // subdirectories per build. (Replacing "QChar('-')" with "QChar('/') )
-    return projectLocation + QChar('-') + shortName;
-}
-
-bool Qt4Target::fromMap(const QVariantMap &map)
-{
-    bool success = Target::fromMap(map);
-    setIcon(iconForId(id()));
-    setDefaultDisplayName(displayNameForId(id()));
-    return success;
-}
-
-void Qt4Target::updateQtVersion()
-{
-    setEnabled(project()->supportedTargetIds().contains(id()));
-}
-
-void Qt4Target::onAddedBuildConfiguration(ProjectExplorer::BuildConfiguration *bc)
+void Qt4BaseTarget::onAddedBuildConfiguration(ProjectExplorer::BuildConfiguration *bc)
 {
     Q_ASSERT(bc);
     Qt4BuildConfiguration *qt4bc = qobject_cast<Qt4BuildConfiguration *>(bc);
@@ -455,103 +200,13 @@ void Qt4Target::onAddedBuildConfiguration(ProjectExplorer::BuildConfiguration *b
             this, SLOT(onProFileEvaluateNeeded(Qt4ProjectManager::Qt4BuildConfiguration *)));
 }
 
-void Qt4Target::onAddedDeployConfiguration(ProjectExplorer::DeployConfiguration *dc)
-{
-    Q_ASSERT(dc);
-    S60DeployConfiguration *deployConf(qobject_cast<S60DeployConfiguration *>(dc));
-    if (!deployConf)
-        return;
-    connect(deployConf, SIGNAL(serialPortNameChanged()),
-            this, SLOT(slotUpdateDeviceInformation()));
-    connect(deployConf, SIGNAL(communicationChannelChanged()),
-            this, SLOT(slotUpdateDeviceInformation()));
-    connect(deployConf, SIGNAL(deviceAddressChanged()),
-            this, SLOT(slotUpdateDeviceInformation()));
-    connect(deployConf, SIGNAL(devicePortChanged()),
-            this, SLOT(slotUpdateDeviceInformation()));
-}
-
-void Qt4Target::slotUpdateDeviceInformation()
-{
-    S60DeployConfiguration *dc(qobject_cast<S60DeployConfiguration *>(sender()));
-    if (dc && dc == activeDeployConfiguration()) {
-        updateToolTipAndIcon();
-    }
-}
-
-void Qt4Target::onProFileEvaluateNeeded(Qt4ProjectManager::Qt4BuildConfiguration *bc)
+void Qt4BaseTarget::onProFileEvaluateNeeded(Qt4ProjectManager::Qt4BuildConfiguration *bc)
 {
     if (bc && bc == activeBuildConfiguration())
         emit proFileEvaluateNeeded(this);
 }
 
-void Qt4Target::emitProFileEvaluateNeeded()
+void Qt4BaseTarget::emitProFileEvaluateNeeded()
 {
     emit proFileEvaluateNeeded(this);
 }
-
-void Qt4Target::updateToolTipAndIcon()
-{
-    static const int TARGET_OVERLAY_ORIGINAL_SIZE = 32;
-
-    if (qobject_cast<S60DeployConfiguration *>(activeDeployConfiguration()))  {
-        QPixmap overlay;
-        QString tooltip;
-        if (isSymbianConnectionAvailable(tooltip))
-            overlay = m_connectedPixmap;
-        else
-            overlay = m_disconnectedPixmap;
-        setToolTip(tooltip);
-
-        double factor = Core::Constants::TARGET_ICON_SIZE / (double)TARGET_OVERLAY_ORIGINAL_SIZE;
-        QSize overlaySize(overlay.size().width()*factor, overlay.size().height()*factor);
-        QPixmap pixmap(Core::Constants::TARGET_ICON_SIZE, Core::Constants::TARGET_ICON_SIZE);
-        pixmap.fill(Qt::transparent);
-        QPainter painter(&pixmap);
-        painter.drawPixmap(Core::Constants::TARGET_ICON_SIZE - overlaySize.width(),
-                           Core::Constants::TARGET_ICON_SIZE - overlaySize.height(),
-                           overlay.scaled(overlaySize));
-
-        setOverlayIcon(QIcon(pixmap));
-    } else {
-        setToolTip(QString());
-        setOverlayIcon(QIcon());
-    }
-}
-
-bool Qt4Target::isSymbianConnectionAvailable(QString &tooltipText)
-{
-    const S60DeployConfiguration *s60DeployConf = qobject_cast<S60DeployConfiguration *>(activeDeployConfiguration());
-    if (!s60DeployConf)
-        return false;
-    switch (s60DeployConf->communicationChannel()) {
-    case S60DeployConfiguration::CommunicationSerialConnection: {
-        const SymbianUtils::SymbianDeviceManager *sdm = SymbianUtils::SymbianDeviceManager::instance();
-        const int deviceIndex = sdm->findByPortName(s60DeployConf->serialPortName());
-        if (deviceIndex == -1) {
-            tooltipText = tr("<b>Device:</b> Not connected");
-            return false;
-        } else {
-            // device connected
-            const SymbianUtils::SymbianDevice device = sdm->devices().at(deviceIndex);
-            tooltipText = device.additionalInformation().isEmpty() ?
-                                    tr("<b>Device:</b> %1").arg(device.friendlyName()) :
-                                    tr("<b>Device:</b> %1, %2").arg(device.friendlyName(), device.additionalInformation());
-            return true;
-        }
-    }
-    break;
-    case S60DeployConfiguration::CommunicationTcpConnection: {
-        if(!s60DeployConf->deviceAddress().isEmpty() && !s60DeployConf->devicePort().isEmpty()) {
-            tooltipText = tr("<b>IP address:</b> %1:%2").arg(s60DeployConf->deviceAddress(), s60DeployConf->devicePort());
-            return true;
-        }
-        return false;
-    }
-    break;
-    default:
-        break;
-    }
-    return false;
-}
-
diff --git a/src/plugins/qt4projectmanager/qt4target.h b/src/plugins/qt4projectmanager/qt4target.h
index 0e27c702be3ab118f1a39006d57f30c53ad00d0b..926a8717a8508a9b7c333a17fbb017068a357ea4 100644
--- a/src/plugins/qt4projectmanager/qt4target.h
+++ b/src/plugins/qt4projectmanager/qt4target.h
@@ -35,23 +35,20 @@
 #define QT4TARGET_H
 
 #include "qt4buildconfiguration.h"
+#include "qtversionmanager.h"
 #include <projectexplorer/target.h>
 
-#include <QtGui/QPixmap>
-
 namespace Qt4ProjectManager {
 
 class Qt4Project;
 
 namespace Internal {
 class Qt4ProFileNode;
-class Qt4TargetFactory;
-class Qt4BuildConfigurationFactory;
-class Qt4DeployConfigurationFactory;
+}
 
 struct BuildConfigurationInfo {
-    explicit BuildConfigurationInfo(QtVersion *v = 0, QtVersion::QmakeBuildConfigs bc = QtVersion::QmakeBuildConfig(0),
-                                    const QString &aa = QString(), const QString &d = QString()) :
+    explicit BuildConfigurationInfo(QtVersion *v, QtVersion::QmakeBuildConfigs bc,
+                                    const QString &aa, const QString &d) :
         version(v), buildConfig(bc), additionalArguments(aa), directory(d)
     { }
     QtVersion *version;
@@ -59,88 +56,63 @@ struct BuildConfigurationInfo {
     QString additionalArguments;
     QString directory;
 };
-}
 
-class Qt4Target : public ProjectExplorer::Target
+class Qt4BaseTarget : public ProjectExplorer::Target
 {
     Q_OBJECT
-    friend class Internal::Qt4TargetFactory;
-
 public:
-    explicit Qt4Target(Qt4Project *parent, const QString &id);
-    virtual ~Qt4Target();
+    explicit Qt4BaseTarget(Qt4Project *parent, const QString &id);
+    virtual ~Qt4BaseTarget();
 
     ProjectExplorer::BuildConfigWidget *createConfigWidget();
 
     Qt4BuildConfiguration *activeBuildConfiguration() const;
     Qt4ProjectManager::Qt4Project *qt4Project() const;
 
+    // This is the same for almost all Qt4Targets
+    // so for now offer a convience function
     Qt4BuildConfiguration *addQt4BuildConfiguration(QString displayName,
-                                                              QtVersion *qtversion,
-                                                              QtVersion::QmakeBuildConfigs qmakeBuildConfiguration,
-                                                              QString additionalArguments,
-                                                              QString directory);
-    void addRunConfigurationForPath(const QString &proFilePath);
-
-    Internal::Qt4BuildConfigurationFactory *buildConfigurationFactory() const;
-    ProjectExplorer::DeployConfigurationFactory *deployConfigurationFactory() const;
-
-    QList<ProjectExplorer::ToolChainType> filterToolChainTypes(const QList<ProjectExplorer::ToolChainType> &candidates) const;
-    ProjectExplorer::ToolChainType preferredToolChainType(const QList<ProjectExplorer::ToolChainType> &candidates) const;
-
-    QString defaultBuildDirectory() const;
-    static QString defaultShadowBuildDirectory(const QString &projectLocation, const QString &id);
-
-    bool fromMap(const QVariantMap &map);
-
+                                                            QtVersion *qtversion,
+                                                            QtVersion::QmakeBuildConfigs qmakeBuildConfiguration,
+                                                            QString additionalArguments,
+                                                            QString directory);
+
+    virtual void createApplicationProFiles() = 0;
+    virtual QList<ProjectExplorer::ToolChainType> filterToolChainTypes(const QList<ProjectExplorer::ToolChainType> &candidates) const;
+    virtual ProjectExplorer::ToolChainType preferredToolChainType(const QList<ProjectExplorer::ToolChainType> &candidates) const;
+    virtual QString defaultBuildDirectory() const;
 signals:
     void buildDirectoryInitialized();
     /// emitted if the build configuration changed in a way that
     /// should trigger a reevaluation of all .pro files
-    void proFileEvaluateNeeded(Qt4ProjectManager::Qt4Target *);
+    void proFileEvaluateNeeded(Qt4ProjectManager::Qt4BaseTarget *);
+
+protected:
+    void removeUnconfiguredCustomExectutableRunConfigurations();
 
 private slots:
-    void updateQtVersion();
     void onAddedBuildConfiguration(ProjectExplorer::BuildConfiguration *bc);
-    void onAddedDeployConfiguration(ProjectExplorer::DeployConfiguration *dc);
-    void slotUpdateDeviceInformation();
     void onProFileEvaluateNeeded(Qt4ProjectManager::Qt4BuildConfiguration *bc);
     void emitProFileEvaluateNeeded();
-    void updateToolTipAndIcon();
-
-private:
-     bool isSymbianConnectionAvailable(QString &tooltipText);
-
-private:
-    const QPixmap m_connectedPixmap;
-    const QPixmap m_disconnectedPixmap;
-
-    Internal::Qt4BuildConfigurationFactory *m_buildConfigurationFactory;
-    Internal::Qt4DeployConfigurationFactory *m_deployConfigurationFactory;
 };
 
-namespace Internal {
-class Qt4TargetFactory : public ProjectExplorer::ITargetFactory
+class QT4PROJECTMANAGER_EXPORT Qt4BaseTargetFactory : public ProjectExplorer::ITargetFactory
 {
     Q_OBJECT
-
 public:
-    Qt4TargetFactory(QObject *parent = 0);
-    ~Qt4TargetFactory();
+    Qt4BaseTargetFactory(QObject *parent);
+    ~Qt4BaseTargetFactory();
 
-    virtual bool supportsTargetId(const QString &id) const;
+    virtual QString defaultShadowBuildDirectory(const QString &projectLocation, const QString &id) =0;
+    virtual QList<BuildConfigurationInfo> availableBuildConfigurations(const QString &proFilePath) = 0;
 
-    QStringList availableCreationIds(ProjectExplorer::Project *parent) const;
-    QString displayNameForId(const QString &id) const;
+    virtual Qt4BaseTarget *create(ProjectExplorer::Project *parent, const QString &id) = 0;
+    virtual Qt4BaseTarget *create(ProjectExplorer::Project *parent,
+                                  const QString &id,
+                                  QList<BuildConfigurationInfo> infos) = 0;
 
-    bool canCreate(ProjectExplorer::Project *parent, const QString &id) const;
-    Qt4ProjectManager::Qt4Target *create(ProjectExplorer::Project *parent, const QString &id);
-    Qt4ProjectManager::Qt4Target *create(ProjectExplorer::Project *parent, const QString &id, QList<QtVersion *> versions);
-    Qt4ProjectManager::Qt4Target *create(ProjectExplorer::Project *parent, const QString &id, QList<Internal::BuildConfigurationInfo> infos);
-    bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const;
-    Qt4ProjectManager::Qt4Target *restore(ProjectExplorer::Project *parent, const QVariantMap &map);
+    static Qt4BaseTargetFactory *qt4BaseTargetFactoryForId(const QString &id);
 };
-}
 
 } // namespace Qt4ProjectManager
 
diff --git a/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.cpp b/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.cpp
index ecf8c2f5f645dde6b4fa93d3f0aa4be91f451ca3..4e307bd0bb2c27b9e8a5eab728abf1e7c6ce9352 100644
--- a/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.cpp
+++ b/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.cpp
@@ -215,6 +215,7 @@ void AbstractMobileAppWizard::useProjectPath(const QString &projectName,
     app()->setProjectName(projectName);
     app()->setProjectPath(projectPath);
     wizardDialog()->m_targetsPage->setProFilePath(app()->path(AbstractMobileApp::AppPro));
+    projectPathChanged(app()->path(AbstractMobileApp::AppPro));
 }
 
 } // end of namespace Internal
diff --git a/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.h b/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.h
index 752c0c37ecf5753d432c8759b43560859ce825bd..e19802726277f4a677b59f5f050e87226cdf1436 100644
--- a/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.h
+++ b/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.h
@@ -99,6 +99,7 @@ private:
     virtual AbstractMobileApp *app() const=0;
     virtual AbstractMobileAppWizardDialog *wizardDialog() const=0;
     virtual AbstractMobileAppWizardDialog *createWizardDialogInternal(QWidget *parent) const=0;
+    virtual void projectPathChanged(const QString &path) const=0;
     virtual void prepareGenerateFiles(const QWizard *wizard,
         QString *errorMessage) const=0;
     virtual bool postGenerateFilesInternal(const Core::GeneratedFiles &l,
diff --git a/src/plugins/qt4projectmanager/wizards/mobileappwizard.cpp b/src/plugins/qt4projectmanager/wizards/mobileappwizard.cpp
index 4880601d4e0fe57dd6b14e825b98e0456cb467f2..d8fbeea4ff456261dc4c6b1c1ec825493b0339ae 100644
--- a/src/plugins/qt4projectmanager/wizards/mobileappwizard.cpp
+++ b/src/plugins/qt4projectmanager/wizards/mobileappwizard.cpp
@@ -107,11 +107,15 @@ Core::BaseFileWizardParameters MobileAppWizard::parameters()
 AbstractMobileAppWizardDialog *MobileAppWizard::createWizardDialogInternal(QWidget *parent) const
 {
     m_d->wizardDialog = new MobileAppWizardDialog(parent);
-    m_d->wizardDialog->m_targetsPage->setImportInfos(TargetSetupPage::importInfosForKnownQtVersions());
     m_d->wizardDialog->m_targetsPage->setPreferMobile(true);
     return m_d->wizardDialog;
 }
 
+void MobileAppWizard::projectPathChanged(const QString &path) const
+{
+    m_d->wizardDialog->m_targetsPage->setImportInfos(TargetSetupPage::importInfosForKnownQtVersions(path));
+}
+
 void MobileAppWizard::prepareGenerateFiles(const QWizard *w,
     QString *errorMessage) const
 {
diff --git a/src/plugins/qt4projectmanager/wizards/mobileappwizard.h b/src/plugins/qt4projectmanager/wizards/mobileappwizard.h
index 7491ef99b2eaa6d5c814daba11c483b1e67013a7..d6421ef88364c331449c60c05e003cfe5b713e04 100644
--- a/src/plugins/qt4projectmanager/wizards/mobileappwizard.h
+++ b/src/plugins/qt4projectmanager/wizards/mobileappwizard.h
@@ -53,6 +53,7 @@ private:
     virtual AbstractMobileApp *app() const;
     virtual AbstractMobileAppWizardDialog *wizardDialog() const;
     virtual AbstractMobileAppWizardDialog *createWizardDialogInternal(QWidget *parent) const;
+    virtual void projectPathChanged(const QString &path) const;
     virtual void prepareGenerateFiles(const QWizard *wizard,
         QString *errorMessage) const;
     virtual bool postGenerateFilesInternal(const Core::GeneratedFiles &l,
diff --git a/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizard.cpp b/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizard.cpp
index e9c38e911c02ef9ff7bdf7f6f3856c8e9c5991ca..a1915f96430a1e720864e7308d451fe15dbe2bff 100644
--- a/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizard.cpp
+++ b/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizard.cpp
@@ -117,8 +117,13 @@ Core::BaseFileWizardParameters QmlStandaloneAppWizard::parameters()
 AbstractMobileAppWizardDialog *QmlStandaloneAppWizard::createWizardDialogInternal(QWidget *parent) const
 {
     m_d->wizardDialog = new QmlStandaloneAppWizardDialog(parent);
+    return m_d->wizardDialog;
+}
+
+void QmlStandaloneAppWizard::projectPathChanged(const QString &path) const
+{
     const QList<TargetSetupPage::ImportInfo> &qtVersions
-        = TargetSetupPage::importInfosForKnownQtVersions();
+        = TargetSetupPage::importInfosForKnownQtVersions(path);
     QList<TargetSetupPage::ImportInfo> qmlQtVersions;
     foreach (const TargetSetupPage::ImportInfo &qtVersion, qtVersions) {
         const QString versionString = qtVersion.version->qtVersionString();
@@ -132,8 +137,6 @@ AbstractMobileAppWizardDialog *QmlStandaloneAppWizard::createWizardDialogInterna
         qmlQtVersions << qtVersion;
     }
     m_d->wizardDialog->m_targetsPage->setImportInfos(qmlQtVersions);
-
-    return m_d->wizardDialog;
 }
 
 void QmlStandaloneAppWizard::prepareGenerateFiles(const QWizard *w,
diff --git a/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizard.h b/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizard.h
index 1eac5f18e775d7637640cbdce71d8c0beef9acca..666ef9461021d7abbffae135c0c2cdc95d568722 100644
--- a/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizard.h
+++ b/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizard.h
@@ -53,6 +53,7 @@ private:
     virtual AbstractMobileApp *app() const;
     virtual AbstractMobileAppWizardDialog *wizardDialog() const;
     virtual AbstractMobileAppWizardDialog *createWizardDialogInternal(QWidget *parent) const;
+    virtual void projectPathChanged(const QString &path) const;
     virtual void prepareGenerateFiles(const QWizard *wizard,
         QString *errorMessage) const;
     virtual bool postGenerateFilesInternal(const Core::GeneratedFiles &l,
diff --git a/src/plugins/qt4projectmanager/wizards/qtwizard.cpp b/src/plugins/qt4projectmanager/wizards/qtwizard.cpp
index 6630f59624c66fd305efe178f6d2636024d920fb..dc7a3a53f066d63c3d7b7ea1f784800171ce194e 100644
--- a/src/plugins/qt4projectmanager/wizards/qtwizard.cpp
+++ b/src/plugins/qt4projectmanager/wizards/qtwizard.cpp
@@ -237,12 +237,13 @@ int BaseQt4ProjectWizardDialog::addModulesPage(int id)
 int BaseQt4ProjectWizardDialog::addTargetSetupPage(QSet<QString> targets, bool mobile, int id)
 {
     m_targetSetupPage = new TargetSetupPage;
+    m_targets = targets;
     resize(900, 450);
 
     connect(this, SIGNAL(projectLocationChanged(QString)),
             m_targetSetupPage, SLOT(setProFilePath(QString)));
 
-    QList<TargetSetupPage::ImportInfo> infos = TargetSetupPage::importInfosForKnownQtVersions();
+    QList<TargetSetupPage::ImportInfo> infos = TargetSetupPage::importInfosForKnownQtVersions(path());
     if (!targets.isEmpty())
         infos = TargetSetupPage::filterImportInfos(targets, infos);
     m_targetSetupPage->setImportDirectoryBrowsingEnabled(false);
@@ -323,6 +324,10 @@ bool BaseQt4ProjectWizardDialog::isTargetSelected(const QString &targetid) const
 void BaseQt4ProjectWizardDialog::generateProfileName(const QString &name, const QString &path)
 {
     const QString proFile = QDir::fromNativeSeparators(path) + QChar('/') + name + QChar('/') + name + QLatin1String(".pro");
+    QList<TargetSetupPage::ImportInfo> infos = TargetSetupPage::importInfosForKnownQtVersions(proFile);
+    if (!m_targets.isEmpty())
+        infos = TargetSetupPage::filterImportInfos(m_targets, infos);
+    m_targetSetupPage->setImportInfos(infos);
     emit projectLocationChanged(proFile);
 }
 
diff --git a/src/plugins/qt4projectmanager/wizards/qtwizard.h b/src/plugins/qt4projectmanager/wizards/qtwizard.h
index 2871e7ae8b60fe100babc4989880c727c04c61d8..a0a507bee2e2718c6f9febbab872a82b88d648dd 100644
--- a/src/plugins/qt4projectmanager/wizards/qtwizard.h
+++ b/src/plugins/qt4projectmanager/wizards/qtwizard.h
@@ -159,6 +159,7 @@ private:
     TargetSetupPage *m_targetSetupPage;
     QString m_selectedModules;
     QString m_deselectedModules;
+    QSet<QString> m_targets;
 };
 
 } // namespace Internal
diff --git a/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp b/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp
index fc0e1915d2fcdd289f3ff332359ec29d48fd7657..b6d4bf0cbb13ed28fb429cf220c39c1488daa77d 100644
--- a/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp
+++ b/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp
@@ -85,8 +85,6 @@ TargetSetupPage::TargetSetupPage(QWidget *parent) :
             this, SLOT(addShadowBuildLocation()));
     connect(m_ui->uncheckButton, SIGNAL(clicked()),
             this, SLOT(checkAllButtonClicked()));
-    connect(m_ui->versionTree, SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)),
-            this, SLOT(handleDoubleClicks(QTreeWidgetItem*,int)));
     connect(m_ui->versionTree, SIGNAL(customContextMenuRequested(QPoint)),
             this, SLOT(contextMenuRequested(QPoint)));
 
@@ -128,7 +126,7 @@ void TargetSetupPage::setImportInfos(const QList<ImportInfo> &infos)
     m_infos.clear();
 
     // Find possible targets:
-    QStringList targets;
+    QStringList targetIds;
     foreach (const ImportInfo &i, infos) {
         // Make sure we have no duplicate directories:
         bool skip = false;
@@ -148,28 +146,42 @@ void TargetSetupPage::setImportInfos(const QList<ImportInfo> &infos)
 
         QSet<QString> versionTargets = i.version->supportedTargetIds();
         foreach (const QString &t, versionTargets) {
-            if (!targets.contains(t))
-                targets.append(t);
+            if (!targetIds.contains(t))
+                targetIds.append(t);
         }
     }
-    qSort(targets.begin(), targets.end());
+    qSort(targetIds.begin(), targetIds.end());
 
     m_ui->versionTree->clear();
-    Qt4TargetFactory factory;
-    foreach (const QString &t, targets) {
+
+    foreach (const QString &targetId, targetIds) {
         QTreeWidgetItem *targetItem = new QTreeWidgetItem(m_ui->versionTree);
-        const QString targetName = factory.displayNameForId(t);
-        targetItem->setText(NAME_COLUMN, targetName);
-        targetItem->setToolTip(NAME_COLUMN, targetName);
+
+        Qt4BaseTargetFactory *factory = 0;
+        QList<Qt4BaseTargetFactory *> factories =
+                ExtensionSystem::PluginManager::instance()->getObjects<Qt4BaseTargetFactory>();
+        foreach (Qt4BaseTargetFactory *fac, factories) {
+            if (fac->supportsTargetId(targetId)) {
+                factory = fac;
+                break;
+            }
+        }
+        if (!factory)
+            continue;
+
+        QString displayName = factory->displayNameForId(targetId);
+
+        targetItem->setText(0, displayName);
+        targetItem->setToolTip(0, displayName);
         targetItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
-        targetItem->setData(NAME_COLUMN, Qt::UserRole, t);
+        targetItem->setData(NAME_COLUMN, Qt::UserRole, targetId);
         targetItem->setExpanded(true);
 
         int pos = -1;
         foreach (const ImportInfo &i, m_infos) {
             ++pos;
 
-            if (!i.version->supportsTargetId(t))
+            if (!i.version->supportsTargetId(targetId))
                 continue;
             QTreeWidgetItem *versionItem = new QTreeWidgetItem(targetItem);
             updateVersionItem(versionItem, pos);
@@ -236,58 +248,70 @@ bool TargetSetupPage::setupProject(Qt4ProjectManager::Qt4Project *project)
 {
     Q_ASSERT(project->targets().isEmpty());
     QtVersionManager *vm = QtVersionManager::instance();
-
-    // TODO remove again
-    Qt4TargetFactory *factory =
-            ExtensionSystem::PluginManager::instance()->getObject<Qt4TargetFactory>();
-
     for (int i = 0; i < m_ui->versionTree->topLevelItemCount(); ++i) {
         QTreeWidgetItem *current = m_ui->versionTree->topLevelItem(i);
         QString targetId = current->data(NAME_COLUMN, Qt::UserRole).toString();
 
-        QList<BuildConfigurationInfo> targetInfos;
-        for (int j = 0; j < current->childCount(); ++j) {
-            QTreeWidgetItem *child = current->child(j);
-            if (child->checkState(0) != Qt::Checked)
-                continue;
-
-            ImportInfo &info = m_infos[child->data(NAME_COLUMN, Qt::UserRole).toInt()];
+        Qt4BaseTargetFactory *qt4TargetFactory = Qt4BaseTargetFactory::qt4BaseTargetFactoryForId(targetId);
+        if (qt4TargetFactory && qt4TargetFactory->canCreate(project, targetId)) {
+            QList<BuildConfigurationInfo> targetInfos;
+            for (int j = 0; j < current->childCount(); ++j) {
+                QTreeWidgetItem *child = current->child(j);
+                if (child->checkState(0) != Qt::Checked)
+                    continue;
+                ImportInfo &info = m_infos[child->data(0, Qt::UserRole).toInt()];
+
+                // Register temporary Qt version
+                if (info.isTemporary) {
+                    vm->addVersion(info.version);
+                    info.isTemporary = false;
+                }
 
-            // Register temporary Qt version
-            if (info.isTemporary) {
-                vm->addVersion(info.version);
-                info.isTemporary = false;
+                targetInfos.append(BuildConfigurationInfo(info.version, info.buildConfig,
+                                                          info.additionalArguments, info.directory));
             }
 
-            QString directory = info.directory;
-            if (!info.isShadowBuild)
-                directory = project->projectDirectory();
+            // create the target:
+            Qt4BaseTarget *target = 0;
+            if (!targetInfos.isEmpty()) {
+                target = qt4TargetFactory->create(project, targetId, targetInfos);
+            }
 
-            // we want to havbe two BCs set up, one to build debug, the other to build release.
-            targetInfos.append(BuildConfigurationInfo(info.version, info.buildConfig,
-                                                      info.additionalArguments, directory));
-            targetInfos.append(BuildConfigurationInfo(info.version, info.buildConfig ^ QtVersion::DebugBuild,
-                                                      info.additionalArguments, directory));
+            if (target) {
+                project->addTarget(target);
+                if (target->id() == QLatin1String(Constants::QT_SIMULATOR_TARGET_ID))
+                    project->setActiveTarget(target);
+            }
         }
+    }
 
-        // create the target:
-        Qt4Target *target = 0;
-        if (!targetInfos.isEmpty())
-            target = factory->create(project, targetId, targetInfos);
 
-        if (target) {
-            project->addTarget(target);
-            if (target->id() == QLatin1String(Constants::QT_SIMULATOR_TARGET_ID))
-                project->setActiveTarget(target);
+    // Create a desktop target if nothing else was set up:
+    if (project->targets().isEmpty()) {
+        Qt4BaseTargetFactory *tf = Qt4BaseTargetFactory::qt4BaseTargetFactoryForId(Constants::DESKTOP_TARGET_ID);
+        if (tf) {
+            Qt4BaseTarget *target = tf->create(project, Constants::DESKTOP_TARGET_ID);
+            if (target)
+                project->addTarget(target);
         }
     }
 
-    // Create the default target if nothing else was set up:
-    if (project->targets().isEmpty()) {
-        Qt4Target *target = factory->create(project, Constants::DESKTOP_TARGET_ID);
-        if (target)
-            project->addTarget(target);
+    // Select active target
+    // a) Simulator target
+    // b) Desktop target
+    // c) the first target
+    ProjectExplorer::Target *activeTarget = 0;
+    QList<ProjectExplorer::Target *> targets = project->targets();
+    foreach (ProjectExplorer::Target *t, targets) {
+        if (t->id() == Constants::QT_SIMULATOR_TARGET_ID)
+            activeTarget = t;
+        else if (!activeTarget && t->id() == Constants::DESKTOP_TARGET_ID)
+            activeTarget = t;
     }
+    if (!activeTarget && !targets.isEmpty())
+        activeTarget = targets.first();
+    if (activeTarget)
+        project->setActiveTarget(activeTarget);
 
     return !project->targets().isEmpty();
 }
@@ -330,24 +354,31 @@ void TargetSetupPage::setProFilePath(const QString &path)
     setImportInfos(tmp);
 }
 
-QList<TargetSetupPage::ImportInfo> TargetSetupPage::importInfosForKnownQtVersions()
+QList<TargetSetupPage::ImportInfo> TargetSetupPage::importInfosForKnownQtVersions(const QString &proFilePath)
 {
-    QList<ImportInfo> results;
-    QtVersionManager * vm = QtVersionManager::instance();
-    QList<QtVersion *> validVersions = vm->validVersions();
-    // Fallback in case no valid versions are found:
-    if (validVersions.isEmpty())
-        validVersions.append(vm->versions().at(0)); // there is always one!
-    foreach (QtVersion *v, validVersions) {
+    QList<Qt4BaseTargetFactory *> factories =
+            ExtensionSystem::PluginManager::instance()->getObjects<Qt4BaseTargetFactory>();
+
+    QList<BuildConfigurationInfo> bcinfos;
+
+    foreach(Qt4BaseTargetFactory *fac, factories)
+        bcinfos.append(fac->availableBuildConfigurations(proFilePath));
+
+    QList<ImportInfo> infos;
+    foreach (const BuildConfigurationInfo &info, bcinfos) {
+        infos.append(ImportInfo(info));
+    }
+
+    if (infos.isEmpty()) {
+        // Fallback to the Qt in Path version
         ImportInfo info;
         info.isExistingBuild = false;
         info.isTemporary = false;
-        info.isShadowBuild = v->supportsShadowBuilds();
-        info.version = v;
-        info.buildConfig = v->defaultBuildConfig();
-        results.append(info);
+        info.version = QtVersionManager::instance()->versions().at(0);
+        info.buildConfig = info.version->defaultBuildConfig();
+        infos.append(info);
     }
-    return results;
+    return infos;
 }
 
 QList<TargetSetupPage::ImportInfo> TargetSetupPage::filterImportInfos(const QSet<QString> &validTargets,
@@ -372,7 +403,8 @@ TargetSetupPage::scanDefaultProjectDirectories(Qt4ProjectManager::Qt4Project *pr
                                                                                           project->file()->fileName());
     QtVersionManager *vm = QtVersionManager::instance();
     foreach(const QString &id, vm->supportedTargetIds()) {
-        QString location = Qt4Target::defaultShadowBuildDirectory(project->defaultTopLevelBuildDirectory(), id);
+        Qt4BaseTargetFactory *qt4Factory = Qt4BaseTargetFactory::qt4BaseTargetFactoryForId(id);
+        QString location = qt4Factory->defaultShadowBuildDirectory(project->defaultTopLevelBuildDirectory(), id);
         importVersions.append(TargetSetupPage::recursivelyCheckDirectoryForBuild(location,
                                                                                  project->file()->fileName()));
     }
@@ -404,7 +436,6 @@ TargetSetupPage::recursivelyCheckDirectoryForBuild(const QString &directory, con
     QtVersionManager * vm = QtVersionManager::instance();
     TargetSetupPage::ImportInfo info;
     info.directory = dir.absolutePath();
-    info.isShadowBuild = (info.directory != QFileInfo(proFile).absolutePath());
 
     // This also means we have a build in there
     // First get the qt version
@@ -513,17 +544,6 @@ void TargetSetupPage::checkOneTriggered()
     checkOne(true, item);
 }
 
-void TargetSetupPage::handleDoubleClicks(QTreeWidgetItem *item, int column)
-{
-    int idx = item->data(NAME_COLUMN, Qt::UserRole).toInt();
-    if (column == DIRECTORY_COLUMN && item->parent()) {
-        if (m_infos[idx].isExistingBuild || !m_infos[idx].version->supportsShadowBuilds())
-            return;
-        m_infos[idx].isShadowBuild = !m_infos[idx].isShadowBuild;
-        updateVersionItem(item, idx);
-    }
-}
-
 void TargetSetupPage::contextMenuRequested(const QPoint &position)
 {
     m_contextMenu->clear();
@@ -596,18 +616,7 @@ QPair<QIcon, QString> TargetSetupPage::reportIssues(Qt4ProjectManager::QtVersion
 void TargetSetupPage::updateVersionItem(QTreeWidgetItem *versionItem, int index)
 {
     ImportInfo &info = m_infos[index];
-    const QString target = versionItem->parent()->data(NAME_COLUMN, Qt::UserRole).toString();
-    QString dir;
-    if (info.directory.isEmpty()) {
-        Q_ASSERT(!info.isTemporary && !info.isExistingBuild);
-        if (info.isShadowBuild)
-            dir = Qt4Target::defaultShadowBuildDirectory(Qt4Project::defaultTopLevelBuildDirectory(m_proFilePath), target);
-        else
-            dir = Qt4Project::projectDirectory(m_proFilePath);
-    } else {
-        dir = info.directory;
-    }
-    QPair<QIcon, QString> issues = reportIssues(info.version, dir);
+    QPair<QIcon, QString> issues = reportIssues(info.version, info.directory);
 
     //: We are going to build debug and release
     QString buildType = tr("debug and release");
@@ -631,7 +640,7 @@ void TargetSetupPage::updateVersionItem(QTreeWidgetItem *versionItem, int index)
     // Column 0:
     versionItem->setToolTip(NAME_COLUMN, toolTip);
     versionItem->setIcon(NAME_COLUMN, issues.first);
-    versionItem->setText(NAME_COLUMN, info.version->displayName());
+    versionItem->setText(NAME_COLUMN, info.version->displayName() + " " + buildType);
     versionItem->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
     versionItem->setData(NAME_COLUMN, Qt::UserRole, index);
 
@@ -646,6 +655,6 @@ void TargetSetupPage::updateVersionItem(QTreeWidgetItem *versionItem, int index)
 
     // Column 2 (directory):
     Q_ASSERT(versionItem->parent());
-    versionItem->setText(DIRECTORY_COLUMN, QDir::toNativeSeparators(dir));
-    versionItem->setToolTip(DIRECTORY_COLUMN, QDir::toNativeSeparators(dir));
+    versionItem->setText(DIRECTORY_COLUMN, QDir::toNativeSeparators(info.directory));
+    versionItem->setToolTip(DIRECTORY_COLUMN, QDir::toNativeSeparators(info.directory));
 }
diff --git a/src/plugins/qt4projectmanager/wizards/targetsetuppage.h b/src/plugins/qt4projectmanager/wizards/targetsetuppage.h
index 257a333f103c7014d175382593a0c157bf5c8f96..47b9c847b832963785ac16c48d017f507d71587b 100644
--- a/src/plugins/qt4projectmanager/wizards/targetsetuppage.h
+++ b/src/plugins/qt4projectmanager/wizards/targetsetuppage.h
@@ -34,6 +34,7 @@
 #ifndef TARGETSETUPPAGE_H
 #define TARGETSETUPPAGE_H
 
+#include "qt4target.h"
 #include "qtversionmanager.h"
 
 #include <QtCore/QList>
@@ -71,21 +72,28 @@ public:
             version(0),
             isTemporary(false),
             buildConfig(QtVersion::QmakeBuildConfig(0)),
-            isExistingBuild(false),
-            isShadowBuild(false)
+            isExistingBuild(false)
         {
             if (version && version->isValid())
                 buildConfig = version->defaultBuildConfig();
         }
 
+        ImportInfo(const BuildConfigurationInfo &source)
+            : version(source.version),
+              isTemporary(false),
+              buildConfig(source.buildConfig),
+              additionalArguments(source.additionalArguments),
+              directory(source.directory),
+              isExistingBuild(false)
+        {}
+
         ImportInfo(const ImportInfo &other) :
             version(other.version),
             isTemporary(other.isTemporary),
             buildConfig(other.buildConfig),
             additionalArguments(other.additionalArguments),
             directory(other.directory),
-            isExistingBuild(other.isExistingBuild),
-            isShadowBuild(other.isShadowBuild)
+            isExistingBuild(other.isExistingBuild)
         { }
 
         QtVersion *version;
@@ -94,7 +102,6 @@ public:
         QString additionalArguments;
         QString directory;
         bool isExistingBuild;
-        bool isShadowBuild;
     };
 
     explicit TargetSetupPage(QWidget* parent = 0);
@@ -109,7 +116,7 @@ public:
     void setImportDirectoryBrowsingLocation(const QString &directory);
     void setPreferMobile(bool mobile);
 
-    static QList<ImportInfo> importInfosForKnownQtVersions();
+    static QList<ImportInfo> importInfosForKnownQtVersions(const QString &proFilePath);
     static QList<ImportInfo> filterImportInfos(const QSet<QString> &validTargets,
                                                const QList<ImportInfo> &infos);
 
@@ -135,7 +142,6 @@ private slots:
     void uncheckAllTriggered();
     void checkOneTriggered();
     void addShadowBuildLocation();
-    void handleDoubleClicks(QTreeWidgetItem *, int);
     void contextMenuRequested(const QPoint & pos);
 
 private: