diff --git a/src/interfaces/window.cpp b/src/interfaces/window.cpp
index 1ae037e..9f582bb 100644
--- a/src/interfaces/window.cpp
+++ b/src/interfaces/window.cpp
@@ -6,6 +6,9 @@
 
 #include "window.h"
 #include "../qwaylandlayershellintegration_p.h"
+#if QT_VERSION < QT_VERSION_CHECK(6, 6, 0)
+#include "../qwaylandlayersurface_p.h"
+#endif
 
 #include <layershellqt_logging.h>
 
@@ -121,6 +124,21 @@ void Window::setDesiredOutput(QScreen *output)
     d->desiredOutput = output;
 }
 
+#if QT_VERSION < QT_VERSION_CHECK(6, 6, 0)
+void Window::attachPopup(QWindow *window, xdg_popup *popup)
+{
+    auto waylandWindow = dynamic_cast<QtWaylandClient::QWaylandWindow *>(window->handle());
+    if (!waylandWindow) {
+        return;
+    }
+
+    auto shellSurface = dynamic_cast<QWaylandLayerSurface *>(waylandWindow->shellSurface());
+    if (shellSurface) {
+        shellSurface->get_popup(popup);
+    }
+}
+#endif
+
 Window::Window(QWindow *window)
     : QObject(window)
     , d(new WindowPrivate(window))
diff --git a/src/interfaces/window.h b/src/interfaces/window.h
index 5ebc9b1..72e3b8c 100644
--- a/src/interfaces/window.h
+++ b/src/interfaces/window.h
@@ -14,6 +14,10 @@
 
 #include "layershellqt_export.h"
 
+#if QT_VERSION < QT_VERSION_CHECK(6, 6, 0)
+struct xdg_popup;
+#endif
+
 namespace LayerShellQt
 {
 class WindowPrivate;
@@ -93,6 +97,10 @@ public:
      */
     static Window *get(QWindow *window);
 
+#if QT_VERSION < QT_VERSION_CHECK(6, 6, 0)
+    static void attachPopup(QWindow *window, xdg_popup *popup);
+#endif
+
 Q_SIGNALS:
     void anchorsChanged();
     void exclusionZoneChanged();