diff --git a/src/quick/items/qquickitemsmodule.cpp b/src/quick/items/qquickitemsmodule.cpp
index c9c8eeace3525ef6d61cb5d5e6e06ef34a5a07ea..0aed784b2e99fae0793b59603db30ac22e563c5c 100644
--- a/src/quick/items/qquickitemsmodule.cpp
+++ b/src/quick/items/qquickitemsmodule.cpp
@@ -190,6 +190,7 @@ static void qt_quickitems_defineModule(const char *uri, int major, int minor)
     qmlRegisterType<QQuickTextEdit,1>(uri,2,1,"TextEdit");
     qmlRegisterType<QQuickTextInput>(uri,major,minor,"TextInput");
     qmlRegisterType<QQuickTextInput,2>(uri,2,2,"TextInput");
+    qmlRegisterType<QQuickTextInput,3>(uri,2,4,"TextInput");
     qmlRegisterType<QQuickViewSection>(uri,major,minor,"ViewSection");
 
     qmlRegisterType<QQuickItemLayer>();
diff --git a/src/quick/items/qquicktextinput.cpp b/src/quick/items/qquicktextinput.cpp
index ad79f0eadf693d9e815acab91e5f95eb84650400..26dda5db6b4872f1b64dfeaede896aa3277b54a0 100644
--- a/src/quick/items/qquicktextinput.cpp
+++ b/src/quick/items/qquicktextinput.cpp
@@ -2059,9 +2059,8 @@ void QQuickTextInput::insert(int position, const QString &text)
 {
     Q_D(QQuickTextInput);
     if (d->m_echoMode == QQuickTextInput::Password) {
-        int delay = qGuiApp->styleHints()->passwordMaskDelay();
-        if (delay > 0)
-            d->m_passwordEchoTimer.start(delay, this);
+        if (d->m_passwordMaskDelay > 0)
+            d->m_passwordEchoTimer.start(d->m_passwordMaskDelay, this);
     }
     if (position < 0 || position > d->m_text.length())
         return;
@@ -2240,6 +2239,34 @@ void QQuickTextInput::setPasswordCharacter(const QString &str)
     emit passwordCharacterChanged();
 }
 
+/*!
+   \qmlproperty int QtQuick::TextInput::passwordMaskDelay
+   \since 5.4
+
+   Sets the delay before visible character is masked with password character, in milliseconds.
+
+   The reset method will be called by assigning undefined.
+*/
+int QQuickTextInput::passwordMaskDelay() const
+{
+    Q_D(const QQuickTextInput);
+    return d->m_passwordMaskDelay;
+}
+
+void QQuickTextInput::setPasswordMaskDelay(int delay)
+{
+    Q_D(QQuickTextInput);
+    if (d->m_passwordMaskDelay != delay) {
+        d->m_passwordMaskDelay = delay;
+        emit passwordMaskDelayChanged(delay);
+    }
+}
+
+void QQuickTextInput::resetPasswordMaskDelay()
+{
+    setPasswordMaskDelay(qGuiApp->styleHints()->passwordMaskDelay());
+}
+
 /*!
    \qmlproperty string QtQuick::TextInput::displayText
 
@@ -3478,9 +3505,8 @@ void QQuickTextInputPrivate::internalInsert(const QString &s)
 {
     Q_Q(QQuickTextInput);
     if (m_echoMode == QQuickTextInput::Password) {
-        int delay = qGuiApp->styleHints()->passwordMaskDelay();
-        if (delay > 0)
-            m_passwordEchoTimer.start(delay, q);
+        if (m_passwordMaskDelay > 0)
+            m_passwordEchoTimer.start(m_passwordMaskDelay, q);
     }
     Q_ASSERT(!hasSelectedText());   // insert(), processInputMethodEvent() call removeSelectedText() first.
     if (m_maskData) {
diff --git a/src/quick/items/qquicktextinput_p.h b/src/quick/items/qquicktextinput_p.h
index 5f0250aaf13e6848a13ca96bbf100b2f2da76024..5a882735435cf61665ca3714b2f21e5e34052d92 100644
--- a/src/quick/items/qquicktextinput_p.h
+++ b/src/quick/items/qquicktextinput_p.h
@@ -94,6 +94,7 @@ class Q_QUICK_PRIVATE_EXPORT QQuickTextInput : public QQuickImplicitSizeItem
     Q_PROPERTY(EchoMode echoMode READ echoMode WRITE setEchoMode NOTIFY echoModeChanged)
     Q_PROPERTY(bool activeFocusOnPress READ focusOnPress WRITE setFocusOnPress NOTIFY activeFocusOnPressChanged)
     Q_PROPERTY(QString passwordCharacter READ passwordCharacter WRITE setPasswordCharacter NOTIFY passwordCharacterChanged)
+    Q_PROPERTY(int passwordMaskDelay READ passwordMaskDelay WRITE setPasswordMaskDelay RESET resetPasswordMaskDelay NOTIFY passwordMaskDelayChanged REVISION 3)
     Q_PROPERTY(QString displayText READ displayText NOTIFY displayTextChanged)
     Q_PROPERTY(bool autoScroll READ autoScroll WRITE setAutoScroll NOTIFY autoScrollChanged)
     Q_PROPERTY(bool selectByMouse READ selectByMouse WRITE setSelectByMouse NOTIFY selectByMouseChanged)
@@ -227,6 +228,10 @@ public:
     QString passwordCharacter() const;
     void setPasswordCharacter(const QString &str);
 
+    int passwordMaskDelay() const;
+    void setPasswordMaskDelay(int delay);
+    void resetPasswordMaskDelay();
+
     QString displayText() const;
 
     QQmlComponent* cursorDelegate() const;
@@ -300,6 +305,7 @@ Q_SIGNALS:
     void inputMaskChanged(const QString &inputMask);
     void echoModeChanged(EchoMode echoMode);
     void passwordCharacterChanged();
+    Q_REVISION(3) void passwordMaskDelayChanged(int delay);
     void displayTextChanged();
     void activeFocusOnPressChanged(bool activeFocusOnPress);
     void autoScrollChanged(bool autoScroll);
diff --git a/src/quick/items/qquicktextinput_p_p.h b/src/quick/items/qquicktextinput_p_p.h
index 21bd1bd6d73b4c54d1bb678ac2c6965806363b7b..2cf127608eca40dbb622e68c22c511afc5f42ada 100644
--- a/src/quick/items/qquicktextinput_p_p.h
+++ b/src/quick/items/qquicktextinput_p_p.h
@@ -111,6 +111,7 @@ public:
         , mouseSelectionMode(QQuickTextInput::SelectCharacters)
         , m_layoutDirection(Qt::LayoutDirectionAuto)
         , m_passwordCharacter(qApp->styleHints()->passwordMaskCharacter())
+        , m_passwordMaskDelay(qApp->styleHints()->passwordMaskDelay())
         , focusOnPress(true)
         , cursorVisible(false)
         , cursorPending(false)
@@ -250,6 +251,7 @@ public:
 
     QChar m_blank;
     QChar m_passwordCharacter;
+    int m_passwordMaskDelay;
 
     bool focusOnPress:1;
     bool cursorVisible:1;