diff --git a/examples/canvas3d/canvas3d/threejs/cellphone/qml/cellphone/cellphoneapp.qml b/examples/canvas3d/canvas3d/threejs/cellphone/qml/cellphone/cellphoneapp.qml
index 5ca39460338c3a71173bd17c4c4e7642885d1734..9ab674d241e800c48bc42bd69b56ca0104262111 100644
--- a/examples/canvas3d/canvas3d/threejs/cellphone/qml/cellphone/cellphoneapp.qml
+++ b/examples/canvas3d/canvas3d/threejs/cellphone/qml/cellphone/cellphoneapp.qml
@@ -314,14 +314,12 @@ Rectangle {
         flickDeceleration: 0
         onMovementStarted: {
             // Interpret all drags as flicks instead
-            if (interactive)
+            if (interactive) {
+                interactive = false
                 flick(-flickSpeed, 0)
-            interactive = false
+            }
         }
         onFlickStarted: {
-            // All flicks will open the screen at consistent speed
-            if (interactive)
-                flick(-flickSpeed, 0)
             interactive = false
         }
         onFlickEnded: {
diff --git a/src/imports/qtcanvas3d/canvasrenderer.cpp b/src/imports/qtcanvas3d/canvasrenderer.cpp
index 760569e27d969df14c315629e7fd66b7e07746ae..192e8a7e764ca4143ef2176273fdc2111b7a4ff8 100644
--- a/src/imports/qtcanvas3d/canvasrenderer.cpp
+++ b/src/imports/qtcanvas3d/canvasrenderer.cpp
@@ -318,64 +318,64 @@ void CanvasRenderer::init(QQuickWindow *window, const CanvasContextAttributes &c
  */
 void CanvasRenderer::shutDown()
 {
-    if (!m_glContext)
-        return;
-
     QMutexLocker locker(&m_shutdownMutex);
 
-    m_fps = 0;
+    if (m_glContext) {
+        if (m_renderTarget == Canvas::RenderTargetOffscreenBuffer)
+            m_glContext->makeCurrent(m_offscreenSurface);
+
+        m_commandQueue.clearResourceMaps();
 
-    if (m_renderTarget == Canvas::RenderTargetOffscreenBuffer)
-        m_glContext->makeCurrent(m_offscreenSurface);
+        deleteCommandData();
+        m_executeQueue.clear();
 
-    m_commandQueue.clearResourceMaps();
+        delete m_renderFbo;
+        delete m_displayFbo;
+        delete m_antialiasFbo;
 
-    deleteCommandData();
-    m_executeQueue.clear();
+        if (m_renderTarget == Canvas::RenderTargetOffscreenBuffer) {
+            delete m_alphaMultiplierFbo;
+            m_alphaMultiplierFbo = 0;
+            glDeleteBuffers(1, &m_alphaMultiplierUVBuffer);
+            glDeleteBuffers(1, &m_alphaMultiplierVertexBuffer);
+            m_alphaMultiplierUVBuffer = 0;
+            m_alphaMultiplierVertexBuffer = 0;
+            delete m_alphaMultiplierProgram;
+            delete m_alphaMultiplierVertexShader;
+            delete m_alphaMultiplierFragmentShader;
+            m_alphaMultiplierProgram = 0;
+            m_alphaMultiplierVertexShader = 0;
+            m_alphaMultiplierFragmentShader = 0;
 
-    delete m_renderFbo;
-    delete m_displayFbo;
-    delete m_antialiasFbo;
+            m_glContext->doneCurrent();
+            delete m_glContext;
+        }
 
-    if (m_renderTarget == Canvas::RenderTargetOffscreenBuffer) {
-        delete m_alphaMultiplierFbo;
-        m_alphaMultiplierFbo = 0;
-        glDeleteBuffers(1, &m_alphaMultiplierUVBuffer);
-        glDeleteBuffers(1, &m_alphaMultiplierVertexBuffer);
-        m_alphaMultiplierUVBuffer = 0;
-        m_alphaMultiplierVertexBuffer = 0;
-        delete m_alphaMultiplierProgram;
-        delete m_alphaMultiplierVertexShader;
-        delete m_alphaMultiplierFragmentShader;
-        m_alphaMultiplierProgram = 0;
-        m_alphaMultiplierVertexShader = 0;
-        m_alphaMultiplierFragmentShader = 0;
+        m_renderFbo = 0;
+        m_displayFbo = 0;
+        m_antialiasFbo = 0;
 
-        m_glContext->doneCurrent();
-        delete m_glContext;
-    }
+        // m_offscreenSurface is owned by main thread, as on some platforms that is required.
+        if (m_offscreenSurface) {
+            m_offscreenSurface->deleteLater();
+            m_offscreenSurface = 0;
+        }
 
-    m_renderFbo = 0;
-    m_displayFbo = 0;
-    m_antialiasFbo = 0;
+        m_currentFramebufferId = 0;
+        m_forceViewportRect = QRect();
 
-    delete m_glContextShare;
+        delete m_stateStore;
+        m_stateStore = 0;
 
-    // m_offscreenSurface is owned by main thread, as on some platforms that is required.
-    if (m_offscreenSurface) {
-        m_offscreenSurface->deleteLater();
-        m_offscreenSurface = 0;
+        m_glContext = 0;
     }
 
-    m_glContext = 0;
+    delete m_glContextShare;
+
     m_glContextQt = 0;
     m_glContextShare = 0;
 
-    m_currentFramebufferId = 0;
-    m_forceViewportRect = QRect();
-
-    delete m_stateStore;
-    m_stateStore = 0;
+    m_fps = 0;
 }
 
 /*!
diff --git a/src/imports/qtcanvas3d/context3d.cpp b/src/imports/qtcanvas3d/context3d.cpp
index f6bbc75e51ae3ad91dec47d0c7bd54029e6aebea..9d79e6f48124e2b1cd0bd6eddff1f218fe080063 100644
--- a/src/imports/qtcanvas3d/context3d.cpp
+++ b/src/imports/qtcanvas3d/context3d.cpp
@@ -5978,14 +5978,14 @@ QVariantList CanvasContext::getSupportedExtensions()
 
         if (!m_isOpenGLES2 ||
                 (m_contextVersion >= 3
-                 || m_extensions.contains("OES_standard_derivatives"))) {
+                 || m_extensions.contains("GL_OES_standard_derivatives"))) {
             list.append(QVariant::fromValue(QStringLiteral("OES_standard_derivatives")));
         }
 
         if (m_extensions.contains("GL_EXT_texture_compression_s3tc"))
             list.append(QVariant::fromValue(QStringLiteral("WEBGL_compressed_texture_s3tc")));
 
-        if (m_extensions.contains("IMG_texture_compression_pvrtc"))
+        if (m_extensions.contains("GL_IMG_texture_compression_pvrtc"))
             list.append(QVariant::fromValue(QStringLiteral("WEBGL_compressed_texture_pvrtc")));
     }
 
@@ -6087,7 +6087,7 @@ QVariant CanvasContext::getExtension(const QString &name)
                 m_textureProviderExt = new CanvasTextureProvider(this, this);
             return QVariant::fromValue(m_textureProviderExt);
         } else if (upperCaseName == QStringLiteral("OES_STANDARD_DERIVATIVES") &&
-                   m_extensions.contains("OES_standard_derivatives")) {
+                   m_extensions.contains("GL_OES_standard_derivatives")) {
             if (!m_standardDerivatives)
                 m_standardDerivatives = new QObject(this);
             return QVariant::fromValue(m_standardDerivatives);
@@ -6097,7 +6097,7 @@ QVariant CanvasContext::getExtension(const QString &name)
                 m_compressedTextureS3TC = new CompressedTextureS3TC(this);
             return QVariant::fromValue(m_compressedTextureS3TC);
         } else if (upperCaseName == QStringLiteral("WEBGL_COMPRESSED_TEXTURE_PVRTC") &&
-                   m_extensions.contains("IMG_texture_compression_pvrtc")) {
+                   m_extensions.contains("GL_IMG_texture_compression_pvrtc")) {
             if (!m_compressedTexturePVRTC)
                 m_compressedTexturePVRTC = new CompressedTexturePVRTC(this);
             return QVariant::fromValue(m_compressedTexturePVRTC);
diff --git a/src/imports/qtcanvas3d/doc/qtcanvas3d.qdocconf b/src/imports/qtcanvas3d/doc/qtcanvas3d.qdocconf
index be8e805f06c5a935f83f42d7f52c4f590db5ddc7..c0a7ae450cc75012483dee6aae0f312b683a4e84 100644
--- a/src/imports/qtcanvas3d/doc/qtcanvas3d.qdocconf
+++ b/src/imports/qtcanvas3d/doc/qtcanvas3d.qdocconf
@@ -1,8 +1,8 @@
 include($QT_INSTALL_DOCS/global/qt-module-defaults.qdocconf)
 
 project             = QtCanvas3D
-description         = QtCanvas3D Reference Documentation
-version             = 1.1.0
+description         = Qt Canvas 3D Reference Documentation
+version             = $QT_VERSION
 
 exampledirs = ../../../../examples/canvas3d \
               snippets
@@ -18,15 +18,15 @@ depends     = qtcore qtgui qtqml qtquick qtquickcontrols qtquicklayouts qtdoc qt
 qhp.projects                   = QtCanvas3D
 
 qhp.QtCanvas3D.file            = qtcanvas3d.qhp
-qhp.QtCanvas3D.namespace       = org.qt-project.qtcanvas3d.100
+qhp.QtCanvas3D.namespace       = org.qt-project.qtcanvas3d.$QT_VERSION_TAG
 qhp.QtCanvas3D.virtualFolder   = qtcanvas3d
 qhp.QtCanvas3D.indexTitle      = Qt Canvas 3D
 qhp.QtCanvas3D.indexRoot       =
 
 
-qhp.QtCanvas3D.filterAttributes                        = qtcanvas3d 1.1.0 qtrefdoc
-qhp.QtCanvas3D.customFilters.Qt.name                   = QtCanvas3D 1.1.0
-qhp.QtCanvas3D.customFilters.Qt.filterAttributes       = qtcanvas3d 1.1.0
+qhp.QtCanvas3D.filterAttributes                        = qtcanvas3d $QT_VERSION qtrefdoc
+qhp.QtCanvas3D.customFilters.Qt.name                   = QtCanvas3D $QT_VERSION
+qhp.QtCanvas3D.customFilters.Qt.filterAttributes       = qtcanvas3d $QT_VERSION
 qhp.QtCanvas3D.subprojects                             = gettingstarted examples types
 qhp.QtCanvas3D.subprojects.gettingstarted.title        = Getting Started
 qhp.QtCanvas3D.subprojects.gettingstarted.indexTitle   = Qt Canvas 3D Getting Started
diff --git a/src/imports/qtcanvas3d/teximage3d.cpp b/src/imports/qtcanvas3d/teximage3d.cpp
index f2e1fc83c47ae2c26ed808d59363ea2aa9b791c8..315b395e8ac7218192c17ede315aa7cc321635aa 100644
--- a/src/imports/qtcanvas3d/teximage3d.cpp
+++ b/src/imports/qtcanvas3d/teximage3d.cpp
@@ -122,7 +122,6 @@ void CanvasTextureImageFactory::notifyLoadedImages()
         if (image->imageState() == CanvasTextureImage::LOADING_FINISHED) {
             m_loadingImagesList.removeOne(image);
             image->emitImageLoaded();
-
         } else if (image->imageState() == CanvasTextureImage::LOADING_ERROR) {
             m_loadingImagesList.removeOne(image);
             image->emitImageLoadingError();
@@ -137,12 +136,14 @@ void CanvasTextureImageFactory::notifyLoadedImages()
 QJSValue CanvasTextureImageFactory::newTexImage()
 {
     CanvasTextureImage *newImg = new CanvasTextureImage(this, m_qmlEngine);
-    connect(newImg, &CanvasTextureImage::imageLoadingStarted,
-            this, &CanvasTextureImageFactory::handleImageLoadingStarted);
-
     return m_qmlEngine->newQObject(newImg);
 }
 
+void CanvasTextureImageFactory::handleImageDestroyed(CanvasTextureImage *image)
+{
+    m_loadingImagesList.removeOne(image);
+}
+
 /*!
  * \qmltype TextureImage
  * \since QtCanvas3D 1.0
@@ -155,9 +156,10 @@ QJSValue CanvasTextureImageFactory::newTexImage()
  * \sa TextureImageFactory
  */
 CanvasTextureImage::CanvasTextureImage(CanvasTextureImageFactory *parent, QQmlEngine *engine) :
-    CanvasAbstractObject(0, parent),
+    CanvasAbstractObject(0, 0),
     m_engine(engine),
-    m_networkAccessManager(0),
+    m_networkAccessManager(m_engine->networkAccessManager()),
+    m_networkReply(0),
     m_state(INITIALIZED),
     m_errorString(""),
     m_pixelCache(0),
@@ -165,36 +167,44 @@ CanvasTextureImage::CanvasTextureImage(CanvasTextureImageFactory *parent, QQmlEn
     m_pixelCacheFlipY(false),
     m_parentFactory(parent)
 {
-    m_networkAccessManager = new QNetworkAccessManager(this);
-    QObject::connect(m_networkAccessManager, &QNetworkAccessManager::finished,
-                     this, &CanvasTextureImage::handleReply);
 }
 
 CanvasTextureImage::CanvasTextureImage(const QImage &source,
                                        int width, int height,
-                                       QObject *parent,
+                                       CanvasTextureImageFactory *parent,
                                        QQmlEngine *engine) :
-    CanvasAbstractObject(0, parent),
+    CanvasAbstractObject(0, 0),
     m_engine(engine),
-    m_networkAccessManager(0),
+    m_networkAccessManager(m_engine->networkAccessManager()),
+    m_networkReply(0),
     m_state(INITIALIZED),
     m_errorString(""),
     m_pixelCache(0),
     m_pixelCacheFormat(CanvasContext::NONE),
-    m_pixelCacheFlipY(false)
+    m_pixelCacheFlipY(false),
+    m_parentFactory(parent)
 {
-    m_networkAccessManager = new QNetworkAccessManager(this);
-    QObject::connect(m_networkAccessManager, &QNetworkAccessManager::finished,
-                     this, &CanvasTextureImage::handleReply);
-
     m_image = source.scaled(width, height);
     setImageState(LOADING_FINISHED);
 }
 
+void CanvasTextureImage::cleanupNetworkReply()
+{
+    if (m_networkReply) {
+        QObject::disconnect(m_networkReply, &QNetworkReply::finished,
+                            this, &CanvasTextureImage::handleReply);
+        m_networkReply->abort();
+        m_networkReply->deleteLater();
+        m_networkReply = 0;
+    }
+}
+
 CanvasTextureImage::~CanvasTextureImage()
 {
-    delete m_networkAccessManager;
-    delete m_pixelCache;
+    if (!m_parentFactory.isNull())
+        m_parentFactory->handleImageDestroyed(this);
+    cleanupNetworkReply();
+    delete[] m_pixelCache;
 }
 
 /*!
@@ -250,10 +260,14 @@ void CanvasTextureImage::load()
         return;
 
     setImageState(LOADING);
+    if (!m_parentFactory.isNull())
+        m_parentFactory->handleImageLoadingStarted(this);
     emit imageLoadingStarted(this);
 
     QNetworkRequest request(m_source);
-    m_networkAccessManager->get(request);
+    m_networkReply = m_networkAccessManager->get(request);
+    QObject::connect(m_networkReply, &QNetworkReply::finished,
+                     this, &CanvasTextureImage::handleReply);
 }
 
 /*!
@@ -265,18 +279,19 @@ QString CanvasTextureImage::errorString() const
     return m_errorString;
 }
 
-void CanvasTextureImage::handleReply(QNetworkReply *reply)
+void CanvasTextureImage::handleReply()
 {
-    if (reply->error() != QNetworkReply::NoError) {
-        m_errorString = reply->errorString();
-        emit errorStringChanged(m_errorString);
-        setImageState(LOADING_ERROR);
-        return;
+    if (m_networkReply) {
+        if (m_networkReply->error() != QNetworkReply::NoError) {
+            m_errorString = m_networkReply->errorString();
+            emit errorStringChanged(m_errorString);
+            setImageState(LOADING_ERROR);
+        } else {
+            m_image.loadFromData(m_networkReply->readAll());
+            setImageState(LOADING_FINISHED);
+        }
+        cleanupNetworkReply();
     }
-
-    m_image.loadFromData(reply->readAll());
-
-    setImageState(LOADING_FINISHED);
 }
 
 QImage &CanvasTextureImage::getImage()
@@ -347,7 +362,7 @@ uchar *CanvasTextureImage::convertToFormat(CanvasContext::glEnums format,
         return m_pixelCache;
 
     // Destroy the pixel cache
-    delete m_pixelCache;
+    delete[] m_pixelCache;
     m_pixelCache = 0;
     m_pixelCacheFormat = CanvasContext::NONE;
 
diff --git a/src/imports/qtcanvas3d/teximage3d_p.h b/src/imports/qtcanvas3d/teximage3d_p.h
index ecb175642b2159ed5b5cacca990b9a58776763d8..73f11863466e8453a1e558eb1b7291281b83411b 100644
--- a/src/imports/qtcanvas3d/teximage3d_p.h
+++ b/src/imports/qtcanvas3d/teximage3d_p.h
@@ -54,6 +54,7 @@
 #include "abstractobject3d_p.h"
 
 #include <QtCore/QUrl>
+#include <QtCore/QPointer>
 #include <QtGui/QImage>
 #include <QtNetwork/QNetworkAccessManager>
 #include <QtNetwork/QNetworkReply>
@@ -77,6 +78,8 @@ public:
     void notifyLoadedImages();
 
     Q_INVOKABLE QJSValue newTexImage();
+    void handleImageDestroyed(CanvasTextureImage *image);
+
 private:
     QQmlEngine *m_qmlEngine;
     QList<CanvasTextureImage *> m_loadingImagesList;
@@ -123,7 +126,7 @@ public:
     void emitImageLoadingError();
 
     void load();
-    void handleReply(QNetworkReply *reply);
+    void handleReply();
     QImage &getImage();
     uchar *convertToFormat(CanvasContext::glEnums format, bool flipY = false, bool premultipliedAlpha = false);
 
@@ -132,7 +135,7 @@ public:
 private:
     void setImageState(TextureImageState state);
     explicit CanvasTextureImage(const QImage &source, int width, int height,
-                                QObject *parent, QQmlEngine *engine);
+                                CanvasTextureImageFactory *parent, QQmlEngine *engine);
 
 signals:
     void srcChanged(QUrl source);
@@ -146,8 +149,11 @@ signals:
     void imageLoadingFailed(CanvasTextureImage *image);
 
 private:
+    void cleanupNetworkReply();
+
     QQmlEngine *m_engine;
-    QNetworkAccessManager *m_networkAccessManager;
+    QNetworkAccessManager *m_networkAccessManager; // not owned
+    QNetworkReply *m_networkReply;
     QImage m_image;
     QUrl m_source;
     TextureImageState m_state;
@@ -157,7 +163,7 @@ private:
     bool m_pixelCacheFlipY;
     QImage m_glImage;
     QVariant *m_anyValue;
-    CanvasTextureImageFactory *m_parentFactory;
+    QPointer<CanvasTextureImageFactory> m_parentFactory;
 };
 
 QT_CANVAS3D_END_NAMESPACE