diff --git a/src/plugins/texteditor/codeassist/basicproposalitem.cpp b/src/plugins/texteditor/codeassist/basicproposalitem.cpp
index f1d0045f19406a04f188a9f17d9758a34271dff4..769a10b4fb017f19d45c2d1dc86b1f64049a360d 100644
--- a/src/plugins/texteditor/codeassist/basicproposalitem.cpp
+++ b/src/plugins/texteditor/codeassist/basicproposalitem.cpp
@@ -61,7 +61,7 @@ void BasicProposalItem::setText(const QString &text)
     m_text = text;
 }
 
-const QString &BasicProposalItem::text() const
+QString BasicProposalItem::text() const
 {
     return m_text;
 }
diff --git a/src/plugins/texteditor/codeassist/basicproposalitem.h b/src/plugins/texteditor/codeassist/basicproposalitem.h
index 4478fb8fb21346c9ba30f4a0da433fda667f61f9..2caa2b89c1fb4cba8843054ba379cc414c6f2354 100644
--- a/src/plugins/texteditor/codeassist/basicproposalitem.h
+++ b/src/plugins/texteditor/codeassist/basicproposalitem.h
@@ -52,7 +52,7 @@ public:
     const QIcon &icon() const;
 
     void setText(const QString &text);
-    const QString &text() const;
+    virtual QString text() const;
 
     void setDetail(const QString &detail);
     const QString &detail() const;
diff --git a/src/plugins/texteditor/codeassist/genericproposalwidget.cpp b/src/plugins/texteditor/codeassist/genericproposalwidget.cpp
index 883e8897b428d26382ac0c94f537d16ee009d71b..6cece65adf0674770b0bdf69197c8ac573528646 100644
--- a/src/plugins/texteditor/codeassist/genericproposalwidget.cpp
+++ b/src/plugins/texteditor/codeassist/genericproposalwidget.cpp
@@ -604,12 +604,12 @@ bool GenericProposalWidget::eventFilter(QObject *o, QEvent *e)
 
         if (ke->text().length() == 1
                 && m_d->m_completionListView->currentIndex().isValid()
-                && m_d->m_reason == ExplicitlyInvoked
                 && qApp->focusWidget() == o) {
             const QChar &typedChar = ke->text().at(0);
             IAssistProposalItem *item =
                 m_d->m_model->proposalItem(m_d->m_completionListView->currentIndex().row());
-            if (item->prematurelyApplies(typedChar)) {
+            if (item->prematurelyApplies(typedChar)
+                    && (m_d->m_reason == ExplicitlyInvoked || item->text().endsWith(typedChar))) {
                 abort();
                 emit proposalItemActivated(item);
                 return true;
diff --git a/src/plugins/texteditor/codeassist/iassistproposalitem.h b/src/plugins/texteditor/codeassist/iassistproposalitem.h
index 319a9344635b0da0b4aea54345f11e83b80b8698..109da945c5f265efa16a663fb9853e4c05f280d8 100644
--- a/src/plugins/texteditor/codeassist/iassistproposalitem.h
+++ b/src/plugins/texteditor/codeassist/iassistproposalitem.h
@@ -35,9 +35,7 @@
 
 #include <texteditor/texteditor_global.h>
 
-QT_BEGIN_NAMESPACE
-class QChar;
-QT_END_NAMESPACE
+#include <QtCore/QString>
 
 namespace TextEditor {
 
@@ -49,6 +47,7 @@ public:
     IAssistProposalItem();
     virtual ~IAssistProposalItem();
 
+    virtual QString text() const = 0;
     virtual bool implicitlyApplies() const = 0;
     virtual bool prematurelyApplies(const QChar &c) const = 0;
     virtual void apply(BaseTextEditor *editor, int basePosition) const = 0;