diff --git a/src/quick/items/qquickcanvas.cpp b/src/quick/items/qquickcanvas.cpp
index 3a9820d7d5c1372f9840cbf9f14507e1d4f5f4be..c9d7813a078692818fbee29fa3b56e60e2106d5b 100644
--- a/src/quick/items/qquickcanvas.cpp
+++ b/src/quick/items/qquickcanvas.cpp
@@ -532,7 +532,7 @@ void QQuickCanvasPrivate::setFocusInScope(QQuickItem *scope, QQuickItem *item, F
 
         if (oldActiveFocusItem) {
 #ifndef QT_NO_IM
-            qApp->inputMethod()->reset();
+            qApp->inputMethod()->commit();
 #endif
 
             activeFocusItem = 0;
@@ -628,7 +628,7 @@ void QQuickCanvasPrivate::clearFocusInScope(QQuickItem *scope, QQuickItem *item,
         Q_ASSERT(oldActiveFocusItem);
 
 #ifndef QT_NO_IM
-        qApp->inputMethod()->reset();
+        qApp->inputMethod()->commit();
 #endif
 
         activeFocusItem = 0;
@@ -994,6 +994,10 @@ bool QQuickCanvas::event(QEvent *e)
     case QEvent::WindowDeactivate:
         rootItem()->windowDeactivateEvent();
         break;
+    case QEvent::FocusAboutToChange:
+        if (d->activeFocusItem)
+            qGuiApp->inputMethod()->commit();
+        break;
     default:
         break;
     }
diff --git a/src/quick/items/qquicktextcontrol.cpp b/src/quick/items/qquicktextcontrol.cpp
index 1846d03b9be0e34d31e568953c135183cccf04c6..eefe938467432c5f05d8ce1b45c4ef46dd20d94c 100644
--- a/src/quick/items/qquicktextcontrol.cpp
+++ b/src/quick/items/qquicktextcontrol.cpp
@@ -1459,7 +1459,6 @@ void QQuickTextControlPrivate::inputMethodEvent(QInputMethodEvent *e)
         }
     }
     layout->setAdditionalFormats(overrides);
-    tentativeCommit = e->tentativeCommitString();
 
     cursor.endEditBlock();
 
@@ -1503,7 +1502,6 @@ void QQuickTextControlPrivate::focusEvent(QFocusEvent *e)
     if (e->gotFocus()) {
         setBlinkingCursorEnabled(interactionFlags & (Qt::TextEditable | Qt::TextSelectableByKeyboard));
     } else {
-        commitPreedit();
         setBlinkingCursorEnabled(false);
 
         if (cursorIsFocusIndicator
@@ -1732,14 +1730,12 @@ void QQuickTextControlPrivate::commitPreedit()
     if (!isPreediting())
         return;
 
-    cursor.beginEditBlock();
-    qApp->inputMethod()->reset();
+    qApp->inputMethod()->commit();
 
-    if (!tentativeCommit.isEmpty()) {
-        cursor.insertText(tentativeCommit);
-        tentativeCommit.clear();
-    }
+    if (!isPreediting())
+        return;
 
+    cursor.beginEditBlock();
     preeditCursor = 0;
     QTextBlock block = cursor.block();
     QTextLayout *layout = block.layout();
@@ -1767,17 +1763,12 @@ Qt::TextInteractionFlags QQuickTextControl::textInteractionFlags() const
 
 QString QQuickTextControl::toPlainText() const
 {
-    Q_D(const QQuickTextControl);
-    QString plainText = document()->toPlainText();
-    if (!d->tentativeCommit.isEmpty())
-        plainText.insert(textCursor().position(), d->tentativeCommit);
-    return plainText;
+    return document()->toPlainText();
 }
 
 #ifndef QT_NO_TEXTHTMLPARSER
 QString QQuickTextControl::toHtml() const
 {
-    // note: currently not including tentative commit
     return document()->toHtml();
 }
 #endif
diff --git a/src/quick/items/qquicktextcontrol_p_p.h b/src/quick/items/qquicktextcontrol_p_p.h
index 9d776ce46b1d872f1418a8727404c22930456746..c5a39cc759a6edf1c608d7892298ec85e6c2ab5a 100644
--- a/src/quick/items/qquicktextcontrol_p_p.h
+++ b/src/quick/items/qquicktextcontrol_p_p.h
@@ -137,7 +137,6 @@ public:
     QTextCursor cursor;
     QTextCursor selectedWordOnDoubleClick;
     QTextCursor selectedBlockOnTrippleClick;
-    QString tentativeCommit;
     QString highlightedAnchor; // Anchor below cursor
     QString anchorOnMousePress;
     QString linkToCopy;
diff --git a/src/quick/items/qquicktextinput.cpp b/src/quick/items/qquicktextinput.cpp
index 94856b63ab758d3ca08d2e8503e08f8d8f95130d..f2da67bae7e3c6d79c003ebe903af7ed5deef874 100644
--- a/src/quick/items/qquicktextinput.cpp
+++ b/src/quick/items/qquicktextinput.cpp
@@ -119,8 +119,6 @@ QString QQuickTextInput::text() const
     Q_D(const QQuickTextInput);
 
     QString content = d->m_text;
-    if (!d->m_tentativeCommit.isEmpty())
-        content.insert(d->m_cursor, d->m_tentativeCommit);
     QString res = d->m_maskData ? d->stripString(content) : content;
     return (res.isNull() ? QString::fromLatin1("") : res);
 }
@@ -132,7 +130,6 @@ void QQuickTextInput::setText(const QString &s)
         return;
     if (d->composeMode())
         qApp->inputMethod()->reset();
-    d->m_tentativeCommit.clear();
     d->internalSetText(s, -1, false);
 }
 
@@ -2496,7 +2493,6 @@ void QQuickTextInput::itemChange(ItemChange change, const ItemChangeData &value)
         }
 
         if (!hasFocus) {
-            d->commitPreedit();
             if (!d->persistentSelection)
                 d->deselect();
             disconnect(qApp->inputMethod(), SIGNAL(inputDirectionChanged(Qt::LayoutDirection)),
@@ -2831,21 +2827,16 @@ void QQuickTextInputPrivate::paste(QClipboard::Mode clipboardMode)
 
 /*!
     \internal
-
-    Exits preedit mode and commits parts marked as tentative commit
 */
 void QQuickTextInputPrivate::commitPreedit()
 {
     if (!composeMode())
         return;
 
-    qApp->inputMethod()->reset();
+    qApp->inputMethod()->commit();
 
-    if (!m_tentativeCommit.isEmpty()) {
-        internalInsert(m_tentativeCommit);
-        m_tentativeCommit.clear();
-        finishChange(-1, true/*not used, not documented*/, false);
-    }
+    if (!composeMode())
+        return;
 
     m_preeditCursor = 0;
     m_textLayout.setPreeditArea(-1, QString());
@@ -3160,14 +3151,7 @@ void QQuickTextInputPrivate::processInputMethodEvent(QInputMethodEvent *event)
         q->updateCursorRectangle();
     }
 
-    bool tentativeCommitChanged = m_tentativeCommit != event->tentativeCommitString();
-
-    if (tentativeCommitChanged) {
-        m_textDirty = true;
-        m_tentativeCommit = event->tentativeCommitString();
-    }
-
-    if (isGettingInput || tentativeCommitChanged)
+    if (isGettingInput)
         finishChange(priorState);
 
     if (selectionChange) {
@@ -3237,15 +3221,6 @@ bool QQuickTextInputPrivate::finishChange(int validateFromState, bool update, bo
                     return true;
                 }
                 m_cursor = cursorCopy;
-
-                if (!m_tentativeCommit.isEmpty()) {
-                    textCopy.insert(m_cursor, m_tentativeCommit);
-                    bool validInput = m_validator->validate(textCopy, cursorCopy) != QValidator::Invalid;
-                    if (!validInput)
-                        m_tentativeCommit.clear();
-                }
-            } else {
-                m_tentativeCommit.clear();
             }
         }
 #endif
diff --git a/src/quick/items/qquicktextinput_p_p.h b/src/quick/items/qquicktextinput_p_p.h
index 165155acd03723aee2ae247aa263ba16c53f4b75..3bd34b2661ff563e2ef3dce410e5c67a2d2592a4 100644
--- a/src/quick/items/qquicktextinput_p_p.h
+++ b/src/quick/items/qquicktextinput_p_p.h
@@ -188,7 +188,6 @@ public:
     QString m_text;
     QString m_inputMask;
     QString m_cancelText;
-    QString m_tentativeCommit;
     QFont font;
     QFont sourceFont;
 
diff --git a/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp b/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp
index 83e7e788662db882665e68a4a03989f0bcbcd264..ab21f3bc548bf349aabecc2565d37659268a454e 100644
--- a/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp
+++ b/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp
@@ -2287,16 +2287,6 @@ void tst_qquicktextedit::textInput()
     QQuickTextEditPrivate *editPrivate = static_cast<QQuickTextEditPrivate*>(QQuickItemPrivate::get(edit));
     QCOMPARE(editPrivate->text, QString("Hello world!"));
 
-    // test that tentative commit is included in text property
-    edit->setText("");
-    spy.clear();
-    QList<QInputMethodEvent::Attribute> attributes;
-    QInputMethodEvent event2("preedit", attributes);
-    event2.setTentativeCommitString("string");
-    QGuiApplication::sendEvent(qGuiApp->focusObject(), &event2);
-    QCOMPARE(spy.count(), 1);
-    QCOMPARE(edit->text(), QString("string"));
-
     QInputMethodQueryEvent queryEvent(Qt::ImEnabled);
     QGuiApplication::sendEvent(qGuiApp->focusObject(), &queryEvent);
     QCOMPARE(queryEvent.value(Qt::ImEnabled).toBool(), true);
diff --git a/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp b/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp
index afe102aa4c2be055d048bd7decd93f45028d35c7..1c8bff9d69839549d2d8f6d0398599663b1eda00 100644
--- a/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp
+++ b/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp
@@ -2022,28 +2022,6 @@ void tst_qquicktextinput::inputMethods()
     QCOMPARE(input->text(), QString("Our Goodbye world!"));
     QCOMPARE(input->cursorPosition(), 7);
 
-    // test that basic tentative commit gets to text property on preedit state
-    input->setText("");
-    QList<QInputMethodEvent::Attribute> attributes;
-    QInputMethodEvent preeditEvent("test", attributes);
-    preeditEvent.setTentativeCommitString("test");
-    QGuiApplication::sendEvent(input, &preeditEvent);
-    QCOMPARE(input->text(), QString("test"));
-
-    // tentative commit not allowed present in surrounding text
-    QInputMethodQueryEvent queryEvent(Qt::ImSurroundingText);
-    QGuiApplication::sendEvent(input, &queryEvent);
-    QCOMPARE(queryEvent.value(Qt::ImSurroundingText).toString(), QString(""));
-
-    // if text with tentative commit does not validate, not allowed to be part of text property
-    input->setText(""); // ensure input state is reset
-    QValidator *validator = new QIntValidator(0, 100);
-    input->setValidator(validator);
-    QGuiApplication::sendEvent(input, &preeditEvent);
-    QCOMPARE(input->text(), QString(""));
-    input->setValidator(0);
-    delete validator;
-
     // input should reset selection even if replacement parameters are out of bounds
     input->setText("text");
     input->setCursorPosition(0);