diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp
index afd2b7b77d08d9b525ee69c91afbd4479340af9b..f9aeb71056154843ea34fa3f610ed6a93318ba7a 100644
--- a/src/plugins/cpptools/cppcodecompletion.cpp
+++ b/src/plugins/cpptools/cppcodecompletion.cpp
@@ -82,6 +82,10 @@ namespace {
     const bool debug = ! qgetenv("CPLUSPLUS_DEBUG").isEmpty();
 }
 
+enum {
+    MAX_COMPLETION_ITEM = 1000
+};
+
 using namespace CPlusPlus;
 
 namespace CppTools {
@@ -654,8 +658,10 @@ bool CppCodeCompletion::triggersCompletion(TextEditor::ITextEditable *editor)
 int CppCodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
 {
     int index = startCompletionHelper(editor);
-    if (index != -1)
-        qStableSort(m_completions.begin(), m_completions.end(), completionItemLessThan);
+    if (index != -1) {
+        if (m_completionOperator != T_EOF_SYMBOL)
+            qStableSort(m_completions.begin(), m_completions.end(), completionItemLessThan);
+    }
     return index;
 }
 
@@ -891,9 +897,6 @@ void CppCodeCompletion::globalCompletion(Scope *currentScope)
         return;
     }
 
-    addKeywords();
-    addMacros(context.thisDocument()->fileName(), context.snapshot());
-
     QList<ClassOrNamespace *> usingBindings;
     ClassOrNamespace *currentBinding = 0;
 
@@ -916,20 +919,6 @@ void CppCodeCompletion::globalCompletion(Scope *currentScope)
         }
     }
 
-    for (; currentBinding; currentBinding = currentBinding->parent()) {
-        const QList<Symbol *> symbols = currentBinding->symbols();
-
-        if (! symbols.isEmpty()) {
-            if (symbols.first()->isNamespace())
-                completeNamespace(currentBinding);
-            else
-                completeClass(currentBinding, false);
-        }
-    }
-
-    foreach (ClassOrNamespace *b, usingBindings)
-        completeNamespace(b);
-
     for (Scope *scope = currentScope; scope; scope = scope->enclosingScope()) {
         if (scope->isBlockScope()) {
             for (unsigned i = 0; i < scope->symbolCount(); ++i) {
@@ -945,6 +934,23 @@ void CppCodeCompletion::globalCompletion(Scope *currentScope)
             break;
         }
     }
+
+    for (; currentBinding; currentBinding = currentBinding->parent()) {
+        const QList<Symbol *> symbols = currentBinding->symbols();
+
+        if (! symbols.isEmpty()) {
+            if (symbols.first()->isNamespace())
+                completeNamespace(currentBinding);
+            else
+                completeClass(currentBinding, false);
+        }
+    }
+
+    foreach (ClassOrNamespace *b, usingBindings)
+        completeNamespace(b);
+
+    addKeywords();
+    addMacros(context.thisDocument()->fileName(), context.snapshot());
 }
 
 bool CppCodeCompletion::completeConstructorOrFunction(const QList<LookupItem> &results,
@@ -1590,6 +1596,10 @@ QList<TextEditor::CompletionItem> CppCodeCompletion::getCompletions()
 
     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;