diff --git a/src/imports/imports.pro b/src/imports/imports.pro
new file mode 100644
index 0000000000000000000000000000000000000000..5b3db11fb125d3c4cd74e4546065e822b3e85234
--- /dev/null
+++ b/src/imports/imports.pro
@@ -0,0 +1,5 @@
+TEMPLATE = subdirs
+
+qtHaveModule(quick):contains(QT_CONFIG, opengl) {
+    SUBDIRS += qtcanvas3d
+}
diff --git a/src/abstractobject3d.cpp b/src/imports/qtcanvas3d/abstractobject3d.cpp
similarity index 100%
rename from src/abstractobject3d.cpp
rename to src/imports/qtcanvas3d/abstractobject3d.cpp
diff --git a/src/abstractobject3d_p.h b/src/imports/qtcanvas3d/abstractobject3d_p.h
similarity index 100%
rename from src/abstractobject3d_p.h
rename to src/imports/qtcanvas3d/abstractobject3d_p.h
diff --git a/src/activeinfo3d.cpp b/src/imports/qtcanvas3d/activeinfo3d.cpp
similarity index 100%
rename from src/activeinfo3d.cpp
rename to src/imports/qtcanvas3d/activeinfo3d.cpp
diff --git a/src/activeinfo3d_p.h b/src/imports/qtcanvas3d/activeinfo3d_p.h
similarity index 100%
rename from src/activeinfo3d_p.h
rename to src/imports/qtcanvas3d/activeinfo3d_p.h
diff --git a/src/arrayutils.cpp b/src/imports/qtcanvas3d/arrayutils.cpp
similarity index 100%
rename from src/arrayutils.cpp
rename to src/imports/qtcanvas3d/arrayutils.cpp
diff --git a/src/arrayutils_p.h b/src/imports/qtcanvas3d/arrayutils_p.h
similarity index 100%
rename from src/arrayutils_p.h
rename to src/imports/qtcanvas3d/arrayutils_p.h
diff --git a/src/buffer3d.cpp b/src/imports/qtcanvas3d/buffer3d.cpp
similarity index 100%
rename from src/buffer3d.cpp
rename to src/imports/qtcanvas3d/buffer3d.cpp
diff --git a/src/buffer3d_p.h b/src/imports/qtcanvas3d/buffer3d_p.h
similarity index 100%
rename from src/buffer3d_p.h
rename to src/imports/qtcanvas3d/buffer3d_p.h
diff --git a/src/canvas3d.cpp b/src/imports/qtcanvas3d/canvas3d.cpp
similarity index 100%
rename from src/canvas3d.cpp
rename to src/imports/qtcanvas3d/canvas3d.cpp
diff --git a/src/canvas3d_p.h b/src/imports/qtcanvas3d/canvas3d_p.h
similarity index 100%
rename from src/canvas3d_p.h
rename to src/imports/qtcanvas3d/canvas3d_p.h
diff --git a/src/canvas3dcommon_p.h b/src/imports/qtcanvas3d/canvas3dcommon_p.h
similarity index 100%
rename from src/canvas3dcommon_p.h
rename to src/imports/qtcanvas3d/canvas3dcommon_p.h
diff --git a/src/canvasglstatedump.cpp b/src/imports/qtcanvas3d/canvasglstatedump.cpp
similarity index 100%
rename from src/canvasglstatedump.cpp
rename to src/imports/qtcanvas3d/canvasglstatedump.cpp
diff --git a/src/canvasglstatedump_p.h b/src/imports/qtcanvas3d/canvasglstatedump_p.h
similarity index 100%
rename from src/canvasglstatedump_p.h
rename to src/imports/qtcanvas3d/canvasglstatedump_p.h
diff --git a/src/canvasrendernode.cpp b/src/imports/qtcanvas3d/canvasrendernode.cpp
similarity index 100%
rename from src/canvasrendernode.cpp
rename to src/imports/qtcanvas3d/canvasrendernode.cpp
diff --git a/src/canvasrendernode_p.h b/src/imports/qtcanvas3d/canvasrendernode_p.h
similarity index 100%
rename from src/canvasrendernode_p.h
rename to src/imports/qtcanvas3d/canvasrendernode_p.h
diff --git a/src/context3d.cpp b/src/imports/qtcanvas3d/context3d.cpp
similarity index 100%
rename from src/context3d.cpp
rename to src/imports/qtcanvas3d/context3d.cpp
diff --git a/src/context3d_p.h b/src/imports/qtcanvas3d/context3d_p.h
similarity index 100%
rename from src/context3d_p.h
rename to src/imports/qtcanvas3d/context3d_p.h
diff --git a/src/contextattributes.cpp b/src/imports/qtcanvas3d/contextattributes.cpp
similarity index 100%
rename from src/contextattributes.cpp
rename to src/imports/qtcanvas3d/contextattributes.cpp
diff --git a/src/contextattributes_p.h b/src/imports/qtcanvas3d/contextattributes_p.h
similarity index 100%
rename from src/contextattributes_p.h
rename to src/imports/qtcanvas3d/contextattributes_p.h
diff --git a/src/designer/default/Canvas3D.qml b/src/imports/qtcanvas3d/designer/default/Canvas3D.qml
similarity index 100%
rename from src/designer/default/Canvas3D.qml
rename to src/imports/qtcanvas3d/designer/default/Canvas3D.qml
diff --git a/src/designer/designer.pri b/src/imports/qtcanvas3d/designer/designer.pri
similarity index 100%
rename from src/designer/designer.pri
rename to src/imports/qtcanvas3d/designer/designer.pri
diff --git a/src/designer/images/canvas3d-icon.png b/src/imports/qtcanvas3d/designer/images/canvas3d-icon.png
similarity index 100%
rename from src/designer/images/canvas3d-icon.png
rename to src/imports/qtcanvas3d/designer/images/canvas3d-icon.png
diff --git a/src/designer/images/canvas3d-icon16.png b/src/imports/qtcanvas3d/designer/images/canvas3d-icon16.png
similarity index 100%
rename from src/designer/images/canvas3d-icon16.png
rename to src/imports/qtcanvas3d/designer/images/canvas3d-icon16.png
diff --git a/src/designer/qtcanvas3d.metainfo b/src/imports/qtcanvas3d/designer/qtcanvas3d.metainfo
similarity index 100%
rename from src/designer/qtcanvas3d.metainfo
rename to src/imports/qtcanvas3d/designer/qtcanvas3d.metainfo
diff --git a/src/doc/qtcanvas3d.qdocconf b/src/imports/qtcanvas3d/doc/qtcanvas3d.qdocconf
similarity index 100%
rename from src/doc/qtcanvas3d.qdocconf
rename to src/imports/qtcanvas3d/doc/qtcanvas3d.qdocconf
diff --git a/src/doc/snippets/doc_src_qtcanvas3d.cpp b/src/imports/qtcanvas3d/doc/snippets/doc_src_qtcanvas3d.cpp
similarity index 100%
rename from src/doc/snippets/doc_src_qtcanvas3d.cpp
rename to src/imports/qtcanvas3d/doc/snippets/doc_src_qtcanvas3d.cpp
diff --git a/src/doc/snippets/doc_src_qtcanvas3d.pro b/src/imports/qtcanvas3d/doc/snippets/doc_src_qtcanvas3d.pro
similarity index 100%
rename from src/doc/snippets/doc_src_qtcanvas3d.pro
rename to src/imports/qtcanvas3d/doc/snippets/doc_src_qtcanvas3d.pro
diff --git a/src/doc/src/qtcanvas3d-index.qdoc b/src/imports/qtcanvas3d/doc/src/qtcanvas3d-index.qdoc
similarity index 100%
rename from src/doc/src/qtcanvas3d-index.qdoc
rename to src/imports/qtcanvas3d/doc/src/qtcanvas3d-index.qdoc
diff --git a/src/doc/src/qtcanvas3d.qdoc b/src/imports/qtcanvas3d/doc/src/qtcanvas3d.qdoc
similarity index 100%
rename from src/doc/src/qtcanvas3d.qdoc
rename to src/imports/qtcanvas3d/doc/src/qtcanvas3d.qdoc
diff --git a/src/enumtostringmap.cpp b/src/imports/qtcanvas3d/enumtostringmap.cpp
similarity index 100%
rename from src/enumtostringmap.cpp
rename to src/imports/qtcanvas3d/enumtostringmap.cpp
diff --git a/src/enumtostringmap_p.h b/src/imports/qtcanvas3d/enumtostringmap_p.h
similarity index 100%
rename from src/enumtostringmap_p.h
rename to src/imports/qtcanvas3d/enumtostringmap_p.h
diff --git a/src/framebuffer3d.cpp b/src/imports/qtcanvas3d/framebuffer3d.cpp
similarity index 100%
rename from src/framebuffer3d.cpp
rename to src/imports/qtcanvas3d/framebuffer3d.cpp
diff --git a/src/framebuffer3d_p.h b/src/imports/qtcanvas3d/framebuffer3d_p.h
similarity index 100%
rename from src/framebuffer3d_p.h
rename to src/imports/qtcanvas3d/framebuffer3d_p.h
diff --git a/src/plugins.qmltypes b/src/imports/qtcanvas3d/plugins.qmltypes
similarity index 100%
rename from src/plugins.qmltypes
rename to src/imports/qtcanvas3d/plugins.qmltypes
diff --git a/src/program3d.cpp b/src/imports/qtcanvas3d/program3d.cpp
similarity index 100%
rename from src/program3d.cpp
rename to src/imports/qtcanvas3d/program3d.cpp
diff --git a/src/program3d_p.h b/src/imports/qtcanvas3d/program3d_p.h
similarity index 100%
rename from src/program3d_p.h
rename to src/imports/qtcanvas3d/program3d_p.h
diff --git a/src/qcanvas3d_plugin.cpp b/src/imports/qtcanvas3d/qcanvas3d_plugin.cpp
similarity index 100%
rename from src/qcanvas3d_plugin.cpp
rename to src/imports/qtcanvas3d/qcanvas3d_plugin.cpp
diff --git a/src/qcanvas3d_plugin.h b/src/imports/qtcanvas3d/qcanvas3d_plugin.h
similarity index 100%
rename from src/qcanvas3d_plugin.h
rename to src/imports/qtcanvas3d/qcanvas3d_plugin.h
diff --git a/src/qmldir b/src/imports/qtcanvas3d/qmldir
similarity index 100%
rename from src/qmldir
rename to src/imports/qtcanvas3d/qmldir
diff --git a/src/imports/qtcanvas3d/qtcanvas3d.pro b/src/imports/qtcanvas3d/qtcanvas3d.pro
new file mode 100644
index 0000000000000000000000000000000000000000..1a1bee5ed2db988f2963d93ae1b0fd3067092925
--- /dev/null
+++ b/src/imports/qtcanvas3d/qtcanvas3d.pro
@@ -0,0 +1,60 @@
+QT += qml quick qml-private core-private
+DEFINES += QTCANVAS3D_LIBRARY
+TARGETPATH = QtCanvas3D
+IMPORT_VERSION = $$MODULE_VERSION
+
+include($$PWD/designer/designer.pri)
+
+QMAKE_DOCS = $$PWD/doc/qtcanvas3d.qdocconf
+
+SOURCES += arrayutils.cpp \
+    qcanvas3d_plugin.cpp \
+    enumtostringmap.cpp \
+    abstractobject3d.cpp \
+    canvas3d.cpp \
+    buffer3d.cpp \
+    canvasrendernode.cpp \
+    context3d.cpp \
+    contextattributes.cpp \
+    framebuffer3d.cpp \
+    program3d.cpp \
+    renderbuffer3d.cpp \
+    shader3d.cpp \
+    shaderprecisionformat.cpp \
+    teximage3d.cpp \
+    texture3d.cpp \
+    uniformlocation.cpp \
+    activeinfo3d.cpp \
+    canvasglstatedump.cpp
+
+HEADERS += arrayutils_p.h \
+    qcanvas3d_plugin.h \
+    enumtostringmap_p.h \
+    abstractobject3d_p.h \
+    canvas3d_p.h \
+    buffer3d_p.h \
+    canvas3dcommon_p.h \
+    canvasrendernode_p.h \
+    context3d_p.h \
+    contextattributes_p.h \
+    framebuffer3d_p.h \
+    program3d_p.h \
+    renderbuffer3d_p.h \
+    shader3d_p.h \
+    shaderprecisionformat_p.h \
+    teximage3d_p.h \
+    texture3d_p.h \
+    uniformlocation_p.h \
+    activeinfo3d_p.h \
+    canvasglstatedump_p.h
+
+OTHER_FILES = qmldir \
+    doc/* \
+    doc/src/* \
+    doc/images/* \
+    doc/snippets/* \
+    designer/default/*
+
+CONFIG += no_cxx_module
+
+load(qml_plugin)
diff --git a/src/renderbuffer3d.cpp b/src/imports/qtcanvas3d/renderbuffer3d.cpp
similarity index 100%
rename from src/renderbuffer3d.cpp
rename to src/imports/qtcanvas3d/renderbuffer3d.cpp
diff --git a/src/renderbuffer3d_p.h b/src/imports/qtcanvas3d/renderbuffer3d_p.h
similarity index 100%
rename from src/renderbuffer3d_p.h
rename to src/imports/qtcanvas3d/renderbuffer3d_p.h
diff --git a/src/shader3d.cpp b/src/imports/qtcanvas3d/shader3d.cpp
similarity index 100%
rename from src/shader3d.cpp
rename to src/imports/qtcanvas3d/shader3d.cpp
diff --git a/src/shader3d_p.h b/src/imports/qtcanvas3d/shader3d_p.h
similarity index 100%
rename from src/shader3d_p.h
rename to src/imports/qtcanvas3d/shader3d_p.h
diff --git a/src/shaderprecisionformat.cpp b/src/imports/qtcanvas3d/shaderprecisionformat.cpp
similarity index 100%
rename from src/shaderprecisionformat.cpp
rename to src/imports/qtcanvas3d/shaderprecisionformat.cpp
diff --git a/src/shaderprecisionformat_p.h b/src/imports/qtcanvas3d/shaderprecisionformat_p.h
similarity index 100%
rename from src/shaderprecisionformat_p.h
rename to src/imports/qtcanvas3d/shaderprecisionformat_p.h
diff --git a/src/teximage3d.cpp b/src/imports/qtcanvas3d/teximage3d.cpp
similarity index 100%
rename from src/teximage3d.cpp
rename to src/imports/qtcanvas3d/teximage3d.cpp
diff --git a/src/teximage3d_p.h b/src/imports/qtcanvas3d/teximage3d_p.h
similarity index 100%
rename from src/teximage3d_p.h
rename to src/imports/qtcanvas3d/teximage3d_p.h
diff --git a/src/texture3d.cpp b/src/imports/qtcanvas3d/texture3d.cpp
similarity index 100%
rename from src/texture3d.cpp
rename to src/imports/qtcanvas3d/texture3d.cpp
diff --git a/src/texture3d_p.h b/src/imports/qtcanvas3d/texture3d_p.h
similarity index 100%
rename from src/texture3d_p.h
rename to src/imports/qtcanvas3d/texture3d_p.h
diff --git a/src/uniformlocation.cpp b/src/imports/qtcanvas3d/uniformlocation.cpp
similarity index 100%
rename from src/uniformlocation.cpp
rename to src/imports/qtcanvas3d/uniformlocation.cpp
diff --git a/src/uniformlocation_p.h b/src/imports/qtcanvas3d/uniformlocation_p.h
similarity index 100%
rename from src/uniformlocation_p.h
rename to src/imports/qtcanvas3d/uniformlocation_p.h
diff --git a/src/src.pro b/src/src.pro
index a809324ccca8914d0548bd7130903a8d6e965f5f..f13683be19ee49901c873fe3c6851324274a919a 100644
--- a/src/src.pro
+++ b/src/src.pro
@@ -1,77 +1,4 @@
-load(qt_parts)
+TEMPLATE = subdirs
+CONFIG += ordered
 
-TEMPLATE = lib
-TARGET = qtcanvas3d
-QT += qml quick qml-private core-private
-DEFINES += QTCANVAS3D_LIBRARY
-TARGETPATH = QtCanvas3D
-IMPORT_VERSION = $$MODULE_VERSION
-
-# Only build qml plugin static if Qt itself is also built static
-!contains(QT_CONFIG, static): CONFIG -= static staticlib
-
-include($$PWD/designer/designer.pri)
-
-QMAKE_DOCS = $$PWD/doc/qtcanvas3d.qdocconf
-
-SOURCES += arrayutils.cpp \
-    qcanvas3d_plugin.cpp \
-    enumtostringmap.cpp \
-    abstractobject3d.cpp \
-    canvas3d.cpp \
-    buffer3d.cpp \
-    canvasrendernode.cpp \
-    context3d.cpp \
-    contextattributes.cpp \
-    framebuffer3d.cpp \
-    program3d.cpp \
-    renderbuffer3d.cpp \
-    shader3d.cpp \
-    shaderprecisionformat.cpp \
-    teximage3d.cpp \
-    texture3d.cpp \
-    uniformlocation.cpp \
-    activeinfo3d.cpp \
-    canvasglstatedump.cpp
-
-HEADERS += arrayutils_p.h \
-    qcanvas3d_plugin.h \
-    enumtostringmap_p.h \
-    abstractobject3d_p.h \
-    canvas3d_p.h \
-    buffer3d_p.h \
-    canvas3dcommon_p.h \
-    canvasrendernode_p.h \
-    context3d_p.h \
-    contextattributes_p.h \
-    framebuffer3d_p.h \
-    program3d_p.h \
-    renderbuffer3d_p.h \
-    shader3d_p.h \
-    shaderprecisionformat_p.h \
-    teximage3d_p.h \
-    texture3d_p.h \
-    uniformlocation_p.h \
-    activeinfo3d_p.h \
-    canvasglstatedump_p.h
-
-OTHER_FILES = qmldir \
-    doc/* \
-    doc/src/* \
-    doc/images/* \
-    doc/snippets/* \
-    plugins.qmltypes \
-    designer/* \
-    designer/default/*
-
-CONFIG += no_cxx_module
-
-load(qml_plugin)
-
-!android:!ios {
-    copy_qmldir.target = $$DESTDIR/qmldir
-    copy_qmldir.depends = $$_PRO_FILE_PWD_/qmldir
-    copy_qmldir.commands = $(COPY_FILE) \"$$replace(copy_qmldir.depends, /, $$QMAKE_DIR_SEP)\" \"$$replace(copy_qmldir.target, /, $$QMAKE_DIR_SEP)\"
-    QMAKE_EXTRA_TARGETS += copy_qmldir
-    PRE_TARGETDEPS += $$copy_qmldir.target
-}
+SUBDIRS += imports