diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp
index 54e0fcba66a082b746ed2bb908f15b4f31324c0b..ca20939773fbac528a08f12f08fd38ad7dee8e5a 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp
@@ -66,10 +66,10 @@ void S60DeviceRunConfiguration::restore(const PersistentSettingsReader &reader)
     m_proFilePath = projectDir.filePath(reader.restoreValue("ProFile").toString());
 }
 
-QString S60DeviceRunConfiguration::executable() const
+QString S60DeviceRunConfiguration::basePackageFilePath() const
 {
     const_cast<S60DeviceRunConfiguration *>(this)->updateTarget();
-    return m_executable;
+    return m_baseFileName;
 }
 
 void S60DeviceRunConfiguration::updateTarget()
@@ -79,7 +79,7 @@ void S60DeviceRunConfiguration::updateTarget()
     Qt4Project *pro = static_cast<Qt4Project *>(project());
     Qt4PriFileNode * priFileNode = static_cast<Qt4Project *>(project())->rootProjectNode()->findProFileFor(m_proFilePath);
     if (!priFileNode) {
-        m_executable = QString::null;
+        m_baseFileName = QString::null;
         m_cachedTargetInformationValid = true;
         emit targetInformationChanged();
         return;
@@ -111,16 +111,33 @@ void S60DeviceRunConfiguration::updateTarget()
         return;
     }
 
-    QString baseDir = S60Manager::instance()->devices()->deviceForId(
-            S60Manager::instance()->deviceIdFromDetectionSource(qtVersion->autodetectionSource())).epocRoot;
-    QString qmakeBuildConfig = "urel";
-    if (projectBuildConfiguration & QtVersion::DebugBuild)
-        qmakeBuildConfig = "udeb";
-    baseDir += "/epoc32/release/winscw/" + qmakeBuildConfig;
+    // Extract data
+    const QDir baseProjectDirectory = QFileInfo(project()->file()->fileName()).absoluteDir();
+    const QString relSubDir = baseProjectDirectory.relativeFilePath(QFileInfo(m_proFilePath).path());
+    const QDir baseBuildDirectory = project()->buildDirectory(project()->activeBuildConfiguration());
+    const QString baseDir = baseBuildDirectory.absoluteFilePath(relSubDir);
+
+    // Directory
+    QString m_workingDir;
+    if (reader->contains("DESTDIR")) {
+        m_workingDir = reader->value("DESTDIR");
+        if (QDir::isRelativePath(m_workingDir)) {
+            m_workingDir = baseDir + QLatin1Char('/') + m_workingDir;
+        }
+    } else {
+        m_workingDir = baseDir;
+    }
 
-    m_executable = QDir::toNativeSeparators(
-            QDir::cleanPath(baseDir + QLatin1Char('/') + reader->value("TARGET")));
-    m_executable += QLatin1String(".exe");
+    m_baseFileName = QDir::cleanPath(m_workingDir + QLatin1Char('/') + reader->value("TARGET"));
+
+    if (pro->toolChainType(pro->activeBuildConfiguration()) == ToolChain::GCCE)
+        m_baseFileName += "_gcce";
+    else
+        m_baseFileName += "_armv5";
+    if (projectBuildConfiguration & QtVersion::DebugBuild)
+        m_baseFileName += "_udeb";
+    else
+        m_baseFileName += "_rel";
 
     delete reader;
     m_cachedTargetInformationValid = true;
@@ -149,8 +166,8 @@ S60DeviceRunConfigurationWidget::S60DeviceRunConfigurationWidget(S60DeviceRunCon
     nameLabel->setBuddy(m_nameLineEdit);
     toplayout->addRow(nameLabel, m_nameLineEdit);
 
-    m_executableLabel = new QLabel(m_runConfiguration->executable());
-    toplayout->addRow(tr("Executable:"), m_executableLabel);
+    m_sisxFileLabel = new QLabel(m_runConfiguration->basePackageFilePath() + ".sisx");
+    toplayout->addRow(tr("Install File:"), m_sisxFileLabel);
 
     connect(m_nameLineEdit, SIGNAL(textEdited(QString)),
         this, SLOT(nameEdited(QString)));
@@ -165,7 +182,7 @@ void S60DeviceRunConfigurationWidget::nameEdited(const QString &text)
 
 void S60DeviceRunConfigurationWidget::updateTargetInformation()
 {
-    m_executableLabel->setText(m_runConfiguration->executable());
+    m_sisxFileLabel->setText(m_runConfiguration->basePackageFilePath() + ".sisx");
 }
 
 // ======== S60DeviceRunConfigurationFactory
@@ -247,14 +264,15 @@ RunControl* S60DeviceRunConfigurationRunner::run(QSharedPointer<RunConfiguration
 S60DeviceRunControl::S60DeviceRunControl(QSharedPointer<RunConfiguration> runConfiguration)
     : RunControl(runConfiguration)
 {
-    connect(&m_applicationLauncher, SIGNAL(applicationError(QString)),
-            this, SLOT(slotError(QString)));
-    connect(&m_applicationLauncher, SIGNAL(appendOutput(QString)),
-            this, SLOT(slotAddToOutputWindow(QString)));
-    connect(&m_applicationLauncher, SIGNAL(processExited(int)),
-            this, SLOT(processExited(int)));
-    connect(&m_applicationLauncher, SIGNAL(bringToForegroundRequested(qint64)),
-            this, SLOT(bringApplicationToForeground(qint64)));
+    m_makesis = new QProcess(this);
+    connect(m_makesis, SIGNAL(readyReadStandardError()),
+            this, SLOT(readStandardError()));
+    connect(m_makesis, SIGNAL(readyReadStandardOutput()),
+            this, SLOT(readStandardOutput()));
+    connect(m_makesis, SIGNAL(error(QProcess::ProcessError)),
+            this, SLOT(makesisProcessFailed()));
+    connect(m_makesis, SIGNAL(finished(int,QProcess::ExitStatus)),
+            this, SLOT(makesisProcessFinished()));
 }
 
 void S60DeviceRunControl::start()
@@ -262,44 +280,71 @@ void S60DeviceRunControl::start()
     QSharedPointer<S60DeviceRunConfiguration> rc = runConfiguration().dynamicCast<S60DeviceRunConfiguration>();
     Q_ASSERT(!rc.isNull());
 
-    // stuff like the EPOCROOT and EPOCDEVICE env variable
-    Environment env = Environment::systemEnvironment();
-    static_cast<Qt4Project *>(rc->project())->toolChain(rc->project()->activeBuildConfiguration())->addToEnvironment(env);
-    m_applicationLauncher.setEnvironment(env.toStringList());
-
-    m_executable = rc->executable();
+    m_baseFileName = rc->basePackageFilePath();
+    m_workingDirectory = QFileInfo(m_baseFileName).absolutePath();
 
-    m_applicationLauncher.start(ApplicationLauncher::Gui,
-                                m_executable, QStringList());
     emit started();
 
-    emit addToOutputWindow(this, tr("Starting %1...").arg(QDir::toNativeSeparators(m_executable)));
+    emit addToOutputWindow(this, tr("Creating %1.sisx ...").arg(QDir::toNativeSeparators(m_baseFileName)));
+
+    Qt4Project *project = qobject_cast<Qt4Project *>(runConfiguration()->project());
+    Q_ASSERT(project);
+    m_toolsDirectory = S60Manager::instance()->devices()->deviceForId(
+            S60Manager::instance()->deviceIdFromDetectionSource(
+            project->qtVersion(project->activeBuildConfiguration())
+            ->autodetectionSource())).epocRoot
+            + "/epoc32/tools";
+    QString makesisTool = m_toolsDirectory + "/makesis.exe";
+    QString packageFile = QFileInfo(m_baseFileName + ".pkg").fileName();
+    m_makesis->setWorkingDirectory(m_workingDirectory);
+    emit addToOutputWindow(this, QString::fromLatin1("%1 %2").arg(makesisTool, packageFile));
+    m_makesis->start(makesisTool, QStringList()
+        << packageFile,
+        QIODevice::ReadOnly);
 }
 
 void S60DeviceRunControl::stop()
 {
-    m_applicationLauncher.stop();
+    // TODO
 }
 
 bool S60DeviceRunControl::isRunning() const
 {
-    return m_applicationLauncher.isRunning();
+    return m_makesis->state() != QProcess::NotRunning;
 }
 
-void S60DeviceRunControl::slotError(const QString & err)
+void S60DeviceRunControl::readStandardError()
 {
-    emit error(this, err);
-    emit finished();
+    QProcess *process = static_cast<QProcess *>(sender());
+    QByteArray data = process->readAllStandardError();
+    emit addToOutputWindowInline(this, QString::fromLocal8Bit(data.constData(), data.length()));
 }
 
-void S60DeviceRunControl::slotAddToOutputWindow(const QString &line)
+void S60DeviceRunControl::readStandardOutput()
 {
-    if (line.contains("Qt"))
-        emit addToOutputWindowInline(this, line);
+    QProcess *process = static_cast<QProcess *>(sender());
+    QByteArray data = process->readAllStandardOutput();
+    emit addToOutputWindowInline(this, QString::fromLocal8Bit(data.constData(), data.length()));
+}
+
+void S60DeviceRunControl::makesisProcessFailed()
+{
+    QString errorString;
+    switch (m_makesis->error()) {
+    case QProcess::FailedToStart:
+        errorString = tr("Failed to start makesis.exe.");
+        break;
+    case QProcess::Crashed:
+        errorString = tr("makesis.exe has unexpectedly finished.");
+        break;
+    default:
+        errorString = tr("Some error has occurred while running makesis.exe.");
+    }
+    error(this, errorString);
 }
 
-void S60DeviceRunControl::processExited(int exitCode)
+void S60DeviceRunControl::makesisProcessFinished()
 {
-    emit addToOutputWindow(this, tr("%1 exited with code %2").arg(QDir::toNativeSeparators(m_executable)).arg(exitCode));
+    emit addToOutputWindow(this, tr("Finished."));
     emit finished();
 }
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h
index d1839f357c62d424e90a3e2536ade293f3aa588c..2a1c7b5db256258dcabcd3897e664df2ecd3f9b1 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h
+++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h
@@ -2,8 +2,8 @@
 #define S60DEVICERUNCONFIGURATION_H
 
 #include <projectexplorer/runconfiguration.h>
-#include <projectexplorer/applicationlauncher.h>
 
+#include <QtCore/QProcess>
 #include <QtGui/QWidget>
 #include <QtGui/QLabel>
 #include <QtGui/QLineEdit>
@@ -24,7 +24,7 @@ public:
     void save(ProjectExplorer::PersistentSettingsWriter &writer) const;
     void restore(const ProjectExplorer::PersistentSettingsReader &reader);
 
-    QString executable() const;
+    QString basePackageFilePath() const;
 
 signals:
     void targetInformationChanged();
@@ -36,7 +36,7 @@ private:
     void updateTarget();
 
     QString m_proFilePath;
-    QString m_executable;
+    QString m_baseFileName;
     bool m_cachedTargetInformationValid;
 };
 
@@ -54,7 +54,7 @@ private slots:
 private:
     S60DeviceRunConfiguration *m_runConfiguration;
     QLineEdit *m_nameLineEdit;
-    QLabel *m_executableLabel;
+    QLabel *m_sisxFileLabel;
 };
 
 class S60DeviceRunConfigurationFactory : public ProjectExplorer::IRunConfigurationFactory
@@ -92,13 +92,18 @@ public:
     bool isRunning() const;
 
 private slots:
-    void processExited(int exitCode);
-    void slotAddToOutputWindow(const QString &line);
-    void slotError(const QString & error);
+    void readStandardError();
+    void readStandardOutput();
+    void makesisProcessFailed();
+    void makesisProcessFinished();
 
 private:
-    ProjectExplorer::ApplicationLauncher m_applicationLauncher;
-    QString m_executable;
+    QString m_baseFileName;
+    QString m_workingDirectory;
+    QString m_toolsDirectory;
+    QProcess *m_makesis;
+    QProcess *m_signsis;
+    QProcess *m_install;
 };
 
 } // namespace Internal