diff --git a/tests/tools/qtquickappblaster/main.cpp b/tests/tools/qtquickappblaster/main.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..470aca4c5452e4c21d67307201d5bd1251d96772
--- /dev/null
+++ b/tests/tools/qtquickappblaster/main.cpp
@@ -0,0 +1,101 @@
+#include "qmlstandaloneapp.h"
+#include <QtCore>
+
+using namespace Qt4ProjectManager::Internal;
+
+bool processXmlFile(const QString &xmlFile)
+{
+    QFile file(xmlFile);
+    if (!file.open(QIODevice::ReadOnly))
+        return false;
+
+    const QLatin1String tag_app("app");
+    const QLatin1String attrib_mainQmlFile("mainqmlfile");
+    const QLatin1String attrib_projectPath("projectpath");
+    const QLatin1String attrib_projectName("projectname");
+    const QLatin1String attrib_screenOrientation("screenorientation");
+    const QLatin1String value_screenOrientationLockLandscape("LockLandscape");
+    const QLatin1String value_screenOrientationLockPortrait("LockPortrait");
+    const QLatin1String attrib_networkAccess("networkAccess");
+
+    static const QString qtDir =
+            QLibraryInfo::location(QLibraryInfo::PrefixPath) + QLatin1Char('/');
+
+    QXmlStreamReader reader(&file);
+    while (!reader.atEnd()) {
+        const QXmlStreamReader::TokenType token = reader.readNext();
+        switch (token) {
+            case QXmlStreamReader::StartElement:
+                if (reader.name() == tag_app) {
+                    QmlStandaloneApp qmlApp;
+                    if (!reader.attributes().hasAttribute(attrib_projectName)) {
+                        qDebug() << "Error: Project without name";
+                        continue;
+                    }
+                    qmlApp.setProjectName(reader.attributes().value(attrib_projectName).toString());
+                    QFileInfo projectPath;
+                    if (reader.attributes().hasAttribute(attrib_projectPath))
+                        projectPath = qtDir + reader.attributes().value(attrib_projectPath).toString();
+                    qmlApp.setProjectPath(projectPath.absoluteFilePath());
+                    if (reader.attributes().hasAttribute(attrib_mainQmlFile)) {
+                        const QFileInfo qmlFileOrigin(
+                                qtDir + reader.attributes().value(attrib_mainQmlFile).toString());
+                        if (!qmlFileOrigin.exists()) {
+                            qDebug() << "Cannot find" <<
+                                        QDir::toNativeSeparators(qmlFileOrigin.absoluteFilePath());
+                            continue;
+                        }
+                        const QFileInfo qmlTargetPath(QString(projectPath.absoluteFilePath()
+                                                              + QLatin1Char('/') + qmlApp.projectName()
+                                                              + QLatin1String("/qml/") + qmlApp.projectName()));
+#ifdef Q_OS_WIN
+                        const QString sourcePath =
+                                QDir::toNativeSeparators(qmlFileOrigin.canonicalPath() + QLatin1String("/*"));
+                        const QString targetPath =
+                                QDir::toNativeSeparators(qmlTargetPath.absoluteFilePath() + QLatin1Char('/'));
+                        QProcess xcopy;
+                        QStringList parameters;
+                        parameters << QLatin1String("/E") << sourcePath << targetPath;
+                        xcopy.start(QLatin1String("xcopy.exe"), parameters);
+                        if (!xcopy.waitForStarted() || !xcopy.waitForFinished()) {
+                            qDebug() << "Could not copy" <<
+                                        QDir::toNativeSeparators(sourcePath);
+                            continue;
+                        }
+#else // Q_OS_WIN
+                        // Implement me!
+#endif // Q_OS_WIN
+                        qmlApp.setMainQmlFile(qmlTargetPath.absoluteFilePath()
+                                              + QLatin1Char('/') + qmlFileOrigin.fileName());
+                    }
+                    if (reader.attributes().hasAttribute(attrib_screenOrientation)) {
+                        const QStringRef orientation = reader.attributes().value(attrib_screenOrientation);
+                        qmlApp.setOrientation(orientation == value_screenOrientationLockLandscape ?
+                                                AbstractMobileApp::ScreenOrientationLockLandscape
+                                              : orientation == value_screenOrientationLockPortrait ?
+                                                AbstractMobileApp::ScreenOrientationLockPortrait
+                                              : AbstractMobileApp::ScreenOrientationAuto);
+                    }
+                    if (reader.attributes().hasAttribute(attrib_networkAccess))
+                        qmlApp.setNetworkEnabled(
+                                    reader.attributes().value(attrib_networkAccess) == QLatin1String("true"));
+                    if (!qmlApp.generateFiles(0))
+                        qDebug() << "Unable to generate the files for" << qmlApp.projectName();
+                }
+                break;
+            default:
+                break;
+        }
+    }
+    return true;
+}
+
+int main(int argc, char *argv[])
+{
+    QCoreApplication a(argc, argv);
+
+    if (!processXmlFile(QLatin1String(":/qtquickapps.xml")))
+        return 1;
+
+    return 0;
+}
diff --git a/tests/tools/qtquickappblaster/qtquickappblaster.pro b/tests/tools/qtquickappblaster/qtquickappblaster.pro
new file mode 100644
index 0000000000000000000000000000000000000000..1d2628fa8f722b09823a5c1a1355a71dfa905bcd
--- /dev/null
+++ b/tests/tools/qtquickappblaster/qtquickappblaster.pro
@@ -0,0 +1,17 @@
+CREATORSOURCEDIR = ../../../
+
+DEFINES += \
+    CREATORLESSTEST
+APPSOURCEDIR = $$CREATORSOURCEDIR/src/plugins/qt4projectmanager/wizards
+HEADERS += \
+    $$APPSOURCEDIR/qmlstandaloneapp.h \
+    $$APPSOURCEDIR/abstractmobileapp.h
+SOURCES += \
+    $$APPSOURCEDIR/qmlstandaloneapp.cpp \
+    $$APPSOURCEDIR/abstractmobileapp.cpp \
+    main.cpp \
+    $$CREATORSOURCEDIR/tests/manual/qmlstandalone/helpers.cpp
+INCLUDEPATH += $$APPSOURCEDIR
+OTHER_FILES = qtquickapps.xml
+RESOURCES += \
+    qtquickappblaster.qrc
diff --git a/tests/tools/qtquickappblaster/qtquickappblaster.qrc b/tests/tools/qtquickappblaster/qtquickappblaster.qrc
new file mode 100644
index 0000000000000000000000000000000000000000..108222b9529f4840ac46ed27f9f529e3a790a849
--- /dev/null
+++ b/tests/tools/qtquickappblaster/qtquickappblaster.qrc
@@ -0,0 +1,5 @@
+<RCC>
+    <qresource prefix="/">
+        <file>qtquickapps.xml</file>
+    </qresource>
+</RCC>
diff --git a/tests/tools/qtquickappblaster/qtquickapps.xml b/tests/tools/qtquickappblaster/qtquickapps.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a5791b7659b171649b303e1715490c933e404381
--- /dev/null
+++ b/tests/tools/qtquickappblaster/qtquickapps.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<qmlapps>
+    <app
+        mainqmlfile="examples/declarative/animation/basics/property-animation.qml"
+        projectpath="qtquickexamples/animation/basics"
+        projectname="propertyanimation"
+    >
+    <app
+        mainqmlfile="examples/declarative/animation/basics/color-animation.qml"
+        projectpath="qtquickexamples/animation/basics"
+        projectname="coloranimation"
+    >
+    <app
+        mainqmlfile="examples/declarative/toys/clocks/clocks.qml"
+        projectpath="qtquickexamples/toys"
+        projectname="clocks"
+        screenorientation="LockLandscape"
+    >
+    <app
+        mainqmlfile="demos/declarative/flickr/flickr.qml"
+        projectpath="qtquickexamples"
+        projectname="flickr"
+        screenorientation="LockPortrait"
+        networkaccess="true"
+    >
+</qmlapps>