diff --git a/src/client/qwaylanddisplay.cpp b/src/client/qwaylanddisplay.cpp
index 2d1c81a750d89af8216386ce825ac2d3f68df6ad..dbb8e12dd07760b0ab68e8c8d3be9ba547e3ddf7 100644
--- a/src/client/qwaylanddisplay.cpp
+++ b/src/client/qwaylanddisplay.cpp
@@ -201,6 +201,8 @@ void QWaylandDisplay::blockingReadEvents()
 
 void QWaylandDisplay::exitWithError()
 {
+    mEventThread->quit();
+    mEventThread->wait();
     ::exit(1);
 }
 
diff --git a/src/compositor/compositor_api/qwaylandsurfaceitem.cpp b/src/compositor/compositor_api/qwaylandsurfaceitem.cpp
index 0c48df38239087a7d5bf740620166b266ce34032..ca746ae41233e352e07bcc51a27f9f42b9bff9d9 100644
--- a/src/compositor/compositor_api/qwaylandsurfaceitem.cpp
+++ b/src/compositor/compositor_api/qwaylandsurfaceitem.cpp
@@ -250,6 +250,10 @@ void QWaylandSurfaceItem::touchEvent(QTouchEvent *event)
             inputDevice->setMouseFocus(this, pointPos, pointPos);
         }
         inputDevice->sendFullTouchEvent(event);
+
+        const bool isEnd = event->type() == QEvent::TouchEnd || event->type() == QEvent::TouchCancel;
+        if (isEnd && window()->mouseGrabberItem() == this)
+            ungrabMouse();
     } else {
         event->ignore();
     }
diff --git a/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp b/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp
index 2c3697bd89d21177b876343ca1cc35884b6a012b..efed808fb51316516500007b0ac4e030c5dbdd6a 100644
--- a/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp
+++ b/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp
@@ -149,6 +149,13 @@ QSurfaceFormat QWaylandEglWindow::format() const
     return m_format;
 }
 
+void QWaylandEglWindow::setVisible(bool visible)
+{
+    QWaylandWindow::setVisible(visible);
+    if (!visible)
+        invalidateSurface();
+}
+
 void QWaylandEglWindow::invalidateSurface()
 {
     if (m_eglSurface) {
diff --git a/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.h b/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.h
index 60722d168282649f63473123a55fb2d7b277aa1e..c6bb4344507f43ca7720022a2f56052909a1631c 100644
--- a/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.h
+++ b/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.h
@@ -66,6 +66,7 @@ public:
     void bindContentFBO();
 
     void invalidateSurface() Q_DECL_OVERRIDE;
+    void setVisible(bool visible) Q_DECL_OVERRIDE;
 
 private:
     QWaylandEglClientBufferIntegration *m_clientBufferIntegration;
diff --git a/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp b/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp
index 85215f14b8c6b2916447a1c3a3b241ccae4c75c7..2d5a182c735163282491c3b738e3d4ec90ebdc64 100644
--- a/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp
+++ b/src/hardwareintegration/compositor/wayland-egl/waylandeglclientbufferintegration.cpp
@@ -151,12 +151,6 @@ void WaylandEglClientBufferIntegration::initializeHardware(QtWayland::Display *w
         return;
     }
 
-    d->gl_egl_image_target_texture_2d = reinterpret_cast<PFNGLEGLIMAGETARGETTEXTURE2DOESPROC>(eglGetProcAddress("glEGLImageTargetTexture2DOES"));
-    if (!d->gl_egl_image_target_texture_2d) {
-        qWarning("QtCompositor: Failed to initialize EGL display. Could not find glEGLImageTargetTexture2DOES.");
-        return;
-    }
-
     if (d->egl_bind_wayland_display && d->egl_unbind_wayland_display) {
         d->display_bound = d->egl_bind_wayland_display(d->egl_display, waylandDisplay->handle());
         if (!d->display_bound) {
@@ -175,11 +169,22 @@ void WaylandEglClientBufferIntegration::initializeHardware(QtWayland::Display *w
 void WaylandEglClientBufferIntegration::bindTextureToBuffer(struct ::wl_resource *buffer)
 {
     Q_D(WaylandEglClientBufferIntegration);
+
     if (!d->valid) {
         qWarning("QtCompositor: bindTextureToBuffer() failed");
         return;
     }
 
+    // Vivante drivers on the iMX6 don't resolve this function early enough for us, they seem to require the EGL/GLES setup to be further
+    // along than they are in initializeHardware(), so do the lookup here instead.
+    if (!d->gl_egl_image_target_texture_2d)
+        d->gl_egl_image_target_texture_2d = reinterpret_cast<PFNGLEGLIMAGETARGETTEXTURE2DOESPROC>(eglGetProcAddress("glEGLImageTargetTexture2DOES"));
+
+    if (!d->gl_egl_image_target_texture_2d) {
+        qWarning("QtCompositor: bindTextureToBuffer() failed. Could not find glEGLImageTargetTexture2DOES.");
+        return;
+    }
+
     EGLImageKHR image = d->egl_create_image(d->egl_display, EGL_NO_CONTEXT,
                                           EGL_WAYLAND_BUFFER_WL,
                                           buffer, NULL);