diff --git a/src/libs/cplusplus/FindUsages.cpp b/src/libs/cplusplus/FindUsages.cpp
index 2a560ec5a9c2e8242666e0fe45d5c9d6227a9659..8acb0214734dfa4eb26952f906a7f2443e7167c4 100644
--- a/src/libs/cplusplus/FindUsages.cpp
+++ b/src/libs/cplusplus/FindUsages.cpp
@@ -41,9 +41,8 @@
 
 using namespace CPlusPlus;
 
-FindUsages::FindUsages(Document::Ptr doc, const Snapshot &snapshot, QFutureInterface<Usage> *future)
+FindUsages::FindUsages(Document::Ptr doc, const Snapshot &snapshot)
     : ASTVisitor(doc->translationUnit()),
-      _future(future),
       _doc(doc),
       _snapshot(snapshot),
       _source(_doc->source()),
@@ -131,12 +130,8 @@ void FindUsages::reportResult(unsigned tokenIndex)
 
     const int len = tk.f.length;
 
-    const Usage u(_doc->fileName(), line, lineText, col, len);
+    const Usage u(_doc->fileName(), lineText, line, col, len);
     _usages.append(u);
-
-    if (_future)
-        _future->reportResult(u);
-
     _references.append(tokenIndex);
 }
 
diff --git a/src/libs/cplusplus/FindUsages.h b/src/libs/cplusplus/FindUsages.h
index d578f8e37785c63fa8def2d5eff479a10fd84051..1a61cca4e6c57b1aeb168860541c6fb7b9450f75 100644
--- a/src/libs/cplusplus/FindUsages.h
+++ b/src/libs/cplusplus/FindUsages.h
@@ -34,9 +34,8 @@
 #include "CppDocument.h"
 #include "CppBindings.h"
 #include "Semantic.h"
-
 #include <ASTVisitor.h>
-#include <QtCore/QFutureInterface>
+#include <QtCore/QSet>
 
 namespace CPlusPlus {
 
@@ -46,7 +45,7 @@ public:
     Usage()
         : line(0), col(0), len(0) {}
 
-    Usage(const QString &path, int line, const QString &lineText, int col, int len)
+    Usage(const QString &path, const QString &lineText, int line, int col, int len)
         : path(path), lineText(lineText), line(line), col(col), len(len) {}
 
 public:
@@ -60,7 +59,7 @@ public:
 class CPLUSPLUS_EXPORT FindUsages: protected ASTVisitor
 {
 public:
-    FindUsages(Document::Ptr doc, const Snapshot &snapshot, QFutureInterface<Usage> *future);
+    FindUsages(Document::Ptr doc, const Snapshot &snapshot);
 
     void setGlobalNamespaceBinding(NamespaceBindingPtr globalNamespaceBinding);
 
@@ -103,7 +102,6 @@ protected:
     virtual void endVisit(SimpleDeclarationAST *);
 
 private:
-    QFutureInterface<Usage> *_future;
     const Identifier *_id;
     Symbol *_declSymbol;
     Document::Ptr _doc;
diff --git a/src/plugins/cpptools/cppfindreferences.cpp b/src/plugins/cpptools/cppfindreferences.cpp
index a1f9a31dc16caba9fc5c91f315e339047f67ae38..b7a1cdc89da1d7426bdbd85b9808033f1468c1f4 100644
--- a/src/plugins/cpptools/cppfindreferences.cpp
+++ b/src/plugins/cpptools/cppfindreferences.cpp
@@ -54,10 +54,13 @@
 
 #include <QtCore/QTime>
 #include <QtCore/QtConcurrentRun>
+#include <QtCore/QtConcurrentMap>
 #include <QtCore/QDir>
 #include <QtGui/QApplication>
 #include <qtconcurrent/runextensions.h>
 
+#include <functional>
+
 using namespace CppTools::Internal;
 using namespace CPlusPlus;
 
@@ -81,7 +84,7 @@ QList<int> CppFindReferences::references(Symbol *symbol,
 {
     QList<int> references;
 
-    FindUsages findUsages(doc, snapshot, /*future = */ 0);
+    FindUsages findUsages(doc, snapshot);
     findUsages.setGlobalNamespaceBinding(bind(doc, snapshot));
     findUsages(symbol);
     references = findUsages.references();
@@ -89,6 +92,77 @@ QList<int> CppFindReferences::references(Symbol *symbol,
     return references;
 }
 
+class MyProcess: public std::unary_function<QString, QList<Usage> >
+{
+    const QMap<QString, QString> wl;
+    const Snapshot snapshot;
+    Symbol *symbol;
+
+public:
+    MyProcess(const QMap<QString, QString> wl,
+              const Snapshot snapshot,
+              Symbol *symbol)
+        : wl(wl), snapshot(snapshot), symbol(symbol)
+    { }
+
+    QList<Usage> operator()(const QString &fileName)
+    {
+        QList<Usage> usages;
+        const Identifier *symbolId = symbol->identifier();
+
+        if (Document::Ptr previousDoc = snapshot.value(fileName)) {
+            Control *control = previousDoc->control();
+            if (! control->findIdentifier(symbolId->chars(), symbolId->size()))
+                return usages; // skip this document, it's not using symbolId.
+        }
+
+        QByteArray source;
+
+        if (wl.contains(fileName))
+            source = snapshot.preprocessedCode(wl.value(fileName), fileName);
+        else {
+            QFile file(fileName);
+            if (! file.open(QFile::ReadOnly))
+                return usages;
+
+            const QString contents = QTextStream(&file).readAll(); // ### FIXME
+            source = snapshot.preprocessedCode(contents, fileName);
+        }
+
+        Document::Ptr doc = snapshot.documentFromSource(source, fileName);
+        doc->tokenize();
+
+        Control *control = doc->control();
+        if (control->findIdentifier(symbolId->chars(), symbolId->size()) != 0) {
+            doc->check();
+
+            FindUsages process(doc, snapshot);
+            process.setGlobalNamespaceBinding(bind(doc, snapshot));
+
+            process(symbol);
+            usages = process.usages();
+        }
+
+        return usages;
+    }
+};
+
+class MyReduce: public std::binary_function<QList<Usage> &, QList<Usage>, void>
+{
+    QFutureInterface<Usage> *future;
+
+public:
+    MyReduce(QFutureInterface<Usage> *future): future(future) {}
+
+    void operator()(QList<Usage> &uu, const QList<Usage> &usages)
+    {
+        foreach (const Usage &u, usages)
+            future->reportResult(u);
+
+        future->setProgressValue(future->progressValue() + 1);
+    }
+};
+
 static void find_helper(QFutureInterface<Usage> &future,
                         const QMap<QString, QString> wl,
                         Snapshot snapshot,
@@ -121,49 +195,10 @@ static void find_helper(QFutureInterface<Usage> &future,
 
     future.setProgressRange(0, files.size());
 
-    for (int i = 0; i < files.size(); ++i) {
-        if (future.isPaused())
-            future.waitForResume();
-
-        if (future.isCanceled())
-            break;
-
-        const QString &fileName = files.at(i);
-        future.setProgressValueAndText(i, QFileInfo(fileName).fileName());
-
-        if (Document::Ptr previousDoc = snapshot.value(fileName)) {
-            Control *control = previousDoc->control();
-            const Identifier *id = control->findIdentifier(symbolId->chars(), symbolId->size());
-            if (! id)
-                continue; // skip this document, it's not using symbolId.
-        }
-
-        QByteArray source;
+    MyProcess process(wl, snapshot, symbol);
+    MyReduce reduce(&future);
 
-        if (wl.contains(fileName))
-            source = snapshot.preprocessedCode(wl.value(fileName), fileName);
-        else {
-            QFile file(fileName);
-            if (! file.open(QFile::ReadOnly))
-                continue;
-
-            const QString contents = QTextStream(&file).readAll(); // ### FIXME
-            source = snapshot.preprocessedCode(contents, fileName);
-        }
-
-        Document::Ptr doc = snapshot.documentFromSource(source, fileName);
-        doc->tokenize();
-
-        Control *control = doc->control();
-        if (control->findIdentifier(symbolId->chars(), symbolId->size()) != 0) {
-            doc->check();
-
-            FindUsages process(doc, snapshot, &future);
-            process.setGlobalNamespaceBinding(bind(doc, snapshot));
-
-            process(symbol);
-        }
-    }
+    QtConcurrent::blockingMappedReduced<QList<Usage> > (files, process, reduce);
 
     future.setProgressValue(files.size());
 }