diff --git a/src/libs/cplusplus/FastPreprocessor.cpp b/src/libs/cplusplus/FastPreprocessor.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..09afbaf34068052466ae325e98e147cfed727fe1
--- /dev/null
+++ b/src/libs/cplusplus/FastPreprocessor.cpp
@@ -0,0 +1,57 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact:  Qt Software Information (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+**
+**************************************************************************/
+
+#include "FastPreprocessor.h"
+
+using namespace CPlusPlus;
+
+FastPreprocessor::FastPreprocessor(const Snapshot &snapshot)
+    : _snapshot(snapshot),
+      _preproc(this, &_env)
+{ }
+
+QByteArray FastPreprocessor::run(QString fileName, const QByteArray &source)
+{
+    const QByteArray preprocessed = _preproc(fileName, source);
+    return preprocessed;
+}
+
+void FastPreprocessor::mergeEnvironment(const QString &fileName)
+{
+    if (! _merged.contains(fileName)) {
+        _merged.insert(fileName);
+
+        if (Document::Ptr doc = _snapshot.value(fileName)) {
+            foreach (const Document::Include &i, doc->includes())
+                mergeEnvironment(i.fileName());
+
+            _env.addMacros(doc->definedMacros());
+        }
+    }
+}
diff --git a/src/libs/cplusplus/FastPreprocessor.h b/src/libs/cplusplus/FastPreprocessor.h
new file mode 100644
index 0000000000000000000000000000000000000000..fc4a2e63041705df57c6ab2c080c611a6373b2f3
--- /dev/null
+++ b/src/libs/cplusplus/FastPreprocessor.h
@@ -0,0 +1,75 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact:  Qt Software Information (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+**
+**************************************************************************/
+
+#ifndef FASTPREPROCESSOR_H
+#define FASTPREPROCESSOR_H
+
+#include "PreprocessorClient.h"
+#include "CppDocument.h"
+#include "pp.h"
+
+#include <QtCore/QSet>
+#include <QtCore/QString>
+
+namespace CPlusPlus {
+
+class CPLUSPLUS_EXPORT FastPreprocessor: public Client
+{
+    Environment _env;
+    Snapshot _snapshot;
+    Preprocessor _preproc;
+    QSet<QString> _merged;
+
+    void mergeEnvironment(const QString &fileName);
+
+public:
+    FastPreprocessor(const Snapshot &snapshot);
+
+    QByteArray run(QString fileName, const QByteArray &source);
+
+    // CPlusPlus::Client
+    virtual void sourceNeeded(QString &fileName, IncludeType, unsigned)
+    { mergeEnvironment(fileName); }
+
+    virtual void macroAdded(const Macro &) {}
+
+    virtual void startExpandingMacro(unsigned,
+                                     const Macro &,
+                                     const QByteArray &,
+                                     const QVector<MacroArgumentReference> &) {}
+
+    virtual void stopExpandingMacro(unsigned, const Macro &) {}
+
+    virtual void startSkippingBlocks(unsigned) {}
+    virtual void stopSkippingBlocks(unsigned) {}
+};
+
+} // end of namespace CPlusPlus
+
+#endif // FASTPREPROCESSOR_H
diff --git a/src/libs/cplusplus/cplusplus-lib.pri b/src/libs/cplusplus/cplusplus-lib.pri
index 4e29413f0258f24ee0601ed6b5c078af77a0aa0f..c5b0c3d6f3e4a2f2be582670b35c38da139aa265 100644
--- a/src/libs/cplusplus/cplusplus-lib.pri
+++ b/src/libs/cplusplus/cplusplus-lib.pri
@@ -30,6 +30,7 @@ HEADERS += \
     $$PWD/PreprocessorClient.h \
     $$PWD/PreprocessorEnvironment.h \
     $$PWD/Macro.h \
+    $$PWD/FastPreprocessor.h \
     $$PWD/pp.h \
     $$PWD/pp-cctype.h \
     $$PWD/pp-engine.h \
@@ -48,6 +49,7 @@ SOURCES += \
     $$PWD/CppBindings.cpp \
     $$PWD/PreprocessorClient.cpp \
     $$PWD/PreprocessorEnvironment.cpp \
+    $$PWD/FastPreprocessor.cpp \
     $$PWD/Macro.cpp \
     $$PWD/pp-engine.cpp \
     $$PWD/pp-macro-expander.cpp \
diff --git a/src/plugins/cpptools/cppsemanticsearch.cpp b/src/plugins/cpptools/cppsemanticsearch.cpp
index dda7585475a3bafa80c3621fbb91e726064b0d8a..08ccab05f78d9ca6990f4c93da0395c7448f1a68 100644
--- a/src/plugins/cpptools/cppsemanticsearch.cpp
+++ b/src/plugins/cpptools/cppsemanticsearch.cpp
@@ -33,8 +33,7 @@
 #include <AST.h>
 #include <TranslationUnit.h>
 
-#include <cplusplus/PreprocessorClient.h>
-#include <cplusplus/pp.h>
+#include <cplusplus/FastPreprocessor.h>
 
 #include <QtCore/QDir>
 #include <QtCore/QPointer>
@@ -47,57 +46,6 @@ using namespace CPlusPlus;
 
 namespace {
 
-class SimpleClient: public Client
-{
-    Environment _env;
-    QPointer<CppModelManager> _modelManager;
-    Snapshot _snapshot;
-    Preprocessor _preproc;
-    QSet<QString> _merged;
-
-public:
-    SimpleClient(QPointer<CppModelManager> modelManager)
-        : _modelManager(modelManager),
-          _snapshot(_modelManager->snapshot()),
-          _preproc(this, &_env)
-    { }
-
-    QByteArray run(QString fileName, const QByteArray &source)
-    {
-        const QByteArray preprocessed = _preproc(fileName, source);
-        return preprocessed;
-    }
-
-    virtual void sourceNeeded(QString &fileName, IncludeType, unsigned)
-    { mergeEnvironment(fileName); }
-
-    virtual void macroAdded(const Macro &) {}
-
-    virtual void startExpandingMacro(unsigned,
-                                     const Macro &,
-                                     const QByteArray &,
-                                     const QVector<MacroArgumentReference> &) {}
-
-    virtual void stopExpandingMacro(unsigned, const Macro &) {}
-
-    virtual void startSkippingBlocks(unsigned) {}
-    virtual void stopSkippingBlocks(unsigned) {}
-
-    void mergeEnvironment(const QString &fileName)
-    {
-        if (! _merged.contains(fileName)) {
-            _merged.insert(fileName);
-
-            if (Document::Ptr doc = _snapshot.value(fileName)) {
-                foreach (const Document::Include &i, doc->includes())
-                    mergeEnvironment(i.fileName());
-
-                _env.addMacros(doc->definedMacros());
-            }
-        }
-    }
-};
-
 class FindClass: public SemanticSearch
 {
     QString _text;
@@ -228,7 +176,7 @@ static void semanticSearch_helper(QFutureInterface<Core::Utils::FileSearchResult
 
         const QString contents = QTextStream(&file).readAll(); // ### FIXME
 
-        SimpleClient r(modelManager);
+        FastPreprocessor r(snapshot);
         const QByteArray source = r.run(fileName, contents.toUtf8());
 
         Document::Ptr newDoc = Document::create(fileName);