diff --git a/extensions/surface-extension.xml b/extensions/surface-extension.xml
index 38c6590ce61673903a9c2caf6c87e334b7d31cc8..dbbb85110d4818e28511cde440083bd038c46aea 100644
--- a/extensions/surface-extension.xml
+++ b/extensions/surface-extension.xml
@@ -75,5 +75,15 @@
         <request name="set_content_orientation">
             <arg name="orientation" type="int"/>
         </request>
+
+        <enum name="windowflag">
+            <entry name="OverridesSystemGestures" value="1"/>
+            <entry name="StaysOnTop" value="2"/>
+        </enum>
+
+        <request name="set_window_flags">
+            <arg name="flags" type="int"/>
+        </request>
+
     </interface>
 </protocol>
diff --git a/src/compositor/compositor_api/waylandcompositor.cpp b/src/compositor/compositor_api/waylandcompositor.cpp
index c86698bd4e14b4451f5f37c066d25653b4ef5440..03c0b8141794e5a650cf3cea511db3bc3de7f24e 100644
--- a/src/compositor/compositor_api/waylandcompositor.cpp
+++ b/src/compositor/compositor_api/waylandcompositor.cpp
@@ -68,6 +68,8 @@ WaylandCompositor::WaylandCompositor(QWindow *window, const char *socketName)
     m_compositor = new Wayland::Compositor(this);
 #ifdef QT_COMPOSITOR_QUICK
     qmlRegisterType<WaylandSurfaceItem>("WaylandCompositor", 1, 0, "WaylandSurfaceItem");
+    qmlRegisterType<WaylandSurface>("WaylandCompositor", 1, 0, "WaylandSurface");
+#else
     qRegisterMetaType<WaylandSurface*>("WaylandSurface*");
 #endif
     m_compositor->initializeHardwareIntegration();
diff --git a/src/compositor/compositor_api/waylandsurface.cpp b/src/compositor/compositor_api/waylandsurface.cpp
index 786c1f4b540f0de1f0e4ac6904fbb4a7c6178fdc..596dee8bafb4c8bf6cde71c733cc93326ff05e8c 100644
--- a/src/compositor/compositor_api/waylandsurface.cpp
+++ b/src/compositor/compositor_api/waylandsurface.cpp
@@ -153,6 +153,15 @@ Qt::ScreenOrientation WaylandSurface::windowOrientation() const
     return d->surface->windowOrientation();
 }
 
+
+
+WaylandSurface::WindowFlags WaylandSurface::windowFlags() const
+{
+    Q_D(const WaylandSurface);
+    return d->surface->windowFlags();
+}
+
+
 QImage WaylandSurface::image() const
 {
     Q_D(const WaylandSurface);
diff --git a/src/compositor/compositor_api/waylandsurface.h b/src/compositor/compositor_api/waylandsurface.h
index debf6fe7c326c14ed43d355ddd86ad9e4c704e9c..e371237a6adce2c0ddb36acbc0a4e960f57fdcdc 100644
--- a/src/compositor/compositor_api/waylandsurface.h
+++ b/src/compositor/compositor_api/waylandsurface.h
@@ -72,14 +72,25 @@ class Q_COMPOSITOR_EXPORT WaylandSurface : public QObject
     Q_DECLARE_PRIVATE(WaylandSurface)
     Q_PROPERTY(QSize size READ size WRITE setSize NOTIFY sizeChanged)
     Q_PROPERTY(QPointF pos READ pos WRITE setPos NOTIFY posChanged)
+    Q_PROPERTY(WaylandSurface::WindowFlags windowFlags READ windowFlags NOTIFY windowFlagsChanged)
+
+    Q_ENUMS(WindowFlag)
+    Q_FLAGS(WindowFlag WindowFlags)
+
 public:
+    enum WindowFlag {
+        OverridesSystemGestures     = 0x0001,
+        StaysOnTop                  = 0x0002
+    };
+    Q_DECLARE_FLAGS(WindowFlags, WindowFlag)
+
     enum Type {
         Invalid,
         Shm,
         Texture
     };
 
-    WaylandSurface(Wayland::Surface *surface);
+    WaylandSurface(Wayland::Surface *surface = 0);
 
     WaylandSurface *parentSurface() const;
     QLinkedList<WaylandSurface *> subSurfaces() const;
@@ -97,6 +108,8 @@ public:
     Qt::ScreenOrientation contentOrientation() const;
     Qt::ScreenOrientation windowOrientation() const;
 
+    WindowFlags windowFlags() const;
+
     QImage image() const;
 #ifdef QT_COMPOSITOR_WAYLAND_GL
     GLuint texture(QOpenGLContext *context) const;
@@ -133,6 +146,7 @@ signals:
     void sizeChanged();
     void posChanged();
     void windowPropertyChanged(const QString &name, const QVariant &value);
+    void windowFlagsChanged(WindowFlags flags);
 
     friend class Wayland::Surface;
     friend class Wayland::SurfacePrivate;
diff --git a/src/compositor/wayland_wrapper/wlextendedsurface.cpp b/src/compositor/wayland_wrapper/wlextendedsurface.cpp
index 38e4dff4fbac3620eb5cd87cc812778cfb4b55ad..a386b5967b97c56f3263f7b5bbd938f79fdeda81 100644
--- a/src/compositor/wayland_wrapper/wlextendedsurface.cpp
+++ b/src/compositor/wayland_wrapper/wlextendedsurface.cpp
@@ -79,6 +79,7 @@ ExtendedSurface::ExtendedSurface(struct wl_client *client, uint32_t id, Surface
     : m_surface(surface)
     , m_windowOrientation(Qt::PrimaryOrientation)
     , m_contentOrientation(Qt::PrimaryOrientation)
+    , m_windowFlags(0)
 {
     Q_ASSERT(surface->extendedSurface() == 0);
     surface->setExtendedSurface(this);
@@ -165,10 +166,25 @@ void ExtendedSurface::set_content_orientation(struct wl_client *client,
     extended_surface->m_contentOrientation = screenOrientationFromWaylandOrientation(orientation);
 }
 
+void ExtendedSurface::setWindowFlags(WaylandSurface::WindowFlags flags)
+{
+    if (flags == m_windowFlags)
+        return;
+    m_windowFlags = flags;
+    emit m_surface->handle()->windowFlagsChanged(flags);
+}
+
+void ExtendedSurface::set_window_flags(wl_client *client, wl_resource *resource, int32_t flags)
+{
+    ExtendedSurface *extended_surface = static_cast<ExtendedSurface *>(resource->data);
+    extended_surface->setWindowFlags(WaylandSurface::WindowFlags(flags));
+}
+
 const struct wl_extended_surface_interface ExtendedSurface::extended_surface_interface = {
     ExtendedSurface::update_generic_property,
     ExtendedSurface::set_window_orientation,
-    ExtendedSurface::set_content_orientation
+    ExtendedSurface::set_content_orientation,
+    ExtendedSurface::set_window_flags
 };
 
 }
diff --git a/src/compositor/wayland_wrapper/wlextendedsurface.h b/src/compositor/wayland_wrapper/wlextendedsurface.h
index 5cbabe60d27d2d9b136971f66c5b2867c8be2e98..cd2748947d522ad1845ddfeb826c6e2cc7f1424b 100644
--- a/src/compositor/wayland_wrapper/wlextendedsurface.h
+++ b/src/compositor/wayland_wrapper/wlextendedsurface.h
@@ -90,6 +90,9 @@ public:
     Qt::ScreenOrientation windowOrientation() const;
     Qt::ScreenOrientation contentOrientation() const;
 
+    void setWindowFlags(WaylandSurface::WindowFlags flags);
+    WaylandSurface::WindowFlags windowFlags() const { return m_windowFlags; }
+
 private:
     struct wl_resource *m_extended_surface_resource;
     Surface *m_surface;
@@ -97,6 +100,8 @@ private:
     Qt::ScreenOrientation m_windowOrientation;
     Qt::ScreenOrientation m_contentOrientation;
 
+    WaylandSurface::WindowFlags m_windowFlags;
+
     static void update_generic_property(struct wl_client *client,
                                     struct wl_resource *resource,
                                     const char *name,
@@ -110,6 +115,10 @@ private:
                                         struct wl_resource *resource,
                                         int32_t orientation);
 
+    static void set_window_flags(struct wl_client *client,
+                                 struct wl_resource *resource,
+                                 int32_t flags);
+
     static const struct wl_extended_surface_interface extended_surface_interface;
 };
 
diff --git a/src/compositor/wayland_wrapper/wlsurface.cpp b/src/compositor/wayland_wrapper/wlsurface.cpp
index be2eb14ba81fb220e83d3af2890aa0aa4251c3c0..223a350c42027f135d77ebabff77947d99b676ff 100644
--- a/src/compositor/wayland_wrapper/wlsurface.cpp
+++ b/src/compositor/wayland_wrapper/wlsurface.cpp
@@ -623,6 +623,12 @@ Qt::ScreenOrientation Surface::contentOrientation() const
     return d->extendedSurface ? d->extendedSurface->contentOrientation() : Qt::PrimaryOrientation;
 }
 
+WaylandSurface::WindowFlags Surface::windowFlags() const
+{
+    Q_D(const Surface);
+    return d->extendedSurface ? d->extendedSurface->windowFlags() : WaylandSurface::WindowFlags(0);
+}
+
 QPoint Surface::lastMousePos() const
 {
     Q_D(const Surface);
diff --git a/src/compositor/wayland_wrapper/wlsurface.h b/src/compositor/wayland_wrapper/wlsurface.h
index b34d7c8cce7ac2178120ff961cd56bd66e0f9f41..ecb4b5fe826f512ae3e5a475b843a819da7fc45a 100644
--- a/src/compositor/wayland_wrapper/wlsurface.h
+++ b/src/compositor/wayland_wrapper/wlsurface.h
@@ -117,6 +117,8 @@ public:
     Qt::ScreenOrientation contentOrientation() const;
     Qt::ScreenOrientation windowOrientation() const;
 
+    WaylandSurface::WindowFlags windowFlags() const;
+
     QPoint lastMousePos() const;
 
     void setExtendedSurface(ExtendedSurface *extendedSurface);
diff --git a/src/plugins/platforms/wayland/qwaylandextendedsurface.cpp b/src/plugins/platforms/wayland/qwaylandextendedsurface.cpp
index 58dfac4b01b5281bd40126670002b33243611cb9..41ccdec9555fa476888012410830a0d22eed9ea6 100644
--- a/src/plugins/platforms/wayland/qwaylandextendedsurface.cpp
+++ b/src/plugins/platforms/wayland/qwaylandextendedsurface.cpp
@@ -162,6 +162,20 @@ void QWaylandExtendedSurface::set_generic_property(void *data, wl_extended_surfa
     nativeInterface->emitWindowPropertyChanged(extended_window->m_window,QString::fromLatin1(name));
 }
 
+Qt::WindowFlags QWaylandExtendedSurface::setWindowFlags(Qt::WindowFlags flags)
+{
+    uint wlFlags = 0;
+    if (flags & Qt::WindowStaysOnTopHint) wlFlags |= WL_EXTENDED_SURFACE_WINDOWFLAG_STAYSONTOP;
+    if (flags & Qt::WindowOverridesSystemGestures) wlFlags |= WL_EXTENDED_SURFACE_WINDOWFLAG_OVERRIDESSYSTEMGESTURES;
+
+    wl_extended_surface_set_window_flags(m_extended_surface, wlFlags);
+
+    return flags & (
+                    Qt::WindowStaysOnTopHint
+                    | Qt::WindowOverridesSystemGestures
+                   );
+}
+
 const struct wl_extended_surface_listener QWaylandExtendedSurface::extended_surface_listener = {
     QWaylandExtendedSurface::onscreen_visibility,
     QWaylandExtendedSurface::set_generic_property
diff --git a/src/plugins/platforms/wayland/qwaylandextendedsurface.h b/src/plugins/platforms/wayland/qwaylandextendedsurface.h
index 184fc0d471e0ccbf4b3d9fb3e1e4ed2852856a9c..9efb638cf0df8fdc7d47a032cf15f38fafa91e51 100644
--- a/src/plugins/platforms/wayland/qwaylandextendedsurface.h
+++ b/src/plugins/platforms/wayland/qwaylandextendedsurface.h
@@ -74,6 +74,8 @@ public:
     QVariant property(const QString &name);
     QVariant property(const QString &name, const QVariant &defaultValue);
 
+    Qt::WindowFlags setWindowFlags(Qt::WindowFlags flags);
+
 private:
     QWaylandWindow *m_window;
     struct wl_extended_surface *m_extended_surface;
diff --git a/src/plugins/platforms/wayland/qwaylandwindow.cpp b/src/plugins/platforms/wayland/qwaylandwindow.cpp
index 2f2b784427a6d9dbf4ac4ee2c42481315878dd94..1142c31f35867d04c507f0410a292d4d10ebf87c 100644
--- a/src/plugins/platforms/wayland/qwaylandwindow.cpp
+++ b/src/plugins/platforms/wayland/qwaylandwindow.cpp
@@ -221,3 +221,8 @@ Qt::ScreenOrientation QWaylandWindow::requestWindowOrientation(Qt::ScreenOrienta
 
     return Qt::PrimaryOrientation;
 }
+
+Qt::WindowFlags QWaylandWindow::setWindowFlags(Qt::WindowFlags flags)
+{
+    return mExtendedWindow->setWindowFlags(flags);
+}
diff --git a/src/plugins/platforms/wayland/qwaylandwindow.h b/src/plugins/platforms/wayland/qwaylandwindow.h
index d102f4e6ebb0023172d20031433913482a411306..b67e11d546b4264e85ebead1b770751a99f07ede 100644
--- a/src/plugins/platforms/wayland/qwaylandwindow.h
+++ b/src/plugins/platforms/wayland/qwaylandwindow.h
@@ -88,6 +88,8 @@ public:
     void handleContentOrientationChange(Qt::ScreenOrientation orientation);
     Qt::ScreenOrientation requestWindowOrientation(Qt::ScreenOrientation orientation);
 
+    Qt::WindowFlags setWindowFlags(Qt::WindowFlags flags);
+
 protected:
     QWaylandDisplay *mDisplay;
     struct wl_surface *mSurface;