diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp
index b9c9a67c75a5b71648c08f7bcca3d20f0cae8173..9d02d33efb53ef0616c88ddbfa95ef20c73dc27c 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp
@@ -309,6 +309,13 @@ const QString MaemoRunConfiguration::sysRoot() const
     return QString();
 }
 
+const QString MaemoRunConfiguration::targetRoot() const
+{
+    if (const MaemoToolChain *tc = toolchain())
+        return tc->targetRoot();
+    return QString();
+}
+
 const QStringList MaemoRunConfiguration::arguments() const
 {
     return m_arguments;
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.h b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.h
index 0e50c834721d0628eaeb64fecfdd66ae6a6ed924..6c7ae254ab46dff3bcaea6ec15ba88ffc11c14ff 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.h
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.h
@@ -78,6 +78,7 @@ public:
     QString maddeRoot() const;
     QString executable() const;
     const QString sysRoot() const;
+    const QString targetRoot() const;
     const QStringList arguments() const;
     void setArguments(const QStringList &args);
     void setDeviceConfig(const MaemoDeviceConfig &deviceConfig);
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemoruncontrol.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemoruncontrol.cpp
index 531d413f0ba0649569347d3b67a00e9d1aef49a2..b6af2fe3cffd1dc02731b93554e49db957573eb0 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemoruncontrol.cpp
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemoruncontrol.cpp
@@ -46,6 +46,7 @@
 #include <QtCore/QDir>
 #include <QtCore/QFileInfo>
 #include <QtCore/QFuture>
+#include <QtCore/QProcess>
 #include <QtCore/QStringBuilder>
 
 namespace Qt4ProjectManager {
@@ -71,6 +72,13 @@ void AbstractMaemoRunControl::startDeployment(bool forDebugging)
             deployables.append(Deployable(executableFileName(),
                 QFileInfo(executableOnHost()).canonicalPath(),
                 &MaemoRunConfiguration::wasDeployed));
+            if (false) {
+                if (!buildPackage()) {
+                    qDebug("Error: Could not build package");
+                    handleDeploymentFinished(false);
+                    return;
+                }
+            }
         }
         if (forDebugging
             && runConfig->debuggingHelpersNeedDeployment(devConfig.host)) {
@@ -85,6 +93,107 @@ void AbstractMaemoRunControl::startDeployment(bool forDebugging)
     }
 }
 
+bool AbstractMaemoRunControl::buildPackage()
+{
+    qDebug("%s", Q_FUNC_INFO);
+    const QString projectDir = QFileInfo(executableOnHost()).absolutePath();
+
+    QFile configFile(runConfig->targetRoot() % QLatin1String("/config.sh"));
+    if (!configFile.open(QIODevice::ReadOnly)) {
+        qDebug("Cannot open config file '%s'", qPrintable(configFile.fileName()));
+        return false;
+    }
+    const QString &maddeRoot = runConfig->maddeRoot();
+    QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
+    const QLatin1String pathKey("PATH");
+    env.insert(pathKey,  maddeRoot % QLatin1String("/madbin:")
+                                        % env.value(pathKey));
+    env.insert(QLatin1String("PERL5LIB"),
+           maddeRoot % QLatin1String("/madlib/perl5"));
+    const QRegExp envPattern(QLatin1String("([^=]+)=[\"']?([^;\"']+)[\"']? ;.*"));
+    env.insert(QLatin1String("PWD"), projectDir);
+    QByteArray line;
+    do {
+        line = configFile.readLine(200);
+        if (envPattern.exactMatch(line))
+            env.insert(envPattern.cap(1), envPattern.cap(2));
+    } while (!line.isEmpty());
+    qDebug("Process environment: %s",
+        qPrintable(env.toStringList().join(QLatin1String(":"))));
+    qDebug("sysroot: '%s'", qPrintable(env.value(QLatin1String("SYSROOT_DIR"))));
+    QProcess buildProc;
+    buildProc.setProcessEnvironment(env);
+    buildProc.setWorkingDirectory(projectDir);
+
+    if (!QFileInfo(projectDir + QLatin1String("/debian")).exists()) {
+        if (!runCommand(buildProc, QLatin1String("dh_make -s -n")))
+            return false;
+        QFile rulesFile(projectDir + QLatin1String("/debian/rules"));
+        if (!rulesFile.open(QIODevice::ReadWrite)) {
+            qDebug("Error: Could not open debian/rules.");
+            return false;
+        }
+
+        QByteArray rulesContents = rulesFile.readAll();
+        rulesContents.replace("DESTDIR", "INSTALL_ROOT");
+        rulesFile.resize(0);
+        rulesFile.write(rulesContents);
+        if (rulesFile.error() != QFile::NoError) {
+            qDebug("Error: could not access debian/rules");
+            return false;
+        }
+    }
+
+    if (!runCommand(buildProc, QLatin1String("dh_installdirs")))
+        return false;
+    const QString targetFile(projectDir % QLatin1String("/debian/")
+                  % executableFileName().toLower() % QLatin1String("/usr/bin/")
+                  % executableFileName());
+    if (QFile::exists(targetFile)) {
+        if (!QFile::remove(targetFile)) {
+            qDebug("Error: Could not remove '%s'", qPrintable(targetFile));
+            return false;
+        }
+    }
+    if (!QFile::copy(executableOnHost(), targetFile)) {
+        qDebug("Error: Could not copy '%s' to '%s'",
+            qPrintable(executableOnHost()), qPrintable(targetFile));
+        return false;
+    }
+
+    const QStringList commands = QStringList() << QLatin1String("dh_link")
+        << QLatin1String("dh_fixperms") << QLatin1String("dh_installdeb")
+        << QLatin1String("dh_shlibdeps") << QLatin1String("dh_gencontrol")
+        << QLatin1String("dh_md5sums") << QLatin1String("dh_builddeb --destdir=.");
+    foreach (const QString &command, commands) {
+        if (!runCommand(buildProc, command))
+            return false;
+    }
+
+    return true;
+}
+
+bool AbstractMaemoRunControl::runCommand(QProcess &proc,
+             const QString &command)
+{
+    qDebug("Running command '%s'", qPrintable(command));
+    proc.start(runConfig->maddeRoot() % QLatin1String("/madbin/") % command);
+    proc.write("\n"); // For dh_make
+    if (!proc.waitForFinished(5000) && proc.error() == QProcess::Timedout) {
+        qDebug("command '%s' hangs", qPrintable(command));
+        return false;
+    }
+    if (proc.exitCode() != 0) {
+        qDebug("command '%s' failed with return value %d and output '%s'",
+               qPrintable(command),  proc.exitCode(),
+               (proc.readAllStandardOutput() + "\n" + proc.readAllStandardError()).data());
+        return false;
+    }
+    qDebug("Command finished, output was '%s'",
+        (proc.readAllStandardOutput() + "\n" + proc.readAllStandardError()).data());
+    return true;
+}
+
 void AbstractMaemoRunControl::deploy()
 {
     if (!deployables.isEmpty()) {
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemoruncontrol.h b/src/plugins/qt4projectmanager/qt-maemo/maemoruncontrol.h
index 8557c00be54b7a7e0f93bbbec4e72ed709b4a48e..b4964d1c3b2cad0ae99eb7826f8ad5c84a63a5bb 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemoruncontrol.h
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemoruncontrol.h
@@ -44,6 +44,10 @@
 #include <QtCore/QScopedPointer>
 #include <QtCore/QString>
 
+QT_BEGIN_NAMESPACE
+class QProcess;
+QT_END_NAMESPACE
+
 namespace Debugger {
     class DebuggerManager;
     class DebuggerStartParameters;
@@ -85,6 +89,9 @@ protected:
 private:
     virtual void handleDeploymentFinished(bool success)=0;
 
+    bool buildPackage();
+    bool runCommand(QProcess &proc, const QString &command);
+
     QFutureInterface<void> m_progress;
     QScopedPointer<MaemoSshDeployer> sshDeployer;