diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemoqemumanager.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemoqemumanager.cpp
index 76386d3e9d55955c8cb73de70a66108070826999..954f1364c6651fd3d1dc9281fe523da07e414c2c 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemoqemumanager.cpp
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemoqemumanager.cpp
@@ -115,6 +115,13 @@ MaemoQemuManager::MaemoQemuManager(QObject *parent)
         SLOT(qemuOutput()));
     connect(this, SIGNAL(qemuProcessStatus(QemuStatus, QString)),
         this, SLOT(qemuStatusChanged(QemuStatus, QString)));
+
+    m_runtimeRootWatcher = new QFileSystemWatcher(this);
+    connect(m_runtimeRootWatcher, SIGNAL(directoryChanged(QString)), this,
+        SLOT(runtimeRootChanged(QString)));
+    m_runtimeFolderWatcher = new QFileSystemWatcher(this);
+    connect(m_runtimeFolderWatcher, SIGNAL(directoryChanged(QString)), this,
+        SLOT(runtimeFolderChanged(QString)));
 }
 
 MaemoQemuManager::~MaemoQemuManager()
@@ -132,10 +139,8 @@ MaemoQemuManager &MaemoQemuManager::instance(QObject *parent)
 
 bool MaemoQemuManager::runtimeForQtVersion(int uniqueId, Runtime *rt) const
 {
-    bool found = m_runtimes.contains(uniqueId);
-    if (found)
-        *rt = m_runtimes.value(uniqueId);
-    return found;
+    *rt = m_runtimes.value(uniqueId, Runtime());
+    return rt->isValid();
 }
 
 void MaemoQemuManager::qtVersionsChanged(const QList<int> &uniqueIds)
@@ -146,16 +151,22 @@ void MaemoQemuManager::qtVersionsChanged(const QList<int> &uniqueIds)
     QtVersionManager *manager = QtVersionManager::instance();
     foreach (int uniqueId, uniqueIds) {
         if (manager->isValidId(uniqueId)) {
-            const QString &qmake = manager->version(uniqueId)->qmakeCommand();
-            const QString &runtimeRoot = runtimeForQtVersion(qmake);
-            if (runtimeRoot.isEmpty() || !QFile::exists(runtimeRoot)) {
-                // no runtime available, or runtime needs to be installed
-                m_runtimes.remove(uniqueId);
-            } else {
-                // valid maemo qt version, also has a runtime installed
-                Runtime runtime(runtimeRoot);
-                fillRuntimeInformation(&runtime);
-                m_runtimes.insert(uniqueId, runtime);
+            QtVersion *version = manager->version(uniqueId);
+            if (version->supportsTargetId(Constants::MAEMO_DEVICE_TARGET_ID)) {
+                const QString &qmake = version->qmakeCommand();
+                const QString &runtimeRoot = runtimeForQtVersion(qmake);
+                if (!runtimeRoot.isEmpty()) {
+                    Runtime runtime(runtimeRoot);
+                    if (QFile::exists(runtimeRoot))
+                        fillRuntimeInformation(&runtime);
+                    runtime.m_watchPath =
+                        runtimeRoot.left(runtimeRoot.lastIndexOf(QLatin1Char('/')));
+                    m_runtimes.insert(uniqueId, runtime);
+                    if (!m_runtimeRootWatcher->directories().contains(runtime.m_watchPath))
+                        m_runtimeRootWatcher->addPath(runtime.m_watchPath);
+                } else {
+                    m_runtimes.remove(uniqueId);
+                }
             }
         } else {
             // this qt version has been removed from the settings
@@ -462,6 +473,49 @@ void MaemoQemuManager::qemuOutput()
     qDebug("%s", m_qemuProcess->readAllStandardError().data());
 }
 
+void MaemoQemuManager::runtimeRootChanged(const QString &directory)
+{
+    QList<int> uniqueIds;
+    QMap<int, Runtime>::const_iterator it;
+    for (it = m_runtimes.constBegin(); it != m_runtimes.constEnd(); ++it) {
+        if (QDir(it.value().m_watchPath) == QDir(directory))
+            uniqueIds.append(it.key());
+    }
+
+    foreach (int uniqueId, uniqueIds) {
+        Runtime runtime = m_runtimes.value(uniqueId, Runtime());
+        if (runtime.isValid()) {
+            if (QFile::exists(runtime.m_root)) {
+                // nothing changed, so we can remove it
+                uniqueIds.removeAll(uniqueId);
+            }
+        } else {
+            if (QFile::exists(runtime.m_root)) {
+                if (!QFile::exists(runtime.m_root + QLatin1String("/information"))) {
+                    // install might be still in progress
+                    uniqueIds.removeAll(uniqueId);
+                    m_runtimeFolderWatcher->addPath(runtime.m_root);
+                }
+            }
+        }
+    }
+    notify(uniqueIds);
+}
+
+void MaemoQemuManager::runtimeFolderChanged(const QString &directory)
+{
+    if (QFile::exists(directory + QLatin1String("/information"))) {
+        QList<int> uniqueIds;
+        QMap<int, Runtime>::const_iterator it;
+        for (it = m_runtimes.constBegin(); it != m_runtimes.constEnd(); ++it) {
+            if (QDir(it.value().m_root) == QDir(directory))
+                uniqueIds.append(it.key());
+        }
+        notify(uniqueIds);
+        m_runtimeFolderWatcher->removePath(directory);
+    }
+}
+
 // -- private
 
 void MaemoQemuManager::setupRuntimes()
@@ -513,7 +567,7 @@ void MaemoQemuManager::toggleStarterButton(Target *target)
     if (m_runningQtId == uniqueId)
         isRunning = false;
 
-    m_qemuAction->setEnabled(m_runtimes.contains(uniqueId)
+    m_qemuAction->setEnabled(m_runtimes.value(uniqueId, Runtime()).isValid()
         && targetUsesMatchingRuntimeConfig(target) && !isRunning);
 }
 
@@ -542,7 +596,7 @@ bool MaemoQemuManager::targetUsesMatchingRuntimeConfig(Target *target,
     if (!bc)
         return false;
     QtVersion *version = bc->qtVersion();
-    if (!version || !m_runtimes.contains(version->uniqueId()))
+    if (!version || !m_runtimes.value(version->uniqueId(), Runtime()).isValid())
         return false;
 
     if (qtVersion)
@@ -569,10 +623,9 @@ bool MaemoQemuManager::fillRuntimeInformation(Runtime *runtime) const
     const QStringList files = QDir(runtime->m_root).entryList(QDir::Files
         | QDir::NoSymLinks | QDir::NoDotAndDotDot);
 
+    // we need at least the information file
     const QLatin1String infoFile("information");
-    // we need at least the information file and a second one, most likely
-    // the image file qemu is going to load
-    if (files.contains(infoFile) && files.count() > 1) {
+    if (files.contains(infoFile)) {
         QFile file(runtime->m_root + QLatin1Char('/') + infoFile);
         if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
             QMap<QString, QString> map;
@@ -627,8 +680,8 @@ QString MaemoQemuManager::runtimeForQtVersion(const QString &qmakeCommand) const
                 if (line.startsWith(QLatin1String("runtime"))) {
                     const QStringList &list = line.split(QLatin1Char(' '));
                     if (list.count() > 1) {
-                        return madRoot
-                            + QLatin1String("/runtimes/") + list.at(1).trimmed();
+                        return QDir::fromNativeSeparators(madRoot
+                            + QLatin1String("/runtimes/") + list.at(1).trimmed());
                     }
                     break;
                 }
@@ -639,6 +692,12 @@ QString MaemoQemuManager::runtimeForQtVersion(const QString &qmakeCommand) const
     return QString();
 }
 
+void MaemoQemuManager::notify(const QList<int> uniqueIds)
+{
+    qtVersionsChanged(uniqueIds);
+    environmentChanged();   // to toggle the start button
+}
+
 void MaemoQemuManager::toggleDeviceConnections(MaemoRunConfiguration *mrc,
     bool _connect)
 {
diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemoqemumanager.h b/src/plugins/qt4projectmanager/qt-maemo/maemoqemumanager.h
index b4451eb937cde5793a8667e0390d6f590a95b6ed..5d57c53dd603af35803b1f67deeaef436932d53b 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/maemoqemumanager.h
+++ b/src/plugins/qt4projectmanager/qt-maemo/maemoqemumanager.h
@@ -40,6 +40,7 @@
 #include <QtGui/QIcon>
 
 QT_FORWARD_DECLARE_CLASS(QAction);
+QT_FORWARD_DECLARE_CLASS(QFileSystemWatcher)
 QT_FORWARD_DECLARE_CLASS(QStringList);
 
 namespace ProjectExplorer {
@@ -59,12 +60,16 @@ struct Runtime
     Runtime() {}
     Runtime(const QString &root)
         : m_root(root) {}
+    bool isValid() const {
+        return !m_bin.isEmpty();
+    }
 
     QString m_bin;
     QString m_root;
     QString m_args;
     QString m_libPath;
     QString m_sshPort;
+    QString m_watchPath;
     MaemoPortList m_freePorts;
 };
 
@@ -110,6 +115,9 @@ private slots:
     void qemuStatusChanged(QemuStatus status, const QString &error);
     void qemuOutput();
 
+    void runtimeRootChanged(const QString &directory);
+    void runtimeFolderChanged(const QString &directory);
+
 private:
     MaemoQemuManager(QObject *parent);
     ~MaemoQemuManager();
@@ -128,6 +136,7 @@ private:
     bool fillRuntimeInformation(Runtime *runtime) const;
     QString runtimeForQtVersion(const QString &qmakeCommand) const;
 
+    void notify(const QList<int> uniqueIds);
     void toggleDeviceConnections(MaemoRunConfiguration *mrc, bool connect);
 
 private:
@@ -140,6 +149,8 @@ private:
     QIcon m_qemuStarterIcon;
     QMap<int, Runtime> m_runtimes;
     static MaemoQemuManager *m_instance;
+    QFileSystemWatcher *m_runtimeRootWatcher;
+    QFileSystemWatcher *m_runtimeFolderWatcher;
 };
 
     }   // namespace Qt4ProjectManager