diff --git a/src/libs/cplusplus/CppDocument.cpp b/src/libs/cplusplus/CppDocument.cpp
index 782c14ff6d556ecac284d71a567d619d1e52d145..3a280416d9b881631dac42e8486f7a9834a1ec0d 100644
--- a/src/libs/cplusplus/CppDocument.cpp
+++ b/src/libs/cplusplus/CppDocument.cpp
@@ -153,6 +153,11 @@ void Document::appendMacro(const QByteArray &macroName, const QByteArray &text)
     _definedMacros += text;
 }
 
+void Document::addMacroUse(unsigned offset, unsigned length)
+{
+    _macroUses.append(Block(offset, offset + length));
+}
+
 TranslationUnit *Document::translationUnit() const
 {
     return _translationUnit;
diff --git a/src/libs/cplusplus/CppDocument.h b/src/libs/cplusplus/CppDocument.h
index 17762200fa03c99fdde3871c5c9398c07720f411..e952913a07b7d75e37648b7af0117e180845f4cb 100644
--- a/src/libs/cplusplus/CppDocument.h
+++ b/src/libs/cplusplus/CppDocument.h
@@ -68,6 +68,8 @@ public:
 
     void appendMacro(const QByteArray &macroName, const QByteArray &text);
 
+    void addMacroUse(unsigned offset, unsigned length);
+
     Control *control() const;
     TranslationUnit *translationUnit() const;
 
@@ -176,6 +178,9 @@ public:
     QList<Block> skippedBlocks() const
     { return _skippedBlocks; }
 
+    QList<Block> macroUses() const
+    { return _macroUses; }
+
 private:
     Symbol *findSymbolAt(unsigned line, unsigned column, Scope *scope) const;
 
@@ -189,6 +194,7 @@ private:
     QByteArray _definedMacros;
     QSet<QByteArray> _macroNames;
     QList<Block> _skippedBlocks;
+    QList<Block> _macroUses;
 };
 
 } // end of namespace CPlusPlus
diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index 313ea7f21ffdfc16a165e1df95b75d0962ed4b4e..ccaff0bcfe5cf2e40a43a815004953f11c9a3607 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -253,6 +253,25 @@ protected:
         m_currentDoc->appendMacro(macroName, macroText);
     }
 
+    virtual void startExpandingMacro(unsigned offset,
+                                     const rpp::Macro &macro,
+                                     const QByteArray &originalText)
+    {
+        if (! m_currentDoc)
+            return;
+
+        //qDebug() << "start expanding:" << macro.name << "text:" << originalText;
+        m_currentDoc->addMacroUse(offset, originalText.length());
+    }
+
+    virtual void stopExpandingMacro(unsigned offset, const rpp::Macro &macro)
+    {
+        if (! m_currentDoc)
+            return;
+
+        //qDebug() << "stop expanding:" << macro.name;
+    }
+
     void mergeEnvironment(Document::Ptr doc)
     {
         QSet<QString> processed;
@@ -595,6 +614,22 @@ void CppModelManager::onDocumentUpdated(Document::Ptr doc)
 
             QList<QTextEdit::ExtraSelection> selections;
 
+#ifdef QTCREATOR_WITH_MACRO_HIGHLIGHTING
+            // set up the format for the macros
+            QTextCharFormat macroFormat;
+            macroFormat.setUnderlineStyle(QTextCharFormat::SingleUnderline);
+
+            QTextCursor c = ed->textCursor();
+            foreach (const Document::Block block, doc->macroUses()) {
+                QTextEdit::ExtraSelection sel;
+                sel.cursor = c;
+                sel.cursor.setPosition(block.begin());
+                sel.cursor.setPosition(block.end(), QTextCursor::KeepAnchor);
+                sel.format = macroFormat;
+                selections.append(sel);
+            }
+#endif // QTCREATOR_WITH_MACRO_HIGHLIGHTING
+
             // set up the format for the errors
             QTextCharFormat errorFormat;
             errorFormat.setUnderlineStyle(QTextCharFormat::WaveUnderline);
diff --git a/src/plugins/cpptools/rpp/pp-client.h b/src/plugins/cpptools/rpp/pp-client.h
index 073fc44c3627ad3643e18eef4be96c2e565a8f40..974004a6ce50ec85aeb2df035d63c686df19b444 100644
--- a/src/plugins/cpptools/rpp/pp-client.h
+++ b/src/plugins/cpptools/rpp/pp-client.h
@@ -40,6 +40,8 @@
 
 namespace rpp {
 
+class Macro;
+
 class Client
 {
   Client(const Client &other);
@@ -61,6 +63,13 @@ public:
   virtual void macroAdded(const QByteArray &macroId, const QByteArray &text) = 0;
   virtual void sourceNeeded(QString &fileName, IncludeType mode) = 0; // ### FIX the signature.
 
+  virtual void startExpandingMacro(unsigned offset,
+                                   const Macro &macro,
+                                   const QByteArray &originalTextt) = 0;
+
+  virtual void stopExpandingMacro(unsigned offset,
+                                  const Macro &macro) = 0;
+
   virtual void startSkippingBlocks(unsigned offset) = 0;
   virtual void stopSkippingBlocks(unsigned offset) = 0;
 };
diff --git a/src/plugins/cpptools/rpp/pp-engine.cpp b/src/plugins/cpptools/rpp/pp-engine.cpp
index 3a3e9245b30229a330fe9f3ea894eb5ec9a66b29..2fa6e4ba67fe7799f52cb45382d7f803435c219f 100644
--- a/src/plugins/cpptools/rpp/pp-engine.cpp
+++ b/src/plugins/cpptools/rpp/pp-engine.cpp
@@ -575,7 +575,17 @@ void pp::operator()(const QByteArray &source, QByteArray *result)
 
                 const QByteArray spell = tokenSpell(*identifierToken);
                 if (env.isBuiltinMacro(spell)) {
+                    const Macro trivial;
+
+                    if (client)
+                        client->startExpandingMacro(identifierToken->offset,
+                                                    trivial, spell);
+
                     expand(spell.constBegin(), spell.constEnd(), result);
+
+                    if (client)
+                        client->stopExpandingMacro(_dot->offset, trivial);
+
                     continue;
                 }
 
@@ -585,10 +595,19 @@ void pp::operator()(const QByteArray &source, QByteArray *result)
                 } else {
                     if (! m->function_like) {
                         if (_dot->isNot(T_LPAREN)) {
+                            if (client)
+                                client->startExpandingMacro(identifierToken->offset,
+                                                            *m, spell);
+
                             m->hidden = true;
+
                             expand(m->definition.constBegin(),
                                    m->definition.constEnd(),
                                    result);
+
+                            if (client)
+                                client->stopExpandingMacro(_dot->offset, *m);
+
                             m->hidden = false;
                             continue;
                         } else {
@@ -640,9 +659,20 @@ void pp::operator()(const QByteArray &source, QByteArray *result)
                         const char *beginOfText = startOfToken(*identifierToken);
                         const char *endOfText = endOfToken(*_dot);
                         ++_dot; // skip T_RPAREN
-                        //m->hidden = true;
+
+                        if (client) {
+                            const QByteArray text =
+                                    QByteArray::fromRawData(beginOfText,
+                                                            endOfText - beginOfText);
+
+                            client->startExpandingMacro(identifierToken->offset,
+                                                        *m, text);
+                        }
+
                         expand(beginOfText, endOfText, result);
-                        //m->hidden = false;
+
+                        if (client)
+                            client->stopExpandingMacro(_dot->offset, *m);
                     }
                 }
             }