diff --git a/src/plugins/texteditor/codeassist/codeassistant.cpp b/src/plugins/texteditor/codeassist/codeassistant.cpp
index 30597a37fe9281f8830966b740e6cab1a351668b..c07aed724889215b7df77919df6420b2a26b35ed 100644
--- a/src/plugins/texteditor/codeassist/codeassistant.cpp
+++ b/src/plugins/texteditor/codeassist/codeassistant.cpp
@@ -40,6 +40,7 @@
 #include <texteditor/basetexteditor.h>
 #include <texteditor/texteditorsettings.h>
 #include <texteditor/completionsettings.h>
+#include <coreplugin/editormanager/editormanager.h>
 #include <extensionsystem/pluginmanager.h>
 #include <utils/qtcassert.h>
 
@@ -113,6 +114,8 @@ private slots:
     void finalizeProposal();
     void automaticProposalTimeout();
     void updateCompletionSettings(const TextEditor::CompletionSettings &settings);
+    void explicitlyAborted();
+    void clearAbortedPosition();
 
 private:
     CodeAssistant *m_q;
@@ -127,6 +130,7 @@ private:
     bool m_receivedContentWhileWaiting;
     QTimer m_automaticProposalTimer;
     CompletionSettings m_settings;
+    int m_abortedBasePosition;
     static const QChar m_null;
 };
 
@@ -148,6 +152,7 @@ CodeAssistantPrivate::CodeAssistantPrivate(CodeAssistant *assistant)
     , m_proposalWidget(0)
     , m_receivedContentWhileWaiting(false)
     , m_settings(TextEditorSettings::instance()->completionSettings())
+    , m_abortedBasePosition(-1)
 {
     m_automaticProposalTimer.setSingleShot(true);
     m_automaticProposalTimer.setInterval(AutomaticProposalTimerInterval);
@@ -157,6 +162,8 @@ CodeAssistantPrivate::CodeAssistantPrivate(CodeAssistant *assistant)
             SIGNAL(completionSettingsChanged(TextEditor::CompletionSettings)),
             this,
             SLOT(updateCompletionSettings(TextEditor::CompletionSettings)));
+    connect(Core::EditorManager::instance(), SIGNAL(currentEditorChanged(Core::IEditor*)),
+            this, SLOT(clearAbortedPosition()));
 }
 
 CodeAssistantPrivate::~CodeAssistantPrivate()
@@ -307,33 +314,41 @@ void CodeAssistantPrivate::displayProposal(IAssistProposal *newProposal, AssistR
         destroyContext();
     }
 
-    if (m_textEditor->position() < proposalCandidate->basePosition())
+    int basePosition = proposalCandidate->basePosition();
+    if (m_textEditor->position() < basePosition)
         return;
 
+    if (m_abortedBasePosition == basePosition && reason != ExplicitlyInvoked)
+        return;
+
+    clearAbortedPosition();
     m_proposal.reset(proposalCandidate.take());
 
     if (m_proposal->isCorrective())
         m_proposal->makeCorrection(m_textEditor);
 
+    basePosition = m_proposal->basePosition();
     m_proposalWidget = m_proposal->createWidget();
     connect(m_proposalWidget, SIGNAL(destroyed()), this, SLOT(finalizeProposal()));
     connect(m_proposalWidget, SIGNAL(prefixExpanded(QString)),
             this, SLOT(handlePrefixExpansion(QString)));
     connect(m_proposalWidget, SIGNAL(proposalItemActivated(IAssistProposalItem*)),
             this, SLOT(processProposalItem(IAssistProposalItem*)));
+    connect(m_proposalWidget, SIGNAL(explicitlyAborted()),
+            this, SLOT(explicitlyAborted()));
     m_proposalWidget->setAssistant(m_q);
     m_proposalWidget->setReason(reason);
     m_proposalWidget->setKind(m_assistKind);
     m_proposalWidget->setUnderlyingWidget(m_textEditor->widget());
     m_proposalWidget->setModel(m_proposal->model());
-    m_proposalWidget->setDisplayRect(m_textEditor->cursorRect(m_proposal->basePosition()));
+    m_proposalWidget->setDisplayRect(m_textEditor->cursorRect(basePosition));
     if (m_receivedContentWhileWaiting)
         m_proposalWidget->setIsSynchronized(false);
     else
         m_proposalWidget->setIsSynchronized(true);
     m_proposalWidget->showProposal(m_textEditor->textDocument()->textAt(
-                                       m_proposal->basePosition(),
-                                       m_textEditor->position() - m_proposal->basePosition()));
+                                       basePosition,
+                                       m_textEditor->position() - basePosition));
 }
 
 void CodeAssistantPrivate::processProposalItem(IAssistProposalItem *proposalItem)
@@ -465,6 +480,17 @@ void CodeAssistantPrivate::updateCompletionSettings(const TextEditor::Completion
     m_settings = settings;
 }
 
+void CodeAssistantPrivate::explicitlyAborted()
+{
+    QTC_ASSERT(m_proposal, return);
+    m_abortedBasePosition = m_proposal->basePosition();
+}
+
+void CodeAssistantPrivate::clearAbortedPosition()
+{
+    m_abortedBasePosition = -1;
+}
+
 bool CodeAssistantPrivate::eventFilter(QObject *o, QEvent *e)
 {
     Q_UNUSED(o);
diff --git a/src/plugins/texteditor/codeassist/functionhintproposalwidget.cpp b/src/plugins/texteditor/codeassist/functionhintproposalwidget.cpp
index 5cd0a136af0b44455fb84ea1524c20a3e99802f4..e0023976c0e184baa49518876b416ac6d6d35816 100644
--- a/src/plugins/texteditor/codeassist/functionhintproposalwidget.cpp
+++ b/src/plugins/texteditor/codeassist/functionhintproposalwidget.cpp
@@ -215,6 +215,7 @@ bool FunctionHintProposalWidget::eventFilter(QObject *obj, QEvent *e)
     case QEvent::KeyRelease:
         if (static_cast<QKeyEvent*>(e)->key() == Qt::Key_Escape && d->m_escapePressed) {
             abort();
+            emit explicitlyAborted();
             return false;
         }
         d->m_assistant->notifyChange();
diff --git a/src/plugins/texteditor/codeassist/genericproposalwidget.cpp b/src/plugins/texteditor/codeassist/genericproposalwidget.cpp
index cd8f631f20068c8ff5302103f56a9f654d624a2f..057837e73908c745a4ed4de43b16bfc7cdf8af2d 100644
--- a/src/plugins/texteditor/codeassist/genericproposalwidget.cpp
+++ b/src/plugins/texteditor/codeassist/genericproposalwidget.cpp
@@ -571,6 +571,7 @@ bool GenericProposalWidget::eventFilter(QObject *o, QEvent *e)
         switch (ke->key()) {
         case Qt::Key_Escape:
             abort();
+            emit explicitlyAborted();
             e->accept();
             return true;
 
diff --git a/src/plugins/texteditor/codeassist/iassistproposalwidget.h b/src/plugins/texteditor/codeassist/iassistproposalwidget.h
index ed25929e6a92f5376acdd0e4cf44790c9e77b35a..e97ac8062afebf2b2d326dbc7d5fb16099019738 100644
--- a/src/plugins/texteditor/codeassist/iassistproposalwidget.h
+++ b/src/plugins/texteditor/codeassist/iassistproposalwidget.h
@@ -65,6 +65,7 @@ public:
 signals:
     void prefixExpanded(const QString &newPrefix);
     void proposalItemActivated(IAssistProposalItem *proposalItem);
+    void explicitlyAborted();
 };
 
 } // TextEditor