diff --git a/share/qtcreator/templates/qtquickapp/qmlapplicationviewer/qmlapplicationviewer.cpp b/share/qtcreator/templates/qtquickapp/qmlapplicationviewer/qmlapplicationviewer.cpp
index 2aeda06921ee35d76c5af7b6288476ee24e03c7d..68613375665c6ec40e39f0d2f3084d7f4fa4a4fb 100644
--- a/share/qtcreator/templates/qtquickapp/qmlapplicationviewer/qmlapplicationviewer.cpp
+++ b/share/qtcreator/templates/qtquickapp/qmlapplicationviewer/qmlapplicationviewer.cpp
@@ -78,9 +78,6 @@ QmlApplicationViewer::QmlApplicationViewer(QWidget *parent)
     connect(engine(), SIGNAL(quit()), SLOT(close()));
     setResizeMode(QDeclarativeView::SizeRootObjectToView);
 
-#ifdef Q_OS_ANDROID
-    engine()->setBaseUrl(QUrl::fromLocalFile(QLatin1String("/")));
-#endif
     // Qt versions prior to 4.8.0 don't have QML/JS debugging services built in
 #if defined(QMLJSDEBUGGER) && QT_VERSION < 0x040800
 #if !defined(NO_JSDEBUGGER)
@@ -105,7 +102,11 @@ QmlApplicationViewer *QmlApplicationViewer::create()
 void QmlApplicationViewer::setMainQmlFile(const QString &file)
 {
     d->mainQmlFile = QmlApplicationViewerPrivate::adjustPath(file);
+#ifdef Q_OS_ANDROID
+    setSource(QUrl(QLatin1String("assets:/")+d->mainQmlFile));
+#else
     setSource(QUrl::fromLocalFile(d->mainQmlFile));
+#endif
 }
 
 void QmlApplicationViewer::addImportPath(const QString &path)
diff --git a/src/plugins/android/android.pro b/src/plugins/android/android.pro
index 324fd6d3875f3db25162b627beddb66d0252d45c..7add49bad7fac363b43dce10f25c51945b25a131 100644
--- a/src/plugins/android/android.pro
+++ b/src/plugins/android/android.pro
@@ -36,7 +36,8 @@ HEADERS += \
     androidcreatekeystorecertificate.h \
     javaparser.h \
     androidplugin.h \
-    androiddevicefactory.h
+    androiddevicefactory.h \
+    androiddevice.h
 
 SOURCES += \
     androidconfigurations.cpp \
@@ -63,7 +64,8 @@ SOURCES += \
     androidcreatekeystorecertificate.cpp \
     javaparser.cpp \
     androidplugin.cpp \
-    androiddevicefactory.cpp
+    androiddevicefactory.cpp \
+    androiddevice.cpp
 
 
 FORMS += \
diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp
index cfce5f6ea129199d104464dc832b3afdaa220733..633e54daa039da902885db7221baf5aa80159b16 100644
--- a/src/plugins/android/androidconfigurations.cpp
+++ b/src/plugins/android/androidconfigurations.cpp
@@ -90,7 +90,7 @@ namespace {
             QFileInfo(Core::ICore::settings(QSettings::SystemScope)->fileName()).absolutePath());
     }
 
-    bool androidDevicesLessThan(const AndroidDevice &dev1, const AndroidDevice &dev2)
+    bool androidDevicesLessThan(const AndroidDeviceInfo &dev1, const AndroidDeviceInfo &dev2)
     {
         return dev1.sdk < dev2.sdk;
     }
@@ -233,7 +233,7 @@ QStringList AndroidConfigurations::sdkTargets(int minApiLevel) const
         return targets;
     }
     while (proc.canReadLine()) {
-        QString line = proc.readLine();
+        QString line = proc.readLine().trimmed();
         int index = line.indexOf(QLatin1String("\"android-"));
         if (index == -1)
             continue;
@@ -392,9 +392,9 @@ Utils::FileName AndroidConfigurations::jarsignerPath() const
 
 QString AndroidConfigurations::getDeployDeviceSerialNumber(int *apiLevel) const
 {
-    QVector<AndroidDevice> devices = connectedDevices();
+    QVector<AndroidDeviceInfo> devices = connectedDevices();
 
-    foreach (AndroidDevice device, devices) {
+    foreach (AndroidDeviceInfo device, devices) {
         if (device.sdk >= *apiLevel) {
             *apiLevel = device.sdk;
             return device.serialNumber;
@@ -403,9 +403,9 @@ QString AndroidConfigurations::getDeployDeviceSerialNumber(int *apiLevel) const
     return startAVD(apiLevel);
 }
 
-QVector<AndroidDevice> AndroidConfigurations::connectedDevices(int apiLevel) const
+QVector<AndroidDeviceInfo> AndroidConfigurations::connectedDevices(int apiLevel) const
 {
-    QVector<AndroidDevice> devices;
+    QVector<AndroidDeviceInfo> devices;
     QProcess adbProc;
     adbProc.start(adbToolPath().toString(), QStringList() << QLatin1String("devices"));
     if (!adbProc.waitForFinished(-1)) {
@@ -414,7 +414,7 @@ QVector<AndroidDevice> AndroidConfigurations::connectedDevices(int apiLevel) con
     }
     QList<QByteArray> adbDevs = adbProc.readAll().trimmed().split('\n');
     adbDevs.removeFirst();
-    AndroidDevice dev;
+    AndroidDeviceInfo dev;
     foreach (const QByteArray &device, adbDevs) {
         dev.serialNumber = QString::fromLatin1(device.left(device.indexOf('\t')).trimmed());
         dev.sdk = getSDKVersion(dev.serialNumber);
@@ -480,9 +480,9 @@ bool AndroidConfigurations::removeAVD(const QString &name) const
     return !proc.exitCode();
 }
 
-QVector<AndroidDevice> AndroidConfigurations::androidVirtualDevices() const
+QVector<AndroidDeviceInfo> AndroidConfigurations::androidVirtualDevices() const
 {
-    QVector<AndroidDevice> devices;
+    QVector<AndroidDeviceInfo> devices;
     QProcess proc;
     proc.start(androidToolPath().toString(),
                QStringList() << QLatin1String("list") << QLatin1String("avd")); // list available AVDs
@@ -492,7 +492,7 @@ QVector<AndroidDevice> AndroidConfigurations::androidVirtualDevices() const
     }
     QList<QByteArray> avds = proc.readAll().trimmed().split('\n');
     avds.removeFirst();
-    AndroidDevice dev;
+    AndroidDeviceInfo dev;
     for (int i = 0; i < avds.size(); i++) {
         QString line = QLatin1String(avds[i]);
         if (!line.contains(QLatin1String("Name:")))
@@ -523,12 +523,12 @@ QString AndroidConfigurations::startAVD(int *apiLevel, const QString &name) cons
     connect(m_avdProcess, SIGNAL(finished(int)), m_avdProcess, SLOT(deleteLater()));
 
     QString avdName = name;
-    QVector<AndroidDevice> devices;
+    QVector<AndroidDeviceInfo> devices;
     bool createAVDOnce = false;
     while (true) {
         if (avdName.isEmpty()) {
             devices = androidVirtualDevices();
-            foreach (AndroidDevice device, devices)
+            foreach (AndroidDeviceInfo device, devices)
                 if (device.sdk >= *apiLevel) { // take first emulator how supports this package
                     *apiLevel = device.sdk;
                     avdName = device.serialNumber;
@@ -575,7 +575,7 @@ QString AndroidConfigurations::startAVD(int *apiLevel, const QString &name) cons
 
     // get connected devices
     devices = connectedDevices(*apiLevel);
-    foreach (AndroidDevice device, devices)
+    foreach (AndroidDeviceInfo device, devices)
         if (device.sdk == *apiLevel)
             return device.serialNumber;
     // this should not happen, but ...
diff --git a/src/plugins/android/androidconfigurations.h b/src/plugins/android/androidconfigurations.h
index 31eedb4573ecf586d87cef82bf328bf3df2a6730..fd5c327facee3690ce6d03cc2adbc412a1a86213 100644
--- a/src/plugins/android/androidconfigurations.h
+++ b/src/plugins/android/androidconfigurations.h
@@ -80,7 +80,7 @@ public:
     unsigned partitionSize;
 };
 
-struct AndroidDevice {
+struct AndroidDeviceInfo {
     QString serialNumber;
     QString cpuABI;
     int sdk;
@@ -112,8 +112,8 @@ public:
     QString getDeployDeviceSerialNumber(int *apiLevel) const;
     bool createAVD(const QString &target, const QString &name, int sdcardSize) const;
     bool removeAVD(const QString &name) const;
-    QVector<AndroidDevice> connectedDevices(int apiLevel = -1) const;
-    QVector<AndroidDevice> androidVirtualDevices() const;
+    QVector<AndroidDeviceInfo> connectedDevices(int apiLevel = -1) const;
+    QVector<AndroidDeviceInfo> androidVirtualDevices() const;
     QString startAVD(int *apiLevel, const QString &name = QString()) const;
     QString bestMatch(const QString &targetAPI) const;
 
diff --git a/src/plugins/android/androidconstants.h b/src/plugins/android/androidconstants.h
index 0f849e41989c14a41a3b9bbe89fc551d2c0cb603..7a4577bf026fd7c006e2fb2f11aca3633e85cb8e 100644
--- a/src/plugins/android/androidconstants.h
+++ b/src/plugins/android/androidconstants.h
@@ -67,7 +67,9 @@ const char ANDROID_SETTINGS_TR_CATEGORY[] = QT_TRANSLATE_NOOP("Android", "Androi
 const char ANDROID_SETTINGS_CATEGORY_ICON[] = ":/android/images/QtAndroid.png";
 const char ANDROID_TOOLCHAIN_ID[] = "Qt4ProjectManager.ToolChain.Android";
 const char ANDROIDQT[] = "Qt4ProjectManager.QtVersion.Android";
+
 const char ANDROID_DEVICE_TYPE[] = "Android.Device.Type";
+const char ANDROID_DEVICE_ID[] = "Android Device";
 
 }
 } // namespace Android
diff --git a/src/plugins/android/androiddeployconfiguration.cpp b/src/plugins/android/androiddeployconfiguration.cpp
index 8a936d790a32f658b77636457e5f0d54036c2644..cb198d09a260a1ff4b3eb18f30ab3a185751cec4 100644
--- a/src/plugins/android/androiddeployconfiguration.cpp
+++ b/src/plugins/android/androiddeployconfiguration.cpp
@@ -30,6 +30,7 @@
 **
 **************************************************************************/
 
+#include "androidconstants.h"
 #include "androiddeploystep.h"
 #include "androidpackageinstallationstep.h"
 #include "androidpackagecreationstep.h"
@@ -65,7 +66,9 @@ AndroidDeployConfiguration::AndroidDeployConfiguration(ProjectExplorer::Target *
 
 AndroidDeployConfigurationFactory::AndroidDeployConfigurationFactory(QObject *parent) :
     ProjectExplorer::DeployConfigurationFactory(parent)
-{ setObjectName(QLatin1String("AndroidDeployConfigurationFactory"));}
+{
+    setObjectName(QLatin1String("AndroidDeployConfigurationFactory"));
+}
 
 bool AndroidDeployConfigurationFactory::canCreate(ProjectExplorer::Target *parent, const Core::Id id) const
 {
@@ -86,15 +89,14 @@ ProjectExplorer::DeployConfiguration *AndroidDeployConfigurationFactory::create(
 
 bool AndroidDeployConfigurationFactory::canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const
 {
-    if (!canHandle(parent))
-        return false;
-    return ProjectExplorer::idFromMap(map).toString().startsWith(ANDROID_DC_PREFIX);
+    return canCreate(parent, ProjectExplorer::idFromMap(map));
 }
 
 ProjectExplorer::DeployConfiguration *AndroidDeployConfigurationFactory::restore(ProjectExplorer::Target *parent, const QVariantMap &map)
 {
     if (!canRestore(parent, map))
         return 0;
+
     AndroidDeployConfiguration *dc = new AndroidDeployConfiguration(parent, ProjectExplorer::idFromMap(map));
     if (dc->fromMap(map))
         return dc;
@@ -119,14 +121,24 @@ ProjectExplorer::DeployConfiguration *AndroidDeployConfigurationFactory::clone(P
 
 QList<Core::Id> AndroidDeployConfigurationFactory::availableCreationIds(ProjectExplorer::Target *parent) const
 {
-    QList<Core::Id> result;
-    if (!canHandle(parent))
-        return result;
-
-    Qt4ProjectManager::Qt4Project *project = static_cast<Qt4ProjectManager::Qt4Project *>(parent->project());
-    foreach (const QString &id, project->applicationProFilePathes(QLatin1String(ANDROID_DC_PREFIX)))
-        result << Core::Id(id);
-    return result;
+    QList<Core::Id> ids;
+    if (!qobject_cast<Qt4ProjectManager::Qt4Project *>(parent->project()))
+        return ids;
+
+    if (!parent->project()->supportsProfile(parent->profile()))
+        return ids;
+
+    ProjectExplorer::ToolChain *tc
+            = ProjectExplorer::ToolChainProfileInformation::toolChain(parent->profile());
+
+    if (!tc || tc->targetAbi().osFlavor() != ProjectExplorer::Abi::AndroidLinuxFlavor)
+        return ids;
+
+    if (QtSupport::QtProfileInformation::qtVersion(parent->profile())->type() != QLatin1String(Constants::ANDROIDQT))
+        return ids;
+
+    ids << Core::Id(ANDROID_DEPLOYCONFIGURATION_ID);
+    return ids;
 }
 
 QString AndroidDeployConfigurationFactory::displayNameForId(const Core::Id id) const
diff --git a/src/plugins/android/androiddevice.cpp b/src/plugins/android/androiddevice.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..10b2ba179ed0e35cecdcdfa62acb4b80597355e1
--- /dev/null
+++ b/src/plugins/android/androiddevice.cpp
@@ -0,0 +1,92 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2012 BogDan Vatra <bog_dan_ro@yahoo.com>
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+**
+** GNU Lesser General Public License Usage
+**
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this file.
+** Please review the following information to ensure the GNU Lesser General
+** Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** Other Usage
+**
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**************************************************************************/
+
+#include "androiddevice.h"
+#include "androidconstants.h"
+
+#include <QCoreApplication>
+
+namespace Android {
+namespace Internal {
+
+AndroidDevice::AndroidDevice():
+    ProjectExplorer::IDevice(Core::Id(Constants::ANDROID_DEVICE_TYPE), IDevice::AutoDetected,
+                             Core::Id(Constants::ANDROID_DEVICE_ID))
+{
+    setDisplayName(QCoreApplication::translate("ProjectExplorer::AndroidDevice", "Run on Android"));
+    setDeviceState(DeviceReadyToUse);
+}
+
+AndroidDevice::AndroidDevice(const AndroidDevice &other):
+    ProjectExplorer::IDevice(other)
+{ }
+
+
+ProjectExplorer::IDevice::DeviceInfo AndroidDevice::deviceInformation() const
+{
+    return ProjectExplorer::IDevice::DeviceInfo();
+}
+
+QString AndroidDevice::displayType() const
+{
+    return QCoreApplication::translate("ProjectExplorer::AndroidDevice", "Android");
+}
+
+ProjectExplorer::IDeviceWidget *AndroidDevice::createWidget()
+{
+    return 0;
+}
+
+QList<Core::Id> AndroidDevice::actionIds() const
+{
+    return QList<Core::Id>()<<Core::Id(Constants::ANDROID_DEVICE_ID);
+}
+
+QString AndroidDevice::displayNameForActionId(Core::Id actionId) const
+{
+    Q_UNUSED(actionId)
+    return QString();
+}
+
+void AndroidDevice::executeAction(Core::Id actionId, QWidget *parent) const
+{
+    Q_UNUSED(actionId)
+    Q_UNUSED(parent)
+}
+
+ProjectExplorer::IDevice::Ptr AndroidDevice::clone() const
+{
+    return ProjectExplorer::IDevice::Ptr(new AndroidDevice(*this));
+}
+
+} // namespace Internal
+} // namespace Android
diff --git a/src/plugins/android/androiddevice.h b/src/plugins/android/androiddevice.h
new file mode 100644
index 0000000000000000000000000000000000000000..d5d31d02e8758ba2b7116122584a04c747a3a1da
--- /dev/null
+++ b/src/plugins/android/androiddevice.h
@@ -0,0 +1,68 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2012 BogDan Vatra <bog_dan_ro@yahoo.com>
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+**
+** GNU Lesser General Public License Usage
+**
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this file.
+** Please review the following information to ensure the GNU Lesser General
+** Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** Other Usage
+**
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**************************************************************************/
+
+#ifndef ANDROIDDEVICE_H
+#define ANDROIDDEVICE_H
+
+#include <projectexplorer/devicesupport/idevice.h>
+
+namespace Android {
+class AndroidPlugin; // needed for friend declaration
+
+namespace Internal {
+
+class AndroidDevice : public ProjectExplorer::IDevice
+{
+public:
+
+    ProjectExplorer::IDevice::DeviceInfo deviceInformation() const;
+
+    virtual QString displayType() const;
+    virtual ProjectExplorer::IDeviceWidget *createWidget();
+    virtual QList<Core::Id> actionIds() const;
+    virtual QString displayNameForActionId(Core::Id actionId) const;
+    virtual void executeAction(Core::Id actionId, QWidget *parent = 0) const;
+
+    virtual ProjectExplorer::IDevice::Ptr clone() const;
+
+
+protected:
+    friend class AndroidDeviceFactory;
+    friend class Android::AndroidPlugin;
+    AndroidDevice();
+    AndroidDevice(const AndroidDevice &other);
+};
+
+} // namespace Internal
+} // namespace Android
+
+#endif // ANDROIDDEVICE_H
diff --git a/src/plugins/android/androiddevicefactory.cpp b/src/plugins/android/androiddevicefactory.cpp
index adab2e55af4864e63132b2e860cc744085c560cb..df122738c355ee28e288bd9cd43a69dd6e3b8e4f 100644
--- a/src/plugins/android/androiddevicefactory.cpp
+++ b/src/plugins/android/androiddevicefactory.cpp
@@ -31,6 +31,7 @@
 **************************************************************************/
 
 #include "androiddevicefactory.h"
+#include "androiddevice.h"
 
 #include "androidconstants.h"
 #include <coreplugin/id.h>
@@ -39,7 +40,9 @@ namespace Android {
 namespace Internal {
 
 AndroidDeviceFactory::AndroidDeviceFactory()
-{ setObjectName(QLatin1String("AndroidDeviceFactory")); }
+{
+    setObjectName(QLatin1String("AndroidDeviceFactory"));
+}
 
 QString AndroidDeviceFactory::displayNameForId(Core::Id type) const
 {
@@ -60,20 +63,19 @@ bool AndroidDeviceFactory::canCreate() const
 
 ProjectExplorer::IDevice::Ptr AndroidDeviceFactory::create(Core::Id id) const
 {
-    Q_UNUSED(id);
+    Q_UNUSED(id)
     return ProjectExplorer::IDevice::Ptr();
 }
 
 bool AndroidDeviceFactory::canRestore(const QVariantMap &map) const
 {
-    Q_UNUSED(map);
-    return false;
+    return ProjectExplorer::IDevice::typeFromMap(map) == Core::Id(Constants::ANDROID_DEVICE_TYPE);
 }
 
 ProjectExplorer::IDevice::Ptr AndroidDeviceFactory::restore(const QVariantMap &map) const
 {
-    Q_UNUSED(map);
-    return ProjectExplorer::IDevice::Ptr();
+    Q_UNUSED(map)
+    return ProjectExplorer::IDevice::Ptr(new AndroidDevice);
 }
 
 } // namespace Internal
diff --git a/src/plugins/android/androidmanager.cpp b/src/plugins/android/androidmanager.cpp
index d88f056d25285ac4b9968cd0d8a954dab401eda7..7b63d8691796e22ea6815b90028005ee542e4efd 100644
--- a/src/plugins/android/androidmanager.cpp
+++ b/src/plugins/android/androidmanager.cpp
@@ -408,16 +408,20 @@ bool AndroidManager::createAndroidTemplatesIfNecessary(ProjectExplorer::Target *
 
     Utils::FileName javaSrcPath
             = Utils::FileName::fromString(version->versionInfo()[QLatin1String("QT_INSTALL_PREFIX")])
-            .append(QLatin1String("src/android/java"));
+            .appendPath(QLatin1String("src/android/java"));
     QDir projectDir(qt4Project->projectDirectory());
     Utils::FileName androidPath = dirPath(target);
 
     QStringList m_ignoreFiles;
     bool forceUpdate = false;
     QDomDocument srcVersionDoc;
-    if (openXmlFile(target, srcVersionDoc, javaSrcPath.append(QLatin1String("version.xml")), false)) {
+    Utils::FileName srcVersionPath = javaSrcPath;
+    srcVersionPath.appendPath(QLatin1String("version.xml"));
+    if (openXmlFile(target, srcVersionDoc, srcVersionPath, false)) {
         QDomDocument dstVersionDoc;
-        if (openXmlFile(target, dstVersionDoc, androidPath.append(QLatin1String("version.xml")), false))
+        Utils::FileName dstVersionPath=androidPath;
+        dstVersionPath.appendPath(QLatin1String("version.xml"));
+        if (openXmlFile(target, dstVersionDoc, dstVersionPath, false))
             forceUpdate = (srcVersionDoc.documentElement().attribute(QLatin1String("value")).toDouble()
                            > dstVersionDoc.documentElement().attribute(QLatin1String("value")).toDouble());
         else
@@ -458,7 +462,8 @@ bool AndroidManager::createAndroidTemplatesIfNecessary(ProjectExplorer::Target *
         if (it.fileInfo().isDir()) {
             projectDir.mkpath(AndroidDirName + it.filePath().mid(pos));
         } else {
-            const Utils::FileName dstFile = androidPath.append(it.filePath().mid(pos));
+            Utils::FileName dstFile = androidPath;
+            dstFile.appendPath(it.filePath().mid(pos));
             if (m_ignoreFiles.contains(it.fileName())) {
                 continue;
             } else {
diff --git a/src/plugins/android/androidpackagecreationstep.cpp b/src/plugins/android/androidpackagecreationstep.cpp
index 293201a8ec71e3a02ef15b6d242d4f111516577d..ed289711927349e52a5f632b9654f4b171538120 100644
--- a/src/plugins/android/androidpackagecreationstep.cpp
+++ b/src/plugins/android/androidpackagecreationstep.cpp
@@ -161,8 +161,7 @@ bool AndroidPackageCreationStep::init()
         androidLibPath = path.appendPath(QLatin1String("libs/armeabi-v7a"));
     else
         androidLibPath = path.appendPath(QLatin1String("libs/armeabi"));
-    path = m_androidDir;
-    m_gdbServerDestination = path.appendPath(QLatin1String("gdbserver"));
+    m_gdbServerDestination = androidLibPath.appendPath(QLatin1String("gdbserver"));
     m_gdbServerSource = AndroidConfigurations::instance().gdbServerPath(target()->activeRunConfiguration()->abi().architecture());
     m_debugBuild = bc->qmakeBuildConfiguration() & QtSupport::BaseQtVersion::DebugBuild;
 
diff --git a/src/plugins/android/androidplugin.cpp b/src/plugins/android/androidplugin.cpp
index 9197ea4574b160971fe79ddc2f97e42131514e37..40f5bf8fe281fb98a71028c97c0e34928210e487 100644
--- a/src/plugins/android/androidplugin.cpp
+++ b/src/plugins/android/androidplugin.cpp
@@ -35,6 +35,7 @@
 #include "androidconstants.h"
 #include "androidconfigurations.h"
 #include "androiddeploystepfactory.h"
+#include "androiddevice.h"
 #include "androiddevicefactory.h"
 #include "androidconfigurations.h"
 #include "androidmanager.h"
@@ -48,6 +49,8 @@
 
 #include <QtPlugin>
 
+#include <projectexplorer/devicesupport/devicemanager.h>
+
 namespace Android {
 
 AndroidPlugin::AndroidPlugin()
@@ -76,6 +79,9 @@ bool AndroidPlugin::initialize(const QStringList &arguments,
     addAutoReleasedObject(new Internal::AndroidToolChainFactory);
     addAutoReleasedObject(new Internal::AndroidDeployConfigurationFactory);
     addAutoReleasedObject(new Internal::AndroidDeviceFactory);
+    ProjectExplorer::DeviceManager *dm = ProjectExplorer::DeviceManager::instance();
+    if (dm->find(Core::Id(Constants::ANDROID_DEVICE_ID)).isNull())
+        dm->addDevice(ProjectExplorer::IDevice::Ptr(new Internal::AndroidDevice));
     return true;
 }
 
diff --git a/src/plugins/android/androidsettingswidget.cpp b/src/plugins/android/androidsettingswidget.cpp
index ec6fca61d4f917ce2fe5e5985afb34fa26b20f1d..5fb4fb42d10fa8ea25aaae95d0b3479d3671aabc 100644
--- a/src/plugins/android/androidsettingswidget.cpp
+++ b/src/plugins/android/androidsettingswidget.cpp
@@ -49,7 +49,7 @@
 namespace Android {
 namespace Internal {
 
-void AVDModel::setAvdList(QVector<AndroidDevice> list)
+void AVDModel::setAvdList(QVector<AndroidDeviceInfo> list)
 {
     m_list = list;
     reset();
@@ -147,7 +147,6 @@ QString AndroidSettingsWidget::searchKeywords() const
 void AndroidSettingsWidget::initGui()
 {
     m_ui->setupUi(this);
-    m_ui->toolchainVersionComboBox->clear();
     if (checkSDK(m_androidConfig.sdkLocation))
         m_ui->SDKLocationLineEdit->setText(m_androidConfig.sdkLocation.toUserOutput());
     else
@@ -167,6 +166,7 @@ void AndroidSettingsWidget::initGui()
     m_AVDModel.setAvdList(AndroidConfigurations::instance().androidVirtualDevices());
     m_ui->AVDTableView->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
     m_ui->AVDTableView->horizontalHeader()->setResizeMode(1, QHeaderView::ResizeToContents);
+    fillToolchainVersions();
 }
 
 void AndroidSettingsWidget::saveSettings(bool saveNow)
@@ -251,9 +251,9 @@ void AndroidSettingsWidget::ndkLocationEditingFinished()
 
 void AndroidSettingsWidget::fillToolchainVersions()
 {
-    m_ui->toolchainVersionComboBox->clear();
     QStringList toolchainVersions = AndroidConfigurations::instance().ndkToolchainVersions();
     QString toolchain = m_androidConfig.ndkToolchainVersion;
+    m_ui->toolchainVersionComboBox->clear();
     foreach (const QString &item, toolchainVersions)
         m_ui->toolchainVersionComboBox->addItem(item);
     if (!toolchain.isEmpty())
diff --git a/src/plugins/android/androidsettingswidget.h b/src/plugins/android/androidsettingswidget.h
index 8de720593d5cd6c96fc46b4e653a2e6888e0b590..0c8851dda86affa0c92ae9571e43efd67ed87012 100644
--- a/src/plugins/android/androidsettingswidget.h
+++ b/src/plugins/android/androidsettingswidget.h
@@ -55,7 +55,7 @@ class AVDModel: public QAbstractTableModel
 {
     Q_OBJECT
 public:
-    void setAvdList(QVector<AndroidDevice> list);
+    void setAvdList(QVector<AndroidDeviceInfo> list);
     QString avdName(const QModelIndex &index);
 
 protected:
@@ -65,7 +65,7 @@ protected:
     int columnCount(const QModelIndex &parent = QModelIndex()) const;
 
 private:
-    QVector<AndroidDevice> m_list;
+    QVector<AndroidDeviceInfo> m_list;
 };
 
 class AndroidSettingsWidget : public QWidget
diff --git a/src/plugins/android/androidtoolchain.cpp b/src/plugins/android/androidtoolchain.cpp
index d9955c805bc82ffda3dbbc869159835acef29225..3e99f6a9f8a3ba824311e9a8d3dfd49829ccd76b 100644
--- a/src/plugins/android/androidtoolchain.cpp
+++ b/src/plugins/android/androidtoolchain.cpp
@@ -38,9 +38,11 @@
 
 #include "qt4projectmanager/qt4projectmanagerconstants.h"
 
+#include <projectexplorer/target.h>
 #include <projectexplorer/toolchainmanager.h>
 #include <projectexplorer/projectexplorer.h>
 #include <qt4projectmanager/qt4project.h>
+#include <qtsupport/qtprofileinformation.h>
 #include <qtsupport/qtversionmanager.h>
 
 #include <utils/environment.h>
@@ -91,6 +93,11 @@ void AndroidToolChain::addToEnvironment(Utils::Environment &env) const
 // TODO this vars should be configurable in projects -> build tab
 // TODO invalidate all .pro files !!!
 
+    Qt4Project *qt4pro = qobject_cast<Qt4Project *>(ProjectExplorer::ProjectExplorerPlugin::instance()->currentProject());
+    if (!qt4pro || !qt4pro->activeTarget()
+            || QtSupport::QtProfileInformation::qtVersion(qt4pro->activeTarget()->profile())->type() != QLatin1String(Constants::ANDROIDQT))
+        return;
+
     QString ndk_host = QLatin1String(
 #if defined(Q_OS_LINUX)
         "linux-x86"
@@ -107,11 +114,6 @@ void AndroidToolChain::addToEnvironment(Utils::Environment &env) const
     env.set(QLatin1String("ANDROID_NDK_TOOLCHAIN_PREFIX"), AndroidConfigurations::toolchainPrefix(targetAbi().architecture()));
     env.set(QLatin1String("ANDROID_NDK_TOOLS_PREFIX"), AndroidConfigurations::toolsPrefix(targetAbi().architecture()));
     env.set(QLatin1String("ANDROID_NDK_TOOLCHAIN_VERSION"), AndroidConfigurations::instance().config().ndkToolchainVersion);
-
-    // TODO that is very ugly and likely to be wrong...
-    Qt4Project *qt4pro = qobject_cast<Qt4Project *>(ProjectExplorer::ProjectExplorerPlugin::instance()->currentProject());
-    if (!qt4pro || !qt4pro->activeTarget())
-        return;
     env.set(QLatin1String("ANDROID_NDK_PLATFORM"),
             AndroidConfigurations::instance().bestMatch(AndroidManager::targetSDK(qt4pro->activeTarget())));
 }
diff --git a/src/plugins/qt4projectmanager/wizards/qtquickapp.cpp b/src/plugins/qt4projectmanager/wizards/qtquickapp.cpp
index 79d7b8e6eb0077143b80462e4339784d7c13d765..e24dd57251e280d6917e3522683c2f9a32605e94 100644
--- a/src/plugins/qt4projectmanager/wizards/qtquickapp.cpp
+++ b/src/plugins/qt4projectmanager/wizards/qtquickapp.cpp
@@ -466,7 +466,7 @@ QString QtQuickApp::componentSetDir(ComponentSet componentSet) const
     }
 }
 
-const int QtQuickApp::StubVersion = 20;
+const int QtQuickApp::StubVersion = 21;
 
 } // namespace Internal
 } // namespace Qt4ProjectManager