diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp
index f6c1412aff58ae43f1b2f0684e16c79f74157c01..619e539204062d184ba95330422645e3447fe946 100644
--- a/src/quick/items/qquickwindow.cpp
+++ b/src/quick/items/qquickwindow.cpp
@@ -1250,6 +1250,14 @@ bool QQuickWindow::isPersistentSceneGraph() const
 
 
 
+/*!
+    \qmlattachedproperty Item Window::contentItem
+    \since 5.4
+
+    This attached property holds the invisible root item of the scene or
+    \c null if the item is not in a window. The Window attached property
+    can be attached to any Item.
+*/
 
 /*!
     \property QQuickWindow::contentItem
diff --git a/src/quick/items/qquickwindowattached.cpp b/src/quick/items/qquickwindowattached.cpp
index 121da9e5d9f3b3ff84e998ec90525b6403e2cf3b..f74e903be37a6116f9f54a093066f7667ef49dce 100644
--- a/src/quick/items/qquickwindowattached.cpp
+++ b/src/quick/items/qquickwindowattached.cpp
@@ -65,6 +65,11 @@ QQuickItem *QQuickWindowAttached::activeFocusItem() const
     return (m_window ? m_window->activeFocusItem() : Q_NULLPTR);
 }
 
+QQuickItem *QQuickWindowAttached::contentItem() const
+{
+    return (m_window ? m_window->contentItem() : Q_NULLPTR);
+}
+
 void QQuickWindowAttached::windowChanged(QQuickWindow *window)
 {
     if (window != m_window) {
@@ -83,6 +88,7 @@ void QQuickWindowAttached::windowChanged(QQuickWindow *window)
             emit activeChanged();
         if (!oldWindow || window->activeFocusItem() != oldWindow->activeFocusItem())
             emit activeFocusItemChanged();
+        emit contentItemChanged();
 
         // QQuickWindowQmlImpl::visibilityChanged also exists, and window might even
         // be QQuickWindowQmlImpl, but that's not what we are connecting to.
diff --git a/src/quick/items/qquickwindowattached_p.h b/src/quick/items/qquickwindowattached_p.h
index 12dd273d603139619a3811498109904873202318..7c2b0bc8734d3278979d566cd887ea061786b1e7 100644
--- a/src/quick/items/qquickwindowattached_p.h
+++ b/src/quick/items/qquickwindowattached_p.h
@@ -49,6 +49,7 @@ class Q_AUTOTEST_EXPORT QQuickWindowAttached : public QObject
     Q_PROPERTY(QWindow::Visibility visibility READ visibility NOTIFY visibilityChanged)
     Q_PROPERTY(bool active READ isActive NOTIFY activeChanged)
     Q_PROPERTY(QQuickItem* activeFocusItem READ activeFocusItem NOTIFY activeFocusItemChanged)
+    Q_PROPERTY(QQuickItem* contentItem READ contentItem NOTIFY contentItemChanged)
 
 public:
     QQuickWindowAttached(QObject* attachee);
@@ -56,12 +57,14 @@ public:
     QWindow::Visibility visibility() const;
     bool isActive() const;
     QQuickItem* activeFocusItem() const;
+    QQuickItem* contentItem() const;
 
 Q_SIGNALS:
 
     void visibilityChanged();
     void activeChanged();
     void activeFocusItemChanged();
+    void contentItemChanged();
 
 protected Q_SLOTS:
     void windowChanged(QQuickWindow*);
diff --git a/tests/auto/quick/qquickwindow/data/windowattached.qml b/tests/auto/quick/qquickwindow/data/windowattached.qml
index e000d5c6fd137630785ffcea8730936f4b2e1bdc..0e3f1d4b62245bb1a7c87f338f1c982bae497795 100644
--- a/tests/auto/quick/qquickwindow/data/windowattached.qml
+++ b/tests/auto/quick/qquickwindow/data/windowattached.qml
@@ -6,6 +6,7 @@ Rectangle {
     width: 100
     height: 100
     property bool windowActive: root.Window.active
+    property Item contentItem: root.Window.contentItem
     Text {
         objectName: "rectangleWindowText"
         anchors.centerIn: parent
@@ -20,6 +21,7 @@ Rectangle {
             objectName: "extraWindowText"
             anchors.centerIn: parent
             text: (extraWindow.active ? "active" : "inactive") + "\nvisibility: " + Window.visibility
+            property Item contentItem: Window.contentItem
         }
     }
 }
diff --git a/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp b/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp
index 5bd7492d701a453ba9436dbe97eef7cc5635b5c4..043203c256bf34935340c7fdb757bfb7c43c1ae6 100644
--- a/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp
+++ b/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp
@@ -1952,6 +1952,7 @@ void tst_qquickwindow::attachedProperty()
     view.requestActivate();
     QVERIFY(QTest::qWaitForWindowActive(&view));
     QVERIFY(view.rootObject()->property("windowActive").toBool());
+    QCOMPARE(view.rootObject()->property("contentItem").value<QQuickItem*>(), view.contentItem());
 
     QQuickWindow *innerWindow = view.rootObject()->findChild<QQuickWindow*>("extraWindow");
     QVERIFY(innerWindow);
@@ -1961,6 +1962,7 @@ void tst_qquickwindow::attachedProperty()
     QQuickText *text = view.rootObject()->findChild<QQuickText*>("extraWindowText");
     QVERIFY(text);
     QCOMPARE(text->text(), QLatin1String("active\nvisibility: 2"));
+    QCOMPARE(text->property("contentItem").value<QQuickItem*>(), innerWindow->contentItem());
 }
 
 class RenderJob : public QRunnable