diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp
index ca20939773fbac528a08f12f08fd38ad7dee8e5a..7fbffe9096414e3776c758c553f41b124c6e7e16 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp
@@ -273,6 +273,15 @@ S60DeviceRunControl::S60DeviceRunControl(QSharedPointer<RunConfiguration> runCon
             this, SLOT(makesisProcessFailed()));
     connect(m_makesis, SIGNAL(finished(int,QProcess::ExitStatus)),
             this, SLOT(makesisProcessFinished()));
+    m_signsis = new QProcess(this);
+    connect(m_signsis, SIGNAL(readyReadStandardError()),
+            this, SLOT(readStandardError()));
+    connect(m_signsis, SIGNAL(readyReadStandardOutput()),
+            this, SLOT(readStandardOutput()));
+    connect(m_signsis, SIGNAL(error(QProcess::ProcessError)),
+            this, SLOT(signsisProcessFailed()));
+    connect(m_signsis, SIGNAL(finished(int,QProcess::ExitStatus)),
+            this, SLOT(signsisProcessFinished()));
 }
 
 void S60DeviceRunControl::start()
@@ -280,14 +289,16 @@ void S60DeviceRunControl::start()
     QSharedPointer<S60DeviceRunConfiguration> rc = runConfiguration().dynamicCast<S60DeviceRunConfiguration>();
     Q_ASSERT(!rc.isNull());
 
+    Qt4Project *project = qobject_cast<Qt4Project *>(runConfiguration()->project());
+
     m_baseFileName = rc->basePackageFilePath();
     m_workingDirectory = QFileInfo(m_baseFileName).absolutePath();
+    m_qtDir = project->qtVersion(project->activeBuildConfiguration())->path();
 
     emit started();
 
     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(
@@ -328,23 +339,45 @@ void S60DeviceRunControl::readStandardOutput()
 }
 
 void S60DeviceRunControl::makesisProcessFailed()
+{
+    processFailed("makesis.exe", m_makesis->error());
+}
+
+void S60DeviceRunControl::makesisProcessFinished()
+{
+    QString signsisTool = m_toolsDirectory + "/signsis.exe";
+    QString sisFile = QFileInfo(m_baseFileName + ".sis").fileName();
+    QString sisxFile = QFileInfo(m_baseFileName + ".sisx").fileName();
+    QStringList arguments;
+    arguments << sisFile << sisxFile << (m_qtDir + "/selfsigned.cer") << (m_qtDir + "/selfsigned.key");
+    m_signsis->setWorkingDirectory(m_workingDirectory);
+    emit addToOutputWindow(this, QString::fromLatin1("%1 %2").arg(signsisTool, arguments.join(tr(" "))));
+    m_signsis->start(signsisTool, arguments, QIODevice::ReadOnly);
+}
+
+void S60DeviceRunControl::signsisProcessFailed()
+{
+    processFailed("signsis.exe", m_signsis->error());
+}
+
+void S60DeviceRunControl::signsisProcessFinished()
+{
+    emit addToOutputWindow(this, tr("Finished."));
+    emit finished();
+}
+
+void S60DeviceRunControl::processFailed(const QString &program, QProcess::ProcessError errorCode)
 {
     QString errorString;
-    switch (m_makesis->error()) {
+    switch (errorCode) {
     case QProcess::FailedToStart:
-        errorString = tr("Failed to start makesis.exe.");
+        errorString = tr("Failed to start %1.");
         break;
     case QProcess::Crashed:
-        errorString = tr("makesis.exe has unexpectedly finished.");
+        errorString = tr("%1 has unexpectedly finished.");
         break;
     default:
-        errorString = tr("Some error has occurred while running makesis.exe.");
+        errorString = tr("Some error has occurred while running %1.");
     }
-    error(this, errorString);
-}
-
-void S60DeviceRunControl::makesisProcessFinished()
-{
-    emit addToOutputWindow(this, tr("Finished."));
-    emit finished();
+    error(this, errorString.arg(program));
 }
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h
index 2a1c7b5db256258dcabcd3897e664df2ecd3f9b1..b5f3db1d54901124d34b18e2803f11910439292c 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h
+++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h
@@ -96,11 +96,16 @@ private slots:
     void readStandardOutput();
     void makesisProcessFailed();
     void makesisProcessFinished();
+    void signsisProcessFailed();
+    void signsisProcessFinished();
 
 private:
+    void processFailed(const QString &program, QProcess::ProcessError errorCode);
+
     QString m_baseFileName;
     QString m_workingDirectory;
     QString m_toolsDirectory;
+    QString m_qtDir;
     QProcess *m_makesis;
     QProcess *m_signsis;
     QProcess *m_install;