diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp
index f9aeb71056154843ea34fa3f610ed6a93318ba7a..997707edf71e57a83d8a80e5788144a31a43b85c 100644
--- a/src/plugins/cpptools/cppcodecompletion.cpp
+++ b/src/plugins/cpptools/cppcodecompletion.cpp
@@ -82,10 +82,6 @@ namespace {
     const bool debug = ! qgetenv("CPLUSPLUS_DEBUG").isEmpty();
 }
 
-enum {
-    MAX_COMPLETION_ITEM = 1000
-};
-
 using namespace CPlusPlus;
 
 namespace CppTools {
@@ -660,7 +656,10 @@ int CppCodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
     int index = startCompletionHelper(editor);
     if (index != -1) {
         if (m_completionOperator != T_EOF_SYMBOL)
-            qStableSort(m_completions.begin(), m_completions.end(), completionItemLessThan);
+            qSort(m_completions.begin(), m_completions.end(), completionItemLessThan);
+
+        // always remove duplicates
+        m_completions = removeDuplicates(m_completions);
     }
     return index;
 }
@@ -1590,45 +1589,36 @@ void CppCodeCompletion::completions(QList<TextEditor::CompletionItem> *completio
     }
 }
 
-QList<TextEditor::CompletionItem> CppCodeCompletion::getCompletions()
+QList<TextEditor::CompletionItem> CppCodeCompletion::removeDuplicates(const QList<TextEditor::CompletionItem> &items)
 {
-    QList<TextEditor::CompletionItem> completionItems;
-
-    completions(&completionItems);
-
-    if (m_completionOperator == T_EOF_SYMBOL && completionItems.size() < MAX_COMPLETION_ITEM) {
-        qStableSort(completionItems.begin(), completionItems.end(), completionItemLessThan);
-    }
-
     // Remove duplicates
-    QString lastKey;
     QList<TextEditor::CompletionItem> uniquelist;
+    QSet<QString> processed;
 
-    foreach (const TextEditor::CompletionItem &item, completionItems) {
-        if (item.text != lastKey) {
+    foreach (const TextEditor::CompletionItem &item, items) {
+        if (! processed.contains(item.text)) {
+            processed.insert(item.text);
             uniquelist.append(item);
-            lastKey = item.text;
-        } else {
-            TextEditor::CompletionItem &lastItem = uniquelist.last();
-            Symbol *symbol = qvariant_cast<Symbol *>(item.data);
-            Symbol *lastSymbol = qvariant_cast<Symbol *>(lastItem.data);
-
-            if (symbol && lastSymbol) {
-                Function *funTy = symbol->type()->asFunctionType();
-                Function *lastFunTy = lastSymbol->type()->asFunctionType();
-                if (funTy && lastFunTy) {
-                    if (funTy->argumentCount() == lastFunTy->argumentCount())
-                        continue;
+            if (Symbol *symbol = qvariant_cast<Symbol *>(item.data)) {
+                if (Function *funTy = symbol->type()->asFunctionType()) {
+                    if (funTy->hasArguments())
+                        ++uniquelist.back().duplicateCount;
                 }
             }
-
-            ++lastItem.duplicateCount;
         }
     }
 
     return uniquelist;
 }
 
+QList<TextEditor::CompletionItem> CppCodeCompletion::getCompletions()
+{
+    QList<TextEditor::CompletionItem> completionItems;
+    completions(&completionItems);
+
+    return completionItems;
+}
+
 void CppCodeCompletion::complete(const TextEditor::CompletionItem &item)
 {
     Symbol *symbol = 0;
diff --git a/src/plugins/cpptools/cppcodecompletion.h b/src/plugins/cpptools/cppcodecompletion.h
index f7d1667f761ca2dd916abba3b26dcbf04059ea1a..7d04c301850e00da9c8af87301283179b4294c5b 100644
--- a/src/plugins/cpptools/cppcodecompletion.h
+++ b/src/plugins/cpptools/cppcodecompletion.h
@@ -130,6 +130,8 @@ private:
                                 const QString &expression,
                                 int endOfExpression);
 
+    QList<TextEditor::CompletionItem> removeDuplicates(const QList<TextEditor::CompletionItem> &items);
+
 private:
     bool objcKeywordsWanted() const;