diff --git a/src/quick/items/qquicktextedit.cpp b/src/quick/items/qquicktextedit.cpp
index e051b5202cc317b6c15c16e1805430c4c57142ba..015f52cc46c940e1f85a15cd9fec3183f0bdb6b8 100644
--- a/src/quick/items/qquicktextedit.cpp
+++ b/src/quick/items/qquicktextedit.cpp
@@ -635,6 +635,13 @@ void QQuickTextEditPrivate::mirrorChange()
     }
 }
 
+#ifndef QT_NO_IM
+Qt::InputMethodHints QQuickTextEditPrivate::effectiveInputMethodHints() const
+{
+    return inputMethodHints | Qt::ImhMultiLine;
+}
+#endif
+
 QQuickTextEdit::VAlignment QQuickTextEdit::vAlign() const
 {
     Q_D(const QQuickTextEdit);
@@ -1632,7 +1639,7 @@ QVariant QQuickTextEdit::inputMethodQuery(Qt::InputMethodQuery property) const
         v = (bool)(flags() & ItemAcceptsInputMethod);
         break;
     case Qt::ImHints:
-        v = (int)inputMethodHints();
+        v = (int)d->effectiveInputMethodHints();
         break;
     default:
         v = d->control->inputMethodQuery(property);
diff --git a/src/quick/items/qquicktextedit_p_p.h b/src/quick/items/qquicktextedit_p_p.h
index e4819e4d2d0cbd0b0b9c00ab15f4ed0e53eb7ba9..5306c979cf11c4c7a530e9efca92370bc59ece0b 100644
--- a/src/quick/items/qquicktextedit_p_p.h
+++ b/src/quick/items/qquicktextedit_p_p.h
@@ -106,6 +106,10 @@ public:
 
     void setNativeCursorEnabled(bool enabled) { control->setCursorWidth(enabled ? 1 : 0); }
 
+#ifndef QT_NO_IM
+    Qt::InputMethodHints effectiveInputMethodHints() const;
+#endif
+
     QColor color;
     QColor selectionColor;
     QColor selectedTextColor;
diff --git a/src/quick/items/qquicktextinput.cpp b/src/quick/items/qquicktextinput.cpp
index f9de3d25e79b73f099292f0c68091de5add8685c..1c65c375164baa1e4b45646463ddaf53940c9ed0 100644
--- a/src/quick/items/qquicktextinput.cpp
+++ b/src/quick/items/qquicktextinput.cpp
@@ -1910,7 +1910,7 @@ QVariant QQuickTextInput::inputMethodQuery(Qt::InputMethodQuery property) const
         else
             return QVariant(d->selectionStart());
     default:
-        return QVariant();
+        return QQuickItem::inputMethodQuery(property);
     }
 }
 #endif // QT_NO_IM
diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp
index efc67c0437922e64ebdc736010bea892ea7bcc1b..2e8f58b84946fbc81c57b2c14b81f7016999c09b 100644
--- a/src/quick/items/qquickwindow.cpp
+++ b/src/quick/items/qquickwindow.cpp
@@ -77,8 +77,11 @@ void QQuickWindowPrivate::updateFocusItemTransform()
     Q_Q(QQuickWindow);
 #ifndef QT_NO_IM
     QQuickItem *focus = q->activeFocusItem();
-    if (focus && qApp->focusObject() == focus)
-        qApp->inputMethod()->setInputItemTransform(QQuickItemPrivate::get(focus)->itemToWindowTransform());
+    if (focus && qApp->focusObject() == focus) {
+        QQuickItemPrivate *focusPrivate = QQuickItemPrivate::get(focus);
+        qApp->inputMethod()->setInputItemTransform(focusPrivate->itemToWindowTransform());
+        qApp->inputMethod()->setInputItemRectangle(QRectF(0, 0, focusPrivate->width, focusPrivate->height));
+    }
 #endif
 }
 
@@ -690,6 +693,7 @@ void QQuickWindowPrivate::setFocusInScope(QQuickItem *scope, QQuickItem *item, F
             }
             afi = afi->parentItem();
         }
+        updateFocusItemTransform();
 
         QFocusEvent event(QEvent::FocusIn, Qt::OtherFocusReason);
         q->sendEvent(newActiveFocusItem, &event);
@@ -771,6 +775,7 @@ void QQuickWindowPrivate::clearFocusInScope(QQuickItem *scope, QQuickItem *item,
     if (newActiveFocusItem) {
         Q_ASSERT(newActiveFocusItem == scope);
         activeFocusItem = scope;
+        updateFocusItemTransform();
 
         QFocusEvent event(QEvent::FocusIn, Qt::OtherFocusReason);
         q->sendEvent(newActiveFocusItem, &event);