diff --git a/src/plugins/projectexplorer/projectmodels.cpp b/src/plugins/projectexplorer/projectmodels.cpp
index f57acb0c08ab9eb908c91c0009c6a6b5e6d24a2d..f7440b53bc8f1665b542aa228e439d288cb8b351 100644
--- a/src/plugins/projectexplorer/projectmodels.cpp
+++ b/src/plugins/projectexplorer/projectmodels.cpp
@@ -145,6 +145,12 @@ FlatModel::FlatModel(SessionNode *rootNode, QObject *parent)
     NodesWatcher *watcher = new NodesWatcher(this);
     m_rootNode->registerWatcher(watcher);
 
+    connect(watcher, SIGNAL(aboutToHasBuildTargetsChanged(ProjectExplorer::ProjectNode*)),
+            this, SLOT(aboutToHasBuildTargetsChanged(ProjectExplorer::ProjectNode*)));
+
+    connect(watcher, SIGNAL(hasBuildTargetsChanged(ProjectExplorer::ProjectNode*)),
+            this, SLOT(hasBuildTargetsChanged(ProjectExplorer::ProjectNode*)));
+
     connect(watcher, SIGNAL(foldersAboutToBeAdded(FolderNode *, const QList<FolderNode*> &)),
             this, SLOT(foldersAboutToBeAdded(FolderNode *, const QList<FolderNode*> &)));
     connect(watcher, SIGNAL(foldersAdded()),
@@ -508,7 +514,6 @@ bool FlatModel::filter(Node *node) const
         if (m_filterGeneratedFiles)
             isHidden = fileNode->isGenerated();
     }
-
     return isHidden;
 }
 
@@ -694,6 +699,31 @@ void FlatModel::removed(FolderNode* parentNode, const QList<Node*> &newNodeList)
     }
 }
 
+void FlatModel::aboutToHasBuildTargetsChanged(ProjectExplorer::ProjectNode* node)
+{
+    if (!m_filterProjects)
+        return;
+    FolderNode *folder = visibleFolderNode(node->parentFolderNode());
+    QList<Node *> newNodeList = childNodes(folder, QSet<Node *>() << node);
+    removed(folder, newNodeList);
+
+    QList<Node *> staleFolders;
+    recursiveAddFolderNodesImpl(node, &staleFolders);
+    foreach (Node *n, staleFolders)
+        if (FolderNode *fn = qobject_cast<FolderNode *>(n))
+            m_childNodes.remove(fn);
+}
+
+void FlatModel::hasBuildTargetsChanged(ProjectExplorer::ProjectNode *node)
+{
+    if (!m_filterProjects)
+        return;
+    // we are only interested if we filter
+    FolderNode *folder = visibleFolderNode(node->parentFolderNode());
+    QList<Node *> newNodeList = childNodes(folder);
+    added(folder, newNodeList);
+}
+
 void FlatModel::foldersAboutToBeAdded(FolderNode *parentFolder, const QList<FolderNode*> &newFolders)
 {
     Q_UNUSED(newFolders)
diff --git a/src/plugins/projectexplorer/projectmodels.h b/src/plugins/projectexplorer/projectmodels.h
index 810c6d50f52e3fcd78b4888f3f1026b1a4990558..52a976b958af5f483df045c45494bfc2719dde03 100644
--- a/src/plugins/projectexplorer/projectmodels.h
+++ b/src/plugins/projectexplorer/projectmodels.h
@@ -78,6 +78,8 @@ public slots:
     void setGeneratedFilesFilterEnabled(bool filter);
 
 private slots:
+    void aboutToHasBuildTargetsChanged(ProjectExplorer::ProjectNode *node);
+    void hasBuildTargetsChanged(ProjectExplorer::ProjectNode *node);
     void foldersAboutToBeAdded(FolderNode *parentFolder, const QList<FolderNode*> &newFolders);
     void foldersAdded();
 
diff --git a/src/plugins/projectexplorer/projectnodes.cpp b/src/plugins/projectexplorer/projectnodes.cpp
index 581c19b62c7e5bbe496c7c3ec15701e15bf63d08..28e848aa41d8246b0a120dd5327895f04347b242 100644
--- a/src/plugins/projectexplorer/projectnodes.cpp
+++ b/src/plugins/projectexplorer/projectnodes.cpp
@@ -241,6 +241,18 @@ QList<ProjectNode*> ProjectNode::subProjectNodes() const
     return m_subProjectNodes;
 }
 
+void ProjectNode::aboutToChangeHasBuildTargets()
+{
+    foreach (NodesWatcher *watcher, watchers())
+        emit watcher->aboutToChangeHasBuildTargets(this);
+}
+
+void ProjectNode::hasBuildTargetsChanged()
+{
+    foreach (NodesWatcher *watcher, watchers())
+        emit watcher->hasBuildTargetsChanged(this);
+}
+
 /*!
   \function bool ProjectNode::addSubProjects(const QStringList &)
   */
diff --git a/src/plugins/projectexplorer/projectnodes.h b/src/plugins/projectexplorer/projectnodes.h
index 62a7f2970f60da1fc65d7752c379a4fe76ddbde4..6d46acaee2235e23408634c90225f3bad6a5c9a4 100644
--- a/src/plugins/projectexplorer/projectnodes.h
+++ b/src/plugins/projectexplorer/projectnodes.h
@@ -178,6 +178,8 @@ public:
 
     // determines if the project will be shown in the flat view
     // TODO find a better name
+    void aboutToChangeHasBuildTargets();
+    void hasBuildTargetsChanged();
     virtual bool hasBuildTargets() const = 0;
 
     virtual QList<ProjectAction> supportedActions(Node *node) const = 0;
@@ -270,6 +272,10 @@ public:
     explicit NodesWatcher(QObject *parent = 0);
 
 signals:
+    // projects
+    void aboutToChangeHasBuildTargets(ProjectExplorer::ProjectNode*);
+    void hasBuildTargetsChanged(ProjectExplorer::ProjectNode *node);
+
     // folders & projects
     void foldersAboutToBeAdded(FolderNode *parentFolder,
                                const QList<FolderNode*> &newFolders);
diff --git a/src/plugins/qt4projectmanager/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp
index e43286d371d283f0156bea1b32978abc86fb4884..317bdd2f85434a9384ca6181e39eadb221e5bf0a 100644
--- a/src/plugins/qt4projectmanager/qt4nodes.cpp
+++ b/src/plugins/qt4projectmanager/qt4nodes.cpp
@@ -1296,7 +1296,12 @@ void Qt4ProFileNode::buildStateChanged(ProjectExplorer::Project *project)
 
 bool Qt4ProFileNode::hasBuildTargets() const
 {
-    return (projectType() == ApplicationTemplate) || (projectType() == LibraryTemplate);
+    return hasBuildTargets(projectType());
+}
+
+bool Qt4ProFileNode::hasBuildTargets(Qt4ProjectType projectType) const
+{
+    return (projectType == ApplicationTemplate || projectType == LibraryTemplate);
 }
 
 Qt4ProjectType Qt4ProFileNode::projectType() const
@@ -1476,7 +1481,16 @@ void Qt4ProFileNode::applyEvaluate(bool parseResult, bool async)
         Qt4ProjectType oldType = m_projectType;
         // probably all subfiles/projects have changed anyway ...
         clear();
+        bool changesHasBuildTargets = hasBuildTargets() xor hasBuildTargets(projectType);
+
+        if (changesHasBuildTargets)
+            aboutToChangeHasBuildTargets();
+
         m_projectType = projectType;
+
+        if (changesHasBuildTargets)
+            hasBuildTargetsChanged();
+
         // really emit here? or at the end? Nobody is connected to this signal at the moment
         // so we kind of can ignore that question for now
         foreach (NodesWatcher *watcher, watchers())
diff --git a/src/plugins/qt4projectmanager/qt4nodes.h b/src/plugins/qt4projectmanager/qt4nodes.h
index b31adea4bb5775e546a3e88bf56e4284772bdf4c..01fcc3da80624e6ef5e1a165cdedd426cb4335fb 100644
--- a/src/plugins/qt4projectmanager/qt4nodes.h
+++ b/src/plugins/qt4projectmanager/qt4nodes.h
@@ -303,6 +303,7 @@ public:
 
     bool validParse() const;
 
+    bool hasBuildTargets(Qt4ProjectType projectType) const;
 public slots:
     void asyncUpdate();