diff --git a/src/plugins/qt4projectmanager/directorywatcher.cpp b/src/plugins/qt4projectmanager/directorywatcher.cpp
index 689cd0dfd036e8dadfeef940a2058ff3d9e3bebc..daf478348381c889e06768a0edae9578d2904d62 100644
--- a/src/plugins/qt4projectmanager/directorywatcher.cpp
+++ b/src/plugins/qt4projectmanager/directorywatcher.cpp
@@ -203,5 +203,59 @@ void DirectoryWatcher::updateFileList(const QString &dir)
     }
 }
 
+int FileWatcher::m_objectCount = 0;
+QHash<QString,int> FileWatcher::m_fileCount;
+QFileSystemWatcher *FileWatcher::m_watcher = 0;
+
+FileWatcher::FileWatcher(QObject *parent)
+{
+    if (!m_watcher)
+        m_watcher = new QFileSystemWatcher();
+    ++m_objectCount;
+    connect(m_watcher, SIGNAL(fileChanged(QString)),
+            this, SLOT(slotFileChanged(QString)));
+}
+
+FileWatcher::~FileWatcher()
+{
+    foreach (const QString &file, m_files)
+        removeFile(file);
+    if (--m_objectCount == 0) {
+        delete m_watcher;
+        m_watcher = 0;
+    }
+}
+
+void FileWatcher::slotFileChanged(const QString &file)
+{
+    if (m_files.contains(file))
+        emit fileChanged(file);
+}
+
+QStringList FileWatcher::files()
+{
+    return m_files;
+}
+
+void FileWatcher::addFile(const QString &file)
+{
+    if (m_files.contains(file))
+        return;
+    m_files += file;
+    if (m_fileCount[file] == 0)
+        m_watcher->addPath(file);
+    m_fileCount[file] += 1;
+}
+
+void FileWatcher::removeFile(const QString &file)
+{
+    m_files.removeOne(file);
+    m_fileCount[file] -= 1;
+    if (m_fileCount[file] == 0)
+      m_watcher->removePath(file);
+}
+
+
+
 } // namespace Internal
 } // namespace Qt4ProjectManager
diff --git a/src/plugins/qt4projectmanager/directorywatcher.h b/src/plugins/qt4projectmanager/directorywatcher.h
index 3f5f5a846fa1a62484a8a5cc99ce53f9d1157c79..b529ec07e7835281c1b0d02c0974bc11d0acf944 100644
--- a/src/plugins/qt4projectmanager/directorywatcher.h
+++ b/src/plugins/qt4projectmanager/directorywatcher.h
@@ -87,6 +87,31 @@ private:
     FileModificationTimeMap m_files;
 };
 
+class FileWatcher : public QObject
+{
+    Q_DISABLE_COPY(FileWatcher)
+    Q_OBJECT
+public:
+    explicit FileWatcher(QObject *parent = 0);
+    virtual ~FileWatcher();
+
+    QStringList files();
+    void addFile(const QString &file);
+    void removeFile(const QString &file);
+signals:
+    void fileChanged(const QString &path);
+    void debugOutout(const QString &path);
+
+private slots:
+    void slotFileChanged(const QString&);
+
+private:
+    static int m_objectCount;
+    static QHash<QString, int> m_fileCount;
+    static QFileSystemWatcher *m_watcher;
+    QStringList m_files;
+};
+
 } // namespace Internal
 } // namespace Qt4ProjectManager
 
diff --git a/src/plugins/qt4projectmanager/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp
index 58486fd9a13e5b3d2e2a76c506475918bfee2374..dc004580b2b40ea858288e5fcc8af58b48a75803 100644
--- a/src/plugins/qt4projectmanager/qt4nodes.cpp
+++ b/src/plugins/qt4projectmanager/qt4nodes.cpp
@@ -87,11 +87,20 @@ Qt4PriFileNode::Qt4PriFileNode(Qt4Project *project, Qt4ProFileNode* qt4ProFileNo
           m_project(project),
           m_qt4ProFileNode(qt4ProFileNode),
           m_projectFilePath(QDir::fromNativeSeparators(filePath)),
-          m_projectDir(QFileInfo(filePath).absolutePath())
+          m_projectDir(QFileInfo(filePath).absolutePath()),
+          m_fileWatcher(new FileWatcher(this))
 {
     QTC_ASSERT(project, return);
     setFolderName(QFileInfo(filePath).baseName());
     setIcon(QIcon(":/qt4projectmanager/images/qt_project.png"));
+    m_fileWatcher->addFile(filePath);
+    connect(m_fileWatcher, SIGNAL(fileChanged(QString)),
+            this, SLOT(scheduleUpdate()));
+}
+
+void Qt4PriFileNode::scheduleUpdate()
+{
+    m_qt4ProFileNode->scheduleUpdate();
 }
 
 void Qt4PriFileNode::update(ProFile *includeFile, ProFileReader *reader)
@@ -495,12 +504,17 @@ Qt4ProFileNode::Qt4ProFileNode(Qt4Project *project,
     if (parent)
         setParent(parent);
 
+    m_updateTimer.setInterval(100);
+    m_updateTimer.setSingleShot(true);
+
     connect(m_dirWatcher, SIGNAL(directoryChanged(const QString&)),
-            this, SLOT(update()));
+            this, SLOT(updateGeneratedFiles()));
     connect(m_dirWatcher, SIGNAL(fileChanged(const QString&)),
             this, SLOT(fileChanged(const QString&)));
     connect(m_project, SIGNAL(activeBuildConfigurationChanged()),
             this, SLOT(update()));
+    connect(&m_updateTimer, SIGNAL(timeout()),
+            this, SLOT(update()));
 }
 
 Qt4ProFileNode::~Qt4ProFileNode()
@@ -523,6 +537,11 @@ QStringList Qt4ProFileNode::variableValue(const Qt4Variable var) const
     return m_varValues.value(var);
 }
 
+void Qt4ProFileNode::scheduleUpdate()
+{
+    m_updateTimer.start();
+}
+
 void Qt4ProFileNode::update()
 {
     ProFileReader *reader = createProFileReader();
@@ -681,9 +700,11 @@ void Qt4ProFileNode::update()
 
 void Qt4ProFileNode::fileChanged(const QString &filePath)
 {
+    qDebug()<<"+++++"<<filePath;
     CppTools::CppModelManagerInterface *modelManager =
         ExtensionSystem::PluginManager::instance()->getObject<CppTools::CppModelManagerInterface>();
 
+    // TODO compress
     modelManager->updateSourceFiles(QStringList() << filePath);
 }
 
@@ -731,11 +752,16 @@ void Qt4ProFileNode::updateGeneratedFiles()
 
     // update generated files
 
+    // Already existing FileNodes
     QList<FileNode*> existingFileNodes;
     foreach (FileNode *file, fileNodes()) {
         if (file->isGenerated())
             existingFileNodes << file;
     }
+
+
+    // Convert uiFile to uiHeaderFilePath, find all headers that correspond
+    // and try to find them in uicDirs
     QStringList newFilePaths;
     foreach (const QString &uicDir, m_varValues[UiDirVar]) {
         foreach (FileNode *uiFile, uiFiles) {
diff --git a/src/plugins/qt4projectmanager/qt4nodes.h b/src/plugins/qt4projectmanager/qt4nodes.h
index 97bc06a08f4f264946d5f209c1a812ba5b6986f3..6b858bc52594ba4855e163c38c4637a540606d0e 100644
--- a/src/plugins/qt4projectmanager/qt4nodes.h
+++ b/src/plugins/qt4projectmanager/qt4nodes.h
@@ -75,6 +75,7 @@ using ProjectExplorer::FileType;
 
 class ProFileReader;
 class DirectoryWatcher;
+class FileWatcher;
 
 //  Type of projects
 enum Qt4ProjectType {
@@ -142,6 +143,9 @@ protected:
     QString buildDir() const;
     ProFileReader *createProFileReader() const;
 
+private slots:
+    void scheduleUpdate();
+
 private:
     void save(ProFile *includeFile);
     bool priFileWritable(const QString &path);
@@ -151,7 +155,10 @@ private:
     Qt4ProFileNode *m_qt4ProFileNode;
     QString m_projectFilePath;
     QString m_projectDir;
-    QTimer *m_saveTimer;
+
+    // TODO we might be better off using an IFile* and the FileManager for
+    // watching changes to the .pro and .pri files on disk
+    FileWatcher *m_fileWatcher;
 
     // managed by Qt4ProFileNode
     friend class Qt4ProFileNode;
@@ -174,14 +181,13 @@ public:
     QStringList variableValue(const Qt4Variable var) const;
 
 public slots:
+    void scheduleUpdate();
     void update();
-
 private slots:
     void fileChanged(const QString &filePath);
-
-private:
     void updateGeneratedFiles();
 
+private:
     Qt4ProFileNode *createSubProFileNode(const QString &path);
 
     QStringList uiDirPaths(ProFileReader *reader) const;
@@ -197,9 +203,9 @@ private:
     Qt4ProjectType m_projectType;
     QHash<Qt4Variable, QStringList> m_varValues;
     bool m_isQBuildProject;
+    QTimer m_updateTimer;
 
     DirectoryWatcher *m_dirWatcher;
-
     friend class Qt4NodeHierarchy;
 };
 
diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp
index edaabdf154eb6b51f415007227f13f4a2cb0326b..c926320193701e29529bfb93d396ad2650eaf6d7 100644
--- a/src/plugins/qt4projectmanager/qt4project.cpp
+++ b/src/plugins/qt4projectmanager/qt4project.cpp
@@ -265,7 +265,7 @@ Qt4Project::~Qt4Project()
 void Qt4Project::defaultQtVersionChanged()
 {
     if (qtVersionId(activeBuildConfiguration()) == 0)
-        update();
+        m_rootProjectNode->update();
 }
 
 void Qt4Project::qtVersionsChanged()
@@ -274,7 +274,7 @@ void Qt4Project::qtVersionsChanged()
         if (!qt4ProjectManager()->versionManager()->version(qtVersionId(bc))->isValid()) {
             setQtVersion(bc, 0);
             if (bc == activeBuildConfiguration())
-                update();
+                m_rootProjectNode->update();
         }
     }
 }
@@ -507,9 +507,9 @@ void Qt4Project::updateCodeModel()
 }
 
 
-/*!
-  Updates complete project
-  */
+///*!
+//  Updates complete project
+//  */
 void Qt4Project::update()
 {
     // TODO Maybe remove this method completely?