diff --git a/src/libs/cplusplus/CppDocument.cpp b/src/libs/cplusplus/CppDocument.cpp
index 3f1b1aff944031eb3d0578481389d22ed315136f..b05525b8547fbc367ec9d01bb896b3feec851769 100644
--- a/src/libs/cplusplus/CppDocument.cpp
+++ b/src/libs/cplusplus/CppDocument.cpp
@@ -147,6 +147,16 @@ void Document::setRevision(unsigned revision)
     _revision = revision;
 }
 
+QDateTime Document::lastModified() const
+{
+    return _lastModified;
+}
+
+void Document::setLastModified(const QDateTime &lastModified)
+{
+    _lastModified = lastModified;
+}
+
 QString Document::fileName() const
 {
     return _fileName;
@@ -447,6 +457,8 @@ Document::Ptr Snapshot::documentFromSource(const QByteArray &preprocessedCode,
     Document::Ptr newDoc = Document::create(fileName);
 
     if (Document::Ptr thisDocument = value(fileName)) {
+        newDoc->_revision = thisDocument->_revision;
+        newDoc->_lastModified = thisDocument->_lastModified;
         newDoc->_includes = thisDocument->_includes;
         newDoc->_definedMacros = thisDocument->_definedMacros;
         newDoc->_macroUses = thisDocument->_macroUses;
diff --git a/src/libs/cplusplus/CppDocument.h b/src/libs/cplusplus/CppDocument.h
index 6a9896a531798af133598319ed033422fb5a022c..596bee794b33aec14a1145ffbeea3d08cd7551d4 100644
--- a/src/libs/cplusplus/CppDocument.h
+++ b/src/libs/cplusplus/CppDocument.h
@@ -40,6 +40,7 @@
 #include <QSharedPointer>
 #include <QString>
 #include <QStringList>
+#include <QDateTime>
 
 namespace CPlusPlus {
 
@@ -63,6 +64,9 @@ public:
     unsigned revision() const;
     void setRevision(unsigned revision);
 
+    QDateTime lastModified() const;
+    void setLastModified(const QDateTime &lastModified);
+
     QString fileName() const;
 
     QStringList includedFiles() const;
@@ -310,6 +314,7 @@ private:
     QList<MacroUse> _macroUses;
     QList<UndefinedMacroUse> _undefinedMacroUses;
     QByteArray _source;
+    QDateTime _lastModified;
     unsigned _revision;
 
     friend class Snapshot;
diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index 75f8f743b38074086eadd2f0670a500c04093776..5adc395870eb88e4d20f0837c67e60f972867376 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -562,6 +562,10 @@ void CppPreprocessor::sourceNeeded(QString &fileName, IncludeType type,
     doc = Document::create(fileName);
     doc->setRevision(m_revision);
 
+    QFileInfo info(fileName);
+    if (info.exists())
+        doc->setLastModified(info.lastModified());
+
     Document::Ptr previousDoc = switchDocument(doc);
 
     const QByteArray preprocessedCode = preprocess(fileName, contents);
@@ -588,6 +592,26 @@ Document::Ptr CppPreprocessor::switchDocument(Document::Ptr doc)
 }
 
 
+
+void CppTools::CppModelManagerInterface::updateModifiedSourceFiles()
+{
+    const Snapshot snapshot = this->snapshot();
+    QStringList sourceFiles;
+
+    foreach (const Document::Ptr doc, snapshot) {
+        const QDateTime lastModified = doc->lastModified();
+
+        if (! lastModified.isNull()) {
+            QFileInfo fileInfo(doc->fileName());
+
+            if (fileInfo.exists() && fileInfo.lastModified() != lastModified)
+                sourceFiles.append(doc->fileName());
+        }
+    }
+
+    updateSourceFiles(sourceFiles);
+}
+
 CppTools::CppModelManagerInterface *CppTools::CppModelManagerInterface::instance()
 {
     ExtensionSystem::PluginManager *pluginManager = ExtensionSystem::PluginManager::instance();
diff --git a/src/plugins/cpptools/cppmodelmanagerinterface.h b/src/plugins/cpptools/cppmodelmanagerinterface.h
index 9c6f0fb4432a06958c0bd1b50a4127c8e4c7cc71..1976df75eab41cac2dde91932c0517a51d9beebb 100644
--- a/src/plugins/cpptools/cppmodelmanagerinterface.h
+++ b/src/plugins/cpptools/cppmodelmanagerinterface.h
@@ -83,9 +83,6 @@ public:
 
     static CppModelManagerInterface *instance();
 
-    virtual void GC() = 0;
-    virtual void updateSourceFiles(const QStringList &sourceFiles) = 0;
-
     virtual QMap<QString, QString> workingCopy() const = 0;
     virtual CPlusPlus::Snapshot snapshot() const = 0;
 
@@ -104,6 +101,11 @@ public:
 
     virtual void renameUsages(CPlusPlus::Symbol *symbol) = 0;
     virtual void findUsages(CPlusPlus::Symbol *symbol) = 0;
+
+public Q_SLOTS:
+    void updateModifiedSourceFiles();
+    virtual void updateSourceFiles(const QStringList &sourceFiles) = 0;    
+    virtual void GC() = 0;
 };
 
 class CPPTOOLS_EXPORT AbstractEditorSupport