diff --git a/src/libs/cplusplus/CppDocument.cpp b/src/libs/cplusplus/CppDocument.cpp
index b9eb925676864b2bffe7dce58f79ff157a3bf560..608989240716f0597122c1a174f8455b52be7e44 100644
--- a/src/libs/cplusplus/CppDocument.cpp
+++ b/src/libs/cplusplus/CppDocument.cpp
@@ -111,7 +111,8 @@ private:
 Document::Document(const QString &fileName)
     : _fileName(QDir::cleanPath(fileName)),
       _globalNamespace(0),
-      _revision(0)
+      _revision(0),
+      _editorRevision(0)
 {
     _control = new Control();
 
@@ -148,6 +149,16 @@ void Document::setRevision(unsigned revision)
     _revision = revision;
 }
 
+unsigned Document::editorRevision() const
+{
+    return _editorRevision;
+}
+
+void Document::setEditorRevision(unsigned editorRevision)
+{
+    _editorRevision = editorRevision;
+}
+
 QDateTime Document::lastModified() const
 {
     return _lastModified;
@@ -489,6 +500,7 @@ Document::Ptr Snapshot::documentFromSource(const QByteArray &preprocessedCode,
 
     if (Document::Ptr thisDocument = document(fileName)) {
         newDoc->_revision = thisDocument->_revision;
+        newDoc->_editorRevision = thisDocument->_editorRevision;
         newDoc->_lastModified = thisDocument->_lastModified;
         newDoc->_includes = thisDocument->_includes;
         newDoc->_definedMacros = thisDocument->_definedMacros;
diff --git a/src/libs/cplusplus/CppDocument.h b/src/libs/cplusplus/CppDocument.h
index 19be7e7660b2eabe42d6758d8c3b556bd26fadde..e3bbda2ab10df73a4b415547d6336539986b304f 100644
--- a/src/libs/cplusplus/CppDocument.h
+++ b/src/libs/cplusplus/CppDocument.h
@@ -60,6 +60,9 @@ public:
     unsigned revision() const;
     void setRevision(unsigned revision);
 
+    unsigned editorRevision() const;
+    void setEditorRevision(unsigned editorRevision);
+
     QDateTime lastModified() const;
     void setLastModified(const QDateTime &lastModified);
 
@@ -312,6 +315,7 @@ private:
     QByteArray _source;
     QDateTime _lastModified;
     unsigned _revision;
+    unsigned _editorRevision;
 
     friend class Snapshot;
 };
diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp
index f0b64fef7c273e452f22b5e03cec3354e7a6b00b..c0c066868c785050d9840ab521b61ac7302d44f6 100644
--- a/src/plugins/cppeditor/cppeditor.cpp
+++ b/src/plugins/cppeditor/cppeditor.cpp
@@ -786,6 +786,9 @@ void CPPEditor::onDocumentUpdated(Document::Ptr doc)
     if (doc->fileName() != file()->fileName())
         return;
 
+    if (doc->editorRevision() != editorRevision())
+        return;
+
     if (! m_initialized) {
         m_initialized = true;
 
@@ -1059,6 +1062,16 @@ void CPPEditor::highlightUses(const QList<SemanticInfo::Use> &uses,
 
 void CPPEditor::updateMethodBoxIndexNow()
 {
+    if (! m_overviewModel->document())
+        return;
+
+    if (m_overviewModel->document()->editorRevision() != editorRevision()) {
+        m_updateMethodBoxTimer->start();
+        return;
+    }
+
+    m_updateMethodBoxTimer->stop();
+
     int line = 0, column = 0;
     convertPosition(position(), &line, &column);
 
@@ -1409,9 +1422,14 @@ Symbol *CPPEditor::findDefinition(Symbol *symbol)
     return 0;
 }
 
+unsigned CPPEditor::editorRevision() const
+{
+    return document()->revision();
+}
+
 bool CPPEditor::isOutdated() const
 {
-    if (m_lastSemanticInfo.revision != document()->revision())
+    if (m_lastSemanticInfo.revision != editorRevision())
         return true;
 
     return false;
@@ -2026,7 +2044,7 @@ void CPPEditor::semanticRehighlight()
 
 void CPPEditor::updateSemanticInfo(const SemanticInfo &semanticInfo)
 {
-    if (semanticInfo.revision != document()->revision()) {
+    if (semanticInfo.revision != editorRevision()) {
         // got outdated semantic info
         semanticRehighlight();
         return;
@@ -2077,10 +2095,10 @@ SemanticHighlighter::Source CPPEditor::currentSource(bool force)
     const QString fileName = file()->fileName();
 
     QString code;
-    if (force || m_lastSemanticInfo.revision != document()->revision())
+    if (force || m_lastSemanticInfo.revision != editorRevision())
         code = toPlainText(); // get the source code only when needed.
 
-    const int revision = document()->revision();
+    const unsigned revision = editorRevision();
     SemanticHighlighter::Source source(snapshot, fileName, code,
                                        line, column, revision);
     source.force = force;
diff --git a/src/plugins/cppeditor/cppeditor.h b/src/plugins/cppeditor/cppeditor.h
index 3794b4735c461839a9c6a620f62912d752d2fa1e..b7ac5512cf657a3a604f1e8aca40c0510ca2c870 100644
--- a/src/plugins/cppeditor/cppeditor.h
+++ b/src/plugins/cppeditor/cppeditor.h
@@ -79,10 +79,10 @@ public:
     typedef QHashIterator<CPlusPlus::Symbol *, QList<Use> > LocalUseIterator;
 
     SemanticInfo()
-        : revision(-1), hasQ(false), hasD(false)
+        : revision(0), hasQ(false), hasD(false)
     { }
 
-    int revision;
+    unsigned revision;
     bool hasQ: 1;
     bool hasD: 1;
     CPlusPlus::Snapshot snapshot;
@@ -188,6 +188,7 @@ public:
 
     void indentInsertedText(const QTextCursor &tc);
 
+    unsigned editorRevision() const;
     bool isOutdated() const;
     SemanticInfo semanticInfo() const;
 
diff --git a/src/plugins/cppeditor/cppquickfix.cpp b/src/plugins/cppeditor/cppquickfix.cpp
index 5838fbbafef7a28be11b7614e25eafe42e9255fd..0fb0e753436ede788861320a67ad650120b80c6c 100644
--- a/src/plugins/cppeditor/cppquickfix.cpp
+++ b/src/plugins/cppeditor/cppquickfix.cpp
@@ -1012,7 +1012,7 @@ int CPPQuickFixCollector::startCompletion(TextEditor::ITextEditable *editable)
 
     const SemanticInfo info = _editor->semanticInfo();
 
-    if (info.revision != _editor->document()->revision()) {
+    if (info.revision != _editor->editorRevision()) {
         // outdated
         qWarning() << "TODO: outdated semantic info, force a reparse.";
         return -1;
diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index 8a947f1205adf3aa0b1674df219809b7501c9f20..31cab8745818ab06f90374a1b1a015a142eca476 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -190,8 +190,8 @@ public: // attributes
 protected:
     CPlusPlus::Document::Ptr switchDocument(CPlusPlus::Document::Ptr doc);
 
-    bool includeFile(const QString &absoluteFilePath, QString *result);
-    QString tryIncludeFile(QString &fileName, IncludeType type);
+    bool includeFile(const QString &absoluteFilePath, QString *result, unsigned *revision);
+    QString tryIncludeFile(QString &fileName, IncludeType type, unsigned *revision);
 
     void mergeEnvironment(CPlusPlus::Document::Ptr doc);
 
@@ -328,14 +328,16 @@ void CppPreprocessor::resetEnvironment()
     m_processed.clear();
 }
 
-bool CppPreprocessor::includeFile(const QString &absoluteFilePath, QString *result)
+bool CppPreprocessor::includeFile(const QString &absoluteFilePath, QString *result, unsigned *revision)
 {
     if (absoluteFilePath.isEmpty() || m_included.contains(absoluteFilePath))
         return true;
 
     if (m_workingCopy.contains(absoluteFilePath)) {
         m_included.insert(absoluteFilePath);
-        *result = m_workingCopy.source(absoluteFilePath);
+        const QPair<QString, unsigned> r = m_workingCopy.get(absoluteFilePath);
+        *result = r.first;
+        *revision = r.second;
         return true;
     }
 
@@ -356,12 +358,12 @@ bool CppPreprocessor::includeFile(const QString &absoluteFilePath, QString *resu
     return false;
 }
 
-QString CppPreprocessor::tryIncludeFile(QString &fileName, IncludeType type)
+QString CppPreprocessor::tryIncludeFile(QString &fileName, IncludeType type, unsigned *revision)
 {
     QFileInfo fileInfo(fileName);
     if (fileName == QLatin1String(pp_configuration_file) || fileInfo.isAbsolute()) {
         QString contents;
-        includeFile(fileName, &contents);
+        includeFile(fileName, &contents, revision);
         return contents;
     }
 
@@ -372,7 +374,7 @@ QString CppPreprocessor::tryIncludeFile(QString &fileName, IncludeType type)
         path += fileName;
         path = QDir::cleanPath(path);
         QString contents;
-        if (includeFile(path, &contents)) {
+        if (includeFile(path, &contents, revision)) {
             fileName = path;
             return contents;
         }
@@ -384,7 +386,7 @@ QString CppPreprocessor::tryIncludeFile(QString &fileName, IncludeType type)
         path += fileName;
         path = QDir::cleanPath(path);
         QString contents;
-        if (includeFile(path, &contents)) {
+        if (includeFile(path, &contents, revision)) {
             fileName = path;
             return contents;
         }
@@ -397,7 +399,7 @@ QString CppPreprocessor::tryIncludeFile(QString &fileName, IncludeType type)
         path += fileName;
         path = QDir::cleanPath(path);
         QString contents;
-        if (includeFile(path, &contents)) {
+        if (includeFile(path, &contents, revision)) {
             fileName = path;
             return contents;
         }
@@ -416,7 +418,7 @@ QString CppPreprocessor::tryIncludeFile(QString &fileName, IncludeType type)
             path += name;
             path = QDir::cleanPath(path);
             QString contents;
-            if (includeFile(path, &contents)) {
+            if (includeFile(path, &contents, revision)) {
                 fileName = path;
                 return contents;
             }
@@ -431,7 +433,7 @@ QString CppPreprocessor::tryIncludeFile(QString &fileName, IncludeType type)
         if (projectFile.endsWith(path)) {
             fileName = projectFile;
             QString contents;
-            includeFile(fileName, &contents);
+            includeFile(fileName, &contents, revision);
             return contents;
         }
     }
@@ -524,13 +526,13 @@ void CppPreprocessor::stopSkippingBlocks(unsigned offset)
         m_currentDoc->stopSkippingBlocks(offset);
 }
 
-void CppPreprocessor::sourceNeeded(QString &fileName, IncludeType type,
-                                   unsigned line)
+void CppPreprocessor::sourceNeeded(QString &fileName, IncludeType type, unsigned line)
 {
     if (fileName.isEmpty())
         return;
 
-    QString contents = tryIncludeFile(fileName, type);
+    unsigned editorRevision = 0;
+    QString contents = tryIncludeFile(fileName, type, &editorRevision);
     fileName = QDir::cleanPath(fileName);
     if (m_currentDoc) {
         m_currentDoc->addIncludeFile(fileName, line);
@@ -560,6 +562,7 @@ void CppPreprocessor::sourceNeeded(QString &fileName, IncludeType type,
 
     doc = Document::create(fileName);
     doc->setRevision(m_revision);
+    doc->setEditorRevision(editorRevision);
 
     QFileInfo info(fileName);
     if (info.exists())
@@ -797,7 +800,7 @@ CppModelManager::WorkingCopy CppModelManager::buildWorkingCopyList()
         TextEditor::ITextEditor *textEditor = it.key();
         CppEditorSupport *editorSupport = it.value();
         QString fileName = textEditor->file()->fileName();
-        workingCopy.insert(fileName, editorSupport->contents());
+        workingCopy.insert(fileName, editorSupport->contents(), editorSupport->editorRevision());
     }
 
     QSetIterator<AbstractEditorSupport *> jt(m_addtionalEditorSupport);
diff --git a/src/plugins/cpptools/cppmodelmanagerinterface.h b/src/plugins/cpptools/cppmodelmanagerinterface.h
index 77ed5f8e73e0b473cd6c1ce6860803d7b61e1c05..8db6b02b717e9107f1f64f35bf33b95dc58356b8 100644
--- a/src/plugins/cpptools/cppmodelmanagerinterface.h
+++ b/src/plugins/cpptools/cppmodelmanagerinterface.h
@@ -81,25 +81,20 @@ public:
     class WorkingCopy
     {
     public:
-        typedef QHash<QString, QString> Table;
-
-        typedef Table::const_iterator iterator;
-        typedef Table::const_iterator const_iterator;
-
-    public:
-        const_iterator begin() const { return _elements.begin(); }
-        const_iterator end() const { return _elements.end(); }
-
-        void insert(const QString &fileName, const QString &source)
-        { _elements.insert(fileName, source); }
+        void insert(const QString &fileName, const QString &source, unsigned revision = 0)
+        { _elements.insert(fileName, qMakePair(source, revision)); }
 
         bool contains(const QString &fileName) const
         { return _elements.contains(fileName); }
 
         QString source(const QString &fileName) const
+        { return _elements.value(fileName).first; }
+
+        QPair<QString, unsigned> get(const QString &fileName) const
         { return _elements.value(fileName); }
 
     private:
+        typedef QHash<QString, QPair<QString, unsigned> > Table;
         Table _elements;
     };
 
diff --git a/src/plugins/cpptools/cpptoolseditorsupport.cpp b/src/plugins/cpptools/cpptoolseditorsupport.cpp
index c9c3e367a6327c7c476b6d96b64b5f2788df43e8..8dc6577e57f757f99772496d5304d0c30d028970 100644
--- a/src/plugins/cpptools/cpptoolseditorsupport.cpp
+++ b/src/plugins/cpptools/cpptoolseditorsupport.cpp
@@ -84,6 +84,16 @@ QString CppEditorSupport::contents()
     return _cachedContents;
 }
 
+unsigned CppEditorSupport::editorRevision() const
+{
+    if (_textEditor) {
+        if (TextEditor::BaseTextEditor *ed = qobject_cast<TextEditor::BaseTextEditor *>(_textEditor->widget()))
+            return ed->document()->revision();
+    }
+
+    return 0;
+}
+
 int CppEditorSupport::updateDocumentInterval() const
 { return _updateDocumentInterval; }
 
diff --git a/src/plugins/cpptools/cpptoolseditorsupport.h b/src/plugins/cpptools/cpptoolseditorsupport.h
index d0c2b1b01de1cee13a27845c32f41cb6708d2223..98466df48de06809147c35605c2cad84de3c1f69 100644
--- a/src/plugins/cpptools/cpptoolseditorsupport.h
+++ b/src/plugins/cpptools/cpptoolseditorsupport.h
@@ -70,6 +70,7 @@ public:
     void setUpdateDocumentInterval(int updateDocumentInterval);
 
     QString contents();
+    unsigned editorRevision() const;
 
 Q_SIGNALS:
     void contentsChanged();