diff --git a/Documents - Shortcut.lnk b/Documents - Shortcut.lnk
new file mode 100644
index 0000000000000000000000000000000000000000..ec09342eca0960aff69e4c9a2321c14758cefd9a
Binary files /dev/null and b/Documents - Shortcut.lnk differ
diff --git a/deployment_test/D3Dcompiler_47.dll b/deployment_test/D3Dcompiler_47.dll
new file mode 100644
index 0000000000000000000000000000000000000000..56512f565030db171e0aae7b9952a35907a187ab
Binary files /dev/null and b/deployment_test/D3Dcompiler_47.dll differ
diff --git a/deployment_test/POETSvisualizer.exe b/deployment_test/POETSvisualizer.exe
new file mode 100644
index 0000000000000000000000000000000000000000..5f31f2cf11b6d5a4c0711f75c263f566564dc416
Binary files /dev/null and b/deployment_test/POETSvisualizer.exe differ
diff --git a/deployment_test/Qt/labs/qmlmodels/labsmodelsplugin.dll b/deployment_test/Qt/labs/qmlmodels/labsmodelsplugin.dll
new file mode 100644
index 0000000000000000000000000000000000000000..f85722ce27d8f3651da7814fe81714f6d598f2ea
Binary files /dev/null and b/deployment_test/Qt/labs/qmlmodels/labsmodelsplugin.dll differ
diff --git a/deployment_test/Qt/labs/qmlmodels/plugins.qmltypes b/deployment_test/Qt/labs/qmlmodels/plugins.qmltypes
new file mode 100644
index 0000000000000000000000000000000000000000..56f2f213ddfda043fb4bbabb5bf27fb8337c9a85
--- /dev/null
+++ b/deployment_test/Qt/labs/qmlmodels/plugins.qmltypes
@@ -0,0 +1,410 @@
+import QtQuick.tooling 1.2
+
+// This file describes the plugin-supplied types contained in the library.
+// It is used for QML tooling purposes only.
+//
+// This file was auto-generated by qmltyperegistrar.
+
+Module {
+    dependencies: []
+    Component {
+        name: "QAbstractItemModel"
+        prototype: "QObject"
+        Enum {
+            name: "LayoutChangeHint"
+            values: [
+                "NoLayoutChangeHint",
+                "VerticalSortHint",
+                "HorizontalSortHint"
+            ]
+        }
+        Enum {
+            name: "CheckIndexOption"
+            values: [
+                "NoOption",
+                "IndexIsValid",
+                "DoNotUseParent",
+                "ParentIsInvalid"
+            ]
+        }
+        Signal {
+            name: "dataChanged"
+            Parameter { name: "topLeft"; type: "QModelIndex" }
+            Parameter { name: "bottomRight"; type: "QModelIndex" }
+            Parameter { name: "roles"; type: "QVector<int>" }
+        }
+        Signal {
+            name: "dataChanged"
+            Parameter { name: "topLeft"; type: "QModelIndex" }
+            Parameter { name: "bottomRight"; type: "QModelIndex" }
+        }
+        Signal {
+            name: "headerDataChanged"
+            Parameter { name: "orientation"; type: "Qt::Orientation" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "layoutChanged"
+            Parameter { name: "parents"; type: "QList<QPersistentModelIndex>" }
+            Parameter { name: "hint"; type: "QAbstractItemModel::LayoutChangeHint" }
+        }
+        Signal {
+            name: "layoutChanged"
+            Parameter { name: "parents"; type: "QList<QPersistentModelIndex>" }
+        }
+        Signal { name: "layoutChanged" }
+        Signal {
+            name: "layoutAboutToBeChanged"
+            Parameter { name: "parents"; type: "QList<QPersistentModelIndex>" }
+            Parameter { name: "hint"; type: "QAbstractItemModel::LayoutChangeHint" }
+        }
+        Signal {
+            name: "layoutAboutToBeChanged"
+            Parameter { name: "parents"; type: "QList<QPersistentModelIndex>" }
+        }
+        Signal { name: "layoutAboutToBeChanged" }
+        Signal {
+            name: "rowsAboutToBeInserted"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "rowsInserted"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "rowsAboutToBeRemoved"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "rowsRemoved"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "columnsAboutToBeInserted"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "columnsInserted"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "columnsAboutToBeRemoved"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "columnsRemoved"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal { name: "modelAboutToBeReset" }
+        Signal { name: "modelReset" }
+        Signal {
+            name: "rowsAboutToBeMoved"
+            Parameter { name: "sourceParent"; type: "QModelIndex" }
+            Parameter { name: "sourceStart"; type: "int" }
+            Parameter { name: "sourceEnd"; type: "int" }
+            Parameter { name: "destinationParent"; type: "QModelIndex" }
+            Parameter { name: "destinationRow"; type: "int" }
+        }
+        Signal {
+            name: "rowsMoved"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "start"; type: "int" }
+            Parameter { name: "end"; type: "int" }
+            Parameter { name: "destination"; type: "QModelIndex" }
+            Parameter { name: "row"; type: "int" }
+        }
+        Signal {
+            name: "columnsAboutToBeMoved"
+            Parameter { name: "sourceParent"; type: "QModelIndex" }
+            Parameter { name: "sourceStart"; type: "int" }
+            Parameter { name: "sourceEnd"; type: "int" }
+            Parameter { name: "destinationParent"; type: "QModelIndex" }
+            Parameter { name: "destinationColumn"; type: "int" }
+        }
+        Signal {
+            name: "columnsMoved"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "start"; type: "int" }
+            Parameter { name: "end"; type: "int" }
+            Parameter { name: "destination"; type: "QModelIndex" }
+            Parameter { name: "column"; type: "int" }
+        }
+        Method { name: "submit"; type: "bool" }
+        Method { name: "revert" }
+        Method { name: "resetInternalData" }
+        Method {
+            name: "hasIndex"
+            type: "bool"
+            Parameter { name: "row"; type: "int" }
+            Parameter { name: "column"; type: "int" }
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method {
+            name: "hasIndex"
+            type: "bool"
+            Parameter { name: "row"; type: "int" }
+            Parameter { name: "column"; type: "int" }
+        }
+        Method {
+            name: "index"
+            type: "QModelIndex"
+            Parameter { name: "row"; type: "int" }
+            Parameter { name: "column"; type: "int" }
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method {
+            name: "index"
+            type: "QModelIndex"
+            Parameter { name: "row"; type: "int" }
+            Parameter { name: "column"; type: "int" }
+        }
+        Method {
+            name: "parent"
+            type: "QModelIndex"
+            Parameter { name: "child"; type: "QModelIndex" }
+        }
+        Method {
+            name: "sibling"
+            type: "QModelIndex"
+            Parameter { name: "row"; type: "int" }
+            Parameter { name: "column"; type: "int" }
+            Parameter { name: "idx"; type: "QModelIndex" }
+        }
+        Method {
+            name: "rowCount"
+            type: "int"
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method { name: "rowCount"; type: "int" }
+        Method {
+            name: "columnCount"
+            type: "int"
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method { name: "columnCount"; type: "int" }
+        Method {
+            name: "hasChildren"
+            type: "bool"
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method { name: "hasChildren"; type: "bool" }
+        Method {
+            name: "data"
+            type: "QVariant"
+            Parameter { name: "index"; type: "QModelIndex" }
+            Parameter { name: "role"; type: "int" }
+        }
+        Method {
+            name: "data"
+            type: "QVariant"
+            Parameter { name: "index"; type: "QModelIndex" }
+        }
+        Method {
+            name: "setData"
+            type: "bool"
+            Parameter { name: "index"; type: "QModelIndex" }
+            Parameter { name: "value"; type: "QVariant" }
+            Parameter { name: "role"; type: "int" }
+        }
+        Method {
+            name: "setData"
+            type: "bool"
+            Parameter { name: "index"; type: "QModelIndex" }
+            Parameter { name: "value"; type: "QVariant" }
+        }
+        Method {
+            name: "headerData"
+            type: "QVariant"
+            Parameter { name: "section"; type: "int" }
+            Parameter { name: "orientation"; type: "Qt::Orientation" }
+            Parameter { name: "role"; type: "int" }
+        }
+        Method {
+            name: "headerData"
+            type: "QVariant"
+            Parameter { name: "section"; type: "int" }
+            Parameter { name: "orientation"; type: "Qt::Orientation" }
+        }
+        Method {
+            name: "fetchMore"
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method {
+            name: "canFetchMore"
+            type: "bool"
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method {
+            name: "flags"
+            type: "Qt::ItemFlags"
+            Parameter { name: "index"; type: "QModelIndex" }
+        }
+        Method {
+            name: "match"
+            type: "QModelIndexList"
+            Parameter { name: "start"; type: "QModelIndex" }
+            Parameter { name: "role"; type: "int" }
+            Parameter { name: "value"; type: "QVariant" }
+            Parameter { name: "hits"; type: "int" }
+            Parameter { name: "flags"; type: "Qt::MatchFlags" }
+        }
+        Method {
+            name: "match"
+            type: "QModelIndexList"
+            Parameter { name: "start"; type: "QModelIndex" }
+            Parameter { name: "role"; type: "int" }
+            Parameter { name: "value"; type: "QVariant" }
+            Parameter { name: "hits"; type: "int" }
+        }
+        Method {
+            name: "match"
+            type: "QModelIndexList"
+            Parameter { name: "start"; type: "QModelIndex" }
+            Parameter { name: "role"; type: "int" }
+            Parameter { name: "value"; type: "QVariant" }
+        }
+    }
+    Component { name: "QAbstractTableModel"; prototype: "QAbstractItemModel" }
+    Component {
+        file: "qqmldelegatecomponent_p.h"
+        name: "QQmlDelegateChoice"
+        defaultProperty: "delegate"
+        prototype: "QObject"
+        exports: ["Qt.labs.qmlmodels/DelegateChoice 1.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "roleValue"; type: "QVariant" }
+        Property { name: "row"; type: "int" }
+        Property { name: "index"; type: "int" }
+        Property { name: "column"; type: "int" }
+        Property { name: "delegate"; type: "QQmlComponent"; isPointer: true }
+        Signal { name: "changed" }
+    }
+    Component {
+        file: "qqmldelegatecomponent_p.h"
+        name: "QQmlDelegateChooser"
+        defaultProperty: "choices"
+        prototype: "QQmlAbstractDelegateComponent"
+        exports: ["Qt.labs.qmlmodels/DelegateChooser 1.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "role"; type: "string" }
+        Property { name: "choices"; type: "QQmlDelegateChoice"; isList: true; isReadonly: true }
+    }
+    Component {
+        file: "qqmltablemodel_p.h"
+        name: "QQmlTableModel"
+        defaultProperty: "columns"
+        prototype: "QAbstractTableModel"
+        exports: ["Qt.labs.qmlmodels/TableModel 1.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "columnCount"; type: "int"; isReadonly: true }
+        Property { name: "rowCount"; type: "int"; isReadonly: true }
+        Property { name: "rows"; type: "QVariant" }
+        Property { name: "columns"; type: "QQmlTableModelColumn"; isList: true; isReadonly: true }
+        Method {
+            name: "appendRow"
+            Parameter { name: "row"; type: "QVariant" }
+        }
+        Method { name: "clear" }
+        Method {
+            name: "getRow"
+            type: "QVariant"
+            Parameter { name: "rowIndex"; type: "int" }
+        }
+        Method {
+            name: "insertRow"
+            Parameter { name: "rowIndex"; type: "int" }
+            Parameter { name: "row"; type: "QVariant" }
+        }
+        Method {
+            name: "moveRow"
+            Parameter { name: "fromRowIndex"; type: "int" }
+            Parameter { name: "toRowIndex"; type: "int" }
+            Parameter { name: "rows"; type: "int" }
+        }
+        Method {
+            name: "moveRow"
+            Parameter { name: "fromRowIndex"; type: "int" }
+            Parameter { name: "toRowIndex"; type: "int" }
+        }
+        Method {
+            name: "removeRow"
+            Parameter { name: "rowIndex"; type: "int" }
+            Parameter { name: "rows"; type: "int" }
+        }
+        Method {
+            name: "removeRow"
+            Parameter { name: "rowIndex"; type: "int" }
+        }
+        Method {
+            name: "setRow"
+            Parameter { name: "rowIndex"; type: "int" }
+            Parameter { name: "row"; type: "QVariant" }
+        }
+        Method {
+            name: "data"
+            type: "QVariant"
+            Parameter { name: "index"; type: "QModelIndex" }
+            Parameter { name: "role"; type: "string" }
+        }
+        Method {
+            name: "setData"
+            type: "bool"
+            Parameter { name: "index"; type: "QModelIndex" }
+            Parameter { name: "role"; type: "string" }
+            Parameter { name: "value"; type: "QVariant" }
+        }
+    }
+    Component {
+        file: "qqmltablemodelcolumn_p.h"
+        name: "QQmlTableModelColumn"
+        prototype: "QObject"
+        exports: ["Qt.labs.qmlmodels/TableModelColumn 1.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "display"; type: "QJSValue" }
+        Property { name: "setDisplay"; type: "QJSValue" }
+        Property { name: "decoration"; type: "QJSValue" }
+        Property { name: "setDecoration"; type: "QJSValue" }
+        Property { name: "edit"; type: "QJSValue" }
+        Property { name: "setEdit"; type: "QJSValue" }
+        Property { name: "toolTip"; type: "QJSValue" }
+        Property { name: "setToolTip"; type: "QJSValue" }
+        Property { name: "statusTip"; type: "QJSValue" }
+        Property { name: "setStatusTip"; type: "QJSValue" }
+        Property { name: "whatsThis"; type: "QJSValue" }
+        Property { name: "setWhatsThis"; type: "QJSValue" }
+        Property { name: "font"; type: "QJSValue" }
+        Property { name: "setFont"; type: "QJSValue" }
+        Property { name: "textAlignment"; type: "QJSValue" }
+        Property { name: "setTextAlignment"; type: "QJSValue" }
+        Property { name: "background"; type: "QJSValue" }
+        Property { name: "setBackground"; type: "QJSValue" }
+        Property { name: "foreground"; type: "QJSValue" }
+        Property { name: "setForeground"; type: "QJSValue" }
+        Property { name: "checkState"; type: "QJSValue" }
+        Property { name: "setCheckState"; type: "QJSValue" }
+        Property { name: "accessibleText"; type: "QJSValue" }
+        Property { name: "setAccessibleText"; type: "QJSValue" }
+        Property { name: "accessibleDescription"; type: "QJSValue" }
+        Property { name: "setAccessibleDescription"; type: "QJSValue" }
+        Property { name: "sizeHint"; type: "QJSValue" }
+        Property { name: "setSizeHint"; type: "QJSValue" }
+        Signal { name: "indexChanged" }
+    }
+}
diff --git a/deployment_test/Qt/labs/qmlmodels/qmldir b/deployment_test/Qt/labs/qmlmodels/qmldir
new file mode 100644
index 0000000000000000000000000000000000000000..9c735711c40041a9816e21866695ac233b47de1c
--- /dev/null
+++ b/deployment_test/Qt/labs/qmlmodels/qmldir
@@ -0,0 +1,3 @@
+module Qt.labs.qmlmodels
+plugin labsmodelsplugin
+classname QtQmlLabsModelsPlugin
diff --git a/deployment_test/Qt5Charts.dll b/deployment_test/Qt5Charts.dll
new file mode 100644
index 0000000000000000000000000000000000000000..947d1a542c9c0d4b7256c81c68d74d61b27639a8
Binary files /dev/null and b/deployment_test/Qt5Charts.dll differ
diff --git a/deployment_test/Qt5Core.dll b/deployment_test/Qt5Core.dll
new file mode 100644
index 0000000000000000000000000000000000000000..83e471733d2f8dce2050891e06cd0219e29c2512
Binary files /dev/null and b/deployment_test/Qt5Core.dll differ
diff --git a/deployment_test/Qt5DataVisualization.dll b/deployment_test/Qt5DataVisualization.dll
new file mode 100644
index 0000000000000000000000000000000000000000..e940c02f8fbb9308bf8d59733add45ab96c07c8b
Binary files /dev/null and b/deployment_test/Qt5DataVisualization.dll differ
diff --git a/deployment_test/Qt5Gui.dll b/deployment_test/Qt5Gui.dll
new file mode 100644
index 0000000000000000000000000000000000000000..024bb6f1877e63f81d2f306819a0fd7b559681e3
Binary files /dev/null and b/deployment_test/Qt5Gui.dll differ
diff --git a/deployment_test/Qt5Network.dll b/deployment_test/Qt5Network.dll
new file mode 100644
index 0000000000000000000000000000000000000000..7fefb05630c28947005fd567af30f37553fce4e7
Binary files /dev/null and b/deployment_test/Qt5Network.dll differ
diff --git a/deployment_test/Qt5Qml.dll b/deployment_test/Qt5Qml.dll
new file mode 100644
index 0000000000000000000000000000000000000000..a6d27ae3dd7266dfb67cd6cd1617609eb080723d
Binary files /dev/null and b/deployment_test/Qt5Qml.dll differ
diff --git a/deployment_test/Qt5QmlModels.dll b/deployment_test/Qt5QmlModels.dll
new file mode 100644
index 0000000000000000000000000000000000000000..4b0b835087a045e6ea371dd7e49af113d17e3b6e
Binary files /dev/null and b/deployment_test/Qt5QmlModels.dll differ
diff --git a/deployment_test/Qt5QmlWorkerScript.dll b/deployment_test/Qt5QmlWorkerScript.dll
new file mode 100644
index 0000000000000000000000000000000000000000..bd445ebf75d786113f69df25763590be8bba7b3e
Binary files /dev/null and b/deployment_test/Qt5QmlWorkerScript.dll differ
diff --git a/deployment_test/Qt5Quick.dll b/deployment_test/Qt5Quick.dll
new file mode 100644
index 0000000000000000000000000000000000000000..b69b38a98dc4df20737ff1a580b5939d2022606f
Binary files /dev/null and b/deployment_test/Qt5Quick.dll differ
diff --git a/deployment_test/Qt5QuickControls2.dll b/deployment_test/Qt5QuickControls2.dll
new file mode 100644
index 0000000000000000000000000000000000000000..ae926778206e435319473580bce9945843b27f6e
Binary files /dev/null and b/deployment_test/Qt5QuickControls2.dll differ
diff --git a/deployment_test/Qt5QuickTemplates2.dll b/deployment_test/Qt5QuickTemplates2.dll
new file mode 100644
index 0000000000000000000000000000000000000000..1e27d7baf955fd02e19ce1c82a952464581eb197
Binary files /dev/null and b/deployment_test/Qt5QuickTemplates2.dll differ
diff --git a/deployment_test/Qt5RemoteObjects.dll b/deployment_test/Qt5RemoteObjects.dll
new file mode 100644
index 0000000000000000000000000000000000000000..f24d470b2979bee238ca490ee8084ca3cd348482
Binary files /dev/null and b/deployment_test/Qt5RemoteObjects.dll differ
diff --git a/deployment_test/Qt5Svg.dll b/deployment_test/Qt5Svg.dll
new file mode 100644
index 0000000000000000000000000000000000000000..c7fafcd5ffc53373cc0567d467454a2212354de7
Binary files /dev/null and b/deployment_test/Qt5Svg.dll differ
diff --git a/deployment_test/Qt5Widgets.dll b/deployment_test/Qt5Widgets.dll
new file mode 100644
index 0000000000000000000000000000000000000000..0f7cbc351abab89df722c66ba6196800e7ebffb3
Binary files /dev/null and b/deployment_test/Qt5Widgets.dll differ
diff --git a/deployment_test/QtCharts/plugins.qmltypes b/deployment_test/QtCharts/plugins.qmltypes
new file mode 100644
index 0000000000000000000000000000000000000000..ba6015f0d3a5818b57b661a9e9c228160daba905
--- /dev/null
+++ b/deployment_test/QtCharts/plugins.qmltypes
@@ -0,0 +1,3134 @@
+import QtQuick.tooling 1.2
+
+// This file describes the plugin-supplied types contained in the library.
+// It is used for QML tooling purposes only.
+//
+// This file was auto-generated by:
+// 'qmlplugindump -nonrelocatable -qapp QtCharts 2.14'
+
+Module {
+    dependencies: ["QtQuick 2.0"]
+    Component {
+        name: "QAbstractItemModel"
+        prototype: "QObject"
+        exports: [
+            "QtCharts/AbstractItemModel 1.0",
+            "QtCharts/AbstractItemModel 2.0"
+        ]
+        isCreatable: false
+        exportMetaObjectRevisions: [0, 0]
+        Enum {
+            name: "LayoutChangeHint"
+            values: {
+                "NoLayoutChangeHint": 0,
+                "VerticalSortHint": 1,
+                "HorizontalSortHint": 2
+            }
+        }
+        Enum {
+            name: "CheckIndexOption"
+            values: {
+                "NoOption": 0,
+                "IndexIsValid": 1,
+                "DoNotUseParent": 2,
+                "ParentIsInvalid": 4
+            }
+        }
+        Signal {
+            name: "dataChanged"
+            Parameter { name: "topLeft"; type: "QModelIndex" }
+            Parameter { name: "bottomRight"; type: "QModelIndex" }
+            Parameter { name: "roles"; type: "QVector<int>" }
+        }
+        Signal {
+            name: "dataChanged"
+            Parameter { name: "topLeft"; type: "QModelIndex" }
+            Parameter { name: "bottomRight"; type: "QModelIndex" }
+        }
+        Signal {
+            name: "headerDataChanged"
+            Parameter { name: "orientation"; type: "Qt::Orientation" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "layoutChanged"
+            Parameter { name: "parents"; type: "QList<QPersistentModelIndex>" }
+            Parameter { name: "hint"; type: "QAbstractItemModel::LayoutChangeHint" }
+        }
+        Signal {
+            name: "layoutChanged"
+            Parameter { name: "parents"; type: "QList<QPersistentModelIndex>" }
+        }
+        Signal { name: "layoutChanged" }
+        Signal {
+            name: "layoutAboutToBeChanged"
+            Parameter { name: "parents"; type: "QList<QPersistentModelIndex>" }
+            Parameter { name: "hint"; type: "QAbstractItemModel::LayoutChangeHint" }
+        }
+        Signal {
+            name: "layoutAboutToBeChanged"
+            Parameter { name: "parents"; type: "QList<QPersistentModelIndex>" }
+        }
+        Signal { name: "layoutAboutToBeChanged" }
+        Signal {
+            name: "rowsAboutToBeInserted"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "rowsInserted"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "rowsAboutToBeRemoved"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "rowsRemoved"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "columnsAboutToBeInserted"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "columnsInserted"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "columnsAboutToBeRemoved"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "columnsRemoved"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal { name: "modelAboutToBeReset" }
+        Signal { name: "modelReset" }
+        Signal {
+            name: "rowsAboutToBeMoved"
+            Parameter { name: "sourceParent"; type: "QModelIndex" }
+            Parameter { name: "sourceStart"; type: "int" }
+            Parameter { name: "sourceEnd"; type: "int" }
+            Parameter { name: "destinationParent"; type: "QModelIndex" }
+            Parameter { name: "destinationRow"; type: "int" }
+        }
+        Signal {
+            name: "rowsMoved"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "start"; type: "int" }
+            Parameter { name: "end"; type: "int" }
+            Parameter { name: "destination"; type: "QModelIndex" }
+            Parameter { name: "row"; type: "int" }
+        }
+        Signal {
+            name: "columnsAboutToBeMoved"
+            Parameter { name: "sourceParent"; type: "QModelIndex" }
+            Parameter { name: "sourceStart"; type: "int" }
+            Parameter { name: "sourceEnd"; type: "int" }
+            Parameter { name: "destinationParent"; type: "QModelIndex" }
+            Parameter { name: "destinationColumn"; type: "int" }
+        }
+        Signal {
+            name: "columnsMoved"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "start"; type: "int" }
+            Parameter { name: "end"; type: "int" }
+            Parameter { name: "destination"; type: "QModelIndex" }
+            Parameter { name: "column"; type: "int" }
+        }
+        Method { name: "submit"; type: "bool" }
+        Method { name: "revert" }
+        Method {
+            name: "hasIndex"
+            type: "bool"
+            Parameter { name: "row"; type: "int" }
+            Parameter { name: "column"; type: "int" }
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method {
+            name: "hasIndex"
+            type: "bool"
+            Parameter { name: "row"; type: "int" }
+            Parameter { name: "column"; type: "int" }
+        }
+        Method {
+            name: "index"
+            type: "QModelIndex"
+            Parameter { name: "row"; type: "int" }
+            Parameter { name: "column"; type: "int" }
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method {
+            name: "index"
+            type: "QModelIndex"
+            Parameter { name: "row"; type: "int" }
+            Parameter { name: "column"; type: "int" }
+        }
+        Method {
+            name: "parent"
+            type: "QModelIndex"
+            Parameter { name: "child"; type: "QModelIndex" }
+        }
+        Method {
+            name: "sibling"
+            type: "QModelIndex"
+            Parameter { name: "row"; type: "int" }
+            Parameter { name: "column"; type: "int" }
+            Parameter { name: "idx"; type: "QModelIndex" }
+        }
+        Method {
+            name: "rowCount"
+            type: "int"
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method { name: "rowCount"; type: "int" }
+        Method {
+            name: "columnCount"
+            type: "int"
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method { name: "columnCount"; type: "int" }
+        Method {
+            name: "hasChildren"
+            type: "bool"
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method { name: "hasChildren"; type: "bool" }
+        Method {
+            name: "data"
+            type: "QVariant"
+            Parameter { name: "index"; type: "QModelIndex" }
+            Parameter { name: "role"; type: "int" }
+        }
+        Method {
+            name: "data"
+            type: "QVariant"
+            Parameter { name: "index"; type: "QModelIndex" }
+        }
+        Method {
+            name: "setData"
+            type: "bool"
+            Parameter { name: "index"; type: "QModelIndex" }
+            Parameter { name: "value"; type: "QVariant" }
+            Parameter { name: "role"; type: "int" }
+        }
+        Method {
+            name: "setData"
+            type: "bool"
+            Parameter { name: "index"; type: "QModelIndex" }
+            Parameter { name: "value"; type: "QVariant" }
+        }
+        Method {
+            name: "headerData"
+            type: "QVariant"
+            Parameter { name: "section"; type: "int" }
+            Parameter { name: "orientation"; type: "Qt::Orientation" }
+            Parameter { name: "role"; type: "int" }
+        }
+        Method {
+            name: "headerData"
+            type: "QVariant"
+            Parameter { name: "section"; type: "int" }
+            Parameter { name: "orientation"; type: "Qt::Orientation" }
+        }
+        Method {
+            name: "fetchMore"
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method {
+            name: "canFetchMore"
+            type: "bool"
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method {
+            name: "flags"
+            type: "Qt::ItemFlags"
+            Parameter { name: "index"; type: "QModelIndex" }
+        }
+        Method {
+            name: "match"
+            type: "QModelIndexList"
+            Parameter { name: "start"; type: "QModelIndex" }
+            Parameter { name: "role"; type: "int" }
+            Parameter { name: "value"; type: "QVariant" }
+            Parameter { name: "hits"; type: "int" }
+            Parameter { name: "flags"; type: "Qt::MatchFlags" }
+        }
+        Method {
+            name: "match"
+            type: "QModelIndexList"
+            Parameter { name: "start"; type: "QModelIndex" }
+            Parameter { name: "role"; type: "int" }
+            Parameter { name: "value"; type: "QVariant" }
+            Parameter { name: "hits"; type: "int" }
+        }
+        Method {
+            name: "match"
+            type: "QModelIndexList"
+            Parameter { name: "start"; type: "QModelIndex" }
+            Parameter { name: "role"; type: "int" }
+            Parameter { name: "value"; type: "QVariant" }
+        }
+    }
+    Component {
+        name: "QGraphicsObject"
+        defaultProperty: "children"
+        prototype: "QObject"
+        Property { name: "parent"; type: "QGraphicsObject"; isPointer: true }
+        Property { name: "opacity"; type: "double" }
+        Property { name: "enabled"; type: "bool" }
+        Property { name: "visible"; type: "bool" }
+        Property { name: "pos"; type: "QPointF" }
+        Property { name: "x"; type: "double" }
+        Property { name: "y"; type: "double" }
+        Property { name: "z"; type: "double" }
+        Property { name: "rotation"; type: "double" }
+        Property { name: "scale"; type: "double" }
+        Property { name: "transformOriginPoint"; type: "QPointF" }
+        Property { name: "effect"; type: "QGraphicsEffect"; isPointer: true }
+        Property {
+            name: "children"
+            type: "QDeclarativeListProperty<QGraphicsObject>"
+            isReadonly: true
+        }
+        Property { name: "width"; type: "double" }
+        Property { name: "height"; type: "double" }
+    }
+    Component {
+        name: "QGraphicsWidget"
+        defaultProperty: "children"
+        prototype: "QGraphicsObject"
+        Property { name: "palette"; type: "QPalette" }
+        Property { name: "font"; type: "QFont" }
+        Property { name: "layoutDirection"; type: "Qt::LayoutDirection" }
+        Property { name: "size"; type: "QSizeF" }
+        Property { name: "minimumSize"; type: "QSizeF" }
+        Property { name: "preferredSize"; type: "QSizeF" }
+        Property { name: "maximumSize"; type: "QSizeF" }
+        Property { name: "sizePolicy"; type: "QSizePolicy" }
+        Property { name: "focusPolicy"; type: "Qt::FocusPolicy" }
+        Property { name: "windowFlags"; type: "Qt::WindowFlags" }
+        Property { name: "windowTitle"; type: "string" }
+        Property { name: "geometry"; type: "QRectF" }
+        Property { name: "autoFillBackground"; type: "bool" }
+        Property { name: "layout"; type: "QGraphicsLayout"; isPointer: true }
+        Method { name: "close"; type: "bool" }
+    }
+    Component {
+        name: "QtCharts::DeclarativeAreaSeries"
+        prototype: "QtCharts::QAreaSeries"
+        exports: [
+            "QtCharts/AreaSeries 1.0",
+            "QtCharts/AreaSeries 1.1",
+            "QtCharts/AreaSeries 1.2",
+            "QtCharts/AreaSeries 1.3",
+            "QtCharts/AreaSeries 1.4",
+            "QtCharts/AreaSeries 2.0"
+        ]
+        exportMetaObjectRevisions: [0, 1, 2, 3, 4, 4]
+        Property { name: "upperSeries"; type: "QtCharts::DeclarativeLineSeries"; isPointer: true }
+        Property { name: "lowerSeries"; type: "QtCharts::DeclarativeLineSeries"; isPointer: true }
+        Property { name: "axisX"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisY"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisXTop"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisYRight"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisAngular"; revision: 3; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisRadial"; revision: 3; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "borderWidth"; revision: 1; type: "double" }
+        Property { name: "brushFilename"; revision: 4; type: "string" }
+        Property { name: "brush"; revision: 4; type: "QBrush" }
+        Signal {
+            name: "axisXChanged"
+            revision: 1
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisYChanged"
+            revision: 1
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "borderWidthChanged"
+            revision: 1
+            Parameter { name: "width"; type: "double" }
+        }
+        Signal {
+            name: "axisXTopChanged"
+            revision: 2
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisYRightChanged"
+            revision: 2
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisAngularChanged"
+            revision: 3
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisRadialChanged"
+            revision: 3
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal { name: "brushChanged"; revision: 4 }
+        Signal {
+            name: "brushFilenameChanged"
+            revision: 4
+            Parameter { name: "brushFilename"; type: "string" }
+        }
+    }
+    Component {
+        name: "QtCharts::DeclarativeAxes"
+        prototype: "QObject"
+        exports: [
+            "QtCharts/DeclarativeAxes 1.0",
+            "QtCharts/DeclarativeAxes 2.0"
+        ]
+        isCreatable: false
+        exportMetaObjectRevisions: [0, 0]
+        Property { name: "axisX"; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisY"; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisXTop"; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisYRight"; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Signal {
+            name: "axisXChanged"
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisYChanged"
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisXTopChanged"
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisYRightChanged"
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+    }
+    Component {
+        name: "QtCharts::DeclarativeBarSeries"
+        defaultProperty: "seriesChildren"
+        prototype: "QtCharts::QBarSeries"
+        exports: [
+            "QtCharts/BarSeries 1.0",
+            "QtCharts/BarSeries 1.1",
+            "QtCharts/BarSeries 1.2",
+            "QtCharts/BarSeries 2.0"
+        ]
+        exportMetaObjectRevisions: [0, 1, 2, 2]
+        Property { name: "axisX"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisY"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisXTop"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisYRight"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "seriesChildren"; type: "QObject"; isList: true; isReadonly: true }
+        Signal {
+            name: "axisXChanged"
+            revision: 1
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisYChanged"
+            revision: 1
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisXTopChanged"
+            revision: 2
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisYRightChanged"
+            revision: 2
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Method {
+            name: "appendSeriesChildren"
+            Parameter { name: "list"; type: "QObject"; isList: true; isPointer: true }
+            Parameter { name: "element"; type: "QObject"; isPointer: true }
+        }
+        Method {
+            name: "at"
+            type: "DeclarativeBarSet*"
+            Parameter { name: "index"; type: "int" }
+        }
+        Method {
+            name: "append"
+            type: "DeclarativeBarSet*"
+            Parameter { name: "label"; type: "string" }
+            Parameter { name: "values"; type: "QVariantList" }
+        }
+        Method {
+            name: "insert"
+            type: "DeclarativeBarSet*"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "label"; type: "string" }
+            Parameter { name: "values"; type: "QVariantList" }
+        }
+        Method {
+            name: "remove"
+            type: "bool"
+            Parameter { name: "barset"; type: "QBarSet"; isPointer: true }
+        }
+        Method { name: "clear" }
+    }
+    Component {
+        name: "QtCharts::DeclarativeBarSet"
+        prototype: "QtCharts::QBarSet"
+        exports: [
+            "QtCharts/BarSet 1.0",
+            "QtCharts/BarSet 1.1",
+            "QtCharts/BarSet 1.4",
+            "QtCharts/BarSet 2.0"
+        ]
+        exportMetaObjectRevisions: [0, 0, 2, 2]
+        Property { name: "values"; type: "QVariantList" }
+        Property { name: "borderWidth"; revision: 1; type: "double" }
+        Property { name: "count"; type: "int"; isReadonly: true }
+        Property { name: "brushFilename"; revision: 2; type: "string" }
+        Signal {
+            name: "countChanged"
+            Parameter { name: "count"; type: "int" }
+        }
+        Signal {
+            name: "borderWidthChanged"
+            revision: 1
+            Parameter { name: "width"; type: "double" }
+        }
+        Signal {
+            name: "brushFilenameChanged"
+            revision: 2
+            Parameter { name: "brushFilename"; type: "string" }
+        }
+        Method {
+            name: "append"
+            Parameter { name: "value"; type: "double" }
+        }
+        Method {
+            name: "remove"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "count"; type: "int" }
+        }
+        Method {
+            name: "remove"
+            Parameter { name: "index"; type: "int" }
+        }
+        Method {
+            name: "replace"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "value"; type: "double" }
+        }
+        Method {
+            name: "at"
+            type: "double"
+            Parameter { name: "index"; type: "int" }
+        }
+    }
+    Component {
+        name: "QtCharts::DeclarativeBoxPlotSeries"
+        defaultProperty: "seriesChildren"
+        prototype: "QtCharts::QBoxPlotSeries"
+        exports: [
+            "QtCharts/BoxPlotSeries 1.3",
+            "QtCharts/BoxPlotSeries 1.4",
+            "QtCharts/BoxPlotSeries 2.0"
+        ]
+        exportMetaObjectRevisions: [0, 1, 1]
+        Property { name: "axisX"; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisY"; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisXTop"; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisYRight"; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "seriesChildren"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "brushFilename"; revision: 1; type: "string" }
+        Signal {
+            name: "axisXChanged"
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisYChanged"
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisXTopChanged"
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisYRightChanged"
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "clicked"
+            Parameter { name: "boxset"; type: "DeclarativeBoxSet"; isPointer: true }
+        }
+        Signal {
+            name: "hovered"
+            Parameter { name: "status"; type: "bool" }
+            Parameter { name: "boxset"; type: "DeclarativeBoxSet"; isPointer: true }
+        }
+        Signal {
+            name: "pressed"
+            Parameter { name: "boxset"; type: "DeclarativeBoxSet"; isPointer: true }
+        }
+        Signal {
+            name: "released"
+            Parameter { name: "boxset"; type: "DeclarativeBoxSet"; isPointer: true }
+        }
+        Signal {
+            name: "doubleClicked"
+            Parameter { name: "boxset"; type: "DeclarativeBoxSet"; isPointer: true }
+        }
+        Signal {
+            name: "brushFilenameChanged"
+            revision: 1
+            Parameter { name: "brushFilename"; type: "string" }
+        }
+        Method {
+            name: "appendSeriesChildren"
+            Parameter { name: "list"; type: "QObject"; isList: true; isPointer: true }
+            Parameter { name: "element"; type: "QObject"; isPointer: true }
+        }
+        Method {
+            name: "onHovered"
+            Parameter { name: "status"; type: "bool" }
+            Parameter { name: "boxset"; type: "QBoxSet"; isPointer: true }
+        }
+        Method {
+            name: "onClicked"
+            Parameter { name: "boxset"; type: "QBoxSet"; isPointer: true }
+        }
+        Method {
+            name: "onPressed"
+            Parameter { name: "boxset"; type: "QBoxSet"; isPointer: true }
+        }
+        Method {
+            name: "onReleased"
+            Parameter { name: "boxset"; type: "QBoxSet"; isPointer: true }
+        }
+        Method {
+            name: "onDoubleClicked"
+            Parameter { name: "boxset"; type: "QBoxSet"; isPointer: true }
+        }
+        Method {
+            name: "at"
+            type: "DeclarativeBoxSet*"
+            Parameter { name: "index"; type: "int" }
+        }
+        Method {
+            name: "append"
+            type: "DeclarativeBoxSet*"
+            Parameter { name: "label"; type: "string" }
+            Parameter { name: "values"; type: "QVariantList" }
+        }
+        Method {
+            name: "append"
+            Parameter { name: "box"; type: "DeclarativeBoxSet"; isPointer: true }
+        }
+        Method {
+            name: "insert"
+            type: "DeclarativeBoxSet*"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "label"; type: "string" }
+            Parameter { name: "values"; type: "QVariantList" }
+        }
+        Method {
+            name: "remove"
+            type: "bool"
+            Parameter { name: "box"; type: "DeclarativeBoxSet"; isPointer: true }
+        }
+        Method { name: "clear" }
+    }
+    Component {
+        name: "QtCharts::DeclarativeBoxSet"
+        prototype: "QtCharts::QBoxSet"
+        exports: [
+            "QtCharts/BoxSet 1.3",
+            "QtCharts/BoxSet 1.4",
+            "QtCharts/BoxSet 2.0"
+        ]
+        exportMetaObjectRevisions: [0, 1, 1]
+        Enum {
+            name: "ValuePositions"
+            values: {
+                "LowerExtreme": 0,
+                "LowerQuartile": 1,
+                "Median": 2,
+                "UpperQuartile": 3,
+                "UpperExtreme": 4
+            }
+        }
+        Property { name: "values"; type: "QVariantList" }
+        Property { name: "label"; type: "string" }
+        Property { name: "count"; type: "int"; isReadonly: true }
+        Property { name: "brushFilename"; revision: 1; type: "string" }
+        Signal { name: "changedValues" }
+        Signal {
+            name: "changedValue"
+            Parameter { name: "index"; type: "int" }
+        }
+        Signal {
+            name: "brushFilenameChanged"
+            revision: 1
+            Parameter { name: "brushFilename"; type: "string" }
+        }
+        Method {
+            name: "append"
+            Parameter { name: "value"; type: "double" }
+        }
+        Method { name: "clear" }
+        Method {
+            name: "at"
+            type: "double"
+            Parameter { name: "index"; type: "int" }
+        }
+        Method {
+            name: "setValue"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "value"; type: "double" }
+        }
+    }
+    Component {
+        name: "QtCharts::DeclarativeCandlestickSeries"
+        defaultProperty: "seriesChildren"
+        prototype: "QtCharts::QCandlestickSeries"
+        exports: ["QtCharts/CandlestickSeries 2.2"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "axisX"; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisY"; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisXTop"; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisYRight"; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "seriesChildren"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "brushFilename"; type: "string" }
+        Signal {
+            name: "axisXChanged"
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisYChanged"
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisXTopChanged"
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisYRightChanged"
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "clicked"
+            Parameter { name: "set"; type: "DeclarativeCandlestickSet"; isPointer: true }
+        }
+        Signal {
+            name: "hovered"
+            Parameter { name: "status"; type: "bool" }
+            Parameter { name: "set"; type: "DeclarativeCandlestickSet"; isPointer: true }
+        }
+        Signal {
+            name: "pressed"
+            Parameter { name: "set"; type: "DeclarativeCandlestickSet"; isPointer: true }
+        }
+        Signal {
+            name: "released"
+            Parameter { name: "set"; type: "DeclarativeCandlestickSet"; isPointer: true }
+        }
+        Signal {
+            name: "doubleClicked"
+            Parameter { name: "set"; type: "DeclarativeCandlestickSet"; isPointer: true }
+        }
+        Signal {
+            name: "brushFilenameChanged"
+            Parameter { name: "brushFilename"; type: "string" }
+        }
+        Method {
+            name: "appendSeriesChildren"
+            Parameter { name: "list"; type: "QObject"; isList: true; isPointer: true }
+            Parameter { name: "element"; type: "QObject"; isPointer: true }
+        }
+        Method {
+            name: "onClicked"
+            Parameter { name: "set"; type: "QCandlestickSet"; isPointer: true }
+        }
+        Method {
+            name: "onHovered"
+            Parameter { name: "status"; type: "bool" }
+            Parameter { name: "set"; type: "QCandlestickSet"; isPointer: true }
+        }
+        Method {
+            name: "onPressed"
+            Parameter { name: "set"; type: "QCandlestickSet"; isPointer: true }
+        }
+        Method {
+            name: "onReleased"
+            Parameter { name: "set"; type: "QCandlestickSet"; isPointer: true }
+        }
+        Method {
+            name: "onDoubleClicked"
+            Parameter { name: "set"; type: "QCandlestickSet"; isPointer: true }
+        }
+        Method {
+            name: "at"
+            type: "DeclarativeCandlestickSet*"
+            Parameter { name: "index"; type: "int" }
+        }
+        Method {
+            name: "append"
+            type: "bool"
+            Parameter { name: "set"; type: "DeclarativeCandlestickSet"; isPointer: true }
+        }
+        Method {
+            name: "remove"
+            type: "bool"
+            Parameter { name: "set"; type: "DeclarativeCandlestickSet"; isPointer: true }
+        }
+        Method {
+            name: "append"
+            type: "bool"
+            Parameter { name: "open"; type: "double" }
+            Parameter { name: "high"; type: "double" }
+            Parameter { name: "low"; type: "double" }
+            Parameter { name: "close"; type: "double" }
+            Parameter { name: "timestamp"; type: "double" }
+        }
+        Method {
+            name: "remove"
+            type: "bool"
+            Parameter { name: "timestamp"; type: "double" }
+        }
+        Method {
+            name: "insert"
+            type: "bool"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "set"; type: "DeclarativeCandlestickSet"; isPointer: true }
+        }
+        Method { name: "clear" }
+    }
+    Component {
+        name: "QtCharts::DeclarativeCandlestickSet"
+        prototype: "QtCharts::QCandlestickSet"
+        exports: ["QtCharts/CandlestickSet 2.2"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "brushFilename"; type: "string" }
+        Signal {
+            name: "brushFilenameChanged"
+            Parameter { name: "brushFilename"; type: "string" }
+        }
+    }
+    Component {
+        name: "QtCharts::DeclarativeCategoryAxis"
+        defaultProperty: "axisChildren"
+        prototype: "QtCharts::QCategoryAxis"
+        exports: [
+            "QtCharts/CategoryAxis 1.1",
+            "QtCharts/CategoryAxis 2.0",
+            "QtCharts/CategoryAxis 2.1"
+        ]
+        exportMetaObjectRevisions: [0, 0, 1]
+        Enum {
+            name: "AxisLabelsPosition"
+            values: {
+                "AxisLabelsPositionCenter": 0,
+                "AxisLabelsPositionOnValue": 1
+            }
+        }
+        Property { name: "axisChildren"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "labelsPosition"; revision: 1; type: "AxisLabelsPosition" }
+        Signal {
+            name: "labelsPositionChanged"
+            revision: 1
+            Parameter { name: "position"; type: "AxisLabelsPosition" }
+        }
+        Method {
+            name: "append"
+            Parameter { name: "label"; type: "string" }
+            Parameter { name: "categoryEndValue"; type: "double" }
+        }
+        Method {
+            name: "remove"
+            Parameter { name: "label"; type: "string" }
+        }
+        Method {
+            name: "replace"
+            Parameter { name: "oldLabel"; type: "string" }
+            Parameter { name: "newLabel"; type: "string" }
+        }
+        Method {
+            name: "appendAxisChildren"
+            Parameter { name: "list"; type: "QObject"; isList: true; isPointer: true }
+            Parameter { name: "element"; type: "QObject"; isPointer: true }
+        }
+    }
+    Component {
+        name: "QtCharts::DeclarativeCategoryRange"
+        prototype: "QObject"
+        exports: ["QtCharts/CategoryRange 1.1", "QtCharts/CategoryRange 2.0"]
+        exportMetaObjectRevisions: [0, 0]
+        Property { name: "endValue"; type: "double" }
+        Property { name: "label"; type: "string" }
+    }
+    Component {
+        name: "QtCharts::DeclarativeChart"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        exports: [
+            "QtCharts/ChartView 1.0",
+            "QtCharts/ChartView 1.1",
+            "QtCharts/ChartView 1.2",
+            "QtCharts/ChartView 1.3",
+            "QtCharts/ChartView 2.0",
+            "QtCharts/ChartView 2.1"
+        ]
+        exportMetaObjectRevisions: [0, 1, 2, 3, 4, 5]
+        Enum {
+            name: "Theme"
+            values: {
+                "ChartThemeLight": 0,
+                "ChartThemeBlueCerulean": 1,
+                "ChartThemeDark": 2,
+                "ChartThemeBrownSand": 3,
+                "ChartThemeBlueNcs": 4,
+                "ChartThemeHighContrast": 5,
+                "ChartThemeBlueIcy": 6,
+                "ChartThemeQt": 7
+            }
+        }
+        Enum {
+            name: "Animation"
+            values: {
+                "NoAnimation": 0,
+                "GridAxisAnimations": 1,
+                "SeriesAnimations": 2,
+                "AllAnimations": 3
+            }
+        }
+        Enum {
+            name: "SeriesType"
+            values: {
+                "SeriesTypeLine": 0,
+                "SeriesTypeArea": 1,
+                "SeriesTypeBar": 2,
+                "SeriesTypeStackedBar": 3,
+                "SeriesTypePercentBar": 4,
+                "SeriesTypePie": 5,
+                "SeriesTypeScatter": 6,
+                "SeriesTypeSpline": 7,
+                "SeriesTypeHorizontalBar": 8,
+                "SeriesTypeHorizontalStackedBar": 9,
+                "SeriesTypeHorizontalPercentBar": 10,
+                "SeriesTypeBoxPlot": 11,
+                "SeriesTypeCandlestick": 12
+            }
+        }
+        Property { name: "theme"; type: "Theme" }
+        Property { name: "animationOptions"; type: "Animation" }
+        Property { name: "animationDuration"; revision: 5; type: "int" }
+        Property { name: "animationEasingCurve"; revision: 5; type: "QEasingCurve" }
+        Property { name: "title"; type: "string" }
+        Property { name: "titleFont"; type: "QFont" }
+        Property { name: "titleColor"; type: "QColor" }
+        Property { name: "legend"; type: "QtCharts::QLegend"; isReadonly: true; isPointer: true }
+        Property { name: "count"; type: "int"; isReadonly: true }
+        Property { name: "backgroundColor"; type: "QColor" }
+        Property { name: "dropShadowEnabled"; type: "bool" }
+        Property { name: "backgroundRoundness"; revision: 3; type: "double" }
+        Property {
+            name: "margins"
+            revision: 2
+            type: "QtCharts::DeclarativeMargins"
+            isReadonly: true
+            isPointer: true
+        }
+        Property { name: "plotArea"; revision: 1; type: "QRectF" }
+        Property { name: "plotAreaColor"; revision: 3; type: "QColor" }
+        Property { name: "axes"; revision: 2; type: "QAbstractAxis"; isList: true; isReadonly: true }
+        Property { name: "localizeNumbers"; revision: 4; type: "bool" }
+        Property { name: "locale"; revision: 4; type: "QLocale" }
+        Signal { name: "axisLabelsChanged" }
+        Signal {
+            name: "titleColorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "dropShadowEnabledChanged"
+            Parameter { name: "enabled"; type: "bool" }
+        }
+        Signal { name: "marginsChanged"; revision: 2 }
+        Signal {
+            name: "plotAreaChanged"
+            Parameter { name: "plotArea"; type: "QRectF" }
+        }
+        Signal {
+            name: "seriesAdded"
+            Parameter { name: "series"; type: "QAbstractSeries"; isPointer: true }
+        }
+        Signal {
+            name: "seriesRemoved"
+            Parameter { name: "series"; type: "QAbstractSeries"; isPointer: true }
+        }
+        Signal { name: "plotAreaColorChanged"; revision: 3 }
+        Signal {
+            name: "backgroundRoundnessChanged"
+            revision: 3
+            Parameter { name: "diameter"; type: "double" }
+        }
+        Signal { name: "localizeNumbersChanged"; revision: 4 }
+        Signal { name: "localeChanged"; revision: 4 }
+        Signal {
+            name: "animationDurationChanged"
+            revision: 5
+            Parameter { name: "msecs"; type: "int" }
+        }
+        Signal {
+            name: "animationEasingCurveChanged"
+            revision: 5
+            Parameter { name: "curve"; type: "QEasingCurve" }
+        }
+        Signal { name: "needRender" }
+        Signal { name: "pendingRenderNodeMouseEventResponses" }
+        Method {
+            name: "series"
+            type: "QAbstractSeries*"
+            Parameter { name: "index"; type: "int" }
+        }
+        Method {
+            name: "series"
+            type: "QAbstractSeries*"
+            Parameter { name: "seriesName"; type: "string" }
+        }
+        Method {
+            name: "createSeries"
+            type: "QAbstractSeries*"
+            Parameter { name: "type"; type: "int" }
+            Parameter { name: "name"; type: "string" }
+            Parameter { name: "axisX"; type: "QAbstractAxis"; isPointer: true }
+            Parameter { name: "axisY"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Method {
+            name: "createSeries"
+            type: "QAbstractSeries*"
+            Parameter { name: "type"; type: "int" }
+            Parameter { name: "name"; type: "string" }
+            Parameter { name: "axisX"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Method {
+            name: "createSeries"
+            type: "QAbstractSeries*"
+            Parameter { name: "type"; type: "int" }
+            Parameter { name: "name"; type: "string" }
+        }
+        Method {
+            name: "createSeries"
+            type: "QAbstractSeries*"
+            Parameter { name: "type"; type: "int" }
+        }
+        Method {
+            name: "removeSeries"
+            Parameter { name: "series"; type: "QAbstractSeries"; isPointer: true }
+        }
+        Method { name: "removeAllSeries" }
+        Method {
+            name: "setAxisX"
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+            Parameter { name: "series"; type: "QAbstractSeries"; isPointer: true }
+        }
+        Method {
+            name: "setAxisX"
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Method {
+            name: "setAxisY"
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+            Parameter { name: "series"; type: "QAbstractSeries"; isPointer: true }
+        }
+        Method {
+            name: "setAxisY"
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Method {
+            name: "axisX"
+            type: "QAbstractAxis*"
+            Parameter { name: "series"; type: "QAbstractSeries"; isPointer: true }
+        }
+        Method { name: "axisX"; type: "QAbstractAxis*" }
+        Method {
+            name: "axisY"
+            type: "QAbstractAxis*"
+            Parameter { name: "series"; type: "QAbstractSeries"; isPointer: true }
+        }
+        Method { name: "axisY"; type: "QAbstractAxis*" }
+        Method {
+            name: "zoom"
+            Parameter { name: "factor"; type: "double" }
+        }
+        Method { name: "zoomIn"; revision: 5 }
+        Method {
+            name: "zoomIn"
+            revision: 5
+            Parameter { name: "rectangle"; type: "QRectF" }
+        }
+        Method { name: "zoomOut"; revision: 5 }
+        Method { name: "zoomReset"; revision: 5 }
+        Method { name: "isZoomed"; revision: 5; type: "bool" }
+        Method {
+            name: "scrollLeft"
+            Parameter { name: "pixels"; type: "double" }
+        }
+        Method {
+            name: "scrollRight"
+            Parameter { name: "pixels"; type: "double" }
+        }
+        Method {
+            name: "scrollUp"
+            Parameter { name: "pixels"; type: "double" }
+        }
+        Method {
+            name: "scrollDown"
+            Parameter { name: "pixels"; type: "double" }
+        }
+        Method {
+            name: "mapToValue"
+            revision: 5
+            type: "QPointF"
+            Parameter { name: "position"; type: "QPointF" }
+            Parameter { name: "series"; type: "QAbstractSeries"; isPointer: true }
+        }
+        Method {
+            name: "mapToValue"
+            revision: 5
+            type: "QPointF"
+            Parameter { name: "position"; type: "QPointF" }
+        }
+        Method {
+            name: "mapToPosition"
+            revision: 5
+            type: "QPointF"
+            Parameter { name: "value"; type: "QPointF" }
+            Parameter { name: "series"; type: "QAbstractSeries"; isPointer: true }
+        }
+        Method {
+            name: "mapToPosition"
+            revision: 5
+            type: "QPointF"
+            Parameter { name: "value"; type: "QPointF" }
+        }
+    }
+    Component {
+        name: "QtCharts::DeclarativeHorizontalBarSeries"
+        defaultProperty: "seriesChildren"
+        prototype: "QtCharts::QHorizontalBarSeries"
+        exports: [
+            "QtCharts/HorizontalBarSeries 1.1",
+            "QtCharts/HorizontalBarSeries 1.2",
+            "QtCharts/HorizontalBarSeries 2.0"
+        ]
+        exportMetaObjectRevisions: [1, 2, 2]
+        Property { name: "axisX"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisY"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisXTop"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisYRight"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "seriesChildren"; type: "QObject"; isList: true; isReadonly: true }
+        Signal {
+            name: "axisXChanged"
+            revision: 1
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisYChanged"
+            revision: 1
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisXTopChanged"
+            revision: 2
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisYRightChanged"
+            revision: 2
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Method {
+            name: "appendSeriesChildren"
+            Parameter { name: "list"; type: "QObject"; isList: true; isPointer: true }
+            Parameter { name: "element"; type: "QObject"; isPointer: true }
+        }
+        Method {
+            name: "at"
+            type: "DeclarativeBarSet*"
+            Parameter { name: "index"; type: "int" }
+        }
+        Method {
+            name: "append"
+            type: "DeclarativeBarSet*"
+            Parameter { name: "label"; type: "string" }
+            Parameter { name: "values"; type: "QVariantList" }
+        }
+        Method {
+            name: "insert"
+            type: "DeclarativeBarSet*"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "label"; type: "string" }
+            Parameter { name: "values"; type: "QVariantList" }
+        }
+        Method {
+            name: "remove"
+            type: "bool"
+            Parameter { name: "barset"; type: "QBarSet"; isPointer: true }
+        }
+        Method { name: "clear" }
+    }
+    Component {
+        name: "QtCharts::DeclarativeHorizontalPercentBarSeries"
+        defaultProperty: "seriesChildren"
+        prototype: "QtCharts::QHorizontalPercentBarSeries"
+        exports: [
+            "QtCharts/HorizontalPercentBarSeries 1.1",
+            "QtCharts/HorizontalPercentBarSeries 1.2",
+            "QtCharts/HorizontalPercentBarSeries 2.0"
+        ]
+        exportMetaObjectRevisions: [1, 2, 2]
+        Property { name: "axisX"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisY"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisXTop"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisYRight"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "seriesChildren"; type: "QObject"; isList: true; isReadonly: true }
+        Signal {
+            name: "axisXChanged"
+            revision: 1
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisYChanged"
+            revision: 1
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisXTopChanged"
+            revision: 2
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisYRightChanged"
+            revision: 2
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Method {
+            name: "appendSeriesChildren"
+            Parameter { name: "list"; type: "QObject"; isList: true; isPointer: true }
+            Parameter { name: "element"; type: "QObject"; isPointer: true }
+        }
+        Method {
+            name: "at"
+            type: "DeclarativeBarSet*"
+            Parameter { name: "index"; type: "int" }
+        }
+        Method {
+            name: "append"
+            type: "DeclarativeBarSet*"
+            Parameter { name: "label"; type: "string" }
+            Parameter { name: "values"; type: "QVariantList" }
+        }
+        Method {
+            name: "insert"
+            type: "DeclarativeBarSet*"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "label"; type: "string" }
+            Parameter { name: "values"; type: "QVariantList" }
+        }
+        Method {
+            name: "remove"
+            type: "bool"
+            Parameter { name: "barset"; type: "QBarSet"; isPointer: true }
+        }
+        Method { name: "clear" }
+    }
+    Component {
+        name: "QtCharts::DeclarativeHorizontalStackedBarSeries"
+        defaultProperty: "seriesChildren"
+        prototype: "QtCharts::QHorizontalStackedBarSeries"
+        exports: [
+            "QtCharts/HorizontalStackedBarSeries 1.1",
+            "QtCharts/HorizontalStackedBarSeries 1.2",
+            "QtCharts/HorizontalStackedBarSeries 2.0"
+        ]
+        exportMetaObjectRevisions: [1, 2, 2]
+        Property { name: "axisX"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisY"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisXTop"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisYRight"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "seriesChildren"; type: "QObject"; isList: true; isReadonly: true }
+        Signal {
+            name: "axisXChanged"
+            revision: 1
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisYChanged"
+            revision: 1
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisXTopChanged"
+            revision: 2
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisYRightChanged"
+            revision: 2
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Method {
+            name: "appendSeriesChildren"
+            Parameter { name: "list"; type: "QObject"; isList: true; isPointer: true }
+            Parameter { name: "element"; type: "QObject"; isPointer: true }
+        }
+        Method {
+            name: "at"
+            type: "DeclarativeBarSet*"
+            Parameter { name: "index"; type: "int" }
+        }
+        Method {
+            name: "append"
+            type: "DeclarativeBarSet*"
+            Parameter { name: "label"; type: "string" }
+            Parameter { name: "values"; type: "QVariantList" }
+        }
+        Method {
+            name: "insert"
+            type: "DeclarativeBarSet*"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "label"; type: "string" }
+            Parameter { name: "values"; type: "QVariantList" }
+        }
+        Method {
+            name: "remove"
+            type: "bool"
+            Parameter { name: "barset"; type: "QBarSet"; isPointer: true }
+        }
+        Method { name: "clear" }
+    }
+    Component {
+        name: "QtCharts::DeclarativeLineSeries"
+        defaultProperty: "declarativeChildren"
+        prototype: "QtCharts::QLineSeries"
+        exports: [
+            "QtCharts/LineSeries 1.0",
+            "QtCharts/LineSeries 1.1",
+            "QtCharts/LineSeries 1.2",
+            "QtCharts/LineSeries 1.3",
+            "QtCharts/LineSeries 2.0",
+            "QtCharts/LineSeries 2.1"
+        ]
+        exportMetaObjectRevisions: [0, 1, 2, 3, 3, 4]
+        Property { name: "count"; type: "int"; isReadonly: true }
+        Property { name: "axisX"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisY"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisXTop"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisYRight"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisAngular"; revision: 3; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisRadial"; revision: 3; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "width"; revision: 1; type: "double" }
+        Property { name: "style"; revision: 1; type: "Qt::PenStyle" }
+        Property { name: "capStyle"; revision: 1; type: "Qt::PenCapStyle" }
+        Property { name: "declarativeChildren"; type: "QObject"; isList: true; isReadonly: true }
+        Signal {
+            name: "countChanged"
+            Parameter { name: "count"; type: "int" }
+        }
+        Signal {
+            name: "axisXChanged"
+            revision: 1
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisYChanged"
+            revision: 1
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisXTopChanged"
+            revision: 2
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisYRightChanged"
+            revision: 2
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisAngularChanged"
+            revision: 3
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisRadialChanged"
+            revision: 3
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "widthChanged"
+            revision: 1
+            Parameter { name: "width"; type: "double" }
+        }
+        Signal {
+            name: "styleChanged"
+            revision: 1
+            Parameter { name: "style"; type: "Qt::PenStyle" }
+        }
+        Signal {
+            name: "capStyleChanged"
+            revision: 1
+            Parameter { name: "capStyle"; type: "Qt::PenCapStyle" }
+        }
+        Method {
+            name: "appendDeclarativeChildren"
+            Parameter { name: "list"; type: "QObject"; isList: true; isPointer: true }
+            Parameter { name: "element"; type: "QObject"; isPointer: true }
+        }
+        Method {
+            name: "handleCountChanged"
+            Parameter { name: "index"; type: "int" }
+        }
+        Method {
+            name: "append"
+            Parameter { name: "x"; type: "double" }
+            Parameter { name: "y"; type: "double" }
+        }
+        Method {
+            name: "replace"
+            Parameter { name: "oldX"; type: "double" }
+            Parameter { name: "oldY"; type: "double" }
+            Parameter { name: "newX"; type: "double" }
+            Parameter { name: "newY"; type: "double" }
+        }
+        Method {
+            name: "replace"
+            revision: 3
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "newX"; type: "double" }
+            Parameter { name: "newY"; type: "double" }
+        }
+        Method {
+            name: "remove"
+            Parameter { name: "x"; type: "double" }
+            Parameter { name: "y"; type: "double" }
+        }
+        Method {
+            name: "remove"
+            revision: 3
+            Parameter { name: "index"; type: "int" }
+        }
+        Method {
+            name: "removePoints"
+            revision: 4
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "count"; type: "int" }
+        }
+        Method {
+            name: "insert"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "x"; type: "double" }
+            Parameter { name: "y"; type: "double" }
+        }
+        Method { name: "clear" }
+        Method {
+            name: "at"
+            type: "QPointF"
+            Parameter { name: "index"; type: "int" }
+        }
+    }
+    Component {
+        name: "QtCharts::DeclarativeMargins"
+        prototype: "QObject"
+        exports: ["QtCharts/Margins 1.1", "QtCharts/Margins 2.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0, 0]
+        Property { name: "top"; type: "int" }
+        Property { name: "bottom"; type: "int" }
+        Property { name: "left"; type: "int" }
+        Property { name: "right"; type: "int" }
+        Signal {
+            name: "topChanged"
+            Parameter { name: "top"; type: "int" }
+            Parameter { name: "bottom"; type: "int" }
+            Parameter { name: "left"; type: "int" }
+            Parameter { name: "right"; type: "int" }
+        }
+        Signal {
+            name: "bottomChanged"
+            Parameter { name: "top"; type: "int" }
+            Parameter { name: "bottom"; type: "int" }
+            Parameter { name: "left"; type: "int" }
+            Parameter { name: "right"; type: "int" }
+        }
+        Signal {
+            name: "leftChanged"
+            Parameter { name: "top"; type: "int" }
+            Parameter { name: "bottom"; type: "int" }
+            Parameter { name: "left"; type: "int" }
+            Parameter { name: "right"; type: "int" }
+        }
+        Signal {
+            name: "rightChanged"
+            Parameter { name: "top"; type: "int" }
+            Parameter { name: "bottom"; type: "int" }
+            Parameter { name: "left"; type: "int" }
+            Parameter { name: "right"; type: "int" }
+        }
+    }
+    Component {
+        name: "QtCharts::DeclarativePercentBarSeries"
+        defaultProperty: "seriesChildren"
+        prototype: "QtCharts::QPercentBarSeries"
+        exports: [
+            "QtCharts/PercentBarSeries 1.0",
+            "QtCharts/PercentBarSeries 1.1",
+            "QtCharts/PercentBarSeries 1.2",
+            "QtCharts/PercentBarSeries 2.0"
+        ]
+        exportMetaObjectRevisions: [0, 1, 2, 2]
+        Property { name: "axisX"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisY"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisXTop"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisYRight"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "seriesChildren"; type: "QObject"; isList: true; isReadonly: true }
+        Signal {
+            name: "axisXChanged"
+            revision: 1
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisYChanged"
+            revision: 1
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisXTopChanged"
+            revision: 2
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisYRightChanged"
+            revision: 2
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Method {
+            name: "appendSeriesChildren"
+            Parameter { name: "list"; type: "QObject"; isList: true; isPointer: true }
+            Parameter { name: "element"; type: "QObject"; isPointer: true }
+        }
+        Method {
+            name: "at"
+            type: "DeclarativeBarSet*"
+            Parameter { name: "index"; type: "int" }
+        }
+        Method {
+            name: "append"
+            type: "DeclarativeBarSet*"
+            Parameter { name: "label"; type: "string" }
+            Parameter { name: "values"; type: "QVariantList" }
+        }
+        Method {
+            name: "insert"
+            type: "DeclarativeBarSet*"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "label"; type: "string" }
+            Parameter { name: "values"; type: "QVariantList" }
+        }
+        Method {
+            name: "remove"
+            type: "bool"
+            Parameter { name: "barset"; type: "QBarSet"; isPointer: true }
+        }
+        Method { name: "clear" }
+    }
+    Component {
+        name: "QtCharts::DeclarativePieSeries"
+        defaultProperty: "seriesChildren"
+        prototype: "QtCharts::QPieSeries"
+        exports: [
+            "QtCharts/PieSeries 1.0",
+            "QtCharts/PieSeries 1.1",
+            "QtCharts/PieSeries 2.0"
+        ]
+        exportMetaObjectRevisions: [0, 0, 0]
+        Property { name: "seriesChildren"; type: "QObject"; isList: true; isReadonly: true }
+        Signal {
+            name: "sliceAdded"
+            Parameter { name: "slice"; type: "QPieSlice"; isPointer: true }
+        }
+        Signal {
+            name: "sliceRemoved"
+            Parameter { name: "slice"; type: "QPieSlice"; isPointer: true }
+        }
+        Method {
+            name: "appendSeriesChildren"
+            Parameter { name: "list"; type: "QObject"; isList: true; isPointer: true }
+            Parameter { name: "element"; type: "QObject"; isPointer: true }
+        }
+        Method {
+            name: "handleAdded"
+            Parameter { name: "slices"; type: "QList<QPieSlice*>" }
+        }
+        Method {
+            name: "handleRemoved"
+            Parameter { name: "slices"; type: "QList<QPieSlice*>" }
+        }
+        Method {
+            name: "at"
+            type: "QPieSlice*"
+            Parameter { name: "index"; type: "int" }
+        }
+        Method {
+            name: "find"
+            type: "QPieSlice*"
+            Parameter { name: "label"; type: "string" }
+        }
+        Method {
+            name: "append"
+            type: "DeclarativePieSlice*"
+            Parameter { name: "label"; type: "string" }
+            Parameter { name: "value"; type: "double" }
+        }
+        Method {
+            name: "remove"
+            type: "bool"
+            Parameter { name: "slice"; type: "QPieSlice"; isPointer: true }
+        }
+        Method { name: "clear" }
+    }
+    Component {
+        name: "QtCharts::DeclarativePieSlice"
+        prototype: "QtCharts::QPieSlice"
+        exports: ["QtCharts/PieSlice 1.4", "QtCharts/PieSlice 2.0"]
+        exportMetaObjectRevisions: [0, 0]
+        Property { name: "brushFilename"; type: "string" }
+        Signal {
+            name: "brushFilenameChanged"
+            Parameter { name: "brushFilename"; type: "string" }
+        }
+    }
+    Component {
+        name: "QtCharts::DeclarativePolarChart"
+        defaultProperty: "data"
+        prototype: "QtCharts::DeclarativeChart"
+        exports: [
+            "QtCharts/PolarChartView 1.3",
+            "QtCharts/PolarChartView 2.0"
+        ]
+        exportMetaObjectRevisions: [1, 1]
+    }
+    Component {
+        name: "QtCharts::DeclarativeScatterSeries"
+        defaultProperty: "declarativeChildren"
+        prototype: "QtCharts::QScatterSeries"
+        exports: [
+            "QtCharts/ScatterSeries 1.0",
+            "QtCharts/ScatterSeries 1.1",
+            "QtCharts/ScatterSeries 1.2",
+            "QtCharts/ScatterSeries 1.3",
+            "QtCharts/ScatterSeries 1.4",
+            "QtCharts/ScatterSeries 2.0",
+            "QtCharts/ScatterSeries 2.1"
+        ]
+        exportMetaObjectRevisions: [0, 1, 2, 3, 4, 4, 5]
+        Property { name: "count"; type: "int"; isReadonly: true }
+        Property { name: "axisX"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisY"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisXTop"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisYRight"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisAngular"; revision: 3; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisRadial"; revision: 3; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "borderWidth"; revision: 1; type: "double" }
+        Property { name: "declarativeChildren"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "brushFilename"; revision: 4; type: "string" }
+        Property { name: "brush"; revision: 4; type: "QBrush" }
+        Signal {
+            name: "countChanged"
+            Parameter { name: "count"; type: "int" }
+        }
+        Signal {
+            name: "axisXChanged"
+            revision: 1
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisYChanged"
+            revision: 1
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "borderWidthChanged"
+            revision: 1
+            Parameter { name: "width"; type: "double" }
+        }
+        Signal {
+            name: "axisXTopChanged"
+            revision: 2
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisYRightChanged"
+            revision: 2
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisAngularChanged"
+            revision: 3
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisRadialChanged"
+            revision: 3
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "brushFilenameChanged"
+            revision: 4
+            Parameter { name: "brushFilename"; type: "string" }
+        }
+        Signal { name: "brushChanged"; revision: 4 }
+        Method {
+            name: "appendDeclarativeChildren"
+            Parameter { name: "list"; type: "QObject"; isList: true; isPointer: true }
+            Parameter { name: "element"; type: "QObject"; isPointer: true }
+        }
+        Method {
+            name: "handleCountChanged"
+            Parameter { name: "index"; type: "int" }
+        }
+        Method {
+            name: "append"
+            Parameter { name: "x"; type: "double" }
+            Parameter { name: "y"; type: "double" }
+        }
+        Method {
+            name: "replace"
+            Parameter { name: "oldX"; type: "double" }
+            Parameter { name: "oldY"; type: "double" }
+            Parameter { name: "newX"; type: "double" }
+            Parameter { name: "newY"; type: "double" }
+        }
+        Method {
+            name: "replace"
+            revision: 3
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "newX"; type: "double" }
+            Parameter { name: "newY"; type: "double" }
+        }
+        Method {
+            name: "remove"
+            Parameter { name: "x"; type: "double" }
+            Parameter { name: "y"; type: "double" }
+        }
+        Method {
+            name: "remove"
+            revision: 3
+            Parameter { name: "index"; type: "int" }
+        }
+        Method {
+            name: "removePoints"
+            revision: 5
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "count"; type: "int" }
+        }
+        Method {
+            name: "insert"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "x"; type: "double" }
+            Parameter { name: "y"; type: "double" }
+        }
+        Method { name: "clear" }
+        Method {
+            name: "at"
+            type: "QPointF"
+            Parameter { name: "index"; type: "int" }
+        }
+    }
+    Component {
+        name: "QtCharts::DeclarativeSplineSeries"
+        defaultProperty: "declarativeChildren"
+        prototype: "QtCharts::QSplineSeries"
+        exports: [
+            "QtCharts/SplineSeries 1.0",
+            "QtCharts/SplineSeries 1.1",
+            "QtCharts/SplineSeries 1.2",
+            "QtCharts/SplineSeries 1.3",
+            "QtCharts/SplineSeries 2.0",
+            "QtCharts/SplineSeries 2.1"
+        ]
+        exportMetaObjectRevisions: [0, 1, 2, 3, 3, 4]
+        Property { name: "count"; type: "int"; isReadonly: true }
+        Property { name: "axisX"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisY"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisXTop"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisYRight"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisAngular"; revision: 3; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisRadial"; revision: 3; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "width"; revision: 1; type: "double" }
+        Property { name: "style"; revision: 1; type: "Qt::PenStyle" }
+        Property { name: "capStyle"; revision: 1; type: "Qt::PenCapStyle" }
+        Property { name: "declarativeChildren"; type: "QObject"; isList: true; isReadonly: true }
+        Signal {
+            name: "countChanged"
+            Parameter { name: "count"; type: "int" }
+        }
+        Signal {
+            name: "axisXChanged"
+            revision: 1
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisYChanged"
+            revision: 1
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisXTopChanged"
+            revision: 2
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisYRightChanged"
+            revision: 2
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisAngularChanged"
+            revision: 3
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisRadialChanged"
+            revision: 3
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "widthChanged"
+            revision: 1
+            Parameter { name: "width"; type: "double" }
+        }
+        Signal {
+            name: "styleChanged"
+            revision: 1
+            Parameter { name: "style"; type: "Qt::PenStyle" }
+        }
+        Signal {
+            name: "capStyleChanged"
+            revision: 1
+            Parameter { name: "capStyle"; type: "Qt::PenCapStyle" }
+        }
+        Method {
+            name: "appendDeclarativeChildren"
+            Parameter { name: "list"; type: "QObject"; isList: true; isPointer: true }
+            Parameter { name: "element"; type: "QObject"; isPointer: true }
+        }
+        Method {
+            name: "handleCountChanged"
+            Parameter { name: "index"; type: "int" }
+        }
+        Method {
+            name: "append"
+            Parameter { name: "x"; type: "double" }
+            Parameter { name: "y"; type: "double" }
+        }
+        Method {
+            name: "replace"
+            Parameter { name: "oldX"; type: "double" }
+            Parameter { name: "oldY"; type: "double" }
+            Parameter { name: "newX"; type: "double" }
+            Parameter { name: "newY"; type: "double" }
+        }
+        Method {
+            name: "replace"
+            revision: 3
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "newX"; type: "double" }
+            Parameter { name: "newY"; type: "double" }
+        }
+        Method {
+            name: "remove"
+            Parameter { name: "x"; type: "double" }
+            Parameter { name: "y"; type: "double" }
+        }
+        Method {
+            name: "remove"
+            revision: 3
+            Parameter { name: "index"; type: "int" }
+        }
+        Method {
+            name: "removePoints"
+            revision: 4
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "count"; type: "int" }
+        }
+        Method {
+            name: "insert"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "x"; type: "double" }
+            Parameter { name: "y"; type: "double" }
+        }
+        Method { name: "clear" }
+        Method {
+            name: "at"
+            type: "QPointF"
+            Parameter { name: "index"; type: "int" }
+        }
+    }
+    Component {
+        name: "QtCharts::DeclarativeStackedBarSeries"
+        defaultProperty: "seriesChildren"
+        prototype: "QtCharts::QStackedBarSeries"
+        exports: [
+            "QtCharts/StackedBarSeries 1.0",
+            "QtCharts/StackedBarSeries 1.1",
+            "QtCharts/StackedBarSeries 1.2",
+            "QtCharts/StackedBarSeries 2.0"
+        ]
+        exportMetaObjectRevisions: [0, 1, 2, 2]
+        Property { name: "axisX"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisY"; revision: 1; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisXTop"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "axisYRight"; revision: 2; type: "QtCharts::QAbstractAxis"; isPointer: true }
+        Property { name: "seriesChildren"; type: "QObject"; isList: true; isReadonly: true }
+        Signal {
+            name: "axisXChanged"
+            revision: 1
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisYChanged"
+            revision: 1
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisXTopChanged"
+            revision: 2
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisYRightChanged"
+            revision: 2
+            Parameter { name: "axis"; type: "QAbstractAxis"; isPointer: true }
+        }
+        Method {
+            name: "appendSeriesChildren"
+            Parameter { name: "list"; type: "QObject"; isList: true; isPointer: true }
+            Parameter { name: "element"; type: "QObject"; isPointer: true }
+        }
+        Method {
+            name: "at"
+            type: "DeclarativeBarSet*"
+            Parameter { name: "index"; type: "int" }
+        }
+        Method {
+            name: "append"
+            type: "DeclarativeBarSet*"
+            Parameter { name: "label"; type: "string" }
+            Parameter { name: "values"; type: "QVariantList" }
+        }
+        Method {
+            name: "insert"
+            type: "DeclarativeBarSet*"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "label"; type: "string" }
+            Parameter { name: "values"; type: "QVariantList" }
+        }
+        Method {
+            name: "remove"
+            type: "bool"
+            Parameter { name: "barset"; type: "QBarSet"; isPointer: true }
+        }
+        Method { name: "clear" }
+    }
+    Component {
+        name: "QtCharts::DeclarativeXYPoint"
+        prototype: "QObject"
+        exports: ["QtCharts/XYPoint 1.0", "QtCharts/XYPoint 2.0"]
+        exportMetaObjectRevisions: [0, 0]
+        Property { name: "x"; type: "double" }
+        Property { name: "y"; type: "double" }
+    }
+    Component {
+        name: "QtCharts::LegendScroller"
+        defaultProperty: "children"
+        prototype: "QtCharts::QLegend"
+    }
+    Component {
+        name: "QtCharts::QAbstractAxis"
+        prototype: "QObject"
+        exports: [
+            "QtCharts/AbstractAxis 1.0",
+            "QtCharts/AbstractAxis 2.0",
+            "QtCharts/AbstractAxis 2.1"
+        ]
+        isCreatable: false
+        exportMetaObjectRevisions: [0, 0, 0]
+        Property { name: "visible"; type: "bool" }
+        Property { name: "lineVisible"; type: "bool" }
+        Property { name: "linePen"; type: "QPen" }
+        Property { name: "color"; type: "QColor" }
+        Property { name: "labelsVisible"; type: "bool" }
+        Property { name: "labelsBrush"; type: "QBrush" }
+        Property { name: "labelsAngle"; type: "int" }
+        Property { name: "labelsFont"; type: "QFont" }
+        Property { name: "labelsColor"; type: "QColor" }
+        Property { name: "gridVisible"; type: "bool" }
+        Property { name: "gridLinePen"; type: "QPen" }
+        Property { name: "minorGridVisible"; type: "bool" }
+        Property { name: "minorGridLinePen"; type: "QPen" }
+        Property { name: "gridLineColor"; type: "QColor" }
+        Property { name: "minorGridLineColor"; type: "QColor" }
+        Property { name: "shadesVisible"; type: "bool" }
+        Property { name: "shadesColor"; type: "QColor" }
+        Property { name: "shadesBorderColor"; type: "QColor" }
+        Property { name: "shadesPen"; type: "QPen" }
+        Property { name: "shadesBrush"; type: "QBrush" }
+        Property { name: "titleText"; type: "string" }
+        Property { name: "titleBrush"; type: "QBrush" }
+        Property { name: "titleVisible"; type: "bool" }
+        Property { name: "titleFont"; type: "QFont" }
+        Property { name: "orientation"; type: "Qt::Orientation"; isReadonly: true }
+        Property { name: "alignment"; type: "Qt::Alignment"; isReadonly: true }
+        Property { name: "reverse"; type: "bool" }
+        Signal {
+            name: "visibleChanged"
+            Parameter { name: "visible"; type: "bool" }
+        }
+        Signal {
+            name: "linePenChanged"
+            Parameter { name: "pen"; type: "QPen" }
+        }
+        Signal {
+            name: "lineVisibleChanged"
+            Parameter { name: "visible"; type: "bool" }
+        }
+        Signal {
+            name: "labelsVisibleChanged"
+            Parameter { name: "visible"; type: "bool" }
+        }
+        Signal {
+            name: "labelsBrushChanged"
+            Parameter { name: "brush"; type: "QBrush" }
+        }
+        Signal {
+            name: "labelsFontChanged"
+            Parameter { name: "pen"; type: "QFont" }
+        }
+        Signal {
+            name: "labelsAngleChanged"
+            Parameter { name: "angle"; type: "int" }
+        }
+        Signal {
+            name: "gridLinePenChanged"
+            Parameter { name: "pen"; type: "QPen" }
+        }
+        Signal {
+            name: "gridVisibleChanged"
+            Parameter { name: "visible"; type: "bool" }
+        }
+        Signal {
+            name: "minorGridVisibleChanged"
+            Parameter { name: "visible"; type: "bool" }
+        }
+        Signal {
+            name: "minorGridLinePenChanged"
+            Parameter { name: "pen"; type: "QPen" }
+        }
+        Signal {
+            name: "gridLineColorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "minorGridLineColorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "colorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "labelsColorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "titleTextChanged"
+            Parameter { name: "title"; type: "string" }
+        }
+        Signal {
+            name: "titleBrushChanged"
+            Parameter { name: "brush"; type: "QBrush" }
+        }
+        Signal {
+            name: "titleVisibleChanged"
+            Parameter { name: "visible"; type: "bool" }
+        }
+        Signal {
+            name: "titleFontChanged"
+            Parameter { name: "font"; type: "QFont" }
+        }
+        Signal {
+            name: "shadesVisibleChanged"
+            Parameter { name: "visible"; type: "bool" }
+        }
+        Signal {
+            name: "shadesColorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "shadesBorderColorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "shadesPenChanged"
+            Parameter { name: "pen"; type: "QPen" }
+        }
+        Signal {
+            name: "shadesBrushChanged"
+            Parameter { name: "brush"; type: "QBrush" }
+        }
+        Signal {
+            name: "reverseChanged"
+            Parameter { name: "reverse"; type: "bool" }
+        }
+        Signal {
+            name: "labelsEditableChanged"
+            Parameter { name: "editable"; type: "bool" }
+        }
+    }
+    Component {
+        name: "QtCharts::QAbstractBarSeries"
+        prototype: "QtCharts::QAbstractSeries"
+        exports: [
+            "QtCharts/AbstractBarSeries 1.0",
+            "QtCharts/AbstractBarSeries 2.0"
+        ]
+        isCreatable: false
+        exportMetaObjectRevisions: [0, 0]
+        Enum {
+            name: "LabelsPosition"
+            values: {
+                "LabelsCenter": 0,
+                "LabelsInsideEnd": 1,
+                "LabelsInsideBase": 2,
+                "LabelsOutsideEnd": 3
+            }
+        }
+        Property { name: "barWidth"; type: "double" }
+        Property { name: "count"; type: "int"; isReadonly: true }
+        Property { name: "labelsVisible"; type: "bool" }
+        Property { name: "labelsFormat"; type: "string" }
+        Property { name: "labelsPosition"; type: "LabelsPosition" }
+        Property { name: "labelsAngle"; type: "double" }
+        Property { name: "labelsPrecision"; type: "int" }
+        Signal {
+            name: "clicked"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "barset"; type: "QBarSet"; isPointer: true }
+        }
+        Signal {
+            name: "hovered"
+            Parameter { name: "status"; type: "bool" }
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "barset"; type: "QBarSet"; isPointer: true }
+        }
+        Signal {
+            name: "pressed"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "barset"; type: "QBarSet"; isPointer: true }
+        }
+        Signal {
+            name: "released"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "barset"; type: "QBarSet"; isPointer: true }
+        }
+        Signal {
+            name: "doubleClicked"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "barset"; type: "QBarSet"; isPointer: true }
+        }
+        Signal {
+            name: "labelsFormatChanged"
+            Parameter { name: "format"; type: "string" }
+        }
+        Signal {
+            name: "labelsPositionChanged"
+            Parameter { name: "position"; type: "QAbstractBarSeries::LabelsPosition" }
+        }
+        Signal {
+            name: "labelsAngleChanged"
+            Parameter { name: "angle"; type: "double" }
+        }
+        Signal {
+            name: "labelsPrecisionChanged"
+            Parameter { name: "precision"; type: "int" }
+        }
+        Signal {
+            name: "barsetsAdded"
+            Parameter { name: "sets"; type: "QList<QBarSet*>" }
+        }
+        Signal {
+            name: "barsetsRemoved"
+            Parameter { name: "sets"; type: "QList<QBarSet*>" }
+        }
+    }
+    Component {
+        name: "QtCharts::QAbstractSeries"
+        prototype: "QObject"
+        exports: [
+            "QtCharts/AbstractSeries 1.0",
+            "QtCharts/AbstractSeries 2.0"
+        ]
+        isCreatable: false
+        exportMetaObjectRevisions: [0, 0]
+        Enum {
+            name: "SeriesType"
+            values: {
+                "SeriesTypeLine": 0,
+                "SeriesTypeArea": 1,
+                "SeriesTypeBar": 2,
+                "SeriesTypeStackedBar": 3,
+                "SeriesTypePercentBar": 4,
+                "SeriesTypePie": 5,
+                "SeriesTypeScatter": 6,
+                "SeriesTypeSpline": 7,
+                "SeriesTypeHorizontalBar": 8,
+                "SeriesTypeHorizontalStackedBar": 9,
+                "SeriesTypeHorizontalPercentBar": 10,
+                "SeriesTypeBoxPlot": 11,
+                "SeriesTypeCandlestick": 12
+            }
+        }
+        Property { name: "name"; type: "string" }
+        Property { name: "visible"; type: "bool" }
+        Property { name: "opacity"; type: "double" }
+        Property { name: "type"; type: "SeriesType"; isReadonly: true }
+        Property { name: "useOpenGL"; type: "bool" }
+    }
+    Component {
+        name: "QtCharts::QAreaSeries"
+        prototype: "QtCharts::QAbstractSeries"
+        Property { name: "upperSeries"; type: "QtCharts::QLineSeries"; isReadonly: true; isPointer: true }
+        Property { name: "lowerSeries"; type: "QtCharts::QLineSeries"; isReadonly: true; isPointer: true }
+        Property { name: "color"; type: "QColor" }
+        Property { name: "borderColor"; type: "QColor" }
+        Property { name: "pointLabelsFormat"; type: "string" }
+        Property { name: "pointLabelsVisible"; type: "bool" }
+        Property { name: "pointLabelsFont"; type: "QFont" }
+        Property { name: "pointLabelsColor"; type: "QColor" }
+        Property { name: "pointLabelsClipping"; type: "bool" }
+        Signal {
+            name: "clicked"
+            Parameter { name: "point"; type: "QPointF" }
+        }
+        Signal {
+            name: "hovered"
+            Parameter { name: "point"; type: "QPointF" }
+            Parameter { name: "state"; type: "bool" }
+        }
+        Signal {
+            name: "pressed"
+            Parameter { name: "point"; type: "QPointF" }
+        }
+        Signal {
+            name: "released"
+            Parameter { name: "point"; type: "QPointF" }
+        }
+        Signal {
+            name: "doubleClicked"
+            Parameter { name: "point"; type: "QPointF" }
+        }
+        Signal { name: "selected" }
+        Signal {
+            name: "colorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "borderColorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "pointLabelsFormatChanged"
+            Parameter { name: "format"; type: "string" }
+        }
+        Signal {
+            name: "pointLabelsVisibilityChanged"
+            Parameter { name: "visible"; type: "bool" }
+        }
+        Signal {
+            name: "pointLabelsFontChanged"
+            Parameter { name: "font"; type: "QFont" }
+        }
+        Signal {
+            name: "pointLabelsColorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "pointLabelsClippingChanged"
+            Parameter { name: "clipping"; type: "bool" }
+        }
+    }
+    Component {
+        name: "QtCharts::QBarCategoryAxis"
+        prototype: "QtCharts::QAbstractAxis"
+        exports: [
+            "QtCharts/BarCategoriesAxis 1.0",
+            "QtCharts/BarCategoryAxis 1.1",
+            "QtCharts/BarCategoryAxis 2.0"
+        ]
+        exportMetaObjectRevisions: [0, 0, 0]
+        Property { name: "categories"; type: "QStringList" }
+        Property { name: "min"; type: "string" }
+        Property { name: "max"; type: "string" }
+        Property { name: "count"; type: "int"; isReadonly: true }
+        Signal {
+            name: "minChanged"
+            Parameter { name: "min"; type: "string" }
+        }
+        Signal {
+            name: "maxChanged"
+            Parameter { name: "max"; type: "string" }
+        }
+        Signal {
+            name: "rangeChanged"
+            Parameter { name: "min"; type: "string" }
+            Parameter { name: "max"; type: "string" }
+        }
+        Method { name: "clear" }
+    }
+    Component {
+        name: "QtCharts::QBarModelMapper"
+        prototype: "QObject"
+        exports: [
+            "QtCharts/BarModelMapper 1.0",
+            "QtCharts/BarModelMapper 2.0"
+        ]
+        isCreatable: false
+        exportMetaObjectRevisions: [0, 0]
+    }
+    Component { name: "QtCharts::QBarSeries"; prototype: "QtCharts::QAbstractBarSeries" }
+    Component {
+        name: "QtCharts::QBarSet"
+        prototype: "QObject"
+        exports: ["QtCharts/BarSetBase 1.0", "QtCharts/BarSetBase 2.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0, 0]
+        Property { name: "label"; type: "string" }
+        Property { name: "pen"; type: "QPen" }
+        Property { name: "brush"; type: "QBrush" }
+        Property { name: "labelBrush"; type: "QBrush" }
+        Property { name: "labelFont"; type: "QFont" }
+        Property { name: "color"; type: "QColor" }
+        Property { name: "borderColor"; type: "QColor" }
+        Property { name: "labelColor"; type: "QColor" }
+        Signal {
+            name: "clicked"
+            Parameter { name: "index"; type: "int" }
+        }
+        Signal {
+            name: "hovered"
+            Parameter { name: "status"; type: "bool" }
+            Parameter { name: "index"; type: "int" }
+        }
+        Signal {
+            name: "pressed"
+            Parameter { name: "index"; type: "int" }
+        }
+        Signal {
+            name: "released"
+            Parameter { name: "index"; type: "int" }
+        }
+        Signal {
+            name: "doubleClicked"
+            Parameter { name: "index"; type: "int" }
+        }
+        Signal {
+            name: "colorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "borderColorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "labelColorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "valuesAdded"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "count"; type: "int" }
+        }
+        Signal {
+            name: "valuesRemoved"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "count"; type: "int" }
+        }
+        Signal {
+            name: "valueChanged"
+            Parameter { name: "index"; type: "int" }
+        }
+    }
+    Component {
+        name: "QtCharts::QBoxPlotModelMapper"
+        prototype: "QObject"
+        exports: ["QtCharts/BoxPlotModelMapper 2.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+    }
+    Component {
+        name: "QtCharts::QBoxPlotSeries"
+        prototype: "QtCharts::QAbstractSeries"
+        Property { name: "boxOutlineVisible"; type: "bool" }
+        Property { name: "boxWidth"; type: "double" }
+        Property { name: "pen"; type: "QPen" }
+        Property { name: "brush"; type: "QBrush" }
+        Property { name: "count"; revision: 1; type: "int"; isReadonly: true }
+        Signal {
+            name: "clicked"
+            Parameter { name: "boxset"; type: "QBoxSet"; isPointer: true }
+        }
+        Signal {
+            name: "hovered"
+            Parameter { name: "status"; type: "bool" }
+            Parameter { name: "boxset"; type: "QBoxSet"; isPointer: true }
+        }
+        Signal {
+            name: "pressed"
+            Parameter { name: "boxset"; type: "QBoxSet"; isPointer: true }
+        }
+        Signal {
+            name: "released"
+            Parameter { name: "boxset"; type: "QBoxSet"; isPointer: true }
+        }
+        Signal {
+            name: "doubleClicked"
+            Parameter { name: "boxset"; type: "QBoxSet"; isPointer: true }
+        }
+        Signal { name: "boxOutlineVisibilityChanged" }
+        Signal {
+            name: "boxsetsAdded"
+            Parameter { name: "sets"; type: "QList<QBoxSet*>" }
+        }
+        Signal {
+            name: "boxsetsRemoved"
+            Parameter { name: "sets"; type: "QList<QBoxSet*>" }
+        }
+    }
+    Component {
+        name: "QtCharts::QBoxSet"
+        prototype: "QObject"
+        Property { name: "pen"; type: "QPen" }
+        Property { name: "brush"; type: "QBrush" }
+        Signal { name: "clicked" }
+        Signal {
+            name: "hovered"
+            Parameter { name: "status"; type: "bool" }
+        }
+        Signal { name: "pressed" }
+        Signal { name: "released" }
+        Signal { name: "doubleClicked" }
+        Signal { name: "valuesChanged" }
+        Signal {
+            name: "valueChanged"
+            Parameter { name: "index"; type: "int" }
+        }
+        Signal { name: "cleared" }
+    }
+    Component {
+        name: "QtCharts::QCandlestickModelMapper"
+        prototype: "QObject"
+        exports: ["QtCharts/CandlestickModelMapper 2.2"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        Property { name: "model"; type: "QAbstractItemModel"; isPointer: true }
+        Property { name: "series"; type: "QtCharts::QCandlestickSeries"; isPointer: true }
+        Signal { name: "modelReplaced" }
+        Signal { name: "seriesReplaced" }
+    }
+    Component {
+        name: "QtCharts::QCandlestickSeries"
+        prototype: "QtCharts::QAbstractSeries"
+        Property { name: "count"; type: "int"; isReadonly: true }
+        Property { name: "maximumColumnWidth"; type: "double" }
+        Property { name: "minimumColumnWidth"; type: "double" }
+        Property { name: "bodyWidth"; type: "double" }
+        Property { name: "bodyOutlineVisible"; type: "bool" }
+        Property { name: "capsWidth"; type: "double" }
+        Property { name: "capsVisible"; type: "bool" }
+        Property { name: "increasingColor"; type: "QColor" }
+        Property { name: "decreasingColor"; type: "QColor" }
+        Property { name: "brush"; type: "QBrush" }
+        Property { name: "pen"; type: "QPen" }
+        Signal {
+            name: "clicked"
+            Parameter { name: "set"; type: "QCandlestickSet"; isPointer: true }
+        }
+        Signal {
+            name: "hovered"
+            Parameter { name: "status"; type: "bool" }
+            Parameter { name: "set"; type: "QCandlestickSet"; isPointer: true }
+        }
+        Signal {
+            name: "pressed"
+            Parameter { name: "set"; type: "QCandlestickSet"; isPointer: true }
+        }
+        Signal {
+            name: "released"
+            Parameter { name: "set"; type: "QCandlestickSet"; isPointer: true }
+        }
+        Signal {
+            name: "doubleClicked"
+            Parameter { name: "set"; type: "QCandlestickSet"; isPointer: true }
+        }
+        Signal {
+            name: "candlestickSetsAdded"
+            Parameter { name: "sets"; type: "QList<QCandlestickSet*>" }
+        }
+        Signal {
+            name: "candlestickSetsRemoved"
+            Parameter { name: "sets"; type: "QList<QCandlestickSet*>" }
+        }
+        Signal { name: "bodyOutlineVisibilityChanged" }
+        Signal { name: "capsVisibilityChanged" }
+    }
+    Component {
+        name: "QtCharts::QCandlestickSet"
+        prototype: "QObject"
+        Property { name: "timestamp"; type: "double" }
+        Property { name: "open"; type: "double" }
+        Property { name: "high"; type: "double" }
+        Property { name: "low"; type: "double" }
+        Property { name: "close"; type: "double" }
+        Property { name: "brush"; type: "QBrush" }
+        Property { name: "pen"; type: "QPen" }
+        Signal { name: "clicked" }
+        Signal {
+            name: "hovered"
+            Parameter { name: "status"; type: "bool" }
+        }
+        Signal { name: "pressed" }
+        Signal { name: "released" }
+        Signal { name: "doubleClicked" }
+    }
+    Component {
+        name: "QtCharts::QCategoryAxis"
+        prototype: "QtCharts::QValueAxis"
+        Enum {
+            name: "AxisLabelsPosition"
+            values: {
+                "AxisLabelsPositionCenter": 0,
+                "AxisLabelsPositionOnValue": 1
+            }
+        }
+        Property { name: "startValue"; type: "double" }
+        Property { name: "count"; type: "int"; isReadonly: true }
+        Property { name: "categoriesLabels"; type: "QStringList"; isReadonly: true }
+        Property { name: "labelsPosition"; type: "AxisLabelsPosition" }
+        Signal { name: "categoriesChanged" }
+        Signal {
+            name: "labelsPositionChanged"
+            Parameter { name: "position"; type: "QCategoryAxis::AxisLabelsPosition" }
+        }
+    }
+    Component {
+        name: "QtCharts::QDateTimeAxis"
+        prototype: "QtCharts::QAbstractAxis"
+        exports: ["QtCharts/DateTimeAxis 1.1", "QtCharts/DateTimeAxis 2.0"]
+        exportMetaObjectRevisions: [0, 0]
+        Property { name: "tickCount"; type: "int" }
+        Property { name: "min"; type: "QDateTime" }
+        Property { name: "max"; type: "QDateTime" }
+        Property { name: "format"; type: "string" }
+        Signal {
+            name: "minChanged"
+            Parameter { name: "min"; type: "QDateTime" }
+        }
+        Signal {
+            name: "maxChanged"
+            Parameter { name: "max"; type: "QDateTime" }
+        }
+        Signal {
+            name: "rangeChanged"
+            Parameter { name: "min"; type: "QDateTime" }
+            Parameter { name: "max"; type: "QDateTime" }
+        }
+        Signal {
+            name: "formatChanged"
+            Parameter { name: "format"; type: "string" }
+        }
+        Signal {
+            name: "tickCountChanged"
+            Parameter { name: "tick"; type: "int" }
+        }
+    }
+    Component {
+        name: "QtCharts::QHBarModelMapper"
+        prototype: "QtCharts::QBarModelMapper"
+        exports: [
+            "QtCharts/HBarModelMapper 1.0",
+            "QtCharts/HBarModelMapper 2.0"
+        ]
+        exportMetaObjectRevisions: [0, 0]
+        Property { name: "series"; type: "QtCharts::QAbstractBarSeries"; isPointer: true }
+        Property { name: "model"; type: "QAbstractItemModel"; isPointer: true }
+        Property { name: "firstBarSetRow"; type: "int" }
+        Property { name: "lastBarSetRow"; type: "int" }
+        Property { name: "firstColumn"; type: "int" }
+        Property { name: "columnCount"; type: "int" }
+        Signal { name: "seriesReplaced" }
+        Signal { name: "modelReplaced" }
+    }
+    Component {
+        name: "QtCharts::QHBoxPlotModelMapper"
+        prototype: "QtCharts::QBoxPlotModelMapper"
+        exports: ["QtCharts/HBoxPlotModelMapper 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "series"; type: "QtCharts::QBoxPlotSeries"; isPointer: true }
+        Property { name: "model"; type: "QAbstractItemModel"; isPointer: true }
+        Property { name: "firstBoxSetRow"; type: "int" }
+        Property { name: "lastBoxSetRow"; type: "int" }
+        Property { name: "firstColumn"; type: "int" }
+        Property { name: "columnCount"; type: "int" }
+        Signal { name: "seriesReplaced" }
+        Signal { name: "modelReplaced" }
+    }
+    Component {
+        name: "QtCharts::QHCandlestickModelMapper"
+        prototype: "QtCharts::QCandlestickModelMapper"
+        exports: ["QtCharts/HCandlestickModelMapper 2.2"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "timestampColumn"; type: "int" }
+        Property { name: "openColumn"; type: "int" }
+        Property { name: "highColumn"; type: "int" }
+        Property { name: "lowColumn"; type: "int" }
+        Property { name: "closeColumn"; type: "int" }
+        Property { name: "firstSetRow"; type: "int" }
+        Property { name: "lastSetRow"; type: "int" }
+    }
+    Component {
+        name: "QtCharts::QHPieModelMapper"
+        prototype: "QtCharts::QPieModelMapper"
+        exports: [
+            "QtCharts/HPieModelMapper 1.0",
+            "QtCharts/HPieModelMapper 2.0"
+        ]
+        exportMetaObjectRevisions: [0, 0]
+        Property { name: "series"; type: "QtCharts::QPieSeries"; isPointer: true }
+        Property { name: "model"; type: "QAbstractItemModel"; isPointer: true }
+        Property { name: "valuesRow"; type: "int" }
+        Property { name: "labelsRow"; type: "int" }
+        Property { name: "firstColumn"; type: "int" }
+        Property { name: "columnCount"; type: "int" }
+        Signal { name: "seriesReplaced" }
+        Signal { name: "modelReplaced" }
+    }
+    Component {
+        name: "QtCharts::QHXYModelMapper"
+        prototype: "QtCharts::QXYModelMapper"
+        exports: [
+            "QtCharts/HXYModelMapper 1.0",
+            "QtCharts/HXYModelMapper 2.0"
+        ]
+        exportMetaObjectRevisions: [0, 0]
+        Property { name: "series"; type: "QtCharts::QXYSeries"; isPointer: true }
+        Property { name: "model"; type: "QAbstractItemModel"; isPointer: true }
+        Property { name: "xRow"; type: "int" }
+        Property { name: "yRow"; type: "int" }
+        Property { name: "firstColumn"; type: "int" }
+        Property { name: "columnCount"; type: "int" }
+        Signal { name: "seriesReplaced" }
+        Signal { name: "modelReplaced" }
+    }
+    Component { name: "QtCharts::QHorizontalBarSeries"; prototype: "QtCharts::QAbstractBarSeries" }
+    Component {
+        name: "QtCharts::QHorizontalPercentBarSeries"
+        prototype: "QtCharts::QAbstractBarSeries"
+    }
+    Component {
+        name: "QtCharts::QHorizontalStackedBarSeries"
+        prototype: "QtCharts::QAbstractBarSeries"
+    }
+    Component {
+        name: "QtCharts::QLegend"
+        defaultProperty: "children"
+        prototype: "QGraphicsWidget"
+        exports: ["QtCharts/Legend 1.0", "QtCharts/Legend 2.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0, 0]
+        Enum {
+            name: "MarkerShape"
+            values: {
+                "MarkerShapeDefault": 0,
+                "MarkerShapeRectangle": 1,
+                "MarkerShapeCircle": 2,
+                "MarkerShapeFromSeries": 3
+            }
+        }
+        Property { name: "alignment"; type: "Qt::Alignment" }
+        Property { name: "backgroundVisible"; type: "bool" }
+        Property { name: "color"; type: "QColor" }
+        Property { name: "borderColor"; type: "QColor" }
+        Property { name: "font"; type: "QFont" }
+        Property { name: "labelColor"; type: "QColor" }
+        Property { name: "reverseMarkers"; type: "bool" }
+        Property { name: "showToolTips"; type: "bool" }
+        Property { name: "markerShape"; type: "MarkerShape" }
+        Signal {
+            name: "backgroundVisibleChanged"
+            Parameter { name: "visible"; type: "bool" }
+        }
+        Signal {
+            name: "colorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "borderColorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "fontChanged"
+            Parameter { name: "font"; type: "QFont" }
+        }
+        Signal {
+            name: "labelColorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "reverseMarkersChanged"
+            Parameter { name: "reverseMarkers"; type: "bool" }
+        }
+        Signal {
+            name: "showToolTipsChanged"
+            Parameter { name: "showToolTips"; type: "bool" }
+        }
+        Signal {
+            name: "markerShapeChanged"
+            Parameter { name: "shape"; type: "MarkerShape" }
+        }
+    }
+    Component { name: "QtCharts::QLineSeries"; prototype: "QtCharts::QXYSeries" }
+    Component {
+        name: "QtCharts::QLogValueAxis"
+        prototype: "QtCharts::QAbstractAxis"
+        exports: ["QtCharts/LogValueAxis 1.3", "QtCharts/LogValueAxis 2.0"]
+        exportMetaObjectRevisions: [0, 1]
+        Property { name: "min"; type: "double" }
+        Property { name: "max"; type: "double" }
+        Property { name: "labelFormat"; type: "string" }
+        Property { name: "base"; type: "double" }
+        Property { name: "tickCount"; type: "int"; isReadonly: true }
+        Property { name: "minorTickCount"; type: "int" }
+        Signal {
+            name: "minChanged"
+            Parameter { name: "min"; type: "double" }
+        }
+        Signal {
+            name: "maxChanged"
+            Parameter { name: "max"; type: "double" }
+        }
+        Signal {
+            name: "rangeChanged"
+            Parameter { name: "min"; type: "double" }
+            Parameter { name: "max"; type: "double" }
+        }
+        Signal {
+            name: "labelFormatChanged"
+            Parameter { name: "format"; type: "string" }
+        }
+        Signal {
+            name: "baseChanged"
+            Parameter { name: "base"; type: "double" }
+        }
+        Signal {
+            name: "tickCountChanged"
+            Parameter { name: "tickCount"; type: "int" }
+        }
+        Signal {
+            name: "minorTickCountChanged"
+            Parameter { name: "minorTickCount"; type: "int" }
+        }
+    }
+    Component { name: "QtCharts::QPercentBarSeries"; prototype: "QtCharts::QAbstractBarSeries" }
+    Component {
+        name: "QtCharts::QPieModelMapper"
+        prototype: "QObject"
+        exports: [
+            "QtCharts/PieModelMapper 1.0",
+            "QtCharts/PieModelMapper 2.0"
+        ]
+        isCreatable: false
+        exportMetaObjectRevisions: [0, 0]
+    }
+    Component {
+        name: "QtCharts::QPieSeries"
+        prototype: "QtCharts::QAbstractSeries"
+        exports: ["QtCharts/QPieSeries 1.0", "QtCharts/QPieSeries 2.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0, 0]
+        Property { name: "horizontalPosition"; type: "double" }
+        Property { name: "verticalPosition"; type: "double" }
+        Property { name: "size"; type: "double" }
+        Property { name: "startAngle"; type: "double" }
+        Property { name: "endAngle"; type: "double" }
+        Property { name: "count"; type: "int"; isReadonly: true }
+        Property { name: "sum"; type: "double"; isReadonly: true }
+        Property { name: "holeSize"; type: "double" }
+        Signal {
+            name: "added"
+            Parameter { name: "slices"; type: "QList<QPieSlice*>" }
+        }
+        Signal {
+            name: "removed"
+            Parameter { name: "slices"; type: "QList<QPieSlice*>" }
+        }
+        Signal {
+            name: "clicked"
+            Parameter { name: "slice"; type: "QPieSlice"; isPointer: true }
+        }
+        Signal {
+            name: "hovered"
+            Parameter { name: "slice"; type: "QPieSlice"; isPointer: true }
+            Parameter { name: "state"; type: "bool" }
+        }
+        Signal {
+            name: "pressed"
+            Parameter { name: "slice"; type: "QPieSlice"; isPointer: true }
+        }
+        Signal {
+            name: "released"
+            Parameter { name: "slice"; type: "QPieSlice"; isPointer: true }
+        }
+        Signal {
+            name: "doubleClicked"
+            Parameter { name: "slice"; type: "QPieSlice"; isPointer: true }
+        }
+    }
+    Component {
+        name: "QtCharts::QPieSlice"
+        prototype: "QObject"
+        exports: ["QtCharts/PieSlice 1.0", "QtCharts/PieSlice 2.0"]
+        exportMetaObjectRevisions: [0, 0]
+        Enum {
+            name: "LabelPosition"
+            values: {
+                "LabelOutside": 0,
+                "LabelInsideHorizontal": 1,
+                "LabelInsideTangential": 2,
+                "LabelInsideNormal": 3
+            }
+        }
+        Property { name: "label"; type: "string" }
+        Property { name: "value"; type: "double" }
+        Property { name: "labelVisible"; type: "bool" }
+        Property { name: "labelPosition"; type: "LabelPosition" }
+        Property { name: "exploded"; type: "bool" }
+        Property { name: "pen"; type: "QPen" }
+        Property { name: "borderColor"; type: "QColor" }
+        Property { name: "borderWidth"; type: "int" }
+        Property { name: "brush"; type: "QBrush" }
+        Property { name: "color"; type: "QColor" }
+        Property { name: "labelBrush"; type: "QBrush" }
+        Property { name: "labelColor"; type: "QColor" }
+        Property { name: "labelFont"; type: "QFont" }
+        Property { name: "labelArmLengthFactor"; type: "double" }
+        Property { name: "explodeDistanceFactor"; type: "double" }
+        Property { name: "percentage"; type: "double"; isReadonly: true }
+        Property { name: "startAngle"; type: "double"; isReadonly: true }
+        Property { name: "angleSpan"; type: "double"; isReadonly: true }
+        Signal { name: "clicked" }
+        Signal {
+            name: "hovered"
+            Parameter { name: "state"; type: "bool" }
+        }
+        Signal { name: "pressed" }
+        Signal { name: "released" }
+        Signal { name: "doubleClicked" }
+    }
+    Component {
+        name: "QtCharts::QScatterSeries"
+        prototype: "QtCharts::QXYSeries"
+        Enum {
+            name: "MarkerShape"
+            values: {
+                "MarkerShapeCircle": 0,
+                "MarkerShapeRectangle": 1
+            }
+        }
+        Property { name: "color"; type: "QColor" }
+        Property { name: "borderColor"; type: "QColor" }
+        Property { name: "markerShape"; type: "MarkerShape" }
+        Property { name: "markerSize"; type: "double" }
+        Property { name: "brush"; type: "QBrush" }
+        Signal {
+            name: "colorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "borderColorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "markerShapeChanged"
+            Parameter { name: "shape"; type: "MarkerShape" }
+        }
+        Signal {
+            name: "markerSizeChanged"
+            Parameter { name: "size"; type: "double" }
+        }
+    }
+    Component { name: "QtCharts::QSplineSeries"; prototype: "QtCharts::QLineSeries" }
+    Component { name: "QtCharts::QStackedBarSeries"; prototype: "QtCharts::QAbstractBarSeries" }
+    Component {
+        name: "QtCharts::QVBarModelMapper"
+        prototype: "QtCharts::QBarModelMapper"
+        exports: [
+            "QtCharts/VBarModelMapper 1.0",
+            "QtCharts/VBarModelMapper 2.0"
+        ]
+        exportMetaObjectRevisions: [0, 0]
+        Property { name: "series"; type: "QtCharts::QAbstractBarSeries"; isPointer: true }
+        Property { name: "model"; type: "QAbstractItemModel"; isPointer: true }
+        Property { name: "firstBarSetColumn"; type: "int" }
+        Property { name: "lastBarSetColumn"; type: "int" }
+        Property { name: "firstRow"; type: "int" }
+        Property { name: "rowCount"; type: "int" }
+        Signal { name: "seriesReplaced" }
+        Signal { name: "modelReplaced" }
+    }
+    Component {
+        name: "QtCharts::QVBoxPlotModelMapper"
+        prototype: "QtCharts::QBoxPlotModelMapper"
+        exports: ["QtCharts/VBoxPlotModelMapper 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "series"; type: "QtCharts::QBoxPlotSeries"; isPointer: true }
+        Property { name: "model"; type: "QAbstractItemModel"; isPointer: true }
+        Property { name: "firstBoxSetColumn"; type: "int" }
+        Property { name: "lastBoxSetColumn"; type: "int" }
+        Property { name: "firstRow"; type: "int" }
+        Property { name: "rowCount"; type: "int" }
+        Signal { name: "seriesReplaced" }
+        Signal { name: "modelReplaced" }
+    }
+    Component {
+        name: "QtCharts::QVCandlestickModelMapper"
+        prototype: "QtCharts::QCandlestickModelMapper"
+        exports: ["QtCharts/VCandlestickModelMapper 2.2"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "timestampRow"; type: "int" }
+        Property { name: "openRow"; type: "int" }
+        Property { name: "highRow"; type: "int" }
+        Property { name: "lowRow"; type: "int" }
+        Property { name: "closeRow"; type: "int" }
+        Property { name: "firstSetColumn"; type: "int" }
+        Property { name: "lastSetColumn"; type: "int" }
+    }
+    Component {
+        name: "QtCharts::QVPieModelMapper"
+        prototype: "QtCharts::QPieModelMapper"
+        exports: [
+            "QtCharts/VPieModelMapper 1.0",
+            "QtCharts/VPieModelMapper 2.0"
+        ]
+        exportMetaObjectRevisions: [0, 0]
+        Property { name: "series"; type: "QtCharts::QPieSeries"; isPointer: true }
+        Property { name: "model"; type: "QAbstractItemModel"; isPointer: true }
+        Property { name: "valuesColumn"; type: "int" }
+        Property { name: "labelsColumn"; type: "int" }
+        Property { name: "firstRow"; type: "int" }
+        Property { name: "rowCount"; type: "int" }
+        Signal { name: "seriesReplaced" }
+        Signal { name: "modelReplaced" }
+    }
+    Component {
+        name: "QtCharts::QVXYModelMapper"
+        prototype: "QtCharts::QXYModelMapper"
+        exports: [
+            "QtCharts/VXYModelMapper 1.0",
+            "QtCharts/VXYModelMapper 2.0"
+        ]
+        exportMetaObjectRevisions: [0, 0]
+        Property { name: "series"; type: "QtCharts::QXYSeries"; isPointer: true }
+        Property { name: "model"; type: "QAbstractItemModel"; isPointer: true }
+        Property { name: "xColumn"; type: "int" }
+        Property { name: "yColumn"; type: "int" }
+        Property { name: "firstRow"; type: "int" }
+        Property { name: "rowCount"; type: "int" }
+        Signal { name: "seriesReplaced" }
+        Signal { name: "modelReplaced" }
+    }
+    Component {
+        name: "QtCharts::QValueAxis"
+        prototype: "QtCharts::QAbstractAxis"
+        exports: [
+            "QtCharts/ValueAxis 1.1",
+            "QtCharts/ValueAxis 2.0",
+            "QtCharts/ValueAxis 2.3",
+            "QtCharts/ValuesAxis 1.0"
+        ]
+        exportMetaObjectRevisions: [0, 0, 1, 0]
+        Enum {
+            name: "TickType"
+            values: {
+                "TicksDynamic": 0,
+                "TicksFixed": 1
+            }
+        }
+        Property { name: "tickCount"; type: "int" }
+        Property { name: "min"; type: "double" }
+        Property { name: "max"; type: "double" }
+        Property { name: "labelFormat"; type: "string" }
+        Property { name: "minorTickCount"; type: "int" }
+        Property { name: "tickAnchor"; revision: 1; type: "double" }
+        Property { name: "tickInterval"; revision: 1; type: "double" }
+        Property { name: "tickType"; revision: 1; type: "TickType" }
+        Signal {
+            name: "minChanged"
+            Parameter { name: "min"; type: "double" }
+        }
+        Signal {
+            name: "maxChanged"
+            Parameter { name: "max"; type: "double" }
+        }
+        Signal {
+            name: "rangeChanged"
+            Parameter { name: "min"; type: "double" }
+            Parameter { name: "max"; type: "double" }
+        }
+        Signal {
+            name: "tickCountChanged"
+            Parameter { name: "tickCount"; type: "int" }
+        }
+        Signal {
+            name: "minorTickCountChanged"
+            Parameter { name: "tickCount"; type: "int" }
+        }
+        Signal {
+            name: "labelFormatChanged"
+            Parameter { name: "format"; type: "string" }
+        }
+        Signal {
+            name: "tickIntervalChanged"
+            revision: 1
+            Parameter { name: "interval"; type: "double" }
+        }
+        Signal {
+            name: "tickAnchorChanged"
+            revision: 1
+            Parameter { name: "anchor"; type: "double" }
+        }
+        Signal {
+            name: "tickTypeChanged"
+            revision: 1
+            Parameter { name: "type"; type: "QValueAxis::TickType" }
+        }
+        Method { name: "applyNiceNumbers" }
+    }
+    Component {
+        name: "QtCharts::QXYModelMapper"
+        prototype: "QObject"
+        exports: ["QtCharts/XYModelMapper 1.0", "QtCharts/XYModelMapper 2.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0, 0]
+    }
+    Component {
+        name: "QtCharts::QXYSeries"
+        prototype: "QtCharts::QAbstractSeries"
+        exports: ["QtCharts/XYSeries 1.0", "QtCharts/XYSeries 2.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0, 0]
+        Property { name: "pointsVisible"; type: "bool" }
+        Property { name: "color"; type: "QColor" }
+        Property { name: "pointLabelsFormat"; type: "string" }
+        Property { name: "pointLabelsVisible"; type: "bool" }
+        Property { name: "pointLabelsFont"; type: "QFont" }
+        Property { name: "pointLabelsColor"; type: "QColor" }
+        Property { name: "pointLabelsClipping"; type: "bool" }
+        Signal {
+            name: "clicked"
+            Parameter { name: "point"; type: "QPointF" }
+        }
+        Signal {
+            name: "hovered"
+            Parameter { name: "point"; type: "QPointF" }
+            Parameter { name: "state"; type: "bool" }
+        }
+        Signal {
+            name: "pressed"
+            Parameter { name: "point"; type: "QPointF" }
+        }
+        Signal {
+            name: "released"
+            Parameter { name: "point"; type: "QPointF" }
+        }
+        Signal {
+            name: "doubleClicked"
+            Parameter { name: "point"; type: "QPointF" }
+        }
+        Signal {
+            name: "pointReplaced"
+            Parameter { name: "index"; type: "int" }
+        }
+        Signal {
+            name: "pointRemoved"
+            Parameter { name: "index"; type: "int" }
+        }
+        Signal {
+            name: "pointAdded"
+            Parameter { name: "index"; type: "int" }
+        }
+        Signal {
+            name: "colorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal { name: "pointsReplaced" }
+        Signal {
+            name: "pointLabelsFormatChanged"
+            Parameter { name: "format"; type: "string" }
+        }
+        Signal {
+            name: "pointLabelsVisibilityChanged"
+            Parameter { name: "visible"; type: "bool" }
+        }
+        Signal {
+            name: "pointLabelsFontChanged"
+            Parameter { name: "font"; type: "QFont" }
+        }
+        Signal {
+            name: "pointLabelsColorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "pointLabelsClippingChanged"
+            Parameter { name: "clipping"; type: "bool" }
+        }
+        Signal {
+            name: "pointsRemoved"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "count"; type: "int" }
+        }
+        Signal {
+            name: "penChanged"
+            Parameter { name: "pen"; type: "QPen" }
+        }
+    }
+}
diff --git a/deployment_test/QtCharts/qmldir b/deployment_test/QtCharts/qmldir
new file mode 100644
index 0000000000000000000000000000000000000000..10f4c598eb699c4a986d95608b757fe2f5124b51
--- /dev/null
+++ b/deployment_test/QtCharts/qmldir
@@ -0,0 +1,4 @@
+module QtCharts
+plugin qtchartsqml2
+classname QtChartsQml2Plugin
+
diff --git a/deployment_test/QtCharts/qtchartsqml2.dll b/deployment_test/QtCharts/qtchartsqml2.dll
new file mode 100644
index 0000000000000000000000000000000000000000..48a63ab32ea09d0f251417d898a41157b5c9e313
Binary files /dev/null and b/deployment_test/QtCharts/qtchartsqml2.dll differ
diff --git a/deployment_test/QtDataVisualization/datavisualizationqml2.dll b/deployment_test/QtDataVisualization/datavisualizationqml2.dll
new file mode 100644
index 0000000000000000000000000000000000000000..82903d7a78f4c4a6f66d29c340402da8a47cb05e
Binary files /dev/null and b/deployment_test/QtDataVisualization/datavisualizationqml2.dll differ
diff --git a/deployment_test/QtDataVisualization/plugins.qmltypes b/deployment_test/QtDataVisualization/plugins.qmltypes
new file mode 100644
index 0000000000000000000000000000000000000000..69a48706e76c6b41a03aa26899fa152af88c4e43
--- /dev/null
+++ b/deployment_test/QtDataVisualization/plugins.qmltypes
@@ -0,0 +1,2375 @@
+import QtQuick.tooling 1.2
+
+// This file describes the plugin-supplied types contained in the library.
+// It is used for QML tooling purposes only.
+//
+// This file was auto-generated by:
+// 'qmlplugindump -nonrelocatable -defaultplatform QtDataVisualization 1.14'
+
+Module {
+    dependencies: ["QtQuick 2.0"]
+    Component {
+        name: "QAbstractItemModel"
+        prototype: "QObject"
+        exports: ["QtDataVisualization/AbstractItemModel 1.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        Enum {
+            name: "LayoutChangeHint"
+            values: {
+                "NoLayoutChangeHint": 0,
+                "VerticalSortHint": 1,
+                "HorizontalSortHint": 2
+            }
+        }
+        Enum {
+            name: "CheckIndexOption"
+            values: {
+                "NoOption": 0,
+                "IndexIsValid": 1,
+                "DoNotUseParent": 2,
+                "ParentIsInvalid": 4
+            }
+        }
+        Signal {
+            name: "dataChanged"
+            Parameter { name: "topLeft"; type: "QModelIndex" }
+            Parameter { name: "bottomRight"; type: "QModelIndex" }
+            Parameter { name: "roles"; type: "QVector<int>" }
+        }
+        Signal {
+            name: "dataChanged"
+            Parameter { name: "topLeft"; type: "QModelIndex" }
+            Parameter { name: "bottomRight"; type: "QModelIndex" }
+        }
+        Signal {
+            name: "headerDataChanged"
+            Parameter { name: "orientation"; type: "Qt::Orientation" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "layoutChanged"
+            Parameter { name: "parents"; type: "QList<QPersistentModelIndex>" }
+            Parameter { name: "hint"; type: "QAbstractItemModel::LayoutChangeHint" }
+        }
+        Signal {
+            name: "layoutChanged"
+            Parameter { name: "parents"; type: "QList<QPersistentModelIndex>" }
+        }
+        Signal { name: "layoutChanged" }
+        Signal {
+            name: "layoutAboutToBeChanged"
+            Parameter { name: "parents"; type: "QList<QPersistentModelIndex>" }
+            Parameter { name: "hint"; type: "QAbstractItemModel::LayoutChangeHint" }
+        }
+        Signal {
+            name: "layoutAboutToBeChanged"
+            Parameter { name: "parents"; type: "QList<QPersistentModelIndex>" }
+        }
+        Signal { name: "layoutAboutToBeChanged" }
+        Signal {
+            name: "rowsAboutToBeInserted"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "rowsInserted"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "rowsAboutToBeRemoved"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "rowsRemoved"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "columnsAboutToBeInserted"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "columnsInserted"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "columnsAboutToBeRemoved"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "columnsRemoved"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal { name: "modelAboutToBeReset" }
+        Signal { name: "modelReset" }
+        Signal {
+            name: "rowsAboutToBeMoved"
+            Parameter { name: "sourceParent"; type: "QModelIndex" }
+            Parameter { name: "sourceStart"; type: "int" }
+            Parameter { name: "sourceEnd"; type: "int" }
+            Parameter { name: "destinationParent"; type: "QModelIndex" }
+            Parameter { name: "destinationRow"; type: "int" }
+        }
+        Signal {
+            name: "rowsMoved"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "start"; type: "int" }
+            Parameter { name: "end"; type: "int" }
+            Parameter { name: "destination"; type: "QModelIndex" }
+            Parameter { name: "row"; type: "int" }
+        }
+        Signal {
+            name: "columnsAboutToBeMoved"
+            Parameter { name: "sourceParent"; type: "QModelIndex" }
+            Parameter { name: "sourceStart"; type: "int" }
+            Parameter { name: "sourceEnd"; type: "int" }
+            Parameter { name: "destinationParent"; type: "QModelIndex" }
+            Parameter { name: "destinationColumn"; type: "int" }
+        }
+        Signal {
+            name: "columnsMoved"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "start"; type: "int" }
+            Parameter { name: "end"; type: "int" }
+            Parameter { name: "destination"; type: "QModelIndex" }
+            Parameter { name: "column"; type: "int" }
+        }
+        Method { name: "submit"; type: "bool" }
+        Method { name: "revert" }
+        Method {
+            name: "hasIndex"
+            type: "bool"
+            Parameter { name: "row"; type: "int" }
+            Parameter { name: "column"; type: "int" }
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method {
+            name: "hasIndex"
+            type: "bool"
+            Parameter { name: "row"; type: "int" }
+            Parameter { name: "column"; type: "int" }
+        }
+        Method {
+            name: "index"
+            type: "QModelIndex"
+            Parameter { name: "row"; type: "int" }
+            Parameter { name: "column"; type: "int" }
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method {
+            name: "index"
+            type: "QModelIndex"
+            Parameter { name: "row"; type: "int" }
+            Parameter { name: "column"; type: "int" }
+        }
+        Method {
+            name: "parent"
+            type: "QModelIndex"
+            Parameter { name: "child"; type: "QModelIndex" }
+        }
+        Method {
+            name: "sibling"
+            type: "QModelIndex"
+            Parameter { name: "row"; type: "int" }
+            Parameter { name: "column"; type: "int" }
+            Parameter { name: "idx"; type: "QModelIndex" }
+        }
+        Method {
+            name: "rowCount"
+            type: "int"
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method { name: "rowCount"; type: "int" }
+        Method {
+            name: "columnCount"
+            type: "int"
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method { name: "columnCount"; type: "int" }
+        Method {
+            name: "hasChildren"
+            type: "bool"
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method { name: "hasChildren"; type: "bool" }
+        Method {
+            name: "data"
+            type: "QVariant"
+            Parameter { name: "index"; type: "QModelIndex" }
+            Parameter { name: "role"; type: "int" }
+        }
+        Method {
+            name: "data"
+            type: "QVariant"
+            Parameter { name: "index"; type: "QModelIndex" }
+        }
+        Method {
+            name: "setData"
+            type: "bool"
+            Parameter { name: "index"; type: "QModelIndex" }
+            Parameter { name: "value"; type: "QVariant" }
+            Parameter { name: "role"; type: "int" }
+        }
+        Method {
+            name: "setData"
+            type: "bool"
+            Parameter { name: "index"; type: "QModelIndex" }
+            Parameter { name: "value"; type: "QVariant" }
+        }
+        Method {
+            name: "headerData"
+            type: "QVariant"
+            Parameter { name: "section"; type: "int" }
+            Parameter { name: "orientation"; type: "Qt::Orientation" }
+            Parameter { name: "role"; type: "int" }
+        }
+        Method {
+            name: "headerData"
+            type: "QVariant"
+            Parameter { name: "section"; type: "int" }
+            Parameter { name: "orientation"; type: "Qt::Orientation" }
+        }
+        Method {
+            name: "fetchMore"
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method {
+            name: "canFetchMore"
+            type: "bool"
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method {
+            name: "flags"
+            type: "Qt::ItemFlags"
+            Parameter { name: "index"; type: "QModelIndex" }
+        }
+        Method {
+            name: "match"
+            type: "QModelIndexList"
+            Parameter { name: "start"; type: "QModelIndex" }
+            Parameter { name: "role"; type: "int" }
+            Parameter { name: "value"; type: "QVariant" }
+            Parameter { name: "hits"; type: "int" }
+            Parameter { name: "flags"; type: "Qt::MatchFlags" }
+        }
+        Method {
+            name: "match"
+            type: "QModelIndexList"
+            Parameter { name: "start"; type: "QModelIndex" }
+            Parameter { name: "role"; type: "int" }
+            Parameter { name: "value"; type: "QVariant" }
+            Parameter { name: "hits"; type: "int" }
+        }
+        Method {
+            name: "match"
+            type: "QModelIndexList"
+            Parameter { name: "start"; type: "QModelIndex" }
+            Parameter { name: "role"; type: "int" }
+            Parameter { name: "value"; type: "QVariant" }
+        }
+    }
+    Component {
+        name: "QtDataVisualization::AbstractDeclarative"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        exports: [
+            "QtDataVisualization/AbstractGraph3D 1.0",
+            "QtDataVisualization/AbstractGraph3D 1.1",
+            "QtDataVisualization/AbstractGraph3D 1.2"
+        ]
+        isCreatable: false
+        exportMetaObjectRevisions: [0, 1, 2]
+        Enum {
+            name: "SelectionFlag"
+            values: {
+                "SelectionNone": 0,
+                "SelectionItem": 1,
+                "SelectionRow": 2,
+                "SelectionItemAndRow": 3,
+                "SelectionColumn": 4,
+                "SelectionItemAndColumn": 5,
+                "SelectionRowAndColumn": 6,
+                "SelectionItemRowAndColumn": 7,
+                "SelectionSlice": 8,
+                "SelectionMultiSeries": 16
+            }
+        }
+        Enum {
+            name: "SelectionFlags"
+            values: {
+                "SelectionNone": 0,
+                "SelectionItem": 1,
+                "SelectionRow": 2,
+                "SelectionItemAndRow": 3,
+                "SelectionColumn": 4,
+                "SelectionItemAndColumn": 5,
+                "SelectionRowAndColumn": 6,
+                "SelectionItemRowAndColumn": 7,
+                "SelectionSlice": 8,
+                "SelectionMultiSeries": 16
+            }
+        }
+        Enum {
+            name: "ShadowQuality"
+            values: {
+                "ShadowQualityNone": 0,
+                "ShadowQualityLow": 1,
+                "ShadowQualityMedium": 2,
+                "ShadowQualityHigh": 3,
+                "ShadowQualitySoftLow": 4,
+                "ShadowQualitySoftMedium": 5,
+                "ShadowQualitySoftHigh": 6
+            }
+        }
+        Enum {
+            name: "ElementType"
+            values: {
+                "ElementNone": 0,
+                "ElementSeries": 1,
+                "ElementAxisXLabel": 2,
+                "ElementAxisYLabel": 3,
+                "ElementAxisZLabel": 4,
+                "ElementCustomItem": 5
+            }
+        }
+        Enum {
+            name: "RenderingMode"
+            values: {
+                "RenderDirectToBackground": 0,
+                "RenderDirectToBackground_NoClear": 1,
+                "RenderIndirect": 2
+            }
+        }
+        Enum {
+            name: "OptimizationHint"
+            values: {
+                "OptimizationDefault": 0,
+                "OptimizationStatic": 1
+            }
+        }
+        Enum {
+            name: "OptimizationHints"
+            values: {
+                "OptimizationDefault": 0,
+                "OptimizationStatic": 1
+            }
+        }
+        Property { name: "selectionMode"; type: "SelectionFlags" }
+        Property { name: "shadowQuality"; type: "ShadowQuality" }
+        Property { name: "shadowsSupported"; type: "bool"; isReadonly: true }
+        Property { name: "msaaSamples"; type: "int" }
+        Property { name: "scene"; type: "Declarative3DScene"; isReadonly: true; isPointer: true }
+        Property { name: "inputHandler"; type: "QAbstract3DInputHandler"; isPointer: true }
+        Property { name: "theme"; type: "Q3DTheme"; isPointer: true }
+        Property { name: "renderingMode"; type: "RenderingMode" }
+        Property { name: "measureFps"; revision: 1; type: "bool" }
+        Property { name: "currentFps"; revision: 1; type: "double"; isReadonly: true }
+        Property {
+            name: "customItemList"
+            revision: 1
+            type: "QCustom3DItem"
+            isList: true
+            isReadonly: true
+        }
+        Property { name: "orthoProjection"; revision: 1; type: "bool" }
+        Property { name: "selectedElement"; revision: 1; type: "ElementType"; isReadonly: true }
+        Property { name: "aspectRatio"; revision: 1; type: "double" }
+        Property { name: "optimizationHints"; revision: 1; type: "OptimizationHints" }
+        Property { name: "polar"; revision: 2; type: "bool" }
+        Property { name: "radialLabelOffset"; revision: 2; type: "float" }
+        Property { name: "horizontalAspectRatio"; revision: 2; type: "double" }
+        Property { name: "reflection"; revision: 2; type: "bool" }
+        Property { name: "reflectivity"; revision: 2; type: "double" }
+        Property { name: "locale"; revision: 2; type: "QLocale" }
+        Property { name: "queriedGraphPosition"; revision: 2; type: "QVector3D"; isReadonly: true }
+        Property { name: "margin"; revision: 2; type: "double" }
+        Signal {
+            name: "selectionModeChanged"
+            Parameter { name: "mode"; type: "AbstractDeclarative::SelectionFlags" }
+        }
+        Signal {
+            name: "shadowQualityChanged"
+            Parameter { name: "quality"; type: "AbstractDeclarative::ShadowQuality" }
+        }
+        Signal {
+            name: "shadowsSupportedChanged"
+            Parameter { name: "supported"; type: "bool" }
+        }
+        Signal {
+            name: "msaaSamplesChanged"
+            Parameter { name: "samples"; type: "int" }
+        }
+        Signal {
+            name: "sceneChanged"
+            Parameter { name: "scene"; type: "Q3DScene"; isPointer: true }
+        }
+        Signal {
+            name: "inputHandlerChanged"
+            Parameter { name: "inputHandler"; type: "QAbstract3DInputHandler"; isPointer: true }
+        }
+        Signal {
+            name: "themeChanged"
+            Parameter { name: "theme"; type: "Q3DTheme"; isPointer: true }
+        }
+        Signal {
+            name: "renderingModeChanged"
+            Parameter { name: "mode"; type: "AbstractDeclarative::RenderingMode" }
+        }
+        Signal {
+            name: "measureFpsChanged"
+            revision: 1
+            Parameter { name: "enabled"; type: "bool" }
+        }
+        Signal {
+            name: "currentFpsChanged"
+            revision: 1
+            Parameter { name: "fps"; type: "double" }
+        }
+        Signal {
+            name: "selectedElementChanged"
+            revision: 1
+            Parameter { name: "type"; type: "AbstractDeclarative::ElementType" }
+        }
+        Signal {
+            name: "orthoProjectionChanged"
+            revision: 1
+            Parameter { name: "enabled"; type: "bool" }
+        }
+        Signal {
+            name: "aspectRatioChanged"
+            revision: 1
+            Parameter { name: "ratio"; type: "double" }
+        }
+        Signal {
+            name: "optimizationHintsChanged"
+            revision: 1
+            Parameter { name: "hints"; type: "AbstractDeclarative::OptimizationHints" }
+        }
+        Signal {
+            name: "polarChanged"
+            revision: 2
+            Parameter { name: "enabled"; type: "bool" }
+        }
+        Signal {
+            name: "radialLabelOffsetChanged"
+            revision: 2
+            Parameter { name: "offset"; type: "float" }
+        }
+        Signal {
+            name: "horizontalAspectRatioChanged"
+            revision: 2
+            Parameter { name: "ratio"; type: "double" }
+        }
+        Signal {
+            name: "reflectionChanged"
+            revision: 2
+            Parameter { name: "enabled"; type: "bool" }
+        }
+        Signal {
+            name: "reflectivityChanged"
+            revision: 2
+            Parameter { name: "reflectivity"; type: "double" }
+        }
+        Signal {
+            name: "localeChanged"
+            revision: 2
+            Parameter { name: "locale"; type: "QLocale" }
+        }
+        Signal {
+            name: "queriedGraphPositionChanged"
+            revision: 2
+            Parameter { name: "data"; type: "QVector3D" }
+        }
+        Signal {
+            name: "marginChanged"
+            revision: 2
+            Parameter { name: "margin"; type: "double" }
+        }
+        Method {
+            name: "handleAxisXChanged"
+            Parameter { name: "axis"; type: "QAbstract3DAxis"; isPointer: true }
+        }
+        Method {
+            name: "handleAxisYChanged"
+            Parameter { name: "axis"; type: "QAbstract3DAxis"; isPointer: true }
+        }
+        Method {
+            name: "handleAxisZChanged"
+            Parameter { name: "axis"; type: "QAbstract3DAxis"; isPointer: true }
+        }
+        Method {
+            name: "windowDestroyed"
+            Parameter { name: "obj"; type: "QObject"; isPointer: true }
+        }
+        Method { name: "destroyContext" }
+        Method { name: "clearSelection" }
+        Method {
+            name: "addCustomItem"
+            revision: 1
+            type: "int"
+            Parameter { name: "item"; type: "QCustom3DItem"; isPointer: true }
+        }
+        Method { name: "removeCustomItems"; revision: 1 }
+        Method {
+            name: "removeCustomItem"
+            revision: 1
+            Parameter { name: "item"; type: "QCustom3DItem"; isPointer: true }
+        }
+        Method {
+            name: "removeCustomItemAt"
+            revision: 1
+            Parameter { name: "position"; type: "QVector3D" }
+        }
+        Method {
+            name: "releaseCustomItem"
+            revision: 1
+            Parameter { name: "item"; type: "QCustom3DItem"; isPointer: true }
+        }
+        Method { name: "selectedLabelIndex"; revision: 1; type: "int" }
+        Method { name: "selectedAxis"; revision: 1; type: "QAbstract3DAxis*" }
+        Method { name: "selectedCustomItemIndex"; revision: 1; type: "int" }
+        Method { name: "selectedCustomItem"; revision: 1; type: "QCustom3DItem*" }
+    }
+    Component {
+        name: "QtDataVisualization::ColorGradient"
+        defaultProperty: "stops"
+        prototype: "QObject"
+        exports: ["QtDataVisualization/ColorGradient 1.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "stops"; type: "ColorGradientStop"; isList: true; isReadonly: true }
+        Signal { name: "updated" }
+    }
+    Component {
+        name: "QtDataVisualization::ColorGradientStop"
+        prototype: "QObject"
+        exports: ["QtDataVisualization/ColorGradientStop 1.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "position"; type: "double" }
+        Property { name: "color"; type: "QColor" }
+        Signal {
+            name: "positionChanged"
+            Parameter { name: "position"; type: "double" }
+        }
+        Signal {
+            name: "colorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+    }
+    Component {
+        name: "QtDataVisualization::Declarative3DScene"
+        prototype: "QtDataVisualization::Q3DScene"
+        exports: [
+            "QtDataVisualization/Scene3D 1.0",
+            "QtDataVisualization/Scene3D 1.2"
+        ]
+        isCreatable: false
+        exportMetaObjectRevisions: [0, 1]
+        Property { name: "selectionQueryPosition"; type: "QPointF" }
+        Property { name: "invalidSelectionPoint"; type: "QPoint"; isReadonly: true }
+        Signal {
+            name: "selectionQueryPositionChanged"
+            Parameter { name: "position"; type: "QPointF" }
+        }
+    }
+    Component {
+        name: "QtDataVisualization::DeclarativeBar3DSeries"
+        defaultProperty: "seriesChildren"
+        prototype: "QtDataVisualization::QBar3DSeries"
+        exports: ["QtDataVisualization/Bar3DSeries 1.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "seriesChildren"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "selectedBar"; type: "QPointF" }
+        Property { name: "invalidSelectionPosition"; type: "QPointF"; isReadonly: true }
+        Property { name: "baseGradient"; type: "ColorGradient"; isPointer: true }
+        Property { name: "singleHighlightGradient"; type: "ColorGradient"; isPointer: true }
+        Property { name: "multiHighlightGradient"; type: "ColorGradient"; isPointer: true }
+        Signal {
+            name: "selectedBarChanged"
+            Parameter { name: "position"; type: "QPointF" }
+        }
+        Signal {
+            name: "baseGradientChanged"
+            Parameter { name: "gradient"; type: "ColorGradient"; isPointer: true }
+        }
+        Signal {
+            name: "singleHighlightGradientChanged"
+            Parameter { name: "gradient"; type: "ColorGradient"; isPointer: true }
+        }
+        Signal {
+            name: "multiHighlightGradientChanged"
+            Parameter { name: "gradient"; type: "ColorGradient"; isPointer: true }
+        }
+        Method { name: "handleBaseGradientUpdate" }
+        Method { name: "handleSingleHighlightGradientUpdate" }
+        Method { name: "handleMultiHighlightGradientUpdate" }
+    }
+    Component {
+        name: "QtDataVisualization::DeclarativeBars"
+        defaultProperty: "seriesList"
+        prototype: "QtDataVisualization::AbstractDeclarative"
+        exports: [
+            "QtDataVisualization/Bars3D 1.0",
+            "QtDataVisualization/Bars3D 1.2"
+        ]
+        exportMetaObjectRevisions: [0, 1]
+        Property { name: "rowAxis"; type: "QCategory3DAxis"; isPointer: true }
+        Property { name: "valueAxis"; type: "QValue3DAxis"; isPointer: true }
+        Property { name: "columnAxis"; type: "QCategory3DAxis"; isPointer: true }
+        Property { name: "multiSeriesUniform"; type: "bool" }
+        Property { name: "barThickness"; type: "float" }
+        Property { name: "barSpacing"; type: "QSizeF" }
+        Property { name: "barSpacingRelative"; type: "bool" }
+        Property { name: "seriesList"; type: "QBar3DSeries"; isList: true; isReadonly: true }
+        Property { name: "selectedSeries"; type: "QBar3DSeries"; isReadonly: true; isPointer: true }
+        Property { name: "primarySeries"; type: "QBar3DSeries"; isPointer: true }
+        Property { name: "floorLevel"; revision: 1; type: "float" }
+        Signal {
+            name: "rowAxisChanged"
+            Parameter { name: "axis"; type: "QCategory3DAxis"; isPointer: true }
+        }
+        Signal {
+            name: "valueAxisChanged"
+            Parameter { name: "axis"; type: "QValue3DAxis"; isPointer: true }
+        }
+        Signal {
+            name: "columnAxisChanged"
+            Parameter { name: "axis"; type: "QCategory3DAxis"; isPointer: true }
+        }
+        Signal {
+            name: "multiSeriesUniformChanged"
+            Parameter { name: "uniform"; type: "bool" }
+        }
+        Signal {
+            name: "barThicknessChanged"
+            Parameter { name: "thicknessRatio"; type: "float" }
+        }
+        Signal {
+            name: "barSpacingChanged"
+            Parameter { name: "spacing"; type: "QSizeF" }
+        }
+        Signal {
+            name: "barSpacingRelativeChanged"
+            Parameter { name: "relative"; type: "bool" }
+        }
+        Signal {
+            name: "meshFileNameChanged"
+            Parameter { name: "filename"; type: "string" }
+        }
+        Signal {
+            name: "primarySeriesChanged"
+            Parameter { name: "series"; type: "QBar3DSeries"; isPointer: true }
+        }
+        Signal {
+            name: "selectedSeriesChanged"
+            Parameter { name: "series"; type: "QBar3DSeries"; isPointer: true }
+        }
+        Signal {
+            name: "floorLevelChanged"
+            revision: 1
+            Parameter { name: "level"; type: "float" }
+        }
+        Method {
+            name: "handleAxisXChanged"
+            Parameter { name: "axis"; type: "QAbstract3DAxis"; isPointer: true }
+        }
+        Method {
+            name: "handleAxisYChanged"
+            Parameter { name: "axis"; type: "QAbstract3DAxis"; isPointer: true }
+        }
+        Method {
+            name: "handleAxisZChanged"
+            Parameter { name: "axis"; type: "QAbstract3DAxis"; isPointer: true }
+        }
+        Method {
+            name: "addSeries"
+            Parameter { name: "series"; type: "QBar3DSeries"; isPointer: true }
+        }
+        Method {
+            name: "removeSeries"
+            Parameter { name: "series"; type: "QBar3DSeries"; isPointer: true }
+        }
+        Method {
+            name: "insertSeries"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "series"; type: "QBar3DSeries"; isPointer: true }
+        }
+    }
+    Component {
+        name: "QtDataVisualization::DeclarativeColor"
+        prototype: "QObject"
+        exports: ["QtDataVisualization/ThemeColor 1.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "color"; type: "QColor" }
+        Signal {
+            name: "colorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+    }
+    Component {
+        name: "QtDataVisualization::DeclarativeScatter"
+        defaultProperty: "seriesList"
+        prototype: "QtDataVisualization::AbstractDeclarative"
+        exports: ["QtDataVisualization/Scatter3D 1.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "axisX"; type: "QValue3DAxis"; isPointer: true }
+        Property { name: "axisY"; type: "QValue3DAxis"; isPointer: true }
+        Property { name: "axisZ"; type: "QValue3DAxis"; isPointer: true }
+        Property { name: "selectedSeries"; type: "QScatter3DSeries"; isReadonly: true; isPointer: true }
+        Property { name: "seriesList"; type: "QScatter3DSeries"; isList: true; isReadonly: true }
+        Signal {
+            name: "axisXChanged"
+            Parameter { name: "axis"; type: "QValue3DAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisYChanged"
+            Parameter { name: "axis"; type: "QValue3DAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisZChanged"
+            Parameter { name: "axis"; type: "QValue3DAxis"; isPointer: true }
+        }
+        Signal {
+            name: "selectedSeriesChanged"
+            Parameter { name: "series"; type: "QScatter3DSeries"; isPointer: true }
+        }
+        Method {
+            name: "handleAxisXChanged"
+            Parameter { name: "axis"; type: "QAbstract3DAxis"; isPointer: true }
+        }
+        Method {
+            name: "handleAxisYChanged"
+            Parameter { name: "axis"; type: "QAbstract3DAxis"; isPointer: true }
+        }
+        Method {
+            name: "handleAxisZChanged"
+            Parameter { name: "axis"; type: "QAbstract3DAxis"; isPointer: true }
+        }
+        Method {
+            name: "addSeries"
+            Parameter { name: "series"; type: "QScatter3DSeries"; isPointer: true }
+        }
+        Method {
+            name: "removeSeries"
+            Parameter { name: "series"; type: "QScatter3DSeries"; isPointer: true }
+        }
+    }
+    Component {
+        name: "QtDataVisualization::DeclarativeScatter3DSeries"
+        defaultProperty: "seriesChildren"
+        prototype: "QtDataVisualization::QScatter3DSeries"
+        exports: ["QtDataVisualization/Scatter3DSeries 1.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "seriesChildren"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "baseGradient"; type: "ColorGradient"; isPointer: true }
+        Property { name: "singleHighlightGradient"; type: "ColorGradient"; isPointer: true }
+        Property { name: "multiHighlightGradient"; type: "ColorGradient"; isPointer: true }
+        Property { name: "invalidSelectionIndex"; type: "int"; isReadonly: true }
+        Signal {
+            name: "baseGradientChanged"
+            Parameter { name: "gradient"; type: "ColorGradient"; isPointer: true }
+        }
+        Signal {
+            name: "singleHighlightGradientChanged"
+            Parameter { name: "gradient"; type: "ColorGradient"; isPointer: true }
+        }
+        Signal {
+            name: "multiHighlightGradientChanged"
+            Parameter { name: "gradient"; type: "ColorGradient"; isPointer: true }
+        }
+        Method { name: "handleBaseGradientUpdate" }
+        Method { name: "handleSingleHighlightGradientUpdate" }
+        Method { name: "handleMultiHighlightGradientUpdate" }
+    }
+    Component {
+        name: "QtDataVisualization::DeclarativeSurface"
+        defaultProperty: "seriesList"
+        prototype: "QtDataVisualization::AbstractDeclarative"
+        exports: [
+            "QtDataVisualization/Surface3D 1.0",
+            "QtDataVisualization/Surface3D 1.2"
+        ]
+        exportMetaObjectRevisions: [0, 1]
+        Property { name: "axisX"; type: "QValue3DAxis"; isPointer: true }
+        Property { name: "axisY"; type: "QValue3DAxis"; isPointer: true }
+        Property { name: "axisZ"; type: "QValue3DAxis"; isPointer: true }
+        Property { name: "selectedSeries"; type: "QSurface3DSeries"; isReadonly: true; isPointer: true }
+        Property { name: "seriesList"; type: "QSurface3DSeries"; isList: true; isReadonly: true }
+        Property { name: "flipHorizontalGrid"; revision: 1; type: "bool" }
+        Signal {
+            name: "axisXChanged"
+            Parameter { name: "axis"; type: "QValue3DAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisYChanged"
+            Parameter { name: "axis"; type: "QValue3DAxis"; isPointer: true }
+        }
+        Signal {
+            name: "axisZChanged"
+            Parameter { name: "axis"; type: "QValue3DAxis"; isPointer: true }
+        }
+        Signal {
+            name: "selectedSeriesChanged"
+            Parameter { name: "series"; type: "QSurface3DSeries"; isPointer: true }
+        }
+        Signal {
+            name: "flipHorizontalGridChanged"
+            revision: 1
+            Parameter { name: "flip"; type: "bool" }
+        }
+        Method {
+            name: "handleAxisXChanged"
+            Parameter { name: "axis"; type: "QAbstract3DAxis"; isPointer: true }
+        }
+        Method {
+            name: "handleAxisYChanged"
+            Parameter { name: "axis"; type: "QAbstract3DAxis"; isPointer: true }
+        }
+        Method {
+            name: "handleAxisZChanged"
+            Parameter { name: "axis"; type: "QAbstract3DAxis"; isPointer: true }
+        }
+        Method {
+            name: "addSeries"
+            Parameter { name: "series"; type: "QSurface3DSeries"; isPointer: true }
+        }
+        Method {
+            name: "removeSeries"
+            Parameter { name: "series"; type: "QSurface3DSeries"; isPointer: true }
+        }
+    }
+    Component {
+        name: "QtDataVisualization::DeclarativeSurface3DSeries"
+        defaultProperty: "seriesChildren"
+        prototype: "QtDataVisualization::QSurface3DSeries"
+        exports: ["QtDataVisualization/Surface3DSeries 1.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "seriesChildren"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "selectedPoint"; type: "QPointF" }
+        Property { name: "invalidSelectionPosition"; type: "QPointF"; isReadonly: true }
+        Property { name: "baseGradient"; type: "ColorGradient"; isPointer: true }
+        Property { name: "singleHighlightGradient"; type: "ColorGradient"; isPointer: true }
+        Property { name: "multiHighlightGradient"; type: "ColorGradient"; isPointer: true }
+        Signal {
+            name: "selectedPointChanged"
+            Parameter { name: "position"; type: "QPointF" }
+        }
+        Signal {
+            name: "baseGradientChanged"
+            Parameter { name: "gradient"; type: "ColorGradient"; isPointer: true }
+        }
+        Signal {
+            name: "singleHighlightGradientChanged"
+            Parameter { name: "gradient"; type: "ColorGradient"; isPointer: true }
+        }
+        Signal {
+            name: "multiHighlightGradientChanged"
+            Parameter { name: "gradient"; type: "ColorGradient"; isPointer: true }
+        }
+        Method { name: "handleBaseGradientUpdate" }
+        Method { name: "handleSingleHighlightGradientUpdate" }
+        Method { name: "handleMultiHighlightGradientUpdate" }
+    }
+    Component {
+        name: "QtDataVisualization::DeclarativeTheme3D"
+        defaultProperty: "themeChildren"
+        prototype: "QtDataVisualization::Q3DTheme"
+        exports: ["QtDataVisualization/Theme3D 1.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "themeChildren"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "baseColors"; type: "DeclarativeColor"; isList: true; isReadonly: true }
+        Property { name: "baseGradients"; type: "ColorGradient"; isList: true; isReadonly: true }
+        Property { name: "singleHighlightGradient"; type: "ColorGradient"; isPointer: true }
+        Property { name: "multiHighlightGradient"; type: "ColorGradient"; isPointer: true }
+        Signal {
+            name: "singleHighlightGradientChanged"
+            Parameter { name: "gradient"; type: "ColorGradient"; isPointer: true }
+        }
+        Signal {
+            name: "multiHighlightGradientChanged"
+            Parameter { name: "gradient"; type: "ColorGradient"; isPointer: true }
+        }
+    }
+    Component {
+        name: "QtDataVisualization::Q3DCamera"
+        prototype: "QtDataVisualization::Q3DObject"
+        exports: [
+            "QtDataVisualization/Camera3D 1.0",
+            "QtDataVisualization/Camera3D 1.2"
+        ]
+        exportMetaObjectRevisions: [0, 1]
+        Enum {
+            name: "CameraPreset"
+            values: {
+                "CameraPresetNone": -1,
+                "CameraPresetFrontLow": 0,
+                "CameraPresetFront": 1,
+                "CameraPresetFrontHigh": 2,
+                "CameraPresetLeftLow": 3,
+                "CameraPresetLeft": 4,
+                "CameraPresetLeftHigh": 5,
+                "CameraPresetRightLow": 6,
+                "CameraPresetRight": 7,
+                "CameraPresetRightHigh": 8,
+                "CameraPresetBehindLow": 9,
+                "CameraPresetBehind": 10,
+                "CameraPresetBehindHigh": 11,
+                "CameraPresetIsometricLeft": 12,
+                "CameraPresetIsometricLeftHigh": 13,
+                "CameraPresetIsometricRight": 14,
+                "CameraPresetIsometricRightHigh": 15,
+                "CameraPresetDirectlyAbove": 16,
+                "CameraPresetDirectlyAboveCW45": 17,
+                "CameraPresetDirectlyAboveCCW45": 18,
+                "CameraPresetFrontBelow": 19,
+                "CameraPresetLeftBelow": 20,
+                "CameraPresetRightBelow": 21,
+                "CameraPresetBehindBelow": 22,
+                "CameraPresetDirectlyBelow": 23
+            }
+        }
+        Property { name: "xRotation"; type: "float" }
+        Property { name: "yRotation"; type: "float" }
+        Property { name: "zoomLevel"; type: "float" }
+        Property { name: "cameraPreset"; type: "CameraPreset" }
+        Property { name: "wrapXRotation"; type: "bool" }
+        Property { name: "wrapYRotation"; type: "bool" }
+        Property { name: "target"; revision: 1; type: "QVector3D" }
+        Property { name: "minZoomLevel"; revision: 1; type: "float" }
+        Property { name: "maxZoomLevel"; revision: 1; type: "float" }
+        Signal {
+            name: "xRotationChanged"
+            Parameter { name: "rotation"; type: "float" }
+        }
+        Signal {
+            name: "yRotationChanged"
+            Parameter { name: "rotation"; type: "float" }
+        }
+        Signal {
+            name: "zoomLevelChanged"
+            Parameter { name: "zoomLevel"; type: "float" }
+        }
+        Signal {
+            name: "cameraPresetChanged"
+            Parameter { name: "preset"; type: "Q3DCamera::CameraPreset" }
+        }
+        Signal {
+            name: "wrapXRotationChanged"
+            Parameter { name: "isEnabled"; type: "bool" }
+        }
+        Signal {
+            name: "wrapYRotationChanged"
+            Parameter { name: "isEnabled"; type: "bool" }
+        }
+        Signal {
+            name: "targetChanged"
+            revision: 1
+            Parameter { name: "target"; type: "QVector3D" }
+        }
+        Signal {
+            name: "minZoomLevelChanged"
+            revision: 1
+            Parameter { name: "zoomLevel"; type: "float" }
+        }
+        Signal {
+            name: "maxZoomLevelChanged"
+            revision: 1
+            Parameter { name: "zoomLevel"; type: "float" }
+        }
+    }
+    Component {
+        name: "QtDataVisualization::Q3DInputHandler"
+        prototype: "QtDataVisualization::QAbstract3DInputHandler"
+        exports: ["QtDataVisualization/InputHandler3D 1.2"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "rotationEnabled"; type: "bool" }
+        Property { name: "zoomEnabled"; type: "bool" }
+        Property { name: "selectionEnabled"; type: "bool" }
+        Property { name: "zoomAtTargetEnabled"; type: "bool" }
+        Signal {
+            name: "rotationEnabledChanged"
+            Parameter { name: "enable"; type: "bool" }
+        }
+        Signal {
+            name: "zoomEnabledChanged"
+            Parameter { name: "enable"; type: "bool" }
+        }
+        Signal {
+            name: "selectionEnabledChanged"
+            Parameter { name: "enable"; type: "bool" }
+        }
+        Signal {
+            name: "zoomAtTargetEnabledChanged"
+            Parameter { name: "enable"; type: "bool" }
+        }
+    }
+    Component {
+        name: "QtDataVisualization::Q3DLight"
+        prototype: "QtDataVisualization::Q3DObject"
+        exports: [
+            "QtDataVisualization/Light3D 1.0",
+            "QtDataVisualization/Light3D 1.3"
+        ]
+        exportMetaObjectRevisions: [0, 1]
+        Property { name: "autoPosition"; revision: 1; type: "bool" }
+        Signal {
+            name: "autoPositionChanged"
+            revision: 1
+            Parameter { name: "autoPosition"; type: "bool" }
+        }
+    }
+    Component {
+        name: "QtDataVisualization::Q3DObject"
+        prototype: "QObject"
+        exports: ["QtDataVisualization/Object3D 1.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        Property { name: "parentScene"; type: "Q3DScene"; isReadonly: true; isPointer: true }
+        Property { name: "position"; type: "QVector3D" }
+        Signal {
+            name: "positionChanged"
+            Parameter { name: "position"; type: "QVector3D" }
+        }
+    }
+    Component {
+        name: "QtDataVisualization::Q3DScene"
+        prototype: "QObject"
+        Property { name: "viewport"; type: "QRect"; isReadonly: true }
+        Property { name: "primarySubViewport"; type: "QRect" }
+        Property { name: "secondarySubViewport"; type: "QRect" }
+        Property { name: "selectionQueryPosition"; type: "QPoint" }
+        Property { name: "secondarySubviewOnTop"; type: "bool" }
+        Property { name: "slicingActive"; type: "bool" }
+        Property { name: "activeCamera"; type: "Q3DCamera"; isPointer: true }
+        Property { name: "activeLight"; type: "Q3DLight"; isPointer: true }
+        Property { name: "devicePixelRatio"; type: "float" }
+        Property { name: "graphPositionQuery"; revision: 1; type: "QPoint" }
+        Signal {
+            name: "viewportChanged"
+            Parameter { name: "viewport"; type: "QRect" }
+        }
+        Signal {
+            name: "primarySubViewportChanged"
+            Parameter { name: "subViewport"; type: "QRect" }
+        }
+        Signal {
+            name: "secondarySubViewportChanged"
+            Parameter { name: "subViewport"; type: "QRect" }
+        }
+        Signal {
+            name: "secondarySubviewOnTopChanged"
+            Parameter { name: "isSecondaryOnTop"; type: "bool" }
+        }
+        Signal {
+            name: "slicingActiveChanged"
+            Parameter { name: "isSlicingActive"; type: "bool" }
+        }
+        Signal {
+            name: "activeCameraChanged"
+            Parameter { name: "camera"; type: "Q3DCamera"; isPointer: true }
+        }
+        Signal {
+            name: "activeLightChanged"
+            Parameter { name: "light"; type: "Q3DLight"; isPointer: true }
+        }
+        Signal {
+            name: "devicePixelRatioChanged"
+            Parameter { name: "pixelRatio"; type: "float" }
+        }
+        Signal {
+            name: "selectionQueryPositionChanged"
+            Parameter { name: "position"; type: "QPoint" }
+        }
+        Signal {
+            name: "graphPositionQueryChanged"
+            revision: 1
+            Parameter { name: "position"; type: "QPoint" }
+        }
+    }
+    Component {
+        name: "QtDataVisualization::Q3DTheme"
+        prototype: "QObject"
+        exports: ["QtDataVisualization/Q3DTheme 1.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        Enum {
+            name: "ColorStyle"
+            values: {
+                "ColorStyleUniform": 0,
+                "ColorStyleObjectGradient": 1,
+                "ColorStyleRangeGradient": 2
+            }
+        }
+        Enum {
+            name: "Theme"
+            values: {
+                "ThemeQt": 0,
+                "ThemePrimaryColors": 1,
+                "ThemeDigia": 2,
+                "ThemeStoneMoss": 3,
+                "ThemeArmyBlue": 4,
+                "ThemeRetro": 5,
+                "ThemeEbony": 6,
+                "ThemeIsabelle": 7,
+                "ThemeUserDefined": 8
+            }
+        }
+        Property { name: "type"; type: "Theme" }
+        Property { name: "baseColors"; type: "QList<QColor>" }
+        Property { name: "backgroundColor"; type: "QColor" }
+        Property { name: "windowColor"; type: "QColor" }
+        Property { name: "labelTextColor"; type: "QColor" }
+        Property { name: "labelBackgroundColor"; type: "QColor" }
+        Property { name: "gridLineColor"; type: "QColor" }
+        Property { name: "singleHighlightColor"; type: "QColor" }
+        Property { name: "multiHighlightColor"; type: "QColor" }
+        Property { name: "lightColor"; type: "QColor" }
+        Property { name: "baseGradients"; type: "QList<QLinearGradient>" }
+        Property { name: "singleHighlightGradient"; type: "QLinearGradient" }
+        Property { name: "multiHighlightGradient"; type: "QLinearGradient" }
+        Property { name: "lightStrength"; type: "float" }
+        Property { name: "ambientLightStrength"; type: "float" }
+        Property { name: "highlightLightStrength"; type: "float" }
+        Property { name: "labelBorderEnabled"; type: "bool" }
+        Property { name: "font"; type: "QFont" }
+        Property { name: "backgroundEnabled"; type: "bool" }
+        Property { name: "gridEnabled"; type: "bool" }
+        Property { name: "labelBackgroundEnabled"; type: "bool" }
+        Property { name: "colorStyle"; type: "ColorStyle" }
+        Signal {
+            name: "typeChanged"
+            Parameter { name: "themeType"; type: "Q3DTheme::Theme" }
+        }
+        Signal {
+            name: "baseColorsChanged"
+            Parameter { name: "colors"; type: "QList<QColor>" }
+        }
+        Signal {
+            name: "backgroundColorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "windowColorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "labelTextColorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "labelBackgroundColorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "gridLineColorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "singleHighlightColorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "multiHighlightColorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "lightColorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "baseGradientsChanged"
+            Parameter { name: "gradients"; type: "QList<QLinearGradient>" }
+        }
+        Signal {
+            name: "singleHighlightGradientChanged"
+            Parameter { name: "gradient"; type: "QLinearGradient" }
+        }
+        Signal {
+            name: "multiHighlightGradientChanged"
+            Parameter { name: "gradient"; type: "QLinearGradient" }
+        }
+        Signal {
+            name: "lightStrengthChanged"
+            Parameter { name: "strength"; type: "float" }
+        }
+        Signal {
+            name: "ambientLightStrengthChanged"
+            Parameter { name: "strength"; type: "float" }
+        }
+        Signal {
+            name: "highlightLightStrengthChanged"
+            Parameter { name: "strength"; type: "float" }
+        }
+        Signal {
+            name: "labelBorderEnabledChanged"
+            Parameter { name: "enabled"; type: "bool" }
+        }
+        Signal {
+            name: "fontChanged"
+            Parameter { name: "font"; type: "QFont" }
+        }
+        Signal {
+            name: "backgroundEnabledChanged"
+            Parameter { name: "enabled"; type: "bool" }
+        }
+        Signal {
+            name: "gridEnabledChanged"
+            Parameter { name: "enabled"; type: "bool" }
+        }
+        Signal {
+            name: "labelBackgroundEnabledChanged"
+            Parameter { name: "enabled"; type: "bool" }
+        }
+        Signal {
+            name: "colorStyleChanged"
+            Parameter { name: "style"; type: "Q3DTheme::ColorStyle" }
+        }
+    }
+    Component {
+        name: "QtDataVisualization::QAbstract3DAxis"
+        prototype: "QObject"
+        exports: [
+            "QtDataVisualization/AbstractAxis3D 1.0",
+            "QtDataVisualization/AbstractAxis3D 1.1"
+        ]
+        isCreatable: false
+        exportMetaObjectRevisions: [0, 1]
+        Enum {
+            name: "AxisOrientation"
+            values: {
+                "AxisOrientationNone": 0,
+                "AxisOrientationX": 1,
+                "AxisOrientationY": 2,
+                "AxisOrientationZ": 4
+            }
+        }
+        Enum {
+            name: "AxisType"
+            values: {
+                "AxisTypeNone": 0,
+                "AxisTypeCategory": 1,
+                "AxisTypeValue": 2
+            }
+        }
+        Property { name: "title"; type: "string" }
+        Property { name: "labels"; type: "QStringList" }
+        Property { name: "orientation"; type: "AxisOrientation"; isReadonly: true }
+        Property { name: "type"; type: "AxisType"; isReadonly: true }
+        Property { name: "min"; type: "float" }
+        Property { name: "max"; type: "float" }
+        Property { name: "autoAdjustRange"; type: "bool" }
+        Property { name: "labelAutoRotation"; revision: 1; type: "float" }
+        Property { name: "titleVisible"; revision: 1; type: "bool" }
+        Property { name: "titleFixed"; revision: 1; type: "bool" }
+        Signal {
+            name: "titleChanged"
+            Parameter { name: "newTitle"; type: "string" }
+        }
+        Signal {
+            name: "orientationChanged"
+            Parameter { name: "orientation"; type: "QAbstract3DAxis::AxisOrientation" }
+        }
+        Signal {
+            name: "minChanged"
+            Parameter { name: "value"; type: "float" }
+        }
+        Signal {
+            name: "maxChanged"
+            Parameter { name: "value"; type: "float" }
+        }
+        Signal {
+            name: "rangeChanged"
+            Parameter { name: "min"; type: "float" }
+            Parameter { name: "max"; type: "float" }
+        }
+        Signal {
+            name: "autoAdjustRangeChanged"
+            Parameter { name: "autoAdjust"; type: "bool" }
+        }
+        Signal {
+            name: "labelAutoRotationChanged"
+            revision: 1
+            Parameter { name: "angle"; type: "float" }
+        }
+        Signal {
+            name: "titleVisibilityChanged"
+            revision: 1
+            Parameter { name: "visible"; type: "bool" }
+        }
+        Signal {
+            name: "titleFixedChanged"
+            revision: 1
+            Parameter { name: "fixed"; type: "bool" }
+        }
+    }
+    Component {
+        name: "QtDataVisualization::QAbstract3DInputHandler"
+        prototype: "QObject"
+        exports: ["QtDataVisualization/AbstractInputHandler3D 1.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        Enum {
+            name: "InputView"
+            values: {
+                "InputViewNone": 0,
+                "InputViewOnPrimary": 1,
+                "InputViewOnSecondary": 2
+            }
+        }
+        Property { name: "inputView"; type: "InputView" }
+        Property { name: "inputPosition"; type: "QPoint" }
+        Property { name: "scene"; type: "Q3DScene"; isPointer: true }
+        Signal {
+            name: "positionChanged"
+            Parameter { name: "position"; type: "QPoint" }
+        }
+        Signal {
+            name: "inputViewChanged"
+            Parameter { name: "view"; type: "QAbstract3DInputHandler::InputView" }
+        }
+        Signal {
+            name: "sceneChanged"
+            Parameter { name: "scene"; type: "Q3DScene"; isPointer: true }
+        }
+    }
+    Component {
+        name: "QtDataVisualization::QAbstract3DSeries"
+        prototype: "QObject"
+        exports: [
+            "QtDataVisualization/Abstract3DSeries 1.0",
+            "QtDataVisualization/Abstract3DSeries 1.1"
+        ]
+        isCreatable: false
+        exportMetaObjectRevisions: [0, 1]
+        Enum {
+            name: "SeriesType"
+            values: {
+                "SeriesTypeNone": 0,
+                "SeriesTypeBar": 1,
+                "SeriesTypeScatter": 2,
+                "SeriesTypeSurface": 4
+            }
+        }
+        Enum {
+            name: "Mesh"
+            values: {
+                "MeshUserDefined": 0,
+                "MeshBar": 1,
+                "MeshCube": 2,
+                "MeshPyramid": 3,
+                "MeshCone": 4,
+                "MeshCylinder": 5,
+                "MeshBevelBar": 6,
+                "MeshBevelCube": 7,
+                "MeshSphere": 8,
+                "MeshMinimal": 9,
+                "MeshArrow": 10,
+                "MeshPoint": 11
+            }
+        }
+        Property { name: "type"; type: "SeriesType"; isReadonly: true }
+        Property { name: "itemLabelFormat"; type: "string" }
+        Property { name: "visible"; type: "bool" }
+        Property { name: "mesh"; type: "Mesh" }
+        Property { name: "meshSmooth"; type: "bool" }
+        Property { name: "meshRotation"; type: "QQuaternion" }
+        Property { name: "userDefinedMesh"; type: "string" }
+        Property { name: "colorStyle"; type: "QtDataVisualization::Q3DTheme::ColorStyle" }
+        Property { name: "baseColor"; type: "QColor" }
+        Property { name: "baseGradient"; type: "QLinearGradient" }
+        Property { name: "singleHighlightColor"; type: "QColor" }
+        Property { name: "singleHighlightGradient"; type: "QLinearGradient" }
+        Property { name: "multiHighlightColor"; type: "QColor" }
+        Property { name: "multiHighlightGradient"; type: "QLinearGradient" }
+        Property { name: "name"; type: "string" }
+        Property { name: "itemLabel"; revision: 1; type: "string"; isReadonly: true }
+        Property { name: "itemLabelVisible"; revision: 1; type: "bool" }
+        Signal {
+            name: "itemLabelFormatChanged"
+            Parameter { name: "format"; type: "string" }
+        }
+        Signal {
+            name: "visibilityChanged"
+            Parameter { name: "visible"; type: "bool" }
+        }
+        Signal {
+            name: "meshChanged"
+            Parameter { name: "mesh"; type: "QAbstract3DSeries::Mesh" }
+        }
+        Signal {
+            name: "meshSmoothChanged"
+            Parameter { name: "enabled"; type: "bool" }
+        }
+        Signal {
+            name: "meshRotationChanged"
+            Parameter { name: "rotation"; type: "QQuaternion" }
+        }
+        Signal {
+            name: "userDefinedMeshChanged"
+            Parameter { name: "fileName"; type: "string" }
+        }
+        Signal {
+            name: "colorStyleChanged"
+            Parameter { name: "style"; type: "Q3DTheme::ColorStyle" }
+        }
+        Signal {
+            name: "baseColorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "baseGradientChanged"
+            Parameter { name: "gradient"; type: "QLinearGradient" }
+        }
+        Signal {
+            name: "singleHighlightColorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "singleHighlightGradientChanged"
+            Parameter { name: "gradient"; type: "QLinearGradient" }
+        }
+        Signal {
+            name: "multiHighlightColorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "multiHighlightGradientChanged"
+            Parameter { name: "gradient"; type: "QLinearGradient" }
+        }
+        Signal {
+            name: "nameChanged"
+            Parameter { name: "name"; type: "string" }
+        }
+        Signal {
+            name: "itemLabelChanged"
+            revision: 1
+            Parameter { name: "label"; type: "string" }
+        }
+        Signal {
+            name: "itemLabelVisibilityChanged"
+            revision: 1
+            Parameter { name: "visible"; type: "bool" }
+        }
+        Method {
+            name: "setMeshAxisAndAngle"
+            Parameter { name: "axis"; type: "QVector3D" }
+            Parameter { name: "angle"; type: "float" }
+        }
+    }
+    Component {
+        name: "QtDataVisualization::QAbstractDataProxy"
+        prototype: "QObject"
+        exports: ["QtDataVisualization/AbstractDataProxy 1.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        Enum {
+            name: "DataType"
+            values: {
+                "DataTypeNone": 0,
+                "DataTypeBar": 1,
+                "DataTypeScatter": 2,
+                "DataTypeSurface": 4
+            }
+        }
+        Property { name: "type"; type: "DataType"; isReadonly: true }
+    }
+    Component {
+        name: "QtDataVisualization::QBar3DSeries"
+        prototype: "QtDataVisualization::QAbstract3DSeries"
+        exports: ["QtDataVisualization/QBar3DSeries 1.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        Property { name: "dataProxy"; type: "QBarDataProxy"; isPointer: true }
+        Property { name: "selectedBar"; type: "QPoint" }
+        Property { name: "meshAngle"; type: "float" }
+        Signal {
+            name: "dataProxyChanged"
+            Parameter { name: "proxy"; type: "QBarDataProxy"; isPointer: true }
+        }
+        Signal {
+            name: "selectedBarChanged"
+            Parameter { name: "position"; type: "QPoint" }
+        }
+        Signal {
+            name: "meshAngleChanged"
+            Parameter { name: "angle"; type: "float" }
+        }
+    }
+    Component {
+        name: "QtDataVisualization::QBarDataProxy"
+        prototype: "QtDataVisualization::QAbstractDataProxy"
+        exports: ["QtDataVisualization/BarDataProxy 1.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        Property { name: "rowCount"; type: "int"; isReadonly: true }
+        Property { name: "rowLabels"; type: "QStringList" }
+        Property { name: "columnLabels"; type: "QStringList" }
+        Property { name: "series"; type: "QBar3DSeries"; isReadonly: true; isPointer: true }
+        Signal { name: "arrayReset" }
+        Signal {
+            name: "rowsAdded"
+            Parameter { name: "startIndex"; type: "int" }
+            Parameter { name: "count"; type: "int" }
+        }
+        Signal {
+            name: "rowsChanged"
+            Parameter { name: "startIndex"; type: "int" }
+            Parameter { name: "count"; type: "int" }
+        }
+        Signal {
+            name: "rowsRemoved"
+            Parameter { name: "startIndex"; type: "int" }
+            Parameter { name: "count"; type: "int" }
+        }
+        Signal {
+            name: "rowsInserted"
+            Parameter { name: "startIndex"; type: "int" }
+            Parameter { name: "count"; type: "int" }
+        }
+        Signal {
+            name: "itemChanged"
+            Parameter { name: "rowIndex"; type: "int" }
+            Parameter { name: "columnIndex"; type: "int" }
+        }
+        Signal {
+            name: "rowCountChanged"
+            Parameter { name: "count"; type: "int" }
+        }
+        Signal {
+            name: "seriesChanged"
+            Parameter { name: "series"; type: "QBar3DSeries"; isPointer: true }
+        }
+    }
+    Component {
+        name: "QtDataVisualization::QCategory3DAxis"
+        prototype: "QtDataVisualization::QAbstract3DAxis"
+        exports: ["QtDataVisualization/CategoryAxis3D 1.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "labels"; type: "QStringList" }
+    }
+    Component {
+        name: "QtDataVisualization::QCustom3DItem"
+        prototype: "QObject"
+        exports: [
+            "QtDataVisualization/Custom3DItem 1.1",
+            "QtDataVisualization/Custom3DItem 1.2"
+        ]
+        exportMetaObjectRevisions: [0, 1]
+        Property { name: "meshFile"; type: "string" }
+        Property { name: "textureFile"; type: "string" }
+        Property { name: "position"; type: "QVector3D" }
+        Property { name: "positionAbsolute"; type: "bool" }
+        Property { name: "scaling"; type: "QVector3D" }
+        Property { name: "rotation"; type: "QQuaternion" }
+        Property { name: "visible"; type: "bool" }
+        Property { name: "shadowCasting"; type: "bool" }
+        Property { name: "scalingAbsolute"; revision: 1; type: "bool" }
+        Signal {
+            name: "meshFileChanged"
+            Parameter { name: "meshFile"; type: "string" }
+        }
+        Signal {
+            name: "textureFileChanged"
+            Parameter { name: "textureFile"; type: "string" }
+        }
+        Signal {
+            name: "positionChanged"
+            Parameter { name: "position"; type: "QVector3D" }
+        }
+        Signal {
+            name: "positionAbsoluteChanged"
+            Parameter { name: "positionAbsolute"; type: "bool" }
+        }
+        Signal {
+            name: "scalingChanged"
+            Parameter { name: "scaling"; type: "QVector3D" }
+        }
+        Signal {
+            name: "rotationChanged"
+            Parameter { name: "rotation"; type: "QQuaternion" }
+        }
+        Signal {
+            name: "visibleChanged"
+            Parameter { name: "visible"; type: "bool" }
+        }
+        Signal {
+            name: "shadowCastingChanged"
+            Parameter { name: "shadowCasting"; type: "bool" }
+        }
+        Signal {
+            name: "scalingAbsoluteChanged"
+            revision: 1
+            Parameter { name: "scalingAbsolute"; type: "bool" }
+        }
+        Method {
+            name: "setRotationAxisAndAngle"
+            Parameter { name: "axis"; type: "QVector3D" }
+            Parameter { name: "angle"; type: "float" }
+        }
+    }
+    Component {
+        name: "QtDataVisualization::QCustom3DLabel"
+        prototype: "QtDataVisualization::QCustom3DItem"
+        exports: ["QtDataVisualization/Custom3DLabel 1.1"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "text"; type: "string" }
+        Property { name: "font"; type: "QFont" }
+        Property { name: "textColor"; type: "QColor" }
+        Property { name: "backgroundColor"; type: "QColor" }
+        Property { name: "borderEnabled"; type: "bool" }
+        Property { name: "backgroundEnabled"; type: "bool" }
+        Property { name: "facingCamera"; type: "bool" }
+        Signal {
+            name: "textChanged"
+            Parameter { name: "text"; type: "string" }
+        }
+        Signal {
+            name: "fontChanged"
+            Parameter { name: "font"; type: "QFont" }
+        }
+        Signal {
+            name: "textColorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "backgroundColorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "borderEnabledChanged"
+            Parameter { name: "enabled"; type: "bool" }
+        }
+        Signal {
+            name: "backgroundEnabledChanged"
+            Parameter { name: "enabled"; type: "bool" }
+        }
+        Signal {
+            name: "facingCameraChanged"
+            Parameter { name: "enabled"; type: "bool" }
+        }
+    }
+    Component {
+        name: "QtDataVisualization::QCustom3DVolume"
+        prototype: "QtDataVisualization::QCustom3DItem"
+        exports: ["QtDataVisualization/Custom3DVolume 1.2"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "textureWidth"; type: "int" }
+        Property { name: "textureHeight"; type: "int" }
+        Property { name: "textureDepth"; type: "int" }
+        Property { name: "sliceIndexX"; type: "int" }
+        Property { name: "sliceIndexY"; type: "int" }
+        Property { name: "sliceIndexZ"; type: "int" }
+        Property { name: "colorTable"; type: "QVector<QRgb>" }
+        Property { name: "textureData"; type: "QVector<uchar>"; isPointer: true }
+        Property { name: "alphaMultiplier"; type: "float" }
+        Property { name: "preserveOpacity"; type: "bool" }
+        Property { name: "useHighDefShader"; type: "bool" }
+        Property { name: "drawSlices"; type: "bool" }
+        Property { name: "drawSliceFrames"; type: "bool" }
+        Property { name: "sliceFrameColor"; type: "QColor" }
+        Property { name: "sliceFrameWidths"; type: "QVector3D" }
+        Property { name: "sliceFrameGaps"; type: "QVector3D" }
+        Property { name: "sliceFrameThicknesses"; type: "QVector3D" }
+        Signal {
+            name: "textureWidthChanged"
+            Parameter { name: "value"; type: "int" }
+        }
+        Signal {
+            name: "textureHeightChanged"
+            Parameter { name: "value"; type: "int" }
+        }
+        Signal {
+            name: "textureDepthChanged"
+            Parameter { name: "value"; type: "int" }
+        }
+        Signal {
+            name: "sliceIndexXChanged"
+            Parameter { name: "value"; type: "int" }
+        }
+        Signal {
+            name: "sliceIndexYChanged"
+            Parameter { name: "value"; type: "int" }
+        }
+        Signal {
+            name: "sliceIndexZChanged"
+            Parameter { name: "value"; type: "int" }
+        }
+        Signal {
+            name: "textureDataChanged"
+            Parameter { name: "data"; type: "QVector<uchar>"; isPointer: true }
+        }
+        Signal {
+            name: "textureFormatChanged"
+            Parameter { name: "format"; type: "QImage::Format" }
+        }
+        Signal {
+            name: "alphaMultiplierChanged"
+            Parameter { name: "mult"; type: "float" }
+        }
+        Signal {
+            name: "preserveOpacityChanged"
+            Parameter { name: "enabled"; type: "bool" }
+        }
+        Signal {
+            name: "useHighDefShaderChanged"
+            Parameter { name: "enabled"; type: "bool" }
+        }
+        Signal {
+            name: "drawSlicesChanged"
+            Parameter { name: "enabled"; type: "bool" }
+        }
+        Signal {
+            name: "drawSliceFramesChanged"
+            Parameter { name: "enabled"; type: "bool" }
+        }
+        Signal {
+            name: "sliceFrameColorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "sliceFrameWidthsChanged"
+            Parameter { name: "values"; type: "QVector3D" }
+        }
+        Signal {
+            name: "sliceFrameGapsChanged"
+            Parameter { name: "values"; type: "QVector3D" }
+        }
+        Signal {
+            name: "sliceFrameThicknessesChanged"
+            Parameter { name: "values"; type: "QVector3D" }
+        }
+    }
+    Component {
+        name: "QtDataVisualization::QHeightMapSurfaceDataProxy"
+        prototype: "QtDataVisualization::QSurfaceDataProxy"
+        exports: ["QtDataVisualization/HeightMapSurfaceDataProxy 1.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "heightMap"; type: "QImage" }
+        Property { name: "heightMapFile"; type: "string" }
+        Property { name: "minXValue"; type: "float" }
+        Property { name: "maxXValue"; type: "float" }
+        Property { name: "minZValue"; type: "float" }
+        Property { name: "maxZValue"; type: "float" }
+        Signal {
+            name: "heightMapChanged"
+            Parameter { name: "image"; type: "QImage" }
+        }
+        Signal {
+            name: "heightMapFileChanged"
+            Parameter { name: "filename"; type: "string" }
+        }
+        Signal {
+            name: "minXValueChanged"
+            Parameter { name: "value"; type: "float" }
+        }
+        Signal {
+            name: "maxXValueChanged"
+            Parameter { name: "value"; type: "float" }
+        }
+        Signal {
+            name: "minZValueChanged"
+            Parameter { name: "value"; type: "float" }
+        }
+        Signal {
+            name: "maxZValueChanged"
+            Parameter { name: "value"; type: "float" }
+        }
+    }
+    Component {
+        name: "QtDataVisualization::QItemModelBarDataProxy"
+        prototype: "QtDataVisualization::QBarDataProxy"
+        exports: [
+            "QtDataVisualization/ItemModelBarDataProxy 1.0",
+            "QtDataVisualization/ItemModelBarDataProxy 1.1"
+        ]
+        exportMetaObjectRevisions: [0, 1]
+        Enum {
+            name: "MultiMatchBehavior"
+            values: {
+                "MMBFirst": 0,
+                "MMBLast": 1,
+                "MMBAverage": 2,
+                "MMBCumulative": 3
+            }
+        }
+        Property { name: "itemModel"; type: "QAbstractItemModel"; isPointer: true }
+        Property { name: "rowRole"; type: "string" }
+        Property { name: "columnRole"; type: "string" }
+        Property { name: "valueRole"; type: "string" }
+        Property { name: "rotationRole"; type: "string" }
+        Property { name: "rowCategories"; type: "QStringList" }
+        Property { name: "columnCategories"; type: "QStringList" }
+        Property { name: "useModelCategories"; type: "bool" }
+        Property { name: "autoRowCategories"; type: "bool" }
+        Property { name: "autoColumnCategories"; type: "bool" }
+        Property { name: "rowRolePattern"; revision: 1; type: "QRegExp" }
+        Property { name: "columnRolePattern"; revision: 1; type: "QRegExp" }
+        Property { name: "valueRolePattern"; revision: 1; type: "QRegExp" }
+        Property { name: "rotationRolePattern"; revision: 1; type: "QRegExp" }
+        Property { name: "rowRoleReplace"; revision: 1; type: "string" }
+        Property { name: "columnRoleReplace"; revision: 1; type: "string" }
+        Property { name: "valueRoleReplace"; revision: 1; type: "string" }
+        Property { name: "rotationRoleReplace"; revision: 1; type: "string" }
+        Property { name: "multiMatchBehavior"; revision: 1; type: "MultiMatchBehavior" }
+        Signal {
+            name: "itemModelChanged"
+            Parameter { name: "itemModel"; type: "const QAbstractItemModel"; isPointer: true }
+        }
+        Signal {
+            name: "rowRoleChanged"
+            Parameter { name: "role"; type: "string" }
+        }
+        Signal {
+            name: "columnRoleChanged"
+            Parameter { name: "role"; type: "string" }
+        }
+        Signal {
+            name: "valueRoleChanged"
+            Parameter { name: "role"; type: "string" }
+        }
+        Signal {
+            name: "rotationRoleChanged"
+            Parameter { name: "role"; type: "string" }
+        }
+        Signal {
+            name: "useModelCategoriesChanged"
+            Parameter { name: "enable"; type: "bool" }
+        }
+        Signal {
+            name: "autoRowCategoriesChanged"
+            Parameter { name: "enable"; type: "bool" }
+        }
+        Signal {
+            name: "autoColumnCategoriesChanged"
+            Parameter { name: "enable"; type: "bool" }
+        }
+        Signal {
+            name: "rowRolePatternChanged"
+            revision: 1
+            Parameter { name: "pattern"; type: "QRegExp" }
+        }
+        Signal {
+            name: "columnRolePatternChanged"
+            revision: 1
+            Parameter { name: "pattern"; type: "QRegExp" }
+        }
+        Signal {
+            name: "valueRolePatternChanged"
+            revision: 1
+            Parameter { name: "pattern"; type: "QRegExp" }
+        }
+        Signal {
+            name: "rotationRolePatternChanged"
+            revision: 1
+            Parameter { name: "pattern"; type: "QRegExp" }
+        }
+        Signal {
+            name: "rowRoleReplaceChanged"
+            revision: 1
+            Parameter { name: "replace"; type: "string" }
+        }
+        Signal {
+            name: "columnRoleReplaceChanged"
+            revision: 1
+            Parameter { name: "replace"; type: "string" }
+        }
+        Signal {
+            name: "valueRoleReplaceChanged"
+            revision: 1
+            Parameter { name: "replace"; type: "string" }
+        }
+        Signal {
+            name: "rotationRoleReplaceChanged"
+            revision: 1
+            Parameter { name: "replace"; type: "string" }
+        }
+        Signal {
+            name: "multiMatchBehaviorChanged"
+            revision: 1
+            Parameter { name: "behavior"; type: "MultiMatchBehavior" }
+        }
+        Method {
+            name: "rowCategoryIndex"
+            type: "int"
+            Parameter { name: "category"; type: "string" }
+        }
+        Method {
+            name: "columnCategoryIndex"
+            type: "int"
+            Parameter { name: "category"; type: "string" }
+        }
+    }
+    Component {
+        name: "QtDataVisualization::QItemModelScatterDataProxy"
+        prototype: "QtDataVisualization::QScatterDataProxy"
+        exports: [
+            "QtDataVisualization/ItemModelScatterDataProxy 1.0",
+            "QtDataVisualization/ItemModelScatterDataProxy 1.1"
+        ]
+        exportMetaObjectRevisions: [0, 1]
+        Property { name: "itemModel"; type: "QAbstractItemModel"; isPointer: true }
+        Property { name: "xPosRole"; type: "string" }
+        Property { name: "yPosRole"; type: "string" }
+        Property { name: "zPosRole"; type: "string" }
+        Property { name: "rotationRole"; type: "string" }
+        Property { name: "xPosRolePattern"; revision: 1; type: "QRegExp" }
+        Property { name: "yPosRolePattern"; revision: 1; type: "QRegExp" }
+        Property { name: "zPosRolePattern"; revision: 1; type: "QRegExp" }
+        Property { name: "rotationRolePattern"; revision: 1; type: "QRegExp" }
+        Property { name: "xPosRoleReplace"; revision: 1; type: "string" }
+        Property { name: "yPosRoleReplace"; revision: 1; type: "string" }
+        Property { name: "zPosRoleReplace"; revision: 1; type: "string" }
+        Property { name: "rotationRoleReplace"; revision: 1; type: "string" }
+        Signal {
+            name: "itemModelChanged"
+            Parameter { name: "itemModel"; type: "const QAbstractItemModel"; isPointer: true }
+        }
+        Signal {
+            name: "xPosRoleChanged"
+            Parameter { name: "role"; type: "string" }
+        }
+        Signal {
+            name: "yPosRoleChanged"
+            Parameter { name: "role"; type: "string" }
+        }
+        Signal {
+            name: "zPosRoleChanged"
+            Parameter { name: "role"; type: "string" }
+        }
+        Signal {
+            name: "rotationRoleChanged"
+            Parameter { name: "role"; type: "string" }
+        }
+        Signal {
+            name: "xPosRolePatternChanged"
+            revision: 1
+            Parameter { name: "pattern"; type: "QRegExp" }
+        }
+        Signal {
+            name: "yPosRolePatternChanged"
+            revision: 1
+            Parameter { name: "pattern"; type: "QRegExp" }
+        }
+        Signal {
+            name: "zPosRolePatternChanged"
+            revision: 1
+            Parameter { name: "pattern"; type: "QRegExp" }
+        }
+        Signal {
+            name: "rotationRolePatternChanged"
+            revision: 1
+            Parameter { name: "pattern"; type: "QRegExp" }
+        }
+        Signal {
+            name: "rotationRoleReplaceChanged"
+            revision: 1
+            Parameter { name: "replace"; type: "string" }
+        }
+        Signal {
+            name: "xPosRoleReplaceChanged"
+            revision: 1
+            Parameter { name: "replace"; type: "string" }
+        }
+        Signal {
+            name: "yPosRoleReplaceChanged"
+            revision: 1
+            Parameter { name: "replace"; type: "string" }
+        }
+        Signal {
+            name: "zPosRoleReplaceChanged"
+            revision: 1
+            Parameter { name: "replace"; type: "string" }
+        }
+    }
+    Component {
+        name: "QtDataVisualization::QItemModelSurfaceDataProxy"
+        prototype: "QtDataVisualization::QSurfaceDataProxy"
+        exports: [
+            "QtDataVisualization/ItemModelSurfaceDataProxy 1.0",
+            "QtDataVisualization/ItemModelSurfaceDataProxy 1.1"
+        ]
+        exportMetaObjectRevisions: [0, 1]
+        Enum {
+            name: "MultiMatchBehavior"
+            values: {
+                "MMBFirst": 0,
+                "MMBLast": 1,
+                "MMBAverage": 2,
+                "MMBCumulativeY": 3
+            }
+        }
+        Property { name: "itemModel"; type: "QAbstractItemModel"; isPointer: true }
+        Property { name: "rowRole"; type: "string" }
+        Property { name: "columnRole"; type: "string" }
+        Property { name: "xPosRole"; type: "string" }
+        Property { name: "yPosRole"; type: "string" }
+        Property { name: "zPosRole"; type: "string" }
+        Property { name: "rowCategories"; type: "QStringList" }
+        Property { name: "columnCategories"; type: "QStringList" }
+        Property { name: "useModelCategories"; type: "bool" }
+        Property { name: "autoRowCategories"; type: "bool" }
+        Property { name: "autoColumnCategories"; type: "bool" }
+        Property { name: "rowRolePattern"; revision: 1; type: "QRegExp" }
+        Property { name: "columnRolePattern"; revision: 1; type: "QRegExp" }
+        Property { name: "xPosRolePattern"; revision: 1; type: "QRegExp" }
+        Property { name: "yPosRolePattern"; revision: 1; type: "QRegExp" }
+        Property { name: "zPosRolePattern"; revision: 1; type: "QRegExp" }
+        Property { name: "rowRoleReplace"; revision: 1; type: "string" }
+        Property { name: "columnRoleReplace"; revision: 1; type: "string" }
+        Property { name: "xPosRoleReplace"; revision: 1; type: "string" }
+        Property { name: "yPosRoleReplace"; revision: 1; type: "string" }
+        Property { name: "zPosRoleReplace"; revision: 1; type: "string" }
+        Property { name: "multiMatchBehavior"; revision: 1; type: "MultiMatchBehavior" }
+        Signal {
+            name: "itemModelChanged"
+            Parameter { name: "itemModel"; type: "const QAbstractItemModel"; isPointer: true }
+        }
+        Signal {
+            name: "rowRoleChanged"
+            Parameter { name: "role"; type: "string" }
+        }
+        Signal {
+            name: "columnRoleChanged"
+            Parameter { name: "role"; type: "string" }
+        }
+        Signal {
+            name: "xPosRoleChanged"
+            Parameter { name: "role"; type: "string" }
+        }
+        Signal {
+            name: "yPosRoleChanged"
+            Parameter { name: "role"; type: "string" }
+        }
+        Signal {
+            name: "zPosRoleChanged"
+            Parameter { name: "role"; type: "string" }
+        }
+        Signal {
+            name: "useModelCategoriesChanged"
+            Parameter { name: "enable"; type: "bool" }
+        }
+        Signal {
+            name: "autoRowCategoriesChanged"
+            Parameter { name: "enable"; type: "bool" }
+        }
+        Signal {
+            name: "autoColumnCategoriesChanged"
+            Parameter { name: "enable"; type: "bool" }
+        }
+        Signal {
+            name: "rowRolePatternChanged"
+            revision: 1
+            Parameter { name: "pattern"; type: "QRegExp" }
+        }
+        Signal {
+            name: "columnRolePatternChanged"
+            revision: 1
+            Parameter { name: "pattern"; type: "QRegExp" }
+        }
+        Signal {
+            name: "xPosRolePatternChanged"
+            revision: 1
+            Parameter { name: "pattern"; type: "QRegExp" }
+        }
+        Signal {
+            name: "yPosRolePatternChanged"
+            revision: 1
+            Parameter { name: "pattern"; type: "QRegExp" }
+        }
+        Signal {
+            name: "zPosRolePatternChanged"
+            revision: 1
+            Parameter { name: "pattern"; type: "QRegExp" }
+        }
+        Signal {
+            name: "rowRoleReplaceChanged"
+            revision: 1
+            Parameter { name: "replace"; type: "string" }
+        }
+        Signal {
+            name: "columnRoleReplaceChanged"
+            revision: 1
+            Parameter { name: "replace"; type: "string" }
+        }
+        Signal {
+            name: "xPosRoleReplaceChanged"
+            revision: 1
+            Parameter { name: "replace"; type: "string" }
+        }
+        Signal {
+            name: "yPosRoleReplaceChanged"
+            revision: 1
+            Parameter { name: "replace"; type: "string" }
+        }
+        Signal {
+            name: "zPosRoleReplaceChanged"
+            revision: 1
+            Parameter { name: "replace"; type: "string" }
+        }
+        Signal {
+            name: "multiMatchBehaviorChanged"
+            revision: 1
+            Parameter { name: "behavior"; type: "MultiMatchBehavior" }
+        }
+        Method {
+            name: "rowCategoryIndex"
+            type: "int"
+            Parameter { name: "category"; type: "string" }
+        }
+        Method {
+            name: "columnCategoryIndex"
+            type: "int"
+            Parameter { name: "category"; type: "string" }
+        }
+    }
+    Component {
+        name: "QtDataVisualization::QLogValue3DAxisFormatter"
+        prototype: "QtDataVisualization::QValue3DAxisFormatter"
+        exports: ["QtDataVisualization/LogValueAxis3DFormatter 1.1"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "base"; type: "double" }
+        Property { name: "autoSubGrid"; type: "bool" }
+        Property { name: "showEdgeLabels"; type: "bool" }
+        Signal {
+            name: "baseChanged"
+            Parameter { name: "base"; type: "double" }
+        }
+        Signal {
+            name: "autoSubGridChanged"
+            Parameter { name: "enabled"; type: "bool" }
+        }
+        Signal {
+            name: "showEdgeLabelsChanged"
+            Parameter { name: "enabled"; type: "bool" }
+        }
+    }
+    Component {
+        name: "QtDataVisualization::QScatter3DSeries"
+        prototype: "QtDataVisualization::QAbstract3DSeries"
+        exports: ["QtDataVisualization/QScatter3DSeries 1.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        Property { name: "dataProxy"; type: "QScatterDataProxy"; isPointer: true }
+        Property { name: "selectedItem"; type: "int" }
+        Property { name: "itemSize"; type: "float" }
+        Signal {
+            name: "dataProxyChanged"
+            Parameter { name: "proxy"; type: "QScatterDataProxy"; isPointer: true }
+        }
+        Signal {
+            name: "selectedItemChanged"
+            Parameter { name: "index"; type: "int" }
+        }
+        Signal {
+            name: "itemSizeChanged"
+            Parameter { name: "size"; type: "float" }
+        }
+    }
+    Component {
+        name: "QtDataVisualization::QScatterDataProxy"
+        prototype: "QtDataVisualization::QAbstractDataProxy"
+        exports: ["QtDataVisualization/ScatterDataProxy 1.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        Property { name: "itemCount"; type: "int"; isReadonly: true }
+        Property { name: "series"; type: "QScatter3DSeries"; isReadonly: true; isPointer: true }
+        Signal { name: "arrayReset" }
+        Signal {
+            name: "itemsAdded"
+            Parameter { name: "startIndex"; type: "int" }
+            Parameter { name: "count"; type: "int" }
+        }
+        Signal {
+            name: "itemsChanged"
+            Parameter { name: "startIndex"; type: "int" }
+            Parameter { name: "count"; type: "int" }
+        }
+        Signal {
+            name: "itemsRemoved"
+            Parameter { name: "startIndex"; type: "int" }
+            Parameter { name: "count"; type: "int" }
+        }
+        Signal {
+            name: "itemsInserted"
+            Parameter { name: "startIndex"; type: "int" }
+            Parameter { name: "count"; type: "int" }
+        }
+        Signal {
+            name: "itemCountChanged"
+            Parameter { name: "count"; type: "int" }
+        }
+        Signal {
+            name: "seriesChanged"
+            Parameter { name: "series"; type: "QScatter3DSeries"; isPointer: true }
+        }
+    }
+    Component {
+        name: "QtDataVisualization::QSurface3DSeries"
+        prototype: "QtDataVisualization::QAbstract3DSeries"
+        exports: ["QtDataVisualization/QSurface3DSeries 1.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        Enum {
+            name: "DrawFlag"
+            values: {
+                "DrawWireframe": 1,
+                "DrawSurface": 2,
+                "DrawSurfaceAndWireframe": 3
+            }
+        }
+        Enum {
+            name: "DrawFlags"
+            values: {
+                "DrawWireframe": 1,
+                "DrawSurface": 2,
+                "DrawSurfaceAndWireframe": 3
+            }
+        }
+        Property { name: "dataProxy"; type: "QSurfaceDataProxy"; isPointer: true }
+        Property { name: "selectedPoint"; type: "QPoint" }
+        Property { name: "flatShadingEnabled"; type: "bool" }
+        Property { name: "flatShadingSupported"; type: "bool"; isReadonly: true }
+        Property { name: "drawMode"; type: "DrawFlags" }
+        Property { name: "texture"; type: "QImage" }
+        Property { name: "textureFile"; type: "string" }
+        Signal {
+            name: "dataProxyChanged"
+            Parameter { name: "proxy"; type: "QSurfaceDataProxy"; isPointer: true }
+        }
+        Signal {
+            name: "selectedPointChanged"
+            Parameter { name: "position"; type: "QPoint" }
+        }
+        Signal {
+            name: "flatShadingEnabledChanged"
+            Parameter { name: "enable"; type: "bool" }
+        }
+        Signal {
+            name: "flatShadingSupportedChanged"
+            Parameter { name: "enable"; type: "bool" }
+        }
+        Signal {
+            name: "drawModeChanged"
+            Parameter { name: "mode"; type: "QSurface3DSeries::DrawFlags" }
+        }
+        Signal {
+            name: "textureChanged"
+            Parameter { name: "image"; type: "QImage" }
+        }
+        Signal {
+            name: "textureFileChanged"
+            Parameter { name: "filename"; type: "string" }
+        }
+    }
+    Component {
+        name: "QtDataVisualization::QSurfaceDataProxy"
+        prototype: "QtDataVisualization::QAbstractDataProxy"
+        exports: ["QtDataVisualization/SurfaceDataProxy 1.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        Property { name: "rowCount"; type: "int"; isReadonly: true }
+        Property { name: "columnCount"; type: "int"; isReadonly: true }
+        Property { name: "series"; type: "QSurface3DSeries"; isReadonly: true; isPointer: true }
+        Signal { name: "arrayReset" }
+        Signal {
+            name: "rowsAdded"
+            Parameter { name: "startIndex"; type: "int" }
+            Parameter { name: "count"; type: "int" }
+        }
+        Signal {
+            name: "rowsChanged"
+            Parameter { name: "startIndex"; type: "int" }
+            Parameter { name: "count"; type: "int" }
+        }
+        Signal {
+            name: "rowsRemoved"
+            Parameter { name: "startIndex"; type: "int" }
+            Parameter { name: "count"; type: "int" }
+        }
+        Signal {
+            name: "rowsInserted"
+            Parameter { name: "startIndex"; type: "int" }
+            Parameter { name: "count"; type: "int" }
+        }
+        Signal {
+            name: "itemChanged"
+            Parameter { name: "rowIndex"; type: "int" }
+            Parameter { name: "columnIndex"; type: "int" }
+        }
+        Signal {
+            name: "rowCountChanged"
+            Parameter { name: "count"; type: "int" }
+        }
+        Signal {
+            name: "columnCountChanged"
+            Parameter { name: "count"; type: "int" }
+        }
+        Signal {
+            name: "seriesChanged"
+            Parameter { name: "series"; type: "QSurface3DSeries"; isPointer: true }
+        }
+    }
+    Component {
+        name: "QtDataVisualization::QTouch3DInputHandler"
+        prototype: "QtDataVisualization::Q3DInputHandler"
+        exports: ["QtDataVisualization/TouchInputHandler3D 1.2"]
+        exportMetaObjectRevisions: [0]
+    }
+    Component {
+        name: "QtDataVisualization::QValue3DAxis"
+        prototype: "QtDataVisualization::QAbstract3DAxis"
+        exports: [
+            "QtDataVisualization/ValueAxis3D 1.0",
+            "QtDataVisualization/ValueAxis3D 1.1"
+        ]
+        exportMetaObjectRevisions: [0, 1]
+        Property { name: "segmentCount"; type: "int" }
+        Property { name: "subSegmentCount"; type: "int" }
+        Property { name: "labelFormat"; type: "string" }
+        Property { name: "formatter"; revision: 1; type: "QValue3DAxisFormatter"; isPointer: true }
+        Property { name: "reversed"; revision: 1; type: "bool" }
+        Signal {
+            name: "segmentCountChanged"
+            Parameter { name: "count"; type: "int" }
+        }
+        Signal {
+            name: "subSegmentCountChanged"
+            Parameter { name: "count"; type: "int" }
+        }
+        Signal {
+            name: "labelFormatChanged"
+            Parameter { name: "format"; type: "string" }
+        }
+        Signal {
+            name: "formatterChanged"
+            revision: 1
+            Parameter { name: "formatter"; type: "QValue3DAxisFormatter"; isPointer: true }
+        }
+        Signal {
+            name: "reversedChanged"
+            revision: 1
+            Parameter { name: "enable"; type: "bool" }
+        }
+    }
+    Component {
+        name: "QtDataVisualization::QValue3DAxisFormatter"
+        prototype: "QObject"
+        exports: ["QtDataVisualization/ValueAxis3DFormatter 1.1"]
+        exportMetaObjectRevisions: [0]
+    }
+}
diff --git a/deployment_test/QtDataVisualization/qmldir b/deployment_test/QtDataVisualization/qmldir
new file mode 100644
index 0000000000000000000000000000000000000000..bbd178680440e52a25bcdb5fd6e688cbcaf24489
--- /dev/null
+++ b/deployment_test/QtDataVisualization/qmldir
@@ -0,0 +1,4 @@
+module QtDataVisualization
+plugin datavisualizationqml2
+classname QtDataVisualizationQml2Plugin
+
diff --git a/deployment_test/QtGraphicalEffects/Blend.qml b/deployment_test/QtGraphicalEffects/Blend.qml
new file mode 100644
index 0000000000000000000000000000000000000000..e5f4816a9529da8b460f0dbe2405501313d9c87f
--- /dev/null
+++ b/deployment_test/QtGraphicalEffects/Blend.qml
@@ -0,0 +1,486 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Graphical Effects module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtGraphicalEffects.private 1.12
+
+/*!
+    \qmltype Blend
+    \inqmlmodule QtGraphicalEffects
+    \since QtGraphicalEffects 1.0
+    \inherits QtQuick2::Item
+    \ingroup qtgraphicaleffects-blend
+    \brief Merges two source items by using a blend mode.
+
+    Blend mode can be selected with the \l{Blend::mode}{mode} property.
+
+    \table
+    \header
+        \li source
+        \li foregroundSource
+        \li Effect applied
+    \row
+        \li \image Original_bug.png
+        \li \image Original_butterfly.png
+        \li \image Blend_bug_and_butterfly.png
+    \endtable
+
+    \note This effect is available when running with OpenGL.
+
+    \section1 Example
+
+    The following example shows how to apply the effect.
+    \snippet Blend-example.qml example
+
+*/
+
+Item {
+    id: rootItem
+
+    /*!
+        This property defines the source item that is going to be the base when
+        \l{Blend::foregroundSource}{foregroundSource} is blended over it.
+
+        \note It is not supported to let the effect include itself, for
+        instance by setting source to the effect's parent.
+    */
+    property variant source
+
+    /*!
+        This property defines the item that is going to be blended over the
+        \l{Blend::source}{source}.
+
+        \note It is not supported to let the effect include itself, for
+        instance by setting foregroundSource to the effect's parent.
+    */
+    property variant foregroundSource
+
+    /*!
+        This property defines the mode which is used when foregroundSource is
+        blended over source. Values are case insensitive.
+
+        \table
+        \header
+            \li mode
+            \li description
+        \row
+            \li normal
+            \li The pixel component values from foregroundSource are written
+            over source by using alpha blending.
+        \row
+            \li addition
+            \li The pixel component values from source and foregroundSource are
+            added together and written.
+        \row
+            \li average
+            \li The pixel component values from source and foregroundSource are
+            averaged and written.
+        \row
+            \li color
+            \li The lightness value from source is combined with hue and
+            saturation from foregroundSource and written.
+        \row
+            \li colorBurn
+            \li The darker pixels from source are darkened more, if both source
+            and foregroundSource pixels are light the result is light.
+        \row
+            \li colorDodge
+            \li The lighter pixels from source are lightened more, if both
+            source and foregroundSource pixels are dark the result is dark.
+        \row
+            \li darken
+            \li The darker pixel component value from source and
+            foregroundSource is written.
+        \row
+            \li darkerColor
+            \li The lower luminance pixel rgb-value from source and
+            foregroundSource is written.
+        \row
+            \li difference
+            \li The absolute pixel component value difference between source and
+            foregroundSource is written.
+        \row
+            \li divide
+            \li The pixel component values from source is divided by the value
+            from foregroundSource and written.
+        \row
+            \li exclusion
+            \li The pixel component value difference with reduced contrast
+            between source and foregroundSource is written.
+        \row
+            \li hardLight
+            \li The pixel component values from source are lightened or darkened
+            according to foregroundSource values and written.
+        \row
+            \li hue
+            \li The hue value from foregroundSource is combined with saturation
+            and lightness from source and written.
+        \row
+            \li lighten
+            \li The lightest pixel component value from source and
+            foregroundSource is written.
+        \row
+            \li lighterColor
+            \li The higher luminance pixel rgb-value from source and
+            foregroundSource is written.
+        \row
+            \li lightness
+            \li The lightness value from foregroundSource is combined with hue
+            and saturation from source and written.
+        \row
+            \li multiply
+            \li The pixel component values from source and foregroundSource are
+            multiplied together and written.
+        \row
+            \li negation
+            \li The inverted absolute pixel component value difference between
+            source and foregroundSource is written.
+        \row
+            \li saturation
+            \li The saturation value from foregroundSource is combined with hue
+            and lightness from source and written.
+        \row
+            \li screen
+            \li The pixel values from source and foregroundSource are negated,
+            then multiplied, negated again, and written.
+        \row
+            \li subtract
+            \li Pixel value from foregroundSource is subracted from source and
+            written.
+        \row
+            \li softLight
+            \li The pixel component values from source are lightened or darkened
+            slightly according to foregroundSource values and written.
+
+        \endtable
+
+        \table
+        \header
+            \li Example source
+            \li Example foregroundSource
+        \row
+            \li \image Original_bug.png
+            \li \image Original_butterfly.png
+        \endtable
+
+        \table
+        \header
+        \li Output examples with different mode values
+        \li
+        \li
+        \row
+            \li \image Blend_mode1.png
+            \li \image Blend_mode2.png
+            \li \image Blend_mode3.png
+        \row
+            \li \b { mode: normal }
+            \li \b { mode: addition }
+            \li \b { mode: average }
+        \row
+            \li \image Blend_mode4.png
+            \li \image Blend_mode5.png
+            \li \image Blend_mode6.png
+        \row
+            \li \b { mode: color }
+            \li \b { mode: colorBurn }
+            \li \b { mode: colorDodge }
+        \row
+            \li \image Blend_mode7.png
+            \li \image Blend_mode8.png
+            \li \image Blend_mode9.png
+        \row
+            \li \b { mode: darken }
+            \li \b { mode: darkerColor }
+            \li \b { mode: difference }
+        \row
+            \li \image Blend_mode10.png
+            \li \image Blend_mode11.png
+            \li \image Blend_mode12.png
+        \row
+            \li \b { mode: divide }
+            \li \b { mode: exclusion }
+            \li \b { mode: hardlight }
+        \row
+            \li \image Blend_mode13.png
+            \li \image Blend_mode14.png
+            \li \image Blend_mode15.png
+        \row
+            \li \b { mode: hue }
+            \li \b { mode: lighten }
+            \li \b { mode: lighterColor }
+        \row
+            \li \image Blend_mode16.png
+            \li \image Blend_mode17.png
+            \li \image Blend_mode18.png
+        \row
+            \li \b { mode: lightness }
+            \li \b { mode: negation }
+            \li \b { mode: multiply }
+        \row
+            \li \image Blend_mode19.png
+            \li \image Blend_mode20.png
+            \li \image Blend_mode21.png
+        \row
+            \li \b { mode: saturation }
+            \li \b { mode: screen }
+            \li \b { mode: subtract }
+        \row
+            \li \image Blend_mode22.png
+        \row
+            \li \b { mode: softLight }
+        \endtable
+    */
+    property string mode: "normal"
+
+    /*!
+    This property allows the effect output pixels to be cached in order to
+    improve the rendering performance.
+
+    Every time the source or effect properties are changed, the pixels in the
+    cache must be updated. Memory consumption is increased, because an extra
+    buffer of memory is required for storing the effect output.
+
+    It is recommended to disable the cache when the source or the effect
+    properties are animated.
+
+    By default, the property is set to false.
+
+    */
+    property bool cached: false
+
+    SourceProxy {
+        id: backgroundSourceProxy
+        input: rootItem.source
+    }
+
+    SourceProxy {
+        id: foregroundSourceProxy
+        input: rootItem.foregroundSource
+    }
+
+    ShaderEffectSource {
+        id: cacheItem
+        anchors.fill: parent
+        visible: rootItem.cached
+        smooth: true
+        sourceItem: shaderItem
+        live: true
+        hideSource: visible
+    }
+
+    ShaderEffect {
+        id: shaderItem
+        property variant backgroundSource: backgroundSourceProxy.output
+        property variant foregroundSource: foregroundSourceProxy.output
+        property string mode: rootItem.mode
+        anchors.fill: parent
+
+        fragmentShader: fragmentShaderBegin + blendModeNormal + fragmentShaderEnd
+
+        function buildFragmentShader() {
+            var shader = fragmentShaderBegin
+
+            switch (mode.toLowerCase()) {
+                case "addition" : shader += blendModeAddition; break;
+                case "average" : shader += blendModeAverage; break;
+                case "color" : shader += blendModeColor; break;
+                case "colorburn" : shader += blendModeColorBurn; break;
+                case "colordodge" : shader += blendModeColorDodge; break;
+                case "darken" : shader += blendModeDarken; break;
+                case "darkercolor" : shader += blendModeDarkerColor; break;
+                case "difference" : shader += blendModeDifference; break;
+                case "divide" : shader += blendModeDivide; break;
+                case "exclusion" : shader += blendModeExclusion; break;
+                case "hardlight" : shader += blendModeHardLight; break;
+                case "hue" : shader += blendModeHue; break;
+                case "lighten" : shader += blendModeLighten; break;
+                case "lightercolor" : shader += blendModeLighterColor; break;
+                case "lightness" : shader += blendModeLightness; break;
+                case "negation" : shader += blendModeNegation; break;
+                case "normal" : shader += blendModeNormal; break;
+                case "multiply" : shader += blendModeMultiply; break;
+                case "saturation" : shader += blendModeSaturation; break;
+                case "screen" : shader += blendModeScreen; break;
+                case "subtract" : shader += blendModeSubtract; break;
+                case "softlight" : shader += blendModeSoftLight; break;
+                default: shader += "gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);"; break;
+            }
+
+            shader += fragmentShaderEnd
+            fragmentShader = shader
+
+            // Workaraound for a bug just to make sure display gets updated when the mode changes.
+            backgroundSourceChanged()
+        }
+
+        Component.onCompleted: {
+            buildFragmentShader()
+        }
+
+        onModeChanged: {
+            buildFragmentShader()
+        }
+
+        property string blendModeAddition: "result.rgb = min(rgb1 + rgb2, 1.0);"
+        property string blendModeAverage: "result.rgb = 0.5 * (rgb1 + rgb2);"
+        property string blendModeColor: "result.rgb = HSLtoRGB(vec3(RGBtoHSL(rgb2).xy, RGBtoL(rgb1)));"
+        property string blendModeColorBurn: "result.rgb = clamp(1.0 - ((1.0 - rgb1) / max(vec3(1.0 / 256.0), rgb2)), vec3(0.0), vec3(1.0));"
+        property string blendModeColorDodge: "result.rgb = clamp(rgb1 / max(vec3(1.0 / 256.0), (1.0 - rgb2)), vec3(0.0), vec3(1.0));"
+        property string blendModeDarken: "result.rgb = min(rgb1, rgb2);"
+        property string blendModeDarkerColor: "result.rgb = 0.3 * rgb1.r + 0.59 * rgb1.g + 0.11 * rgb1.b > 0.3 * rgb2.r + 0.59 * rgb2.g + 0.11 * rgb2.b ? rgb2 : rgb1;"
+        property string blendModeDifference: "result.rgb = abs(rgb1 - rgb2);"
+        property string blendModeDivide: "result.rgb = clamp(rgb1 / rgb2, 0.0, 1.0);"
+        property string blendModeExclusion: "result.rgb = rgb1 + rgb2 - 2.0 * rgb1 * rgb2;"
+        property string blendModeHardLight: "result.rgb = vec3(channelBlendHardLight(rgb1.r, rgb2.r), channelBlendHardLight(rgb1.g, rgb2.g), channelBlendHardLight(rgb1.b, rgb2.b));"
+        property string blendModeHue: "result.rgb = HSLtoRGB(vec3(RGBtoHSL(rgb2).x, RGBtoHSL(rgb1).yz));"
+        property string blendModeLighten: "result.rgb = max(rgb1, rgb2);"
+        property string blendModeLighterColor: "result.rgb = 0.3 * rgb1.r + 0.59 * rgb1.g + 0.11 * rgb1.b > 0.3 * rgb2.r + 0.59 * rgb2.g + 0.11 * rgb2.b ? rgb1 : rgb2;"
+        property string blendModeLightness: "result.rgb = HSLtoRGB(vec3(RGBtoHSL(rgb1).xy, RGBtoL(rgb2)));"
+        property string blendModeMultiply: "result.rgb = rgb1 * rgb2;"
+        property string blendModeNegation: "result.rgb = 1.0 - abs(1.0 - rgb1 - rgb2);"
+        property string blendModeNormal: "result.rgb = rgb2; a = max(color1.a, color2.a);"
+        property string blendModeSaturation: "lowp vec3 hsl1 = RGBtoHSL(rgb1); result.rgb = HSLtoRGB(vec3(hsl1.x, RGBtoHSL(rgb2).y, hsl1.z));"
+        property string blendModeScreen: "result.rgb = 1.0 - (vec3(1.0) - rgb1) * (vec3(1.0) - rgb2);"
+        property string blendModeSubtract: "result.rgb = max(rgb1 - rgb2, vec3(0.0));"
+        property string blendModeSoftLight: "result.rgb = rgb1 * ((1.0 - rgb1) * rgb2 + (1.0 - (1.0 - rgb1) * (1.0 - rgb2)));"
+
+        property string fragmentCoreShaderWorkaround: (GraphicsInfo.profile === GraphicsInfo.OpenGLCoreProfile ? "#version 150 core
+            #define varying in
+            #define texture2D texture
+            out vec4 fragColor;
+            #define gl_FragColor fragColor
+        " : "")
+
+        property string fragmentShaderBegin: fragmentCoreShaderWorkaround + "
+            varying mediump vec2 qt_TexCoord0;
+            uniform highp float qt_Opacity;
+            uniform lowp sampler2D backgroundSource;
+            uniform lowp sampler2D foregroundSource;
+
+            highp float RGBtoL(highp vec3 color) {
+                highp float cmin = min(color.r, min(color.g, color.b));
+                highp float cmax = max(color.r, max(color.g, color.b));
+                highp float l = (cmin + cmax) / 2.0;
+                return l;
+            }
+
+            highp vec3 RGBtoHSL(highp vec3 color) {
+                highp float cmin = min(color.r, min(color.g, color.b));
+                highp float cmax = max(color.r, max(color.g, color.b));
+                highp float h = 0.0;
+                highp float s = 0.0;
+                highp float l = (cmin + cmax) / 2.0;
+                highp float diff = cmax - cmin;
+
+                if (diff > 1.0 / 256.0) {
+                    if (l < 0.5)
+                        s = diff / (cmin + cmax);
+                    else
+                        s = diff / (2.0 - (cmin + cmax));
+
+                    if (color.r == cmax)
+                        h = (color.g - color.b) / diff;
+                    else if (color.g == cmax)
+                        h = 2.0 + (color.b - color.r) / diff;
+                    else
+                        h = 4.0 + (color.r - color.g) / diff;
+
+                    h /= 6.0;
+                }
+                return vec3(h, s, l);
+                }
+
+            highp float hueToIntensity(highp float v1, highp float v2, highp float h) {
+                h = fract(h);
+                if (h < 1.0 / 6.0)
+                    return v1 + (v2 - v1) * 6.0 * h;
+                else if (h < 1.0 / 2.0)
+                    return v2;
+                else if (h < 2.0 / 3.0)
+                    return v1 + (v2 - v1) * 6.0 * (2.0 / 3.0 - h);
+
+                return v1;
+            }
+
+            highp vec3 HSLtoRGB(highp vec3 color) {
+                highp float h = color.x;
+                highp float l = color.z;
+                highp float s = color.y;
+
+                if (s < 1.0 / 256.0)
+                    return vec3(l, l, l);
+
+                highp float v1;
+                highp float v2;
+                if (l < 0.5)
+                    v2 = l * (1.0 + s);
+                else
+                    v2 = (l + s) - (s * l);
+
+                v1 = 2.0 * l - v2;
+
+                highp float d = 1.0 / 3.0;
+                highp float r = hueToIntensity(v1, v2, h + d);
+                highp float g = hueToIntensity(v1, v2, h);
+                highp float b = hueToIntensity(v1, v2, h - d);
+                return vec3(r, g, b);
+            }
+
+            lowp float channelBlendHardLight(lowp float c1, lowp float c2) {
+                return c2 > 0.5 ? (1.0 - (1.0 - 2.0 * (c2 - 0.5)) * (1.0 - c1)) : (2.0 * c1 * c2);
+            }
+
+            void main() {
+                lowp vec4 result = vec4(0.0);
+                lowp vec4 color1 = texture2D(backgroundSource, qt_TexCoord0);
+                lowp vec4 color2 = texture2D(foregroundSource, qt_TexCoord0);
+                lowp vec3 rgb1 = color1.rgb / max(1.0/256.0, color1.a);
+                lowp vec3 rgb2 = color2.rgb / max(1.0/256.0, color2.a);
+                highp float a = max(color1.a, color1.a * color2.a);
+        "
+
+        property string fragmentShaderEnd: "
+                gl_FragColor.rgb = mix(rgb1, result.rgb, color2.a);
+                gl_FragColor.rbg *= a;
+                gl_FragColor.a = a;
+                gl_FragColor *= qt_Opacity;
+            }
+        "
+    }
+}
diff --git a/deployment_test/QtGraphicalEffects/BrightnessContrast.qml b/deployment_test/QtGraphicalEffects/BrightnessContrast.qml
new file mode 100644
index 0000000000000000000000000000000000000000..85b38bb20bee284b98e6c8edb9a2582d78d22001
--- /dev/null
+++ b/deployment_test/QtGraphicalEffects/BrightnessContrast.qml
@@ -0,0 +1,194 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Graphical Effects module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtGraphicalEffects.private 1.12
+
+/*!
+    \qmltype BrightnessContrast
+    \inqmlmodule QtGraphicalEffects
+    \since QtGraphicalEffects 1.0
+    \inherits QtQuick2::Item
+    \ingroup qtgraphicaleffects-color
+    \brief Adjusts brightness and contrast.
+
+    This effect adjusts the source item colors.
+    Brightness adjustment changes the perceived luminance of the source item.
+    Contrast adjustment increases or decreases the color
+    and brightness variations.
+
+    \table
+    \header
+        \li Source
+        \li Effect applied
+    \row
+        \li \image Original_bug.png
+        \li \image BrightnessContrast_bug.png
+    \endtable
+
+    \note This effect is available when running with OpenGL.
+
+    \section1 Example
+
+    The following example shows how to apply the effect.
+    \snippet BrightnessContrast-example.qml example
+
+*/
+Item {
+    id: rootItem
+
+    /*!
+        This property defines the source item that provides the source pixels
+        for the effect.
+
+        \note It is not supported to let the effect include itself, for
+        instance by setting source to the effect's parent.
+    */
+    property variant source
+
+    /*!
+        This property defines how much the source brightness is increased or
+        decreased.
+
+        The value ranges from -1.0 to 1.0. By default, the property is set to \c
+        0.0 (no change).
+
+        \table
+        \header
+        \li Output examples with different brightness values
+        \li
+        \li
+        \row
+            \li \image BrightnessContrast_brightness1.png
+            \li \image BrightnessContrast_brightness2.png
+            \li \image BrightnessContrast_brightness3.png
+        \row
+            \li \b { brightness: -0.25 }
+            \li \b { brightness: 0 }
+            \li \b { brightness: 0.5 }
+        \row
+            \li \l contrast: 0
+            \li \l contrast: 0
+            \li \l contrast: 0
+        \endtable
+
+    */
+    property real brightness: 0.0
+
+    /*!
+        This property defines how much the source contrast is increased or
+        decreased. The decrease of the contrast is linear, but the increase is
+        applied with a non-linear curve to allow very high contrast adjustment at
+        the high end of the value range.
+
+        \table
+        \header
+            \li Contrast adjustment curve
+        \row
+            \li \image BrightnessContrast_contrast_graph.png
+        \endtable
+
+       The value ranges from -1.0 to 1.0. By default, the property is set to \c 0.0 (no change).
+
+        \table
+        \header
+        \li Output examples with different contrast values
+        \li
+        \li
+        \row
+            \li \image BrightnessContrast_contrast1.png
+            \li \image BrightnessContrast_contrast2.png
+            \li \image BrightnessContrast_contrast3.png
+        \row
+            \li \b { contrast: -0.5 }
+            \li \b { contrast: 0 }
+            \li \b { contrast: 0.5 }
+        \row
+            \li \l brightness: 0
+            \li \l brightness: 0
+            \li \l brightness: 0
+        \endtable
+
+    */
+    property real contrast: 0.0
+
+    /*!
+        This property allows the effect output pixels to be cached in order to
+        improve the rendering performance.
+
+        Every time the source or effect properties are changed, the pixels in
+        the cache must be updated. Memory consumption is increased, because an
+        extra buffer of memory is required for storing the effect output.
+
+        It is recommended to disable the cache when the source or the effect
+        properties are animated.
+
+        By default, the property is set to \c false.
+
+    */
+    property bool cached: false
+
+    SourceProxy {
+        id: sourceProxy
+        input: rootItem.source
+        interpolation: input && input.smooth ? SourceProxy.LinearInterpolation : SourceProxy.NearestInterpolation
+    }
+
+    ShaderEffectSource {
+        id: cacheItem
+        anchors.fill: parent
+        visible: rootItem.cached
+        smooth: true
+        sourceItem: shaderItem
+        live: true
+        hideSource: visible
+    }
+
+    ShaderEffect {
+        id: shaderItem
+        property variant source: sourceProxy.output
+        property real brightness: rootItem.brightness
+        property real contrast: rootItem.contrast
+
+        anchors.fill: parent
+        blending: !rootItem.cached
+
+        fragmentShader: "qrc:/qt-project.org/imports/QtGraphicalEffects/shaders/brightnesscontrast.frag"
+    }
+}
diff --git a/deployment_test/QtGraphicalEffects/ColorOverlay.qml b/deployment_test/QtGraphicalEffects/ColorOverlay.qml
new file mode 100644
index 0000000000000000000000000000000000000000..f3485418ca114a0e3eb2c7512e3522baad7d61b3
--- /dev/null
+++ b/deployment_test/QtGraphicalEffects/ColorOverlay.qml
@@ -0,0 +1,148 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Graphical Effects module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtGraphicalEffects.private 1.12
+
+/*!
+    \qmltype ColorOverlay
+    \inqmlmodule QtGraphicalEffects
+    \since QtGraphicalEffects 1.0
+    \inherits QtQuick2::Item
+    \ingroup qtgraphicaleffects-color
+    \brief Alters the colors of the source item by applying an overlay color.
+
+    The effect is similar to what happens when a colorized glass is put on top
+    of a grayscale image. The color for the overlay is given in the RGBA format.
+
+    \table
+    \header
+        \li Source
+        \li Effect applied
+    \row
+        \li \image Original_butterfly.png
+        \li \image ColorOverlay_butterfly.png
+    \endtable
+
+    \note This effect is available when running with OpenGL.
+
+    \section1 Example
+
+    The following example shows how to apply the effect.
+    \snippet ColorOverlay-example.qml example
+
+*/
+Item {
+    id: rootItem
+
+    /*!
+        This property defines the source item that provides the source pixels
+        for the effect.
+
+        \note It is not supported to let the effect include itself, for
+        instance by setting source to the effect's parent.
+    */
+    property variant source
+
+    /*!
+        This property defines the RGBA color value which is used to colorize the
+        source.
+
+        By default, the property is set to \c "transparent".
+
+        \table
+        \header
+        \li Output examples with different color values
+        \li
+        \li
+        \row
+            \li \image ColorOverlay_color1.png
+            \li \image ColorOverlay_color2.png
+            \li \image ColorOverlay_color3.png
+        \row
+            \li \b { color: #80ff0000 }
+            \li \b { color: #8000ff00 }
+            \li \b { color: #800000ff }
+        \endtable
+
+    */
+    property color color: "transparent"
+
+    /*!
+        This property allows the effect output pixels to be cached in order to
+        improve the rendering performance.
+
+        Every time the source or effect properties are changed, the pixels in
+        the cache must be updated. Memory consumption is increased, because an
+        extra buffer of memory is required for storing the effect output.
+
+        It is recommended to disable the cache when the source or the effect
+        properties are animated.
+
+        By default, the property is set to \c false.
+
+    */
+    property bool cached: false
+
+    SourceProxy {
+        id: sourceProxy
+        input: rootItem.source
+        interpolation: input && input.smooth ? SourceProxy.LinearInterpolation : SourceProxy.NearestInterpolation
+    }
+
+    ShaderEffectSource {
+        id: cacheItem
+        anchors.fill: parent
+        visible: rootItem.cached
+        smooth: true
+        sourceItem: shaderItem
+        live: true
+        hideSource: visible
+    }
+
+    ShaderEffect {
+        id: shaderItem
+        property variant source: sourceProxy.output
+        property color color: rootItem.color
+
+        anchors.fill: parent
+
+        fragmentShader: "qrc:/qt-project.org/imports/QtGraphicalEffects/shaders/coloroverlay.frag"
+    }
+}
diff --git a/deployment_test/QtGraphicalEffects/Colorize.qml b/deployment_test/QtGraphicalEffects/Colorize.qml
new file mode 100644
index 0000000000000000000000000000000000000000..42f17965ff0d94d69ff288b519b76bba3d6a794c
--- /dev/null
+++ b/deployment_test/QtGraphicalEffects/Colorize.qml
@@ -0,0 +1,238 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Graphical Effects module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtGraphicalEffects.private 1.12
+
+/*!
+    \qmltype Colorize
+    \inqmlmodule QtGraphicalEffects
+    \since QtGraphicalEffects 1.0
+    \inherits QtQuick2::Item
+    \ingroup qtgraphicaleffects-color
+    \brief Sets the color in the HSL color space.
+
+    The effect is similar to what happens when a colorized glass is put on top
+    of a grayscale image. Colorize uses the hue, saturation, and lightness (HSL)
+    color space. You can specify a desired value for each property. You can
+    shift all HSL values with the
+    \l{QtGraphicalEffects::HueSaturation}{HueSaturation} effect.
+
+    Alternatively, you can use the
+    \l{QtGraphicalEffects::ColorOverlay}{ColorOverlay} effect to colorize the
+    source item in the RGBA color space.
+
+    \table
+    \header
+        \li Source
+        \li Effect applied
+    \row
+        \li \image Original_bug.png
+        \li \image Colorize_bug.png
+    \endtable
+
+    \note This effect is available when running with OpenGL.
+
+    \section1 Example
+
+    The following example shows how to apply the effect.
+    \snippet Colorize-example.qml example
+*/
+Item {
+    id: rootItem
+
+    /*!
+        This property defines the source item that provides the source pixels
+        for the effect.
+
+        \note It is not supported to let the effect include itself, for
+        instance by setting source to the effect's parent.
+    */
+    property variant source
+
+    /*!
+        This property defines the hue value which is used to colorize the
+        source.
+
+        The value ranges from 0.0 to 1.0. By default, the property is set to \c
+        0.0, which produces a slightly red color.
+
+        \table
+        \header
+            \li Allowed hue values
+        \row
+            \li \image Colorize_hue_scale.png
+        \endtable
+
+        \table
+        \header
+        \li Output examples with different hue values
+        \li
+        \li
+        \row
+            \li \image Colorize_hue1.png
+            \li \image Colorize_hue2.png
+            \li \image Colorize_hue3.png
+        \row
+            \li \b { hue: 0.2 }
+            \li \b { hue: 0.5 }
+            \li \b { hue: 0.8 }
+        \row
+            \li \l saturation: 1
+            \li \l saturation: 1
+            \li \l saturation: 1
+        \row
+            \li \l lightness: 0
+            \li \l lightness: 0
+            \li \l lightness: 0
+        \endtable
+    */
+    property real hue: 0.0
+
+    /*!
+        This property defines the saturation value which is used to colorize the
+        source.
+
+        The value ranges from 0.0 (desaturated) to 1.0 (saturated). By default,
+        the property is set to \c 1.0 (saturated).
+
+        \table
+        \header
+        \li Output examples with different saturation values
+        \li
+        \li
+        \row
+            \li \image Colorize_saturation1.png
+            \li \image Colorize_saturation2.png
+            \li \image Colorize_saturation3.png
+        \row
+            \li \b { saturation: 0 }
+            \li \b { saturation: 0.5 }
+            \li \b { saturation: 1 }
+        \row
+            \li \l hue: 0
+            \li \l hue: 0
+            \li \l hue: 0
+        \row
+            \li \l lightness: 0
+            \li \l lightness: 0
+            \li \l lightness: 0
+        \endtable
+    */
+    property real saturation: 1.0
+
+    /*!
+        This property defines how much the source lightness value is increased
+        or decreased.
+
+        Unlike hue and saturation properties, lightness does not set the used
+        value, but it shifts the existing source pixel lightness value.
+
+        The value ranges from -1.0 (decreased) to 1.0 (increased). By default,
+        the property is set to \c 0.0 (no change).
+
+        \table
+        \header
+        \li Output examples with different lightness values
+        \li
+        \li
+        \row
+            \li \image Colorize_lightness1.png
+            \li \image Colorize_lightness2.png
+            \li \image Colorize_lightness3.png
+        \row
+            \li \b { lightness: -0.75 }
+            \li \b { lightness: 0 }
+            \li \b { lightness: 0.75 }
+        \row
+            \li \l hue: 0
+            \li \l hue: 0
+            \li \l hue: 0
+        \row
+            \li \l saturation: 1
+            \li \l saturation: 1
+            \li \l saturation: 1
+        \endtable
+    */
+    property real lightness: 0.0
+
+    /*!
+        This property allows the effect output pixels to be cached in order to
+        improve the rendering performance.
+
+        Every time the source or effect properties are changed, the pixels in
+        the cache must be updated. Memory consumption is increased, because an
+        extra buffer of memory is required for storing the effect output.
+
+        It is recommended to disable the cache when the source or the effect
+        properties are animated.
+
+        By default, the property is set to \c false.
+    */
+    property bool cached: false
+
+    SourceProxy {
+        id: sourceProxy
+        input: rootItem.source
+        interpolation: input && input.smooth ? SourceProxy.LinearInterpolation : SourceProxy.NearestInterpolation
+    }
+
+    ShaderEffectSource {
+        id: cacheItem
+        anchors.fill: parent
+        visible: rootItem.cached
+        smooth: true
+        sourceItem: shaderItem
+        live: true
+        hideSource: visible
+    }
+
+    ShaderEffect {
+        id: shaderItem
+        property variant source: sourceProxy.output
+        property real hue: rootItem.hue
+        property real saturation: rootItem.saturation
+        property real lightness: rootItem.lightness
+
+        anchors.fill: parent
+
+        fragmentShader: "qrc:/qt-project.org/imports/QtGraphicalEffects/shaders/colorize.frag"
+
+    }
+}
diff --git a/deployment_test/QtGraphicalEffects/ConicalGradient.qml b/deployment_test/QtGraphicalEffects/ConicalGradient.qml
new file mode 100644
index 0000000000000000000000000000000000000000..c8d68b1b78273629a6f7e7f905367a4dc0cfa2cd
--- /dev/null
+++ b/deployment_test/QtGraphicalEffects/ConicalGradient.qml
@@ -0,0 +1,333 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Graphical Effects module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtGraphicalEffects.private 1.12
+
+/*!
+    \qmltype ConicalGradient
+    \inqmlmodule QtGraphicalEffects
+    \since QtGraphicalEffects 1.0
+    \inherits QtQuick2::Item
+    \ingroup qtgraphicaleffects-gradient
+    \brief Draws a conical gradient.
+
+    A gradient is defined by two or more colors, which are blended seamlessly.
+    The colors start from the specified angle and end at 360 degrees larger
+    angle value.
+
+    \table
+    \header
+        \li Effect applied
+    \row
+        \li \image ConicalGradient.png
+    \endtable
+
+    \note This effect is available when running with OpenGL.
+
+    \section1 Example
+
+    The following example shows how to apply the effect.
+    \snippet ConicalGradient-example.qml example
+
+*/
+Item {
+    id: rootItem
+
+    /*!
+        This property allows the effect output pixels to be cached in order to
+        improve the rendering performance.
+
+        Every time the source or effect properties are changed, the pixels in
+        the cache must be updated. Memory consumption is increased, because an
+        extra buffer of memory is required for storing the effect output.
+
+        It is recommended to disable the cache when the source or the effect
+        properties are animated.
+
+        By default, the property is set to \c false.
+
+    */
+    property bool cached: false
+
+    /*!
+        This property defines the starting angle where the color at the gradient
+        position of 0.0 is rendered. Colors at larger position values are
+        rendered into larger angle values and blended seamlessly. Angle values
+        increase clockwise.
+
+        \table
+        \header
+        \li Output examples with different angle values
+        \li
+        \li
+        \row
+            \li \image ConicalGradient_angle1.png
+            \li \image ConicalGradient_angle2.png
+            \li \image ConicalGradient_angle3.png
+        \row
+            \li \b { angle: 0 }
+            \li \b { angle: 45 }
+            \li \b { angle: 185 }
+        \row
+            \li \l horizontalOffset: 0
+            \li \l horizontalOffset: 0
+            \li \l horizontalOffset: 0
+        \row
+            \li \l verticalOffset: 0
+            \li \l verticalOffset: 0
+            \li \l verticalOffset: 0
+        \endtable
+
+    */
+    property real angle: 0.0
+
+    /*!
+    \qmlproperty real QtGraphicalEffects::ConicalGradient::horizontalOffset
+    \qmlproperty real QtGraphicalEffects::ConicalGradient::verticalOffset
+
+    The horizontalOffset and verticalOffset properties define the offset in
+    pixels for the center point of the gradient compared to the item center.
+
+    The value ranges from -inf to inf. By default, the properties are set to \c
+    0.
+
+    \table
+    \header
+    \li Output examples with different horizontalOffset values
+    \li
+    \li
+    \row
+        \li \image ConicalGradient_horizontalOffset1.png
+        \li \image ConicalGradient_horizontalOffset2.png
+        \li \image ConicalGradient_horizontalOffset3.png
+    \row
+        \li \b { horizontalOffset: -50 }
+        \li \b { horizontalOffset: 0 }
+        \li \b { horizontalOffset: 50 }
+    \row
+        \li \l angle: 0
+        \li \l angle: 0
+        \li \l angle: 0
+    \row
+        \li \l verticalOffset: 0
+        \li \l verticalOffset: 0
+        \li \l verticalOffset: 0
+    \endtable
+    */
+    property real horizontalOffset: 0.0
+    property real verticalOffset: 0.0
+
+    /*!
+        This property defines the item that is going to be filled with gradient.
+        Source item gets rendered into an intermediate pixel buffer and the
+        alpha values from the result are used to determine the gradient's pixels
+        visibility in the display. The default value for source is undefined and
+        in that case whole effect area is filled with gradient.
+
+        \table
+        \header
+        \li Output examples with different source values
+        \li
+        \row
+            \li \image ConicalGradient_maskSource1.png
+            \li \image ConicalGradient_maskSource2.png
+        \row
+            \li \b { source: undefined }
+            \li \b { source:  }
+        \row
+            \li \l angle: 0
+            \li \l angle: 0
+        \row
+            \li \l horizontalOffset: 0
+            \li \l horizontalOffset: 0
+        \row
+            \li \l verticalOffset: 0
+            \li \l verticalOffset: 0
+        \endtable
+
+
+        \note It is not supported to let the effect include itself, for
+        instance by setting source to the effect's parent.
+    */
+    property variant source
+
+/*!
+    A gradient is defined by two or more colors, which are blended seamlessly.
+    The colors are specified as a set of GradientStop child items, each of which
+    defines a position on the gradient (from 0.0 to 1.0), and a color.
+    The position of each GradientStop is defined by the position property.
+    The color is defined by the color property.
+
+    \table
+    \header
+    \li Output examples with different gradient values
+    \li
+    \li
+    \row
+        \li \image ConicalGradient_gradient1.png
+        \li \image ConicalGradient_gradient2.png
+        \li \image ConicalGradient_gradient3.png
+    \row
+        \li \b {gradient:} \code
+Gradient {
+  GradientStop {
+     position: 0.000
+     color: Qt.rgba(1, 0, 0, 1)
+  }
+  GradientStop {
+     position: 0.167
+     color: Qt.rgba(1, 1, 0, 1)
+  }
+  GradientStop {
+     position: 0.333
+     color: Qt.rgba(0, 1, 0, 1)
+  }
+  GradientStop {
+     position: 0.500
+     color: Qt.rgba(0, 1, 1, 1)
+  }
+  GradientStop {
+     position: 0.667
+     color: Qt.rgba(0, 0, 1, 1)
+  }
+  GradientStop {
+     position: 0.833
+     color: Qt.rgba(1, 0, 1, 1)
+  }
+  GradientStop {
+     position: 1.000
+     color: Qt.rgba(1, 0, 0, 1)
+  }
+}
+    \endcode
+        \li \b {gradient:} \code
+Gradient {
+  GradientStop {
+     position: 0.0
+     color: "#F0F0F0"
+  }
+  GradientStop {
+     position: 0.5
+     color: "#000000"
+  }
+  GradientStop {
+     position: 1.0
+     color: "#F0F0F0"
+  }
+}
+    \endcode
+        \li \b {gradient:} \code
+Gradient {
+  GradientStop {
+     position: 0.0
+     color: "#00000000"
+  }
+  GradientStop {
+    position: 1.0
+    color: "#FF000000"
+  }
+}
+    \endcode
+    \row
+        \li \l angle: 0
+        \li \l angle: 0
+        \li \l angle: 0
+    \row
+        \li \l horizontalOffset: 0
+        \li \l horizontalOffset: 0
+        \li \l horizontalOffset: 0
+    \row
+        \li \l verticalOffset: 0
+        \li \l verticalOffset: 0
+        \li \l verticalOffset: 0
+    \endtable
+
+*/
+    property Gradient gradient: Gradient {
+        GradientStop { position: 0.0; color: "white" }
+        GradientStop { position: 1.0; color: "black" }
+    }
+
+    SourceProxy {
+        id: maskSourceProxy
+        input: rootItem.source
+    }
+
+    Rectangle {
+        id: gradientRect
+        width: 16
+        height: 256
+        gradient: rootItem.gradient
+        smooth: true
+   }
+
+    ShaderEffectSource {
+        id: cacheItem
+        anchors.fill: parent
+        visible: rootItem.cached
+        smooth: true
+        rotation: shaderItem.rotation
+        sourceItem: shaderItem
+        live: true
+        hideSource: visible
+    }
+
+    ShaderEffect {
+        id: shaderItem
+        property variant gradientSource: ShaderEffectSource {
+            sourceItem: gradientRect
+            smooth: true
+            hideSource: true
+            visible: false
+        }
+        property variant maskSource: maskSourceProxy.output
+        property real startAngle: (rootItem.angle - 90) * Math.PI/180
+        property variant center: Qt.point(0.5 + horizontalOffset / width, 0.5 + verticalOffset / height)
+
+        anchors.fill: parent
+
+        fragmentShader: maskSource == undefined ? noMaskShader : maskShader
+
+        onFragmentShaderChanged: startAngleChanged()
+
+        property string noMaskShader: "qrc:/qt-project.org/imports/QtGraphicalEffects/shaders/conicalgradient_nomask.frag"
+        property string maskShader:   "qrc:/qt-project.org/imports/QtGraphicalEffects/shaders/conicalgradient_mask.frag"
+    }
+}
diff --git a/deployment_test/QtGraphicalEffects/Desaturate.qml b/deployment_test/QtGraphicalEffects/Desaturate.qml
new file mode 100644
index 0000000000000000000000000000000000000000..e56de5532ce44d2f12e411649c35a92abaffc6e4
--- /dev/null
+++ b/deployment_test/QtGraphicalEffects/Desaturate.qml
@@ -0,0 +1,147 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Graphical Effects module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtGraphicalEffects.private 1.12
+
+/*!
+    \qmltype Desaturate
+    \inqmlmodule QtGraphicalEffects
+    \since QtGraphicalEffects 1.0
+    \inherits QtQuick2::Item
+    \ingroup qtgraphicaleffects-color
+    \brief Reduces the saturation of the colors.
+
+   Desaturated pixel values are calculated as averages of the original RGB
+   component values of the source item.
+
+    \table
+    \header
+        \li Source
+        \li Effect applied
+    \row
+        \li \image Original_bug.png
+        \li \image Desaturate_bug.png
+    \endtable
+
+    \note This effect is available when running with OpenGL.
+
+    \section1 Example
+
+    The following example shows how to apply the effect.
+    \snippet Desaturate-example.qml example
+
+*/
+Item {
+    id: rootItem
+
+    /*!
+        This property defines the source item that provides the source pixels to
+        the effect.
+
+        \note It is not supported to let the effect include itself, for
+        instance by setting source to the effect's parent.
+    */
+    property variant source
+
+    /*!
+        This property defines how much the source colors are desaturated.
+
+        The value ranges from 0.0 (no change) to 1.0 (desaturated). By default,
+        the property is set to \c 0.0 (no change).
+
+        \table
+        \header
+        \li Output examples with different desaturation values
+        \li
+        \li
+        \row
+            \li \image Desaturate_desaturation1.png
+            \li \image Desaturate_desaturation2.png
+            \li \image Desaturate_desaturation3.png
+        \row
+            \li \b { desaturation: 0.0 }
+            \li \b { desaturation: 0.5 }
+            \li \b { desaturation: 1.0 }
+        \endtable
+    */
+    property real desaturation: 0.0
+
+    /*!
+        This property allows the effect output pixels to be cached in order to
+        improve the rendering performance.
+
+        Every time the source or effect properties are changed, the pixels in
+        the cache must be updated. Memory consumption is increased, because an
+        extra buffer of memory is required for storing the effect output.
+
+        It is recommended to disable the cache when the source or the effect
+        properties are animated.
+
+        By default, the property is set to \c false.
+
+    */
+    property bool cached: false
+
+    SourceProxy {
+        id: sourceProxy
+        input: rootItem.source
+        interpolation: input && input.smooth ? SourceProxy.LinearInterpolation : SourceProxy.NearestInterpolation
+    }
+
+    ShaderEffectSource {
+        id: cacheItem
+        anchors.fill: parent
+        visible: rootItem.cached
+        smooth: true
+        sourceItem: shaderItem
+        live: true
+        hideSource: visible
+    }
+
+    ShaderEffect {
+        id: shaderItem
+        property variant source: sourceProxy.output
+        property real desaturation: rootItem.desaturation
+
+        anchors.fill: parent
+
+        fragmentShader: "qrc:/qt-project.org/imports/QtGraphicalEffects/shaders/desaturate.frag"
+    }
+}
diff --git a/deployment_test/QtGraphicalEffects/DirectionalBlur.qml b/deployment_test/QtGraphicalEffects/DirectionalBlur.qml
new file mode 100644
index 0000000000000000000000000000000000000000..42ea0781a841f544e2cef54ebe788eddf2020588
--- /dev/null
+++ b/deployment_test/QtGraphicalEffects/DirectionalBlur.qml
@@ -0,0 +1,293 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Graphical Effects module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtGraphicalEffects.private 1.12
+
+/*!
+    \qmltype DirectionalBlur
+    \inqmlmodule QtGraphicalEffects
+    \since QtGraphicalEffects 1.0
+    \inherits QtQuick2::Item
+    \ingroup qtgraphicaleffects-motion-blur
+    \brief Applies blur effect to the specified direction.
+
+    Effect creates perceived impression that the source item appears to be
+    moving in the direction of the blur. Blur is applied to both sides of
+    each pixel, therefore setting the direction to 0 and 180 provides the
+    same result.
+
+    Other available motionblur effects are \l{QtGraphicalEffects::ZoomBlur}{ZoomBlur} and
+    \l{QtGraphicalEffects::RadialBlur}{RadialBlur}.
+
+    \table
+    \header
+        \li Source
+        \li Effect applied
+    \row
+        \li \image Original_bug.png
+        \li \image DirectionalBlur_bug.png
+    \endtable
+
+    \note This effect is available when running with OpenGL.
+
+    \section1 Example
+
+    The following example shows how to apply the effect.
+    \snippet DirectionalBlur-example.qml example
+
+*/
+Item {
+    id: rootItem
+
+    /*!
+        This property defines the source item that is going to be blurred.
+
+        \note It is not supported to let the effect include itself, for
+        instance by setting source to the effect's parent.
+    */
+    property variant source
+
+    /*!
+        This property defines the perceived amount of movement for each pixel.
+        The movement is divided evenly to both sides of each pixel.
+
+        The quality of the blur depends on \l{DirectionalBlur::samples}{samples}
+        property. If length value is large, more samples are needed to keep the
+        visual quality at high level.
+
+        The value ranges from 0.0 to inf.
+        By default the property is set to \c 0.0 (no blur).
+
+        \table
+        \header
+        \li Output examples with different length values
+        \li
+        \li
+        \row
+            \li \image DirectionalBlur_length1.png
+            \li \image DirectionalBlur_length2.png
+            \li \image DirectionalBlur_length3.png
+        \row
+            \li \b { length: 0.0 }
+            \li \b { length: 32.0 }
+            \li \b { length: 48.0 }
+        \row
+            \li \l samples: 24
+            \li \l samples: 24
+            \li \l samples: 24
+        \row
+            \li \l angle: 0
+            \li \l angle: 0
+            \li \l angle: 0
+        \endtable
+
+    */
+    property real length: 0.0
+
+    /*!
+        This property defines how many samples are taken per pixel when blur
+        calculation is done. Larger value produces better quality, but is slower
+        to render.
+
+        This property is not intended to be animated. Changing this property may
+        cause the underlying OpenGL shaders to be recompiled.
+
+        Allowed values are between 0 and inf (practical maximum depends on GPU).
+        By default the property is set to \c 0 (no samples).
+
+    */
+    property int samples: 0
+
+    /*!
+        This property defines the direction for the blur. Blur is applied to
+        both sides of each pixel, therefore setting the direction to 0 and 180
+        produces the same result.
+
+        The value ranges from -180.0 to 180.0.
+        By default the property is set to \c 0.0.
+
+        \table
+        \header
+        \li Output examples with different angle values
+        \li
+        \li
+        \row
+            \li \image DirectionalBlur_angle1.png
+            \li \image DirectionalBlur_angle2.png
+            \li \image DirectionalBlur_angle3.png
+        \row
+            \li \b { angle: 0.0 }
+            \li \b { angle: 45.0 }
+            \li \b { angle: 90.0 }
+        \row
+            \li \l samples: 24
+            \li \l samples: 24
+            \li \l samples: 24
+        \row
+            \li \l length: 32
+            \li \l length: 32
+            \li \l length: 32
+        \endtable
+
+    */
+    property real angle: 0.0
+
+    /*!
+        This property defines the blur behavior near the edges of the item,
+        where the pixel blurring is affected by the pixels outside the source
+        edges.
+
+        If the property is set to \c true, the pixels outside the source are
+        interpreted to be transparent, which is similar to OpenGL
+        clamp-to-border extension. The blur is expanded slightly outside the
+        effect item area.
+
+        If the property is set to \c false, the pixels outside the source are
+        interpreted to contain the same color as the pixels at the edge of the
+        item, which is similar to OpenGL clamp-to-edge behavior. The blur does
+        not expand outside the effect item area.
+
+        By default, the property is set to \c false.
+
+    */
+    property bool transparentBorder: false
+
+    /*!
+        This property allows the effect output pixels to be cached in order to
+        improve the rendering performance.
+
+        Every time the source or effect properties are changed, the pixels in
+        the cache must be updated. Memory consumption is increased, because an
+        extra buffer of memory is required for storing the effect output.
+
+        It is recommended to disable the cache when the source or the effect
+        properties are animated.
+
+        By default, the property is set to \c false.
+
+    */
+    property bool cached: false
+
+    SourceProxy {
+        id: sourceProxy
+        input: rootItem.source
+        sourceRect: rootItem.transparentBorder ? Qt.rect(-1, -1, parent.width + 2.0, parent.height + 2.0) : Qt.rect(0, 0, 0, 0)
+    }
+
+    ShaderEffectSource {
+        id: cacheItem
+        anchors.fill: shaderItem
+        visible: rootItem.cached
+        smooth: true
+        sourceItem: shaderItem
+        live: true
+        hideSource: visible
+    }
+
+    ShaderEffect {
+        id: shaderItem
+        property variant source: sourceProxy.output
+        property real len: rootItem.length
+        property bool transparentBorder: rootItem.transparentBorder
+        property real samples: rootItem.samples
+        property real weight: 1.0 / Math.max(1.0, rootItem.samples)
+        property variant expandPixels: transparentBorder ? Qt.size(rootItem.samples, rootItem.samples) : Qt.size(0,0)
+        property variant expand: transparentBorder ? Qt.size(expandPixels.width / width, expandPixels.height / height) : Qt.size(0,0)
+        property variant delta: Qt.size(1.0 / rootItem.width * Math.cos((rootItem.angle + 90) * Math.PI/180), 1.0 / rootItem.height * Math.sin((rootItem.angle + 90) * Math.PI/180))
+
+        x: transparentBorder ? -expandPixels.width - 1: 0
+        y: transparentBorder ? -expandPixels.height - 1 : 0
+        width: transparentBorder ? parent.width + 2.0 * expandPixels.width + 2 : parent.width
+        height: transparentBorder ? parent.height + 2.0 * expandPixels.height + 2 : parent.height
+
+        property string fragmentShaderSkeleton: "
+            varying highp vec2 qt_TexCoord0;
+            uniform highp float qt_Opacity;
+            uniform lowp sampler2D source;
+            uniform highp float len;
+            uniform highp float samples;
+            uniform highp float weight;
+            uniform highp vec2 expand;
+            uniform highp vec2 delta;
+
+            void main(void) {
+                highp vec2 shift = delta * len / max(1.0, samples - 1.0);
+                mediump vec2 texCoord = qt_TexCoord0;
+                gl_FragColor = vec4(0.0);
+
+                PLACEHOLDER_EXPAND_STEPS
+
+                texCoord -= shift * max(0.0, samples - 1.0) * 0.5;
+
+                PLACEHOLDER_UNROLLED_LOOP
+
+                gl_FragColor *= weight * qt_Opacity;
+           }
+        "
+
+        function buildFragmentShader() {
+            var shader = ""
+            if (GraphicsInfo.profile === GraphicsInfo.OpenGLCoreProfile)
+                shader += "#version 150 core\n#define varying in\n#define texture2D texture\nout vec4 fragColor;\n#define gl_FragColor fragColor\n"
+            shader += fragmentShaderSkeleton
+            var expandSteps = ""
+
+            if (transparentBorder) {
+                expandSteps += "texCoord = (texCoord - expand) / (1.0 - 2.0 * expand);"
+            }
+
+            var unrolledLoop = "gl_FragColor += texture2D(source, texCoord);\n"
+
+            if (rootItem.samples > 1) {
+                unrolledLoop = ""
+                for (var i = 0; i < rootItem.samples; i++)
+                    unrolledLoop += "gl_FragColor += texture2D(source, texCoord); texCoord += shift;\n"
+            }
+
+            shader = shader.replace("PLACEHOLDER_EXPAND_STEPS", expandSteps)
+            fragmentShader = shader.replace("PLACEHOLDER_UNROLLED_LOOP", unrolledLoop)
+        }
+
+        onFragmentShaderChanged: sourceChanged()
+        onSamplesChanged: buildFragmentShader()
+        onTransparentBorderChanged: buildFragmentShader()
+        Component.onCompleted: buildFragmentShader()
+    }
+}
diff --git a/deployment_test/QtGraphicalEffects/Displace.qml b/deployment_test/QtGraphicalEffects/Displace.qml
new file mode 100644
index 0000000000000000000000000000000000000000..3400222954422090e5c4e78a4414ecd980c56c01
--- /dev/null
+++ b/deployment_test/QtGraphicalEffects/Displace.qml
@@ -0,0 +1,190 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Graphical Effects module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtGraphicalEffects.private 1.12
+
+/*!
+    \qmltype Displace
+    \inqmlmodule QtGraphicalEffects
+    \since QtGraphicalEffects 1.0
+    \inherits QtQuick2::Item
+    \ingroup qtgraphicaleffects-distortion
+    \brief Moves the pixels of the source item according to the given
+    displacement map.
+
+    \table
+    \header
+        \li Source
+        \li DisplacementSource
+        \li Effect applied
+    \row
+        \li \image Original_bug.png
+        \li \image Displace_map.png
+        \li \image Displace_bug.png
+    \endtable
+
+    \note This effect is available when running with OpenGL.
+
+    \section1 Example
+
+    The following example shows how to apply the effect.
+    \snippet Displace-example.qml example
+
+*/
+Item {
+    id: rootItem
+
+    /*!
+        This property defines the source item for the pixels that are going to
+        be displaced according to the data from
+        \l{Displace::displacementSource}{displacementSource}.
+
+        \note It is not supported to let the effect include itself, for
+        instance by setting source to the effect's parent.
+    */
+    property variant source
+
+    /*!
+        This property defines the item that is going to be used as the
+        displacement map. The displacementSource item gets rendered into the
+        intermediate pixel buffer. The red and green component values from the
+        result determine the displacement of the pixels from the source item.
+
+        The format for the displacement map is similar to the tangent space
+        normal maps, which can be created with most 3D-modeling tools. Many
+        image processing tools include the support for generating normal maps.
+        Alternatively, the displacement map for this effect can also be a QML
+        element which is colored appropriately. Like any QML element, it can be
+        animated. It is recommended that the size of the diplacement map matches
+        the size of the \l{Displace::source}{source}.
+
+        The displace data is interpreted in the RGBA format. For every pixel:
+        the red channel stores the x-axis displacement, and the green channel
+        stores the y-axis displacement. Blue and alpha channels are ignored for
+        this effect.
+
+        Assuming that red channel value 1.0 is fully red (0.0 having no red at
+        all), this effect considers pixel component value 0.5 to cause no
+        displacement at all. Values above 0.5 shift pixels to the left, values
+        below 0.5 do the shift to the right. In a similar way, green channel
+        values above 0.5 displace the pixels upwards, and values below 0.5 shift
+        the pixels downwards. The actual amount of displacement in pixels
+        depends on the \l displacement property.
+
+    */
+    property variant displacementSource
+
+    /*!
+        This property defines the scale for the displacement. The bigger scale,
+        the bigger the displacement of the pixels. The value set to 0.0 causes
+        no displacement.
+
+        The value ranges from -1.0 (inverted maximum shift, according to
+        displacementSource) to 1.0 (maximum shift, according to
+        displacementSource). By default, the property is set to \c 0.0 (no
+        displacement).
+
+        \table
+        \header
+        \li Output examples with different displacement values
+        \li
+        \li
+        \row
+            \li \image Displace_displacement1.png
+            \li \image Displace_displacement2.png
+            \li \image Displace_displacement3.png
+        \row
+            \li \b { displacement: -0.2 }
+            \li \b { displacement: 0.0 }
+            \li \b { displacement: 0.2 }
+        \endtable
+
+    */
+    property real displacement: 0.0
+
+    /*!
+        This property allows the effect output pixels to be cached in order to
+        improve the rendering performance.
+
+        Every time the source or effect properties are changed, the pixels in
+        the cache must be updated. Memory consumption is increased, because an
+        extra buffer of memory is required for storing the effect output.
+
+        It is recommended to disable the cache when the source or the effect
+        properties are animated.
+
+        By default, the property is set to \c false.
+
+    */
+    property bool cached: false
+
+    SourceProxy {
+        id: sourceProxy
+        input: rootItem.source
+    }
+
+    SourceProxy {
+        id: displacementSourceProxy
+        input: rootItem.displacementSource
+    }
+
+    ShaderEffectSource {
+        id: cacheItem
+        anchors.fill: parent
+        visible: rootItem.cached
+        smooth: true
+        sourceItem: shaderItem
+        live: true
+        hideSource: visible
+    }
+
+    ShaderEffect {
+        id: shaderItem
+        property variant source: sourceProxy.output
+        property variant displacementSource: displacementSourceProxy.output
+        property real displacement: rootItem.displacement
+        property real xPixel: 1.0/width
+        property real yPixel: 1.0/height
+
+        anchors.fill: parent
+
+        fragmentShader: "qrc:/qt-project.org/imports/QtGraphicalEffects/shaders/displace.frag"
+    }
+}
diff --git a/deployment_test/QtGraphicalEffects/DropShadow.qml b/deployment_test/QtGraphicalEffects/DropShadow.qml
new file mode 100644
index 0000000000000000000000000000000000000000..0f30e5aa4d82955d697b2b7422226ef79fb846e2
--- /dev/null
+++ b/deployment_test/QtGraphicalEffects/DropShadow.qml
@@ -0,0 +1,362 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Copyright (C) 2017 Jolla Ltd, author: <gunnar.sletta@jollamobile.com>
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Graphical Effects module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtGraphicalEffects.private 1.12
+
+/*!
+    \qmltype DropShadow
+    \inqmlmodule QtGraphicalEffects
+    \since QtGraphicalEffects 1.0
+    \inherits QtQuick2::Item
+    \ingroup qtgraphicaleffects-drop-shadow
+
+    \brief Generates a soft shadow behind the source item.
+
+    The DropShadow effect blurs the alpha channel of the input, colorizes the
+    result and places it behind the source object to create a soft shadow. The
+    shadow's color can be changed using the \l {DropShadow::color}{color}
+    property. The location of the shadow can be changed with the \l
+    horizontalOffset and \l verticalOffset properties.
+
+    \table
+    \header
+        \li Source
+        \li Effect applied
+    \row
+        \li \image Original_butterfly.png
+        \li \image DropShadow_butterfly.png
+    \endtable
+
+    The soft shadow is created by blurring the image live using a gaussian
+    blur. Performing blur live is a costly operation. Fullscreen gaussian blur
+    with even a moderate number of samples will only run at 60 fps on highend
+    graphics hardware.
+
+    When the source is static, the \l cached property can be set to allocate
+    another buffer to avoid performing the blur every time it is drawn.
+
+    \note This effect is available when running with OpenGL.
+
+    \section1 Example
+
+    The following example shows how to apply the effect.
+    \snippet DropShadow-example.qml example
+
+*/
+Item {
+    id: root
+
+    DropShadowBase {
+        id: dbs
+        anchors.fill: parent
+    }
+
+    /*!
+        This property defines the source item that is going to be used as the
+        source for the generated shadow.
+
+        \note It is not supported to let the effect include itself, for
+        instance by setting source to the effect's parent.
+    */
+    property alias source: dbs.source
+
+    /*!
+        \qmlproperty int DropShadow::radius
+
+        Radius defines the softness of the shadow. A larger radius causes the
+        edges of the shadow to appear more blurry.
+
+        The ideal blur is achieved by selecting \c samples and \c radius such
+        that \c {samples = 1 + radius * 2}, such as:
+
+        \table
+        \header \li Radius             \li Samples
+        \row    \li 0 \e{(no blur)}    \li 1
+        \row    \li 1                  \li 3
+        \row    \li 2                  \li 5
+        \row    \li 3                  \li 7
+        \endtable
+
+        By default, the property is set to \c {floor(samples/2)}.
+
+        \table
+        \header
+        \li Output examples with different radius values
+        \li
+        \li
+        \row
+            \li \image DropShadow_radius1.png
+            \li \image DropShadow_radius2.png
+            \li \image DropShadow_radius3.png
+        \row
+            \li \b { radius: 0 }
+            \li \b { radius: 6 }
+            \li \b { radius: 12 }
+        \row
+            \li \l samples: 25
+            \li \l samples: 25
+            \li \l samples: 25
+        \row
+            \li \l color: #000000
+            \li \l color: #000000
+            \li \l color: #000000
+        \row
+            \li \l horizontalOffset: 0
+            \li \l horizontalOffset: 0
+            \li \l horizontalOffset: 0
+        \row
+            \li \l verticalOffset: 20
+            \li \l verticalOffset: 20
+            \li \l verticalOffset: 20
+        \row
+            \li \l spread: 0
+            \li \l spread: 0
+            \li \l spread: 0
+        \endtable
+    */
+    property alias radius: dbs.radius;
+
+    /*!
+        This property defines how many samples are taken per pixel when edge
+        softening blur calculation is done. Larger value produces better
+        quality, but is slower to render.
+
+        Ideally, this value should be twice as large as the highest required
+        radius value plus one, such as:
+
+        \table
+        \header \li Radius             \li Samples
+        \row    \li 0 \e{(no blur)}    \li 1
+        \row    \li 1                  \li 3
+        \row    \li 2                  \li 5
+        \row    \li 3                  \li 7
+        \endtable
+
+        By default, the property is set to \c 9.
+
+        This property is not intended to be animated. Changing this property will
+        cause the underlying OpenGL shaders to be recompiled.
+    */
+    property alias samples: dbs.samples
+
+    /*!
+        This property defines the RGBA color value which is used for the shadow.
+
+        By default, the property is set to \c "black".
+
+        \table
+        \header
+        \li Output examples with different color values
+        \li
+        \li
+        \row
+            \li \image DropShadow_color1.png
+            \li \image DropShadow_color2.png
+            \li \image DropShadow_color3.png
+        \row
+            \li \b { color: #000000 }
+            \li \b { color: #0000ff }
+            \li \b { color: #aa000000 }
+        \row
+            \li \l radius: 8
+            \li \l radius: 8
+            \li \l radius: 8
+        \row
+            \li \l samples: 17
+            \li \l samples: 17
+            \li \l samples: 17
+        \row
+            \li \l horizontalOffset: 0
+            \li \l horizontalOffset: 0
+            \li \l horizontalOffset: 0
+        \row
+            \li \l verticalOffset: 20
+            \li \l verticalOffset: 20
+            \li \l verticalOffset: 20
+        \row
+            \li \l spread: 0
+            \li \l spread: 0
+            \li \l spread: 0
+        \endtable
+    */
+    property alias color: dbs.color
+
+    /*!
+        \qmlproperty real QtGraphicalEffects::DropShadow::horizontalOffset
+        \qmlproperty real QtGraphicalEffects::DropShadow::verticalOffset
+
+        HorizontalOffset and verticalOffset properties define the offset for the
+        rendered shadow compared to the DropShadow item position. Often, the
+        DropShadow item is anchored so that it fills the source element. In this
+        case, if the HorizontalOffset and verticalOffset properties are set to
+        0, the shadow is rendered exactly under the source item. By changing the
+        offset properties, the shadow can be positioned relatively to the source
+        item.
+
+        The values range from -inf to inf. By default, the properties are set to
+        \c 0.
+
+        \table
+        \header
+        \li Output examples with different horizontalOffset values
+        \li
+        \li
+        \row
+            \li \image DropShadow_horizontalOffset1.png
+            \li \image DropShadow_horizontalOffset2.png
+            \li \image DropShadow_horizontalOffset3.png
+        \row
+            \li \b { horizontalOffset: -20 }
+            \li \b { horizontalOffset: 0 }
+            \li \b { horizontalOffset: 20 }
+        \row
+            \li \l radius: 4
+            \li \l radius: 4
+            \li \l radius: 4
+        \row
+            \li \l samples: 9
+            \li \l samples: 9
+            \li \l samples: 9
+        \row
+            \li \l color: #000000
+            \li \l color: #000000
+            \li \l color: #000000
+        \row
+            \li \l verticalOffset: 0
+            \li \l verticalOffset: 0
+            \li \l verticalOffset: 0
+        \row
+            \li \l spread: 0
+            \li \l spread: 0
+            \li \l spread: 0
+        \endtable
+    */
+    property alias horizontalOffset: dbs.horizontalOffset
+    property alias verticalOffset: dbs.verticalOffset
+
+    /*!
+        This property defines how large part of the shadow color is strengthened
+        near the source edges.
+
+        The value ranges from 0.0 to 1.0. By default, the property is set to \c
+        0.0.
+
+        \table
+        \header
+        \li Output examples with different spread values
+        \li
+        \li
+        \row
+            \li \image DropShadow_spread1.png
+            \li \image DropShadow_spread2.png
+            \li \image DropShadow_spread3.png
+        \row
+            \li \b { spread: 0.0 }
+            \li \b { spread: 0.5 }
+            \li \b { spread: 1.0 }
+        \row
+            \li \l radius: 8
+            \li \l radius: 8
+            \li \l radius: 8
+        \row
+            \li \l samples: 17
+            \li \l samples: 17
+            \li \l samples: 17
+        \row
+            \li \l color: #000000
+            \li \l color: #000000
+            \li \l color: #000000
+        \row
+            \li \l horizontalOffset: 0
+            \li \l horizontalOffset: 0
+            \li \l horizontalOffset: 0
+        \row
+            \li \l verticalOffset: 20
+            \li \l verticalOffset: 20
+            \li \l verticalOffset: 20
+        \endtable
+    */
+    property alias spread: dbs.spread
+
+    /*!
+        \internal
+
+        Starting Qt 5.6, this property has no effect. It is left here
+        for source compatibility only.
+
+        ### Qt 6: remove
+    */
+    property bool fast: false
+
+    /*!
+        This property allows the effect output pixels to be cached in order to
+        improve the rendering performance. Every time the source or effect
+        properties are changed, the pixels in the cache must be updated. Memory
+        consumption is increased, because an extra buffer of memory is required
+        for storing the effect output.
+
+        It is recommended to disable the cache when the source or the effect
+        properties are animated.
+
+        By default, the property is set to \c false.
+    */
+    property alias cached: dbs.cached
+
+    /*!
+        This property determines whether or not the effect has a transparent
+        border.
+
+        When set to \c true, the exterior of the item is padded with a 1 pixel
+        wide transparent edge, making sampling outside the source texture use
+        transparency instead of the edge pixels. Without this property, an
+        image which has opaque edges will not get a blurred shadow.
+
+        In the image below, the Rectangle on the left has transparent borders
+        and has blurred edges, whereas the Rectangle on the right does not:
+
+        By default, this property is set to \c true.
+
+        \snippet DropShadow-transparentBorder-example.qml example
+
+        \image DropShadow-transparentBorder.png
+    */
+    property alias transparentBorder: dbs.transparentBorder
+}
diff --git a/deployment_test/QtGraphicalEffects/FastBlur.qml b/deployment_test/QtGraphicalEffects/FastBlur.qml
new file mode 100644
index 0000000000000000000000000000000000000000..1d8a547d823ff4599d28879f173138db9fec3ba8
--- /dev/null
+++ b/deployment_test/QtGraphicalEffects/FastBlur.qml
@@ -0,0 +1,442 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Graphical Effects module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtGraphicalEffects.private 1.12
+
+/*!
+    \qmltype FastBlur
+    \inqmlmodule QtGraphicalEffects
+    \since QtGraphicalEffects 1.0
+    \inherits QtQuick2::Item
+    \ingroup qtgraphicaleffects-blur
+    \brief Applies a fast blur effect to one or more source items.
+
+    FastBlur offers lower blur quality than
+    \l{QtGraphicalEffects::GaussianBlur}{GaussianBlur}, but it is faster to
+    render. The FastBlur effect softens the source content by blurring it with
+    algorithm which uses the source content downscaling and bilinear filtering.
+    Use this effect in situations where the source content is rapidly changing
+    and the highest possible blur quality is not
+    needed.
+
+    \table
+    \header
+        \li Source
+        \li Effect applied
+    \row
+        \li \image Original_bug.png
+        \li \image FastBlur_bug.png
+    \endtable
+
+    \note This effect is available when running with OpenGL.
+    s
+    \section1 Example
+
+    The following example shows how to apply the effect.
+    \snippet FastBlur-example.qml example
+
+*/
+Item {
+    id: rootItem
+
+    /*!
+        This property defines the source item that is going to be blurred.
+
+        \note It is not supported to let the effect include itself, for
+        instance by setting source to the effect's parent.
+    */
+    property variant source
+
+    /*!
+        This property defines the distance of the neighboring pixels which affect
+        the blurring of an individual pixel. A larger radius increases the blur
+        effect. FastBlur algorithm may internally reduce the accuracy of the radius in order to
+        provide good rendering performance.
+
+        The value ranges from 0.0 (no blur) to inf. Visual quality of the blur is reduced when
+        radius exceeds value 64. By default, the property is set to \c 0.0 (no blur).
+
+        \table
+        \header
+        \li Output examples with different blur values
+        \li
+        \li
+        \row
+            \li \image FastBlur_radius1.png
+            \li \image FastBlur_radius2.png
+            \li \image FastBlur_radius3.png
+        \row
+            \li \b { radius: 0 }
+            \li \b { radius: 32 }
+            \li \b { radius: 64 }
+        \endtable
+    */
+    property real radius: 0.0
+
+    /*!
+        This property defines the blur behavior near the edges of the item,
+        where the pixel blurring is affected by the pixels outside the source
+        edges.
+
+        If the property is set to \c true, the pixels outside the source are
+        interpreted to be transparent, which is similar to OpenGL
+        clamp-to-border extension. The blur is expanded slightly outside the
+        effect item area.
+
+        If the property is set to \c false, the pixels outside the source are
+        interpreted to contain the same color as the pixels at the edge of the
+        item, which is similar to OpenGL clamp-to-edge behavior. The blur does
+        not expand outside the effect item area.
+
+        By default, the property is set to \c false.
+
+        \table
+        \header
+        \li Output examples with different transparentBorder values
+        \li
+        \li
+        \row
+            \li \image FastBlur_transparentBorder1.png
+            \li \image FastBlur_transparentBorder2.png
+        \row
+            \li \b { transparentBorder: false }
+            \li \b { transparentBorder: true }
+        \row
+            \li \l radius: 64
+            \li \l radius: 64
+        \endtable
+    */
+    property bool transparentBorder: false
+
+    /*!
+        This property allows the effect output pixels to be cached in order to
+        improve the rendering performance.
+
+        Every time the source or effect properties are changed, the pixels in
+        the cache must be updated. Memory consumption is increased, because an
+        extra buffer of memory is required for storing the effect output.
+
+        It is recommended to disable the cache when the source or the effect
+        properties are animated.
+
+        By default, the property is set to \c false.
+
+    */
+    property bool cached: false
+
+    SourceProxy {
+        id: sourceProxy
+        input: rootItem.source
+    }
+
+    ShaderEffectSource {
+        id: cacheItem
+        anchors.fill: shaderItem
+        visible: rootItem.cached
+        sourceItem: shaderItem
+        live: true
+        hideSource: visible
+        smooth: rootItem.radius > 0
+    }
+
+    /*! \internal */
+    property string __internalBlurVertexShader: "qrc:/qt-project.org/imports/QtGraphicalEffects/shaders/fastblur_internal.vert"
+
+    /*! \internal */
+    property string __internalBlurFragmentShader: "qrc:/qt-project.org/imports/QtGraphicalEffects/shaders/fastblur_internal.frag"
+
+    ShaderEffect {
+        id: level0
+        property variant source: sourceProxy.output
+        anchors.fill: parent
+        visible: false
+        smooth: true
+    }
+
+    ShaderEffectSource {
+        id: level1
+        width: Math.ceil(shaderItem.width / 32) * 32
+        height: Math.ceil(shaderItem.height / 32) * 32
+        sourceItem: level0
+        hideSource: rootItem.visible
+        sourceRect: transparentBorder ? Qt.rect(-64, -64, shaderItem.width, shaderItem.height) : Qt.rect(0, 0, 0, 0)
+        visible: false
+        smooth: rootItem.radius > 0
+    }
+
+    ShaderEffect {
+        id: effect1
+        property variant source: level1
+        property real yStep: 1/height
+        property real xStep: 1/width
+        anchors.fill: level2
+        visible: false
+        smooth: true
+        vertexShader: __internalBlurVertexShader
+        fragmentShader: __internalBlurFragmentShader
+    }
+
+    ShaderEffectSource {
+        id: level2
+        width: level1.width / 2
+        height: level1.height / 2
+        sourceItem: effect1
+        hideSource: rootItem.visible
+        visible: false
+        smooth: true
+    }
+
+    ShaderEffect {
+        id: effect2
+        property variant source: level2
+        property real yStep: 1/height
+        property real xStep: 1/width
+        anchors.fill: level3
+        visible: false
+        smooth: true
+        vertexShader: __internalBlurVertexShader
+        fragmentShader: __internalBlurFragmentShader
+    }
+
+    ShaderEffectSource {
+        id: level3
+        width: level2.width / 2
+        height: level2.height / 2
+        sourceItem: effect2
+        hideSource: rootItem.visible
+        visible: false
+        smooth: true
+    }
+
+    ShaderEffect {
+        id: effect3
+        property variant source: level3
+        property real yStep: 1/height
+        property real xStep: 1/width
+        anchors.fill: level4
+        visible: false
+        smooth: true
+        vertexShader: __internalBlurVertexShader
+        fragmentShader: __internalBlurFragmentShader
+    }
+
+    ShaderEffectSource {
+        id: level4
+        width: level3.width / 2
+        height: level3.height / 2
+        sourceItem: effect3
+        hideSource: rootItem.visible
+        visible: false
+        smooth: true
+    }
+
+    ShaderEffect {
+        id: effect4
+        property variant source: level4
+        property real yStep: 1/height
+        property real xStep: 1/width
+        anchors.fill: level5
+        visible: false
+        smooth: true
+        vertexShader: __internalBlurVertexShader
+        fragmentShader: __internalBlurFragmentShader
+    }
+
+    ShaderEffectSource {
+        id: level5
+        width: level4.width / 2
+        height: level4.height / 2
+        sourceItem: effect4
+        hideSource: rootItem.visible
+        visible: false
+        smooth: true
+    }
+
+    ShaderEffect {
+        id: effect5
+        property variant source: level5
+        property real yStep: 1/height
+        property real xStep: 1/width
+        anchors.fill: level6
+        visible: false
+        smooth: true
+        vertexShader: __internalBlurVertexShader
+        fragmentShader: __internalBlurFragmentShader
+    }
+
+    ShaderEffectSource {
+        id: level6
+        width: level5.width / 2
+        height: level5.height / 2
+        sourceItem: effect5
+        hideSource: rootItem.visible
+        visible: false
+        smooth: true
+    }
+
+    Item {
+        id: dummysource
+        width: 1
+        height: 1
+        visible: false
+    }
+
+    ShaderEffectSource {
+        id: dummy
+        width: 1
+        height: 1
+        sourceItem: dummysource
+        visible: false
+        smooth: false
+        live: false
+    }
+
+    ShaderEffect {
+        id: shaderItem
+
+        property variant source1: level1
+        property variant source2: level2
+        property variant source3: level3
+        property variant source4: level4
+        property variant source5: level5
+        property variant source6: level6
+        property real lod: Math.sqrt(rootItem.radius / 64.0) * 1.2 - 0.2
+        property real weight1
+        property real weight2
+        property real weight3
+        property real weight4
+        property real weight5
+        property real weight6
+
+        x: transparentBorder ? -64 : 0
+        y: transparentBorder ? -64 : 0
+        width: transparentBorder ? parent.width + 128 : parent.width
+        height: transparentBorder ? parent.height + 128 : parent.height
+
+        function weight(v) {
+            if (v <= 0.0)
+                return 1.0
+            if (v >= 0.5)
+                return 0.0
+
+            return 1.0 - v * 2.0
+        }
+
+        function calculateWeights() {
+
+            var w1 = weight(Math.abs(lod - 0.100))
+            var w2 = weight(Math.abs(lod - 0.300))
+            var w3 = weight(Math.abs(lod - 0.500))
+            var w4 = weight(Math.abs(lod - 0.700))
+            var w5 = weight(Math.abs(lod - 0.900))
+            var w6 = weight(Math.abs(lod - 1.100))
+
+            var sum = w1 + w2 + w3 + w4 + w5 + w6;
+            weight1 = w1 / sum;
+            weight2 = w2 / sum;
+            weight3 = w3 / sum;
+            weight4 = w4 / sum;
+            weight5 = w5 / sum;
+            weight6 = w6 / sum;
+
+            upateSources()
+        }
+
+        function upateSources() {
+            var sources = new Array();
+            var weights = new Array();
+
+            if (weight1 > 0) {
+                sources.push(level1)
+                weights.push(weight1)
+            }
+
+            if (weight2 > 0) {
+                sources.push(level2)
+                weights.push(weight2)
+            }
+
+            if (weight3 > 0) {
+                sources.push(level3)
+                weights.push(weight3)
+            }
+
+            if (weight4 > 0) {
+                sources.push(level4)
+                weights.push(weight4)
+            }
+
+            if (weight5 > 0) {
+                sources.push(level5)
+                weights.push(weight5)
+            }
+
+            if (weight6 > 0) {
+                sources.push(level6)
+                weights.push(weight6)
+            }
+
+            for (var j = sources.length; j < 6; j++) {
+                sources.push(dummy)
+                weights.push(0.0)
+            }
+
+            source1 = sources[0]
+            source2 = sources[1]
+            source3 = sources[2]
+            source4 = sources[3]
+            source5 = sources[4]
+            source6 = sources[5]
+
+            weight1 = weights[0]
+            weight2 = weights[1]
+            weight3 = weights[2]
+            weight4 = weights[3]
+            weight5 = weights[4]
+            weight6 = weights[5]
+        }
+
+        Component.onCompleted: calculateWeights()
+
+        onLodChanged: calculateWeights()
+
+        fragmentShader: "qrc:/qt-project.org/imports/QtGraphicalEffects/shaders/fastblur.frag"
+    }
+}
diff --git a/deployment_test/QtGraphicalEffects/GammaAdjust.qml b/deployment_test/QtGraphicalEffects/GammaAdjust.qml
new file mode 100644
index 0000000000000000000000000000000000000000..2c3edbb8bdc0a98efa68c97171691d7f1f4b2bde
--- /dev/null
+++ b/deployment_test/QtGraphicalEffects/GammaAdjust.qml
@@ -0,0 +1,184 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Graphical Effects module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtGraphicalEffects.private 1.12
+
+/*!
+    \qmltype GammaAdjust
+    \inqmlmodule QtGraphicalEffects
+    \since QtGraphicalEffects 1.0
+    \inherits QtQuick2::Item
+    \ingroup qtgraphicaleffects-color
+    \brief Alters the luminance of the source item.
+
+    GammaAdjust is applied to each pixel according to the curve which is
+    pre-defined as a power-law expression, where the property gamma is used as the
+    reciprocal scaling exponent. Refer to the property documentation of \l{GammaAdjust::gamma}{gamma}
+    for more details.
+
+    \table
+    \header
+        \li Source
+        \li Effect applied
+    \row
+        \li \image Original_bug.png
+        \li \image GammaAdjust_bug.png
+    \endtable
+
+    \note This effect is available when running with OpenGL.
+
+    \section1 Example
+
+    The following example shows how to apply the effect.
+    \snippet GammaAdjust-example.qml example
+
+*/
+Item {
+    id: rootItem
+
+    /*!
+        This property defines the source item for which the luminance is going to be
+        adjusted.
+
+        \note It is not supported to let the effect include itself, for
+        instance by setting source to the effect's parent.
+    */
+    property variant source
+
+    /*!
+        This property defines the change factor for how the luminance of each pixel
+        is altered according to the equation:
+
+        \code
+luminance = pow(original_luminance, 1.0 / gamma); // The luminance is assumed to be between 0.0 and 1.0
+        \endcode
+
+        Setting the gamma values under 1.0 makes the image darker, the values
+        above 1.0 lighten it.
+
+        The value ranges from 0.0 (darkest) to inf (lightest). By default, the
+        property is set to \c 1.0 (no change).
+
+        \table
+        \header
+        \li Output examples with different gamma values
+        \li
+        \li
+        \row
+            \li \image GammaAdjust_gamma1.png
+            \li \image GammaAdjust_gamma2.png
+            \li \image GammaAdjust_gamma3.png
+        \row
+            \li \b { gamma: 0.5 }
+            \li \b { gamma: 1.0 }
+            \li \b { gamma: 2.0 }
+        \endtable
+
+        \table
+        \header
+            \li Pixel luminance curves of the above images.
+            \li
+            \li
+        \row
+            \li \image GammaAdjust_gamma1_graph.png
+            \li \image GammaAdjust_gamma2_graph.png
+            \li \image GammaAdjust_gamma3_graph.png
+        \row
+            \li Red curve: default gamma (1.0)
+            \li
+            \li
+        \row
+            \li Yellow curve: effect applied
+            \li
+            \li
+        \row
+            \li X-axis: pixel original luminance
+            \li
+            \li
+        \row
+            \li Y-axis: pixel luminance with effect applied
+            \li
+            \li
+        \endtable
+
+    */
+    property real gamma: 1.0
+
+    /*!
+        This property allows the effect output pixels to be cached in order to
+        improve the rendering performance.
+
+        Every time the source or effect properties are changed, the pixels in
+        the cache must be updated. Memory consumption is increased, because an
+        extra buffer of memory is required for storing the effect output.
+
+        It is recommended to disable the cache when the source or the effect
+        properties are animated.
+
+        By default, the property is set to \c false.
+    */
+    property bool cached: false
+
+    SourceProxy {
+        id: sourceProxy
+        input: rootItem.source
+        interpolation: input && input.smooth ? SourceProxy.LinearInterpolation : SourceProxy.NearestInterpolation
+    }
+
+    ShaderEffectSource {
+        id: cacheItem
+        anchors.fill: parent
+        visible: rootItem.cached
+        smooth: true
+        sourceItem: shaderItem
+        live: true
+        hideSource: visible
+    }
+
+    ShaderEffect {
+        id: shaderItem
+        property variant source: sourceProxy.output
+        property real gamma: 1.0 / Math.max(rootItem.gamma, 0.0001)
+
+        anchors.fill: parent
+
+        fragmentShader: "qrc:/qt-project.org/imports/QtGraphicalEffects/shaders/gammaadjust.frag"
+    }
+}
diff --git a/deployment_test/QtGraphicalEffects/GaussianBlur.qml b/deployment_test/QtGraphicalEffects/GaussianBlur.qml
new file mode 100644
index 0000000000000000000000000000000000000000..4af97148c45b8ce6b50fa6ca0e17a9e0e064b5e6
--- /dev/null
+++ b/deployment_test/QtGraphicalEffects/GaussianBlur.qml
@@ -0,0 +1,372 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Copyright (C) 2017 Jolla Ltd, author: <gunnar.sletta@jollamobile.com>
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Graphical Effects module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Window 2.12
+import QtGraphicalEffects.private 1.12
+
+/*!
+    \qmltype GaussianBlur
+    \inqmlmodule QtGraphicalEffects
+    \since QtGraphicalEffects 1.0
+    \inherits QtQuick2::Item
+    \ingroup qtgraphicaleffects-blur
+    \brief Applies a higher quality blur effect.
+
+    GaussianBlur effect softens the image by blurring it with an algorithm that
+    uses the Gaussian function to calculate the effect. The effect produces
+    higher quality than \l{QtGraphicalEffects::FastBlur}{FastBlur}, but is
+    slower to render.
+
+    \table
+    \header
+        \li Source
+        \li Effect applied
+    \row
+        \li \image Original_bug.png
+        \li \image GaussianBlur_bug.png
+    \endtable
+
+    \note This effect is available when running with OpenGL.
+
+    \section1 Example
+
+    The following example shows how to apply the effect.
+    \snippet GaussianBlur-example.qml example
+
+    Performing blur live is a costly operation. Fullscreen gaussian blur
+    with even a moderate number of samples will only run at 60 fps on highend
+    graphics hardware.
+
+*/
+Item {
+    id: root
+
+    /*!
+        This property defines the source item that is going to be blurred.
+
+        \note It is not supported to let the effect include itself, for
+        instance by setting source to the effect's parent.
+    */
+    property variant source
+
+    /*!
+        This property defines the distance of the neighboring pixels which
+        affect the blurring of an individual pixel. A larger radius increases
+        the blur effect.
+
+        The ideal blur is achieved by selecting \c samples and \c radius such
+        that \c {samples = 1 + radius * 2}, such as:
+
+        \table
+        \header \li Radius             \li Samples
+        \row    \li 0 \e{(no blur)}    \li 1
+        \row    \li 1                  \li 3
+        \row    \li 2                  \li 5
+        \row    \li 3                  \li 7
+        \endtable
+
+        The value ranges from 0.0 (no blur) to inf. By default, the property is
+        set to \c floor(samples / 2.0).
+
+        \table
+        \header
+        \li Output examples with different radius values
+        \li
+        \li
+        \row
+            \li \image GaussianBlur_radius1.png
+            \li \image GaussianBlur_radius2.png
+            \li \image GaussianBlur_radius3.png
+        \row
+            \li \b { radius: 0 }
+            \li \b { radius: 4 }
+            \li \b { radius: 8 }
+        \row
+            \li \l samples: 16
+            \li \l samples: 16
+            \li \l samples: 16
+        \row
+            \li \l deviation: 3
+            \li \l deviation: 3
+            \li \l deviation: 3
+        \endtable
+
+    */
+    property real radius: Math.floor(samples / 2);
+
+    /*!
+        This property defines how many samples are taken per pixel when blur
+        calculation is done. Larger value produces better quality, but is slower
+        to render.
+
+        Ideally, this value should be twice as large as the highest required
+        radius value plus 1, for example, if the radius is animated between 0.0
+        and 4.0, samples should be set to 9.
+
+        By default, the property is set to \c 9.
+
+        \note This property is not intended to be animated. Changing this property may
+        cause the underlying OpenGL shaders to be recompiled.
+
+    */
+    property int samples: 9
+
+    /*!
+        This property is a parameter to the gaussian function that is used when
+        calculating neighboring pixel weights for the blurring. A larger
+        deviation causes image to appear more blurry, but it also reduces the
+        quality of the blur. A very large deviation value causes the effect to
+        look a bit similar to what, for exmple, a box blur algorithm produces. A
+        too small deviation values makes the effect insignificant for the pixels
+        near the radius.
+
+        \inlineimage GaussianBlur_deviation_graph.png
+        \caption The image above shows the Gaussian function with two different
+        deviation values, yellow (1) and cyan (2.7). The y-axis shows the
+        weights, the x-axis shows the pixel distance.
+
+        The value ranges from 0.0 (no deviation) to inf (maximum deviation). By
+        default, devaition is binded to radius. When radius increases, deviation
+        is automatically increased linearly. With the radius value of 8, the
+        deviation default value becomes approximately 2.7034. This value
+        produces a compromise between the blur quality and overall blurriness.
+
+        \table
+        \header
+        \li Output examples with different deviation values
+        \li
+        \li
+        \row
+            \li \image GaussianBlur_deviation1.png
+            \li \image GaussianBlur_deviation2.png
+            \li \image GaussianBlur_deviation3.png
+        \row
+            \li \b { deviation: 1 }
+            \li \b { deviation: 2 }
+            \li \b { deviation: 4 }
+        \row
+            \li \l radius: 8
+            \li \l radius: 8
+            \li \l radius: 8
+        \row
+            \li \l samples: 16
+            \li \l samples: 16
+            \li \l samples: 16
+        \endtable
+
+    */
+    property real deviation: (radius + 1) / 3.3333
+
+    /*!
+        This property defines the blur behavior near the edges of the item,
+        where the pixel blurring is affected by the pixels outside the source
+        edges.
+
+        If the property is set to \c true, the pixels outside the source are
+        interpreted to be transparent, which is similar to OpenGL
+        clamp-to-border extension. The blur is expanded slightly outside the
+        effect item area.
+
+        If the property is set to \c false, the pixels outside the source are
+        interpreted to contain the same color as the pixels at the edge of the
+        item, which is similar to OpenGL clamp-to-edge behavior. The blur does
+        not expand outside the effect item area.
+
+        By default, the property is set to \c false.
+
+        \table
+        \header
+        \li Output examples with different transparentBorder values
+        \li
+        \li
+        \row
+            \li \image GaussianBlur_transparentBorder1.png
+            \li \image GaussianBlur_transparentBorder2.png
+        \row
+            \li \b { transparentBorder: false }
+            \li \b { transparentBorder: true }
+        \row
+            \li \l radius: 8
+            \li \l radius: 8
+        \row
+            \li \l samples: 16
+            \li \l samples: 16
+        \row
+            \li \l deviation: 2.7
+            \li \l deviation: 2.7
+        \endtable
+    */
+    property bool transparentBorder: false
+
+    /*!
+        This property allows the effect output pixels to be cached in order to
+        improve the rendering performance.
+        Every time the source or effect properties are changed, the pixels in
+        the cache must be updated. Memory consumption is increased, because an
+        extra buffer of memory is required for storing the effect output.
+
+        It is recommended to disable the cache when the source or the effect
+        properties are animated.
+
+        By default, the property is set to \c false.
+
+    */
+    property bool cached: false
+
+
+    // private members...
+    /*! \internal */
+    property int _paddedTexWidth: transparentBorder ? width + 2 * radius: width;
+    /*! \internal */
+    property int _paddedTexHeight: transparentBorder ? height  + 2 * radius: height;
+    /*! \internal */
+    property int _kernelRadius: Math.max(0, samples / 2);
+    /*! \internal */
+    property int _kernelSize: _kernelRadius * 2 + 1;
+    /*! \internal */
+    property real _dpr: Screen.devicePixelRatio;
+    /*! \internal */
+    property bool _alphaOnly: false;
+    /*! \internal */
+    property var _maskSource: undefined
+
+    /*! \internal */
+    property alias _output: sourceProxy.output;
+    /*! \internal */
+    property alias _outputRect: sourceProxy.sourceRect;
+    /*! \internal */
+    property alias _color: verticalBlur.color;
+    /*! \internal */
+    property real _thickness: 0;
+
+    onSamplesChanged: _rebuildShaders();
+    on_KernelSizeChanged: _rebuildShaders();
+    onDeviationChanged: _rebuildShaders();
+    on_DprChanged: _rebuildShaders();
+    on_MaskSourceChanged: _rebuildShaders();
+    Component.onCompleted: _rebuildShaders();
+
+    /*! \internal */
+    function _rebuildShaders() {
+        var params = {
+            radius: _kernelRadius,
+            // Limit deviation to something very small avoid getting NaN in the shader.
+            deviation: Math.max(0.00001, deviation),
+            alphaOnly: root._alphaOnly,
+            masked: _maskSource != undefined,
+            fallback: root.radius != _kernelRadius
+        }
+        var shaders = ShaderBuilder.gaussianBlur(params);
+        horizontalBlur.fragmentShader = shaders.fragmentShader;
+        horizontalBlur.vertexShader = shaders.vertexShader;
+    }
+
+    SourceProxy {
+        id: sourceProxy
+        interpolation: SourceProxy.LinearInterpolation
+        input: root.source
+        sourceRect: root.transparentBorder
+                    ? Qt.rect(-root.radius, 0, root._paddedTexWidth, parent.height)
+                    : Qt.rect(0, 0, 0, 0)
+    }
+
+    ShaderEffect {
+        id: horizontalBlur
+        width: root.transparentBorder ? root._paddedTexWidth : root.width
+        height: root.height;
+
+        // Used by all shaders
+        property Item source: sourceProxy.output;
+        property real spread: root.radius / root._kernelRadius;
+        property var dirstep: Qt.vector2d(1 / (root._paddedTexWidth * root._dpr), 0);
+
+        // Used by fallback shader (sampleCount exceeds number of varyings)
+        property real deviation: root.deviation
+
+        // Only in use for DropShadow and Glow
+        property color color: "white"
+        property real thickness: Math.max(0, Math.min(0.98, 1 - root._thickness * 0.98));
+
+        // Only in use for MaskedBlur
+        property var mask: root._maskSource;
+
+        layer.enabled: true
+        layer.smooth: true
+        layer.sourceRect: root.transparentBorder
+                          ? Qt.rect(0, -root.radius, width, root._paddedTexHeight)
+                          : Qt.rect(0, 0, 0, 0)
+        visible: false
+        blending: false
+    }
+
+    ShaderEffect {
+        id: verticalBlur
+        x: transparentBorder ? -root.radius : 0
+        y: x;
+        width: root.transparentBorder ? root._paddedTexWidth: root.width
+        height: root.transparentBorder ? root._paddedTexHeight : root.height;
+        fragmentShader: horizontalBlur.fragmentShader
+        vertexShader: horizontalBlur.vertexShader
+
+        property Item source: horizontalBlur
+        property real spread: horizontalBlur.spread
+        property var dirstep: Qt.vector2d(0, 1 / (root._paddedTexHeight * root._dpr));
+
+        property real deviation: horizontalBlur.deviation
+
+        property color color: "black"
+        property real thickness: horizontalBlur.thickness;
+
+        property var mask: horizontalBlur.mask;
+
+        visible: true
+    }
+
+    ShaderEffectSource {
+        id: cacheItem
+        anchors.fill: verticalBlur
+        visible: root.cached
+        smooth: true
+        sourceItem: verticalBlur
+        hideSource: visible
+    }
+
+}
diff --git a/deployment_test/QtGraphicalEffects/Glow.qml b/deployment_test/QtGraphicalEffects/Glow.qml
new file mode 100644
index 0000000000000000000000000000000000000000..39e69a35c36a0757bf477d766acdc6a60fcd9743
--- /dev/null
+++ b/deployment_test/QtGraphicalEffects/Glow.qml
@@ -0,0 +1,294 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Copyright (C) 2017 Jolla Ltd, author: <gunnar.sletta@jollamobile.com>
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Graphical Effects module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtGraphicalEffects.private 1.12
+
+/*!
+    \qmltype Glow
+    \inqmlmodule QtGraphicalEffects
+    \since QtGraphicalEffects 1.0
+    \inherits QtQuick2::Item
+    \ingroup qtgraphicaleffects-glow
+    \brief Generates a halo like glow around the source item.
+
+    The Glow effect blurs the alpha channel of the source and colorizes it
+    with \l {Glow::color}{color} and places it behind the source, resulting in a halo or glow
+    around the object. The quality of the blurred edge can be controlled using
+    \l samples and \l radius and the strength of the glow can be changed using
+    \l spread.
+
+    \table
+    \header
+        \li Source
+        \li Effect applied
+    \row
+        \li \image Original_butterfly_black.png
+        \li \image Glow_butterfly.png
+    \endtable
+
+    The glow is created by blurring the image live using a gaussian blur.
+    Performing blur live is a costly operation. Fullscreen gaussian blur with
+    even a moderate number of samples will only run at 60 fps on highend
+    graphics hardware.
+
+    \note This effect is available when running with OpenGL.
+
+    \section1 Example
+
+    The following example shows how to apply the effect.
+    \snippet Glow-example.qml example
+
+*/
+Item {
+    id: root
+
+    DropShadowBase {
+        id: dps
+        anchors.fill: parent
+        color: "white"
+        spread: 0.5
+        horizontalOffset: 0
+        verticalOffset: 0
+    }
+
+    /*!
+        This property defines the source item that is going to be used as source
+        for the generated glow.
+
+        \note It is not supported to let the effect include itself, for
+        instance by setting source to the effect's parent.
+    */
+    property alias source: dps.source
+
+    /*!
+        Radius defines the softness of the glow. A larger radius causes the
+        edges of the glow to appear more blurry.
+
+        Depending on the radius value, value of the \l{Glow::samples}{samples}
+        should be set to sufficiently large to ensure the visual quality.
+
+        The ideal blur is achieved by selecting \c samples and \c radius such
+        that \c {samples = 1 + radius * 2}, such as:
+
+        \table
+        \header \li Radius             \li Samples
+        \row    \li 0 \e{(no blur)}    \li 1
+        \row    \li 1                  \li 3
+        \row    \li 2                  \li 5
+        \row    \li 3                  \li 7
+        \endtable
+
+        By default, the property is set to \c {floor(samples/2)}.
+
+        \table
+        \header
+        \li Output examples with different radius values
+        \li
+        \li
+        \row
+            \li \image Glow_radius1.png
+            \li \image Glow_radius2.png
+            \li \image Glow_radius3.png
+        \row
+            \li \b { radius: 0 }
+            \li \b { radius: 6 }
+            \li \b { radius: 12 }
+        \row
+            \li \l samples: 25
+            \li \l samples: 25
+            \li \l samples: 25
+        \row
+            \li \l color: #ffffff
+            \li \l color: #ffffff
+            \li \l color: #ffffff
+        \row
+            \li \l spread: 0
+            \li \l spread: 0
+            \li \l spread: 0
+        \endtable
+    */
+    property alias radius: dps.radius
+
+    /*!
+        This property defines how many samples are taken per pixel when edge
+        softening blur calculation is done. Larger value produces better
+        quality, but is slower to render.
+
+        Ideally, this value should be twice as large as the highest required
+        radius value plus one, such as:
+
+        \table
+        \header \li Radius             \li Samples
+        \row    \li 0 \e{(no blur)}    \li 1
+        \row    \li 1                  \li 3
+        \row    \li 2                  \li 5
+        \row    \li 3                  \li 7
+        \endtable
+
+        By default, the property is set to \c 9.
+
+        This property is not intended to be animated. Changing this property will
+        cause the underlying OpenGL shaders to be recompiled.
+    */
+    property alias samples: dps.samples
+
+    /*!
+        This property defines how large part of the glow color is strengthened
+        near the source edges.
+
+        The values range from 0.0 to 1.0. By default, the property is set to \c
+        0.5.
+
+        \note The implementation is optimized for medium and low spread values.
+        Depending on the source, spread values closer to 1.0 may yield visually
+        asymmetrical results.
+
+        \table
+        \header
+        \li Output examples with different spread values
+        \li
+        \li
+        \row
+            \li \image Glow_spread1.png
+            \li \image Glow_spread2.png
+            \li \image Glow_spread3.png
+        \row
+            \li \b { spread: 0.0 }
+            \li \b { spread: 0.5 }
+            \li \b { spread: 1.0 }
+        \row
+            \li \l radius: 8
+            \li \l radius: 8
+            \li \l radius: 8
+        \row
+            \li \l samples: 17
+            \li \l samples: 17
+            \li \l samples: 17
+        \row
+            \li \l color: #ffffff
+            \li \l color: #ffffff
+            \li \l color: #ffffff
+        \endtable
+    */
+    property alias spread: dps.spread
+
+    /*!
+        This property defines the RGBA color value which is used for the glow.
+
+        By default, the property is set to \c "white".
+
+        \table
+        \header
+        \li Output examples with different color values
+        \li
+        \li
+        \row
+            \li \image Glow_color1.png
+            \li \image Glow_color2.png
+            \li \image Glow_color3.png
+        \row
+            \li \b { color: #ffffff }
+            \li \b { color: #00ff00 }
+            \li \b { color: #aa00ff00 }
+        \row
+            \li \l radius: 8
+            \li \l radius: 8
+            \li \l radius: 8
+        \row
+            \li \l samples: 17
+            \li \l samples: 17
+            \li \l samples: 17
+        \row
+            \li \l spread: 0.5
+            \li \l spread: 0.5
+            \li \l spread: 0.5
+        \endtable
+
+    */
+    property alias color: dps.color
+
+    /*!
+        \internal
+
+        Starting Qt 5.6, this property has no effect. It is left here
+        for source compatibility only.
+
+        ### Qt 6: remove
+    */
+    property bool fast: false
+
+    /*!
+        This property allows the effect output pixels to be cached in order to
+        improve the rendering performance.
+
+        Every time the source or effect properties are changed, the pixels in
+        the cache must be updated. Memory consumption is increased, because an
+        extra buffer of memory is required for storing the effect output.
+
+        It is recommended to disable the cache when the source or the effect
+        properties are animated.
+
+        By default, the property is set to \c false.
+
+    */
+    property alias cached: dps.cached
+
+    /*!
+        This property determines whether or not the effect has a transparent
+        border.
+
+        When set to \c true, the exterior of the item is padded with a
+        transparent edge, making sampling outside the source texture use
+        transparency instead of the edge pixels. Without this property, an
+        image which has opaque edges will not get a blurred edge.
+
+        By default, the property is set to \c true. Set it to false if the source
+        already has a transparent edge to make the blurring a tiny bit faster.
+
+        In the snippet below, the Rectangle on the left has transparent borders
+        and has blurred edges, whereas the Rectangle on the right does not.
+
+        \snippet Glow-transparentBorder-example.qml example
+
+        \image Glow-transparentBorder.png
+    */
+    property alias transparentBorder: dps.transparentBorder
+}
diff --git a/deployment_test/QtGraphicalEffects/HueSaturation.qml b/deployment_test/QtGraphicalEffects/HueSaturation.qml
new file mode 100644
index 0000000000000000000000000000000000000000..eb13dcb6342ec3c47b137e7afa9dc4cdf8275a87
--- /dev/null
+++ b/deployment_test/QtGraphicalEffects/HueSaturation.qml
@@ -0,0 +1,224 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Graphical Effects module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtGraphicalEffects.private 1.12
+
+/*!
+    \qmltype HueSaturation
+    \inqmlmodule QtGraphicalEffects
+    \since QtGraphicalEffects 1.0
+    \inherits QtQuick2::Item
+    \ingroup qtgraphicaleffects-color
+    \brief Alters the source item colors in the HSL color space.
+
+    HueSaturation is similar to the \l{QtGraphicalEffects::Colorize}{Colorize}
+    effect, but the hue and saturation property values are handled differently.
+    The HueSaturation effect always shifts the hue, saturation, and lightness
+    from the original, instead of setting them.
+
+    \table
+    \header
+        \li Source
+        \li Effect applied
+    \row
+        \li \image Original_bug.png
+        \li \image HueSaturation_bug.png
+    \endtable
+
+    \note This effect is available when running with OpenGL.
+
+    \section1 Example
+
+    The following example shows how to apply the effect.
+    \snippet HueSaturation-example.qml example
+
+*/
+Item {
+    id: rootItem
+
+    /*!
+        This property defines the source item that provides the source pixels
+        for the effect.
+
+        \note It is not supported to let the effect include itself, for
+        instance by setting source to the effect's parent.
+    */
+    property variant source: 0
+
+    /*!
+        This property defines the hue value which is added to the source hue
+        value.
+
+        The value ranges from -1.0 (decrease) to 1.0 (increase). By default, the
+        property is set to \c 0.0 (no change).
+
+        \table
+        \header
+        \li Output examples with different hue values
+        \li
+        \li
+        \row
+            \li \image HueSaturation_hue1.png
+            \li \image HueSaturation_hue2.png
+            \li \image HueSaturation_hue3.png
+        \row
+            \li \b { hue: -0.3 }
+            \li \b { hue: 0.0 }
+            \li \b { hue: 0.3 }
+        \row
+            \li \l saturation: 0
+            \li \l saturation: 0
+            \li \l saturation: 0
+        \row
+            \li \l lightness: 0
+            \li \l lightness: 0
+            \li \l lightness: 0
+        \endtable
+
+    */
+    property real hue: 0.0
+
+    /*!
+        This property defines the saturation value value which is added to the
+        source saturation value.
+
+        The value ranges from -1.0 (decrease) to 1.0 (increase). By default, the
+        property is set to \c 0.0 (no change).
+
+        \table
+        \header
+        \li Output examples with different saturation values
+        \li
+        \li
+        \row
+            \li \image HueSaturation_saturation1.png
+            \li \image HueSaturation_saturation2.png
+            \li \image HueSaturation_saturation3.png
+        \row
+            \li \b { saturation: -0.8 }
+            \li \b { saturation: 0.0 }
+            \li \b { saturation: 1.0 }
+        \row
+            \li \l hue: 0
+            \li \l hue: 0
+            \li \l hue: 0
+        \row
+            \li \l lightness: 0
+            \li \l lightness: 0
+            \li \l lightness: 0
+        \endtable
+
+    */
+    property real saturation: 0.0
+
+    /*!
+        This property defines the lightness value which is added to the source
+        saturation value.
+
+        The value ranges from -1.0 (decrease) to 1.0 (increase). By default, the
+        property is set to \c 0.0 (no change).
+
+        \table
+        \header
+        \li Output examples with different lightness values
+        \li
+        \li
+        \row
+            \li \image HueSaturation_lightness1.png
+            \li \image HueSaturation_lightness2.png
+            \li \image HueSaturation_lightness3.png
+        \row
+            \li \b { lightness: -0.5 }
+            \li \b { lightness: 0.0 }
+            \li \b { lightness: 0.5 }
+        \row
+            \li \l hue: 0
+            \li \l hue: 0
+            \li \l hue: 0
+        \row
+            \li \l saturation: 0
+            \li \l saturation: 0
+            \li \l saturation: 0
+        \endtable
+
+    */
+    property real lightness: 0.0
+
+    /*!
+        This property allows the effect output pixels to be cached in order to
+        improve the rendering performance.
+
+        Every time the source or effect properties are changed, the pixels in
+        the cache must be updated. Memory consumption is increased, because an
+        extra buffer of memory is required for storing the effect output.
+
+        It is recommended to disable the cache when the source or the effect
+        properties are animated.
+
+        By default, the property is set to \c false.
+    */
+    property bool cached: false
+
+    SourceProxy {
+        id: sourceProxy
+        input: rootItem.source
+        interpolation: input && input.smooth ? SourceProxy.LinearInterpolation : SourceProxy.NearestInterpolation
+    }
+
+    ShaderEffectSource {
+        id: cacheItem
+        anchors.fill: parent
+        visible: rootItem.cached
+        smooth: true
+        sourceItem: shaderItem
+        live: true
+        hideSource: visible
+    }
+
+    ShaderEffect {
+        id: shaderItem
+        property variant source: sourceProxy.output
+        property variant hsl: Qt.vector3d(rootItem.hue, rootItem.saturation, rootItem.lightness)
+
+        anchors.fill: parent
+
+        fragmentShader: "qrc:/qt-project.org/imports/QtGraphicalEffects/shaders/huesaturation.frag"
+    }
+}
diff --git a/deployment_test/QtGraphicalEffects/InnerShadow.qml b/deployment_test/QtGraphicalEffects/InnerShadow.qml
new file mode 100644
index 0000000000000000000000000000000000000000..7a388e3488de8fc3ac2780f0e5078f07fd4f025b
--- /dev/null
+++ b/deployment_test/QtGraphicalEffects/InnerShadow.qml
@@ -0,0 +1,386 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Graphical Effects module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtGraphicalEffects.private 1.12
+
+/*!
+    \qmltype InnerShadow
+    \inqmlmodule QtGraphicalEffects
+    \since QtGraphicalEffects 1.0
+    \inherits QtQuick2::Item
+    \ingroup qtgraphicaleffects-drop-shadow
+    \brief Generates a colorized and blurred shadow inside the
+    source.
+
+    By default the effect produces a high quality shadow image, thus the
+    rendering speed of the shadow might not be the highest possible. The
+    rendering speed is reduced especially if the shadow edges are heavily
+    softened. For use cases that require faster rendering speed and for which
+    the highest possible visual quality is not necessary, property
+    \l{InnerShadow::fast}{fast} can be set to true.
+
+    \table
+    \header
+        \li Source
+        \li Effect applied
+    \row
+        \li \image Original_butterfly.png
+        \li \image InnerShadow_butterfly.png
+    \endtable
+
+    \note This effect is available when running with OpenGL.
+
+    \section1 Example
+
+    The following example shows how to apply the effect.
+    \snippet InnerShadow-example.qml example
+
+*/
+Item {
+    id: rootItem
+
+    /*!
+        This property defines the source item that is going to be used as the
+        source for the generated shadow.
+
+        \note It is not supported to let the effect include itself, for
+        instance by setting source to the effect's parent.
+    */
+    property variant source
+
+    /*!
+        Radius defines the softness of the shadow. A larger radius causes the
+        edges of the shadow to appear more blurry.
+
+        Depending on the radius value, value of the
+        \l{InnerShadow::samples}{samples} should be set to sufficiently large to
+        ensure the visual quality.
+
+        The value ranges from 0.0 (no blur) to inf. By default, the property is
+        set to \c 0.0 (no blur).
+
+        \table
+        \header
+        \li Output examples with different radius values
+        \li
+        \li
+        \row
+            \li \image InnerShadow_radius1.png
+            \li \image InnerShadow_radius2.png
+            \li \image InnerShadow_radius3.png
+        \row
+            \li \b { radius: 0 }
+            \li \b { radius: 6 }
+            \li \b { radius: 12 }
+        \row
+            \li \l samples: 24
+            \li \l samples: 24
+            \li \l samples: 24
+        \row
+            \li \l color: #000000
+            \li \l color: #000000
+            \li \l color: #000000
+        \row
+            \li \l horizontalOffset: 0
+            \li \l horizontalOffset: 0
+            \li \l horizontalOffset: 0
+        \row
+            \li \l verticalOffset: 0
+            \li \l verticalOffset: 0
+            \li \l verticalOffset: 0
+        \row
+            \li \l spread: 0
+            \li \l spread: 0
+            \li \l spread: 0
+        \endtable
+
+    */
+    property real radius: 0.0
+
+    /*!
+        This property defines how many samples are taken per pixel when edge
+        softening blur calculation is done. Larger value produces better
+        quality, but is slower to render.
+
+        Ideally, this value should be twice as large as the highest required
+        radius value, for example, if the radius is animated between 0.0 and
+        4.0, samples should be set to 8.
+
+        The value ranges from 0 to 32. By default, the property is set to \c 0.
+
+        This property is not intended to be animated. Changing this property may
+        cause the underlying OpenGL shaders to be recompiled.
+
+        When \l{InnerShadow::fast}{fast} property is set to true, this property
+        has no effect.
+
+    */
+    property int samples: 0
+
+    /*!
+        This property defines how large part of the shadow color is strengthened
+        near the source edges.
+
+        The value ranges from 0.0 to 1.0. By default, the property is set to \c
+        0.5.
+
+        \table
+        \header
+        \li Output examples with different spread values
+        \li
+        \li
+        \row
+            \li \image InnerShadow_spread1.png
+            \li \image InnerShadow_spread2.png
+            \li \image InnerShadow_spread3.png
+        \row
+            \li \b { spread: 0.0 }
+            \li \b { spread: 0.3 }
+            \li \b { spread: 0.5 }
+        \row
+            \li \l radius: 16
+            \li \l radius: 16
+            \li \l radius: 16
+        \row
+            \li \l samples: 24
+            \li \l samples: 24
+            \li \l samples: 24
+        \row
+            \li \l color: #000000
+            \li \l color: #000000
+            \li \l color: #000000
+        \row
+            \li \l horizontalOffset: 0
+            \li \l horizontalOffset: 0
+            \li \l horizontalOffset: 0
+        \row
+            \li \l verticalOffset: 0
+            \li \l verticalOffset: 0
+            \li \l verticalOffset: 0
+        \endtable
+
+    */
+    property real spread: 0.0
+
+    /*!
+        This property defines the RGBA color value which is used for the shadow.
+
+        By default, the property is set to \c "black".
+
+        \table
+        \header
+        \li Output examples with different color values
+        \li
+        \li
+        \row
+            \li \image InnerShadow_color1.png
+            \li \image InnerShadow_color2.png
+            \li \image InnerShadow_color3.png
+        \row
+            \li \b { color: #000000 }
+            \li \b { color: #ffffff }
+            \li \b { color: #ff0000 }
+        \row
+            \li \l radius: 16
+            \li \l radius: 16
+            \li \l radius: 16
+        \row
+            \li \l samples: 24
+            \li \l samples: 24
+            \li \l samples: 24
+        \row
+            \li \l horizontalOffset: 0
+            \li \l horizontalOffset: 0
+            \li \l horizontalOffset: 0
+        \row
+            \li \l verticalOffset: 0
+            \li \l verticalOffset: 0
+            \li \l verticalOffset: 0
+        \row
+            \li \l spread: 0.2
+            \li \l spread: 0.2
+            \li \l spread: 0.2
+        \endtable
+    */
+    property color color: "black"
+
+    /*!
+        \qmlproperty real QtGraphicalEffects::InnerShadow::horizontalOffset
+        \qmlproperty real QtGraphicalEffects::InnerShadow::verticalOffset
+
+        HorizontalOffset and verticalOffset properties define the offset for the
+        rendered shadow compared to the InnerShadow item position. Often, the
+        InnerShadow item is anchored so that it fills the source element. In
+        this case, if the HorizontalOffset and verticalOffset properties are set
+        to 0, the shadow is rendered fully inside the source item. By changing
+        the offset properties, the shadow can be positioned relatively to the
+        source item.
+
+        The values range from -inf to inf. By default, the properties are set to
+        \c 0.
+
+        \table
+        \header
+        \li Output examples with different horizontalOffset values
+        \li
+        \li
+        \row
+            \li \image InnerShadow_horizontalOffset1.png
+            \li \image InnerShadow_horizontalOffset2.png
+            \li \image InnerShadow_horizontalOffset3.png
+        \row
+            \li \b { horizontalOffset: -20 }
+            \li \b { horizontalOffset: 0 }
+            \li \b { horizontalOffset: 20 }
+        \row
+            \li \l radius: 16
+            \li \l radius: 16
+            \li \l radius: 16
+        \row
+            \li \l samples: 24
+            \li \l samples: 24
+            \li \l samples: 24
+        \row
+            \li \l color: #000000
+            \li \l color: #000000
+            \li \l color: #000000
+        \row
+            \li \l verticalOffset: 0
+            \li \l verticalOffset: 0
+            \li \l verticalOffset: 0
+        \row
+            \li \l spread: 0
+            \li \l spread: 0
+            \li \l spread: 0
+        \endtable
+
+    */
+    property real horizontalOffset: 0
+    property real verticalOffset: 0
+
+    /*!
+        This property selects the blurring algorithm that is used to produce the
+        softness for the effect. Setting this to true enables fast algorithm,
+        setting value to false produces higher quality result.
+
+        By default, the property is set to \c false.
+
+        \table
+        \header
+        \li Output examples with different fast values
+        \li
+        \li
+        \row
+            \li \image InnerShadow_fast1.png
+            \li \image InnerShadow_fast2.png
+        \row
+            \li \b { fast: false }
+            \li \b { fast: true }
+        \row
+            \li \l radius: 16
+            \li \l radius: 16
+        \row
+            \li \l samples: 24
+            \li \l samples: 24
+        \row
+            \li \l color: #000000
+            \li \l color: #000000
+        \row
+            \li \l horizontalOffset: 0
+            \li \l horizontalOffset: 0
+        \row
+            \li \l verticalOffset: 0
+            \li \l verticalOffset: 0
+        \row
+            \li \l spread: 0.2
+            \li \l spread: 0.2
+        \endtable
+    */
+    property bool fast: false
+
+    /*!
+        This property allows the effect output pixels to be cached in order to
+        improve the rendering performance. Every time the source or effect
+        properties are changed, the pixels in the cache must be updated. Memory
+        consumption is increased, because an extra buffer of memory is required
+        for storing the effect output.
+
+        It is recommended to disable the cache when the source or the effect
+        properties are animated.
+
+        By default, the property is set to \c false.
+
+    */
+    property bool cached: false
+
+    Loader {
+        anchors.fill: parent
+        sourceComponent: rootItem.fast ? innerShadow : gaussianInnerShadow
+    }
+
+    Component {
+        id: gaussianInnerShadow
+        GaussianInnerShadow {
+            anchors.fill: parent
+            source: rootItem.source
+            radius: rootItem.radius
+            maximumRadius: rootItem.samples * 0.5
+            color: rootItem.color
+            cached: rootItem.cached
+            spread: rootItem.spread
+            horizontalOffset: rootItem.horizontalOffset
+            verticalOffset: rootItem.verticalOffset
+        }
+    }
+
+    Component {
+        id: innerShadow
+        FastInnerShadow {
+            anchors.fill: parent
+            source: rootItem.source
+            blur: Math.pow(rootItem.radius / 64.0, 0.4)
+            color: rootItem.color
+            cached: rootItem.cached
+            spread: rootItem.spread
+            horizontalOffset: rootItem.horizontalOffset
+            verticalOffset: rootItem.verticalOffset
+        }
+    }
+}
diff --git a/deployment_test/QtGraphicalEffects/LevelAdjust.qml b/deployment_test/QtGraphicalEffects/LevelAdjust.qml
new file mode 100644
index 0000000000000000000000000000000000000000..b98facaaba12afda5df1933a3c59e00e8bdb0e91
--- /dev/null
+++ b/deployment_test/QtGraphicalEffects/LevelAdjust.qml
@@ -0,0 +1,440 @@
+/*****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Add-On Graphical Effects module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+*****************************************************************************/
+
+import QtQuick 2.12
+import QtGraphicalEffects.private 1.12
+
+/*!
+    \qmltype LevelAdjust
+    \inqmlmodule QtGraphicalEffects
+    \since QtGraphicalEffects 1.0
+    \inherits QtQuick2::Item
+    \ingroup qtgraphicaleffects-color
+    \brief Adjusts color levels in the RGBA color space.
+
+    This effect adjusts the source item colors separately for each color
+    channel. Source item contrast can be adjusted and color balance altered.
+
+    \table
+    \header
+        \li Source
+        \li Effect applied
+    \row
+        \li \image Original_butterfly.png
+        \li \image LevelAdjust_butterfly.png
+    \endtable
+
+    \note This effect is available when running with OpenGL.
+
+    \section1 Example
+
+    The following example shows how to apply the effect.
+    \snippet LevelAdjust-example.qml example
+
+*/
+Item {
+    id: rootItem
+
+    /*!
+        This property defines the source item that provides the source pixels
+        for the effect.
+
+        \note It is not supported to let the effect include itself, for
+        instance by setting source to the effect's parent.
+    */
+    property variant source
+
+    /*!
+        This property defines the change factor for how the value of each pixel
+        color channel is altered according to the equation:
+
+        \code
+        result.rgb = pow(original.rgb, 1.0 / gamma.rgb);
+        \endcode
+
+        Setting the gamma values under QtVector3d(1.0, 1.0, 1.0) makes the image
+        darker, the values above QtVector3d(1.0, 1.0, 1.0) lighten it.
+
+        The value ranges from QtVector3d(0.0, 0.0, 0.0) (darkest) to inf
+        (lightest). By default, the property is set to \c QtVector3d(1.0, 1.0,
+        1.0) (no change).
+
+        \table
+        \header
+        \li Output examples with different gamma values
+        \li
+        \li
+        \row
+            \li \image LevelAdjust_gamma1.png
+            \li \image LevelAdjust_gamma2.png
+            \li \image LevelAdjust_gamma3.png
+        \row
+            \li \b { gamma: Qt.vector3d(1.0, 1.0, 1.0) }
+            \li \b { gamma: Qt.vector3d(1.0, 0.4, 2.0) }
+            \li \b { gamma: Qt.vector3d(1.0, 0.1, 4.0) }
+        \row
+            \li \l minimumInput: #000000
+            \li \l minimumInput: #000000
+            \li \l minimumInput: #000000
+        \row
+            \li \l maximumInput: #ffffff
+            \li \l maximumInput: #ffffff
+            \li \l maximumInput: #ffffff
+        \row
+            \li \l minimumOutput: #000000
+            \li \l minimumOutput: #000000
+            \li \l minimumOutput: #000000
+        \row
+            \li \l maximumOutput: #ffffff
+            \li \l maximumOutput: #ffffff
+            \li \l maximumOutput: #ffffff
+        \endtable
+
+        \table
+        \header
+            \li Pixel color channel luminance curves of the above images.
+            \li
+            \li
+        \row
+            \li \image LevelAdjust_default_curve.png
+            \li \image LevelAdjust_gamma2_curve.png
+            \li \image LevelAdjust_gamma3_curve.png
+        \row
+            \li X-axis: pixel original luminance
+            \li
+            \li
+        \row
+            \li Y-axis: color channel luminance with effect applied
+            \li
+            \li
+        \endtable
+    */
+    property variant gamma: Qt.vector3d(1.0, 1.0, 1.0)
+
+    /*!
+        This property defines the minimum input level for each color channel. It
+        sets the black-point, all pixels having lower value than this property
+        are rendered as black (per color channel). Increasing the value darkens
+        the dark areas.
+
+        The value ranges from "#00000000" to "#ffffffff". By default, the
+        property is set to \c "#00000000" (no change).
+
+        \table
+        \header
+        \li Output examples with different minimumInput values
+        \li
+        \li
+        \row
+            \li \image LevelAdjust_minimumInput1.png
+            \li \image LevelAdjust_minimumInput2.png
+            \li \image LevelAdjust_minimumInput3.png
+        \row
+            \li \b { minimumInput: #00000000 }
+            \li \b { minimumInput: #00000040 }
+            \li \b { minimumInput: #00000070 }
+        \row
+            \li \l maximumInput: #ffffff
+            \li \l maximumInput: #ffffff
+            \li \l maximumInput: #ffffff
+        \row
+            \li \l minimumOutput: #000000
+            \li \l minimumOutput: #000000
+            \li \l minimumOutput: #000000
+        \row
+            \li \l maximumOutput: #ffffff
+            \li \l maximumOutput: #ffffff
+            \li \l maximumOutput: #ffffff
+        \row
+            \li \l gamma: Qt.vector3d(1.0, 1.0, 1.0)
+            \li \l gamma: Qt.vector3d(1.0, 1.0, 1.0)
+            \li \l gamma: Qt.vector3d(1.0, 1.0, 1.0)
+        \endtable
+
+        \table
+        \header
+            \li Pixel color channel luminance curves of the above images.
+            \li
+            \li
+        \row
+            \li \image LevelAdjust_default_curve.png
+            \li \image LevelAdjust_minimumInput2_curve.png
+            \li \image LevelAdjust_minimumInput3_curve.png
+        \row
+            \li X-axis: pixel original luminance
+            \li
+            \li
+        \row
+            \li Y-axis: color channel luminance with effect applied
+            \li
+            \li
+        \endtable
+
+    */
+    property color minimumInput: Qt.rgba(0.0, 0.0, 0.0, 0.0)
+
+    /*!
+        This property defines the maximum input level for each color channel.
+        It sets the white-point, all pixels having higher value than this
+        property are rendered as white (per color channel).
+        Decreasing the value lightens the light areas.
+
+        The value ranges from "#ffffffff" to "#00000000". By default, the
+        property is set to \c "#ffffffff" (no change).
+
+        \table
+        \header
+        \li Output examples with different maximumInput values
+        \li
+        \li
+        \row
+            \li \image LevelAdjust_maximumInput1.png
+            \li \image LevelAdjust_maximumInput2.png
+            \li \image LevelAdjust_maximumInput3.png
+        \row
+            \li \b { maximumInput: #FFFFFFFF }
+            \li \b { maximumInput: #FFFFFF80 }
+            \li \b { maximumInput: #FFFFFF30 }
+        \row
+            \li \l minimumInput: #000000
+            \li \l minimumInput: #000000
+            \li \l minimumInput: #000000
+        \row
+            \li \l minimumOutput: #000000
+            \li \l minimumOutput: #000000
+            \li \l minimumOutput: #000000
+        \row
+            \li \l maximumOutput: #ffffff
+            \li \l maximumOutput: #ffffff
+            \li \l maximumOutput: #ffffff
+        \row
+            \li \l gamma: Qt.vector3d(1.0, 1.0, 1.0)
+            \li \l gamma: Qt.vector3d(1.0, 1.0, 1.0)
+            \li \l gamma: Qt.vector3d(1.0, 1.0, 1.0)
+        \endtable
+
+        \table
+        \header
+            \li Pixel color channel luminance curves of the above images.
+            \li
+            \li
+        \row
+            \li \image LevelAdjust_default_curve.png
+            \li \image LevelAdjust_maximumInput2_curve.png
+            \li \image LevelAdjust_maximumInput3_curve.png
+        \row
+            \li X-axis: pixel original luminance
+            \li
+            \li
+        \row
+            \li Y-axis: color channel luminance with effect applied
+            \li
+            \li
+        \endtable
+
+    */
+    property color maximumInput: Qt.rgba(1.0, 1.0, 1.0, 1.0)
+
+    /*!
+        This property defines the minimum output level for each color channel.
+        Increasing the value lightens the dark areas, reducing the contrast.
+
+        The value ranges from "#00000000" to "#ffffffff". By default, the
+        property is set to \c "#00000000" (no change).
+
+        \table
+        \header
+        \li Output examples with different minimumOutput values
+        \li
+        \li
+        \row
+            \li \image LevelAdjust_minimumOutput1.png
+            \li \image LevelAdjust_minimumOutput2.png
+            \li \image LevelAdjust_minimumOutput3.png
+        \row
+            \li \b { minimumOutput: #00000000 }
+            \li \b { minimumOutput: #00000070 }
+            \li \b { minimumOutput: #000000A0 }
+        \row
+            \li \l minimumInput: #000000
+            \li \l minimumInput: #000000
+            \li \l minimumInput: #000000
+        \row
+            \li \l maximumInput: #ffffff
+            \li \l maximumInput: #ffffff
+            \li \l maximumInput: #ffffff
+        \row
+            \li \l maximumOutput: #ffffff
+            \li \l maximumOutput: #ffffff
+            \li \l maximumOutput: #ffffff
+        \row
+            \li \l gamma: Qt.vector3d(1.0, 1.0, 1.0)
+            \li \l gamma: Qt.vector3d(1.0, 1.0, 1.0)
+            \li \l gamma: Qt.vector3d(1.0, 1.0, 1.0)
+        \endtable
+
+        \table
+        \header
+            \li Pixel color channel luminance curves of the above images.
+            \li
+            \li
+        \row
+            \li \image LevelAdjust_default_curve.png
+            \li \image LevelAdjust_minimumOutput2_curve.png
+            \li \image LevelAdjust_minimumOutput3_curve.png
+        \row
+            \li X-axis: pixel original luminance
+            \li
+            \li
+        \row
+            \li Y-axis: color channel luminance with effect applied
+            \li
+            \li
+        \endtable
+
+    */
+    property color minimumOutput: Qt.rgba(0.0, 0.0, 0.0, 0.0)
+
+    /*!
+        This property defines the maximum output level for each color channel.
+        Decreasing the value darkens the light areas, reducing the contrast.
+
+        The value ranges from "#ffffffff" to "#00000000". By default, the
+        property is set to \c "#ffffffff" (no change).
+
+        \table
+        \header
+        \li Output examples with different maximumOutput values
+        \li
+        \li
+        \row
+            \li \image LevelAdjust_maximumOutput1.png
+            \li \image LevelAdjust_maximumOutput2.png
+            \li \image LevelAdjust_maximumOutput3.png
+        \row
+            \li \b { maximumOutput: #FFFFFFFF }
+            \li \b { maximumOutput: #FFFFFF80 }
+            \li \b { maximumOutput: #FFFFFF30 }
+        \row
+            \li \l minimumInput: #000000
+            \li \l minimumInput: #000000
+            \li \l minimumInput: #000000
+        \row
+            \li \l maximumInput: #ffffff
+            \li \l maximumInput: #ffffff
+            \li \l maximumInput: #ffffff
+        \row
+            \li \l minimumOutput: #000000
+            \li \l minimumOutput: #000000
+            \li \l minimumOutput: #000000
+        \row
+            \li \l gamma: Qt.vector3d(1.0, 1.0, 1.0)
+            \li \l gamma: Qt.vector3d(1.0, 1.0, 1.0)
+            \li \l gamma: Qt.vector3d(1.0, 1.0, 1.0)
+        \endtable
+
+        \table
+        \header
+            \li Pixel color channel luminance curves of the above images.
+            \li
+            \li
+        \row
+            \li \image LevelAdjust_default_curve.png
+            \li \image LevelAdjust_maximumOutput2_curve.png
+            \li \image LevelAdjust_maximumOutput3_curve.png
+        \row
+            \li X-axis: pixel original luminance
+            \li
+            \li
+        \row
+            \li Y-axis: color channel luminance with effect applied
+            \li
+            \li
+        \endtable
+    */
+    property color maximumOutput: Qt.rgba(1.0, 1.0, 1.0, 1.0)
+
+    /*!
+        This property allows the effect output pixels to be cached in order to
+        improve the rendering performance.
+
+        Every time the source or effect properties are changed, the pixels in
+        the cache must be updated. Memory consumption is increased, because an
+        extra buffer of memory is required for storing the effect output.
+
+        It is recommended to disable the cache when the source or the effect
+        properties are animated.
+
+        By default, the property is set to \c false.
+    */
+    property bool cached: false
+
+    SourceProxy {
+        id: sourceProxy
+        input: rootItem.source
+        interpolation: input && input.smooth ? SourceProxy.LinearInterpolation : SourceProxy.NearestInterpolation
+    }
+
+    ShaderEffectSource {
+        id: cacheItem
+        anchors.fill: parent
+        visible: rootItem.cached
+        smooth: true
+        sourceItem: shaderItem
+        live: true
+        hideSource: visible
+    }
+
+    ShaderEffect {
+        id: shaderItem
+        property variant source: sourceProxy.output
+        property variant minimumInputRGB: Qt.vector3d(rootItem.minimumInput.r, rootItem.minimumInput.g, rootItem.minimumInput.b)
+        property variant maximumInputRGB: Qt.vector3d(rootItem.maximumInput.r, rootItem.maximumInput.g, rootItem.maximumInput.b)
+        property real minimumInputAlpha: rootItem.minimumInput.a
+        property real maximumInputAlpha: rootItem.maximumInput.a
+        property variant minimumOutputRGB: Qt.vector3d(rootItem.minimumOutput.r, rootItem.minimumOutput.g, rootItem.minimumOutput.b)
+        property variant maximumOutputRGB: Qt.vector3d(rootItem.maximumOutput.r, rootItem.maximumOutput.g, rootItem.maximumOutput.b)
+        property real minimumOutputAlpha: rootItem.minimumOutput.a
+        property real maximumOutputAlpha: rootItem.maximumOutput.a
+        property variant gamma: Qt.vector3d(1.0 / Math.max(rootItem.gamma.x, 0.0001), 1.0 / Math.max(rootItem.gamma.y, 0.0001), 1.0 / Math.max(rootItem.gamma.z, 0.0001))
+        anchors.fill: parent
+
+        fragmentShader: "qrc:/qt-project.org/imports/QtGraphicalEffects/shaders/leveladjust.frag"
+    }
+}
diff --git a/deployment_test/QtGraphicalEffects/LinearGradient.qml b/deployment_test/QtGraphicalEffects/LinearGradient.qml
new file mode 100644
index 0000000000000000000000000000000000000000..1f73a218f9cce674195c660c505251c61a240f06
--- /dev/null
+++ b/deployment_test/QtGraphicalEffects/LinearGradient.qml
@@ -0,0 +1,323 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Graphical Effects module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtGraphicalEffects.private 1.12
+
+/*!
+    \qmltype LinearGradient
+    \inqmlmodule QtGraphicalEffects
+    \since QtGraphicalEffects 1.0
+    \inherits QtQuick2::Item
+    \ingroup qtgraphicaleffects-gradient
+    \brief Draws a linear gradient.
+
+    A gradient is defined by two or more colors, which are blended seamlessly.
+    The colors start from the given start point and end to the given end point.
+
+    \table
+    \header
+        \li Effect applied
+    \row
+        \li \image LinearGradient.png
+    \endtable
+
+    \note This effect is available when running with OpenGL.
+
+    \section1 Example
+
+    The following example shows how to apply the effect.
+    \snippet LinearGradient-example.qml example
+
+*/
+Item {
+    id: rootItem
+
+    /*!
+        This property defines the starting point where the color at gradient
+        position of 0.0 is rendered. Colors at larger position values are
+        rendered linearly towards the end point. The point is given in pixels
+        and the default value is Qt.point(0, 0). Setting the default values for
+        the start and \l{LinearGradient::end}{end} results in a full height
+        linear gradient on the y-axis.
+
+        \table
+        \header
+        \li Output examples with different start values
+        \li
+        \li
+        \row
+            \li \image LinearGradient_start1.png
+            \li \image LinearGradient_start2.png
+            \li \image LinearGradient_start3.png
+        \row
+            \li \b { start: QPoint(0, 0) }
+            \li \b { start: QPoint(150, 150) }
+            \li \b { start: QPoint(300, 0) }
+        \row
+            \li \l end: QPoint(300, 300)
+            \li \l end: QPoint(300, 300)
+            \li \l end: QPoint(300, 300)
+        \endtable
+
+    */
+    property variant start: Qt.point(0, 0)
+
+    /*!
+        This property defines the ending point where the color at gradient
+        position of 1.0 is rendered. Colors at smaller position values are
+        rendered linearly towards the start point. The point is given in pixels
+        and the default value is Qt.point(0, height). Setting the default values
+        for the \l{LinearGradient::start}{start} and end results in a full
+        height linear gradient on the y-axis.
+
+        \table
+        \header
+        \li Output examples with different end values
+        \li
+        \li
+        \row
+            \li \image LinearGradient_end1.png
+            \li \image LinearGradient_end2.png
+            \li \image LinearGradient_end3.png
+        \row
+            \li \b { end: Qt.point(300, 300) }
+            \li \b { end: Qt.point(150, 150) }
+            \li \b { end: Qt.point(300, 0) }
+        \row
+            \li \l start: Qt.point(0, 0)
+            \li \l start: Qt.point(0, 0)
+            \li \l start: Qt.point(0, 0)
+        \endtable
+
+    */
+    property variant end: Qt.point(0, height)
+
+    /*!
+        This property allows the effect output pixels to be cached in order to
+        improve the rendering performance.
+
+        Every time the source or effect properties are changed, the pixels in
+        the cache must be updated. Memory consumption is increased, because an
+        extra buffer of memory is required for storing the effect output.
+
+        It is recommended to disable the cache when the source or the effect
+        properties are animated.
+
+        By default, the property is set to \c false.
+    */
+    property bool cached: false
+
+    /*!
+        This property defines the item that is going to be filled with gradient.
+        Source item gets rendered into an intermediate pixel buffer and the
+        alpha values from the result are used to determine the gradient's pixels
+        visibility in the display. The default value for source is undefined and
+        in that case whole effect area is filled with gradient.
+
+        \table
+        \header
+        \li Output examples with different source values
+        \li
+        \li
+        \row
+            \li \image LinearGradient_maskSource1.png
+            \li \image LinearGradient_maskSource2.png
+        \row
+            \li \b { source: undefined }
+            \li \b { source: Image { source: images/butterfly.png } }
+        \row
+            \li \l start: Qt.point(0, 0)
+            \li \l start: Qt.point(0, 0)
+        \row
+            \li \l end: Qt.point(300, 300)
+            \li \l end: Qt.point(300, 300)
+        \endtable
+
+        \note It is not supported to let the effect include itself, for
+        instance by setting source to the effect's parent.
+    */
+    property variant source
+
+
+    /*!
+        A gradient is defined by two or more colors, which are blended
+        seamlessly. The colors are specified as a set of GradientStop child
+        items, each of which defines a position on the gradient from 0.0 to 1.0
+        and a color. The position of each GradientStop is defined by the
+        position property, and the color is definded by the color property.
+
+        \table
+        \header
+        \li Output examples with different gradient values
+        \li
+        \li
+        \row
+            \li \image LinearGradient_gradient1.png
+            \li \image LinearGradient_gradient2.png
+            \li \image LinearGradient_gradient3.png
+            \row
+            \li \b {gradient:} \code
+    Gradient {
+      GradientStop {
+         position: 0.000
+         color: Qt.rgba(1, 0, 0, 1)
+      }
+      GradientStop {
+         position: 0.167
+         color: Qt.rgba(1, 1, 0, 1)
+      }
+      GradientStop {
+         position: 0.333
+         color: Qt.rgba(0, 1, 0, 1)
+      }
+      GradientStop {
+         position: 0.500
+         color: Qt.rgba(0, 1, 1, 1)
+      }
+      GradientStop {
+         position: 0.667
+         color: Qt.rgba(0, 0, 1, 1)
+      }
+      GradientStop {
+         position: 0.833
+         color: Qt.rgba(1, 0, 1, 1)
+      }
+      GradientStop {
+         position: 1.000
+         color: Qt.rgba(1, 0, 0, 1)
+      }
+    }
+        \endcode
+            \li \b {gradient:} \code
+    Gradient {
+      GradientStop {
+        position: 0.0
+        color: "#F0F0F0"
+      }
+      GradientStop {
+        position: 0.5
+        color: "#000000"
+      }
+      GradientStop {
+        position: 1.0
+        color: "#F0F0F0"
+      }
+    }
+        \endcode
+            \li \b {gradient:} \code
+    Gradient {
+      GradientStop {
+        position: 0.0
+        color: "#00000000"
+      }
+      GradientStop {
+        position: 1.0
+        color: "#FF000000"
+      }
+    }
+        \endcode
+        \row
+            \li \l start: Qt.point(0, 0)
+            \li \l start: Qt.point(0, 0)
+            \li \l start: Qt.point(0, 0)
+        \row
+            \li \l end: Qt.point(300, 300)
+            \li \l end: Qt.point(300, 300)
+            \li \l end: Qt.point(300, 300)
+        \endtable
+
+    */
+    property Gradient gradient: Gradient {
+        GradientStop { position: 0.0; color: "white" }
+        GradientStop { position: 1.0; color: "black" }
+    }
+
+    SourceProxy {
+        id: maskSourceProxy
+        input: rootItem.source
+    }
+
+    ShaderEffectSource {
+        id: gradientSource
+        sourceItem: Rectangle {
+            width: 16
+            height: 256
+            gradient: rootItem.gradient
+            smooth: true
+        }
+        smooth: true
+        hideSource: true
+        visible: false
+    }
+
+   ShaderEffectSource {
+        id: cacheItem
+        anchors.fill: parent
+        visible: rootItem.cached
+        smooth: true
+        sourceItem: shaderItem
+        live: true
+        hideSource: visible
+    }
+
+    ShaderEffect {
+        id: shaderItem
+
+        anchors.fill: parent
+
+        property variant source: gradientSource
+        property variant maskSource: maskSourceProxy.output
+        property variant startPoint: Qt.point(start.x / width, start.y / height)
+        property real dx: end.x - start.x
+        property real dy: end.y - start.y
+        property real l: 1.0 / Math.sqrt(Math.pow(dx / width, 2.0) + Math.pow(dy / height, 2.0))
+        property real angle: Math.atan2(dx, dy)
+        property variant matrixData: Qt.point(Math.sin(angle), Math.cos(angle))
+
+        vertexShader: "qrc:/qt-project.org/imports/QtGraphicalEffects/shaders/lineargradient.vert"
+
+        fragmentShader: maskSource == undefined ? noMaskShader : maskShader
+
+        onFragmentShaderChanged: lChanged()
+
+        property string maskShader: "qrc:/qt-project.org/imports/QtGraphicalEffects/shaders/lineargradient_mask.frag"
+        property string noMaskShader: "qrc:/qt-project.org/imports/QtGraphicalEffects/shaders/lineargradient_nomask.frag"
+    }
+}
diff --git a/deployment_test/QtGraphicalEffects/MaskedBlur.qml b/deployment_test/QtGraphicalEffects/MaskedBlur.qml
new file mode 100644
index 0000000000000000000000000000000000000000..d777b0ae203a1887751f6d8dc520776beccac37c
--- /dev/null
+++ b/deployment_test/QtGraphicalEffects/MaskedBlur.qml
@@ -0,0 +1,218 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Copyright (C) 2017 Jolla Ltd, author: <gunnar.sletta@jollamobile.com>
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Graphical Effects module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtGraphicalEffects.private 1.12
+
+/*!
+    \qmltype MaskedBlur
+    \inqmlmodule QtGraphicalEffects
+    \since QtGraphicalEffects 1.0
+    \inherits QtQuick2::Item
+    \ingroup qtgraphicaleffects-blur
+    \brief Applies a blur effect with a varying intesity.
+
+    MaskedBlur effect softens the image by blurring it. The intensity of the
+    blur can be controlled for each pixel using maskSource so that some parts of
+    the source are blurred more than others.
+
+    Performing blur live is a costly operation. Fullscreen gaussian blur
+    with even a moderate number of samples will only run at 60 fps on highend
+    graphics hardware.
+
+    \table
+    \header
+        \li Source
+        \li MaskSource
+        \li Effect applied
+    \row
+        \li \image Original_bug.png
+        \li \image MaskedBlur_mask.png
+        \li \image MaskedBlur_bug.png
+    \endtable
+
+    \note This effect is available when running with OpenGL.
+
+    \section1 Example
+
+    The following example shows how to apply the effect.
+    \snippet MaskedBlur-example.qml example
+
+*/
+Item {
+    id: root
+
+    /*!
+        This property defines the source item that is going to be blurred.
+
+        \note It is not supported to let the effect include itself, for
+        instance by setting source to the effect's parent.
+    */
+    property alias source: blur.source
+
+    /*!
+        This property defines the item that is controlling the final intensity
+        of the blur. The pixel alpha channel value from maskSource defines the
+        actual blur radius that is going to be used for blurring the
+        corresponding source pixel.
+
+        Opaque maskSource pixels produce blur with specified
+        \l{MaskedBlur::radius}{radius}, while transparent pixels suppress the
+        blur completely. Semitransparent maskSource pixels produce blur with a
+        radius that is interpolated according to the pixel transparency level.
+    */
+    property alias maskSource: maskProxy.input
+
+    /*!
+        This property defines the distance of the neighboring pixels which
+        affect the blurring of an individual pixel. A larger radius increases
+        the blur effect.
+
+        Depending on the radius value, value of the
+        \l{MaskedBlur::samples}{samples} should be set to sufficiently large to
+        ensure the visual quality.
+
+        The value ranges from 0.0 (no blur) to inf. By default, the property is
+        set to \c 0.0 (no blur).
+
+        \table
+        \header
+        \li Output examples with different radius values
+        \li
+        \li
+        \row
+            \li \image MaskedBlur_radius1.png
+            \li \image MaskedBlur_radius2.png
+            \li \image MaskedBlur_radius3.png
+        \row
+            \li \b { radius: 0 }
+            \li \b { radius: 8 }
+            \li \b { radius: 16 }
+        \row
+            \li \l samples: 25
+            \li \l samples: 25
+            \li \l samples: 25
+        \endtable
+
+    */
+    property alias radius: blur.radius
+
+    /*!
+        This property defines how many samples are taken per pixel when blur
+        calculation is done. Larger value produces better quality, but is slower
+        to render.
+
+        Ideally, this value should be twice as large as the highest required
+        radius value plus 1, for example, if the radius is animated between 0.0
+        and 4.0, samples should be set to 9.
+
+        By default, the property is set to \c 9.
+
+        This property is not intended to be animated. Changing this property may
+        cause the underlying OpenGL shaders to be recompiled.
+    */
+    property alias samples: blur.samples
+
+    /*!
+        This property allows the effect output pixels to be cached in order to
+        improve the rendering performance. Every time the source or effect
+        properties are changed, the pixels in the cache must be updated. Memory
+        consumption is increased, because an extra buffer of memory is required
+        for storing the effect output.
+
+        It is recommended to disable the cache when the source or the effect
+        properties are animated.
+
+        By default, the property is set to \c false.
+
+    */
+    property alias cached: cacheItem.visible
+
+    /*!
+        \internal
+
+        Kept for source compatibility only. Removed in Qt 5.6
+        ### Qt6: remove
+    */
+    property bool fast: false
+
+    /*!
+        \internal
+
+        Kept for source compatibility only. Removed in Qt 5.6
+
+        Doing transparent border on a masked source doesn't make any sense
+        as the padded exterior will have a mask alpha value of 0 which means
+        no blurring and as the padded exterior of the source is a transparent
+        pixel, the result is no pixels at all.
+
+        In Qt 5.6 and before, this worked based on that the mask source
+        was scaled up to fit the padded blur target rect, which would lead
+        to inconsistent and buggy results.
+
+        ### Qt6: remove
+    */
+    property bool transparentBorder;
+
+    GaussianBlur {
+        id: blur
+
+        source: root.source;
+        anchors.fill: parent
+        _maskSource: maskProxy.output;
+
+        SourceProxy {
+            id: maskProxy
+        }
+    }
+
+    ShaderEffectSource {
+        id: cacheItem
+        x: -blur._kernelRadius
+        y: -blur._kernelRadius
+        width: blur.width + 2 * blur._kernelRadius
+        height: blur.height + 2 * blur._kernelRadius
+        visible: false
+        smooth: true
+        sourceRect: Qt.rect(-blur._kernelRadius, -blur._kernelRadius, width, height);
+        sourceItem: blur
+        hideSource: visible
+    }
+}
diff --git a/deployment_test/QtGraphicalEffects/OpacityMask.qml b/deployment_test/QtGraphicalEffects/OpacityMask.qml
new file mode 100644
index 0000000000000000000000000000000000000000..7dffb6d48fdb337d8035d53144ae727e737312f0
--- /dev/null
+++ b/deployment_test/QtGraphicalEffects/OpacityMask.qml
@@ -0,0 +1,162 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Graphical Effects module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtGraphicalEffects.private 1.12
+
+/*!
+    \qmltype OpacityMask
+    \inqmlmodule QtGraphicalEffects
+    \since QtGraphicalEffects 1.0
+    \inherits QtQuick2::Item
+    \ingroup qtgraphicaleffects-mask
+    \brief Masks the source item with another item.
+
+    \table
+    \header
+        \li Source
+        \li MaskSource
+        \li Effect applied
+    \row
+        \li \image Original_bug.png
+        \li \image OpacityMask_mask.png
+        \li \image OpacityMask_bug.png
+    \endtable
+
+    \note This effect is available when running with OpenGL.
+
+    \section1 Example
+
+    The following example shows how to apply the effect.
+    \snippet OpacityMask-example.qml example
+
+*/
+Item {
+    id: rootItem
+
+    /*!
+        This property defines the source item that is going to be masked.
+
+        \note It is not supported to let the effect include itself, for
+        instance by setting source to the effect's parent.
+    */
+    property variant source
+
+    /*!
+        This property defines the item that is going to be used as the mask. The
+        mask item gets rendered into an intermediate pixel buffer and the alpha
+        values from the result are used to determine the source item's pixels
+        visibility in the display.
+
+        \table
+        \header
+            \li Original
+            \li Mask
+            \li Effect applied
+        \row
+            \li \image Original_bug.png
+            \li \image OpacityMask_mask.png
+            \li \image OpacityMask_bug.png
+        \endtable
+    */
+    property variant maskSource
+
+    /*!
+        This property allows the effect output pixels to be cached in order to
+        improve the rendering performance.
+
+        Every time the source or effect properties are changed, the pixels in
+        the cache must be updated. Memory consumption is increased, because an
+        extra buffer of memory is required for storing the effect output.
+
+        It is recommended to disable the cache when the source or the effect
+        properties are animated.
+
+        By default, the property is set to \c false.
+
+        \note It is not supported to let the effect include itself, for
+        instance by setting maskSource to the effect's parent.
+    */
+    property bool cached: false
+
+    /*!
+        This property controls how the alpha values of the sourceMask will behave.
+
+        If this property is \c false, the resulting opacity is the source alpha
+        multiplied with the mask alpha, \c{As * Am}.
+
+        If this property is \c true, the resulting opacity is the source alpha
+        multiplied with the inverse of the mask alpha, \c{As * (1 - Am)}.
+
+        The default is \c false.
+
+        \since 5.7
+    */
+    property bool invert: false
+
+    SourceProxy {
+        id: sourceProxy
+        input: rootItem.source
+    }
+
+    SourceProxy {
+        id: maskSourceProxy
+        input: rootItem.maskSource
+    }
+
+    ShaderEffectSource {
+        id: cacheItem
+        anchors.fill: parent
+        visible: rootItem.cached
+        smooth: true
+        sourceItem: shaderItem
+        live: true
+        hideSource: visible
+    }
+
+    ShaderEffect {
+        id: shaderItem
+        property variant source: sourceProxy.output
+        property variant maskSource: maskSourceProxy.output
+
+        anchors.fill: parent
+
+        fragmentShader: invert ? "qrc:/qt-project.org/imports/QtGraphicalEffects/shaders/opacitymask_invert.frag" : "qrc:/qt-project.org/imports/QtGraphicalEffects/shaders/opacitymask.frag"
+    }
+}
diff --git a/deployment_test/QtGraphicalEffects/RadialBlur.qml b/deployment_test/QtGraphicalEffects/RadialBlur.qml
new file mode 100644
index 0000000000000000000000000000000000000000..71d3b64873373cad0b58986c7bf8ec7b2478ae47
--- /dev/null
+++ b/deployment_test/QtGraphicalEffects/RadialBlur.qml
@@ -0,0 +1,316 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Graphical Effects module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtGraphicalEffects.private 1.12
+
+/*!
+    \qmltype RadialBlur
+    \inqmlmodule QtGraphicalEffects
+    \since QtGraphicalEffects 1.0
+    \inherits QtQuick2::Item
+    \ingroup qtgraphicaleffects-motion-blur
+    \brief Applies directional blur in a circular direction around the items
+    center point.
+
+    Effect creates perceived impression that the source item appears to be
+    rotating to the direction of the blur.
+
+    Other available motionblur effects are
+    \l{QtGraphicalEffects::ZoomBlur}{ZoomBlur} and
+    \l{QtGraphicalEffects::DirectionalBlur}{DirectionalBlur}.
+
+    \table
+    \header
+        \li Source
+        \li Effect applied
+    \row
+        \li \image Original_bug.png
+        \li \image RadialBlur_bug.png
+    \endtable
+
+    \note This effect is available when running with OpenGL.
+
+    \section1 Example Usage
+
+    The following example shows how to apply the effect.
+    \snippet RadialBlur-example.qml example
+*/
+Item {
+    id: rootItem
+
+    /*!
+        This property defines the source item that is going to be blurred.
+
+        \note It is not supported to let the effect include itself, for
+        instance by setting source to the effect's parent.
+    */
+    property variant source
+
+    /*!
+        This property defines the direction for the blur and at the same time
+        the level of blurring. The larger the angle, the more the result becomes
+        blurred. The quality of the blur depends on
+        \l{RadialBlur::samples}{samples} property. If angle value is large, more
+        samples are needed to keep the visual quality at high level.
+
+        Allowed values are between 0.0 and 360.0. By default the property is set
+        to \c 0.0.
+
+        \table
+        \header
+        \li Output examples with different angle values
+        \li
+        \li
+        \row
+            \li \image RadialBlur_angle1.png
+            \li \image RadialBlur_angle2.png
+            \li \image RadialBlur_angle3.png
+        \row
+            \li \b { angle: 0.0 }
+            \li \b { angle: 15.0 }
+            \li \b { angle: 30.0 }
+        \row
+            \li \l samples: 24
+            \li \l samples: 24
+            \li \l samples: 24
+        \row
+            \li \l horizontalOffset: 0
+            \li \l horizontalOffset: 0
+            \li \l horizontalOffset: 0
+        \row
+            \li \l verticalOffset: 0
+            \li \l verticalOffset: 0
+            \li \l verticalOffset: 0
+        \endtable
+    */
+    property real angle: 0.0
+
+    /*!
+        This property defines how many samples are taken per pixel when blur
+        calculation is done. Larger value produces better quality, but is slower
+        to render.
+
+        This property is not intended to be animated. Changing this property may
+        cause the underlying OpenGL shaders to be recompiled.
+
+        Allowed values are between 0 and inf (practical maximum depends on GPU).
+        By default the property is set to \c 0 (no samples).
+
+    */
+    property int samples: 0
+
+    /*!
+        \qmlproperty real QtGraphicalEffects::RadialBlur::horizontalOffset
+        \qmlproperty real QtGraphicalEffects::RadialBlur::verticalOffset
+
+        These properties define the offset in pixels for the perceived center
+        point of the rotation.
+
+        Allowed values are between -inf and inf.
+        By default these properties are set to \c 0.
+
+        \table
+        \header
+        \li Output examples with different horizontalOffset values
+        \li
+        \li
+        \row
+            \li \image RadialBlur_horizontalOffset1.png
+            \li \image RadialBlur_horizontalOffset2.png
+            \li \image RadialBlur_horizontalOffset3.png
+        \row
+            \li \b { horizontalOffset: 75.0 }
+            \li \b { horizontalOffset: 0.0 }
+            \li \b { horizontalOffset: -75.0 }
+        \row
+            \li \l samples: 24
+            \li \l samples: 24
+            \li \l samples: 24
+        \row
+            \li \l angle: 20
+            \li \l angle: 20
+            \li \l angle: 20
+        \row
+            \li \l verticalOffset: 0
+            \li \l verticalOffset: 0
+            \li \l verticalOffset: 0
+        \endtable
+    */
+    property real horizontalOffset: 0.0
+    property real verticalOffset: 0.0
+
+    /*!
+        This property defines the blur behavior near the edges of the item,
+        where the pixel blurring is affected by the pixels outside the source
+        edges.
+
+        If the property is set to \c true, the pixels outside the source are
+        interpreted to be transparent, which is similar to OpenGL
+        clamp-to-border extension. The blur is expanded slightly outside the
+        effect item area.
+
+        If the property is set to \c false, the pixels outside the source are
+        interpreted to contain the same color as the pixels at the edge of the
+        item, which is similar to OpenGL clamp-to-edge behavior. The blur does
+        not expand outside the effect item area.
+
+        By default, the property is set to \c false.
+    */
+    property bool transparentBorder: false
+
+    /*!
+        This property allows the effect output pixels to be cached in order to
+        improve the rendering performance.
+
+        Every time the source or effect properties are changed, the pixels in
+        the cache must be updated. Memory consumption is increased, because an
+        extra buffer of memory is required for storing the effect output.
+
+        It is recommended to disable the cache when the source or the effect
+        properties are animated.
+
+        By default, the property is set to \c false.
+
+    */
+    property bool cached: false
+
+    SourceProxy {
+        id: sourceProxy
+        input: rootItem.source
+        sourceRect: shaderItem.transparentBorder ? Qt.rect(-1, -1, parent.width + 2.0, parent.height + 2.0) : Qt.rect(0, 0, 0, 0)
+    }
+
+    ShaderEffectSource {
+        id: cacheItem
+        anchors.fill: shaderItem
+        visible: rootItem.cached
+        smooth: true
+        sourceItem: shaderItem
+        live: true
+        hideSource: visible
+    }
+
+    ShaderEffect {
+        id: shaderItem
+        property variant source: sourceProxy.output
+        property variant center: Qt.point(0.5 + rootItem.horizontalOffset / parent.width, 0.5 + rootItem.verticalOffset / parent.height)
+        property bool transparentBorder: rootItem.transparentBorder && rootItem.samples > 1
+        property int samples: rootItem.samples
+        property real weight: 1.0 / Math.max(1.0, rootItem.samples)
+        property real angleSin: Math.sin(rootItem.angle/2 * Math.PI/180)
+        property real angleCos: Math.cos(rootItem.angle/2 * Math.PI/180)
+        property real angleSinStep: Math.sin(-rootItem.angle * Math.PI/180 / Math.max(1.0, rootItem.samples - 1))
+        property real angleCosStep: Math.cos(-rootItem.angle * Math.PI/180 / Math.max(1.0, rootItem.samples - 1))
+        property variant expandPixels: transparentBorder ? Qt.size(0.5 * parent.height, 0.5 * parent.width) : Qt.size(0,0)
+        property variant expand: transparentBorder ? Qt.size(expandPixels.width / width, expandPixels.height / height) : Qt.size(0,0)
+        property variant delta: Qt.size(1.0 / rootItem.width, 1.0 / rootItem.height)
+        property real w: parent.width
+        property real h: parent.height
+
+        x: transparentBorder ? -expandPixels.width - 1 : 0
+        y: transparentBorder ? -expandPixels.height - 1 : 0
+        width: transparentBorder ? parent.width + expandPixels.width * 2.0 + 2 : parent.width
+        height: transparentBorder ? parent.height + expandPixels.height * 2.0 + 2 : parent.height
+
+        property string fragmentShaderSkeleton: "
+            varying highp vec2 qt_TexCoord0;
+            uniform highp float qt_Opacity;
+            uniform lowp sampler2D source;
+            uniform highp float angleSin;
+            uniform highp float angleCos;
+            uniform highp float angleSinStep;
+            uniform highp float angleCosStep;
+            uniform highp float weight;
+            uniform highp vec2 expand;
+            uniform highp vec2 center;
+            uniform highp vec2 delta;
+            uniform highp float w;
+            uniform highp float h;
+
+            void main(void) {
+                highp mat2 m;
+                gl_FragColor = vec4(0.0);
+                mediump vec2 texCoord = qt_TexCoord0;
+
+                PLACEHOLDER_EXPAND_STEPS
+
+                highp vec2 dir = vec2(texCoord.s * w - w * center.x, texCoord.t * h - h * center.y);
+                m[0] = vec2(angleCos, -angleSin);
+                m[1] = vec2(angleSin, angleCos);
+                dir *= m;
+
+                m[0] = vec2(angleCosStep, -angleSinStep);
+                m[1] = vec2(angleSinStep, angleCosStep);
+
+                PLACEHOLDER_UNROLLED_LOOP
+
+                gl_FragColor *= weight * qt_Opacity;
+            }
+        "
+
+        function buildFragmentShader() {
+            var shader = ""
+            if (GraphicsInfo.profile == GraphicsInfo.OpenGLCoreProfile)
+                shader += "#version 150 core\n#define varying in\n#define gl_FragColor fragColor\n#define texture2D texture\nout vec4 fragColor;\n"
+            shader += fragmentShaderSkeleton
+            var expandSteps = ""
+
+            if (transparentBorder) {
+                expandSteps += "texCoord = (texCoord - expand) / (1.0 - 2.0 * expand);"
+            }
+
+            var unrolledLoop = "gl_FragColor += texture2D(source, texCoord);\n"
+
+            if (rootItem.samples > 1) {
+                 unrolledLoop = ""
+                 for (var i = 0; i < rootItem.samples; i++)
+                     unrolledLoop += "gl_FragColor += texture2D(source, center + dir * delta); dir *= m;\n"
+            }
+
+            shader = shader.replace("PLACEHOLDER_EXPAND_STEPS", expandSteps)
+            fragmentShader = shader.replace("PLACEHOLDER_UNROLLED_LOOP", unrolledLoop)
+        }
+
+        onFragmentShaderChanged: sourceChanged()
+        onSamplesChanged: buildFragmentShader()
+        onTransparentBorderChanged: buildFragmentShader()
+        Component.onCompleted: buildFragmentShader()
+    }
+}
diff --git a/deployment_test/QtGraphicalEffects/RadialGradient.qml b/deployment_test/QtGraphicalEffects/RadialGradient.qml
new file mode 100644
index 0000000000000000000000000000000000000000..52b3ff3ef99634cf7d2885ee3c7d7fc1bf095b0e
--- /dev/null
+++ b/deployment_test/QtGraphicalEffects/RadialGradient.qml
@@ -0,0 +1,410 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Graphical Effects module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtGraphicalEffects.private 1.12
+
+/*!
+    \qmltype RadialGradient
+    \inqmlmodule QtGraphicalEffects
+    \since QtGraphicalEffects 1.0
+    \inherits QtQuick2::Item
+    \ingroup qtgraphicaleffects-gradient
+    \brief Draws a radial gradient.
+
+    A gradient is defined by two or more colors, which are blended seamlessly.
+    The colors start from the middle of the item and end at the borders.
+
+    \table
+    \header
+        \li Effect applied
+    \row
+        \li \image RadialGradient.png
+    \endtable
+
+    \note This effect is available when running with OpenGL.
+
+    \section1 Example
+
+    The following example shows how to apply the effect.
+    \snippet RadialGradient-example.qml example
+
+*/
+Item {
+    id: rootItem
+
+    /*!
+        This property allows the effect output pixels to be cached in order to
+        improve the rendering performance.
+
+        Every time the source or effect properties are changed, the pixels in
+        the cache must be updated. Memory consumption is increased, because an
+        extra buffer of memory is required for storing the effect output.
+
+        It is recommended to disable the cache when the source or the effect
+        properties are animated.
+
+        By default, the property is set to \c false.
+    */
+    property bool cached: false
+
+    /*!
+        \qmlproperty real RadialGradient::horizontalOffset
+        \qmlproperty real RadialGradient::verticalOffset
+
+        The horizontalOffset and verticalOffset properties define the offset in
+        pixels for the center point of the gradient compared to the item center.
+
+        The values range from -inf to inf. By default, these properties are set
+        to \c 0.
+
+        \table
+        \header
+        \li Output examples with different horizontalOffset values
+        \li
+        \li
+        \row
+            \li \image RadialGradient_horizontalOffset1.png
+            \li \image RadialGradient_horizontalOffset2.png
+            \li \image RadialGradient_horizontalOffset3.png
+        \row
+            \li \b { horizontalOffset: -150 }
+            \li \b { horizontalOffset: 0 }
+            \li \b { horizontalOffset: 150 }
+        \row
+            \li \l verticalOffset: 0
+            \li \l verticalOffset: 0
+            \li \l verticalOffset: 0
+        \row
+            \li \l horizontalRadius: 300
+            \li \l horizontalRadius: 300
+            \li \l horizontalRadius: 300
+        \row
+            \li \l verticalRadius: 300
+            \li \l verticalRadius: 300
+            \li \l verticalRadius: 300
+        \row
+            \li \l angle: 0
+            \li \l angle: 0
+            \li \l angle: 0
+        \endtable
+
+    */
+    property real horizontalOffset: 0.0
+    property real verticalOffset: 0.0
+
+    /*!
+        \qmlproperty real RadialGradient::horizontalRadius
+        \qmlproperty real RadialGradient::verticalRadius
+
+        The horizontalRadius and verticalRadius properties define the shape and
+        size of the radial gradient. If the radiuses are equal, the shape of the
+        gradient is a circle. If the horizontal and vertical radiuses differ,
+        the shape is elliptical. The radiuses are given in pixels.
+
+        The value ranges from -inf to inf. By default, horizontalRadius is bound
+        to width and verticalRadius is bound to height.
+
+        \table
+        \header
+        \li Output examples with different horizontalRadius values
+        \li
+        \li
+        \row
+            \li \image RadialGradient_horizontalRadius1.png
+            \li \image RadialGradient_horizontalRadius2.png
+        \row
+            \li \b { horizontalRadius: 300 }
+            \li \b { horizontalRadius: 100 }
+        \row
+            \li \l horizontalOffset: 0
+            \li \l horizontalOffset: 0
+        \row
+            \li \l verticalOffset: 0
+            \li \l verticalOffset: 0
+        \row
+            \li \l verticalRadius: 300
+            \li \l verticalRadius: 300
+        \row
+            \li \l angle: 0
+            \li \l angle: 0
+        \row
+            \li \l gradient: QQuickGradient(0xa05fb10)
+            \li \l gradient: QQuickGradient(0xa05fb10)
+        \endtable
+
+    */
+    property real horizontalRadius: width
+    property real verticalRadius: height
+
+    /*!
+        This property defines the rotation of the gradient around its center
+        point. The rotation is only visible when the
+        \l{RadialGradient::horizontalRadius}{horizontalRadius} and
+        \l{RadialGradient::verticalRadius}{verticalRadius} properties are not
+        equal. The angle is given in degrees and the default value is \c 0.
+
+        \table
+        \header
+        \li Output examples with different angle values
+        \li
+        \li
+        \row
+            \li \image RadialGradient_angle1.png
+            \li \image RadialGradient_angle2.png
+            \li \image RadialGradient_angle3.png
+        \row
+            \li \b { angle: 0 }
+            \li \b { angle: 45 }
+            \li \b { angle: 90 }
+        \row
+            \li \l horizontalOffset: 0
+            \li \l horizontalOffset: 0
+            \li \l horizontalOffset: 0
+        \row
+            \li \l verticalOffset: 0
+            \li \l verticalOffset: 0
+            \li \l verticalOffset: 0
+        \row
+            \li \l horizontalRadius: 100
+            \li \l horizontalRadius: 100
+            \li \l horizontalRadius: 100
+        \row
+            \li \l verticalRadius: 300
+            \li \l verticalRadius: 300
+            \li \l verticalRadius: 300
+        \endtable
+    */
+    property real angle: 0.0
+
+    /*!
+        This property defines the item that is going to be filled with gradient.
+        Source item gets rendered into an intermediate pixel buffer and the
+        alpha values from the result are used to determine the gradient's pixels
+        visibility in the display. The default value for source is undefined and
+        in that case whole effect area is filled with gradient.
+
+        \table
+        \header
+        \li Output examples with different source values
+        \li
+        \li
+        \row
+            \li \image RadialGradient_maskSource1.png
+            \li \image RadialGradient_maskSource2.png
+        \row
+            \li \b { source: undefined }
+            \li \b { source: Image { source: images/butterfly.png } }
+        \row
+            \li \l horizontalOffset: 0
+            \li \l horizontalOffset: 0
+        \row
+            \li \l verticalOffset: 0
+            \li \l verticalOffset: 0
+        \row
+            \li \l horizontalRadius: 300
+            \li \l horizontalRadius: 300
+        \row
+            \li \l verticalRadius: 300
+            \li \l verticalRadius: 300
+        \row
+            \li \l angle: 0
+            \li \l angle: 0
+        \endtable
+
+        \note It is not supported to let the effect include itself, for
+        instance by setting source to the effect's parent.
+    */
+    property variant source
+
+    /*!
+        A gradient is defined by two or more colors, which are blended
+        seamlessly. The colors are specified as a set of GradientStop child
+        items, each of which defines a position on the gradient from 0.0 to 1.0
+        and a color. The position of each GradientStop is defined by setting the
+        position property. The color is defined by setting the color property.
+
+        \table
+        \header
+        \li Output examples with different gradient values
+        \li
+        \li
+        \row
+            \li \image RadialGradient_gradient1.png
+            \li \image RadialGradient_gradient2.png
+            \li \image RadialGradient_gradient3.png
+        \row
+            \li \b {gradient:} \code
+    Gradient {
+      GradientStop {
+       position: 0.000
+       color: Qt.rgba(1, 0, 0, 1)
+      }
+      GradientStop {
+       position: 0.167
+       color: Qt.rgba(1, 1, 0, 1)
+      }
+      GradientStop {
+       position: 0.333
+       color: Qt.rgba(0, 1, 0, 1)
+      }
+      GradientStop {
+       position: 0.500
+       color: Qt.rgba(0, 1, 1, 1)
+       }
+      GradientStop {
+       position: 0.667
+       color: Qt.rgba(0, 0, 1, 1)
+      }
+      GradientStop {
+       position: 0.833
+       color: Qt.rgba(1, 0, 1, 1)
+      }
+      GradientStop {
+       position: 1.000
+       color: Qt.rgba(1, 0, 0, 1)
+      }
+    }
+        \endcode
+            \li \b {gradient:} \code
+    Gradient {
+      GradientStop {
+        position: 0.0
+        color: "#F0F0F0"
+      }
+      GradientStop {
+        position: 0.5
+        color: "#000000"
+      }
+      GradientStop {
+        position: 1.0
+        color: "#F0F0F0"
+      }
+    }
+        \endcode
+            \li \b {gradient:}
+    \code
+    Gradient {
+      GradientStop {
+        position: 0.0
+        color: "#00000000"
+      }
+      GradientStop {
+        position: 1.0
+        color: "#FF000000"
+      }
+    }
+    \endcode
+        \row
+            \li \l horizontalOffset: 0
+            \li \l horizontalOffset: 0
+            \li \l horizontalOffset: 0
+        \row
+            \li \l verticalOffset: 0
+            \li \l verticalOffset: 0
+            \li \l verticalOffset: 0
+        \row
+            \li \l horizontalRadius: 300
+            \li \l horizontalRadius: 300
+            \li \l horizontalRadius: 300
+        \row
+            \li \l verticalRadius: 300
+            \li \l verticalRadius: 300
+            \li \l verticalRadius: 300
+        \row
+            \li \l angle: 0
+            \li \l angle: 0
+            \li \l angle: 0
+        \endtable
+    */
+    property Gradient gradient: Gradient {
+        GradientStop { position: 0.0; color: "white" }
+        GradientStop { position: 1.0; color: "black" }
+    }
+
+    SourceProxy {
+        id: maskSourceProxy
+        input: rootItem.source
+    }
+
+    ShaderEffectSource {
+        id: gradientSource
+        sourceItem: Rectangle {
+            width: 16
+            height: 256
+            gradient: rootItem.gradient
+            smooth: true
+        }
+        smooth: true
+        hideSource: true
+        visible: false
+    }
+
+   ShaderEffectSource {
+        id: cacheItem
+        anchors.fill: parent
+        visible: rootItem.cached
+        smooth: true
+        sourceItem: shaderItem
+        live: true
+        hideSource: visible
+    }
+
+    ShaderEffect {
+        id: shaderItem
+        property variant gradientImage: gradientSource
+        property variant maskSource: maskSourceProxy.output
+        property variant center: Qt.point(0.5 + rootItem.horizontalOffset / width, 0.5 + rootItem.verticalOffset / height)
+        property real horizontalRatio: rootItem.horizontalRadius > 0 ? width / (2 * rootItem.horizontalRadius) : width * 16384
+        property real verticalRatio: rootItem.verticalRadius > 0 ? height / (2 * rootItem.verticalRadius) : height * 16384
+        property real angle: -rootItem.angle / 360 * 2 * Math.PI
+        property variant matrixData: Qt.point(Math.sin(angle), Math.cos(angle))
+
+        anchors.fill: parent
+
+        vertexShader: "qrc:/qt-project.org/imports/QtGraphicalEffects/shaders/radialgradient.vert"
+
+        fragmentShader: maskSource == undefined ? noMaskShader : maskShader
+
+        onFragmentShaderChanged: horizontalRatioChanged()
+
+        property string maskShader: "qrc:/qt-project.org/imports/QtGraphicalEffects/shaders/radialgradient_mask.frag"
+        property string noMaskShader: "qrc:/qt-project.org/imports/QtGraphicalEffects/shaders/radialgradient_nomask.frag"
+    }
+}
diff --git a/deployment_test/QtGraphicalEffects/RectangularGlow.qml b/deployment_test/QtGraphicalEffects/RectangularGlow.qml
new file mode 100644
index 0000000000000000000000000000000000000000..62862e306bd400ff89ef4cd648514a9c156baafd
--- /dev/null
+++ b/deployment_test/QtGraphicalEffects/RectangularGlow.qml
@@ -0,0 +1,269 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Graphical Effects module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtGraphicalEffects.private 1.12
+
+/*!
+    \qmltype RectangularGlow
+    \inqmlmodule QtGraphicalEffects
+    \since QtGraphicalEffects 1.0
+    \inherits QtQuick2::Item
+    \ingroup qtgraphicaleffects-glow
+    \brief Generates a blurred and colorized rectangle, which gives
+    the impression that the source is glowing.
+
+    This effect is intended to have good performance. The shape of the glow is
+    limited to a rectangle with a custom corner radius. For situations where
+    custom shapes are required, consider \l {QtGraphicalEffects::Glow} {Glow}
+    effect.
+
+    \table
+    \header
+        \li Effect applied
+    \row
+        \li \image RectangularGlow_applied.png
+    \endtable
+
+    \note This effect is available when running with OpenGL.
+
+    \section1 Example
+
+    The following example shows how to apply the effect.
+    \snippet RectangularGlow-example.qml example
+*/
+Item {
+    id: rootItem
+
+    /*!
+        This property defines how many pixels outside the item area are reached
+        by the glow.
+
+        The value ranges from 0.0 (no glow) to inf (infinite glow). By default,
+        the property is set to \c 0.0.
+
+        \table
+        \header
+        \li Output examples with different glowRadius values
+        \li
+        \li
+        \row
+            \li \image RectangularGlow_glowRadius1.png
+            \li \image RectangularGlow_glowRadius2.png
+            \li \image RectangularGlow_glowRadius3.png
+        \row
+            \li \b { glowRadius: 10 }
+            \li \b { glowRadius: 20 }
+            \li \b { glowRadius: 40 }
+        \row
+            \li \l spread: 0
+            \li \l spread: 0
+            \li \l spread: 0
+        \row
+            \li \l color: #ffffff
+            \li \l color: #ffffff
+            \li \l color: #ffffff
+        \row
+            \li \l cornerRadius: 25
+            \li \l cornerRadius: 25
+            \li \l cornerRadius: 25
+        \endtable
+
+    */
+    property real glowRadius: 0.0
+
+    /*!
+        This property defines how large part of the glow color is strengthened
+        near the source edges.
+
+        The value ranges from 0.0 (no strength increase) to 1.0 (maximum
+        strength increase). By default, the property is set to \c 0.0.
+
+        \table
+        \header
+        \li Output examples with different spread values
+        \li
+        \li
+        \row
+            \li \image RectangularGlow_spread1.png
+            \li \image RectangularGlow_spread2.png
+            \li \image RectangularGlow_spread3.png
+        \row
+            \li \b { spread: 0.0 }
+            \li \b { spread: 0.5 }
+            \li \b { spread: 1.0 }
+        \row
+            \li \l glowRadius: 20
+            \li \l glowRadius: 20
+            \li \l glowRadius: 20
+        \row
+            \li \l color: #ffffff
+            \li \l color: #ffffff
+            \li \l color: #ffffff
+        \row
+            \li \l cornerRadius: 25
+            \li \l cornerRadius: 25
+            \li \l cornerRadius: 25
+        \endtable
+    */
+    property real spread: 0.0
+
+    /*!
+        This property defines the RGBA color value which is used for the glow.
+
+        By default, the property is set to \c "white".
+
+        \table
+        \header
+        \li Output examples with different color values
+        \li
+        \li
+        \row
+            \li \image RectangularGlow_color1.png
+            \li \image RectangularGlow_color2.png
+            \li \image RectangularGlow_color3.png
+        \row
+            \li \b { color: #ffffff }
+            \li \b { color: #55ff55 }
+            \li \b { color: #5555ff }
+        \row
+            \li \l glowRadius: 20
+            \li \l glowRadius: 20
+            \li \l glowRadius: 20
+        \row
+            \li \l spread: 0
+            \li \l spread: 0
+            \li \l spread: 0
+        \row
+            \li \l cornerRadius: 25
+            \li \l cornerRadius: 25
+            \li \l cornerRadius: 25
+        \endtable
+    */
+    property color color: "white"
+
+    /*!
+        This property defines the corner radius that is used to draw a glow with
+        rounded corners.
+
+        The value ranges from 0.0 to half of the effective width or height of
+        the glow, whichever is smaller. This can be calculated with: \c{
+        min(width, height) / 2.0 + glowRadius}
+
+        By default, the property is bound to glowRadius property. The glow
+        behaves as if the rectangle was blurred when adjusting the glowRadius
+        property.
+
+        \table
+        \header
+        \li Output examples with different cornerRadius values
+        \li
+        \li
+        \row
+            \li \image RectangularGlow_cornerRadius1.png
+            \li \image RectangularGlow_cornerRadius2.png
+            \li \image RectangularGlow_cornerRadius3.png
+        \row
+            \li \b { cornerRadius: 0 }
+            \li \b { cornerRadius: 25 }
+            \li \b { cornerRadius: 50 }
+        \row
+            \li \l glowRadius: 20
+            \li \l glowRadius: 20
+            \li \l glowRadius: 20
+        \row
+            \li \l spread: 0
+            \li \l spread: 0
+            \li \l spread: 0
+        \row
+            \li \l color: #ffffff
+            \li \l color: #ffffff
+            \li \l color: #ffffff
+        \endtable
+    */
+    property real cornerRadius: glowRadius
+
+    /*!
+        This property allows the effect output pixels to be cached in order to
+        improve the rendering performance.
+
+        Every time the source or effect properties are changed, the pixels in
+        the cache must be updated. Memory consumption is increased, because an
+        extra buffer of memory is required for storing the effect output.
+
+        It is recommended to disable the cache when the source or the effect
+        properties are animated.
+
+        By default, the property is set to \c false.
+    */
+    property bool cached: false
+
+    ShaderEffectSource {
+         id: cacheItem
+         anchors.fill: shaderItem
+         visible: rootItem.cached
+         smooth: true
+         sourceItem: shaderItem
+         live: true
+         hideSource: visible
+     }
+
+    ShaderEffect {
+        id: shaderItem
+
+        x: (parent.width - width) / 2.0
+        y: (parent.height - height) / 2.0
+        width: parent.width + rootItem.glowRadius * 2 + cornerRadius * 2
+        height: parent.height + rootItem.glowRadius * 2 + cornerRadius * 2
+
+        function clampedCornerRadius() {
+            var maxCornerRadius = Math.min(rootItem.width, rootItem.height) / 2 + glowRadius;
+            return Math.max(0, Math.min(rootItem.cornerRadius, maxCornerRadius))
+        }
+
+        property color color: rootItem.color
+        property real inverseSpread: 1.0 - rootItem.spread
+        property real relativeSizeX: ((inverseSpread * inverseSpread) * rootItem.glowRadius + cornerRadius * 2.0) / width
+        property real relativeSizeY: relativeSizeX * (width / height)
+        property real spread: rootItem.spread / 2.0
+        property real cornerRadius: clampedCornerRadius()
+
+        fragmentShader: "qrc:/qt-project.org/imports/QtGraphicalEffects/shaders/rectangularglow.frag"
+    }
+}
diff --git a/deployment_test/QtGraphicalEffects/RecursiveBlur.qml b/deployment_test/QtGraphicalEffects/RecursiveBlur.qml
new file mode 100644
index 0000000000000000000000000000000000000000..7d9380230d17c61628b13ad5a36c061160c54828
--- /dev/null
+++ b/deployment_test/QtGraphicalEffects/RecursiveBlur.qml
@@ -0,0 +1,329 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Graphical Effects module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtGraphicalEffects.private 1.12
+
+/*!
+    \qmltype RecursiveBlur
+    \inqmlmodule QtGraphicalEffects
+    \since QtGraphicalEffects 1.0
+    \inherits QtQuick2::Item
+    \ingroup qtgraphicaleffects-blur
+    \brief Blurs repeatedly, providing a strong blur effect.
+
+    The RecursiveBlur effect softens the image by blurring it with an algorithm
+    that uses a recursive feedback loop to blur the source multiple times. The
+    effect may give more blurry results than
+    \l{QtGraphicalEffects::GaussianBlur}{GaussianBlur} or
+    \l{QtGraphicalEffects::FastBlur}{FastBlur}, but the result is produced
+    asynchronously and takes more time.
+
+    \table
+    \header
+        \li Source
+        \li Effect applied
+    \row
+        \li \image Original_bug.png
+        \li \image RecursiveBlur_bug.png
+    \endtable
+
+    \note This effect is available when running with OpenGL.
+
+    \section1 Example
+
+    The following example shows how to apply the effect.
+    \snippet RecursiveBlur-example.qml example
+
+*/
+Item {
+    id: rootItem
+
+    /*!
+        This property defines the source item that is going to be blurred.
+
+        \note It is not supported to let the effect include itself, for
+        instance by setting source to the effect's parent.
+    */
+    property variant source
+
+    /*!
+        This property defines the distance of neighboring pixels which influence
+        the blurring of individual pixels. A larger radius provides better
+        quality, but is slower to render.
+
+        \b Note: The radius value in this effect is not intended to be changed
+        or animated frequently. The correct way to use it is to set the correct
+        value and keep it unchanged for the whole duration of the iterative blur
+        sequence.
+
+        The value ranges from (no blur) to 16.0 (maximum blur step). By default,
+        the property is set to \c 0.0 (no blur).
+
+        \table
+        \header
+        \li Output examples with different radius values
+        \li
+        \li
+        \row
+            \li \image RecursiveBlur_radius1.png
+            \li \image RecursiveBlur_radius2.png
+            \li \image RecursiveBlur_radius3.png
+        \row
+            \li \b { radius: 2.5 }
+            \li \b { radius: 4.5 }
+            \li \b { radius: 7.5 }
+        \row
+            \li \l loops: 20
+            \li \l loops: 20
+            \li \l loops: 20
+        \endtable
+
+    */
+    property real radius: 0.0
+
+    /*!
+        This property allows the effect output pixels to be cached in order to
+        improve the rendering performance.
+
+        Every time the source or effect properties are changed, the pixels in
+        the cache must be updated. Memory consumption is increased, because an
+        extra buffer of memory is required for storing the effect output.
+
+        It is recommended to disable the cache when the source or the effect
+        properties are animated.
+
+        By default, the property is set to \c false.
+
+    */
+    property bool cached: false
+
+    /*!
+        This property defines the blur behavior near the edges of the item,
+        where the pixel blurring is affected by the pixels outside the source
+        edges.
+
+        If the property is set to \c true, the pixels outside the source are
+        interpreted to be transparent, which is similar to OpenGL
+        clamp-to-border extension. The blur is expanded slightly outside the
+        effect item area.
+
+        If the property is set to \c false, the pixels outside the source are
+        interpreted to contain the same color as the pixels at the edge of the
+        item, which is similar to OpenGL clamp-to-edge behavior. The blur does
+        not expand outside the effect item area.
+
+        By default, the property is set to \c false.
+
+        \table
+        \header
+        \li Output examples with different transparentBorder values
+        \li
+        \li
+        \row
+            \li \image RecursiveBlur_transparentBorder1.png
+            \li \image RecursiveBlur_transparentBorder2.png
+        \row
+            \li \b { transparentBorder: false }
+            \li \b { transparentBorder: true }
+        \row
+            \li \l loops: 20
+            \li \l loops: 20
+        \row
+            \li \l radius: 7.5
+            \li \l radius: 7.5
+        \endtable
+    */
+    property bool transparentBorder: false
+
+    /*!
+        This property defines the amount of blur iterations that are going to be
+        performed for the source. When the property changes, the iterative
+        blurring process starts. If the value is decreased or if the value
+        changes from zero to non-zero, a snapshot is taken from the source. The
+        snapshot is used as a starting point for the process.
+
+        The iteration loop tries to run as fast as possible. The speed might be
+        limited by the VSYNC or the time needed for one blur step, or both.
+        Sometimes it may be desirable to perform the blurring with a slower
+        pace. In that case, it may be convenient to control the property with
+        Animation which increases the value.
+
+        The value ranges from 0 to inf. By default, the property is set to \c 0.
+
+        \table
+        \header
+        \li Output examples with different loops values
+        \li
+        \li
+        \row
+            \li \image RecursiveBlur_loops1.png
+            \li \image RecursiveBlur_loops2.png
+            \li \image RecursiveBlur_loops3.png
+        \row
+            \li \b { loops: 4 }
+            \li \b { loops: 20 }
+            \li \b { loops: 70 }
+        \row
+            \li \l radius: 7.5
+            \li \l radius: 7.5
+            \li \l radius: 7.5
+        \endtable
+
+    */
+    property int loops: 0
+
+    /*!
+        This property holds the progress of asynchronous source blurring
+        process, from 0.0 (nothing blurred) to 1.0 (finished).
+    */
+    property real progress: loops > 0.0 ? Math.min(1.0, recursionTimer.counter / loops) : 0.0
+
+    onLoopsChanged: recursiveSource.scheduleUpdate()
+    onSourceChanged: recursionTimer.reset()
+    onRadiusChanged: recursionTimer.reset()
+    onTransparentBorderChanged: recursionTimer.reset()
+
+    SourceProxy {
+        id: sourceProxy
+        input: rootItem.source
+        sourceRect: rootItem.transparentBorder ? Qt.rect(-1, -1, parent.width + 2, parent.height + 2) : Qt.rect(0, 0, 0, 0)
+    }
+
+    ShaderEffectSource {
+        id: cacheItem
+        anchors.fill: verticalBlur
+        smooth: true
+        visible: rootItem.cached
+        hideSource: visible
+        live: true
+        sourceItem: inputItem.visible ? inputItem : verticalBlur
+    }
+
+    Item {
+        id: recursionTimer
+        property int counter: 0
+
+        function reset() {
+            counter = 0
+            recursiveSource.scheduleUpdate()
+        }
+
+        function nextFrame() {
+            if (loops < counter)
+                recursionTimer.counter = 0
+
+            if (counter > 0)
+                recursiveSource.sourceItem = verticalBlur
+            else
+                recursiveSource.sourceItem = inputItem
+
+            if (counter < loops) {
+                recursiveSource.scheduleUpdate()
+                counter++
+            }
+        }
+    }
+
+    ShaderEffect {
+        id: inputItem
+        property variant source: sourceProxy.output
+        property real expandX: rootItem.transparentBorder ? (horizontalBlur.maximumRadius) / horizontalBlur.width : 0.0
+        property real expandY: rootItem.transparentBorder ? (horizontalBlur.maximumRadius) / horizontalBlur.height : 0.0
+
+        anchors.fill: verticalBlur
+        visible: !verticalBlur.visible
+
+        vertexShader: "qrc:/qt-project.org/imports/QtGraphicalEffects/shaders/recursiveblur.vert"
+
+        fragmentShader: "qrc:/qt-project.org/imports/QtGraphicalEffects/shaders/recursiveblur.frag"
+    }
+
+    ShaderEffectSource {
+        id: recursiveSource
+        visible: false
+        smooth: true
+        hideSource: false
+        live: false
+        sourceItem: inputItem
+        recursive: true
+        onSourceItemChanged: scheduleUpdate()
+        onScheduledUpdateCompleted: recursionTimer.nextFrame()
+    }
+
+    GaussianDirectionalBlur {
+        id: verticalBlur
+        x: rootItem.transparentBorder ? -horizontalBlur.maximumRadius - 1 : 0
+        y: rootItem.transparentBorder ? -horizontalBlur.maximumRadius - 1 : 0
+        width: horizontalBlur.width + 2
+        height: horizontalBlur.height + 2
+
+        horizontalStep: 0.0
+        verticalStep: 1.0 / parent.height
+
+        source: ShaderEffectSource {
+            sourceItem: horizontalBlur
+            hideSource: true
+            visible: false
+            smooth: true
+        }
+
+        deviation: (radius + 1) / 2.3333
+        radius: rootItem.radius
+        maximumRadius: Math.ceil(rootItem.radius)
+        transparentBorder: false
+        visible: loops > 0
+    }
+
+    GaussianDirectionalBlur {
+        id: horizontalBlur
+        width: rootItem.transparentBorder ? parent.width + 2 * maximumRadius + 2 : parent.width
+        height: rootItem.transparentBorder ? parent.height + 2 * maximumRadius + 2 : parent.height
+
+        horizontalStep: 1.0 / parent.width
+        verticalStep: 0.0
+
+        source: recursiveSource
+        deviation: (radius + 1) / 2.3333
+        radius: rootItem.radius
+        maximumRadius: Math.ceil(rootItem.radius)
+        transparentBorder: false
+        visible: false
+    }
+}
diff --git a/deployment_test/QtGraphicalEffects/ThresholdMask.qml b/deployment_test/QtGraphicalEffects/ThresholdMask.qml
new file mode 100644
index 0000000000000000000000000000000000000000..204d8c937ee2ad7dc8a15fda51eeb228eea8acfd
--- /dev/null
+++ b/deployment_test/QtGraphicalEffects/ThresholdMask.qml
@@ -0,0 +1,215 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Graphical Effects module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtGraphicalEffects.private 1.12
+
+/*!
+    \qmltype ThresholdMask
+    \inqmlmodule QtGraphicalEffects
+    \since QtGraphicalEffects 1.0
+    \inherits QtQuick2::Item
+    \ingroup qtgraphicaleffects-mask
+    \brief Masks the source item with another item and applies a threshold
+    value.
+
+    The masking behavior can be controlled with the \l threshold value for the
+    mask pixels.
+
+    \table
+    \header
+        \li Source
+        \li MaskSource
+        \li Effect applied
+    \row
+        \li \image Original_bug.png
+        \li \image ThresholdMask_mask.png
+        \li \image ThresholdMask_bug.png
+    \endtable
+
+    \note This effect is available when running with OpenGL.
+
+    \section1 Example
+
+    The following example shows how to apply the effect.
+    \snippet ThresholdMask-example.qml example
+*/
+Item {
+    id: rootItem
+
+    /*!
+        This property defines the source item that is going to be masked.
+
+        \note It is not supported to let the effect include itself, for
+        instance by setting source to the effect's parent.
+    */
+    property variant source
+
+    /*!
+        This property defines the item that is going to be used as the mask.
+        Mask item gets rendered into an intermediate pixel buffer and the alpha
+        values from the result are used to determine the source item's pixels
+        visibility in the display.
+
+        \table
+        \header
+            \li Original
+            \li Mask
+            \li Effect applied
+        \row
+            \li \image Original_bug.png
+            \li \image ThresholdMask_mask.png
+            \li \image ThresholdMask_bug.png
+        \endtable
+
+        \note It is not supported to let the effect include itself, for
+        instance by setting maskSource to the effect's parent.
+    */
+    property variant maskSource
+
+    /*!
+        This property defines a threshold value for the mask pixels. The mask
+        pixels that have an alpha value below this property are used to
+        completely mask away the corresponding pixels from the source item. The
+        mask pixels that have a higher alpha value are used to alphablend the
+        source item to the display.
+
+        The value ranges from 0.0 (alpha value 0) to 1.0 (alpha value 255). By
+        default, the property is set to \c 0.0.
+
+        \table
+        \header
+        \li Output examples with different threshold values
+        \li
+        \li
+        \row
+            \li \image ThresholdMask_threshold1.png
+            \li \image ThresholdMask_threshold2.png
+            \li \image ThresholdMask_threshold3.png
+        \row
+            \li \b { threshold: 0.0 }
+            \li \b { threshold: 0.5 }
+            \li \b { threshold: 0.7 }
+        \row
+            \li \l spread: 0.2
+            \li \l spread: 0.2
+            \li \l spread: 0.2
+        \endtable
+    */
+    property real threshold: 0.0
+
+    /*!
+        This property defines the smoothness of the mask edges near the
+        \l{ThresholdMask::threshold}{threshold} alpha value. Setting spread to
+        0.0 uses mask normally with the specified threshold. Setting higher
+        spread values softens the transition from the transparent mask pixels
+        towards opaque mask pixels by adding interpolated values between them.
+
+        The value ranges from 0.0 (sharp mask edge) to 1.0 (smooth mask edge).
+        By default, the property is set to \c 0.0.
+
+        \table
+        \header
+        \li Output examples with different spread values
+        \li
+        \li
+        \row
+            \li \image ThresholdMask_spread1.png
+            \li \image ThresholdMask_spread2.png
+            \li \image ThresholdMask_spread3.png
+        \row
+            \li \b { spread: 0.0 }
+            \li \b { spread: 0.2 }
+            \li \b { spread: 0.8 }
+        \row
+            \li \l threshold: 0.4
+            \li \l threshold: 0.4
+            \li \l threshold: 0.4
+        \endtable
+
+    */
+    property real spread: 0.0
+
+    /*!
+        This property allows the effect output pixels to be cached in order to
+        improve the rendering performance.
+
+        Every time the source or effect properties are changed, the pixels in
+        the cache must be updated. Memory consumption is increased, because an
+        extra buffer of memory is required for storing the effect output.
+
+        It is recommended to disable the cache when the source or the effect
+        properties are animated.
+
+        By default, the property is set to \c false.
+    */
+    property bool cached: false
+
+    SourceProxy {
+        id: sourceProxy
+        input: rootItem.source
+    }
+
+    SourceProxy {
+        id: maskSourceProxy
+        input: rootItem.maskSource
+    }
+
+    ShaderEffectSource {
+         id: cacheItem
+         anchors.fill: parent
+         visible: rootItem.cached
+         smooth: true
+         sourceItem: shaderItem
+         live: true
+         hideSource: visible
+     }
+
+    ShaderEffect {
+        id: shaderItem
+        property variant source: sourceProxy.output
+        property variant maskSource: maskSourceProxy.output
+        property real threshold: rootItem.threshold
+        property real spread: rootItem.spread
+
+        anchors.fill: parent
+
+        fragmentShader: "qrc:/qt-project.org/imports/QtGraphicalEffects/shaders/thresholdmask.frag"
+    }
+}
diff --git a/deployment_test/QtGraphicalEffects/ZoomBlur.qml b/deployment_test/QtGraphicalEffects/ZoomBlur.qml
new file mode 100644
index 0000000000000000000000000000000000000000..66ba71024823db883545ede8dafa01abd5facfb2
--- /dev/null
+++ b/deployment_test/QtGraphicalEffects/ZoomBlur.qml
@@ -0,0 +1,306 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Graphical Effects module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtGraphicalEffects.private 1.12
+
+/*!
+    \qmltype ZoomBlur
+    \inqmlmodule QtGraphicalEffects
+    \since QtGraphicalEffects 1.0
+    \inherits QtQuick2::Item
+    \ingroup qtgraphicaleffects-motion-blur
+    \brief Applies directional blur effect towards source items center point.
+
+    Effect creates perceived impression that the source item appears to be
+    moving towards the center point in Z-direction or that the camera appears
+    to be zooming rapidly. Other available motion blur effects are
+    \l{QtGraphicalEffects::DirectionalBlur}{DirectionalBlur}
+    and \l{QtGraphicalEffects::RadialBlur}{RadialBlur}.
+
+    \table
+    \header
+        \li Source
+        \li Effect applied
+    \row
+        \li \image Original_bug.png
+        \li \image ZoomBlur_bug.png
+    \endtable
+
+    \note This effect is available when running with OpenGL.
+
+    \section1 Example
+
+    The following example shows how to apply the effect.
+    \snippet ZoomBlur-example.qml example
+
+*/
+Item {
+    id: rootItem
+
+    /*!
+        This property defines the source item that is going to be blurred.
+
+        \note It is not supported to let the effect include itself, for
+        instance by setting source to the effect's parent.
+    */
+    property variant source
+
+    /*!
+        This property defines the maximum perceived amount of movement for each
+        pixel. The amount is smaller near the center and reaches the specified
+        value at the edges.
+
+        The quality of the blur depends on \l{ZoomBlur::samples}{samples}
+        property. If length value is large, more samples are needed to keep the
+        visual quality at high level.
+
+        The value ranges from 0.0 to inf. By default the property is set to \c
+        0.0 (no blur).
+
+        \table
+        \header
+        \li Output examples with different length values
+        \li
+        \li
+        \row
+            \li \image ZoomBlur_length1.png
+            \li \image ZoomBlur_length2.png
+            \li \image ZoomBlur_length3.png
+        \row
+            \li \b { length: 0.0 }
+            \li \b { length: 32.0 }
+            \li \b { length: 48.0 }
+        \row
+            \li \l samples: 24
+            \li \l samples: 24
+            \li \l samples: 24
+        \row
+            \li \l horizontalOffset: 0
+            \li \l horizontalOffset: 0
+            \li \l horizontalOffset: 0
+        \row
+            \li \l verticalOffset: 0
+            \li \l verticalOffset: 0
+            \li \l verticalOffset: 0
+        \endtable
+
+    */
+    property real length: 0.0
+
+    /*!
+        This property defines how many samples are taken per pixel when blur
+        calculation is done. Larger value produces better quality, but is slower
+        to render.
+
+        This property is not intended to be animated. Changing this property may
+        cause the underlying OpenGL shaders to be recompiled.
+
+        Allowed values are between 0 and inf (practical maximum depends on GPU).
+        By default the property is set to \c 0 (no samples).
+
+    */
+    property int samples: 0
+
+    /*!
+        \qmlproperty real QtGraphicalEffects::ZoomBlur::horizontalOffset
+        \qmlproperty real QtGraphicalEffects::ZoomBlur::verticalOffset
+
+        These properties define an offset in pixels for the blur direction
+        center point.
+
+        The values range from -inf to inf. By default these properties are set
+        to \c 0.
+
+        \table
+        \header
+        \li Output examples with different horizontalOffset values
+        \li
+        \li
+        \row
+            \li \image ZoomBlur_horizontalOffset1.png
+            \li \image ZoomBlur_horizontalOffset2.png
+            \li \image ZoomBlur_horizontalOffset3.png
+        \row
+            \li \b { horizontalOffset: 100.0 }
+            \li \b { horizontalOffset: 0.0 }
+            \li \b { horizontalOffset: -100.0 }
+        \row
+            \li \l samples: 24
+            \li \l samples: 24
+            \li \l samples: 24
+        \row
+            \li \l length: 32
+            \li \l length: 32
+            \li \l length: 32
+        \row
+            \li \l verticalOffset: 0
+            \li \l verticalOffset: 0
+            \li \l verticalOffset: 0
+        \endtable
+    */
+    property real horizontalOffset: 0.0
+    property real verticalOffset: 0.0
+
+    /*!
+        This property defines the blur behavior near the edges of the item,
+        where the pixel blurring is affected by the pixels outside the source
+        edges.
+
+        If the property is set to \c true, the pixels outside the source are
+        interpreted to be transparent, which is similar to OpenGL
+        clamp-to-border extension. The blur is expanded slightly outside the
+        effect item area.
+
+        If the property is set to \c false, the pixels outside the source are
+        interpreted to contain the same color as the pixels at the edge of the
+        item, which is similar to OpenGL clamp-to-edge behavior. The blur does
+        not expand outside the effect item area.
+
+        By default, the property is set to \c false.
+
+    */
+    property bool transparentBorder: false
+
+    /*!
+        This property allows the effect output pixels to be cached in order to
+        improve the rendering performance.
+
+        Every time the source or effect properties are changed, the pixels in
+        the cache must be updated. Memory consumption is increased, because an
+        extra buffer of memory is required for storing the effect output.
+
+        It is recommended to disable the cache when the source or the effect
+        properties are animated.
+
+        By default, the property is set to \c false.
+    */
+    property bool cached: false
+
+    SourceProxy {
+        id: sourceProxy
+        input: rootItem.source
+        sourceRect: rootItem.transparentBorder ? Qt.rect(-1, -1, parent.width + 2.0, parent.height + 2.0) : Qt.rect(0, 0, 0, 0)
+    }
+
+    ShaderEffectSource {
+        id: cacheItem
+        anchors.fill: shaderItem
+        visible: rootItem.cached
+        smooth: true
+        sourceItem: shaderItem
+        live: true
+        hideSource: visible
+    }
+
+    ShaderEffect {
+        id: shaderItem
+        property variant source: sourceProxy.output
+        property variant center: Qt.point(0.5 + rootItem.horizontalOffset / width, 0.5 + rootItem.verticalOffset / height)
+        property real len: rootItem.length
+        property bool transparentBorder: rootItem.transparentBorder
+        property real samples: rootItem.samples
+        property real weight: 1.0 / Math.max(1.0, rootItem.samples)
+        property variant expandPixels: transparentBorder ? Qt.size(rootItem.samples, rootItem.samples) : Qt.size(0,0)
+        property variant expand: transparentBorder ? Qt.size(expandPixels.width / width, expandPixels.height / height) : Qt.size(0,0)
+        property variant delta: Qt.size(1.0 / rootItem.width, 1.0 / rootItem.height)
+
+        x: transparentBorder ? -expandPixels.width - 1 : 0
+        y: transparentBorder ? -expandPixels.height - 1 : 0
+        width: transparentBorder ? parent.width + 2.0 * expandPixels.width + 2 : parent.width
+        height: transparentBorder ? parent.height + 2.0 * expandPixels.height + 2 : parent.height
+
+        property string fragmentShaderSkeleton: "
+            varying highp vec2 qt_TexCoord0;
+            uniform highp float qt_Opacity;
+            uniform lowp sampler2D source;
+            uniform highp float len;
+            uniform highp float weight;
+            uniform highp float samples;
+            uniform highp vec2 center;
+            uniform highp vec2 expand;
+            uniform highp vec2 delta;
+
+            void main(void) {
+                mediump vec2 texCoord = qt_TexCoord0;
+                mediump vec2 centerCoord = center;
+
+                PLACEHOLDER_EXPAND_STEPS
+
+                highp vec2 dir = vec2(centerCoord.x - texCoord.s, centerCoord.y - texCoord.t);
+                dir /= max(1.0, length(dir) * 2.0);
+                highp vec2 shift = delta * len * dir * 2.0 / max(1.0, samples - 1.0);
+                gl_FragColor = vec4(0.0);
+
+                PLACEHOLDER_UNROLLED_LOOP
+
+                gl_FragColor *= weight * qt_Opacity;
+            }
+        "
+
+        function buildFragmentShader() {
+            var shader = ""
+            if (GraphicsInfo.profile == GraphicsInfo.OpenGLCoreProfile)
+                shader += "#version 150 core\n#define varying in\n#define gl_FragColor fragColor\n#define texture2D texture\nout vec4 fragColor;\n"
+            shader += fragmentShaderSkeleton
+            var expandSteps = ""
+
+            if (transparentBorder) {
+                expandSteps += "centerCoord = (centerCoord - expand) / (1.0 - 2.0 * expand);"
+                expandSteps += "texCoord = (texCoord - expand) / (1.0 - 2.0 * expand);"
+             }
+
+             var unrolledLoop = "gl_FragColor += texture2D(source, texCoord);\n"
+
+             if (rootItem.samples > 1) {
+                 unrolledLoop = ""
+                 for (var i = 0; i < rootItem.samples; i++)
+                      unrolledLoop += "gl_FragColor += texture2D(source, texCoord); texCoord += shift;\n"
+             }
+
+             shader = shader.replace("PLACEHOLDER_EXPAND_STEPS", expandSteps)
+             fragmentShader = shader.replace("PLACEHOLDER_UNROLLED_LOOP", unrolledLoop)
+        }
+
+        onFragmentShaderChanged: sourceChanged()
+        onSamplesChanged: buildFragmentShader()
+        onTransparentBorderChanged: buildFragmentShader()
+        Component.onCompleted: buildFragmentShader()
+    }
+}
diff --git a/deployment_test/QtGraphicalEffects/plugins.qmltypes b/deployment_test/QtGraphicalEffects/plugins.qmltypes
new file mode 100644
index 0000000000000000000000000000000000000000..f80584353a90305a1fa6d957185ebe460aab15e2
--- /dev/null
+++ b/deployment_test/QtGraphicalEffects/plugins.qmltypes
@@ -0,0 +1,11 @@
+import QtQuick.tooling 1.2
+
+// This file describes the plugin-supplied types contained in the library.
+// It is used for QML tooling purposes only.
+//
+// This file was auto-generated by:
+// 'qmlplugindump -nonrelocatable QtGraphicalEffects 1.15'
+
+Module {
+    dependencies: ["QtQuick 2.12", "QtQuick.Window 2.12"]
+}
diff --git a/deployment_test/QtGraphicalEffects/private/DropShadowBase.qml b/deployment_test/QtGraphicalEffects/private/DropShadowBase.qml
new file mode 100644
index 0000000000000000000000000000000000000000..e9927ea4d7f6465603af459df4f7c18b49cd1078
--- /dev/null
+++ b/deployment_test/QtGraphicalEffects/private/DropShadowBase.qml
@@ -0,0 +1,99 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Jolla Ltd, author: <gunnar.sletta@jollamobile.com>
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Graphical Effects module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Window 2.12
+import QtGraphicalEffects.private 1.12
+import QtGraphicalEffects 1.12
+
+Item {
+    id: root
+
+    property variant source
+    property real radius: Math.floor(samples / 2)
+    property int samples: 9
+    property color color: "black"
+    property real horizontalOffset: 0
+    property real verticalOffset: 0
+    property real spread: 0.0
+    property bool cached: false
+    property bool transparentBorder: true
+
+    GaussianBlur {
+        id: blur
+        width: parent.width
+        height: parent.height
+        x: Math.round(horizontalOffset)
+        y: Math.round(verticalOffset)
+        source: root.source
+        radius: root.radius * Screen.devicePixelRatio
+        samples: root.samples * Screen.devicePixelRatio
+        _thickness: root.spread
+        transparentBorder: root.transparentBorder
+
+
+        _color: root.color;
+        _alphaOnly: true
+        // ignoreDevicePixelRatio: root.ignoreDevicePixelRatio
+
+        ShaderEffect {
+            x: blur._outputRect.x - parent.x
+            y: blur._outputRect.y - parent.y
+            width: transparentBorder ? blur._outputRect.width : blur.width
+            height: transparentBorder ? blur._outputRect.height : blur.height
+            property variant source: blur._output;
+        }
+
+    }
+
+    ShaderEffectSource {
+        id: cacheItem
+        x: -blur._kernelRadius + horizontalOffset
+        y: -blur._kernelRadius + verticalOffset
+        width: blur.width + 2 * blur._kernelRadius
+        height: blur.height + 2 * blur._kernelRadius
+        visible: root.cached
+        smooth: true
+        sourceRect: Qt.rect(-blur._kernelRadius, -blur._kernelRadius, width, height);
+        sourceItem: blur
+        hideSource: visible
+    }
+
+
+}
diff --git a/deployment_test/QtGraphicalEffects/private/DropShadowBase.qmlc b/deployment_test/QtGraphicalEffects/private/DropShadowBase.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..6d90ee60607d80333236e4d392fc0a1ee5ab3126
Binary files /dev/null and b/deployment_test/QtGraphicalEffects/private/DropShadowBase.qmlc differ
diff --git a/deployment_test/QtGraphicalEffects/private/FastGlow.qml b/deployment_test/QtGraphicalEffects/private/FastGlow.qml
new file mode 100644
index 0000000000000000000000000000000000000000..5c737f1f5f4aef0045316bf9fed00416f0fc3237
--- /dev/null
+++ b/deployment_test/QtGraphicalEffects/private/FastGlow.qml
@@ -0,0 +1,331 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Graphical Effects module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtGraphicalEffects.private 1.12
+
+Item {
+    id: rootItem
+    property variant source
+    property real spread: 0.0
+    property real blur: 0.0
+    property color color: "white"
+    property bool transparentBorder: false
+    property bool cached: false
+
+    SourceProxy {
+        id: sourceProxy
+        input: rootItem.source
+    }
+
+    ShaderEffectSource {
+        id: cacheItem
+        anchors.fill: shaderItem
+        visible: rootItem.cached
+        smooth: true
+        sourceItem: shaderItem
+        live: true
+        hideSource: visible
+    }
+
+    property string __internalBlurVertexShader: "qrc:/qt-project.org/imports/QtGraphicalEffects/shaders/fastblur_internal.vert"
+
+    property string __internalBlurFragmentShader: "qrc:/qt-project.org/imports/QtGraphicalEffects/shaders/fastblur_internal.frag"
+
+    ShaderEffect {
+        id: level0
+        property variant source: sourceProxy.output
+        anchors.fill: parent
+        visible: false
+        smooth: true
+    }
+
+    ShaderEffectSource {
+        id: level1
+        width: Math.ceil(shaderItem.width / 32) * 32
+        height: Math.ceil(shaderItem.height / 32) * 32
+        sourceItem: level0
+        hideSource: rootItem.visible
+        sourceRect: transparentBorder ? Qt.rect(-64, -64, shaderItem.width, shaderItem.height) : Qt.rect(0,0,0,0)
+        smooth: true
+        visible: false
+    }
+
+    ShaderEffect {
+        id: effect1
+        property variant source: level1
+        property real yStep: 1/height
+        property real xStep: 1/width
+        anchors.fill: level2
+        visible: false
+        smooth: true
+        vertexShader: __internalBlurVertexShader
+        fragmentShader: __internalBlurFragmentShader
+    }
+
+    ShaderEffectSource {
+        id: level2
+        width: level1.width / 2
+        height: level1.height / 2
+        sourceItem: effect1
+        hideSource: rootItem.visible
+        visible: false
+        smooth: true
+    }
+
+    ShaderEffect {
+        id: effect2
+        property variant source: level2
+        property real yStep: 1/height
+        property real xStep: 1/width
+        anchors.fill: level3
+        visible: false
+        smooth: true
+        vertexShader: __internalBlurVertexShader
+        fragmentShader: __internalBlurFragmentShader
+    }
+
+    ShaderEffectSource {
+        id: level3
+        width: level2.width / 2
+        height: level2.height / 2
+        sourceItem: effect2
+        hideSource: rootItem.visible
+        visible: false
+        smooth: true
+    }
+
+    ShaderEffect {
+        id: effect3
+        property variant source: level3
+        property real yStep: 1/height
+        property real xStep: 1/width
+        anchors.fill: level4
+        visible: false
+        smooth: true
+        vertexShader: __internalBlurVertexShader
+        fragmentShader: __internalBlurFragmentShader
+    }
+
+    ShaderEffectSource {
+        id: level4
+        width: level3.width / 2
+        height: level3.height / 2
+        sourceItem: effect3
+        hideSource: rootItem.visible
+        visible: false
+        smooth: true
+    }
+
+    ShaderEffect {
+        id: effect4
+        property variant source: level4
+        property real yStep: 1/height
+        property real xStep: 1/width
+        anchors.fill: level5
+        visible: false
+        smooth: true
+        vertexShader: __internalBlurVertexShader
+        fragmentShader: __internalBlurFragmentShader
+    }
+
+    ShaderEffectSource {
+        id: level5
+        width: level4.width / 2
+        height: level4.height / 2
+        sourceItem: effect4
+        hideSource: rootItem.visible
+        visible: false
+        smooth: true
+    }
+
+    ShaderEffect {
+        id: effect5
+        property variant source: level5
+        property real yStep: 1/height
+        property real xStep: 1/width
+        anchors.fill: level6
+        visible: false
+        smooth: true
+        vertexShader: __internalBlurVertexShader
+        fragmentShader: __internalBlurFragmentShader
+    }
+
+    ShaderEffectSource {
+        id: level6
+        width: level5.width / 2
+        height: level5.height / 2
+        sourceItem: effect5
+        hideSource: rootItem.visible
+        visible: false
+        smooth: true
+    }
+
+    Item {
+        id: dummysource
+        width: 1
+        height: 1
+        visible: false
+    }
+
+    ShaderEffectSource {
+        id: dummy
+        width: 1
+        height: 1
+        sourceItem: dummysource
+        visible: false
+        smooth: false
+        live: false
+    }
+
+    ShaderEffect {
+        id: shaderItem
+        x: transparentBorder ? -64 : 0
+        y: transparentBorder ? -64 : 0
+        width: transparentBorder ? parent.width + 128 : parent.width
+        height: transparentBorder ? parent.height + 128 : parent.height
+
+        property variant source1: level1
+        property variant source2: level2
+        property variant source3: level3
+        property variant source4: level4
+        property variant source5: level5
+        property variant source6: level6
+        property real lod: rootItem.blur
+
+        property real weight1;
+        property real weight2;
+        property real weight3;
+        property real weight4;
+        property real weight5;
+        property real weight6;
+
+        property real spread: 1.0 - (rootItem.spread * 0.98)
+        property alias color: rootItem.color
+
+        function weight(v) {
+            if (v <= 0.0)
+                return 1
+            if (v >= 0.5)
+                return 0
+
+            return 1.0 - v / 0.5
+        }
+
+        function calculateWeights() {
+
+            var w1 = weight(Math.abs(lod - 0.100))
+            var w2 = weight(Math.abs(lod - 0.300))
+            var w3 = weight(Math.abs(lod - 0.500))
+            var w4 = weight(Math.abs(lod - 0.700))
+            var w5 = weight(Math.abs(lod - 0.900))
+            var w6 = weight(Math.abs(lod - 1.100))
+
+            var sum = w1 + w2 + w3 + w4 + w5 + w6;
+            weight1 = w1 / sum;
+            weight2 = w2 / sum;
+            weight3 = w3 / sum;
+            weight4 = w4 / sum;
+            weight5 = w5 / sum;
+            weight6 = w6 / sum;
+
+            upateSources()
+        }
+
+        function upateSources() {
+            var sources = new Array();
+            var weights = new Array();
+
+            if (weight1 > 0) {
+                sources.push(level1)
+                weights.push(weight1)
+            }
+
+            if (weight2 > 0) {
+                sources.push(level2)
+                weights.push(weight2)
+            }
+
+            if (weight3 > 0) {
+                sources.push(level3)
+                weights.push(weight3)
+            }
+
+            if (weight4 > 0) {
+                sources.push(level4)
+                weights.push(weight4)
+            }
+
+            if (weight5 > 0) {
+                sources.push(level5)
+                weights.push(weight5)
+            }
+
+            if (weight6 > 0) {
+                sources.push(level6)
+                weights.push(weight6)
+            }
+
+            for (var j = sources.length; j < 6; j++) {
+                sources.push(dummy)
+                weights.push(0.0)
+            }
+
+            source1 = sources[0]
+            source2 = sources[1]
+            source3 = sources[2]
+            source4 = sources[3]
+            source5 = sources[4]
+            source6 = sources[5]
+
+            weight1 = weights[0]
+            weight2 = weights[1]
+            weight3 = weights[2]
+            weight4 = weights[3]
+            weight5 = weights[4]
+            weight6 = weights[5]
+        }
+
+        Component.onCompleted: calculateWeights()
+
+        onLodChanged: calculateWeights()
+
+        fragmentShader: "qrc:/qt-project.org/imports/QtGraphicalEffects/shaders/fastglow.frag"
+    }
+}
diff --git a/deployment_test/QtGraphicalEffects/private/FastGlow.qmlc b/deployment_test/QtGraphicalEffects/private/FastGlow.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..e445439a5565576e72b290dbbfbb706b43a38e5c
Binary files /dev/null and b/deployment_test/QtGraphicalEffects/private/FastGlow.qmlc differ
diff --git a/deployment_test/QtGraphicalEffects/private/FastInnerShadow.qml b/deployment_test/QtGraphicalEffects/private/FastInnerShadow.qml
new file mode 100644
index 0000000000000000000000000000000000000000..bd361ca7d248a011bac2f837b41da625c0a63d12
--- /dev/null
+++ b/deployment_test/QtGraphicalEffects/private/FastInnerShadow.qml
@@ -0,0 +1,335 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Graphical Effects module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtGraphicalEffects.private 1.12
+
+Item {
+    id: rootItem
+    property variant source
+    property real blur: 0.0
+    property real horizontalOffset: 0
+    property real verticalOffset: 0
+    property real spread: 0.0
+    property color color: "black"
+    property bool cached: false
+
+    SourceProxy {
+        id: sourceProxy
+        input: rootItem.source
+    }
+
+    ShaderEffectSource {
+        id: cacheItem
+        anchors.fill: shaderItem
+        visible: rootItem.cached
+        smooth: true
+        sourceItem: shaderItem
+        live: true
+        hideSource: visible
+    }
+
+    property string __internalBlurVertexShader: "qrc:/qt-project.org/imports/QtGraphicalEffects/shaders/fastblur_internal.vert"
+
+    property string __internalBlurFragmentShader: "qrc:/qt-project.org/imports/QtGraphicalEffects/shaders/fastblur_internal.frag"
+
+    ShaderEffect {
+        id: level0
+        property variant source: sourceProxy.output
+        property real horizontalOffset: rootItem.horizontalOffset / rootItem.width
+        property real verticalOffset: rootItem.verticalOffset / rootItem.width
+        property color color: rootItem.color
+
+        anchors.fill: parent
+        visible: false
+        smooth: true
+        fragmentShader: "qrc:/qt-project.org/imports/QtGraphicalEffects/shaders/fastinnershadow_level0.frag"
+    }
+
+    ShaderEffectSource {
+        id: level1
+        width: Math.ceil(shaderItem.width / 32) * 32
+        height: Math.ceil(shaderItem.height / 32) * 32
+        sourceItem: level0
+        hideSource: rootItem.visible
+        smooth: true
+        visible: false
+    }
+
+    ShaderEffect {
+        id: effect1
+        property variant source: level1
+        property real yStep: 1/height
+        property real xStep: 1/width
+        anchors.fill: level2
+        visible: false
+        smooth: true
+        vertexShader: __internalBlurVertexShader
+        fragmentShader: __internalBlurFragmentShader
+    }
+
+    ShaderEffectSource {
+        id: level2
+        width: level1.width / 2
+        height: level1.height / 2
+        sourceItem: effect1
+        hideSource: rootItem.visible
+        visible: false
+        smooth: true
+    }
+
+    ShaderEffect {
+        id: effect2
+        property variant source: level2
+        property real yStep: 1/height
+        property real xStep: 1/width
+        anchors.fill: level3
+        visible: false
+        smooth: true
+        vertexShader: __internalBlurVertexShader
+        fragmentShader: __internalBlurFragmentShader
+    }
+
+    ShaderEffectSource {
+        id: level3
+        width: level2.width / 2
+        height: level2.height / 2
+        sourceItem: effect2
+        hideSource: rootItem.visible
+        visible: false
+        smooth: true
+    }
+
+    ShaderEffect {
+        id: effect3
+        property variant source: level3
+        property real yStep: 1/height
+        property real xStep: 1/width
+        anchors.fill: level4
+        visible: false
+        smooth: true
+        vertexShader: __internalBlurVertexShader
+        fragmentShader: __internalBlurFragmentShader
+    }
+
+    ShaderEffectSource {
+        id: level4
+        width: level3.width / 2
+        height: level3.height / 2
+        sourceItem: effect3
+        hideSource: rootItem.visible
+        visible: false
+        smooth: true
+    }
+
+    ShaderEffect {
+        id: effect4
+        property variant source: level4
+        property real yStep: 1/height
+        property real xStep: 1/width
+        anchors.fill: level5
+        visible: false
+        smooth: true
+        vertexShader: __internalBlurVertexShader
+        fragmentShader: __internalBlurFragmentShader
+    }
+
+    ShaderEffectSource {
+        id: level5
+        width: level4.width / 2
+        height: level4.height / 2
+        sourceItem: effect4
+        hideSource: rootItem.visible
+        visible: false
+        smooth: true
+    }
+
+    ShaderEffect {
+        id: effect5
+        property variant source: level5
+        property real yStep: 1/height
+        property real xStep: 1/width
+        anchors.fill: level6
+        visible: false
+        smooth: true
+        vertexShader: __internalBlurVertexShader
+        fragmentShader: __internalBlurFragmentShader
+    }
+
+    ShaderEffectSource {
+        id: level6
+        width: level5.width / 2
+        height: level5.height / 2
+        sourceItem: effect5
+        hideSource: rootItem.visible
+        visible: false
+        smooth: true
+    }
+
+    Item {
+        id: dummysource
+        width: 1
+        height: 1
+        visible: false
+    }
+
+    ShaderEffectSource {
+        id: dummy
+        width: 1
+        height: 1
+        sourceItem: dummysource
+        visible: false
+        smooth: false
+        live: false
+    }
+
+    ShaderEffect {
+        id: shaderItem
+        width: parent.width
+        height: parent.height
+
+        property variant original: sourceProxy.output
+        property variant source1: level1
+        property variant source2: level2
+        property variant source3: level3
+        property variant source4: level4
+        property variant source5: level5
+        property variant source6: level6
+        property real lod: rootItem.blur
+
+        property real weight1;
+        property real weight2;
+        property real weight3;
+        property real weight4;
+        property real weight5;
+        property real weight6;
+
+        property real spread: 1.0 - (rootItem.spread * 0.98)
+        property color color: rootItem.color
+
+        function weight(v) {
+            if (v <= 0.0)
+                return 1
+            if (v >= 0.5)
+                return 0
+
+            return 1.0 - v / 0.5
+        }
+
+        function calculateWeights() {
+
+            var w1 = weight(Math.abs(lod - 0.100))
+            var w2 = weight(Math.abs(lod - 0.300))
+            var w3 = weight(Math.abs(lod - 0.500))
+            var w4 = weight(Math.abs(lod - 0.700))
+            var w5 = weight(Math.abs(lod - 0.900))
+            var w6 = weight(Math.abs(lod - 1.100))
+
+            var sum = w1 + w2 + w3 + w4 + w5 + w6;
+            weight1 = w1 / sum;
+            weight2 = w2 / sum;
+            weight3 = w3 / sum;
+            weight4 = w4 / sum;
+            weight5 = w5 / sum;
+            weight6 = w6 / sum;
+
+            upateSources()
+        }
+
+        function upateSources() {
+            var sources = new Array();
+            var weights = new Array();
+
+            if (weight1 > 0) {
+                sources.push(level1)
+                weights.push(weight1)
+            }
+
+            if (weight2 > 0) {
+                sources.push(level2)
+                weights.push(weight2)
+            }
+
+            if (weight3 > 0) {
+                sources.push(level3)
+                weights.push(weight3)
+            }
+
+            if (weight4 > 0) {
+                sources.push(level4)
+                weights.push(weight4)
+            }
+
+            if (weight5 > 0) {
+                sources.push(level5)
+                weights.push(weight5)
+            }
+
+            if (weight6 > 0) {
+                sources.push(level6)
+                weights.push(weight6)
+            }
+
+            for (var j = sources.length; j < 6; j++) {
+                sources.push(dummy)
+                weights.push(0.0)
+            }
+
+            source1 = sources[0]
+            source2 = sources[1]
+            source3 = sources[2]
+            source4 = sources[3]
+            source5 = sources[4]
+            source6 = sources[5]
+
+            weight1 = weights[0]
+            weight2 = weights[1]
+            weight3 = weights[2]
+            weight4 = weights[3]
+            weight5 = weights[4]
+            weight6 = weights[5]
+        }
+
+        Component.onCompleted: calculateWeights()
+
+        onLodChanged: calculateWeights()
+
+        fragmentShader: "qrc:/qt-project.org/imports/QtGraphicalEffects/shaders/fastinnershadow.frag"
+    }
+}
diff --git a/deployment_test/QtGraphicalEffects/private/FastInnerShadow.qmlc b/deployment_test/QtGraphicalEffects/private/FastInnerShadow.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..8f65102a4bdac290273a924085718ae434416752
Binary files /dev/null and b/deployment_test/QtGraphicalEffects/private/FastInnerShadow.qmlc differ
diff --git a/deployment_test/QtGraphicalEffects/private/FastMaskedBlur.qml b/deployment_test/QtGraphicalEffects/private/FastMaskedBlur.qml
new file mode 100644
index 0000000000000000000000000000000000000000..56800c65c5bd06e4d32052cd3d5432b20602dcff
--- /dev/null
+++ b/deployment_test/QtGraphicalEffects/private/FastMaskedBlur.qml
@@ -0,0 +1,247 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Graphical Effects module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtGraphicalEffects.private 1.12
+
+Item {
+    id: rootItem
+    property variant source
+    property variant maskSource
+    property real blur: 0.0
+    property bool transparentBorder: false
+    property bool cached: false
+
+    SourceProxy {
+        id: sourceProxy
+        input: rootItem.source
+    }
+
+    SourceProxy {
+        id: maskSourceProxy
+        input: rootItem.maskSource
+    }
+
+    ShaderEffectSource {
+        id: cacheItem
+        anchors.fill: shaderItem
+        visible: rootItem.cached
+        sourceItem: shaderItem
+        live: true
+        hideSource: visible
+        smooth: rootItem.blur > 0
+    }
+
+    property string __internalBlurVertexShader: "qrc:/qt-project.org/imports/QtGraphicalEffects/shaders/fastblur_internal.vert"
+
+    property string __internalBlurFragmentShader: "qrc:/qt-project.org/imports/QtGraphicalEffects/shaders/fastblur_internal.frag"
+
+    ShaderEffect {
+        id: mask0
+        property variant source: maskSourceProxy.output
+        anchors.fill: parent
+        visible: false
+        smooth: true
+    }
+
+   ShaderEffectSource {
+       id: masklevel1
+       width: Math.ceil(shaderItem.width / 32) * 32
+       height: Math.ceil(shaderItem.height / 32) * 32
+       sourceItem: mask0
+       hideSource: rootItem.visible
+       sourceRect: transparentBorder ? Qt.rect(-64, -64, shaderItem.width, shaderItem.height) : Qt.rect(0, 0, 0, 0)
+       visible: false
+       smooth: rootItem.blur > 0
+   }
+
+    ShaderEffect {
+        id: level0
+        property variant source: sourceProxy.output
+        anchors.fill: parent
+        visible: false
+        smooth: true
+    }
+
+    ShaderEffectSource {
+        id: level1
+        width: Math.ceil(shaderItem.width / 32) * 32
+        height: Math.ceil(shaderItem.height / 32) * 32
+        sourceItem: level0
+        hideSource: rootItem.visible
+        sourceRect: transparentBorder ? Qt.rect(-64, -64, shaderItem.width, shaderItem.height) : Qt.rect(0, 0, 0, 0)
+        visible: false
+        smooth: rootItem.blur > 0
+    }
+
+    ShaderEffect {
+        id: effect1
+        property variant source: level1
+        property real yStep: 1/height
+        property real xStep: 1/width
+        anchors.fill: level2
+        visible: false
+        smooth: true
+        vertexShader: __internalBlurVertexShader
+        fragmentShader: __internalBlurFragmentShader
+    }
+
+    ShaderEffectSource {
+        id: level2
+        width: level1.width / 2
+        height: level1.height / 2
+        sourceItem: effect1
+        hideSource: rootItem.visible
+        visible: false
+        smooth: true
+    }
+
+    ShaderEffect {
+        id: effect2
+        property variant source: level2
+        property real yStep: 1/height
+        property real xStep: 1/width
+        anchors.fill: level3
+        visible: false
+        smooth: true
+        vertexShader: __internalBlurVertexShader
+        fragmentShader: __internalBlurFragmentShader
+    }
+
+    ShaderEffectSource {
+        id: level3
+        width: level2.width / 2
+        height: level2.height / 2
+        sourceItem: effect2
+        hideSource: rootItem.visible
+        visible: false
+        smooth: true
+    }
+
+    ShaderEffect {
+        id: effect3
+        property variant source: level3
+        property real yStep: 1/height
+        property real xStep: 1/width
+        anchors.fill: level4
+        visible: false
+        smooth: true
+        vertexShader: __internalBlurVertexShader
+        fragmentShader: __internalBlurFragmentShader
+    }
+
+    ShaderEffectSource {
+        id: level4
+        width: level3.width / 2
+        height: level3.height / 2
+        sourceItem: effect3
+        hideSource: rootItem.visible
+        visible: false
+        smooth: true
+    }
+
+    ShaderEffect {
+        id: effect4
+        property variant source: level4
+        property real yStep: 1/height
+        property real xStep: 1/width
+        anchors.fill: level5
+        visible: false
+        smooth: true
+        vertexShader: __internalBlurVertexShader
+        fragmentShader: __internalBlurFragmentShader
+    }
+
+    ShaderEffectSource {
+        id: level5
+        width: level4.width / 2
+        height: level4.height / 2
+        sourceItem: effect4
+        hideSource: rootItem.visible
+        visible: false
+        smooth: true
+    }
+
+    ShaderEffect {
+        id: effect5
+        property variant source: level5
+        property real yStep: 1/height
+        property real xStep: 1/width
+        anchors.fill: level6
+        visible: false
+        smooth: true
+        vertexShader: __internalBlurVertexShader
+        fragmentShader: __internalBlurFragmentShader
+    }
+
+    ShaderEffectSource {
+        id: level6
+        width: level5.width / 2
+        height: level5.height / 2
+        sourceItem: effect5
+        hideSource: rootItem.visible
+        visible: false
+        smooth: true
+    }
+
+    ShaderEffect {
+        id: shaderItem
+        property variant mask: masklevel1
+        property variant source1: level1
+        property variant source2: level2
+        property variant source3: level3
+        property variant source4: level4
+        property variant source5: level5
+        property variant source6: level6
+        property real lod: Math.sqrt(rootItem.blur) * 1.2 - 0.2
+        property real weight1
+        property real weight2
+        property real weight3
+        property real weight4
+        property real weight5
+        property real weight6
+
+        x: transparentBorder ? -64 : 0
+        y: transparentBorder ? -64 : 0
+        width: transparentBorder ? parent.width + 128 : parent.width
+        height: transparentBorder ? parent.height + 128 : parent.height
+
+        fragmentShader: "qrc:/qt-project.org/imports/QtGraphicalEffects/shaders/fastmaskedblur.frag"
+    }
+}
diff --git a/deployment_test/QtGraphicalEffects/private/FastMaskedBlur.qmlc b/deployment_test/QtGraphicalEffects/private/FastMaskedBlur.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..cdb6bb36153f834b900d7fa9b046cb5716e771f8
Binary files /dev/null and b/deployment_test/QtGraphicalEffects/private/FastMaskedBlur.qmlc differ
diff --git a/deployment_test/QtGraphicalEffects/private/GaussianDirectionalBlur.qml b/deployment_test/QtGraphicalEffects/private/GaussianDirectionalBlur.qml
new file mode 100644
index 0000000000000000000000000000000000000000..4d52b2ed2102287b69aea5366fed2f412d61cbad
--- /dev/null
+++ b/deployment_test/QtGraphicalEffects/private/GaussianDirectionalBlur.qml
@@ -0,0 +1,289 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Graphical Effects module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtGraphicalEffects.private 1.12
+
+Item {
+    id: rootItem
+    property variant source
+    property real deviation: (radius + 1) / 3.3333
+    property real radius: 0.0
+    property int maximumRadius: 0
+    property real horizontalStep: 0.0
+    property real verticalStep: 0.0
+    property bool transparentBorder: false
+    property bool cached: false
+
+    property bool enableColor: false
+    property color color: "white"
+    property real spread: 0.0
+
+    property bool enableMask: false
+    property variant maskSource
+
+    SourceProxy {
+        id: sourceProxy
+        input: rootItem.source
+    }
+
+    SourceProxy {
+        id: maskSourceProxy
+        input: rootItem.maskSource
+    }
+
+    ShaderEffectSource {
+        id: cacheItem
+        anchors.fill: rootItem
+        visible: rootItem.cached
+        smooth: true
+        sourceItem: shaderItem
+        live: true
+        hideSource: visible
+    }
+
+    ShaderEffect {
+        id: shaderItem
+        property variant source: sourceProxy.output
+        property real deviation: Math.max(0.1, rootItem.deviation)
+        property real radius: rootItem.radius
+        property int maxRadius: rootItem.maximumRadius
+        property bool transparentBorder: rootItem.transparentBorder
+        property real gaussianSum: 0.0
+        property real startIndex: 0.0
+        property real deltaFactor: (2 * radius - 1) / (maxRadius * 2 - 1)
+        property real expandX: transparentBorder && rootItem.horizontalStep > 0 ? maxRadius / width : 0.0
+        property real expandY: transparentBorder && rootItem.verticalStep > 0 ? maxRadius / height : 0.0
+        property variant gwts: []
+        property variant delta: Qt.vector3d(rootItem.horizontalStep * deltaFactor, rootItem.verticalStep * deltaFactor, startIndex);
+        property variant factor_0_2: Qt.vector3d(gwts[0], gwts[1], gwts[2]);
+        property variant factor_3_5: Qt.vector3d(gwts[3], gwts[4], gwts[5]);
+        property variant factor_6_8: Qt.vector3d(gwts[6], gwts[7], gwts[8]);
+        property variant factor_9_11: Qt.vector3d(gwts[9], gwts[10], gwts[11]);
+        property variant factor_12_14: Qt.vector3d(gwts[12], gwts[13], gwts[14]);
+        property variant factor_15_17: Qt.vector3d(gwts[15], gwts[16], gwts[17]);
+        property variant factor_18_20: Qt.vector3d(gwts[18], gwts[19], gwts[20]);
+        property variant factor_21_23: Qt.vector3d(gwts[21], gwts[22], gwts[23]);
+        property variant factor_24_26: Qt.vector3d(gwts[24], gwts[25], gwts[26]);
+        property variant factor_27_29: Qt.vector3d(gwts[27], gwts[28], gwts[29]);
+        property variant factor_30_31: Qt.point(gwts[30], gwts[31]);
+
+        property color color: rootItem.color
+        property real spread: 1.0 - (rootItem.spread * 0.98)
+        property variant maskSource: maskSourceProxy.output
+
+        anchors.fill: rootItem
+
+        function gausFunc(x){
+            //Gaussian function = h(x):=(1/sqrt(2*3.14159*(D^2))) * %e^(-(x^2)/(2*(D^2)));
+            return (1.0 / Math.sqrt(2 * Math.PI * (Math.pow(shaderItem.deviation, 2)))) * Math.pow(Math.E, -((Math.pow(x, 2)) / (2 * (Math.pow(shaderItem.deviation, 2)))));
+        }
+
+        function updateGaussianWeights() {
+            gaussianSum = 0.0;
+            startIndex = -maxRadius + 0.5
+
+            var n = new Array(32);
+            for (var j = 0; j < 32; j++)
+                n[j] = 0;
+
+            var max = maxRadius * 2
+            var delta = (2 * radius - 1) / (max - 1);
+            for (var i = 0; i < max; i++) {
+                n[i] = gausFunc(-radius + 0.5 + i * delta);
+                gaussianSum += n[i];
+            }
+
+            gwts = n;
+        }
+
+        function buildFragmentShader() {
+
+        var shaderSteps = [
+            "gl_FragColor += texture2D(source, texCoord) * factor_0_2.x; texCoord += shift;",
+            "gl_FragColor += texture2D(source, texCoord) * factor_0_2.y; texCoord += shift;",
+            "gl_FragColor += texture2D(source, texCoord) * factor_0_2.z; texCoord += shift;",
+
+            "gl_FragColor += texture2D(source, texCoord) * factor_3_5.x; texCoord += shift;",
+            "gl_FragColor += texture2D(source, texCoord) * factor_3_5.y; texCoord += shift;",
+            "gl_FragColor += texture2D(source, texCoord) * factor_3_5.z; texCoord += shift;",
+
+            "gl_FragColor += texture2D(source, texCoord) * factor_6_8.x; texCoord += shift;",
+            "gl_FragColor += texture2D(source, texCoord) * factor_6_8.y; texCoord += shift;",
+            "gl_FragColor += texture2D(source, texCoord) * factor_6_8.z; texCoord += shift;",
+
+            "gl_FragColor += texture2D(source, texCoord) * factor_9_11.x; texCoord += shift;",
+            "gl_FragColor += texture2D(source, texCoord) * factor_9_11.y; texCoord += shift;",
+            "gl_FragColor += texture2D(source, texCoord) * factor_9_11.z; texCoord += shift;",
+
+            "gl_FragColor += texture2D(source, texCoord) * factor_12_14.x; texCoord += shift;",
+            "gl_FragColor += texture2D(source, texCoord) * factor_12_14.y; texCoord += shift;",
+            "gl_FragColor += texture2D(source, texCoord) * factor_12_14.z; texCoord += shift;",
+
+            "gl_FragColor += texture2D(source, texCoord) * factor_15_17.x; texCoord += shift;",
+            "gl_FragColor += texture2D(source, texCoord) * factor_15_17.y; texCoord += shift;",
+            "gl_FragColor += texture2D(source, texCoord) * factor_15_17.z; texCoord += shift;",
+
+            "gl_FragColor += texture2D(source, texCoord) * factor_18_20.x; texCoord += shift;",
+            "gl_FragColor += texture2D(source, texCoord) * factor_18_20.y; texCoord += shift;",
+            "gl_FragColor += texture2D(source, texCoord) * factor_18_20.z; texCoord += shift;",
+
+            "gl_FragColor += texture2D(source, texCoord) * factor_21_23.x; texCoord += shift;",
+            "gl_FragColor += texture2D(source, texCoord) * factor_21_23.y; texCoord += shift;",
+            "gl_FragColor += texture2D(source, texCoord) * factor_21_23.z; texCoord += shift;",
+
+            "gl_FragColor += texture2D(source, texCoord) * factor_24_26.x; texCoord += shift;",
+            "gl_FragColor += texture2D(source, texCoord) * factor_24_26.y; texCoord += shift;",
+            "gl_FragColor += texture2D(source, texCoord) * factor_24_26.z; texCoord += shift;",
+
+            "gl_FragColor += texture2D(source, texCoord) * factor_27_29.x; texCoord += shift;",
+            "gl_FragColor += texture2D(source, texCoord) * factor_27_29.y; texCoord += shift;",
+            "gl_FragColor += texture2D(source, texCoord) * factor_27_29.z; texCoord += shift;",
+
+            "gl_FragColor += texture2D(source, texCoord) * factor_30_31.x; texCoord += shift;",
+            "gl_FragColor += texture2D(source, texCoord) * factor_30_31.y; texCoord += shift;"
+        ]
+
+            var shader = ""
+            if (GraphicsInfo.profile == GraphicsInfo.OpenGLCoreProfile)
+                shader += "#version 150 core\n#define varying in\n#define gl_FragColor fragColor\n#define texture2D texture\nout vec4 fragColor;\n"
+            shader += fragmentShaderBegin
+            var samples = maxRadius * 2
+            if (samples > 32) {
+                console.log("DirectionalGaussianBlur.qml WARNING: Maximum of blur radius (16) exceeded!")
+                samples = 32
+            }
+
+            for (var i = 0; i < samples; i++) {
+                shader += shaderSteps[i]
+            }
+
+            shader += fragmentShaderEnd
+
+            var colorizeSteps = ""
+            var colorizeUniforms = ""
+
+            var maskSteps = ""
+            var maskUniforms = ""
+
+            if (enableColor) {
+                colorizeSteps += "gl_FragColor = mix(vec4(0), color, clamp((gl_FragColor.a - 0.0) / (spread - 0.0), 0.0, 1.0));\n"
+                colorizeUniforms += "uniform highp vec4 color;\n"
+                colorizeUniforms += "uniform highp float spread;\n"
+            }
+
+            if (enableMask) {
+                maskSteps += "shift *= texture2D(maskSource, qt_TexCoord0).a;\n"
+                maskUniforms += "uniform sampler2D maskSource;\n"
+            }
+
+            shader = shader.replace("PLACEHOLDER_COLORIZE_STEPS", colorizeSteps)
+            shader = shader.replace("PLACEHOLDER_COLORIZE_UNIFORMS", colorizeUniforms)
+            shader = shader.replace("PLACEHOLDER_MASK_STEPS", maskSteps)
+            shader = shader.replace("PLACEHOLDER_MASK_UNIFORMS", maskUniforms)
+
+            fragmentShader = shader
+        }
+
+        onDeviationChanged: updateGaussianWeights()
+
+        onRadiusChanged: updateGaussianWeights()
+
+        onTransparentBorderChanged: {
+            buildFragmentShader()
+            updateGaussianWeights()
+        }
+
+        onMaxRadiusChanged: {
+            buildFragmentShader()
+            updateGaussianWeights()
+        }
+
+        Component.onCompleted: {
+            buildFragmentShader()
+            updateGaussianWeights()
+        }
+
+        property string fragmentShaderBegin: "
+            varying mediump vec2 qt_TexCoord0;
+            uniform highp float qt_Opacity;
+            uniform lowp sampler2D source;
+            uniform highp vec3 delta;
+            uniform highp vec3 factor_0_2;
+            uniform highp vec3 factor_3_5;
+            uniform highp vec3 factor_6_8;
+            uniform highp vec3 factor_9_11;
+            uniform highp vec3 factor_12_14;
+            uniform highp vec3 factor_15_17;
+            uniform highp vec3 factor_18_20;
+            uniform highp vec3 factor_21_23;
+            uniform highp vec3 factor_24_26;
+            uniform highp vec3 factor_27_29;
+            uniform highp vec3 factor_30_31;
+            uniform highp float gaussianSum;
+            uniform highp float expandX;
+            uniform highp float expandY;
+            PLACEHOLDER_MASK_UNIFORMS
+            PLACEHOLDER_COLORIZE_UNIFORMS
+
+            void main() {
+                highp vec2 shift = vec2(delta.x, delta.y);
+
+                PLACEHOLDER_MASK_STEPS
+
+                highp float index = delta.z;
+                mediump vec2 texCoord = qt_TexCoord0;
+                texCoord.s = (texCoord.s - expandX) / (1.0 - 2.0 * expandX);
+                texCoord.t = (texCoord.t - expandY) / (1.0 - 2.0 * expandY);
+                texCoord +=  (shift * index);
+
+                gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);
+        "
+
+        property string fragmentShaderEnd: "
+
+                gl_FragColor /= gaussianSum;
+
+                PLACEHOLDER_COLORIZE_STEPS
+
+                gl_FragColor *= qt_Opacity;
+            }
+        "
+     }
+}
diff --git a/deployment_test/QtGraphicalEffects/private/GaussianDirectionalBlur.qmlc b/deployment_test/QtGraphicalEffects/private/GaussianDirectionalBlur.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..afbb4a0b95457f4bdb7c549bd6419fd834999bd7
Binary files /dev/null and b/deployment_test/QtGraphicalEffects/private/GaussianDirectionalBlur.qmlc differ
diff --git a/deployment_test/QtGraphicalEffects/private/GaussianGlow.qml b/deployment_test/QtGraphicalEffects/private/GaussianGlow.qml
new file mode 100644
index 0000000000000000000000000000000000000000..f0d328ac5b0379d91b71672c93fe06dad503afa1
--- /dev/null
+++ b/deployment_test/QtGraphicalEffects/private/GaussianGlow.qml
@@ -0,0 +1,98 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Graphical Effects module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtGraphicalEffects.private 1.12
+
+Item {
+    id: rootItem
+    property variant source
+    property real radius: 0.0
+    property int maximumRadius: 0
+    property real spread: 0.0
+    property color color: "white"
+    property bool cached: false
+    property bool transparentBorder: false
+
+    SourceProxy {
+        id: sourceProxy
+        input: rootItem.source
+        sourceRect: rootItem.transparentBorder ? Qt.rect(-1, -1, parent.width + 2.0, parent.height + 2.0) : Qt.rect(0, 0, 0, 0)
+    }
+
+    ShaderEffectSource {
+        id: cacheItem
+        anchors.fill: shaderItem
+        visible: rootItem.cached
+        smooth: true
+        sourceItem: shaderItem
+        live: true
+        hideSource: visible
+    }
+
+    GaussianDirectionalBlur {
+        id: shaderItem
+        x: transparentBorder ? -maximumRadius - 1 : 0
+        y: transparentBorder ? -maximumRadius - 1 : 0
+        width: horizontalBlur.width
+        height: horizontalBlur.height
+        horizontalStep: 0.0
+        verticalStep: 1.0 / parent.height
+        source: horizontalBlur
+        radius: rootItem.radius
+        maximumRadius: rootItem.maximumRadius
+        transparentBorder: rootItem.transparentBorder
+        enableColor: true
+        color: rootItem.color
+        spread: rootItem.spread
+    }
+
+    GaussianDirectionalBlur {
+        id: horizontalBlur
+        width: transparentBorder ? parent.width + 2 * maximumRadius + 2 : parent.width
+        height: transparentBorder ? parent.height + 2 * maximumRadius + 2  : parent.height
+        horizontalStep: 1.0 / parent.width
+        verticalStep: 0.0
+        source: sourceProxy.output
+        radius: rootItem.radius
+        maximumRadius: rootItem.maximumRadius
+        transparentBorder: rootItem.transparentBorder
+        visible: false
+    }
+}
diff --git a/deployment_test/QtGraphicalEffects/private/GaussianGlow.qmlc b/deployment_test/QtGraphicalEffects/private/GaussianGlow.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..ae40f47086d63a05da6ddf6bfe2af60389a26dda
Binary files /dev/null and b/deployment_test/QtGraphicalEffects/private/GaussianGlow.qmlc differ
diff --git a/deployment_test/QtGraphicalEffects/private/GaussianInnerShadow.qml b/deployment_test/QtGraphicalEffects/private/GaussianInnerShadow.qml
new file mode 100644
index 0000000000000000000000000000000000000000..a0b39e9f51608f152c89e188193480fa36652527
--- /dev/null
+++ b/deployment_test/QtGraphicalEffects/private/GaussianInnerShadow.qml
@@ -0,0 +1,123 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Graphical Effects module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtGraphicalEffects.private 1.12
+
+Item {
+    id: rootItem
+    property variant source
+    property real radius: 0.0
+    property int maximumRadius: 0
+    property real horizontalOffset: 0
+    property real verticalOffset: 0
+    property real spread: 0
+    property color color: "black"
+    property bool cached: false
+
+    SourceProxy {
+        id: sourceProxy
+        input: rootItem.source
+    }
+
+    ShaderEffectSource {
+        id: cacheItem
+        anchors.fill: shaderItem
+        visible: rootItem.cached
+        smooth: true
+        sourceItem: shaderItem
+        live: true
+        hideSource: visible
+    }
+
+    ShaderEffect{
+        id: shadowItem
+        anchors.fill: parent
+
+        property variant original: sourceProxy.output
+        property color color: rootItem.color
+        property real horizontalOffset: rootItem.horizontalOffset / rootItem.width
+        property real verticalOffset: rootItem.verticalOffset / rootItem.height
+
+        visible: false
+        fragmentShader: "qrc:/qt-project.org/imports/QtGraphicalEffects/shaders/gaussianinnershadow_shadow.frag"
+    }
+
+    GaussianDirectionalBlur {
+        id: blurItem
+        anchors.fill: parent
+        horizontalStep: 0.0
+        verticalStep: 1.0 / parent.height
+        source: horizontalBlur
+        radius: rootItem.radius
+        maximumRadius: rootItem.maximumRadius
+        visible: false
+    }
+
+    GaussianDirectionalBlur {
+        id: horizontalBlur
+        width: transparentBorder ? parent.width + 2 * maximumRadius : parent.width
+        height: parent.height
+        horizontalStep: 1.0 / parent.width
+        verticalStep: 0.0
+        source: shadowItem
+        radius: rootItem.radius
+        maximumRadius: rootItem.maximumRadius
+        visible: false
+    }
+
+    ShaderEffectSource {
+        id: blurredSource
+        sourceItem: blurItem
+        live: true
+        smooth: true
+    }
+
+    ShaderEffect {
+        id: shaderItem
+        anchors.fill: parent
+
+        property variant original: sourceProxy.output
+        property variant shadow: blurredSource
+        property real spread: 1.0 - (rootItem.spread * 0.98)
+        property color color: rootItem.color
+
+        fragmentShader: "qrc:/qt-project.org/imports/QtGraphicalEffects/shaders/gaussianinnershadow.frag"
+    }
+}
diff --git a/deployment_test/QtGraphicalEffects/private/GaussianInnerShadow.qmlc b/deployment_test/QtGraphicalEffects/private/GaussianInnerShadow.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..02fc0f55aef29b9c3dbacc593774a3c9d8bf3f06
Binary files /dev/null and b/deployment_test/QtGraphicalEffects/private/GaussianInnerShadow.qmlc differ
diff --git a/deployment_test/QtGraphicalEffects/private/GaussianMaskedBlur.qml b/deployment_test/QtGraphicalEffects/private/GaussianMaskedBlur.qml
new file mode 100644
index 0000000000000000000000000000000000000000..8273973f1a824cabe73ddee81afdaf8e1f74b9f5
--- /dev/null
+++ b/deployment_test/QtGraphicalEffects/private/GaussianMaskedBlur.qml
@@ -0,0 +1,104 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Graphical Effects module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtGraphicalEffects.private 1.12
+
+Item {
+    id: rootItem
+    property variant source
+    property variant maskSource
+    property real radius: 0.0
+    property int maximumRadius: 0
+    property bool cached: false
+    property bool transparentBorder: false
+
+    SourceProxy {
+        id: sourceProxy
+        input: rootItem.source
+        sourceRect: rootItem.transparentBorder ? Qt.rect(-1, -1, parent.width + 2.0, parent.height + 2.0) : Qt.rect(0, 0, 0, 0)
+    }
+
+    SourceProxy {
+        id: maskSourceProxy
+        input: rootItem.maskSource
+        sourceRect: rootItem.transparentBorder ? Qt.rect(-1, -1, parent.width + 2.0, parent.height + 2.0) : Qt.rect(0, 0, 0, 0)
+    }
+
+    ShaderEffectSource {
+        id: cacheItem
+        anchors.fill: blur
+        visible: rootItem.cached
+        smooth: true
+        sourceItem: blur
+        live: true
+        hideSource: visible
+    }
+
+    GaussianDirectionalBlur {
+        id: blur
+        x: transparentBorder ? -maximumRadius - 1: 0
+        y: transparentBorder ? -maximumRadius - 1: 0
+        width: horizontalBlur.width
+        height: horizontalBlur.height
+        horizontalStep: 0.0
+        verticalStep: 1.0 / parent.height
+        source: horizontalBlur
+        enableMask: true
+        maskSource: maskSourceProxy.output
+        radius: rootItem.radius
+        maximumRadius: rootItem.maximumRadius
+        transparentBorder: rootItem.transparentBorder
+    }
+
+    GaussianDirectionalBlur {
+        id: horizontalBlur
+        width: transparentBorder ? parent.width + 2 * maximumRadius + 2 : parent.width
+        height: transparentBorder ? parent.height + 2 * maximumRadius + 2  : parent.height
+        horizontalStep: 1.0 / parent.width
+        verticalStep: 0.0
+        source: sourceProxy.output
+        enableMask: true
+        maskSource: maskSourceProxy.output
+        radius: rootItem.radius
+        maximumRadius: rootItem.maximumRadius
+        transparentBorder: rootItem.transparentBorder
+        visible: false
+    }
+}
diff --git a/deployment_test/QtGraphicalEffects/private/GaussianMaskedBlur.qmlc b/deployment_test/QtGraphicalEffects/private/GaussianMaskedBlur.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..d1f66b8a2a436e18d1ff59338cd874384b210234
Binary files /dev/null and b/deployment_test/QtGraphicalEffects/private/GaussianMaskedBlur.qmlc differ
diff --git a/deployment_test/QtGraphicalEffects/private/qmldir b/deployment_test/QtGraphicalEffects/private/qmldir
new file mode 100644
index 0000000000000000000000000000000000000000..2d4bdacb85e547d0b007921f162396ac8a080240
--- /dev/null
+++ b/deployment_test/QtGraphicalEffects/private/qmldir
@@ -0,0 +1,11 @@
+module QtGraphicalEffects.private
+plugin qtgraphicaleffectsprivate
+classname QtGraphicalEffectsPrivatePlugin
+FastGlow 1.0 FastGlow.qml
+FastInnerShadow 1.0 FastInnerShadow.qml
+FastMaskedBlur 1.0 FastMaskedBlur.qml
+GaussianDirectionalBlur 1.0 GaussianDirectionalBlur.qml
+GaussianGlow 1.0 GaussianGlow.qml
+GaussianInnerShadow 1.0 GaussianInnerShadow.qml
+GaussianMaskedBlur 1.0 GaussianMaskedBlur.qml
+DropShadowBase 1.0 DropShadowBase.qml
diff --git a/deployment_test/QtGraphicalEffects/private/qtgraphicaleffectsprivate.dll b/deployment_test/QtGraphicalEffects/private/qtgraphicaleffectsprivate.dll
new file mode 100644
index 0000000000000000000000000000000000000000..20cce1dcbbb07b4084024962827b82d7f02ffa47
Binary files /dev/null and b/deployment_test/QtGraphicalEffects/private/qtgraphicaleffectsprivate.dll differ
diff --git a/deployment_test/QtGraphicalEffects/qmldir b/deployment_test/QtGraphicalEffects/qmldir
new file mode 100644
index 0000000000000000000000000000000000000000..72233b56b6c9fe122803e8eeba1f55a4534a1c7c
--- /dev/null
+++ b/deployment_test/QtGraphicalEffects/qmldir
@@ -0,0 +1,31 @@
+module QtGraphicalEffects
+plugin qtgraphicaleffectsplugin
+classname QtGraphicalEffectsPlugin
+Blend 1.0 Blend.qml
+BrightnessContrast 1.0 BrightnessContrast.qml
+Colorize 1.0 Colorize.qml
+ColorOverlay 1.0 ColorOverlay.qml
+ConicalGradient 1.0 ConicalGradient.qml
+Desaturate 1.0 Desaturate.qml
+DirectionalBlur 1.0 DirectionalBlur.qml
+Displace 1.0 Displace.qml
+DropShadow 1.0 DropShadow.qml
+FastBlur 1.0 FastBlur.qml
+GammaAdjust 1.0 GammaAdjust.qml
+GaussianBlur 1.0 GaussianBlur.qml
+Glow 1.0 Glow.qml
+HueSaturation 1.0 HueSaturation.qml
+InnerShadow 1.0 InnerShadow.qml
+LevelAdjust 1.0 LevelAdjust.qml
+LinearGradient 1.0 LinearGradient.qml
+MaskedBlur 1.0 MaskedBlur.qml
+OpacityMask 1.0 OpacityMask.qml
+RadialBlur 1.0 RadialBlur.qml
+RadialGradient 1.0 RadialGradient.qml
+RecursiveBlur 1.0 RecursiveBlur.qml
+RectangularGlow 1.0 RectangularGlow.qml
+ThresholdMask 1.0 ThresholdMask.qml
+ZoomBlur 1.0 ZoomBlur.qml
+designersupported
+depends QtGraphicalEffects/private 1.0
+depends QtQuick.Window 2.1
diff --git a/deployment_test/QtGraphicalEffects/qtgraphicaleffectsplugin.dll b/deployment_test/QtGraphicalEffects/qtgraphicaleffectsplugin.dll
new file mode 100644
index 0000000000000000000000000000000000000000..c519c8d6eb96d0c2334b347f219e86089e259e18
Binary files /dev/null and b/deployment_test/QtGraphicalEffects/qtgraphicaleffectsplugin.dll differ
diff --git a/deployment_test/QtQml/Models.2/modelsplugin.dll b/deployment_test/QtQml/Models.2/modelsplugin.dll
new file mode 100644
index 0000000000000000000000000000000000000000..359dcf296006b579526688d3d7e058403c6a0d4b
Binary files /dev/null and b/deployment_test/QtQml/Models.2/modelsplugin.dll differ
diff --git a/deployment_test/QtQml/Models.2/plugins.qmltypes b/deployment_test/QtQml/Models.2/plugins.qmltypes
new file mode 100644
index 0000000000000000000000000000000000000000..f9c1f0aa3b9d55a23070385d632a6e096e12832a
--- /dev/null
+++ b/deployment_test/QtQml/Models.2/plugins.qmltypes
@@ -0,0 +1,880 @@
+import QtQuick.tooling 1.2
+
+// This file describes the plugin-supplied types contained in the library.
+// It is used for QML tooling purposes only.
+//
+// This file was auto-generated by qmltyperegistrar.
+
+Module {
+    dependencies: []
+    Component {
+        name: "QAbstractItemModel"
+        prototype: "QObject"
+        Enum {
+            name: "LayoutChangeHint"
+            values: [
+                "NoLayoutChangeHint",
+                "VerticalSortHint",
+                "HorizontalSortHint"
+            ]
+        }
+        Enum {
+            name: "CheckIndexOption"
+            values: [
+                "NoOption",
+                "IndexIsValid",
+                "DoNotUseParent",
+                "ParentIsInvalid"
+            ]
+        }
+        Signal {
+            name: "dataChanged"
+            Parameter { name: "topLeft"; type: "QModelIndex" }
+            Parameter { name: "bottomRight"; type: "QModelIndex" }
+            Parameter { name: "roles"; type: "QVector<int>" }
+        }
+        Signal {
+            name: "dataChanged"
+            Parameter { name: "topLeft"; type: "QModelIndex" }
+            Parameter { name: "bottomRight"; type: "QModelIndex" }
+        }
+        Signal {
+            name: "headerDataChanged"
+            Parameter { name: "orientation"; type: "Qt::Orientation" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "layoutChanged"
+            Parameter { name: "parents"; type: "QList<QPersistentModelIndex>" }
+            Parameter { name: "hint"; type: "QAbstractItemModel::LayoutChangeHint" }
+        }
+        Signal {
+            name: "layoutChanged"
+            Parameter { name: "parents"; type: "QList<QPersistentModelIndex>" }
+        }
+        Signal { name: "layoutChanged" }
+        Signal {
+            name: "layoutAboutToBeChanged"
+            Parameter { name: "parents"; type: "QList<QPersistentModelIndex>" }
+            Parameter { name: "hint"; type: "QAbstractItemModel::LayoutChangeHint" }
+        }
+        Signal {
+            name: "layoutAboutToBeChanged"
+            Parameter { name: "parents"; type: "QList<QPersistentModelIndex>" }
+        }
+        Signal { name: "layoutAboutToBeChanged" }
+        Signal {
+            name: "rowsAboutToBeInserted"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "rowsInserted"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "rowsAboutToBeRemoved"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "rowsRemoved"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "columnsAboutToBeInserted"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "columnsInserted"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "columnsAboutToBeRemoved"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "columnsRemoved"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal { name: "modelAboutToBeReset" }
+        Signal { name: "modelReset" }
+        Signal {
+            name: "rowsAboutToBeMoved"
+            Parameter { name: "sourceParent"; type: "QModelIndex" }
+            Parameter { name: "sourceStart"; type: "int" }
+            Parameter { name: "sourceEnd"; type: "int" }
+            Parameter { name: "destinationParent"; type: "QModelIndex" }
+            Parameter { name: "destinationRow"; type: "int" }
+        }
+        Signal {
+            name: "rowsMoved"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "start"; type: "int" }
+            Parameter { name: "end"; type: "int" }
+            Parameter { name: "destination"; type: "QModelIndex" }
+            Parameter { name: "row"; type: "int" }
+        }
+        Signal {
+            name: "columnsAboutToBeMoved"
+            Parameter { name: "sourceParent"; type: "QModelIndex" }
+            Parameter { name: "sourceStart"; type: "int" }
+            Parameter { name: "sourceEnd"; type: "int" }
+            Parameter { name: "destinationParent"; type: "QModelIndex" }
+            Parameter { name: "destinationColumn"; type: "int" }
+        }
+        Signal {
+            name: "columnsMoved"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "start"; type: "int" }
+            Parameter { name: "end"; type: "int" }
+            Parameter { name: "destination"; type: "QModelIndex" }
+            Parameter { name: "column"; type: "int" }
+        }
+        Method { name: "submit"; type: "bool" }
+        Method { name: "revert" }
+        Method { name: "resetInternalData" }
+        Method {
+            name: "hasIndex"
+            type: "bool"
+            Parameter { name: "row"; type: "int" }
+            Parameter { name: "column"; type: "int" }
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method {
+            name: "hasIndex"
+            type: "bool"
+            Parameter { name: "row"; type: "int" }
+            Parameter { name: "column"; type: "int" }
+        }
+        Method {
+            name: "index"
+            type: "QModelIndex"
+            Parameter { name: "row"; type: "int" }
+            Parameter { name: "column"; type: "int" }
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method {
+            name: "index"
+            type: "QModelIndex"
+            Parameter { name: "row"; type: "int" }
+            Parameter { name: "column"; type: "int" }
+        }
+        Method {
+            name: "parent"
+            type: "QModelIndex"
+            Parameter { name: "child"; type: "QModelIndex" }
+        }
+        Method {
+            name: "sibling"
+            type: "QModelIndex"
+            Parameter { name: "row"; type: "int" }
+            Parameter { name: "column"; type: "int" }
+            Parameter { name: "idx"; type: "QModelIndex" }
+        }
+        Method {
+            name: "rowCount"
+            type: "int"
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method { name: "rowCount"; type: "int" }
+        Method {
+            name: "columnCount"
+            type: "int"
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method { name: "columnCount"; type: "int" }
+        Method {
+            name: "hasChildren"
+            type: "bool"
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method { name: "hasChildren"; type: "bool" }
+        Method {
+            name: "data"
+            type: "QVariant"
+            Parameter { name: "index"; type: "QModelIndex" }
+            Parameter { name: "role"; type: "int" }
+        }
+        Method {
+            name: "data"
+            type: "QVariant"
+            Parameter { name: "index"; type: "QModelIndex" }
+        }
+        Method {
+            name: "setData"
+            type: "bool"
+            Parameter { name: "index"; type: "QModelIndex" }
+            Parameter { name: "value"; type: "QVariant" }
+            Parameter { name: "role"; type: "int" }
+        }
+        Method {
+            name: "setData"
+            type: "bool"
+            Parameter { name: "index"; type: "QModelIndex" }
+            Parameter { name: "value"; type: "QVariant" }
+        }
+        Method {
+            name: "headerData"
+            type: "QVariant"
+            Parameter { name: "section"; type: "int" }
+            Parameter { name: "orientation"; type: "Qt::Orientation" }
+            Parameter { name: "role"; type: "int" }
+        }
+        Method {
+            name: "headerData"
+            type: "QVariant"
+            Parameter { name: "section"; type: "int" }
+            Parameter { name: "orientation"; type: "Qt::Orientation" }
+        }
+        Method {
+            name: "fetchMore"
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method {
+            name: "canFetchMore"
+            type: "bool"
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method {
+            name: "flags"
+            type: "Qt::ItemFlags"
+            Parameter { name: "index"; type: "QModelIndex" }
+        }
+        Method {
+            name: "match"
+            type: "QModelIndexList"
+            Parameter { name: "start"; type: "QModelIndex" }
+            Parameter { name: "role"; type: "int" }
+            Parameter { name: "value"; type: "QVariant" }
+            Parameter { name: "hits"; type: "int" }
+            Parameter { name: "flags"; type: "Qt::MatchFlags" }
+        }
+        Method {
+            name: "match"
+            type: "QModelIndexList"
+            Parameter { name: "start"; type: "QModelIndex" }
+            Parameter { name: "role"; type: "int" }
+            Parameter { name: "value"; type: "QVariant" }
+            Parameter { name: "hits"; type: "int" }
+        }
+        Method {
+            name: "match"
+            type: "QModelIndexList"
+            Parameter { name: "start"; type: "QModelIndex" }
+            Parameter { name: "role"; type: "int" }
+            Parameter { name: "value"; type: "QVariant" }
+        }
+    }
+    Component { name: "QAbstractListModel"; prototype: "QAbstractItemModel" }
+    Component {
+        file: "private/qqmlmodelsmodule_p.h"
+        name: "QItemSelectionModel"
+        prototype: "QObject"
+        exports: ["QtQml.Models/ItemSelectionModel 2.2"]
+        exportMetaObjectRevisions: [2]
+        Enum {
+            name: "SelectionFlags"
+            alias: "SelectionFlag"
+            isFlag: true
+            values: [
+                "NoUpdate",
+                "Clear",
+                "Select",
+                "Deselect",
+                "Toggle",
+                "Current",
+                "Rows",
+                "Columns",
+                "SelectCurrent",
+                "ToggleCurrent",
+                "ClearAndSelect"
+            ]
+        }
+        Property { name: "model"; type: "QAbstractItemModel"; isPointer: true }
+        Property { name: "hasSelection"; type: "bool"; isReadonly: true }
+        Property { name: "currentIndex"; type: "QModelIndex"; isReadonly: true }
+        Property { name: "selection"; type: "QItemSelection"; isReadonly: true }
+        Property { name: "selectedIndexes"; type: "QModelIndexList"; isReadonly: true }
+        Signal {
+            name: "selectionChanged"
+            Parameter { name: "selected"; type: "QItemSelection" }
+            Parameter { name: "deselected"; type: "QItemSelection" }
+        }
+        Signal {
+            name: "currentChanged"
+            Parameter { name: "current"; type: "QModelIndex" }
+            Parameter { name: "previous"; type: "QModelIndex" }
+        }
+        Signal {
+            name: "currentRowChanged"
+            Parameter { name: "current"; type: "QModelIndex" }
+            Parameter { name: "previous"; type: "QModelIndex" }
+        }
+        Signal {
+            name: "currentColumnChanged"
+            Parameter { name: "current"; type: "QModelIndex" }
+            Parameter { name: "previous"; type: "QModelIndex" }
+        }
+        Signal {
+            name: "modelChanged"
+            Parameter { name: "model"; type: "QAbstractItemModel"; isPointer: true }
+        }
+        Method {
+            name: "setCurrentIndex"
+            Parameter { name: "index"; type: "QModelIndex" }
+            Parameter { name: "command"; type: "QItemSelectionModel::SelectionFlags" }
+        }
+        Method {
+            name: "select"
+            Parameter { name: "index"; type: "QModelIndex" }
+            Parameter { name: "command"; type: "QItemSelectionModel::SelectionFlags" }
+        }
+        Method {
+            name: "select"
+            Parameter { name: "selection"; type: "QItemSelection" }
+            Parameter { name: "command"; type: "QItemSelectionModel::SelectionFlags" }
+        }
+        Method { name: "clear" }
+        Method { name: "reset" }
+        Method { name: "clearSelection" }
+        Method { name: "clearCurrentIndex" }
+        Method {
+            name: "_q_columnsAboutToBeRemoved"
+            Parameter { type: "QModelIndex" }
+            Parameter { type: "int" }
+            Parameter { type: "int" }
+        }
+        Method {
+            name: "_q_rowsAboutToBeRemoved"
+            Parameter { type: "QModelIndex" }
+            Parameter { type: "int" }
+            Parameter { type: "int" }
+        }
+        Method {
+            name: "_q_columnsAboutToBeInserted"
+            Parameter { type: "QModelIndex" }
+            Parameter { type: "int" }
+            Parameter { type: "int" }
+        }
+        Method {
+            name: "_q_rowsAboutToBeInserted"
+            Parameter { type: "QModelIndex" }
+            Parameter { type: "int" }
+            Parameter { type: "int" }
+        }
+        Method {
+            name: "_q_layoutAboutToBeChanged"
+            Parameter { name: "parents"; type: "QList<QPersistentModelIndex>" }
+            Parameter { name: "hint"; type: "QAbstractItemModel::LayoutChangeHint" }
+        }
+        Method {
+            name: "_q_layoutAboutToBeChanged"
+            Parameter { name: "parents"; type: "QList<QPersistentModelIndex>" }
+        }
+        Method { name: "_q_layoutAboutToBeChanged" }
+        Method {
+            name: "_q_layoutChanged"
+            Parameter { name: "parents"; type: "QList<QPersistentModelIndex>" }
+            Parameter { name: "hint"; type: "QAbstractItemModel::LayoutChangeHint" }
+        }
+        Method {
+            name: "_q_layoutChanged"
+            Parameter { name: "parents"; type: "QList<QPersistentModelIndex>" }
+        }
+        Method { name: "_q_layoutChanged" }
+        Method {
+            name: "isSelected"
+            type: "bool"
+            Parameter { name: "index"; type: "QModelIndex" }
+        }
+        Method {
+            name: "isRowSelected"
+            type: "bool"
+            Parameter { name: "row"; type: "int" }
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method {
+            name: "isRowSelected"
+            type: "bool"
+            Parameter { name: "row"; type: "int" }
+        }
+        Method {
+            name: "isColumnSelected"
+            type: "bool"
+            Parameter { name: "column"; type: "int" }
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method {
+            name: "isColumnSelected"
+            type: "bool"
+            Parameter { name: "column"; type: "int" }
+        }
+        Method {
+            name: "rowIntersectsSelection"
+            type: "bool"
+            Parameter { name: "row"; type: "int" }
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method {
+            name: "rowIntersectsSelection"
+            type: "bool"
+            Parameter { name: "row"; type: "int" }
+        }
+        Method {
+            name: "columnIntersectsSelection"
+            type: "bool"
+            Parameter { name: "column"; type: "int" }
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method {
+            name: "columnIntersectsSelection"
+            type: "bool"
+            Parameter { name: "column"; type: "int" }
+        }
+        Method {
+            name: "selectedRows"
+            type: "QModelIndexList"
+            Parameter { name: "column"; type: "int" }
+        }
+        Method { name: "selectedRows"; type: "QModelIndexList" }
+        Method {
+            name: "selectedColumns"
+            type: "QModelIndexList"
+            Parameter { name: "row"; type: "int" }
+        }
+        Method { name: "selectedColumns"; type: "QModelIndexList" }
+    }
+    Component {
+        file: "private/qqmlabstractdelegatecomponent_p.h"
+        name: "QQmlAbstractDelegateComponent"
+        prototype: "QQmlComponent"
+        exports: ["QtQml.Models/AbstractDelegateComponent 2.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        Signal { name: "delegateChanged" }
+    }
+    Component {
+        file: "private/qqmldelegatemodel_p.h"
+        name: "QQmlDelegateModel"
+        defaultProperty: "delegate"
+        prototype: "QQmlInstanceModel"
+        exports: [
+            "QtQml.Models/DelegateModel 2.1",
+            "QtQml.Models/DelegateModel 2.15"
+        ]
+        exportMetaObjectRevisions: [1, 15]
+        attachedType: "QQmlDelegateModelAttached"
+        Property { name: "model"; type: "QVariant" }
+        Property { name: "delegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "filterOnGroup"; type: "string" }
+        Property { name: "items"; type: "QQmlDelegateModelGroup"; isReadonly: true; isPointer: true }
+        Property {
+            name: "persistedItems"
+            type: "QQmlDelegateModelGroup"
+            isReadonly: true
+            isPointer: true
+        }
+        Property { name: "groups"; type: "QQmlDelegateModelGroup"; isList: true; isReadonly: true }
+        Property { name: "parts"; type: "QObject"; isReadonly: true; isPointer: true }
+        Property { name: "rootIndex"; type: "QVariant" }
+        Signal { name: "filterGroupChanged" }
+        Signal { name: "defaultGroupsChanged" }
+        Method {
+            name: "_q_itemsChanged"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "count"; type: "int" }
+            Parameter { name: "roles"; type: "QVector<int>" }
+        }
+        Method {
+            name: "_q_itemsInserted"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "count"; type: "int" }
+        }
+        Method {
+            name: "_q_itemsRemoved"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "count"; type: "int" }
+        }
+        Method {
+            name: "_q_itemsMoved"
+            Parameter { name: "from"; type: "int" }
+            Parameter { name: "to"; type: "int" }
+            Parameter { name: "count"; type: "int" }
+        }
+        Method { name: "_q_modelReset" }
+        Method {
+            name: "_q_rowsInserted"
+            Parameter { type: "QModelIndex" }
+            Parameter { type: "int" }
+            Parameter { type: "int" }
+        }
+        Method {
+            name: "_q_rowsAboutToBeRemoved"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "begin"; type: "int" }
+            Parameter { name: "end"; type: "int" }
+        }
+        Method {
+            name: "_q_rowsRemoved"
+            Parameter { type: "QModelIndex" }
+            Parameter { type: "int" }
+            Parameter { type: "int" }
+        }
+        Method {
+            name: "_q_rowsMoved"
+            Parameter { type: "QModelIndex" }
+            Parameter { type: "int" }
+            Parameter { type: "int" }
+            Parameter { type: "QModelIndex" }
+            Parameter { type: "int" }
+        }
+        Method {
+            name: "_q_dataChanged"
+            Parameter { type: "QModelIndex" }
+            Parameter { type: "QModelIndex" }
+            Parameter { type: "QVector<int>" }
+        }
+        Method {
+            name: "_q_layoutChanged"
+            Parameter { type: "QList<QPersistentModelIndex>" }
+            Parameter { type: "QAbstractItemModel::LayoutChangeHint" }
+        }
+        Method {
+            name: "modelIndex"
+            type: "QVariant"
+            Parameter { name: "idx"; type: "int" }
+        }
+        Method { name: "parentModelIndex"; type: "QVariant" }
+    }
+    Component {
+        name: "QQmlDelegateModelAttached"
+        prototype: "QObject"
+        Property { name: "model"; type: "QQmlDelegateModel"; isReadonly: true; isPointer: true }
+        Property { name: "groups"; type: "QStringList" }
+        Property { name: "isUnresolved"; type: "bool"; isReadonly: true }
+        Signal { name: "unresolvedChanged" }
+    }
+    Component {
+        file: "private/qqmldelegatemodel_p.h"
+        name: "QQmlDelegateModelGroup"
+        prototype: "QObject"
+        exports: ["QtQml.Models/DelegateModelGroup 2.1"]
+        exportMetaObjectRevisions: [1]
+        Property { name: "count"; type: "int"; isReadonly: true }
+        Property { name: "name"; type: "string" }
+        Property { name: "includeByDefault"; type: "bool" }
+        Signal { name: "defaultIncludeChanged" }
+        Signal {
+            name: "changed"
+            Parameter { name: "removed"; type: "QJSValue" }
+            Parameter { name: "inserted"; type: "QJSValue" }
+        }
+        Method {
+            name: "insert"
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "create"
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "resolve"
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "remove"
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "addGroups"
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "removeGroups"
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "setGroups"
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "move"
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "get"
+            type: "QJSValue"
+            Parameter { name: "index"; type: "int" }
+        }
+    }
+    Component {
+        file: "private/qqmlobjectmodel_p.h"
+        name: "QQmlInstanceModel"
+        prototype: "QObject"
+        Property { name: "count"; type: "int"; isReadonly: true }
+        Signal {
+            name: "modelUpdated"
+            Parameter { name: "changeSet"; type: "QQmlChangeSet" }
+            Parameter { name: "reset"; type: "bool" }
+        }
+        Signal {
+            name: "createdItem"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "object"; type: "QObject"; isPointer: true }
+        }
+        Signal {
+            name: "initItem"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "object"; type: "QObject"; isPointer: true }
+        }
+        Signal {
+            name: "destroyingItem"
+            Parameter { name: "object"; type: "QObject"; isPointer: true }
+        }
+        Signal {
+            name: "itemPooled"
+            revision: 15
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "object"; type: "QObject"; isPointer: true }
+        }
+        Signal {
+            name: "itemReused"
+            revision: 15
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "object"; type: "QObject"; isPointer: true }
+        }
+    }
+    Component {
+        file: "private/qqmlinstantiator_p.h"
+        name: "QQmlInstantiator"
+        defaultProperty: "delegate"
+        prototype: "QObject"
+        exports: ["QtQml.Models/Instantiator 2.14"]
+        exportMetaObjectRevisions: [14]
+        Property { name: "active"; type: "bool" }
+        Property { name: "asynchronous"; type: "bool" }
+        Property { name: "model"; type: "QVariant" }
+        Property { name: "count"; type: "int"; isReadonly: true }
+        Property { name: "delegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "object"; type: "QObject"; isReadonly: true; isPointer: true }
+        Signal {
+            name: "objectAdded"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "object"; type: "QObject"; isPointer: true }
+        }
+        Signal {
+            name: "objectRemoved"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "object"; type: "QObject"; isPointer: true }
+        }
+        Method {
+            name: "_q_createdItem"
+            Parameter { type: "int" }
+            Parameter { type: "QObject"; isPointer: true }
+        }
+        Method {
+            name: "_q_modelUpdated"
+            Parameter { type: "QQmlChangeSet" }
+            Parameter { type: "bool" }
+        }
+        Method {
+            name: "objectAt"
+            type: "QObject*"
+            Parameter { name: "index"; type: "int" }
+        }
+    }
+    Component {
+        file: "private/qqmllistmodel_p.h"
+        name: "QQmlListElement"
+        prototype: "QObject"
+        exports: ["QtQml.Models/ListElement 2.1"]
+        exportMetaObjectRevisions: [1]
+    }
+    Component {
+        file: "private/qqmllistmodel_p.h"
+        name: "QQmlListModel"
+        prototype: "QAbstractListModel"
+        exports: ["QtQml.Models/ListModel 2.1", "QtQml.Models/ListModel 2.14"]
+        exportMetaObjectRevisions: [1, 14]
+        Property { name: "count"; type: "int"; isReadonly: true }
+        Property { name: "dynamicRoles"; type: "bool" }
+        Property { name: "agent"; revision: 14; type: "QObject"; isReadonly: true; isPointer: true }
+        Method { name: "clear" }
+        Method {
+            name: "remove"
+            Parameter { name: "args"; type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "append"
+            Parameter { name: "args"; type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "insert"
+            Parameter { name: "args"; type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "get"
+            type: "QJSValue"
+            Parameter { name: "index"; type: "int" }
+        }
+        Method {
+            name: "set"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "value"; type: "QJSValue" }
+        }
+        Method {
+            name: "setProperty"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "property"; type: "string" }
+            Parameter { name: "value"; type: "QVariant" }
+        }
+        Method {
+            name: "move"
+            Parameter { name: "from"; type: "int" }
+            Parameter { name: "to"; type: "int" }
+            Parameter { name: "count"; type: "int" }
+        }
+        Method { name: "sync" }
+    }
+    Component {
+        file: "private/qqmllistmodelworkeragent_p.h"
+        name: "QQmlListModelWorkerAgent"
+        prototype: "QObject"
+        Property { name: "count"; type: "int"; isReadonly: true }
+        Property { name: "engine"; type: "QV4::ExecutionEngine"; isPointer: true }
+        Signal {
+            name: "engineChanged"
+            Parameter { name: "engine"; type: "QV4::ExecutionEngine"; isPointer: true }
+        }
+        Method { name: "addref" }
+        Method { name: "release" }
+        Method { name: "clear" }
+        Method {
+            name: "remove"
+            Parameter { name: "args"; type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "append"
+            Parameter { name: "args"; type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "insert"
+            Parameter { name: "args"; type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "get"
+            type: "QJSValue"
+            Parameter { name: "index"; type: "int" }
+        }
+        Method {
+            name: "set"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "value"; type: "QJSValue" }
+        }
+        Method {
+            name: "setProperty"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "property"; type: "string" }
+            Parameter { name: "value"; type: "QVariant" }
+        }
+        Method {
+            name: "move"
+            Parameter { name: "from"; type: "int" }
+            Parameter { name: "to"; type: "int" }
+            Parameter { name: "count"; type: "int" }
+        }
+        Method { name: "sync" }
+    }
+    Component {
+        file: "private/qqmlobjectmodel_p.h"
+        name: "QQmlObjectModel"
+        defaultProperty: "children"
+        prototype: "QQmlInstanceModel"
+        exports: [
+            "QtQml.Models/ObjectModel 2.1",
+            "QtQml.Models/ObjectModel 2.15",
+            "QtQml.Models/ObjectModel 2.3"
+        ]
+        exportMetaObjectRevisions: [1, 15, 3]
+        attachedType: "QQmlObjectModelAttached"
+        Property { name: "children"; type: "QObject"; isList: true; isReadonly: true }
+        Method { name: "clear"; revision: 3 }
+        Method {
+            name: "get"
+            revision: 3
+            type: "QObject*"
+            Parameter { name: "index"; type: "int" }
+        }
+        Method {
+            name: "append"
+            revision: 3
+            Parameter { name: "object"; type: "QObject"; isPointer: true }
+        }
+        Method {
+            name: "insert"
+            revision: 3
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "object"; type: "QObject"; isPointer: true }
+        }
+        Method {
+            name: "move"
+            revision: 3
+            Parameter { name: "from"; type: "int" }
+            Parameter { name: "to"; type: "int" }
+            Parameter { name: "n"; type: "int" }
+        }
+        Method {
+            name: "move"
+            revision: 3
+            Parameter { name: "from"; type: "int" }
+            Parameter { name: "to"; type: "int" }
+        }
+        Method {
+            name: "remove"
+            revision: 3
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "n"; type: "int" }
+        }
+        Method {
+            name: "remove"
+            revision: 3
+            Parameter { name: "index"; type: "int" }
+        }
+    }
+    Component {
+        name: "QQmlObjectModelAttached"
+        prototype: "QObject"
+        Property { name: "index"; type: "int"; isReadonly: true }
+    }
+    Component {
+        file: "private/qquickpackage_p.h"
+        name: "QQuickPackage"
+        defaultProperty: "data"
+        prototype: "QObject"
+        exports: ["QtQml.Models/Package 2.14"]
+        exportMetaObjectRevisions: [14]
+        attachedType: "QQuickPackageAttached"
+        Property { name: "data"; type: "QObject"; isList: true; isReadonly: true }
+    }
+    Component {
+        name: "QQuickPackageAttached"
+        prototype: "QObject"
+        Property { name: "name"; type: "string" }
+    }
+}
diff --git a/deployment_test/QtQml/Models.2/qmldir b/deployment_test/QtQml/Models.2/qmldir
new file mode 100644
index 0000000000000000000000000000000000000000..2dd20b923e623d686716414607a947d2f3d0a618
--- /dev/null
+++ b/deployment_test/QtQml/Models.2/qmldir
@@ -0,0 +1,4 @@
+module QtQml.Models
+plugin modelsplugin
+classname QtQmlModelsPlugin
+designersupported
diff --git a/deployment_test/QtQml/RemoteObjects/plugins.qmltypes b/deployment_test/QtQml/RemoteObjects/plugins.qmltypes
new file mode 100644
index 0000000000000000000000000000000000000000..24397152a4a70684428e14d90c41b83832796cfd
--- /dev/null
+++ b/deployment_test/QtQml/RemoteObjects/plugins.qmltypes
@@ -0,0 +1,75 @@
+import QtQuick.tooling 1.2
+
+// This file describes the plugin-supplied types contained in the library.
+// It is used for QML tooling purposes only.
+//
+// This file was auto-generated by:
+// 'qmlplugindump -nonrelocatable QtQml.RemoteObjects 1.0'
+
+Module {
+    dependencies: ["QtQuick 2.0"]
+    Component {
+        name: "QRemoteObjectAbstractPersistedStore"
+        prototype: "QObject"
+        exports: ["QtQml.RemoteObjects/PersistedStore 1.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+    }
+    Component {
+        name: "QRemoteObjectNode"
+        prototype: "QObject"
+        exports: ["QtQml.RemoteObjects/Node 1.0"]
+        exportMetaObjectRevisions: [0]
+        Enum {
+            name: "ErrorCode"
+            values: {
+                "NoError": 0,
+                "RegistryNotAcquired": 1,
+                "RegistryAlreadyHosted": 2,
+                "NodeIsNoServer": 3,
+                "ServerAlreadyCreated": 4,
+                "UnintendedRegistryHosting": 5,
+                "OperationNotValidOnClientNode": 6,
+                "SourceNotRegistered": 7,
+                "MissingObjectName": 8,
+                "HostUrlInvalid": 9,
+                "ProtocolMismatch": 10,
+                "ListenFailed": 11
+            }
+        }
+        Property { name: "registryUrl"; type: "QUrl" }
+        Property {
+            name: "persistedStore"
+            type: "QRemoteObjectAbstractPersistedStore"
+            isPointer: true
+        }
+        Property { name: "heartbeatInterval"; type: "int" }
+        Signal {
+            name: "remoteObjectAdded"
+            Parameter { type: "QRemoteObjectSourceLocation" }
+        }
+        Signal {
+            name: "remoteObjectRemoved"
+            Parameter { type: "QRemoteObjectSourceLocation" }
+        }
+        Signal {
+            name: "error"
+            Parameter { name: "errorCode"; type: "QRemoteObjectNode::ErrorCode" }
+        }
+        Signal {
+            name: "heartbeatIntervalChanged"
+            Parameter { name: "heartbeatInterval"; type: "int" }
+        }
+        Method {
+            name: "connectToNode"
+            type: "bool"
+            Parameter { name: "address"; type: "QUrl" }
+        }
+    }
+    Component {
+        name: "QRemoteObjectSettingsStore"
+        prototype: "QRemoteObjectAbstractPersistedStore"
+        exports: ["QtQml.RemoteObjects/SettingsStore 1.0"]
+        exportMetaObjectRevisions: [0]
+    }
+}
diff --git a/deployment_test/QtQml/RemoteObjects/qmldir b/deployment_test/QtQml/RemoteObjects/qmldir
new file mode 100644
index 0000000000000000000000000000000000000000..e6f2c537bc40ec8629f386abc499961f14b7a571
--- /dev/null
+++ b/deployment_test/QtQml/RemoteObjects/qmldir
@@ -0,0 +1,3 @@
+module QtQml.RemoteObjects
+plugin qtqmlremoteobjects
+classname QtQmlRemoteObjectsPlugin
diff --git a/deployment_test/QtQml/RemoteObjects/qtqmlremoteobjects.dll b/deployment_test/QtQml/RemoteObjects/qtqmlremoteobjects.dll
new file mode 100644
index 0000000000000000000000000000000000000000..1bf4f19734e30f7ec55c4e29a6d545c8143d22fa
Binary files /dev/null and b/deployment_test/QtQml/RemoteObjects/qtqmlremoteobjects.dll differ
diff --git a/deployment_test/QtQml/StateMachine/plugins.qmltypes b/deployment_test/QtQml/StateMachine/plugins.qmltypes
new file mode 100644
index 0000000000000000000000000000000000000000..0f602118d60f5687117e30ab1a5c164e31fd8d3d
--- /dev/null
+++ b/deployment_test/QtQml/StateMachine/plugins.qmltypes
@@ -0,0 +1,176 @@
+import QtQuick.tooling 1.2
+
+// This file describes the plugin-supplied types contained in the library.
+// It is used for QML tooling purposes only.
+//
+// This file was auto-generated by qmltyperegistrar.
+
+Module {
+    dependencies: []
+    Component {
+        file: "finalstate.h"
+        name: "FinalState"
+        defaultProperty: "children"
+        prototype: "QFinalState"
+        exports: ["QtQml.StateMachine/FinalState 1.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "children"; type: "QObject"; isList: true; isReadonly: true }
+    }
+    Component {
+        file: "statemachineforeign.h"
+        name: "QAbstractState"
+        prototype: "QObject"
+        exports: ["QtQml.StateMachine/QAbstractState 1.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        Property { name: "active"; type: "bool"; isReadonly: true }
+        Signal { name: "entered" }
+        Signal { name: "exited" }
+        Signal {
+            name: "activeChanged"
+            Parameter { name: "active"; type: "bool" }
+        }
+    }
+    Component {
+        name: "QAbstractTransition"
+        prototype: "QObject"
+        Enum {
+            name: "TransitionType"
+            values: ["ExternalTransition", "InternalTransition"]
+        }
+        Property { name: "sourceState"; type: "QState"; isReadonly: true; isPointer: true }
+        Property { name: "targetState"; type: "QAbstractState"; isPointer: true }
+        Property { name: "targetStates"; type: "QList<QAbstractState*>" }
+        Property { name: "transitionType"; revision: 1; type: "TransitionType" }
+        Signal { name: "triggered" }
+    }
+    Component { name: "QFinalState"; prototype: "QAbstractState" }
+    Component {
+        file: "statemachineforeign.h"
+        name: "QHistoryState"
+        prototype: "QAbstractState"
+        exports: ["QtQml.StateMachine/HistoryState 1.0"]
+        exportMetaObjectRevisions: [0]
+        Enum {
+            name: "HistoryType"
+            values: ["ShallowHistory", "DeepHistory"]
+        }
+        Property { name: "defaultState"; type: "QAbstractState"; isPointer: true }
+        Property { name: "defaultTransition"; type: "QAbstractTransition"; isPointer: true }
+        Property { name: "historyType"; type: "HistoryType" }
+    }
+    Component {
+        file: "statemachineforeign.h"
+        name: "QSignalTransition"
+        prototype: "QAbstractTransition"
+        exports: [
+            "QtQml.StateMachine/QSignalTransition 1.0",
+            "QtQml.StateMachine/QSignalTransition 1.1"
+        ]
+        isCreatable: false
+        exportMetaObjectRevisions: [0, 1]
+        Property { name: "senderObject"; type: "QObject"; isPointer: true }
+        Property { name: "signal"; type: "QByteArray" }
+    }
+    Component {
+        file: "statemachineforeign.h"
+        name: "QState"
+        prototype: "QAbstractState"
+        exports: ["QtQml.StateMachine/QState 1.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        Enum {
+            name: "ChildMode"
+            values: ["ExclusiveStates", "ParallelStates"]
+        }
+        Enum {
+            name: "RestorePolicy"
+            values: ["DontRestoreProperties", "RestoreProperties"]
+        }
+        Property { name: "initialState"; type: "QAbstractState"; isPointer: true }
+        Property { name: "errorState"; type: "QAbstractState"; isPointer: true }
+        Property { name: "childMode"; type: "ChildMode" }
+        Signal { name: "finished" }
+        Signal { name: "propertiesAssigned" }
+    }
+    Component {
+        name: "QStateMachine"
+        prototype: "QState"
+        Property { name: "errorString"; type: "string"; isReadonly: true }
+        Property { name: "globalRestorePolicy"; type: "QState::RestorePolicy" }
+        Property { name: "running"; type: "bool" }
+        Property { name: "animated"; type: "bool" }
+        Signal { name: "started" }
+        Signal { name: "stopped" }
+        Signal {
+            name: "runningChanged"
+            Parameter { name: "running"; type: "bool" }
+        }
+        Method { name: "start" }
+        Method { name: "stop" }
+        Method {
+            name: "setRunning"
+            Parameter { name: "running"; type: "bool" }
+        }
+        Method { name: "_q_start" }
+        Method { name: "_q_process" }
+        Method { name: "_q_animationFinished" }
+        Method {
+            name: "_q_startDelayedEventTimer"
+            Parameter { type: "int" }
+            Parameter { type: "int" }
+        }
+        Method {
+            name: "_q_killDelayedEventTimer"
+            Parameter { type: "int" }
+            Parameter { type: "int" }
+        }
+    }
+    Component {
+        file: "signaltransition.h"
+        name: "SignalTransition"
+        prototype: "QSignalTransition"
+        exports: [
+            "QtQml.StateMachine/SignalTransition 1.0",
+            "QtQml.StateMachine/SignalTransition 1.1"
+        ]
+        exportMetaObjectRevisions: [0, 1]
+        Property { name: "signal"; type: "QJSValue" }
+        Property { name: "guard"; type: "QQmlScriptString" }
+        Signal { name: "invokeYourself" }
+        Signal { name: "qmlSignalChanged" }
+        Method { name: "invoke" }
+    }
+    Component {
+        file: "state.h"
+        name: "State"
+        defaultProperty: "children"
+        prototype: "QState"
+        exports: ["QtQml.StateMachine/State 1.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "children"; type: "QObject"; isList: true; isReadonly: true }
+    }
+    Component {
+        file: "statemachine.h"
+        name: "StateMachine"
+        defaultProperty: "children"
+        prototype: "QStateMachine"
+        exports: ["QtQml.StateMachine/StateMachine 1.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "children"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "running"; type: "bool" }
+        Signal { name: "qmlRunningChanged" }
+        Method { name: "checkChildMode" }
+    }
+    Component {
+        file: "timeouttransition.h"
+        name: "TimeoutTransition"
+        prototype: "QSignalTransition"
+        exports: [
+            "QtQml.StateMachine/TimeoutTransition 1.0",
+            "QtQml.StateMachine/TimeoutTransition 1.1"
+        ]
+        exportMetaObjectRevisions: [0, 1]
+        Property { name: "timeout"; type: "int" }
+    }
+}
diff --git a/deployment_test/QtQml/StateMachine/qmldir b/deployment_test/QtQml/StateMachine/qmldir
new file mode 100644
index 0000000000000000000000000000000000000000..8bc383120806823ca932661ab04696e1924f6ff1
--- /dev/null
+++ b/deployment_test/QtQml/StateMachine/qmldir
@@ -0,0 +1,4 @@
+module QtQml.StateMachine
+plugin qtqmlstatemachine
+classname QtQmlStateMachinePlugin
+typeinfo plugins.qmltypes
diff --git a/deployment_test/QtQml/StateMachine/qtqmlstatemachine.dll b/deployment_test/QtQml/StateMachine/qtqmlstatemachine.dll
new file mode 100644
index 0000000000000000000000000000000000000000..82498e193ebfae71a013d38d06ac4b1abdc9facb
Binary files /dev/null and b/deployment_test/QtQml/StateMachine/qtqmlstatemachine.dll differ
diff --git a/deployment_test/QtQml/WorkerScript.2/plugins.qmltypes b/deployment_test/QtQml/WorkerScript.2/plugins.qmltypes
new file mode 100644
index 0000000000000000000000000000000000000000..057136bc1a36b75b5293f09c7be92fbdf5ffde24
--- /dev/null
+++ b/deployment_test/QtQml/WorkerScript.2/plugins.qmltypes
@@ -0,0 +1,31 @@
+import QtQuick.tooling 1.2
+
+// This file describes the plugin-supplied types contained in the library.
+// It is used for QML tooling purposes only.
+//
+// This file was auto-generated by qmltyperegistrar.
+
+Module {
+    dependencies: []
+    Component {
+        file: "private/qquickworkerscript_p.h"
+        name: "QQuickWorkerScript"
+        prototype: "QObject"
+        exports: [
+            "QtQml.WorkerScript/WorkerScript 2.0",
+            "QtQml.WorkerScript/WorkerScript 2.15"
+        ]
+        exportMetaObjectRevisions: [0, 15]
+        Property { name: "source"; type: "QUrl" }
+        Property { name: "ready"; revision: 15; type: "bool"; isReadonly: true }
+        Signal { name: "readyChanged"; revision: 15 }
+        Signal {
+            name: "message"
+            Parameter { name: "messageObject"; type: "QJSValue" }
+        }
+        Method {
+            name: "sendMessage"
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+    }
+}
diff --git a/deployment_test/QtQml/WorkerScript.2/qmldir b/deployment_test/QtQml/WorkerScript.2/qmldir
new file mode 100644
index 0000000000000000000000000000000000000000..1606400a231d2066e01dce45d767908113ed3371
--- /dev/null
+++ b/deployment_test/QtQml/WorkerScript.2/qmldir
@@ -0,0 +1,3 @@
+module QtQml.WorkerScript
+plugin workerscriptplugin
+classname QtQmlWorkerScriptPlugin
diff --git a/deployment_test/QtQml/WorkerScript.2/workerscriptplugin.dll b/deployment_test/QtQml/WorkerScript.2/workerscriptplugin.dll
new file mode 100644
index 0000000000000000000000000000000000000000..aecf63719af276231ef8bdbb2eda63de27e965f7
Binary files /dev/null and b/deployment_test/QtQml/WorkerScript.2/workerscriptplugin.dll differ
diff --git a/deployment_test/QtQml/plugins.qmltypes b/deployment_test/QtQml/plugins.qmltypes
new file mode 100644
index 0000000000000000000000000000000000000000..b73940aa7d457f624143c28303b9a0d1ba62897e
--- /dev/null
+++ b/deployment_test/QtQml/plugins.qmltypes
@@ -0,0 +1,279 @@
+import QtQuick.tooling 1.2
+
+// This file describes the plugin-supplied types contained in the library.
+// It is used for QML tooling purposes only.
+//
+// This file was auto-generated by qmltyperegistrar.
+
+Module {
+    dependencies: []
+    Component {
+        file: "private/qqmlengine_p.h"
+        name: "QObject"
+        exports: ["QML/QtObject 1.0", "QtQml/QtObject 2.0"]
+        exportMetaObjectRevisions: [0, 0]
+        Property { name: "objectName"; type: "string" }
+        Signal {
+            name: "objectNameChanged"
+            Parameter { name: "objectName"; type: "string" }
+        }
+        Method {
+            name: "_q_reregisterTimers"
+            Parameter { type: "void"; isPointer: true }
+        }
+        Method { name: "toString" }
+        Method { name: "destroy" }
+        Method {
+            name: "destroy"
+            Parameter { name: "delay"; type: "int" }
+        }
+    }
+    Component {
+        file: "private/qqmlbind_p.h"
+        name: "QQmlBind"
+        prototype: "QObject"
+        exports: [
+            "QtQml/Binding 2.0",
+            "QtQml/Binding 2.14",
+            "QtQml/Binding 2.8"
+        ]
+        exportMetaObjectRevisions: [0, 14, 8]
+        Enum {
+            name: "RestorationMode"
+            values: [
+                "RestoreNone",
+                "RestoreBinding",
+                "RestoreValue",
+                "RestoreBindingOrValue"
+            ]
+        }
+        Property { name: "target"; type: "QObject"; isPointer: true }
+        Property { name: "property"; type: "string" }
+        Property { name: "value"; type: "QJSValue" }
+        Property { name: "when"; type: "bool" }
+        Property { name: "delayed"; revision: 8; type: "bool" }
+        Property { name: "restoreMode"; revision: 14; type: "RestorationMode" }
+        Method { name: "targetValueChanged" }
+    }
+    Component {
+        file: "qqmlcomponent.h"
+        name: "QQmlComponent"
+        prototype: "QObject"
+        exports: ["QML/Component 1.0", "QtQml/Component 2.0"]
+        exportMetaObjectRevisions: [0, 0]
+        attachedType: "QQmlComponentAttached"
+        Enum {
+            name: "CompilationMode"
+            values: ["PreferSynchronous", "Asynchronous"]
+        }
+        Enum {
+            name: "Status"
+            values: ["Null", "Ready", "Loading", "Error"]
+        }
+        Property { name: "progress"; type: "double"; isReadonly: true }
+        Property { name: "status"; type: "Status"; isReadonly: true }
+        Property { name: "url"; type: "QUrl"; isReadonly: true }
+        Signal {
+            name: "statusChanged"
+            Parameter { type: "QQmlComponent::Status" }
+        }
+        Signal {
+            name: "progressChanged"
+            Parameter { type: "double" }
+        }
+        Method {
+            name: "loadUrl"
+            Parameter { name: "url"; type: "QUrl" }
+        }
+        Method {
+            name: "loadUrl"
+            Parameter { name: "url"; type: "QUrl" }
+            Parameter { name: "mode"; type: "CompilationMode" }
+        }
+        Method {
+            name: "setData"
+            Parameter { type: "QByteArray" }
+            Parameter { name: "baseUrl"; type: "QUrl" }
+        }
+        Method { name: "errorString"; type: "string" }
+        Method {
+            name: "createObject"
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "incubateObject"
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+    }
+    Component {
+        file: "private/qqmlcomponentattached_p.h"
+        name: "QQmlComponentAttached"
+        prototype: "QObject"
+        Signal { name: "completed" }
+        Signal { name: "destruction" }
+    }
+    Component {
+        file: "private/qqmlconnections_p.h"
+        name: "QQmlConnections"
+        prototype: "QObject"
+        exports: ["QtQml/Connections 2.0", "QtQml/Connections 2.3"]
+        exportMetaObjectRevisions: [0, 3]
+        Property { name: "target"; type: "QObject"; isPointer: true }
+        Property { name: "enabled"; revision: 3; type: "bool" }
+        Property { name: "ignoreUnknownSignals"; type: "bool" }
+        Signal { name: "enabledChanged"; revision: 3 }
+    }
+    Component {
+        file: "private/qqmlvaluetype_p.h"
+        name: "QQmlEasingValueType"
+        exports: ["QtQml/Easing 2.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        Enum {
+            name: "Type"
+            values: [
+                "Linear",
+                "InQuad",
+                "OutQuad",
+                "InOutQuad",
+                "OutInQuad",
+                "InCubic",
+                "OutCubic",
+                "InOutCubic",
+                "OutInCubic",
+                "InQuart",
+                "OutQuart",
+                "InOutQuart",
+                "OutInQuart",
+                "InQuint",
+                "OutQuint",
+                "InOutQuint",
+                "OutInQuint",
+                "InSine",
+                "OutSine",
+                "InOutSine",
+                "OutInSine",
+                "InExpo",
+                "OutExpo",
+                "InOutExpo",
+                "OutInExpo",
+                "InCirc",
+                "OutCirc",
+                "InOutCirc",
+                "OutInCirc",
+                "InElastic",
+                "OutElastic",
+                "InOutElastic",
+                "OutInElastic",
+                "InBack",
+                "OutBack",
+                "InOutBack",
+                "OutInBack",
+                "InBounce",
+                "OutBounce",
+                "InOutBounce",
+                "OutInBounce",
+                "InCurve",
+                "OutCurve",
+                "SineCurve",
+                "CosineCurve",
+                "Bezier"
+            ]
+        }
+        Property { name: "type"; type: "QQmlEasingValueType::Type" }
+        Property { name: "amplitude"; type: "double" }
+        Property { name: "overshoot"; type: "double" }
+        Property { name: "period"; type: "double" }
+        Property { name: "bezierCurve"; type: "QVariantList" }
+    }
+    Component {
+        file: "private/qqmllocale_p.h"
+        name: "QQmlLocale"
+        exports: ["QtQml/Locale 2.2"]
+        isCreatable: false
+        exportMetaObjectRevisions: [2]
+        Enum {
+            name: "MeasurementSystem"
+            values: [
+                "MetricSystem",
+                "ImperialSystem",
+                "ImperialUSSystem",
+                "ImperialUKSystem"
+            ]
+        }
+        Enum {
+            name: "FormatType"
+            values: ["LongFormat", "ShortFormat", "NarrowFormat"]
+        }
+        Enum {
+            name: "CurrencySymbolFormat"
+            values: [
+                "CurrencyIsoCode",
+                "CurrencySymbol",
+                "CurrencyDisplayName"
+            ]
+        }
+        Enum {
+            name: "DayOfWeek"
+            values: [
+                "Sunday",
+                "Monday",
+                "Tuesday",
+                "Wednesday",
+                "Thursday",
+                "Friday",
+                "Saturday"
+            ]
+        }
+        Enum {
+            name: "NumberOptions"
+            values: [
+                "DefaultNumberOptions",
+                "OmitGroupSeparator",
+                "RejectGroupSeparator",
+                "OmitLeadingZeroInExponent",
+                "RejectLeadingZeroInExponent",
+                "IncludeTrailingZeroesAfterDot",
+                "RejectTrailingZeroesAfterDot"
+            ]
+        }
+    }
+    Component {
+        file: "private/qqmlloggingcategory_p.h"
+        name: "QQmlLoggingCategory"
+        prototype: "QObject"
+        exports: ["QtQml/LoggingCategory 2.12", "QtQml/LoggingCategory 2.8"]
+        exportMetaObjectRevisions: [12, 8]
+        Enum {
+            name: "DefaultLogLevel"
+            values: ["Debug", "Info", "Warning", "Critical", "Fatal"]
+        }
+        Property { name: "name"; type: "string" }
+        Property { name: "defaultLogLevel"; revision: 12; type: "DefaultLogLevel" }
+    }
+    Component {
+        file: "private/qqmltimer_p.h"
+        name: "QQmlTimer"
+        prototype: "QObject"
+        exports: ["QtQml/Timer 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "interval"; type: "int" }
+        Property { name: "running"; type: "bool" }
+        Property { name: "repeat"; type: "bool" }
+        Property { name: "triggeredOnStart"; type: "bool" }
+        Property { name: "parent"; type: "QObject"; isReadonly: true; isPointer: true }
+        Signal { name: "triggered" }
+        Method { name: "start" }
+        Method { name: "stop" }
+        Method { name: "restart" }
+        Method { name: "ticked" }
+    }
+    Component {
+        file: "private/qqmltypenotavailable_p.h"
+        name: "QQmlTypeNotAvailable"
+        prototype: "QObject"
+        exports: ["QtQml/TypeNotAvailable 2.15"]
+        isCreatable: false
+        exportMetaObjectRevisions: [15]
+    }
+}
diff --git a/deployment_test/QtQml/qmldir b/deployment_test/QtQml/qmldir
new file mode 100644
index 0000000000000000000000000000000000000000..98555ee1c7ab769fe6cc3d6c3de27b5839cfdb71
--- /dev/null
+++ b/deployment_test/QtQml/qmldir
@@ -0,0 +1,6 @@
+module QtQml
+plugin qmlplugin
+classname QtQmlPlugin
+depends QtQml.Models 2.15
+depends QtQml.WorkerScript 2.15
+typeinfo plugins.qmltypes
diff --git a/deployment_test/QtQml/qmlplugin.dll b/deployment_test/QtQml/qmlplugin.dll
new file mode 100644
index 0000000000000000000000000000000000000000..a31b736251914ad856f805c2eb0ba6ba49b2b3fe
Binary files /dev/null and b/deployment_test/QtQml/qmlplugin.dll differ
diff --git a/deployment_test/QtQuick.2/plugins.qmltypes b/deployment_test/QtQuick.2/plugins.qmltypes
new file mode 100644
index 0000000000000000000000000000000000000000..9ca13f76817c597ae6366a2bdd65fe004ff8958e
--- /dev/null
+++ b/deployment_test/QtQuick.2/plugins.qmltypes
@@ -0,0 +1,5294 @@
+import QtQuick.tooling 1.2
+
+// This file describes the plugin-supplied types contained in the library.
+// It is used for QML tooling purposes only.
+//
+// This file was auto-generated by qmltyperegistrar.
+
+Module {
+    dependencies: []
+    Component {
+        name: "QDoubleValidator"
+        prototype: "QValidator"
+        Enum {
+            name: "Notation"
+            values: ["StandardNotation", "ScientificNotation"]
+        }
+        Property { name: "bottom"; type: "double" }
+        Property { name: "top"; type: "double" }
+        Property { name: "decimals"; type: "int" }
+        Property { name: "notation"; type: "Notation" }
+        Signal {
+            name: "bottomChanged"
+            Parameter { name: "bottom"; type: "double" }
+        }
+        Signal {
+            name: "topChanged"
+            Parameter { name: "top"; type: "double" }
+        }
+        Signal {
+            name: "decimalsChanged"
+            Parameter { name: "decimals"; type: "int" }
+        }
+        Signal {
+            name: "notationChanged"
+            Parameter { name: "notation"; type: "QDoubleValidator::Notation" }
+        }
+    }
+    Component {
+        file: "private/qquickforeignutils_p.h"
+        name: "QInputMethod"
+        prototype: "QObject"
+        exports: ["QtQuick/InputMethod 2.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        Enum {
+            name: "Action"
+            values: ["Click", "ContextMenu"]
+        }
+        Property { name: "cursorRectangle"; type: "QRectF"; isReadonly: true }
+        Property { name: "anchorRectangle"; type: "QRectF"; isReadonly: true }
+        Property { name: "keyboardRectangle"; type: "QRectF"; isReadonly: true }
+        Property { name: "inputItemClipRectangle"; type: "QRectF"; isReadonly: true }
+        Property { name: "visible"; type: "bool"; isReadonly: true }
+        Property { name: "animating"; type: "bool"; isReadonly: true }
+        Property { name: "locale"; type: "QLocale"; isReadonly: true }
+        Property { name: "inputDirection"; type: "Qt::LayoutDirection"; isReadonly: true }
+        Signal {
+            name: "inputDirectionChanged"
+            Parameter { name: "newDirection"; type: "Qt::LayoutDirection" }
+        }
+        Method { name: "show" }
+        Method { name: "hide" }
+        Method {
+            name: "update"
+            Parameter { name: "queries"; type: "Qt::InputMethodQueries" }
+        }
+        Method { name: "reset" }
+        Method { name: "commit" }
+        Method {
+            name: "invokeAction"
+            Parameter { name: "a"; type: "Action" }
+            Parameter { name: "cursorPosition"; type: "int" }
+        }
+    }
+    Component {
+        name: "QIntValidator"
+        prototype: "QValidator"
+        Property { name: "bottom"; type: "int" }
+        Property { name: "top"; type: "int" }
+        Signal {
+            name: "bottomChanged"
+            Parameter { name: "bottom"; type: "int" }
+        }
+        Signal {
+            name: "topChanged"
+            Parameter { name: "top"; type: "int" }
+        }
+    }
+    Component {
+        file: "private/qquickforeignutils_p.h"
+        name: "QKeySequence"
+        exports: ["QtQuick/StandardKey 2.2"]
+        isCreatable: false
+        exportMetaObjectRevisions: [2]
+        Enum {
+            name: "StandardKey"
+            values: [
+                "UnknownKey",
+                "HelpContents",
+                "WhatsThis",
+                "Open",
+                "Close",
+                "Save",
+                "New",
+                "Delete",
+                "Cut",
+                "Copy",
+                "Paste",
+                "Undo",
+                "Redo",
+                "Back",
+                "Forward",
+                "Refresh",
+                "ZoomIn",
+                "ZoomOut",
+                "Print",
+                "AddTab",
+                "NextChild",
+                "PreviousChild",
+                "Find",
+                "FindNext",
+                "FindPrevious",
+                "Replace",
+                "SelectAll",
+                "Bold",
+                "Italic",
+                "Underline",
+                "MoveToNextChar",
+                "MoveToPreviousChar",
+                "MoveToNextWord",
+                "MoveToPreviousWord",
+                "MoveToNextLine",
+                "MoveToPreviousLine",
+                "MoveToNextPage",
+                "MoveToPreviousPage",
+                "MoveToStartOfLine",
+                "MoveToEndOfLine",
+                "MoveToStartOfBlock",
+                "MoveToEndOfBlock",
+                "MoveToStartOfDocument",
+                "MoveToEndOfDocument",
+                "SelectNextChar",
+                "SelectPreviousChar",
+                "SelectNextWord",
+                "SelectPreviousWord",
+                "SelectNextLine",
+                "SelectPreviousLine",
+                "SelectNextPage",
+                "SelectPreviousPage",
+                "SelectStartOfLine",
+                "SelectEndOfLine",
+                "SelectStartOfBlock",
+                "SelectEndOfBlock",
+                "SelectStartOfDocument",
+                "SelectEndOfDocument",
+                "DeleteStartOfWord",
+                "DeleteEndOfWord",
+                "DeleteEndOfLine",
+                "InsertParagraphSeparator",
+                "InsertLineSeparator",
+                "SaveAs",
+                "Preferences",
+                "Quit",
+                "FullScreen",
+                "Deselect",
+                "DeleteCompleteLine",
+                "Backspace",
+                "Cancel"
+            ]
+        }
+    }
+    Component {
+        file: "private/qquickitemsmodule_p.h"
+        name: "QPointingDeviceUniqueId"
+        exports: ["QtQuick/PointingDeviceUniqueId 2.9"]
+        isCreatable: false
+        exportMetaObjectRevisions: [9]
+        Property { name: "numericId"; type: "qlonglong"; isReadonly: true }
+    }
+    Component {
+        name: "QQmlApplication"
+        prototype: "QObject"
+        Property { name: "arguments"; type: "QStringList"; isReadonly: true }
+        Property { name: "name"; type: "string" }
+        Property { name: "version"; type: "string" }
+        Property { name: "organization"; type: "string" }
+        Property { name: "domain"; type: "string" }
+        Signal { name: "aboutToQuit" }
+        Method {
+            name: "setName"
+            Parameter { name: "arg"; type: "string" }
+        }
+        Method {
+            name: "setVersion"
+            Parameter { name: "arg"; type: "string" }
+        }
+        Method {
+            name: "setOrganization"
+            Parameter { name: "arg"; type: "string" }
+        }
+        Method {
+            name: "setDomain"
+            Parameter { name: "arg"; type: "string" }
+        }
+    }
+    Component {
+        file: "private/qquickanimation_p.h"
+        name: "QQuickAbstractAnimation"
+        prototype: "QObject"
+        exports: ["QtQuick/Animation 2.0", "QtQuick/Animation 2.12"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0, 12]
+        Enum {
+            name: "Loops"
+            values: ["Infinite"]
+        }
+        Property { name: "running"; type: "bool" }
+        Property { name: "paused"; type: "bool" }
+        Property { name: "alwaysRunToEnd"; type: "bool" }
+        Property { name: "loops"; type: "int" }
+        Signal { name: "started" }
+        Signal { name: "stopped" }
+        Signal {
+            name: "runningChanged"
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "pausedChanged"
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "alwaysRunToEndChanged"
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "loopCountChanged"
+            Parameter { type: "int" }
+        }
+        Signal { name: "finished"; revision: 12 }
+        Method { name: "restart" }
+        Method { name: "start" }
+        Method { name: "pause" }
+        Method { name: "resume" }
+        Method { name: "stop" }
+        Method { name: "complete" }
+        Method { name: "componentFinalized" }
+    }
+    Component {
+        file: "private/qquickaccessibleattached_p.h"
+        name: "QQuickAccessibleAttached"
+        prototype: "QObject"
+        exports: ["QtQuick/Accessible 2.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        attachedType: "QQuickAccessibleAttached"
+        Property { name: "role"; type: "QAccessible::Role" }
+        Property { name: "name"; type: "string" }
+        Property { name: "description"; type: "string" }
+        Property { name: "ignored"; type: "bool" }
+        Property { name: "checkable"; type: "bool" }
+        Property { name: "checked"; type: "bool" }
+        Property { name: "editable"; type: "bool" }
+        Property { name: "focusable"; type: "bool" }
+        Property { name: "focused"; type: "bool" }
+        Property { name: "multiLine"; type: "bool" }
+        Property { name: "readOnly"; type: "bool" }
+        Property { name: "selected"; type: "bool" }
+        Property { name: "selectable"; type: "bool" }
+        Property { name: "pressed"; type: "bool" }
+        Property { name: "checkStateMixed"; type: "bool" }
+        Property { name: "defaultButton"; type: "bool" }
+        Property { name: "passwordEdit"; type: "bool" }
+        Property { name: "selectableText"; type: "bool" }
+        Property { name: "searchEdit"; type: "bool" }
+        Signal {
+            name: "checkableChanged"
+            Parameter { name: "arg"; type: "bool" }
+        }
+        Signal {
+            name: "checkedChanged"
+            Parameter { name: "arg"; type: "bool" }
+        }
+        Signal {
+            name: "editableChanged"
+            Parameter { name: "arg"; type: "bool" }
+        }
+        Signal {
+            name: "focusableChanged"
+            Parameter { name: "arg"; type: "bool" }
+        }
+        Signal {
+            name: "focusedChanged"
+            Parameter { name: "arg"; type: "bool" }
+        }
+        Signal {
+            name: "multiLineChanged"
+            Parameter { name: "arg"; type: "bool" }
+        }
+        Signal {
+            name: "readOnlyChanged"
+            Parameter { name: "arg"; type: "bool" }
+        }
+        Signal {
+            name: "selectedChanged"
+            Parameter { name: "arg"; type: "bool" }
+        }
+        Signal {
+            name: "selectableChanged"
+            Parameter { name: "arg"; type: "bool" }
+        }
+        Signal {
+            name: "pressedChanged"
+            Parameter { name: "arg"; type: "bool" }
+        }
+        Signal {
+            name: "checkStateMixedChanged"
+            Parameter { name: "arg"; type: "bool" }
+        }
+        Signal {
+            name: "defaultButtonChanged"
+            Parameter { name: "arg"; type: "bool" }
+        }
+        Signal {
+            name: "passwordEditChanged"
+            Parameter { name: "arg"; type: "bool" }
+        }
+        Signal {
+            name: "selectableTextChanged"
+            Parameter { name: "arg"; type: "bool" }
+        }
+        Signal {
+            name: "searchEditChanged"
+            Parameter { name: "arg"; type: "bool" }
+        }
+        Signal { name: "pressAction" }
+        Signal { name: "toggleAction" }
+        Signal { name: "increaseAction" }
+        Signal { name: "decreaseAction" }
+        Signal { name: "scrollUpAction" }
+        Signal { name: "scrollDownAction" }
+        Signal { name: "scrollLeftAction" }
+        Signal { name: "scrollRightAction" }
+        Signal { name: "previousPageAction" }
+        Signal { name: "nextPageAction" }
+        Method { name: "valueChanged" }
+        Method { name: "cursorPositionChanged" }
+        Method {
+            name: "setIgnored"
+            Parameter { name: "ignored"; type: "bool" }
+        }
+    }
+    Component {
+        file: "private/qquickitemanimation_p.h"
+        name: "QQuickAnchorAnimation"
+        prototype: "QQuickAbstractAnimation"
+        exports: [
+            "QtQuick/AnchorAnimation 2.0",
+            "QtQuick/AnchorAnimation 2.12"
+        ]
+        exportMetaObjectRevisions: [0, 12]
+        Property { name: "targets"; type: "QQuickItem"; isList: true; isReadonly: true }
+        Property { name: "duration"; type: "int" }
+        Property { name: "easing"; type: "QEasingCurve" }
+        Signal {
+            name: "durationChanged"
+            Parameter { type: "int" }
+        }
+        Signal {
+            name: "easingChanged"
+            Parameter { type: "QEasingCurve" }
+        }
+    }
+    Component {
+        file: "private/qquickstateoperations_p.h"
+        name: "QQuickAnchorChanges"
+        prototype: "QQuickStateOperation"
+        exports: ["QtQuick/AnchorChanges 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "target"; type: "QQuickItem"; isPointer: true }
+        Property { name: "anchors"; type: "QQuickAnchorSet"; isReadonly: true; isPointer: true }
+    }
+    Component {
+        file: "private/qquickstateoperations_p.h"
+        name: "QQuickAnchorSet"
+        prototype: "QObject"
+        Property { name: "left"; type: "QQmlScriptString" }
+        Property { name: "right"; type: "QQmlScriptString" }
+        Property { name: "horizontalCenter"; type: "QQmlScriptString" }
+        Property { name: "top"; type: "QQmlScriptString" }
+        Property { name: "bottom"; type: "QQmlScriptString" }
+        Property { name: "verticalCenter"; type: "QQmlScriptString" }
+        Property { name: "baseline"; type: "QQmlScriptString" }
+    }
+    Component {
+        file: "private/qquickanchors_p.h"
+        name: "QQuickAnchors"
+        prototype: "QObject"
+        Enum {
+            name: "Anchors"
+            alias: "Anchor"
+            isFlag: true
+            values: [
+                "InvalidAnchor",
+                "LeftAnchor",
+                "RightAnchor",
+                "TopAnchor",
+                "BottomAnchor",
+                "HCenterAnchor",
+                "VCenterAnchor",
+                "BaselineAnchor",
+                "Horizontal_Mask",
+                "Vertical_Mask"
+            ]
+        }
+        Property { name: "left"; type: "QQuickAnchorLine" }
+        Property { name: "right"; type: "QQuickAnchorLine" }
+        Property { name: "horizontalCenter"; type: "QQuickAnchorLine" }
+        Property { name: "top"; type: "QQuickAnchorLine" }
+        Property { name: "bottom"; type: "QQuickAnchorLine" }
+        Property { name: "verticalCenter"; type: "QQuickAnchorLine" }
+        Property { name: "baseline"; type: "QQuickAnchorLine" }
+        Property { name: "margins"; type: "double" }
+        Property { name: "leftMargin"; type: "double" }
+        Property { name: "rightMargin"; type: "double" }
+        Property { name: "horizontalCenterOffset"; type: "double" }
+        Property { name: "topMargin"; type: "double" }
+        Property { name: "bottomMargin"; type: "double" }
+        Property { name: "verticalCenterOffset"; type: "double" }
+        Property { name: "baselineOffset"; type: "double" }
+        Property { name: "fill"; type: "QQuickItem"; isPointer: true }
+        Property { name: "centerIn"; type: "QQuickItem"; isPointer: true }
+        Property { name: "alignWhenCentered"; type: "bool" }
+        Signal { name: "centerAlignedChanged" }
+    }
+    Component {
+        file: "private/qquickanimatedimage_p.h"
+        name: "QQuickAnimatedImage"
+        prototype: "QQuickImage"
+        exports: [
+            "QtQuick/AnimatedImage 2.0",
+            "QtQuick/AnimatedImage 2.1",
+            "QtQuick/AnimatedImage 2.11",
+            "QtQuick/AnimatedImage 2.14",
+            "QtQuick/AnimatedImage 2.15",
+            "QtQuick/AnimatedImage 2.3",
+            "QtQuick/AnimatedImage 2.4",
+            "QtQuick/AnimatedImage 2.5",
+            "QtQuick/AnimatedImage 2.7"
+        ]
+        exportMetaObjectRevisions: [0, 1, 11, 14, 15, 3, 4, 5, 7]
+        Property { name: "playing"; type: "bool" }
+        Property { name: "paused"; type: "bool" }
+        Property { name: "currentFrame"; type: "int" }
+        Property { name: "frameCount"; type: "int"; isReadonly: true }
+        Property { name: "speed"; revision: 11; type: "double" }
+        Property { name: "sourceSize"; type: "QSize"; isReadonly: true }
+        Signal { name: "frameChanged" }
+        Signal { name: "currentFrameChanged" }
+        Signal { name: "speedChanged"; revision: 11 }
+        Method { name: "movieUpdate" }
+        Method { name: "movieRequestFinished" }
+        Method { name: "playingStatusChanged" }
+        Method { name: "onCacheChanged" }
+    }
+    Component {
+        file: "private/qquickanimatedsprite_p.h"
+        name: "QQuickAnimatedSprite"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        exports: [
+            "QtQuick/AnimatedSprite 2.0",
+            "QtQuick/AnimatedSprite 2.1",
+            "QtQuick/AnimatedSprite 2.11",
+            "QtQuick/AnimatedSprite 2.12",
+            "QtQuick/AnimatedSprite 2.15",
+            "QtQuick/AnimatedSprite 2.4",
+            "QtQuick/AnimatedSprite 2.7"
+        ]
+        exportMetaObjectRevisions: [0, 1, 11, 12, 15, 4, 7]
+        Enum {
+            name: "LoopParameters"
+            values: ["Infinite"]
+        }
+        Enum {
+            name: "FinishBehavior"
+            values: ["FinishAtInitialFrame", "FinishAtFinalFrame"]
+        }
+        Property { name: "running"; type: "bool" }
+        Property { name: "interpolate"; type: "bool" }
+        Property { name: "source"; type: "QUrl" }
+        Property { name: "reverse"; type: "bool" }
+        Property { name: "frameSync"; type: "bool" }
+        Property { name: "frameCount"; type: "int" }
+        Property { name: "frameHeight"; type: "int" }
+        Property { name: "frameWidth"; type: "int" }
+        Property { name: "frameX"; type: "int" }
+        Property { name: "frameY"; type: "int" }
+        Property { name: "frameRate"; type: "double" }
+        Property { name: "frameDuration"; type: "int" }
+        Property { name: "loops"; type: "int" }
+        Property { name: "paused"; type: "bool" }
+        Property { name: "currentFrame"; type: "int" }
+        Property { name: "finishBehavior"; revision: 15; type: "FinishBehavior" }
+        Signal {
+            name: "pausedChanged"
+            Parameter { name: "arg"; type: "bool" }
+        }
+        Signal {
+            name: "runningChanged"
+            Parameter { name: "arg"; type: "bool" }
+        }
+        Signal {
+            name: "interpolateChanged"
+            Parameter { name: "arg"; type: "bool" }
+        }
+        Signal {
+            name: "sourceChanged"
+            Parameter { name: "arg"; type: "QUrl" }
+        }
+        Signal {
+            name: "reverseChanged"
+            Parameter { name: "arg"; type: "bool" }
+        }
+        Signal {
+            name: "frameSyncChanged"
+            Parameter { name: "arg"; type: "bool" }
+        }
+        Signal {
+            name: "frameCountChanged"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Signal {
+            name: "frameHeightChanged"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Signal {
+            name: "frameWidthChanged"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Signal {
+            name: "frameXChanged"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Signal {
+            name: "frameYChanged"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Signal {
+            name: "frameRateChanged"
+            Parameter { name: "arg"; type: "double" }
+        }
+        Signal {
+            name: "frameDurationChanged"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Signal {
+            name: "loopsChanged"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Signal {
+            name: "currentFrameChanged"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Signal {
+            name: "finishBehaviorChanged"
+            revision: 15
+            Parameter { name: "arg"; type: "FinishBehavior" }
+        }
+        Signal { name: "finished"; revision: 12 }
+        Method { name: "start" }
+        Method { name: "stop" }
+        Method { name: "restart" }
+        Method {
+            name: "advance"
+            Parameter { name: "frames"; type: "int" }
+        }
+        Method { name: "advance" }
+        Method { name: "pause" }
+        Method { name: "resume" }
+        Method {
+            name: "setRunning"
+            Parameter { name: "arg"; type: "bool" }
+        }
+        Method {
+            name: "setPaused"
+            Parameter { name: "arg"; type: "bool" }
+        }
+        Method {
+            name: "setInterpolate"
+            Parameter { name: "arg"; type: "bool" }
+        }
+        Method {
+            name: "setSource"
+            Parameter { name: "arg"; type: "QUrl" }
+        }
+        Method {
+            name: "setReverse"
+            Parameter { name: "arg"; type: "bool" }
+        }
+        Method {
+            name: "setFrameSync"
+            Parameter { name: "arg"; type: "bool" }
+        }
+        Method {
+            name: "setFrameCount"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Method {
+            name: "setFrameHeight"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Method {
+            name: "setFrameWidth"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Method {
+            name: "setFrameX"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Method {
+            name: "setFrameY"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Method {
+            name: "setFrameRate"
+            Parameter { name: "arg"; type: "double" }
+        }
+        Method {
+            name: "setFrameDuration"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Method { name: "resetFrameRate" }
+        Method { name: "resetFrameDuration" }
+        Method {
+            name: "setLoops"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Method {
+            name: "setCurrentFrame"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Method { name: "createEngine" }
+        Method { name: "reset" }
+    }
+    Component {
+        file: "private/qquickanimationcontroller_p.h"
+        name: "QQuickAnimationController"
+        defaultProperty: "animation"
+        prototype: "QObject"
+        exports: ["QtQuick/AnimationController 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "progress"; type: "double" }
+        Property { name: "animation"; type: "QQuickAbstractAnimation"; isPointer: true }
+        Method { name: "reload" }
+        Method { name: "completeToBeginning" }
+        Method { name: "completeToEnd" }
+        Method { name: "componentFinalized" }
+        Method { name: "updateProgress" }
+    }
+    Component {
+        file: "private/qquickanimation_p.h"
+        name: "QQuickAnimationGroup"
+        defaultProperty: "animations"
+        prototype: "QQuickAbstractAnimation"
+        Property { name: "animations"; type: "QQuickAbstractAnimation"; isList: true; isReadonly: true }
+    }
+    Component {
+        file: "private/qquickanimator_p.h"
+        name: "QQuickAnimator"
+        prototype: "QQuickAbstractAnimation"
+        exports: ["QtQuick/Animator 2.12", "QtQuick/Animator 2.2"]
+        isCreatable: false
+        exportMetaObjectRevisions: [12, 2]
+        Property { name: "target"; type: "QQuickItem"; isPointer: true }
+        Property { name: "easing"; type: "QEasingCurve" }
+        Property { name: "duration"; type: "int" }
+        Property { name: "to"; type: "double" }
+        Property { name: "from"; type: "double" }
+        Signal {
+            name: "targetItemChanged"
+            Parameter { type: "QQuickItem"; isPointer: true }
+        }
+        Signal {
+            name: "durationChanged"
+            Parameter { name: "duration"; type: "int" }
+        }
+        Signal {
+            name: "easingChanged"
+            Parameter { name: "curve"; type: "QEasingCurve" }
+        }
+        Signal {
+            name: "toChanged"
+            Parameter { name: "to"; type: "double" }
+        }
+        Signal {
+            name: "fromChanged"
+            Parameter { name: "from"; type: "double" }
+        }
+    }
+    Component {
+        file: "private/qquickapplication_p.h"
+        name: "QQuickApplication"
+        prototype: "QQmlApplication"
+        exports: ["QtQuick/Application 2.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        Property { name: "active"; type: "bool"; isReadonly: true }
+        Property { name: "layoutDirection"; type: "Qt::LayoutDirection"; isReadonly: true }
+        Property { name: "supportsMultipleWindows"; type: "bool"; isReadonly: true }
+        Property { name: "state"; type: "Qt::ApplicationState"; isReadonly: true }
+        Property { name: "font"; type: "QFont"; isReadonly: true }
+        Property { name: "displayName"; type: "string" }
+        Property { name: "screens"; type: "QQuickScreenInfo"; isList: true; isReadonly: true }
+        Signal {
+            name: "stateChanged"
+            Parameter { name: "state"; type: "Qt::ApplicationState" }
+        }
+        Method { name: "updateScreens" }
+    }
+    Component {
+        file: "private/qquickpositioners_p.h"
+        name: "QQuickBasePositioner"
+        prototype: "QQuickImplicitSizeItem"
+        exports: [
+            "QtQuick/Positioner 2.0",
+            "QtQuick/Positioner 2.1",
+            "QtQuick/Positioner 2.11",
+            "QtQuick/Positioner 2.4",
+            "QtQuick/Positioner 2.6",
+            "QtQuick/Positioner 2.7",
+            "QtQuick/Positioner 2.9"
+        ]
+        isCreatable: false
+        exportMetaObjectRevisions: [0, 1, 11, 4, 6, 7, 9]
+        attachedType: "QQuickPositionerAttached"
+        Property { name: "spacing"; type: "double" }
+        Property { name: "populate"; type: "QQuickTransition"; isPointer: true }
+        Property { name: "move"; type: "QQuickTransition"; isPointer: true }
+        Property { name: "add"; type: "QQuickTransition"; isPointer: true }
+        Property { name: "padding"; revision: 6; type: "double" }
+        Property { name: "topPadding"; revision: 6; type: "double" }
+        Property { name: "leftPadding"; revision: 6; type: "double" }
+        Property { name: "rightPadding"; revision: 6; type: "double" }
+        Property { name: "bottomPadding"; revision: 6; type: "double" }
+        Signal { name: "paddingChanged"; revision: 6 }
+        Signal { name: "topPaddingChanged"; revision: 6 }
+        Signal { name: "leftPaddingChanged"; revision: 6 }
+        Signal { name: "rightPaddingChanged"; revision: 6 }
+        Signal { name: "bottomPaddingChanged"; revision: 6 }
+        Signal { name: "positioningComplete"; revision: 9 }
+        Method { name: "prePositioning" }
+        Method { name: "forceLayout"; revision: 9 }
+    }
+    Component {
+        file: "private/qquickbehavior_p.h"
+        name: "QQuickBehavior"
+        defaultProperty: "animation"
+        prototype: "QObject"
+        exports: [
+            "QtQuick/Behavior 2.0",
+            "QtQuick/Behavior 2.13",
+            "QtQuick/Behavior 2.15"
+        ]
+        exportMetaObjectRevisions: [0, 13, 15]
+        Property { name: "animation"; type: "QQuickAbstractAnimation"; isPointer: true }
+        Property { name: "enabled"; type: "bool" }
+        Property { name: "targetValue"; revision: 13; type: "QVariant"; isReadonly: true }
+        Property { name: "targetProperty"; revision: 15; type: "QQmlProperty"; isReadonly: true }
+        Method { name: "componentFinalized" }
+    }
+    Component {
+        file: "private/qquickborderimage_p.h"
+        name: "QQuickBorderImage"
+        prototype: "QQuickImageBase"
+        exports: [
+            "QtQuick/BorderImage 2.0",
+            "QtQuick/BorderImage 2.1",
+            "QtQuick/BorderImage 2.11",
+            "QtQuick/BorderImage 2.14",
+            "QtQuick/BorderImage 2.15",
+            "QtQuick/BorderImage 2.4",
+            "QtQuick/BorderImage 2.7"
+        ]
+        exportMetaObjectRevisions: [0, 1, 11, 14, 15, 4, 7]
+        Enum {
+            name: "TileMode"
+            values: ["Stretch", "Repeat", "Round"]
+        }
+        Property { name: "border"; type: "QQuickScaleGrid"; isReadonly: true; isPointer: true }
+        Property { name: "horizontalTileMode"; type: "TileMode" }
+        Property { name: "verticalTileMode"; type: "TileMode" }
+        Property { name: "sourceSize"; type: "QSize"; isReadonly: true }
+        Method { name: "doUpdate" }
+        Method { name: "requestFinished" }
+        Method { name: "sciRequestFinished" }
+    }
+    Component {
+        file: "private/qquickshadereffectmesh_p.h"
+        name: "QQuickBorderImageMesh"
+        prototype: "QQuickShaderEffectMesh"
+        exports: ["QtQuick/BorderImageMesh 2.8"]
+        exportMetaObjectRevisions: [8]
+        Enum {
+            name: "TileMode"
+            values: ["Stretch", "Repeat", "Round"]
+        }
+        Property { name: "border"; type: "QQuickScaleGrid"; isReadonly: true; isPointer: true }
+        Property { name: "size"; type: "QSize" }
+        Property { name: "horizontalTileMode"; type: "TileMode" }
+        Property { name: "verticalTileMode"; type: "TileMode" }
+    }
+    Component {
+        file: "private/qquickcanvasitem_p.h"
+        name: "QQuickCanvasItem"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        exports: [
+            "QtQuick/Canvas 2.0",
+            "QtQuick/Canvas 2.1",
+            "QtQuick/Canvas 2.11",
+            "QtQuick/Canvas 2.4",
+            "QtQuick/Canvas 2.7"
+        ]
+        exportMetaObjectRevisions: [0, 1, 11, 4, 7]
+        Enum {
+            name: "RenderTarget"
+            values: ["Image", "FramebufferObject"]
+        }
+        Enum {
+            name: "RenderStrategy"
+            values: ["Immediate", "Threaded", "Cooperative"]
+        }
+        Property { name: "available"; type: "bool"; isReadonly: true }
+        Property { name: "contextType"; type: "string" }
+        Property { name: "context"; type: "QJSValue"; isReadonly: true }
+        Property { name: "canvasSize"; type: "QSizeF" }
+        Property { name: "tileSize"; type: "QSize" }
+        Property { name: "canvasWindow"; type: "QRectF" }
+        Property { name: "renderTarget"; type: "RenderTarget" }
+        Property { name: "renderStrategy"; type: "RenderStrategy" }
+        Signal {
+            name: "paint"
+            Parameter { name: "region"; type: "QRect" }
+        }
+        Signal { name: "painted" }
+        Signal { name: "imageLoaded" }
+        Method {
+            name: "loadImage"
+            Parameter { name: "url"; type: "QUrl" }
+        }
+        Method {
+            name: "unloadImage"
+            Parameter { name: "url"; type: "QUrl" }
+        }
+        Method {
+            name: "isImageLoaded"
+            type: "bool"
+            Parameter { name: "url"; type: "QUrl" }
+        }
+        Method {
+            name: "isImageLoading"
+            type: "bool"
+            Parameter { name: "url"; type: "QUrl" }
+        }
+        Method {
+            name: "isImageError"
+            type: "bool"
+            Parameter { name: "url"; type: "QUrl" }
+        }
+        Method { name: "sceneGraphInitialized" }
+        Method { name: "checkAnimationCallbacks" }
+        Method { name: "invalidateSceneGraph" }
+        Method { name: "schedulePolish" }
+        Method {
+            name: "getContext"
+            Parameter { name: "args"; type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "requestAnimationFrame"
+            Parameter { name: "args"; type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "cancelRequestAnimationFrame"
+            Parameter { name: "args"; type: "QQmlV4Function"; isPointer: true }
+        }
+        Method { name: "requestPaint" }
+        Method {
+            name: "markDirty"
+            Parameter { name: "dirtyRect"; type: "QRectF" }
+        }
+        Method { name: "markDirty" }
+        Method {
+            name: "save"
+            type: "bool"
+            Parameter { name: "filename"; type: "string" }
+        }
+        Method {
+            name: "toDataURL"
+            type: "string"
+            Parameter { name: "type"; type: "string" }
+        }
+        Method { name: "toDataURL"; type: "string" }
+        Method { name: "delayedCreate" }
+    }
+    Component {
+        file: "private/qquickevents_p_p.h"
+        name: "QQuickCloseEvent"
+        prototype: "QObject"
+        Property { name: "accepted"; type: "bool" }
+    }
+    Component {
+        file: "private/qquickanimation_p.h"
+        name: "QQuickColorAnimation"
+        prototype: "QQuickPropertyAnimation"
+        exports: ["QtQuick/ColorAnimation 2.0", "QtQuick/ColorAnimation 2.12"]
+        exportMetaObjectRevisions: [0, 12]
+        Property { name: "from"; type: "QColor" }
+        Property { name: "to"; type: "QColor" }
+    }
+    Component {
+        file: "private/qquickvaluetypes_p.h"
+        name: "QQuickColorSpaceValueType"
+        exports: ["QtQuick/ColorSpace 2.15"]
+        isCreatable: false
+        exportMetaObjectRevisions: [15]
+        Enum {
+            name: "NamedColorSpace"
+            values: [
+                "Unknown",
+                "SRgb",
+                "SRgbLinear",
+                "AdobeRgb",
+                "DisplayP3",
+                "ProPhotoRgb"
+            ]
+        }
+        Enum {
+            name: "Primaries"
+            values: ["Custom", "SRgb", "AdobeRgb", "DciP3D65", "ProPhotoRgb"]
+        }
+        Enum {
+            name: "TransferFunction"
+            values: ["Custom", "Linear", "Gamma", "SRgb", "ProPhotoRgb"]
+        }
+        Property { name: "namedColorSpace"; type: "NamedColorSpace" }
+        Property { name: "primaries"; type: "Primaries" }
+        Property { name: "transferFunction"; type: "TransferFunction" }
+        Property { name: "gamma"; type: "float" }
+    }
+    Component {
+        file: "private/qquickpositioners_p.h"
+        name: "QQuickColumn"
+        prototype: "QQuickBasePositioner"
+        exports: [
+            "QtQuick/Column 2.0",
+            "QtQuick/Column 2.1",
+            "QtQuick/Column 2.11",
+            "QtQuick/Column 2.4",
+            "QtQuick/Column 2.6",
+            "QtQuick/Column 2.7",
+            "QtQuick/Column 2.9"
+        ]
+        exportMetaObjectRevisions: [0, 1, 11, 4, 6, 7, 9]
+    }
+    Component {
+        file: "private/qquickpath_p.h"
+        name: "QQuickCurve"
+        prototype: "QQuickPathElement"
+        Property { name: "x"; type: "double" }
+        Property { name: "y"; type: "double" }
+        Property { name: "relativeX"; type: "double" }
+        Property { name: "relativeY"; type: "double" }
+    }
+    Component {
+        file: "private/qquickvalidator_p.h"
+        name: "QQuickDoubleValidator"
+        prototype: "QDoubleValidator"
+        exports: ["QtQuick/DoubleValidator 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "locale"; type: "string" }
+        Signal { name: "localeNameChanged" }
+    }
+    Component {
+        file: "private/qquickdrag_p.h"
+        name: "QQuickDrag"
+        prototype: "QObject"
+        exports: ["QtQuick/Drag 2.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        attachedType: "QQuickDragAttached"
+        Enum {
+            name: "DragType"
+            values: ["None", "Automatic", "Internal"]
+        }
+        Enum {
+            name: "Axis"
+            values: ["XAxis", "YAxis", "XAndYAxis", "XandYAxis"]
+        }
+        Property { name: "target"; type: "QQuickItem"; isPointer: true }
+        Property { name: "axis"; type: "Axis" }
+        Property { name: "minimumX"; type: "double" }
+        Property { name: "maximumX"; type: "double" }
+        Property { name: "minimumY"; type: "double" }
+        Property { name: "maximumY"; type: "double" }
+        Property { name: "active"; type: "bool"; isReadonly: true }
+        Property { name: "filterChildren"; type: "bool" }
+        Property { name: "smoothed"; type: "bool" }
+        Property { name: "threshold"; type: "double" }
+    }
+    Component {
+        file: "private/qquickdrag_p.h"
+        name: "QQuickDragAttached"
+        prototype: "QObject"
+        Property { name: "active"; type: "bool" }
+        Property { name: "source"; type: "QObject"; isPointer: true }
+        Property { name: "target"; type: "QObject"; isReadonly: true; isPointer: true }
+        Property { name: "hotSpot"; type: "QPointF" }
+        Property { name: "imageSource"; type: "QUrl" }
+        Property { name: "keys"; type: "QStringList" }
+        Property { name: "mimeData"; type: "QVariantMap" }
+        Property { name: "supportedActions"; type: "Qt::DropActions" }
+        Property { name: "proposedAction"; type: "Qt::DropAction" }
+        Property { name: "dragType"; type: "QQuickDrag::DragType" }
+        Signal { name: "dragStarted" }
+        Signal {
+            name: "dragFinished"
+            Parameter { name: "dropAction"; type: "Qt::DropAction" }
+        }
+        Method {
+            name: "start"
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "startDrag"
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+        Method { name: "cancel" }
+        Method { name: "drop"; type: "int" }
+    }
+    Component {
+        file: "private/qquickdragaxis_p.h"
+        name: "QQuickDragAxis"
+        prototype: "QObject"
+        exports: ["QtQuick/DragAxis 2.12"]
+        isCreatable: false
+        exportMetaObjectRevisions: [12]
+        Property { name: "minimum"; type: "double" }
+        Property { name: "maximum"; type: "double" }
+        Property { name: "enabled"; type: "bool" }
+    }
+    Component {
+        file: "private/qquickdraghandler_p.h"
+        name: "QQuickDragHandler"
+        prototype: "QQuickMultiPointHandler"
+        exports: [
+            "QtQuick/DragHandler 2.12",
+            "QtQuick/DragHandler 2.14",
+            "QtQuick/DragHandler 2.15"
+        ]
+        exportMetaObjectRevisions: [12, 14, 15]
+        Enum {
+            name: "SnapMode"
+            values: [
+                "NoSnap",
+                "SnapAuto",
+                "SnapIfPressedOutsideTarget",
+                "SnapAlways"
+            ]
+        }
+        Property { name: "xAxis"; type: "QQuickDragAxis"; isReadonly: true; isPointer: true }
+        Property { name: "yAxis"; type: "QQuickDragAxis"; isReadonly: true; isPointer: true }
+        Property { name: "translation"; type: "QVector2D"; isReadonly: true }
+        Property { name: "snapMode"; revision: 14; type: "SnapMode" }
+        Signal { name: "snapModeChanged"; revision: 14 }
+    }
+    Component {
+        file: "private/qquickdroparea_p.h"
+        name: "QQuickDropArea"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        exports: [
+            "QtQuick/DropArea 2.0",
+            "QtQuick/DropArea 2.1",
+            "QtQuick/DropArea 2.11",
+            "QtQuick/DropArea 2.4",
+            "QtQuick/DropArea 2.7"
+        ]
+        exportMetaObjectRevisions: [0, 1, 11, 4, 7]
+        Property { name: "containsDrag"; type: "bool"; isReadonly: true }
+        Property { name: "keys"; type: "QStringList" }
+        Property { name: "drag"; type: "QQuickDropAreaDrag"; isReadonly: true; isPointer: true }
+        Signal { name: "sourceChanged" }
+        Signal {
+            name: "entered"
+            Parameter { name: "drag"; type: "QQuickDropEvent"; isPointer: true }
+        }
+        Signal { name: "exited" }
+        Signal {
+            name: "positionChanged"
+            Parameter { name: "drag"; type: "QQuickDropEvent"; isPointer: true }
+        }
+        Signal {
+            name: "dropped"
+            Parameter { name: "drop"; type: "QQuickDropEvent"; isPointer: true }
+        }
+    }
+    Component {
+        file: "private/qquickdroparea_p.h"
+        name: "QQuickDropAreaDrag"
+        prototype: "QObject"
+        Property { name: "x"; type: "double"; isReadonly: true }
+        Property { name: "y"; type: "double"; isReadonly: true }
+        Property { name: "source"; type: "QObject"; isReadonly: true; isPointer: true }
+        Signal { name: "positionChanged" }
+    }
+    Component {
+        file: "private/qquickdroparea_p.h"
+        name: "QQuickDropEvent"
+        prototype: "QObject"
+        Property { name: "x"; type: "double"; isReadonly: true }
+        Property { name: "y"; type: "double"; isReadonly: true }
+        Property { name: "source"; type: "QObject"; isReadonly: true; isPointer: true }
+        Property { name: "keys"; type: "QStringList"; isReadonly: true }
+        Property { name: "supportedActions"; type: "Qt::DropActions"; isReadonly: true }
+        Property { name: "proposedAction"; type: "Qt::DropActions"; isReadonly: true }
+        Property { name: "action"; type: "Qt::DropAction" }
+        Property { name: "accepted"; type: "bool" }
+        Property { name: "hasColor"; type: "bool"; isReadonly: true }
+        Property { name: "hasHtml"; type: "bool"; isReadonly: true }
+        Property { name: "hasText"; type: "bool"; isReadonly: true }
+        Property { name: "hasUrls"; type: "bool"; isReadonly: true }
+        Property { name: "colorData"; type: "QVariant"; isReadonly: true }
+        Property { name: "html"; type: "string"; isReadonly: true }
+        Property { name: "text"; type: "string"; isReadonly: true }
+        Property { name: "urls"; type: "QList<QUrl>"; isReadonly: true }
+        Property { name: "formats"; type: "QStringList"; isReadonly: true }
+        Method {
+            name: "getDataAsString"
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "getDataAsArrayBuffer"
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "acceptProposedAction"
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "accept"
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+    }
+    Component {
+        file: "private/qquickitem_p.h"
+        name: "QQuickEnterKeyAttached"
+        prototype: "QObject"
+        exports: ["QtQuick/EnterKey 2.6"]
+        isCreatable: false
+        exportMetaObjectRevisions: [6]
+        attachedType: "QQuickEnterKeyAttached"
+        Property { name: "type"; type: "Qt::EnterKeyType" }
+    }
+    Component {
+        file: "private/qquickevents_p_p.h"
+        name: "QQuickEventPoint"
+        prototype: "QObject"
+        exports: ["QtQuick/EventPoint 2.12"]
+        isCreatable: false
+        exportMetaObjectRevisions: [12]
+        Enum {
+            name: "States"
+            alias: "State"
+            isFlag: true
+            values: ["Pressed", "Updated", "Stationary", "Released"]
+        }
+        Enum {
+            name: "GrabTransition"
+            values: [
+                "GrabPassive",
+                "UngrabPassive",
+                "CancelGrabPassive",
+                "OverrideGrabPassive",
+                "GrabExclusive",
+                "UngrabExclusive",
+                "CancelGrabExclusive"
+            ]
+        }
+        Property { name: "event"; type: "QQuickPointerEvent"; isReadonly: true; isPointer: true }
+        Property { name: "position"; type: "QPointF"; isReadonly: true }
+        Property { name: "scenePosition"; type: "QPointF"; isReadonly: true }
+        Property { name: "scenePressPosition"; type: "QPointF"; isReadonly: true }
+        Property { name: "sceneGrabPosition"; type: "QPointF"; isReadonly: true }
+        Property { name: "state"; type: "State"; isReadonly: true }
+        Property { name: "pointId"; type: "int"; isReadonly: true }
+        Property { name: "timeHeld"; type: "double"; isReadonly: true }
+        Property { name: "velocity"; type: "QVector2D"; isReadonly: true }
+        Property { name: "accepted"; type: "bool" }
+        Property { name: "exclusiveGrabber"; type: "QObject"; isPointer: true }
+    }
+    Component {
+        file: "private/qquickevents_p_p.h"
+        name: "QQuickEventTabletPoint"
+        prototype: "QQuickEventPoint"
+        exports: ["QtQuick/EventTabletPoint 2.15"]
+        isCreatable: false
+        exportMetaObjectRevisions: [15]
+        Property { name: "rotation"; type: "double"; isReadonly: true }
+        Property { name: "pressure"; type: "double"; isReadonly: true }
+        Property { name: "tangentialPressure"; type: "double"; isReadonly: true }
+        Property { name: "tilt"; type: "QVector2D"; isReadonly: true }
+    }
+    Component {
+        file: "private/qquickevents_p_p.h"
+        name: "QQuickEventTouchPoint"
+        prototype: "QQuickEventPoint"
+        exports: ["QtQuick/EventTouchPoint 2.12"]
+        isCreatable: false
+        exportMetaObjectRevisions: [12]
+        Property { name: "rotation"; type: "double"; isReadonly: true }
+        Property { name: "pressure"; type: "double"; isReadonly: true }
+        Property { name: "ellipseDiameters"; type: "QSizeF"; isReadonly: true }
+        Property { name: "uniqueId"; type: "QPointingDeviceUniqueId"; isReadonly: true }
+    }
+    Component {
+        file: "private/qquickflickable_p.h"
+        name: "QQuickFlickable"
+        defaultProperty: "flickableData"
+        prototype: "QQuickItem"
+        exports: [
+            "QtQuick/Flickable 2.0",
+            "QtQuick/Flickable 2.1",
+            "QtQuick/Flickable 2.10",
+            "QtQuick/Flickable 2.11",
+            "QtQuick/Flickable 2.12",
+            "QtQuick/Flickable 2.4",
+            "QtQuick/Flickable 2.7",
+            "QtQuick/Flickable 2.9"
+        ]
+        exportMetaObjectRevisions: [0, 1, 10, 11, 12, 4, 7, 9]
+        Enum {
+            name: "BoundsBehavior"
+            alias: "BoundsBehaviorFlag"
+            isFlag: true
+            values: [
+                "StopAtBounds",
+                "DragOverBounds",
+                "OvershootBounds",
+                "DragAndOvershootBounds"
+            ]
+        }
+        Enum {
+            name: "BoundsMovement"
+            values: ["FollowBoundsBehavior"]
+        }
+        Enum {
+            name: "FlickableDirection"
+            values: [
+                "AutoFlickDirection",
+                "HorizontalFlick",
+                "VerticalFlick",
+                "HorizontalAndVerticalFlick",
+                "AutoFlickIfNeeded"
+            ]
+        }
+        Property { name: "contentWidth"; type: "double" }
+        Property { name: "contentHeight"; type: "double" }
+        Property { name: "contentX"; type: "double" }
+        Property { name: "contentY"; type: "double" }
+        Property { name: "contentItem"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property { name: "topMargin"; type: "double" }
+        Property { name: "bottomMargin"; type: "double" }
+        Property { name: "originY"; type: "double"; isReadonly: true }
+        Property { name: "leftMargin"; type: "double" }
+        Property { name: "rightMargin"; type: "double" }
+        Property { name: "originX"; type: "double"; isReadonly: true }
+        Property { name: "horizontalVelocity"; type: "double"; isReadonly: true }
+        Property { name: "verticalVelocity"; type: "double"; isReadonly: true }
+        Property { name: "boundsBehavior"; type: "BoundsBehavior" }
+        Property { name: "boundsMovement"; revision: 10; type: "BoundsMovement" }
+        Property { name: "rebound"; type: "QQuickTransition"; isPointer: true }
+        Property { name: "maximumFlickVelocity"; type: "double" }
+        Property { name: "flickDeceleration"; type: "double" }
+        Property { name: "moving"; type: "bool"; isReadonly: true }
+        Property { name: "movingHorizontally"; type: "bool"; isReadonly: true }
+        Property { name: "movingVertically"; type: "bool"; isReadonly: true }
+        Property { name: "flicking"; type: "bool"; isReadonly: true }
+        Property { name: "flickingHorizontally"; type: "bool"; isReadonly: true }
+        Property { name: "flickingVertically"; type: "bool"; isReadonly: true }
+        Property { name: "dragging"; type: "bool"; isReadonly: true }
+        Property { name: "draggingHorizontally"; type: "bool"; isReadonly: true }
+        Property { name: "draggingVertically"; type: "bool"; isReadonly: true }
+        Property { name: "flickableDirection"; type: "FlickableDirection" }
+        Property { name: "interactive"; type: "bool" }
+        Property { name: "pressDelay"; type: "int" }
+        Property { name: "atXEnd"; type: "bool"; isReadonly: true }
+        Property { name: "atYEnd"; type: "bool"; isReadonly: true }
+        Property { name: "atXBeginning"; type: "bool"; isReadonly: true }
+        Property { name: "atYBeginning"; type: "bool"; isReadonly: true }
+        Property {
+            name: "visibleArea"
+            type: "QQuickFlickableVisibleArea"
+            isReadonly: true
+            isPointer: true
+        }
+        Property { name: "pixelAligned"; type: "bool" }
+        Property { name: "synchronousDrag"; revision: 12; type: "bool" }
+        Property { name: "horizontalOvershoot"; revision: 9; type: "double"; isReadonly: true }
+        Property { name: "verticalOvershoot"; revision: 9; type: "double"; isReadonly: true }
+        Property { name: "flickableData"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "flickableChildren"; type: "QQuickItem"; isList: true; isReadonly: true }
+        Signal { name: "isAtBoundaryChanged" }
+        Signal { name: "boundsMovementChanged"; revision: 10 }
+        Signal { name: "movementStarted" }
+        Signal { name: "movementEnded" }
+        Signal { name: "flickStarted" }
+        Signal { name: "flickEnded" }
+        Signal { name: "dragStarted" }
+        Signal { name: "dragEnded" }
+        Signal { name: "synchronousDragChanged"; revision: 12 }
+        Signal { name: "horizontalOvershootChanged"; revision: 9 }
+        Signal { name: "verticalOvershootChanged"; revision: 9 }
+        Method { name: "movementStarting" }
+        Method { name: "movementEnding" }
+        Method {
+            name: "movementEnding"
+            Parameter { name: "hMovementEnding"; type: "bool" }
+            Parameter { name: "vMovementEnding"; type: "bool" }
+        }
+        Method { name: "velocityTimelineCompleted" }
+        Method { name: "timelineCompleted" }
+        Method {
+            name: "resizeContent"
+            Parameter { name: "w"; type: "double" }
+            Parameter { name: "h"; type: "double" }
+            Parameter { name: "center"; type: "QPointF" }
+        }
+        Method { name: "returnToBounds" }
+        Method {
+            name: "flick"
+            Parameter { name: "xVelocity"; type: "double" }
+            Parameter { name: "yVelocity"; type: "double" }
+        }
+        Method { name: "cancelFlick" }
+    }
+    Component {
+        file: "private/qquickflickable_p_p.h"
+        name: "QQuickFlickableVisibleArea"
+        prototype: "QObject"
+        Property { name: "xPosition"; type: "double"; isReadonly: true }
+        Property { name: "yPosition"; type: "double"; isReadonly: true }
+        Property { name: "widthRatio"; type: "double"; isReadonly: true }
+        Property { name: "heightRatio"; type: "double"; isReadonly: true }
+        Signal {
+            name: "xPositionChanged"
+            Parameter { name: "xPosition"; type: "double" }
+        }
+        Signal {
+            name: "yPositionChanged"
+            Parameter { name: "yPosition"; type: "double" }
+        }
+        Signal {
+            name: "widthRatioChanged"
+            Parameter { name: "widthRatio"; type: "double" }
+        }
+        Signal {
+            name: "heightRatioChanged"
+            Parameter { name: "heightRatio"; type: "double" }
+        }
+    }
+    Component {
+        file: "private/qquickflipable_p.h"
+        name: "QQuickFlipable"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        exports: [
+            "QtQuick/Flipable 2.0",
+            "QtQuick/Flipable 2.1",
+            "QtQuick/Flipable 2.11",
+            "QtQuick/Flipable 2.4",
+            "QtQuick/Flipable 2.7"
+        ]
+        exportMetaObjectRevisions: [0, 1, 11, 4, 7]
+        Enum {
+            name: "Side"
+            values: ["Front", "Back"]
+        }
+        Property { name: "front"; type: "QQuickItem"; isPointer: true }
+        Property { name: "back"; type: "QQuickItem"; isPointer: true }
+        Property { name: "side"; type: "Side"; isReadonly: true }
+        Method { name: "retransformBack" }
+    }
+    Component {
+        file: "private/qquickpositioners_p.h"
+        name: "QQuickFlow"
+        prototype: "QQuickBasePositioner"
+        exports: [
+            "QtQuick/Flow 2.0",
+            "QtQuick/Flow 2.1",
+            "QtQuick/Flow 2.11",
+            "QtQuick/Flow 2.4",
+            "QtQuick/Flow 2.6",
+            "QtQuick/Flow 2.7",
+            "QtQuick/Flow 2.9"
+        ]
+        exportMetaObjectRevisions: [0, 1, 11, 4, 6, 7, 9]
+        Enum {
+            name: "Flow"
+            values: ["LeftToRight", "TopToBottom"]
+        }
+        Property { name: "flow"; type: "Flow" }
+        Property { name: "layoutDirection"; type: "Qt::LayoutDirection" }
+        Property { name: "effectiveLayoutDirection"; type: "Qt::LayoutDirection"; isReadonly: true }
+    }
+    Component {
+        file: "private/qquickfocusscope_p.h"
+        name: "QQuickFocusScope"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        exports: [
+            "QtQuick/FocusScope 2.0",
+            "QtQuick/FocusScope 2.1",
+            "QtQuick/FocusScope 2.11",
+            "QtQuick/FocusScope 2.4",
+            "QtQuick/FocusScope 2.7"
+        ]
+        exportMetaObjectRevisions: [0, 1, 11, 4, 7]
+    }
+    Component {
+        file: "private/qquickfontloader_p.h"
+        name: "QQuickFontLoader"
+        prototype: "QObject"
+        exports: ["QtQuick/FontLoader 2.0"]
+        exportMetaObjectRevisions: [0]
+        Enum {
+            name: "Status"
+            values: ["Null", "Ready", "Loading", "Error"]
+        }
+        Property { name: "source"; type: "QUrl" }
+        Property { name: "name"; type: "string" }
+        Property { name: "status"; type: "Status"; isReadonly: true }
+        Method {
+            name: "updateFontInfo"
+            Parameter { type: "string" }
+            Parameter { type: "QQuickFontLoader::Status" }
+        }
+    }
+    Component {
+        file: "private/qquickfontmetrics_p.h"
+        name: "QQuickFontMetrics"
+        prototype: "QObject"
+        exports: ["QtQuick/FontMetrics 2.4"]
+        exportMetaObjectRevisions: [4]
+        Property { name: "font"; type: "QFont" }
+        Property { name: "ascent"; type: "double"; isReadonly: true }
+        Property { name: "descent"; type: "double"; isReadonly: true }
+        Property { name: "height"; type: "double"; isReadonly: true }
+        Property { name: "leading"; type: "double"; isReadonly: true }
+        Property { name: "lineSpacing"; type: "double"; isReadonly: true }
+        Property { name: "minimumLeftBearing"; type: "double"; isReadonly: true }
+        Property { name: "minimumRightBearing"; type: "double"; isReadonly: true }
+        Property { name: "maximumCharacterWidth"; type: "double"; isReadonly: true }
+        Property { name: "xHeight"; type: "double"; isReadonly: true }
+        Property { name: "averageCharacterWidth"; type: "double"; isReadonly: true }
+        Property { name: "underlinePosition"; type: "double"; isReadonly: true }
+        Property { name: "overlinePosition"; type: "double"; isReadonly: true }
+        Property { name: "strikeOutPosition"; type: "double"; isReadonly: true }
+        Property { name: "lineWidth"; type: "double"; isReadonly: true }
+        Signal {
+            name: "fontChanged"
+            Parameter { name: "font"; type: "QFont" }
+        }
+        Method {
+            name: "advanceWidth"
+            type: "double"
+            Parameter { name: "text"; type: "string" }
+        }
+        Method {
+            name: "boundingRect"
+            type: "QRectF"
+            Parameter { name: "text"; type: "string" }
+        }
+        Method {
+            name: "tightBoundingRect"
+            type: "QRectF"
+            Parameter { name: "text"; type: "string" }
+        }
+        Method {
+            name: "elidedText"
+            type: "string"
+            Parameter { name: "text"; type: "string" }
+            Parameter { name: "mode"; type: "Qt::TextElideMode" }
+            Parameter { name: "width"; type: "double" }
+            Parameter { name: "flags"; type: "int" }
+        }
+        Method {
+            name: "elidedText"
+            type: "string"
+            Parameter { name: "text"; type: "string" }
+            Parameter { name: "mode"; type: "Qt::TextElideMode" }
+            Parameter { name: "width"; type: "double" }
+        }
+    }
+    Component {
+        file: "private/qquickvaluetypes_p.h"
+        name: "QQuickFontValueType"
+        exports: ["QtQuick/Font 2.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        Enum {
+            name: "FontWeight"
+            values: [
+                "Thin",
+                "ExtraLight",
+                "Light",
+                "Normal",
+                "Medium",
+                "DemiBold",
+                "Bold",
+                "ExtraBold",
+                "Black"
+            ]
+        }
+        Enum {
+            name: "Capitalization"
+            values: [
+                "MixedCase",
+                "AllUppercase",
+                "AllLowercase",
+                "SmallCaps",
+                "Capitalize"
+            ]
+        }
+        Enum {
+            name: "HintingPreference"
+            values: [
+                "PreferDefaultHinting",
+                "PreferNoHinting",
+                "PreferVerticalHinting",
+                "PreferFullHinting"
+            ]
+        }
+        Property { name: "family"; type: "string" }
+        Property { name: "styleName"; type: "string" }
+        Property { name: "bold"; type: "bool" }
+        Property { name: "weight"; type: "FontWeight" }
+        Property { name: "italic"; type: "bool" }
+        Property { name: "underline"; type: "bool" }
+        Property { name: "overline"; type: "bool" }
+        Property { name: "strikeout"; type: "bool" }
+        Property { name: "pointSize"; type: "double" }
+        Property { name: "pixelSize"; type: "int" }
+        Property { name: "capitalization"; type: "Capitalization" }
+        Property { name: "letterSpacing"; type: "double" }
+        Property { name: "wordSpacing"; type: "double" }
+        Property { name: "hintingPreference"; type: "HintingPreference" }
+        Property { name: "kerning"; type: "bool" }
+        Property { name: "preferShaping"; type: "bool" }
+        Method { name: "toString"; type: "string" }
+    }
+    Component {
+        file: "private/qquickmultipointtoucharea_p.h"
+        name: "QQuickGrabGestureEvent"
+        prototype: "QObject"
+        exports: ["QtQuick/GestureEvent 2.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        Property { name: "touchPoints"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "dragThreshold"; type: "double"; isReadonly: true }
+        Method { name: "grab" }
+    }
+    Component {
+        file: "private/qquickrectangle_p.h"
+        name: "QQuickGradient"
+        defaultProperty: "stops"
+        prototype: "QObject"
+        exports: ["QtQuick/Gradient 2.0", "QtQuick/Gradient 2.12"]
+        exportMetaObjectRevisions: [0, 12]
+        Enum {
+            name: "Orientation"
+            values: ["Vertical", "Horizontal"]
+        }
+        Property { name: "stops"; type: "QQuickGradientStop"; isList: true; isReadonly: true }
+        Property { name: "orientation"; revision: 12; type: "Orientation" }
+        Signal { name: "updated" }
+    }
+    Component {
+        file: "private/qquickrectangle_p.h"
+        name: "QQuickGradientStop"
+        prototype: "QObject"
+        exports: ["QtQuick/GradientStop 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "position"; type: "double" }
+        Property { name: "color"; type: "QColor" }
+    }
+    Component {
+        file: "private/qquickgraphicsinfo_p.h"
+        name: "QQuickGraphicsInfo"
+        prototype: "QObject"
+        exports: ["QtQuick/GraphicsInfo 2.8"]
+        isCreatable: false
+        exportMetaObjectRevisions: [8]
+        attachedType: "QQuickGraphicsInfo"
+        Enum {
+            name: "GraphicsApi"
+            values: [
+                "Unknown",
+                "Software",
+                "OpenGL",
+                "Direct3D12",
+                "OpenVG",
+                "OpenGLRhi",
+                "Direct3D11Rhi",
+                "VulkanRhi",
+                "MetalRhi",
+                "NullRhi"
+            ]
+        }
+        Enum {
+            name: "ShaderType"
+            values: ["UnknownShadingLanguage", "GLSL", "HLSL", "RhiShader"]
+        }
+        Enum {
+            name: "ShaderCompilationType"
+            values: ["RuntimeCompilation", "OfflineCompilation"]
+        }
+        Enum {
+            name: "ShaderSourceType"
+            values: [
+                "ShaderSourceString",
+                "ShaderSourceFile",
+                "ShaderByteCode"
+            ]
+        }
+        Enum {
+            name: "OpenGLContextProfile"
+            values: [
+                "OpenGLNoProfile",
+                "OpenGLCoreProfile",
+                "OpenGLCompatibilityProfile"
+            ]
+        }
+        Enum {
+            name: "RenderableType"
+            values: [
+                "SurfaceFormatUnspecified",
+                "SurfaceFormatOpenGL",
+                "SurfaceFormatOpenGLES"
+            ]
+        }
+        Property { name: "api"; type: "GraphicsApi"; isReadonly: true }
+        Property { name: "shaderType"; type: "ShaderType"; isReadonly: true }
+        Property { name: "shaderCompilationType"; type: "ShaderCompilationType"; isReadonly: true }
+        Property { name: "shaderSourceType"; type: "ShaderSourceType"; isReadonly: true }
+        Property { name: "majorVersion"; type: "int"; isReadonly: true }
+        Property { name: "minorVersion"; type: "int"; isReadonly: true }
+        Property { name: "profile"; type: "OpenGLContextProfile"; isReadonly: true }
+        Property { name: "renderableType"; type: "RenderableType"; isReadonly: true }
+        Method { name: "updateInfo" }
+        Method {
+            name: "setWindow"
+            Parameter { name: "window"; type: "QQuickWindow"; isPointer: true }
+        }
+    }
+    Component {
+        file: "private/qquickpositioners_p.h"
+        name: "QQuickGrid"
+        prototype: "QQuickBasePositioner"
+        exports: [
+            "QtQuick/Grid 2.0",
+            "QtQuick/Grid 2.1",
+            "QtQuick/Grid 2.11",
+            "QtQuick/Grid 2.4",
+            "QtQuick/Grid 2.6",
+            "QtQuick/Grid 2.7",
+            "QtQuick/Grid 2.9"
+        ]
+        exportMetaObjectRevisions: [0, 1, 11, 4, 6, 7, 9]
+        Enum {
+            name: "Flow"
+            values: ["LeftToRight", "TopToBottom"]
+        }
+        Enum {
+            name: "HAlignment"
+            values: ["AlignLeft", "AlignRight", "AlignHCenter"]
+        }
+        Enum {
+            name: "VAlignment"
+            values: ["AlignTop", "AlignBottom", "AlignVCenter"]
+        }
+        Property { name: "rows"; type: "int" }
+        Property { name: "columns"; type: "int" }
+        Property { name: "rowSpacing"; type: "double" }
+        Property { name: "columnSpacing"; type: "double" }
+        Property { name: "flow"; type: "Flow" }
+        Property { name: "layoutDirection"; type: "Qt::LayoutDirection" }
+        Property { name: "effectiveLayoutDirection"; type: "Qt::LayoutDirection"; isReadonly: true }
+        Property { name: "horizontalItemAlignment"; revision: 1; type: "HAlignment" }
+        Property {
+            name: "effectiveHorizontalItemAlignment"
+            revision: 1
+            type: "HAlignment"
+            isReadonly: true
+        }
+        Property { name: "verticalItemAlignment"; revision: 1; type: "VAlignment" }
+        Signal {
+            name: "horizontalAlignmentChanged"
+            revision: 1
+            Parameter { name: "alignment"; type: "HAlignment" }
+        }
+        Signal {
+            name: "effectiveHorizontalAlignmentChanged"
+            revision: 1
+            Parameter { name: "alignment"; type: "HAlignment" }
+        }
+        Signal {
+            name: "verticalAlignmentChanged"
+            revision: 1
+            Parameter { name: "alignment"; type: "VAlignment" }
+        }
+    }
+    Component {
+        file: "private/qquickshadereffectmesh_p.h"
+        name: "QQuickGridMesh"
+        prototype: "QQuickShaderEffectMesh"
+        exports: ["QtQuick/GridMesh 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "resolution"; type: "QSize" }
+    }
+    Component {
+        file: "private/qquickgridview_p.h"
+        name: "QQuickGridView"
+        defaultProperty: "data"
+        prototype: "QQuickItemView"
+        exports: [
+            "QtQuick/GridView 2.0",
+            "QtQuick/GridView 2.1",
+            "QtQuick/GridView 2.10",
+            "QtQuick/GridView 2.11",
+            "QtQuick/GridView 2.12",
+            "QtQuick/GridView 2.13",
+            "QtQuick/GridView 2.15",
+            "QtQuick/GridView 2.3",
+            "QtQuick/GridView 2.4",
+            "QtQuick/GridView 2.7",
+            "QtQuick/GridView 2.9"
+        ]
+        exportMetaObjectRevisions: [0, 1, 10, 11, 12, 13, 15, 3, 4, 7, 9]
+        attachedType: "QQuickGridViewAttached"
+        Enum {
+            name: "Flow"
+            values: ["FlowLeftToRight", "FlowTopToBottom"]
+        }
+        Enum {
+            name: "SnapMode"
+            values: ["NoSnap", "SnapToRow", "SnapOneRow"]
+        }
+        Property { name: "flow"; type: "Flow" }
+        Property { name: "cellWidth"; type: "double" }
+        Property { name: "cellHeight"; type: "double" }
+        Property { name: "snapMode"; type: "SnapMode" }
+        Signal { name: "highlightMoveDurationChanged" }
+        Method { name: "moveCurrentIndexUp" }
+        Method { name: "moveCurrentIndexDown" }
+        Method { name: "moveCurrentIndexLeft" }
+        Method { name: "moveCurrentIndexRight" }
+    }
+    Component { name: "QQuickGridViewAttached"; prototype: "QQuickItemViewAttached" }
+    Component {
+        file: "private/qquickhoverhandler_p.h"
+        name: "QQuickHoverHandler"
+        prototype: "QQuickSinglePointHandler"
+        exports: ["QtQuick/HoverHandler 2.12", "QtQuick/HoverHandler 2.15"]
+        exportMetaObjectRevisions: [12, 15]
+        Property { name: "hovered"; type: "bool"; isReadonly: true }
+    }
+    Component {
+        file: "private/qquickimage_p.h"
+        name: "QQuickImage"
+        prototype: "QQuickImageBase"
+        exports: [
+            "QtQuick/Image 2.0",
+            "QtQuick/Image 2.1",
+            "QtQuick/Image 2.11",
+            "QtQuick/Image 2.14",
+            "QtQuick/Image 2.15",
+            "QtQuick/Image 2.3",
+            "QtQuick/Image 2.4",
+            "QtQuick/Image 2.5",
+            "QtQuick/Image 2.7"
+        ]
+        exportMetaObjectRevisions: [0, 1, 11, 14, 15, 3, 4, 5, 7]
+        Enum {
+            name: "HAlignment"
+            values: ["AlignLeft", "AlignRight", "AlignHCenter"]
+        }
+        Enum {
+            name: "VAlignment"
+            values: ["AlignTop", "AlignBottom", "AlignVCenter"]
+        }
+        Enum {
+            name: "FillMode"
+            values: [
+                "Stretch",
+                "PreserveAspectFit",
+                "PreserveAspectCrop",
+                "Tile",
+                "TileVertically",
+                "TileHorizontally",
+                "Pad"
+            ]
+        }
+        Property { name: "fillMode"; type: "FillMode" }
+        Property { name: "paintedWidth"; type: "double"; isReadonly: true }
+        Property { name: "paintedHeight"; type: "double"; isReadonly: true }
+        Property { name: "horizontalAlignment"; type: "HAlignment" }
+        Property { name: "verticalAlignment"; type: "VAlignment" }
+        Property { name: "mipmap"; revision: 3; type: "bool" }
+        Property { name: "autoTransform"; revision: 5; type: "bool" }
+        Property { name: "sourceClipRect"; revision: 15; type: "QRectF" }
+        Signal { name: "paintedGeometryChanged" }
+        Signal {
+            name: "horizontalAlignmentChanged"
+            Parameter { name: "alignment"; type: "HAlignment" }
+        }
+        Signal {
+            name: "verticalAlignmentChanged"
+            Parameter { name: "alignment"; type: "VAlignment" }
+        }
+        Signal {
+            name: "mipmapChanged"
+            revision: 3
+            Parameter { type: "bool" }
+        }
+        Signal { name: "autoTransformChanged"; revision: 5 }
+        Method { name: "invalidateSceneGraph" }
+    }
+    Component {
+        file: "private/qquickimagebase_p.h"
+        name: "QQuickImageBase"
+        prototype: "QQuickImplicitSizeItem"
+        exports: ["QtQuick/ImageBase 2.14", "QtQuick/ImageBase 2.15"]
+        isCreatable: false
+        exportMetaObjectRevisions: [14, 15]
+        Enum {
+            name: "LoadPixmapOptions"
+            alias: "LoadPixmapOption"
+            isFlag: true
+            values: ["NoOption", "HandleDPR", "UseProviderOptions"]
+        }
+        Enum {
+            name: "Status"
+            values: ["Null", "Ready", "Loading", "Error"]
+        }
+        Property { name: "status"; type: "Status"; isReadonly: true }
+        Property { name: "source"; type: "QUrl" }
+        Property { name: "progress"; type: "double"; isReadonly: true }
+        Property { name: "asynchronous"; type: "bool" }
+        Property { name: "cache"; type: "bool" }
+        Property { name: "sourceSize"; type: "QSize" }
+        Property { name: "mirror"; type: "bool" }
+        Property { name: "currentFrame"; revision: 14; type: "int" }
+        Property { name: "frameCount"; revision: 14; type: "int"; isReadonly: true }
+        Property { name: "colorSpace"; revision: 15; type: "QColorSpace" }
+        Signal {
+            name: "sourceChanged"
+            Parameter { type: "QUrl" }
+        }
+        Signal {
+            name: "statusChanged"
+            Parameter { type: "QQuickImageBase::Status" }
+        }
+        Signal {
+            name: "progressChanged"
+            Parameter { name: "progress"; type: "double" }
+        }
+        Signal { name: "currentFrameChanged"; revision: 14 }
+        Signal { name: "frameCountChanged"; revision: 14 }
+        Signal { name: "sourceClipRectChanged"; revision: 15 }
+        Signal { name: "colorSpaceChanged"; revision: 15 }
+        Method { name: "requestFinished" }
+        Method {
+            name: "requestProgress"
+            Parameter { type: "qlonglong" }
+            Parameter { type: "qlonglong" }
+        }
+    }
+    Component {
+        file: "qquickitem.h"
+        name: "QQuickImplicitSizeItem"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        Property { name: "implicitWidth"; type: "double"; isReadonly: true }
+        Property { name: "implicitHeight"; type: "double"; isReadonly: true }
+    }
+    Component {
+        file: "private/qquickvalidator_p.h"
+        name: "QQuickIntValidator"
+        prototype: "QIntValidator"
+        exports: ["QtQuick/IntValidator 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "locale"; type: "string" }
+        Signal { name: "localeNameChanged" }
+    }
+    Component {
+        file: "qquickitem.h"
+        name: "QQuickItem"
+        defaultProperty: "data"
+        prototype: "QObject"
+        exports: [
+            "QtQuick/Item 2.0",
+            "QtQuick/Item 2.1",
+            "QtQuick/Item 2.11",
+            "QtQuick/Item 2.4",
+            "QtQuick/Item 2.7"
+        ]
+        exportMetaObjectRevisions: [0, 1, 11, 4, 7]
+        Enum {
+            name: "Flags"
+            alias: "Flag"
+            isFlag: true
+            values: [
+                "ItemClipsChildrenToShape",
+                "ItemAcceptsInputMethod",
+                "ItemIsFocusScope",
+                "ItemHasContents",
+                "ItemAcceptsDrops"
+            ]
+        }
+        Enum {
+            name: "TransformOrigin"
+            values: [
+                "TopLeft",
+                "Top",
+                "TopRight",
+                "Left",
+                "Center",
+                "Right",
+                "BottomLeft",
+                "Bottom",
+                "BottomRight"
+            ]
+        }
+        Property { name: "parent"; type: "QQuickItem"; isPointer: true }
+        Property { name: "data"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "resources"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "children"; type: "QQuickItem"; isList: true; isReadonly: true }
+        Property { name: "x"; type: "double" }
+        Property { name: "y"; type: "double" }
+        Property { name: "z"; type: "double" }
+        Property { name: "width"; type: "double" }
+        Property { name: "height"; type: "double" }
+        Property { name: "opacity"; type: "double" }
+        Property { name: "enabled"; type: "bool" }
+        Property { name: "visible"; type: "bool" }
+        Property { name: "visibleChildren"; type: "QQuickItem"; isList: true; isReadonly: true }
+        Property { name: "states"; type: "QQuickState"; isList: true; isReadonly: true }
+        Property { name: "transitions"; type: "QQuickTransition"; isList: true; isReadonly: true }
+        Property { name: "state"; type: "string" }
+        Property { name: "childrenRect"; type: "QRectF"; isReadonly: true }
+        Property { name: "anchors"; type: "QQuickAnchors"; isReadonly: true; isPointer: true }
+        Property { name: "left"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "right"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "horizontalCenter"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "top"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "bottom"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "verticalCenter"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "baseline"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "baselineOffset"; type: "double" }
+        Property { name: "clip"; type: "bool" }
+        Property { name: "focus"; type: "bool" }
+        Property { name: "activeFocus"; type: "bool"; isReadonly: true }
+        Property { name: "activeFocusOnTab"; revision: 1; type: "bool" }
+        Property { name: "rotation"; type: "double" }
+        Property { name: "scale"; type: "double" }
+        Property { name: "transformOrigin"; type: "TransformOrigin" }
+        Property { name: "transformOriginPoint"; type: "QPointF"; isReadonly: true }
+        Property { name: "transform"; type: "QQuickTransform"; isList: true; isReadonly: true }
+        Property { name: "smooth"; type: "bool" }
+        Property { name: "antialiasing"; type: "bool" }
+        Property { name: "implicitWidth"; type: "double" }
+        Property { name: "implicitHeight"; type: "double" }
+        Property { name: "containmentMask"; revision: 11; type: "QObject"; isPointer: true }
+        Property { name: "layer"; type: "QQuickItemLayer"; isReadonly: true; isPointer: true }
+        Signal {
+            name: "childrenRectChanged"
+            Parameter { type: "QRectF" }
+        }
+        Signal {
+            name: "baselineOffsetChanged"
+            Parameter { type: "double" }
+        }
+        Signal {
+            name: "stateChanged"
+            Parameter { type: "string" }
+        }
+        Signal {
+            name: "focusChanged"
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "activeFocusChanged"
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "activeFocusOnTabChanged"
+            revision: 1
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "parentChanged"
+            Parameter { type: "QQuickItem"; isPointer: true }
+        }
+        Signal {
+            name: "transformOriginChanged"
+            Parameter { type: "TransformOrigin" }
+        }
+        Signal {
+            name: "smoothChanged"
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "antialiasingChanged"
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "clipChanged"
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "windowChanged"
+            revision: 1
+            Parameter { name: "window"; type: "QQuickWindow"; isPointer: true }
+        }
+        Signal { name: "containmentMaskChanged"; revision: 11 }
+        Method { name: "update" }
+        Method {
+            name: "_q_resourceObjectDeleted"
+            Parameter { type: "QObject"; isPointer: true }
+        }
+        Method {
+            name: "_q_createJSWrapper"
+            type: "qulonglong"
+            Parameter { type: "QV4::ExecutionEngine"; isPointer: true }
+        }
+        Method {
+            name: "grabToImage"
+            revision: 4
+            type: "bool"
+            Parameter { name: "callback"; type: "QJSValue" }
+            Parameter { name: "targetSize"; type: "QSize" }
+        }
+        Method {
+            name: "grabToImage"
+            revision: 4
+            type: "bool"
+            Parameter { name: "callback"; type: "QJSValue" }
+        }
+        Method {
+            name: "contains"
+            type: "bool"
+            Parameter { name: "point"; type: "QPointF" }
+        }
+        Method {
+            name: "mapFromItem"
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "mapToItem"
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "mapFromGlobal"
+            revision: 7
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "mapToGlobal"
+            revision: 7
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+        Method { name: "forceActiveFocus" }
+        Method {
+            name: "forceActiveFocus"
+            Parameter { name: "reason"; type: "Qt::FocusReason" }
+        }
+        Method {
+            name: "nextItemInFocusChain"
+            revision: 1
+            type: "QQuickItem*"
+            Parameter { name: "forward"; type: "bool" }
+        }
+        Method { name: "nextItemInFocusChain"; revision: 1; type: "QQuickItem*" }
+        Method {
+            name: "childAt"
+            type: "QQuickItem*"
+            Parameter { name: "x"; type: "double" }
+            Parameter { name: "y"; type: "double" }
+        }
+    }
+    Component {
+        file: "qquickitemgrabresult.h"
+        name: "QQuickItemGrabResult"
+        prototype: "QObject"
+        Property { name: "image"; type: "QImage"; isReadonly: true }
+        Property { name: "url"; type: "QUrl"; isReadonly: true }
+        Signal { name: "ready" }
+        Method { name: "setup" }
+        Method { name: "render" }
+        Method {
+            name: "saveToFile"
+            type: "bool"
+            Parameter { name: "fileName"; type: "string" }
+        }
+        Method {
+            name: "saveToFile"
+            type: "bool"
+            Parameter { name: "fileName"; type: "string" }
+        }
+    }
+    Component {
+        file: "private/qquickitem_p.h"
+        name: "QQuickItemLayer"
+        prototype: "QObject"
+        Property { name: "enabled"; type: "bool" }
+        Property { name: "textureSize"; type: "QSize" }
+        Property { name: "sourceRect"; type: "QRectF" }
+        Property { name: "mipmap"; type: "bool" }
+        Property { name: "smooth"; type: "bool" }
+        Property { name: "wrapMode"; type: "QQuickShaderEffectSource::WrapMode" }
+        Property { name: "format"; type: "QQuickShaderEffectSource::Format" }
+        Property { name: "samplerName"; type: "QByteArray" }
+        Property { name: "effect"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "textureMirroring"; type: "QQuickShaderEffectSource::TextureMirroring" }
+        Property { name: "samples"; type: "int" }
+        Signal {
+            name: "enabledChanged"
+            Parameter { name: "enabled"; type: "bool" }
+        }
+        Signal {
+            name: "sizeChanged"
+            Parameter { name: "size"; type: "QSize" }
+        }
+        Signal {
+            name: "mipmapChanged"
+            Parameter { name: "mipmap"; type: "bool" }
+        }
+        Signal {
+            name: "wrapModeChanged"
+            Parameter { name: "mode"; type: "QQuickShaderEffectSource::WrapMode" }
+        }
+        Signal {
+            name: "nameChanged"
+            Parameter { name: "name"; type: "QByteArray" }
+        }
+        Signal {
+            name: "effectChanged"
+            Parameter { name: "component"; type: "QQmlComponent"; isPointer: true }
+        }
+        Signal {
+            name: "smoothChanged"
+            Parameter { name: "smooth"; type: "bool" }
+        }
+        Signal {
+            name: "formatChanged"
+            Parameter { name: "format"; type: "QQuickShaderEffectSource::Format" }
+        }
+        Signal {
+            name: "sourceRectChanged"
+            Parameter { name: "sourceRect"; type: "QRectF" }
+        }
+        Signal {
+            name: "textureMirroringChanged"
+            Parameter { name: "mirroring"; type: "QQuickShaderEffectSource::TextureMirroring" }
+        }
+        Signal {
+            name: "samplesChanged"
+            Parameter { name: "count"; type: "int" }
+        }
+    }
+    Component {
+        file: "private/qquickitemview_p.h"
+        name: "QQuickItemView"
+        defaultProperty: "flickableData"
+        prototype: "QQuickFlickable"
+        exports: [
+            "QtQuick/ItemView 2.1",
+            "QtQuick/ItemView 2.10",
+            "QtQuick/ItemView 2.11",
+            "QtQuick/ItemView 2.12",
+            "QtQuick/ItemView 2.13",
+            "QtQuick/ItemView 2.15",
+            "QtQuick/ItemView 2.3",
+            "QtQuick/ItemView 2.4",
+            "QtQuick/ItemView 2.7",
+            "QtQuick/ItemView 2.9"
+        ]
+        isCreatable: false
+        exportMetaObjectRevisions: [1, 10, 11, 12, 13, 15, 3, 4, 7, 9]
+        Enum {
+            name: "LayoutDirection"
+            values: [
+                "LeftToRight",
+                "RightToLeft",
+                "VerticalTopToBottom",
+                "VerticalBottomToTop"
+            ]
+        }
+        Enum {
+            name: "VerticalLayoutDirection"
+            values: ["TopToBottom", "BottomToTop"]
+        }
+        Enum {
+            name: "HighlightRangeMode"
+            values: ["NoHighlightRange", "ApplyRange", "StrictlyEnforceRange"]
+        }
+        Enum {
+            name: "PositionMode"
+            values: [
+                "Beginning",
+                "Center",
+                "End",
+                "Visible",
+                "Contain",
+                "SnapPosition"
+            ]
+        }
+        Property { name: "model"; type: "QVariant" }
+        Property { name: "delegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "count"; type: "int"; isReadonly: true }
+        Property { name: "currentIndex"; type: "int" }
+        Property { name: "currentItem"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property { name: "keyNavigationWraps"; type: "bool" }
+        Property { name: "keyNavigationEnabled"; revision: 7; type: "bool" }
+        Property { name: "cacheBuffer"; type: "int" }
+        Property { name: "displayMarginBeginning"; revision: 3; type: "int" }
+        Property { name: "displayMarginEnd"; revision: 3; type: "int" }
+        Property { name: "layoutDirection"; type: "Qt::LayoutDirection" }
+        Property { name: "effectiveLayoutDirection"; type: "Qt::LayoutDirection"; isReadonly: true }
+        Property { name: "verticalLayoutDirection"; type: "VerticalLayoutDirection" }
+        Property { name: "header"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "headerItem"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property { name: "footer"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "footerItem"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property { name: "populate"; type: "QQuickTransition"; isPointer: true }
+        Property { name: "add"; type: "QQuickTransition"; isPointer: true }
+        Property { name: "addDisplaced"; type: "QQuickTransition"; isPointer: true }
+        Property { name: "move"; type: "QQuickTransition"; isPointer: true }
+        Property { name: "moveDisplaced"; type: "QQuickTransition"; isPointer: true }
+        Property { name: "remove"; type: "QQuickTransition"; isPointer: true }
+        Property { name: "removeDisplaced"; type: "QQuickTransition"; isPointer: true }
+        Property { name: "displaced"; type: "QQuickTransition"; isPointer: true }
+        Property { name: "highlight"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "highlightItem"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property { name: "highlightFollowsCurrentItem"; type: "bool" }
+        Property { name: "highlightRangeMode"; type: "HighlightRangeMode" }
+        Property { name: "preferredHighlightBegin"; type: "double" }
+        Property { name: "preferredHighlightEnd"; type: "double" }
+        Property { name: "highlightMoveDuration"; type: "int" }
+        Property { name: "reuseItems"; revision: 15; type: "bool" }
+        Signal { name: "keyNavigationEnabledChanged"; revision: 7 }
+        Signal { name: "populateTransitionChanged" }
+        Signal { name: "addTransitionChanged" }
+        Signal { name: "addDisplacedTransitionChanged" }
+        Signal { name: "moveTransitionChanged" }
+        Signal { name: "moveDisplacedTransitionChanged" }
+        Signal { name: "removeTransitionChanged" }
+        Signal { name: "removeDisplacedTransitionChanged" }
+        Signal { name: "displacedTransitionChanged" }
+        Signal { name: "reuseItemsChanged"; revision: 15 }
+        Method { name: "destroyRemoved" }
+        Method {
+            name: "createdItem"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "item"; type: "QObject"; isPointer: true }
+        }
+        Method {
+            name: "initItem"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "item"; type: "QObject"; isPointer: true }
+        }
+        Method {
+            name: "modelUpdated"
+            Parameter { name: "changeSet"; type: "QQmlChangeSet" }
+            Parameter { name: "reset"; type: "bool" }
+        }
+        Method {
+            name: "destroyingItem"
+            Parameter { name: "item"; type: "QObject"; isPointer: true }
+        }
+        Method {
+            name: "onItemPooled"
+            revision: 15
+            Parameter { name: "modelIndex"; type: "int" }
+            Parameter { name: "object"; type: "QObject"; isPointer: true }
+        }
+        Method {
+            name: "onItemReused"
+            revision: 15
+            Parameter { name: "modelIndex"; type: "int" }
+            Parameter { name: "object"; type: "QObject"; isPointer: true }
+        }
+        Method { name: "animStopped" }
+        Method { name: "trackedPositionChanged" }
+        Method {
+            name: "positionViewAtIndex"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "mode"; type: "int" }
+        }
+        Method {
+            name: "indexAt"
+            type: "int"
+            Parameter { name: "x"; type: "double" }
+            Parameter { name: "y"; type: "double" }
+        }
+        Method {
+            name: "itemAt"
+            type: "QQuickItem*"
+            Parameter { name: "x"; type: "double" }
+            Parameter { name: "y"; type: "double" }
+        }
+        Method {
+            name: "itemAtIndex"
+            revision: 13
+            type: "QQuickItem*"
+            Parameter { name: "index"; type: "int" }
+        }
+        Method { name: "positionViewAtBeginning" }
+        Method { name: "positionViewAtEnd" }
+        Method { name: "forceLayout"; revision: 1 }
+    }
+    Component {
+        name: "QQuickItemViewAttached"
+        prototype: "QObject"
+        Property { name: "view"; type: "QQuickItemView"; isReadonly: true; isPointer: true }
+        Property { name: "isCurrentItem"; type: "bool"; isReadonly: true }
+        Property { name: "delayRemove"; type: "bool" }
+        Property { name: "section"; type: "string"; isReadonly: true }
+        Property { name: "previousSection"; type: "string"; isReadonly: true }
+        Property { name: "nextSection"; type: "string"; isReadonly: true }
+        Signal { name: "currentItemChanged" }
+        Signal { name: "add" }
+        Signal { name: "remove" }
+        Signal { name: "prevSectionChanged" }
+        Signal { name: "pooled" }
+        Signal { name: "reused" }
+    }
+    Component {
+        file: "private/qquickevents_p_p.h"
+        name: "QQuickKeyEvent"
+        prototype: "QObject"
+        Property { name: "key"; type: "int"; isReadonly: true }
+        Property { name: "text"; type: "string"; isReadonly: true }
+        Property { name: "modifiers"; type: "int"; isReadonly: true }
+        Property { name: "isAutoRepeat"; type: "bool"; isReadonly: true }
+        Property { name: "count"; type: "int"; isReadonly: true }
+        Property { name: "nativeScanCode"; type: "uint"; isReadonly: true }
+        Property { name: "accepted"; type: "bool" }
+        Method {
+            name: "matches"
+            revision: 2
+            type: "bool"
+            Parameter { name: "key"; type: "QKeySequence::StandardKey" }
+        }
+    }
+    Component {
+        file: "private/qquickitem_p.h"
+        name: "QQuickKeyNavigationAttached"
+        prototype: "QObject"
+        exports: ["QtQuick/KeyNavigation 2.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        attachedType: "QQuickKeyNavigationAttached"
+        Enum {
+            name: "Priority"
+            values: ["BeforeItem", "AfterItem"]
+        }
+        Property { name: "left"; type: "QQuickItem"; isPointer: true }
+        Property { name: "right"; type: "QQuickItem"; isPointer: true }
+        Property { name: "up"; type: "QQuickItem"; isPointer: true }
+        Property { name: "down"; type: "QQuickItem"; isPointer: true }
+        Property { name: "tab"; type: "QQuickItem"; isPointer: true }
+        Property { name: "backtab"; type: "QQuickItem"; isPointer: true }
+        Property { name: "priority"; type: "Priority" }
+    }
+    Component {
+        file: "private/qquickitem_p.h"
+        name: "QQuickKeysAttached"
+        prototype: "QObject"
+        exports: ["QtQuick/Keys 2.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        attachedType: "QQuickKeysAttached"
+        Enum {
+            name: "Priority"
+            values: ["BeforeItem", "AfterItem"]
+        }
+        Property { name: "enabled"; type: "bool" }
+        Property { name: "forwardTo"; type: "QQuickItem"; isList: true; isReadonly: true }
+        Property { name: "priority"; type: "Priority" }
+        Signal {
+            name: "pressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "released"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "shortcutOverride"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "digit0Pressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "digit1Pressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "digit2Pressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "digit3Pressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "digit4Pressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "digit5Pressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "digit6Pressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "digit7Pressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "digit8Pressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "digit9Pressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "leftPressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "rightPressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "upPressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "downPressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "tabPressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "backtabPressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "asteriskPressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "numberSignPressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "escapePressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "returnPressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "enterPressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "deletePressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "spacePressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "backPressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "cancelPressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "selectPressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "yesPressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "noPressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "context1Pressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "context2Pressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "context3Pressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "context4Pressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "callPressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "hangupPressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "flipPressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "menuPressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "volumeUpPressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+        Signal {
+            name: "volumeDownPressed"
+            Parameter { name: "event"; type: "QQuickKeyEvent"; isPointer: true }
+        }
+    }
+    Component {
+        file: "private/qquickitem_p.h"
+        name: "QQuickLayoutMirroringAttached"
+        prototype: "QObject"
+        exports: ["QtQuick/LayoutMirroring 2.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        attachedType: "QQuickLayoutMirroringAttached"
+        Property { name: "enabled"; type: "bool" }
+        Property { name: "childrenInherit"; type: "bool" }
+    }
+    Component {
+        file: "private/qquicklistview_p.h"
+        name: "QQuickListView"
+        defaultProperty: "data"
+        prototype: "QQuickItemView"
+        exports: [
+            "QtQuick/ListView 2.0",
+            "QtQuick/ListView 2.1",
+            "QtQuick/ListView 2.10",
+            "QtQuick/ListView 2.11",
+            "QtQuick/ListView 2.12",
+            "QtQuick/ListView 2.13",
+            "QtQuick/ListView 2.15",
+            "QtQuick/ListView 2.3",
+            "QtQuick/ListView 2.4",
+            "QtQuick/ListView 2.7",
+            "QtQuick/ListView 2.9"
+        ]
+        exportMetaObjectRevisions: [0, 1, 10, 11, 12, 13, 15, 3, 4, 7, 9]
+        attachedType: "QQuickListViewAttached"
+        Enum {
+            name: "Orientation"
+            values: ["Horizontal", "Vertical"]
+        }
+        Enum {
+            name: "SnapMode"
+            values: ["NoSnap", "SnapToItem", "SnapOneItem"]
+        }
+        Enum {
+            name: "HeaderPositioning"
+            values: ["InlineHeader", "OverlayHeader", "PullBackHeader"]
+        }
+        Enum {
+            name: "FooterPositioning"
+            values: ["InlineFooter", "OverlayFooter", "PullBackFooter"]
+        }
+        Property { name: "highlightMoveVelocity"; type: "double" }
+        Property { name: "highlightResizeVelocity"; type: "double" }
+        Property { name: "highlightResizeDuration"; type: "int" }
+        Property { name: "spacing"; type: "double" }
+        Property { name: "orientation"; type: "Orientation" }
+        Property { name: "section"; type: "QQuickViewSection"; isReadonly: true; isPointer: true }
+        Property { name: "currentSection"; type: "string"; isReadonly: true }
+        Property { name: "snapMode"; type: "SnapMode" }
+        Property { name: "headerPositioning"; revision: 4; type: "HeaderPositioning" }
+        Property { name: "footerPositioning"; revision: 4; type: "FooterPositioning" }
+        Signal { name: "headerPositioningChanged"; revision: 4 }
+        Signal { name: "footerPositioningChanged"; revision: 4 }
+        Method { name: "incrementCurrentIndex" }
+        Method { name: "decrementCurrentIndex" }
+    }
+    Component { name: "QQuickListViewAttached"; prototype: "QQuickItemViewAttached" }
+    Component {
+        file: "private/qquickloader_p.h"
+        name: "QQuickLoader"
+        prototype: "QQuickImplicitSizeItem"
+        exports: [
+            "QtQuick/Loader 2.0",
+            "QtQuick/Loader 2.1",
+            "QtQuick/Loader 2.11",
+            "QtQuick/Loader 2.4",
+            "QtQuick/Loader 2.7"
+        ]
+        exportMetaObjectRevisions: [0, 1, 11, 4, 7]
+        Enum {
+            name: "Status"
+            values: ["Null", "Ready", "Loading", "Error"]
+        }
+        Property { name: "active"; type: "bool" }
+        Property { name: "source"; type: "QUrl" }
+        Property { name: "sourceComponent"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "item"; type: "QObject"; isReadonly: true; isPointer: true }
+        Property { name: "status"; type: "Status"; isReadonly: true }
+        Property { name: "progress"; type: "double"; isReadonly: true }
+        Property { name: "asynchronous"; type: "bool" }
+        Signal { name: "loaded" }
+        Method { name: "_q_sourceLoaded" }
+        Method { name: "_q_updateSize" }
+        Method {
+            name: "setSource"
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+    }
+    Component {
+        file: "private/qquicktranslate_p.h"
+        name: "QQuickMatrix4x4"
+        prototype: "QQuickTransform"
+        exports: ["QtQuick/Matrix4x4 2.3"]
+        exportMetaObjectRevisions: [3]
+        Property { name: "matrix"; type: "QMatrix4x4" }
+    }
+    Component {
+        file: "private/qquickmousearea_p.h"
+        name: "QQuickMouseArea"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        exports: [
+            "QtQuick/MouseArea 2.0",
+            "QtQuick/MouseArea 2.1",
+            "QtQuick/MouseArea 2.11",
+            "QtQuick/MouseArea 2.4",
+            "QtQuick/MouseArea 2.5",
+            "QtQuick/MouseArea 2.7",
+            "QtQuick/MouseArea 2.9"
+        ]
+        exportMetaObjectRevisions: [0, 1, 11, 4, 5, 7, 9]
+        Property { name: "mouseX"; type: "double"; isReadonly: true }
+        Property { name: "mouseY"; type: "double"; isReadonly: true }
+        Property { name: "containsMouse"; type: "bool"; isReadonly: true }
+        Property { name: "pressed"; type: "bool"; isReadonly: true }
+        Property { name: "enabled"; type: "bool" }
+        Property { name: "scrollGestureEnabled"; revision: 5; type: "bool" }
+        Property { name: "pressedButtons"; type: "Qt::MouseButtons"; isReadonly: true }
+        Property { name: "acceptedButtons"; type: "Qt::MouseButtons" }
+        Property { name: "hoverEnabled"; type: "bool" }
+        Property { name: "drag"; type: "QQuickDrag"; isReadonly: true; isPointer: true }
+        Property { name: "preventStealing"; type: "bool" }
+        Property { name: "propagateComposedEvents"; type: "bool" }
+        Property { name: "cursorShape"; type: "Qt::CursorShape" }
+        Property { name: "containsPress"; revision: 4; type: "bool"; isReadonly: true }
+        Property { name: "pressAndHoldInterval"; revision: 9; type: "int" }
+        Signal { name: "hoveredChanged" }
+        Signal { name: "scrollGestureEnabledChanged"; revision: 5 }
+        Signal {
+            name: "positionChanged"
+            Parameter { name: "mouse"; type: "QQuickMouseEvent"; isPointer: true }
+        }
+        Signal {
+            name: "mouseXChanged"
+            Parameter { name: "mouse"; type: "QQuickMouseEvent"; isPointer: true }
+        }
+        Signal {
+            name: "mouseYChanged"
+            Parameter { name: "mouse"; type: "QQuickMouseEvent"; isPointer: true }
+        }
+        Signal {
+            name: "pressed"
+            Parameter { name: "mouse"; type: "QQuickMouseEvent"; isPointer: true }
+        }
+        Signal {
+            name: "pressAndHold"
+            Parameter { name: "mouse"; type: "QQuickMouseEvent"; isPointer: true }
+        }
+        Signal {
+            name: "released"
+            Parameter { name: "mouse"; type: "QQuickMouseEvent"; isPointer: true }
+        }
+        Signal {
+            name: "clicked"
+            Parameter { name: "mouse"; type: "QQuickMouseEvent"; isPointer: true }
+        }
+        Signal {
+            name: "doubleClicked"
+            Parameter { name: "mouse"; type: "QQuickMouseEvent"; isPointer: true }
+        }
+        Signal {
+            name: "wheel"
+            Parameter { name: "wheel"; type: "QQuickWheelEvent"; isPointer: true }
+        }
+        Signal { name: "entered" }
+        Signal { name: "exited" }
+        Signal { name: "canceled" }
+        Signal { name: "containsPressChanged"; revision: 4 }
+        Signal { name: "pressAndHoldIntervalChanged"; revision: 9 }
+    }
+    Component {
+        file: "private/qquickevents_p_p.h"
+        name: "QQuickMouseEvent"
+        prototype: "QObject"
+        Property { name: "x"; type: "double"; isReadonly: true }
+        Property { name: "y"; type: "double"; isReadonly: true }
+        Property { name: "button"; type: "int"; isReadonly: true }
+        Property { name: "buttons"; type: "int"; isReadonly: true }
+        Property { name: "modifiers"; type: "int"; isReadonly: true }
+        Property { name: "source"; revision: 7; type: "int"; isReadonly: true }
+        Property { name: "wasHeld"; type: "bool"; isReadonly: true }
+        Property { name: "isClick"; type: "bool"; isReadonly: true }
+        Property { name: "accepted"; type: "bool" }
+        Property { name: "flags"; revision: 11; type: "int"; isReadonly: true }
+    }
+    Component {
+        file: "private/qquickpointerhandler_p.h"
+        name: "QQuickMultiPointHandler"
+        prototype: "QQuickPointerDeviceHandler"
+        Property { name: "minimumPointCount"; type: "int" }
+        Property { name: "maximumPointCount"; type: "int" }
+        Property { name: "centroid"; type: "QQuickHandlerPoint"; isReadonly: true }
+    }
+    Component {
+        file: "private/qquickmultipointtoucharea_p.h"
+        name: "QQuickMultiPointTouchArea"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        exports: [
+            "QtQuick/MultiPointTouchArea 2.0",
+            "QtQuick/MultiPointTouchArea 2.1",
+            "QtQuick/MultiPointTouchArea 2.11",
+            "QtQuick/MultiPointTouchArea 2.4",
+            "QtQuick/MultiPointTouchArea 2.7"
+        ]
+        exportMetaObjectRevisions: [0, 1, 11, 4, 7]
+        Property { name: "touchPoints"; type: "QQuickTouchPoint"; isList: true; isReadonly: true }
+        Property { name: "minimumTouchPoints"; type: "int" }
+        Property { name: "maximumTouchPoints"; type: "int" }
+        Property { name: "mouseEnabled"; type: "bool" }
+        Signal {
+            name: "pressed"
+            Parameter { name: "touchPoints"; type: "QList<QObject*>" }
+        }
+        Signal {
+            name: "updated"
+            Parameter { name: "touchPoints"; type: "QList<QObject*>" }
+        }
+        Signal {
+            name: "released"
+            Parameter { name: "touchPoints"; type: "QList<QObject*>" }
+        }
+        Signal {
+            name: "canceled"
+            Parameter { name: "touchPoints"; type: "QList<QObject*>" }
+        }
+        Signal {
+            name: "gestureStarted"
+            Parameter { name: "gesture"; type: "QQuickGrabGestureEvent"; isPointer: true }
+        }
+        Signal {
+            name: "touchUpdated"
+            Parameter { name: "touchPoints"; type: "QList<QObject*>" }
+        }
+    }
+    Component {
+        file: "private/qquickanimation_p.h"
+        name: "QQuickNumberAnimation"
+        prototype: "QQuickPropertyAnimation"
+        exports: [
+            "QtQuick/NumberAnimation 2.0",
+            "QtQuick/NumberAnimation 2.12"
+        ]
+        exportMetaObjectRevisions: [0, 12]
+        Property { name: "from"; type: "double" }
+        Property { name: "to"; type: "double" }
+    }
+    Component {
+        file: "private/qquickanimator_p.h"
+        name: "QQuickOpacityAnimator"
+        prototype: "QQuickAnimator"
+        exports: [
+            "QtQuick/OpacityAnimator 2.12",
+            "QtQuick/OpacityAnimator 2.2"
+        ]
+        exportMetaObjectRevisions: [12, 2]
+    }
+    Component {
+        file: "private/qquickopenglinfo_p.h"
+        name: "QQuickOpenGLInfo"
+        prototype: "QObject"
+        exports: ["QtQuick/OpenGLInfo 2.4"]
+        isCreatable: false
+        exportMetaObjectRevisions: [4]
+        attachedType: "QQuickOpenGLInfo"
+        Enum {
+            name: "ContextProfile"
+            values: ["NoProfile", "CoreProfile", "CompatibilityProfile"]
+        }
+        Enum {
+            name: "RenderableType"
+            values: ["Unspecified", "OpenGL", "OpenGLES"]
+        }
+        Property { name: "majorVersion"; type: "int"; isReadonly: true }
+        Property { name: "minorVersion"; type: "int"; isReadonly: true }
+        Property { name: "profile"; type: "ContextProfile"; isReadonly: true }
+        Property { name: "renderableType"; type: "RenderableType"; isReadonly: true }
+        Method { name: "updateFormat" }
+        Method {
+            name: "setWindow"
+            Parameter { name: "window"; type: "QQuickWindow"; isPointer: true }
+        }
+    }
+    Component {
+        file: "qquickpainteditem.h"
+        name: "QQuickPaintedItem"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        exports: [
+            "QtQuick/PaintedItem 2.0",
+            "QtQuick/PaintedItem 2.1",
+            "QtQuick/PaintedItem 2.11",
+            "QtQuick/PaintedItem 2.4",
+            "QtQuick/PaintedItem 2.7"
+        ]
+        isCreatable: false
+        exportMetaObjectRevisions: [0, 1, 11, 4, 7]
+        Enum {
+            name: "RenderTarget"
+            values: [
+                "Image",
+                "FramebufferObject",
+                "InvertedYFramebufferObject"
+            ]
+        }
+        Enum {
+            name: "PerformanceHints"
+            alias: "PerformanceHint"
+            isFlag: true
+            values: ["FastFBOResizing"]
+        }
+        Property { name: "contentsSize"; type: "QSize" }
+        Property { name: "fillColor"; type: "QColor" }
+        Property { name: "contentsScale"; type: "double" }
+        Property { name: "renderTarget"; type: "RenderTarget" }
+        Property { name: "textureSize"; type: "QSize" }
+        Method { name: "invalidateSceneGraph" }
+    }
+    Component {
+        file: "private/qquickanimation_p.h"
+        name: "QQuickParallelAnimation"
+        defaultProperty: "animations"
+        prototype: "QQuickAnimationGroup"
+        exports: [
+            "QtQuick/ParallelAnimation 2.0",
+            "QtQuick/ParallelAnimation 2.12"
+        ]
+        exportMetaObjectRevisions: [0, 12]
+    }
+    Component {
+        file: "private/qquickitemanimation_p.h"
+        name: "QQuickParentAnimation"
+        defaultProperty: "animations"
+        prototype: "QQuickAnimationGroup"
+        exports: [
+            "QtQuick/ParentAnimation 2.0",
+            "QtQuick/ParentAnimation 2.12"
+        ]
+        exportMetaObjectRevisions: [0, 12]
+        Property { name: "target"; type: "QQuickItem"; isPointer: true }
+        Property { name: "newParent"; type: "QQuickItem"; isPointer: true }
+        Property { name: "via"; type: "QQuickItem"; isPointer: true }
+    }
+    Component {
+        file: "private/qquickstateoperations_p.h"
+        name: "QQuickParentChange"
+        prototype: "QQuickStateOperation"
+        exports: ["QtQuick/ParentChange 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "target"; type: "QQuickItem"; isPointer: true }
+        Property { name: "parent"; type: "QQuickItem"; isPointer: true }
+        Property { name: "x"; type: "QQmlScriptString" }
+        Property { name: "y"; type: "QQmlScriptString" }
+        Property { name: "width"; type: "QQmlScriptString" }
+        Property { name: "height"; type: "QQmlScriptString" }
+        Property { name: "scale"; type: "QQmlScriptString" }
+        Property { name: "rotation"; type: "QQmlScriptString" }
+    }
+    Component {
+        file: "private/qquickpath_p.h"
+        name: "QQuickPath"
+        defaultProperty: "pathElements"
+        prototype: "QObject"
+        exports: ["QtQuick/Path 2.0", "QtQuick/Path 2.14"]
+        exportMetaObjectRevisions: [0, 14]
+        Property { name: "pathElements"; type: "QQuickPathElement"; isList: true; isReadonly: true }
+        Property { name: "startX"; type: "double" }
+        Property { name: "startY"; type: "double" }
+        Property { name: "closed"; type: "bool"; isReadonly: true }
+        Property { name: "scale"; revision: 14; type: "QSizeF" }
+        Signal { name: "changed" }
+        Signal { name: "scaleChanged"; revision: 14 }
+        Method { name: "processPath" }
+        Method {
+            name: "pointAtPercent"
+            revision: 14
+            type: "QPointF"
+            Parameter { name: "t"; type: "double" }
+        }
+    }
+    Component {
+        file: "private/qquickpath_p.h"
+        name: "QQuickPathAngleArc"
+        prototype: "QQuickCurve"
+        exports: ["QtQuick/PathAngleArc 2.11"]
+        exportMetaObjectRevisions: [11]
+        Property { name: "centerX"; type: "double" }
+        Property { name: "centerY"; type: "double" }
+        Property { name: "radiusX"; type: "double" }
+        Property { name: "radiusY"; type: "double" }
+        Property { name: "startAngle"; type: "double" }
+        Property { name: "sweepAngle"; type: "double" }
+        Property { name: "moveToStart"; type: "bool" }
+    }
+    Component {
+        file: "private/qquickitemanimation_p.h"
+        name: "QQuickPathAnimation"
+        prototype: "QQuickAbstractAnimation"
+        exports: ["QtQuick/PathAnimation 2.0", "QtQuick/PathAnimation 2.12"]
+        exportMetaObjectRevisions: [0, 12]
+        Enum {
+            name: "Orientation"
+            values: [
+                "Fixed",
+                "RightFirst",
+                "LeftFirst",
+                "BottomFirst",
+                "TopFirst"
+            ]
+        }
+        Property { name: "duration"; type: "int" }
+        Property { name: "easing"; type: "QEasingCurve" }
+        Property { name: "path"; type: "QQuickPath"; isPointer: true }
+        Property { name: "target"; type: "QQuickItem"; isPointer: true }
+        Property { name: "orientation"; type: "Orientation" }
+        Property { name: "anchorPoint"; type: "QPointF" }
+        Property { name: "orientationEntryDuration"; type: "int" }
+        Property { name: "orientationExitDuration"; type: "int" }
+        Property { name: "endRotation"; type: "double" }
+        Signal {
+            name: "durationChanged"
+            Parameter { type: "int" }
+        }
+        Signal {
+            name: "easingChanged"
+            Parameter { type: "QEasingCurve" }
+        }
+        Signal {
+            name: "orientationChanged"
+            Parameter { type: "Orientation" }
+        }
+        Signal {
+            name: "anchorPointChanged"
+            Parameter { type: "QPointF" }
+        }
+        Signal {
+            name: "orientationEntryDurationChanged"
+            Parameter { type: "double" }
+        }
+        Signal {
+            name: "orientationExitDurationChanged"
+            Parameter { type: "double" }
+        }
+        Signal {
+            name: "endRotationChanged"
+            Parameter { type: "double" }
+        }
+    }
+    Component {
+        file: "private/qquickpath_p.h"
+        name: "QQuickPathArc"
+        prototype: "QQuickCurve"
+        exports: ["QtQuick/PathArc 2.0", "QtQuick/PathArc 2.9"]
+        exportMetaObjectRevisions: [0, 9]
+        Enum {
+            name: "ArcDirection"
+            values: ["Clockwise", "Counterclockwise"]
+        }
+        Property { name: "radiusX"; type: "double" }
+        Property { name: "radiusY"; type: "double" }
+        Property { name: "useLargeArc"; type: "bool" }
+        Property { name: "direction"; type: "ArcDirection" }
+        Property { name: "xAxisRotation"; revision: 9; type: "double" }
+        Signal { name: "xAxisRotationChanged"; revision: 9 }
+    }
+    Component {
+        file: "private/qquickpath_p.h"
+        name: "QQuickPathAttribute"
+        prototype: "QQuickPathElement"
+        exports: ["QtQuick/PathAttribute 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "name"; type: "string" }
+        Property { name: "value"; type: "double" }
+    }
+    Component {
+        file: "private/qquickpath_p.h"
+        name: "QQuickPathCatmullRomCurve"
+        prototype: "QQuickCurve"
+        exports: ["QtQuick/PathCurve 2.0"]
+        exportMetaObjectRevisions: [0]
+    }
+    Component {
+        file: "private/qquickpath_p.h"
+        name: "QQuickPathCubic"
+        prototype: "QQuickCurve"
+        exports: ["QtQuick/PathCubic 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "control1X"; type: "double" }
+        Property { name: "control1Y"; type: "double" }
+        Property { name: "control2X"; type: "double" }
+        Property { name: "control2Y"; type: "double" }
+        Property { name: "relativeControl1X"; type: "double" }
+        Property { name: "relativeControl1Y"; type: "double" }
+        Property { name: "relativeControl2X"; type: "double" }
+        Property { name: "relativeControl2Y"; type: "double" }
+    }
+    Component {
+        file: "private/qquickpath_p.h"
+        name: "QQuickPathElement"
+        prototype: "QObject"
+        Signal { name: "changed" }
+    }
+    Component {
+        file: "private/qquickpathinterpolator_p.h"
+        name: "QQuickPathInterpolator"
+        prototype: "QObject"
+        exports: ["QtQuick/PathInterpolator 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "path"; type: "QQuickPath"; isPointer: true }
+        Property { name: "progress"; type: "double" }
+        Property { name: "x"; type: "double"; isReadonly: true }
+        Property { name: "y"; type: "double"; isReadonly: true }
+        Property { name: "angle"; type: "double"; isReadonly: true }
+        Method { name: "_q_pathUpdated" }
+    }
+    Component {
+        file: "private/qquickpath_p.h"
+        name: "QQuickPathLine"
+        prototype: "QQuickCurve"
+        exports: ["QtQuick/PathLine 2.0"]
+        exportMetaObjectRevisions: [0]
+    }
+    Component {
+        file: "private/qquickpath_p.h"
+        name: "QQuickPathMove"
+        prototype: "QQuickCurve"
+        exports: ["QtQuick/PathMove 2.9"]
+        exportMetaObjectRevisions: [9]
+    }
+    Component {
+        file: "private/qquickpath_p.h"
+        name: "QQuickPathMultiline"
+        prototype: "QQuickCurve"
+        exports: ["QtQuick/PathMultiline 2.14"]
+        exportMetaObjectRevisions: [14]
+        Property { name: "start"; type: "QPointF"; isReadonly: true }
+        Property { name: "paths"; type: "QVariant" }
+    }
+    Component {
+        file: "private/qquickpath_p.h"
+        name: "QQuickPathPercent"
+        prototype: "QQuickPathElement"
+        exports: ["QtQuick/PathPercent 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "value"; type: "double" }
+    }
+    Component {
+        file: "private/qquickpath_p.h"
+        name: "QQuickPathPolyline"
+        prototype: "QQuickCurve"
+        exports: ["QtQuick/PathPolyline 2.14"]
+        exportMetaObjectRevisions: [14]
+        Property { name: "start"; type: "QPointF"; isReadonly: true }
+        Property { name: "path"; type: "QVariant" }
+    }
+    Component {
+        file: "private/qquickpath_p.h"
+        name: "QQuickPathQuad"
+        prototype: "QQuickCurve"
+        exports: ["QtQuick/PathQuad 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "controlX"; type: "double" }
+        Property { name: "controlY"; type: "double" }
+        Property { name: "relativeControlX"; type: "double" }
+        Property { name: "relativeControlY"; type: "double" }
+    }
+    Component {
+        file: "private/qquickpath_p.h"
+        name: "QQuickPathSvg"
+        prototype: "QQuickCurve"
+        exports: ["QtQuick/PathSvg 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "path"; type: "string" }
+    }
+    Component {
+        file: "private/qquickpath_p.h"
+        name: "QQuickPathText"
+        prototype: "QQuickPathElement"
+        exports: ["QtQuick/PathText 2.15"]
+        exportMetaObjectRevisions: [15]
+        Property { name: "x"; type: "double" }
+        Property { name: "y"; type: "double" }
+        Property { name: "width"; type: "double"; isReadonly: true }
+        Property { name: "height"; type: "double"; isReadonly: true }
+        Property { name: "text"; type: "string" }
+        Property { name: "font"; type: "QFont" }
+        Method { name: "invalidate" }
+    }
+    Component {
+        file: "private/qquickpathview_p.h"
+        name: "QQuickPathView"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        exports: [
+            "QtQuick/PathView 2.0",
+            "QtQuick/PathView 2.1",
+            "QtQuick/PathView 2.11",
+            "QtQuick/PathView 2.13",
+            "QtQuick/PathView 2.4",
+            "QtQuick/PathView 2.7"
+        ]
+        exportMetaObjectRevisions: [0, 1, 11, 13, 4, 7]
+        attachedType: "QQuickPathViewAttached"
+        Enum {
+            name: "HighlightRangeMode"
+            values: ["NoHighlightRange", "ApplyRange", "StrictlyEnforceRange"]
+        }
+        Enum {
+            name: "SnapMode"
+            values: ["NoSnap", "SnapToItem", "SnapOneItem"]
+        }
+        Enum {
+            name: "MovementDirection"
+            values: ["Shortest", "Negative", "Positive"]
+        }
+        Enum {
+            name: "PositionMode"
+            values: ["Beginning", "Center", "End", "Contain", "SnapPosition"]
+        }
+        Property { name: "model"; type: "QVariant" }
+        Property { name: "path"; type: "QQuickPath"; isPointer: true }
+        Property { name: "currentIndex"; type: "int" }
+        Property { name: "currentItem"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property { name: "offset"; type: "double" }
+        Property { name: "highlight"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "highlightItem"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property { name: "preferredHighlightBegin"; type: "double" }
+        Property { name: "preferredHighlightEnd"; type: "double" }
+        Property { name: "highlightRangeMode"; type: "HighlightRangeMode" }
+        Property { name: "highlightMoveDuration"; type: "int" }
+        Property { name: "dragMargin"; type: "double" }
+        Property { name: "maximumFlickVelocity"; type: "double" }
+        Property { name: "flickDeceleration"; type: "double" }
+        Property { name: "interactive"; type: "bool" }
+        Property { name: "moving"; type: "bool"; isReadonly: true }
+        Property { name: "flicking"; type: "bool"; isReadonly: true }
+        Property { name: "dragging"; type: "bool"; isReadonly: true }
+        Property { name: "count"; type: "int"; isReadonly: true }
+        Property { name: "delegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "pathItemCount"; type: "int" }
+        Property { name: "snapMode"; type: "SnapMode" }
+        Property { name: "movementDirection"; revision: 7; type: "MovementDirection" }
+        Property { name: "cacheItemCount"; type: "int" }
+        Signal { name: "snapPositionChanged" }
+        Signal { name: "movementStarted" }
+        Signal { name: "movementEnded" }
+        Signal { name: "movementDirectionChanged"; revision: 7 }
+        Signal { name: "flickStarted" }
+        Signal { name: "flickEnded" }
+        Signal { name: "dragStarted" }
+        Signal { name: "dragEnded" }
+        Method { name: "incrementCurrentIndex" }
+        Method { name: "decrementCurrentIndex" }
+        Method { name: "refill" }
+        Method { name: "ticked" }
+        Method { name: "movementEnding" }
+        Method {
+            name: "modelUpdated"
+            Parameter { name: "changeSet"; type: "QQmlChangeSet" }
+            Parameter { name: "reset"; type: "bool" }
+        }
+        Method {
+            name: "createdItem"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "item"; type: "QObject"; isPointer: true }
+        }
+        Method {
+            name: "initItem"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "item"; type: "QObject"; isPointer: true }
+        }
+        Method {
+            name: "destroyingItem"
+            Parameter { name: "item"; type: "QObject"; isPointer: true }
+        }
+        Method { name: "pathUpdated" }
+        Method {
+            name: "positionViewAtIndex"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "mode"; type: "int" }
+        }
+        Method {
+            name: "indexAt"
+            type: "int"
+            Parameter { name: "x"; type: "double" }
+            Parameter { name: "y"; type: "double" }
+        }
+        Method {
+            name: "itemAt"
+            type: "QQuickItem*"
+            Parameter { name: "x"; type: "double" }
+            Parameter { name: "y"; type: "double" }
+        }
+        Method {
+            name: "itemAtIndex"
+            revision: 13
+            type: "QQuickItem*"
+            Parameter { name: "index"; type: "int" }
+        }
+    }
+    Component {
+        name: "QQuickPathViewAttached"
+        prototype: "QObject"
+        Property { name: "view"; type: "QQuickPathView"; isReadonly: true; isPointer: true }
+        Property { name: "isCurrentItem"; type: "bool"; isReadonly: true }
+        Property { name: "onPath"; type: "bool"; isReadonly: true }
+        Signal { name: "currentItemChanged" }
+        Signal { name: "pathChanged" }
+    }
+    Component {
+        file: "private/qquickanimation_p.h"
+        name: "QQuickPauseAnimation"
+        prototype: "QQuickAbstractAnimation"
+        exports: ["QtQuick/PauseAnimation 2.0", "QtQuick/PauseAnimation 2.12"]
+        exportMetaObjectRevisions: [0, 12]
+        Property { name: "duration"; type: "int" }
+        Signal {
+            name: "durationChanged"
+            Parameter { type: "int" }
+        }
+    }
+    Component {
+        file: "private/qquickrectangle_p.h"
+        name: "QQuickPen"
+        prototype: "QObject"
+        Property { name: "width"; type: "double" }
+        Property { name: "color"; type: "QColor" }
+        Property { name: "pixelAligned"; type: "bool" }
+        Signal { name: "penChanged" }
+    }
+    Component {
+        file: "private/qquickpincharea_p.h"
+        name: "QQuickPinch"
+        prototype: "QObject"
+        exports: ["QtQuick/Pinch 2.0"]
+        exportMetaObjectRevisions: [0]
+        Enum {
+            name: "Axis"
+            values: ["NoDrag", "XAxis", "YAxis", "XAndYAxis", "XandYAxis"]
+        }
+        Property { name: "target"; type: "QQuickItem"; isPointer: true }
+        Property { name: "minimumScale"; type: "double" }
+        Property { name: "maximumScale"; type: "double" }
+        Property { name: "minimumRotation"; type: "double" }
+        Property { name: "maximumRotation"; type: "double" }
+        Property { name: "dragAxis"; type: "Axis" }
+        Property { name: "minimumX"; type: "double" }
+        Property { name: "maximumX"; type: "double" }
+        Property { name: "minimumY"; type: "double" }
+        Property { name: "maximumY"; type: "double" }
+        Property { name: "active"; type: "bool"; isReadonly: true }
+    }
+    Component {
+        file: "private/qquickpincharea_p.h"
+        name: "QQuickPinchArea"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        exports: [
+            "QtQuick/PinchArea 2.0",
+            "QtQuick/PinchArea 2.1",
+            "QtQuick/PinchArea 2.11",
+            "QtQuick/PinchArea 2.4",
+            "QtQuick/PinchArea 2.5",
+            "QtQuick/PinchArea 2.7"
+        ]
+        exportMetaObjectRevisions: [0, 1, 11, 4, 5, 7]
+        Property { name: "enabled"; type: "bool" }
+        Property { name: "pinch"; type: "QQuickPinch"; isReadonly: true; isPointer: true }
+        Signal {
+            name: "pinchStarted"
+            Parameter { name: "pinch"; type: "QQuickPinchEvent"; isPointer: true }
+        }
+        Signal {
+            name: "pinchUpdated"
+            Parameter { name: "pinch"; type: "QQuickPinchEvent"; isPointer: true }
+        }
+        Signal {
+            name: "pinchFinished"
+            Parameter { name: "pinch"; type: "QQuickPinchEvent"; isPointer: true }
+        }
+        Signal {
+            name: "smartZoom"
+            revision: 5
+            Parameter { name: "pinch"; type: "QQuickPinchEvent"; isPointer: true }
+        }
+    }
+    Component {
+        file: "private/qquickpincharea_p.h"
+        name: "QQuickPinchEvent"
+        prototype: "QObject"
+        Property { name: "center"; type: "QPointF"; isReadonly: true }
+        Property { name: "startCenter"; type: "QPointF"; isReadonly: true }
+        Property { name: "previousCenter"; type: "QPointF"; isReadonly: true }
+        Property { name: "scale"; type: "double"; isReadonly: true }
+        Property { name: "previousScale"; type: "double"; isReadonly: true }
+        Property { name: "angle"; type: "double"; isReadonly: true }
+        Property { name: "previousAngle"; type: "double"; isReadonly: true }
+        Property { name: "rotation"; type: "double"; isReadonly: true }
+        Property { name: "point1"; type: "QPointF"; isReadonly: true }
+        Property { name: "startPoint1"; type: "QPointF"; isReadonly: true }
+        Property { name: "point2"; type: "QPointF"; isReadonly: true }
+        Property { name: "startPoint2"; type: "QPointF"; isReadonly: true }
+        Property { name: "pointCount"; type: "int"; isReadonly: true }
+        Property { name: "accepted"; type: "bool" }
+    }
+    Component {
+        file: "private/qquickpinchhandler_p.h"
+        name: "QQuickPinchHandler"
+        prototype: "QQuickMultiPointHandler"
+        exports: ["QtQuick/PinchHandler 2.12", "QtQuick/PinchHandler 2.15"]
+        exportMetaObjectRevisions: [12, 15]
+        Property { name: "minimumScale"; type: "double" }
+        Property { name: "maximumScale"; type: "double" }
+        Property { name: "minimumRotation"; type: "double" }
+        Property { name: "maximumRotation"; type: "double" }
+        Property { name: "scale"; type: "double"; isReadonly: true }
+        Property { name: "activeScale"; type: "double"; isReadonly: true }
+        Property { name: "rotation"; type: "double"; isReadonly: true }
+        Property { name: "translation"; type: "QVector2D"; isReadonly: true }
+        Property { name: "minimumX"; type: "double" }
+        Property { name: "maximumX"; type: "double" }
+        Property { name: "minimumY"; type: "double" }
+        Property { name: "maximumY"; type: "double" }
+        Property { name: "xAxis"; type: "QQuickDragAxis"; isReadonly: true; isPointer: true }
+        Property { name: "yAxis"; type: "QQuickDragAxis"; isReadonly: true; isPointer: true }
+        Signal { name: "updated" }
+    }
+    Component {
+        file: "private/qquickpointhandler_p.h"
+        name: "QQuickPointHandler"
+        prototype: "QQuickSinglePointHandler"
+        exports: ["QtQuick/PointHandler 2.12", "QtQuick/PointHandler 2.15"]
+        exportMetaObjectRevisions: [12, 15]
+        Property { name: "translation"; type: "QVector2D"; isReadonly: true }
+    }
+    Component {
+        file: "private/qquickevents_p_p.h"
+        name: "QQuickPointerDevice"
+        prototype: "QObject"
+        exports: ["QtQuick/PointerDevice 2.12"]
+        isCreatable: false
+        exportMetaObjectRevisions: [12]
+        Enum {
+            name: "DeviceTypes"
+            alias: "DeviceType"
+            isFlag: true
+            values: [
+                "UnknownDevice",
+                "Mouse",
+                "TouchScreen",
+                "TouchPad",
+                "Puck",
+                "Stylus",
+                "Airbrush",
+                "AllDevices"
+            ]
+        }
+        Enum {
+            name: "PointerTypes"
+            alias: "PointerType"
+            isFlag: true
+            values: [
+                "GenericPointer",
+                "Finger",
+                "Pen",
+                "Eraser",
+                "Cursor",
+                "AllPointerTypes"
+            ]
+        }
+        Enum {
+            name: "Capabilities"
+            alias: "CapabilityFlag"
+            isFlag: true
+            values: [
+                "Position",
+                "Area",
+                "Pressure",
+                "Velocity",
+                "MouseEmulation",
+                "Scroll",
+                "Hover",
+                "Rotation",
+                "XTilt",
+                "YTilt"
+            ]
+        }
+        Property { name: "type"; type: "DeviceType"; isReadonly: true }
+        Property { name: "pointerType"; type: "PointerType"; isReadonly: true }
+        Property { name: "capabilities"; type: "Capabilities"; isReadonly: true }
+        Property { name: "maximumTouchPoints"; type: "int"; isReadonly: true }
+        Property { name: "buttonCount"; type: "int"; isReadonly: true }
+        Property { name: "name"; type: "string"; isReadonly: true }
+        Property { name: "uniqueId"; type: "QPointingDeviceUniqueId"; isReadonly: true }
+    }
+    Component {
+        file: "private/qquickpointerhandler_p.h"
+        name: "QQuickPointerDeviceHandler"
+        prototype: "QQuickPointerHandler"
+        Property { name: "acceptedDevices"; type: "QQuickPointerDevice::DeviceTypes" }
+        Property { name: "acceptedPointerTypes"; type: "QQuickPointerDevice::PointerTypes" }
+        Property { name: "acceptedButtons"; type: "Qt::MouseButtons" }
+        Property { name: "acceptedModifiers"; type: "Qt::KeyboardModifiers" }
+        Method {
+            name: "setAcceptedDevices"
+            Parameter { name: "acceptedDevices"; type: "QQuickPointerDevice::DeviceTypes" }
+        }
+        Method {
+            name: "setAcceptedPointerTypes"
+            Parameter { name: "acceptedPointerTypes"; type: "QQuickPointerDevice::PointerTypes" }
+        }
+        Method {
+            name: "setAcceptedButtons"
+            Parameter { name: "buttons"; type: "Qt::MouseButtons" }
+        }
+        Method {
+            name: "setAcceptedModifiers"
+            Parameter { name: "acceptedModifiers"; type: "Qt::KeyboardModifiers" }
+        }
+    }
+    Component {
+        file: "private/qquickevents_p_p.h"
+        name: "QQuickPointerEvent"
+        prototype: "QObject"
+        exports: ["QtQuick/PointerEvent 2.12"]
+        isCreatable: false
+        exportMetaObjectRevisions: [12]
+        Property { name: "device"; type: "QQuickPointerDevice"; isReadonly: true; isPointer: true }
+        Property { name: "modifiers"; type: "Qt::KeyboardModifiers"; isReadonly: true }
+        Property { name: "button"; type: "Qt::MouseButtons"; isReadonly: true }
+        Property { name: "buttons"; type: "Qt::MouseButtons"; isReadonly: true }
+    }
+    Component {
+        file: "private/qquickpointerhandler_p.h"
+        name: "QQuickPointerHandler"
+        prototype: "QObject"
+        exports: [
+            "QtQuick/PointerHandler 2.12",
+            "QtQuick/PointerHandler 2.15"
+        ]
+        isCreatable: false
+        exportMetaObjectRevisions: [12, 15]
+        Enum {
+            name: "GrabPermissions"
+            alias: "GrabPermission"
+            isFlag: true
+            values: [
+                "TakeOverForbidden",
+                "CanTakeOverFromHandlersOfSameType",
+                "CanTakeOverFromHandlersOfDifferentType",
+                "CanTakeOverFromItems",
+                "CanTakeOverFromAnything",
+                "ApprovesTakeOverByHandlersOfSameType",
+                "ApprovesTakeOverByHandlersOfDifferentType",
+                "ApprovesTakeOverByItems",
+                "ApprovesCancellation",
+                "ApprovesTakeOverByAnything"
+            ]
+        }
+        Property { name: "enabled"; type: "bool" }
+        Property { name: "active"; type: "bool"; isReadonly: true }
+        Property { name: "target"; type: "QQuickItem"; isPointer: true }
+        Property { name: "parent"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property { name: "grabPermissions"; type: "GrabPermissions" }
+        Property { name: "margin"; type: "double" }
+        Property { name: "dragThreshold"; revision: 15; type: "int" }
+        Property { name: "cursorShape"; revision: 15; type: "Qt::CursorShape" }
+        Signal { name: "dragThresholdChanged"; revision: 15 }
+        Signal {
+            name: "grabChanged"
+            Parameter { name: "transition"; type: "QQuickEventPoint::GrabTransition" }
+            Parameter { name: "point"; type: "QQuickEventPoint"; isPointer: true }
+        }
+        Signal { name: "grabPermissionChanged" }
+        Signal {
+            name: "canceled"
+            Parameter { name: "point"; type: "QQuickEventPoint"; isPointer: true }
+        }
+        Signal { name: "cursorShapeChanged"; revision: 15 }
+    }
+    Component {
+        file: "private/qquickevents_p_p.h"
+        name: "QQuickPointerMouseEvent"
+        prototype: "QQuickSinglePointEvent"
+        exports: ["QtQuick/PointerMouseEvent 2.12"]
+        isCreatable: false
+        exportMetaObjectRevisions: [12]
+    }
+    Component {
+        file: "private/qquickevents_p_p.h"
+        name: "QQuickPointerScrollEvent"
+        prototype: "QQuickSinglePointEvent"
+        exports: ["QtQuick/PointerScrollEvent 2.14"]
+        isCreatable: false
+        exportMetaObjectRevisions: [14]
+        Property { name: "angleDelta"; type: "QVector2D"; isReadonly: true }
+        Property { name: "pixelDelta"; type: "QVector2D"; isReadonly: true }
+        Property { name: "hasAngleDelta"; type: "bool"; isReadonly: true }
+        Property { name: "hasPixelDelta"; type: "bool"; isReadonly: true }
+        Property { name: "inverted"; type: "bool"; isReadonly: true }
+    }
+    Component {
+        file: "private/qquickevents_p_p.h"
+        name: "QQuickPointerTouchEvent"
+        prototype: "QQuickPointerEvent"
+        exports: ["QtQuick/PointerTouchEvent 2.12"]
+        isCreatable: false
+        exportMetaObjectRevisions: [12]
+    }
+    Component {
+        name: "QQuickPositionerAttached"
+        prototype: "QObject"
+        Property { name: "index"; type: "int"; isReadonly: true }
+        Property { name: "isFirstItem"; type: "bool"; isReadonly: true }
+        Property { name: "isLastItem"; type: "bool"; isReadonly: true }
+    }
+    Component {
+        file: "private/qquickanimation_p.h"
+        name: "QQuickPropertyAction"
+        prototype: "QQuickAbstractAnimation"
+        exports: ["QtQuick/PropertyAction 2.0", "QtQuick/PropertyAction 2.12"]
+        exportMetaObjectRevisions: [0, 12]
+        Property { name: "target"; type: "QObject"; isPointer: true }
+        Property { name: "property"; type: "string" }
+        Property { name: "properties"; type: "string" }
+        Property { name: "targets"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "exclude"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "value"; type: "QVariant" }
+        Signal {
+            name: "valueChanged"
+            Parameter { type: "QVariant" }
+        }
+        Signal {
+            name: "propertiesChanged"
+            Parameter { type: "string" }
+        }
+    }
+    Component {
+        file: "private/qquickanimation_p.h"
+        name: "QQuickPropertyAnimation"
+        prototype: "QQuickAbstractAnimation"
+        exports: [
+            "QtQuick/PropertyAnimation 2.0",
+            "QtQuick/PropertyAnimation 2.12"
+        ]
+        exportMetaObjectRevisions: [0, 12]
+        Property { name: "duration"; type: "int" }
+        Property { name: "from"; type: "QVariant" }
+        Property { name: "to"; type: "QVariant" }
+        Property { name: "easing"; type: "QEasingCurve" }
+        Property { name: "target"; type: "QObject"; isPointer: true }
+        Property { name: "property"; type: "string" }
+        Property { name: "properties"; type: "string" }
+        Property { name: "targets"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "exclude"; type: "QObject"; isList: true; isReadonly: true }
+        Signal {
+            name: "durationChanged"
+            Parameter { type: "int" }
+        }
+        Signal {
+            name: "easingChanged"
+            Parameter { type: "QEasingCurve" }
+        }
+        Signal {
+            name: "propertiesChanged"
+            Parameter { type: "string" }
+        }
+    }
+    Component {
+        file: "private/qquickpropertychanges_p.h"
+        name: "QQuickPropertyChanges"
+        prototype: "QQuickStateOperation"
+        exports: ["QtQuick/PropertyChanges 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "target"; type: "QObject"; isPointer: true }
+        Property { name: "restoreEntryValues"; type: "bool" }
+        Property { name: "explicit"; type: "bool" }
+    }
+    Component {
+        file: "private/qquickrectangle_p.h"
+        name: "QQuickRectangle"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        exports: [
+            "QtQuick/Rectangle 2.0",
+            "QtQuick/Rectangle 2.1",
+            "QtQuick/Rectangle 2.11",
+            "QtQuick/Rectangle 2.4",
+            "QtQuick/Rectangle 2.7"
+        ]
+        exportMetaObjectRevisions: [0, 1, 11, 4, 7]
+        Property { name: "color"; type: "QColor" }
+        Property { name: "gradient"; type: "QJSValue" }
+        Property { name: "border"; type: "QQuickPen"; isReadonly: true; isPointer: true }
+        Property { name: "radius"; type: "double" }
+        Method { name: "doUpdate" }
+    }
+    Component {
+        file: "private/qquickrepeater_p.h"
+        name: "QQuickRepeater"
+        defaultProperty: "delegate"
+        prototype: "QQuickItem"
+        exports: [
+            "QtQuick/Repeater 2.0",
+            "QtQuick/Repeater 2.1",
+            "QtQuick/Repeater 2.11",
+            "QtQuick/Repeater 2.4",
+            "QtQuick/Repeater 2.7"
+        ]
+        exportMetaObjectRevisions: [0, 1, 11, 4, 7]
+        Property { name: "model"; type: "QVariant" }
+        Property { name: "delegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "count"; type: "int"; isReadonly: true }
+        Signal {
+            name: "itemAdded"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "item"; type: "QQuickItem"; isPointer: true }
+        }
+        Signal {
+            name: "itemRemoved"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "item"; type: "QQuickItem"; isPointer: true }
+        }
+        Method {
+            name: "createdItem"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "item"; type: "QObject"; isPointer: true }
+        }
+        Method {
+            name: "initItem"
+            Parameter { type: "int" }
+            Parameter { name: "item"; type: "QObject"; isPointer: true }
+        }
+        Method {
+            name: "modelUpdated"
+            Parameter { name: "changeSet"; type: "QQmlChangeSet" }
+            Parameter { name: "reset"; type: "bool" }
+        }
+        Method {
+            name: "itemAt"
+            type: "QQuickItem*"
+            Parameter { name: "index"; type: "int" }
+        }
+    }
+    Component {
+        file: "private/qquicktranslate_p.h"
+        name: "QQuickRotation"
+        prototype: "QQuickTransform"
+        exports: ["QtQuick/Rotation 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "origin"; type: "QVector3D" }
+        Property { name: "angle"; type: "double" }
+        Property { name: "axis"; type: "QVector3D" }
+    }
+    Component {
+        file: "private/qquickanimation_p.h"
+        name: "QQuickRotationAnimation"
+        prototype: "QQuickPropertyAnimation"
+        exports: [
+            "QtQuick/RotationAnimation 2.0",
+            "QtQuick/RotationAnimation 2.12"
+        ]
+        exportMetaObjectRevisions: [0, 12]
+        Enum {
+            name: "RotationDirection"
+            values: ["Numerical", "Shortest", "Clockwise", "Counterclockwise"]
+        }
+        Property { name: "from"; type: "double" }
+        Property { name: "to"; type: "double" }
+        Property { name: "direction"; type: "RotationDirection" }
+    }
+    Component {
+        file: "private/qquickanimator_p.h"
+        name: "QQuickRotationAnimator"
+        prototype: "QQuickAnimator"
+        exports: [
+            "QtQuick/RotationAnimator 2.12",
+            "QtQuick/RotationAnimator 2.2"
+        ]
+        exportMetaObjectRevisions: [12, 2]
+        Enum {
+            name: "RotationDirection"
+            values: ["Numerical", "Shortest", "Clockwise", "Counterclockwise"]
+        }
+        Property { name: "direction"; type: "RotationDirection" }
+        Signal {
+            name: "directionChanged"
+            Parameter { name: "dir"; type: "RotationDirection" }
+        }
+    }
+    Component {
+        file: "private/qquickpositioners_p.h"
+        name: "QQuickRow"
+        prototype: "QQuickBasePositioner"
+        exports: [
+            "QtQuick/Row 2.0",
+            "QtQuick/Row 2.1",
+            "QtQuick/Row 2.11",
+            "QtQuick/Row 2.4",
+            "QtQuick/Row 2.6",
+            "QtQuick/Row 2.7",
+            "QtQuick/Row 2.9"
+        ]
+        exportMetaObjectRevisions: [0, 1, 11, 4, 6, 7, 9]
+        Property { name: "layoutDirection"; type: "Qt::LayoutDirection" }
+        Property { name: "effectiveLayoutDirection"; type: "Qt::LayoutDirection"; isReadonly: true }
+    }
+    Component {
+        file: "private/qquicktranslate_p.h"
+        name: "QQuickScale"
+        prototype: "QQuickTransform"
+        exports: ["QtQuick/Scale 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "origin"; type: "QVector3D" }
+        Property { name: "xScale"; type: "double" }
+        Property { name: "yScale"; type: "double" }
+        Property { name: "zScale"; type: "double" }
+        Signal { name: "scaleChanged" }
+    }
+    Component {
+        file: "private/qquickanimator_p.h"
+        name: "QQuickScaleAnimator"
+        prototype: "QQuickAnimator"
+        exports: ["QtQuick/ScaleAnimator 2.12", "QtQuick/ScaleAnimator 2.2"]
+        exportMetaObjectRevisions: [12, 2]
+    }
+    Component {
+        file: "private/qquickscalegrid_p_p.h"
+        name: "QQuickScaleGrid"
+        prototype: "QObject"
+        Property { name: "left"; type: "int" }
+        Property { name: "top"; type: "int" }
+        Property { name: "right"; type: "int" }
+        Property { name: "bottom"; type: "int" }
+        Signal { name: "borderChanged" }
+        Signal { name: "leftBorderChanged" }
+        Signal { name: "topBorderChanged" }
+        Signal { name: "rightBorderChanged" }
+        Signal { name: "bottomBorderChanged" }
+    }
+    Component {
+        file: "private/qquickanimation_p.h"
+        name: "QQuickScriptAction"
+        prototype: "QQuickAbstractAnimation"
+        exports: ["QtQuick/ScriptAction 2.0", "QtQuick/ScriptAction 2.12"]
+        exportMetaObjectRevisions: [0, 12]
+        Property { name: "script"; type: "QQmlScriptString" }
+        Property { name: "scriptName"; type: "string" }
+    }
+    Component {
+        file: "private/qquickanimation_p.h"
+        name: "QQuickSequentialAnimation"
+        defaultProperty: "animations"
+        prototype: "QQuickAnimationGroup"
+        exports: [
+            "QtQuick/SequentialAnimation 2.0",
+            "QtQuick/SequentialAnimation 2.12"
+        ]
+        exportMetaObjectRevisions: [0, 12]
+    }
+    Component {
+        file: "private/qquickshadereffect_p.h"
+        name: "QQuickShaderEffect"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        exports: [
+            "QtQuick/ShaderEffect 2.0",
+            "QtQuick/ShaderEffect 2.1",
+            "QtQuick/ShaderEffect 2.11",
+            "QtQuick/ShaderEffect 2.4",
+            "QtQuick/ShaderEffect 2.7"
+        ]
+        exportMetaObjectRevisions: [0, 1, 11, 4, 7]
+        Enum {
+            name: "CullMode"
+            values: ["NoCulling", "BackFaceCulling", "FrontFaceCulling"]
+        }
+        Enum {
+            name: "Status"
+            values: ["Compiled", "Uncompiled", "Error"]
+        }
+        Property { name: "fragmentShader"; type: "QByteArray" }
+        Property { name: "vertexShader"; type: "QByteArray" }
+        Property { name: "blending"; type: "bool" }
+        Property { name: "mesh"; type: "QVariant" }
+        Property { name: "cullMode"; type: "CullMode" }
+        Property { name: "log"; type: "string"; isReadonly: true }
+        Property { name: "status"; type: "Status"; isReadonly: true }
+        Property { name: "supportsAtlasTextures"; revision: 4; type: "bool" }
+    }
+    Component {
+        file: "private/qquickshadereffectmesh_p.h"
+        name: "QQuickShaderEffectMesh"
+        prototype: "QObject"
+        exports: ["QtQuick/ShaderEffectMesh 2.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        Signal { name: "geometryChanged" }
+    }
+    Component {
+        file: "private/qquickshadereffectsource_p.h"
+        name: "QQuickShaderEffectSource"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        exports: [
+            "QtQuick/ShaderEffectSource 2.0",
+            "QtQuick/ShaderEffectSource 2.1",
+            "QtQuick/ShaderEffectSource 2.11",
+            "QtQuick/ShaderEffectSource 2.4",
+            "QtQuick/ShaderEffectSource 2.6",
+            "QtQuick/ShaderEffectSource 2.7",
+            "QtQuick/ShaderEffectSource 2.9"
+        ]
+        exportMetaObjectRevisions: [0, 1, 11, 4, 6, 7, 9]
+        Enum {
+            name: "WrapMode"
+            values: [
+                "ClampToEdge",
+                "RepeatHorizontally",
+                "RepeatVertically",
+                "Repeat"
+            ]
+        }
+        Enum {
+            name: "Format"
+            values: ["Alpha", "RGB", "RGBA"]
+        }
+        Enum {
+            name: "TextureMirroring"
+            values: ["NoMirroring", "MirrorHorizontally", "MirrorVertically"]
+        }
+        Property { name: "wrapMode"; type: "WrapMode" }
+        Property { name: "sourceItem"; type: "QQuickItem"; isPointer: true }
+        Property { name: "sourceRect"; type: "QRectF" }
+        Property { name: "textureSize"; type: "QSize" }
+        Property { name: "format"; type: "Format" }
+        Property { name: "live"; type: "bool" }
+        Property { name: "hideSource"; type: "bool" }
+        Property { name: "mipmap"; type: "bool" }
+        Property { name: "recursive"; type: "bool" }
+        Property { name: "textureMirroring"; revision: 6; type: "TextureMirroring" }
+        Property { name: "samples"; revision: 9; type: "int" }
+        Signal { name: "scheduledUpdateCompleted" }
+        Method {
+            name: "sourceItemDestroyed"
+            Parameter { name: "item"; type: "QObject"; isPointer: true }
+        }
+        Method { name: "invalidateSceneGraph" }
+        Method {
+            name: "sourceItemParentChanged"
+            Parameter { name: "parent"; type: "QQuickItem"; isPointer: true }
+        }
+        Method { name: "scheduleUpdate" }
+    }
+    Component {
+        file: "private/qquickshortcut_p.h"
+        name: "QQuickShortcut"
+        prototype: "QObject"
+        exports: [
+            "QtQuick/Shortcut 2.5",
+            "QtQuick/Shortcut 2.6",
+            "QtQuick/Shortcut 2.9"
+        ]
+        exportMetaObjectRevisions: [5, 6, 9]
+        Property { name: "sequence"; type: "QVariant" }
+        Property { name: "sequences"; revision: 9; type: "QVariantList" }
+        Property { name: "nativeText"; revision: 6; type: "string"; isReadonly: true }
+        Property { name: "portableText"; revision: 6; type: "string"; isReadonly: true }
+        Property { name: "enabled"; type: "bool" }
+        Property { name: "autoRepeat"; type: "bool" }
+        Property { name: "context"; type: "Qt::ShortcutContext" }
+        Signal { name: "sequencesChanged"; revision: 9 }
+        Signal { name: "activated" }
+        Signal { name: "activatedAmbiguously" }
+    }
+    Component {
+        file: "private/qquickevents_p_p.h"
+        name: "QQuickSinglePointEvent"
+        prototype: "QQuickPointerEvent"
+    }
+    Component {
+        file: "private/qquickpointerhandler_p.h"
+        name: "QQuickSinglePointHandler"
+        prototype: "QQuickPointerDeviceHandler"
+        Property { name: "point"; type: "QQuickHandlerPoint"; isReadonly: true }
+    }
+    Component {
+        file: "private/qquicksmoothedanimation_p.h"
+        name: "QQuickSmoothedAnimation"
+        prototype: "QQuickNumberAnimation"
+        exports: [
+            "QtQuick/SmoothedAnimation 2.0",
+            "QtQuick/SmoothedAnimation 2.12"
+        ]
+        exportMetaObjectRevisions: [0, 12]
+        Enum {
+            name: "ReversingMode"
+            values: ["Eased", "Immediate", "Sync"]
+        }
+        Property { name: "velocity"; type: "double" }
+        Property { name: "reversingMode"; type: "ReversingMode" }
+        Property { name: "maximumEasingTime"; type: "double" }
+    }
+    Component {
+        file: "private/qquickspringanimation_p.h"
+        name: "QQuickSpringAnimation"
+        prototype: "QQuickNumberAnimation"
+        exports: [
+            "QtQuick/SpringAnimation 2.0",
+            "QtQuick/SpringAnimation 2.12"
+        ]
+        exportMetaObjectRevisions: [0, 12]
+        Property { name: "velocity"; type: "double" }
+        Property { name: "spring"; type: "double" }
+        Property { name: "damping"; type: "double" }
+        Property { name: "epsilon"; type: "double" }
+        Property { name: "modulus"; type: "double" }
+        Property { name: "mass"; type: "double" }
+        Signal { name: "syncChanged" }
+    }
+    Component {
+        file: "private/qquicksprite_p.h"
+        name: "QQuickSprite"
+        prototype: "QQuickStochasticState"
+        exports: ["QtQuick/Sprite 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "source"; type: "QUrl" }
+        Property { name: "reverse"; type: "bool" }
+        Property { name: "frameSync"; type: "bool" }
+        Property { name: "frames"; type: "int" }
+        Property { name: "frameCount"; type: "int" }
+        Property { name: "frameHeight"; type: "int" }
+        Property { name: "frameWidth"; type: "int" }
+        Property { name: "frameX"; type: "int" }
+        Property { name: "frameY"; type: "int" }
+        Property { name: "frameRate"; type: "double" }
+        Property { name: "frameRateVariation"; type: "double" }
+        Property { name: "frameDuration"; type: "int" }
+        Property { name: "frameDurationVariation"; type: "int" }
+        Signal {
+            name: "sourceChanged"
+            Parameter { name: "arg"; type: "QUrl" }
+        }
+        Signal {
+            name: "frameHeightChanged"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Signal {
+            name: "frameWidthChanged"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Signal {
+            name: "reverseChanged"
+            Parameter { name: "arg"; type: "bool" }
+        }
+        Signal {
+            name: "frameCountChanged"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Signal {
+            name: "frameXChanged"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Signal {
+            name: "frameYChanged"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Signal {
+            name: "frameRateChanged"
+            Parameter { name: "arg"; type: "double" }
+        }
+        Signal {
+            name: "frameRateVariationChanged"
+            Parameter { name: "arg"; type: "double" }
+        }
+        Signal {
+            name: "frameDurationChanged"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Signal {
+            name: "frameDurationVariationChanged"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Signal {
+            name: "frameSyncChanged"
+            Parameter { name: "arg"; type: "bool" }
+        }
+        Method {
+            name: "setSource"
+            Parameter { name: "arg"; type: "QUrl" }
+        }
+        Method {
+            name: "setFrameHeight"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Method {
+            name: "setFrameWidth"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Method {
+            name: "setReverse"
+            Parameter { name: "arg"; type: "bool" }
+        }
+        Method {
+            name: "setFrames"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Method {
+            name: "setFrameCount"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Method {
+            name: "setFrameX"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Method {
+            name: "setFrameY"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Method {
+            name: "setFrameRate"
+            Parameter { name: "arg"; type: "double" }
+        }
+        Method {
+            name: "setFrameRateVariation"
+            Parameter { name: "arg"; type: "double" }
+        }
+        Method {
+            name: "setFrameDuration"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Method {
+            name: "setFrameDurationVariation"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Method {
+            name: "setFrameSync"
+            Parameter { name: "arg"; type: "bool" }
+        }
+        Method { name: "startImageLoading" }
+    }
+    Component {
+        file: "private/qquickspritesequence_p.h"
+        name: "QQuickSpriteSequence"
+        defaultProperty: "sprites"
+        prototype: "QQuickItem"
+        exports: [
+            "QtQuick/SpriteSequence 2.0",
+            "QtQuick/SpriteSequence 2.1",
+            "QtQuick/SpriteSequence 2.11",
+            "QtQuick/SpriteSequence 2.4",
+            "QtQuick/SpriteSequence 2.7"
+        ]
+        exportMetaObjectRevisions: [0, 1, 11, 4, 7]
+        Property { name: "running"; type: "bool" }
+        Property { name: "interpolate"; type: "bool" }
+        Property { name: "goalSprite"; type: "string" }
+        Property { name: "currentSprite"; type: "string"; isReadonly: true }
+        Property { name: "sprites"; type: "QQuickSprite"; isList: true; isReadonly: true }
+        Signal {
+            name: "runningChanged"
+            Parameter { name: "arg"; type: "bool" }
+        }
+        Signal {
+            name: "interpolateChanged"
+            Parameter { name: "arg"; type: "bool" }
+        }
+        Signal {
+            name: "goalSpriteChanged"
+            Parameter { name: "arg"; type: "string" }
+        }
+        Signal {
+            name: "currentSpriteChanged"
+            Parameter { name: "arg"; type: "string" }
+        }
+        Method {
+            name: "jumpTo"
+            Parameter { name: "sprite"; type: "string" }
+        }
+        Method {
+            name: "setGoalSprite"
+            Parameter { name: "sprite"; type: "string" }
+        }
+        Method {
+            name: "setRunning"
+            Parameter { name: "arg"; type: "bool" }
+        }
+        Method {
+            name: "setInterpolate"
+            Parameter { name: "arg"; type: "bool" }
+        }
+        Method { name: "createEngine" }
+    }
+    Component {
+        file: "private/qquickstate_p.h"
+        name: "QQuickState"
+        defaultProperty: "changes"
+        prototype: "QObject"
+        exports: ["QtQuick/State 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "name"; type: "string" }
+        Property { name: "when"; type: "bool" }
+        Property { name: "extend"; type: "string" }
+        Property { name: "changes"; type: "QQuickStateOperation"; isList: true; isReadonly: true }
+        Signal { name: "completed" }
+    }
+    Component {
+        file: "private/qquickstatechangescript_p.h"
+        name: "QQuickStateChangeScript"
+        prototype: "QQuickStateOperation"
+        exports: ["QtQuick/StateChangeScript 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "script"; type: "QQmlScriptString" }
+        Property { name: "name"; type: "string" }
+    }
+    Component {
+        file: "private/qquickstategroup_p.h"
+        name: "QQuickStateGroup"
+        prototype: "QObject"
+        exports: ["QtQuick/StateGroup 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "state"; type: "string" }
+        Property { name: "states"; type: "QQuickState"; isList: true; isReadonly: true }
+        Property { name: "transitions"; type: "QQuickTransition"; isList: true; isReadonly: true }
+        Signal {
+            name: "stateChanged"
+            Parameter { type: "string" }
+        }
+    }
+    Component { file: "private/qquickstate_p.h"; name: "QQuickStateOperation"; prototype: "QObject" }
+    Component {
+        name: "QQuickStochasticState"
+        prototype: "QObject"
+        Property { name: "duration"; type: "int" }
+        Property { name: "durationVariation"; type: "int" }
+        Property { name: "randomStart"; type: "bool" }
+        Property { name: "to"; type: "QVariantMap" }
+        Property { name: "name"; type: "string" }
+        Signal {
+            name: "durationChanged"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Signal {
+            name: "nameChanged"
+            Parameter { name: "arg"; type: "string" }
+        }
+        Signal {
+            name: "toChanged"
+            Parameter { name: "arg"; type: "QVariantMap" }
+        }
+        Signal {
+            name: "durationVariationChanged"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Signal { name: "entered" }
+        Signal {
+            name: "randomStartChanged"
+            Parameter { name: "arg"; type: "bool" }
+        }
+        Method {
+            name: "setDuration"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Method {
+            name: "setName"
+            Parameter { name: "arg"; type: "string" }
+        }
+        Method {
+            name: "setTo"
+            Parameter { name: "arg"; type: "QVariantMap" }
+        }
+        Method {
+            name: "setDurationVariation"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Method {
+            name: "setRandomStart"
+            Parameter { name: "arg"; type: "bool" }
+        }
+    }
+    Component {
+        file: "private/qquicksystempalette_p.h"
+        name: "QQuickSystemPalette"
+        prototype: "QObject"
+        exports: ["QtQuick/SystemPalette 2.0"]
+        exportMetaObjectRevisions: [0]
+        Enum {
+            name: "ColorGroup"
+            values: ["Active", "Inactive", "Disabled"]
+        }
+        Property { name: "colorGroup"; type: "QQuickSystemPalette::ColorGroup" }
+        Property { name: "window"; type: "QColor"; isReadonly: true }
+        Property { name: "windowText"; type: "QColor"; isReadonly: true }
+        Property { name: "base"; type: "QColor"; isReadonly: true }
+        Property { name: "text"; type: "QColor"; isReadonly: true }
+        Property { name: "alternateBase"; type: "QColor"; isReadonly: true }
+        Property { name: "button"; type: "QColor"; isReadonly: true }
+        Property { name: "buttonText"; type: "QColor"; isReadonly: true }
+        Property { name: "light"; type: "QColor"; isReadonly: true }
+        Property { name: "midlight"; type: "QColor"; isReadonly: true }
+        Property { name: "dark"; type: "QColor"; isReadonly: true }
+        Property { name: "mid"; type: "QColor"; isReadonly: true }
+        Property { name: "shadow"; type: "QColor"; isReadonly: true }
+        Property { name: "highlight"; type: "QColor"; isReadonly: true }
+        Property { name: "highlightedText"; type: "QColor"; isReadonly: true }
+        Signal { name: "paletteChanged" }
+    }
+    Component {
+        file: "private/qquicktableview_p.h"
+        name: "QQuickTableView"
+        defaultProperty: "flickableData"
+        prototype: "QQuickFlickable"
+        exports: ["QtQuick/TableView 2.12", "QtQuick/TableView 2.14"]
+        exportMetaObjectRevisions: [12, 14]
+        attachedType: "QQuickTableViewAttached"
+        Property { name: "rows"; type: "int"; isReadonly: true }
+        Property { name: "columns"; type: "int"; isReadonly: true }
+        Property { name: "rowSpacing"; type: "double" }
+        Property { name: "columnSpacing"; type: "double" }
+        Property { name: "rowHeightProvider"; type: "QJSValue" }
+        Property { name: "columnWidthProvider"; type: "QJSValue" }
+        Property { name: "model"; type: "QVariant" }
+        Property { name: "delegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "reuseItems"; type: "bool" }
+        Property { name: "contentWidth"; type: "double" }
+        Property { name: "contentHeight"; type: "double" }
+        Property { name: "syncView"; revision: 14; type: "QQuickTableView"; isPointer: true }
+        Property { name: "syncDirection"; revision: 14; type: "Qt::Orientations" }
+        Signal { name: "syncViewChanged"; revision: 14 }
+        Signal { name: "syncDirectionChanged"; revision: 14 }
+        Method { name: "_q_componentFinalized" }
+        Method { name: "forceLayout" }
+    }
+    Component {
+        name: "QQuickTableViewAttached"
+        prototype: "QObject"
+        Property { name: "view"; type: "QQuickTableView"; isReadonly: true; isPointer: true }
+        Signal { name: "pooled" }
+        Signal { name: "reused" }
+    }
+    Component {
+        file: "private/qquicktaphandler_p.h"
+        name: "QQuickTapHandler"
+        prototype: "QQuickSinglePointHandler"
+        exports: ["QtQuick/TapHandler 2.12", "QtQuick/TapHandler 2.15"]
+        exportMetaObjectRevisions: [12, 15]
+        Enum {
+            name: "GesturePolicy"
+            values: ["DragThreshold", "WithinBounds", "ReleaseWithinBounds"]
+        }
+        Property { name: "pressed"; type: "bool"; isReadonly: true }
+        Property { name: "tapCount"; type: "int"; isReadonly: true }
+        Property { name: "timeHeld"; type: "double"; isReadonly: true }
+        Property { name: "longPressThreshold"; type: "double" }
+        Property { name: "gesturePolicy"; type: "GesturePolicy" }
+        Signal {
+            name: "tapped"
+            Parameter { name: "eventPoint"; type: "QQuickEventPoint"; isPointer: true }
+        }
+        Signal {
+            name: "singleTapped"
+            Parameter { name: "eventPoint"; type: "QQuickEventPoint"; isPointer: true }
+        }
+        Signal {
+            name: "doubleTapped"
+            Parameter { name: "eventPoint"; type: "QQuickEventPoint"; isPointer: true }
+        }
+        Signal { name: "longPressed" }
+    }
+    Component {
+        file: "private/qquicktext_p.h"
+        name: "QQuickText"
+        prototype: "QQuickImplicitSizeItem"
+        exports: [
+            "QtQuick/Text 2.0",
+            "QtQuick/Text 2.1",
+            "QtQuick/Text 2.10",
+            "QtQuick/Text 2.11",
+            "QtQuick/Text 2.2",
+            "QtQuick/Text 2.3",
+            "QtQuick/Text 2.4",
+            "QtQuick/Text 2.6",
+            "QtQuick/Text 2.7",
+            "QtQuick/Text 2.9"
+        ]
+        exportMetaObjectRevisions: [0, 1, 10, 11, 2, 3, 4, 6, 7, 9]
+        Enum {
+            name: "HAlignment"
+            values: [
+                "AlignLeft",
+                "AlignRight",
+                "AlignHCenter",
+                "AlignJustify"
+            ]
+        }
+        Enum {
+            name: "VAlignment"
+            values: ["AlignTop", "AlignBottom", "AlignVCenter"]
+        }
+        Enum {
+            name: "TextStyle"
+            values: ["Normal", "Outline", "Raised", "Sunken"]
+        }
+        Enum {
+            name: "TextFormat"
+            values: [
+                "PlainText",
+                "RichText",
+                "MarkdownText",
+                "AutoText",
+                "StyledText"
+            ]
+        }
+        Enum {
+            name: "TextElideMode"
+            values: ["ElideLeft", "ElideRight", "ElideMiddle", "ElideNone"]
+        }
+        Enum {
+            name: "WrapMode"
+            values: [
+                "NoWrap",
+                "WordWrap",
+                "WrapAnywhere",
+                "WrapAtWordBoundaryOrAnywhere",
+                "Wrap"
+            ]
+        }
+        Enum {
+            name: "RenderType"
+            values: ["QtRendering", "NativeRendering"]
+        }
+        Enum {
+            name: "LineHeightMode"
+            values: ["ProportionalHeight", "FixedHeight"]
+        }
+        Enum {
+            name: "FontSizeMode"
+            values: ["FixedSize", "HorizontalFit", "VerticalFit", "Fit"]
+        }
+        Property { name: "text"; type: "string" }
+        Property { name: "font"; type: "QFont" }
+        Property { name: "color"; type: "QColor" }
+        Property { name: "linkColor"; type: "QColor" }
+        Property { name: "style"; type: "TextStyle" }
+        Property { name: "styleColor"; type: "QColor" }
+        Property { name: "horizontalAlignment"; type: "HAlignment" }
+        Property { name: "effectiveHorizontalAlignment"; type: "HAlignment"; isReadonly: true }
+        Property { name: "verticalAlignment"; type: "VAlignment" }
+        Property { name: "wrapMode"; type: "WrapMode" }
+        Property { name: "lineCount"; type: "int"; isReadonly: true }
+        Property { name: "truncated"; type: "bool"; isReadonly: true }
+        Property { name: "maximumLineCount"; type: "int" }
+        Property { name: "textFormat"; type: "TextFormat" }
+        Property { name: "elide"; type: "TextElideMode" }
+        Property { name: "contentWidth"; type: "double"; isReadonly: true }
+        Property { name: "contentHeight"; type: "double"; isReadonly: true }
+        Property { name: "paintedWidth"; type: "double"; isReadonly: true }
+        Property { name: "paintedHeight"; type: "double"; isReadonly: true }
+        Property { name: "lineHeight"; type: "double" }
+        Property { name: "lineHeightMode"; type: "LineHeightMode" }
+        Property { name: "baseUrl"; type: "QUrl" }
+        Property { name: "minimumPixelSize"; type: "int" }
+        Property { name: "minimumPointSize"; type: "int" }
+        Property { name: "fontSizeMode"; type: "FontSizeMode" }
+        Property { name: "renderType"; type: "RenderType" }
+        Property { name: "hoveredLink"; revision: 2; type: "string"; isReadonly: true }
+        Property { name: "padding"; revision: 6; type: "double" }
+        Property { name: "topPadding"; revision: 6; type: "double" }
+        Property { name: "leftPadding"; revision: 6; type: "double" }
+        Property { name: "rightPadding"; revision: 6; type: "double" }
+        Property { name: "bottomPadding"; revision: 6; type: "double" }
+        Property { name: "fontInfo"; revision: 9; type: "QJSValue"; isReadonly: true }
+        Property { name: "advance"; revision: 10; type: "QSizeF"; isReadonly: true }
+        Signal {
+            name: "textChanged"
+            Parameter { name: "text"; type: "string" }
+        }
+        Signal {
+            name: "linkActivated"
+            Parameter { name: "link"; type: "string" }
+        }
+        Signal {
+            name: "linkHovered"
+            revision: 2
+            Parameter { name: "link"; type: "string" }
+        }
+        Signal {
+            name: "fontChanged"
+            Parameter { name: "font"; type: "QFont" }
+        }
+        Signal {
+            name: "styleChanged"
+            Parameter { name: "style"; type: "QQuickText::TextStyle" }
+        }
+        Signal {
+            name: "horizontalAlignmentChanged"
+            Parameter { name: "alignment"; type: "QQuickText::HAlignment" }
+        }
+        Signal {
+            name: "verticalAlignmentChanged"
+            Parameter { name: "alignment"; type: "QQuickText::VAlignment" }
+        }
+        Signal {
+            name: "textFormatChanged"
+            Parameter { name: "textFormat"; type: "QQuickText::TextFormat" }
+        }
+        Signal {
+            name: "elideModeChanged"
+            Parameter { name: "mode"; type: "QQuickText::TextElideMode" }
+        }
+        Signal { name: "contentSizeChanged" }
+        Signal {
+            name: "contentWidthChanged"
+            Parameter { name: "contentWidth"; type: "double" }
+        }
+        Signal {
+            name: "contentHeightChanged"
+            Parameter { name: "contentHeight"; type: "double" }
+        }
+        Signal {
+            name: "lineHeightChanged"
+            Parameter { name: "lineHeight"; type: "double" }
+        }
+        Signal {
+            name: "lineHeightModeChanged"
+            Parameter { name: "mode"; type: "LineHeightMode" }
+        }
+        Signal {
+            name: "lineLaidOut"
+            Parameter { name: "line"; type: "QQuickTextLine"; isPointer: true }
+        }
+        Signal { name: "paddingChanged"; revision: 6 }
+        Signal { name: "topPaddingChanged"; revision: 6 }
+        Signal { name: "leftPaddingChanged"; revision: 6 }
+        Signal { name: "rightPaddingChanged"; revision: 6 }
+        Signal { name: "bottomPaddingChanged"; revision: 6 }
+        Signal { name: "fontInfoChanged"; revision: 9 }
+        Method { name: "q_updateLayout" }
+        Method { name: "triggerPreprocess" }
+        Method { name: "imageDownloadFinished" }
+        Method { name: "doLayout" }
+        Method { name: "forceLayout"; revision: 9 }
+        Method {
+            name: "linkAt"
+            revision: 3
+            type: "string"
+            Parameter { name: "x"; type: "double" }
+            Parameter { name: "y"; type: "double" }
+        }
+    }
+    Component { file: "qquicktextdocument.h"; name: "QQuickTextDocument"; prototype: "QObject" }
+    Component {
+        file: "private/qquicktextedit_p.h"
+        name: "QQuickTextEdit"
+        prototype: "QQuickImplicitSizeItem"
+        exports: [
+            "QtQuick/TextEdit 2.0",
+            "QtQuick/TextEdit 2.1",
+            "QtQuick/TextEdit 2.10",
+            "QtQuick/TextEdit 2.11",
+            "QtQuick/TextEdit 2.2",
+            "QtQuick/TextEdit 2.3",
+            "QtQuick/TextEdit 2.4",
+            "QtQuick/TextEdit 2.6",
+            "QtQuick/TextEdit 2.7"
+        ]
+        exportMetaObjectRevisions: [0, 1, 10, 11, 2, 3, 4, 6, 7]
+        Enum {
+            name: "HAlignment"
+            values: [
+                "AlignLeft",
+                "AlignRight",
+                "AlignHCenter",
+                "AlignJustify"
+            ]
+        }
+        Enum {
+            name: "VAlignment"
+            values: ["AlignTop", "AlignBottom", "AlignVCenter"]
+        }
+        Enum {
+            name: "TextFormat"
+            values: ["PlainText", "RichText", "AutoText", "MarkdownText"]
+        }
+        Enum {
+            name: "WrapMode"
+            values: [
+                "NoWrap",
+                "WordWrap",
+                "WrapAnywhere",
+                "WrapAtWordBoundaryOrAnywhere",
+                "Wrap"
+            ]
+        }
+        Enum {
+            name: "SelectionMode"
+            values: ["SelectCharacters", "SelectWords"]
+        }
+        Enum {
+            name: "RenderType"
+            values: ["QtRendering", "NativeRendering"]
+        }
+        Property { name: "text"; type: "string" }
+        Property { name: "color"; type: "QColor" }
+        Property { name: "selectionColor"; type: "QColor" }
+        Property { name: "selectedTextColor"; type: "QColor" }
+        Property { name: "font"; type: "QFont" }
+        Property { name: "horizontalAlignment"; type: "HAlignment" }
+        Property { name: "effectiveHorizontalAlignment"; type: "HAlignment"; isReadonly: true }
+        Property { name: "verticalAlignment"; type: "VAlignment" }
+        Property { name: "wrapMode"; type: "WrapMode" }
+        Property { name: "lineCount"; type: "int"; isReadonly: true }
+        Property { name: "length"; type: "int"; isReadonly: true }
+        Property { name: "contentWidth"; type: "double"; isReadonly: true }
+        Property { name: "contentHeight"; type: "double"; isReadonly: true }
+        Property { name: "paintedWidth"; type: "double"; isReadonly: true }
+        Property { name: "paintedHeight"; type: "double"; isReadonly: true }
+        Property { name: "textFormat"; type: "TextFormat" }
+        Property { name: "readOnly"; type: "bool" }
+        Property { name: "cursorVisible"; type: "bool" }
+        Property { name: "cursorPosition"; type: "int" }
+        Property { name: "cursorRectangle"; type: "QRectF"; isReadonly: true }
+        Property { name: "cursorDelegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "overwriteMode"; type: "bool" }
+        Property { name: "selectionStart"; type: "int"; isReadonly: true }
+        Property { name: "selectionEnd"; type: "int"; isReadonly: true }
+        Property { name: "selectedText"; type: "string"; isReadonly: true }
+        Property { name: "activeFocusOnPress"; type: "bool" }
+        Property { name: "persistentSelection"; type: "bool" }
+        Property { name: "textMargin"; type: "double" }
+        Property { name: "inputMethodHints"; type: "Qt::InputMethodHints" }
+        Property { name: "selectByKeyboard"; revision: 1; type: "bool" }
+        Property { name: "selectByMouse"; type: "bool" }
+        Property { name: "mouseSelectionMode"; type: "SelectionMode" }
+        Property { name: "canPaste"; type: "bool"; isReadonly: true }
+        Property { name: "canUndo"; type: "bool"; isReadonly: true }
+        Property { name: "canRedo"; type: "bool"; isReadonly: true }
+        Property { name: "inputMethodComposing"; type: "bool"; isReadonly: true }
+        Property { name: "baseUrl"; type: "QUrl" }
+        Property { name: "renderType"; type: "RenderType" }
+        Property {
+            name: "textDocument"
+            revision: 1
+            type: "QQuickTextDocument"
+            isReadonly: true
+            isPointer: true
+        }
+        Property { name: "hoveredLink"; revision: 2; type: "string"; isReadonly: true }
+        Property { name: "padding"; revision: 6; type: "double" }
+        Property { name: "topPadding"; revision: 6; type: "double" }
+        Property { name: "leftPadding"; revision: 6; type: "double" }
+        Property { name: "rightPadding"; revision: 6; type: "double" }
+        Property { name: "bottomPadding"; revision: 6; type: "double" }
+        Property { name: "preeditText"; revision: 7; type: "string"; isReadonly: true }
+        Property { name: "tabStopDistance"; revision: 10; type: "double" }
+        Signal { name: "preeditTextChanged"; revision: 7 }
+        Signal { name: "contentSizeChanged" }
+        Signal {
+            name: "colorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "selectionColorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "selectedTextColorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "fontChanged"
+            Parameter { name: "font"; type: "QFont" }
+        }
+        Signal {
+            name: "horizontalAlignmentChanged"
+            Parameter { name: "alignment"; type: "QQuickTextEdit::HAlignment" }
+        }
+        Signal {
+            name: "verticalAlignmentChanged"
+            Parameter { name: "alignment"; type: "QQuickTextEdit::VAlignment" }
+        }
+        Signal {
+            name: "textFormatChanged"
+            Parameter { name: "textFormat"; type: "QQuickTextEdit::TextFormat" }
+        }
+        Signal {
+            name: "readOnlyChanged"
+            Parameter { name: "isReadOnly"; type: "bool" }
+        }
+        Signal {
+            name: "cursorVisibleChanged"
+            Parameter { name: "isCursorVisible"; type: "bool" }
+        }
+        Signal {
+            name: "overwriteModeChanged"
+            Parameter { name: "overwriteMode"; type: "bool" }
+        }
+        Signal {
+            name: "activeFocusOnPressChanged"
+            Parameter { name: "activeFocusOnPressed"; type: "bool" }
+        }
+        Signal {
+            name: "persistentSelectionChanged"
+            Parameter { name: "isPersistentSelection"; type: "bool" }
+        }
+        Signal {
+            name: "textMarginChanged"
+            Parameter { name: "textMargin"; type: "double" }
+        }
+        Signal {
+            name: "selectByKeyboardChanged"
+            revision: 1
+            Parameter { name: "selectByKeyboard"; type: "bool" }
+        }
+        Signal {
+            name: "selectByMouseChanged"
+            Parameter { name: "selectByMouse"; type: "bool" }
+        }
+        Signal {
+            name: "mouseSelectionModeChanged"
+            Parameter { name: "mode"; type: "QQuickTextEdit::SelectionMode" }
+        }
+        Signal {
+            name: "linkActivated"
+            Parameter { name: "link"; type: "string" }
+        }
+        Signal {
+            name: "linkHovered"
+            revision: 2
+            Parameter { name: "link"; type: "string" }
+        }
+        Signal { name: "editingFinished"; revision: 6 }
+        Signal { name: "paddingChanged"; revision: 6 }
+        Signal { name: "topPaddingChanged"; revision: 6 }
+        Signal { name: "leftPaddingChanged"; revision: 6 }
+        Signal { name: "rightPaddingChanged"; revision: 6 }
+        Signal { name: "bottomPaddingChanged"; revision: 6 }
+        Signal {
+            name: "tabStopDistanceChanged"
+            revision: 10
+            Parameter { name: "distance"; type: "double" }
+        }
+        Method { name: "selectAll" }
+        Method { name: "selectWord" }
+        Method {
+            name: "select"
+            Parameter { name: "start"; type: "int" }
+            Parameter { name: "end"; type: "int" }
+        }
+        Method { name: "deselect" }
+        Method {
+            name: "isRightToLeft"
+            type: "bool"
+            Parameter { name: "start"; type: "int" }
+            Parameter { name: "end"; type: "int" }
+        }
+        Method { name: "cut" }
+        Method { name: "copy" }
+        Method { name: "paste" }
+        Method { name: "undo" }
+        Method { name: "redo" }
+        Method {
+            name: "insert"
+            Parameter { name: "position"; type: "int" }
+            Parameter { name: "text"; type: "string" }
+        }
+        Method {
+            name: "remove"
+            Parameter { name: "start"; type: "int" }
+            Parameter { name: "end"; type: "int" }
+        }
+        Method {
+            name: "append"
+            revision: 2
+            Parameter { name: "text"; type: "string" }
+        }
+        Method { name: "clear"; revision: 7 }
+        Method { name: "q_textChanged" }
+        Method {
+            name: "q_contentsChange"
+            Parameter { type: "int" }
+            Parameter { type: "int" }
+            Parameter { type: "int" }
+        }
+        Method { name: "updateSelection" }
+        Method { name: "moveCursorDelegate" }
+        Method { name: "createCursor" }
+        Method { name: "q_canPasteChanged" }
+        Method { name: "updateWholeDocument" }
+        Method {
+            name: "invalidateBlock"
+            Parameter { name: "block"; type: "QTextBlock" }
+        }
+        Method { name: "updateCursor" }
+        Method {
+            name: "q_linkHovered"
+            Parameter { name: "link"; type: "string" }
+        }
+        Method {
+            name: "q_markerHovered"
+            Parameter { name: "hovered"; type: "bool" }
+        }
+        Method { name: "q_updateAlignment" }
+        Method { name: "updateSize" }
+        Method { name: "triggerPreprocess" }
+        Method {
+            name: "inputMethodQuery"
+            revision: 4
+            type: "QVariant"
+            Parameter { name: "query"; type: "Qt::InputMethodQuery" }
+            Parameter { name: "argument"; type: "QVariant" }
+        }
+        Method {
+            name: "positionToRectangle"
+            type: "QRectF"
+            Parameter { type: "int" }
+        }
+        Method {
+            name: "positionAt"
+            type: "int"
+            Parameter { name: "x"; type: "double" }
+            Parameter { name: "y"; type: "double" }
+        }
+        Method {
+            name: "moveCursorSelection"
+            Parameter { name: "pos"; type: "int" }
+        }
+        Method {
+            name: "moveCursorSelection"
+            Parameter { name: "pos"; type: "int" }
+            Parameter { name: "mode"; type: "SelectionMode" }
+        }
+        Method {
+            name: "getText"
+            type: "string"
+            Parameter { name: "start"; type: "int" }
+            Parameter { name: "end"; type: "int" }
+        }
+        Method {
+            name: "getFormattedText"
+            type: "string"
+            Parameter { name: "start"; type: "int" }
+            Parameter { name: "end"; type: "int" }
+        }
+        Method {
+            name: "linkAt"
+            revision: 3
+            type: "string"
+            Parameter { name: "x"; type: "double" }
+            Parameter { name: "y"; type: "double" }
+        }
+    }
+    Component {
+        file: "private/qquicktextinput_p.h"
+        name: "QQuickTextInput"
+        prototype: "QQuickImplicitSizeItem"
+        exports: [
+            "QtQuick/TextInput 2.0",
+            "QtQuick/TextInput 2.1",
+            "QtQuick/TextInput 2.11",
+            "QtQuick/TextInput 2.2",
+            "QtQuick/TextInput 2.4",
+            "QtQuick/TextInput 2.6",
+            "QtQuick/TextInput 2.7",
+            "QtQuick/TextInput 2.9"
+        ]
+        exportMetaObjectRevisions: [0, 1, 11, 2, 4, 6, 7, 9]
+        Enum {
+            name: "EchoMode"
+            values: ["Normal", "NoEcho", "Password", "PasswordEchoOnEdit"]
+        }
+        Enum {
+            name: "HAlignment"
+            values: ["AlignLeft", "AlignRight", "AlignHCenter"]
+        }
+        Enum {
+            name: "VAlignment"
+            values: ["AlignTop", "AlignBottom", "AlignVCenter"]
+        }
+        Enum {
+            name: "WrapMode"
+            values: [
+                "NoWrap",
+                "WordWrap",
+                "WrapAnywhere",
+                "WrapAtWordBoundaryOrAnywhere",
+                "Wrap"
+            ]
+        }
+        Enum {
+            name: "SelectionMode"
+            values: ["SelectCharacters", "SelectWords"]
+        }
+        Enum {
+            name: "CursorPosition"
+            values: ["CursorBetweenCharacters", "CursorOnCharacter"]
+        }
+        Enum {
+            name: "RenderType"
+            values: ["QtRendering", "NativeRendering"]
+        }
+        Property { name: "text"; type: "string" }
+        Property { name: "length"; type: "int"; isReadonly: true }
+        Property { name: "color"; type: "QColor" }
+        Property { name: "selectionColor"; type: "QColor" }
+        Property { name: "selectedTextColor"; type: "QColor" }
+        Property { name: "font"; type: "QFont" }
+        Property { name: "horizontalAlignment"; type: "HAlignment" }
+        Property { name: "effectiveHorizontalAlignment"; type: "HAlignment"; isReadonly: true }
+        Property { name: "verticalAlignment"; type: "VAlignment" }
+        Property { name: "wrapMode"; type: "WrapMode" }
+        Property { name: "readOnly"; type: "bool" }
+        Property { name: "cursorVisible"; type: "bool" }
+        Property { name: "cursorPosition"; type: "int" }
+        Property { name: "cursorRectangle"; type: "QRectF"; isReadonly: true }
+        Property { name: "cursorDelegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "overwriteMode"; type: "bool" }
+        Property { name: "selectionStart"; type: "int"; isReadonly: true }
+        Property { name: "selectionEnd"; type: "int"; isReadonly: true }
+        Property { name: "selectedText"; type: "string"; isReadonly: true }
+        Property { name: "maximumLength"; type: "int" }
+        Property { name: "validator"; type: "QValidator"; isPointer: true }
+        Property { name: "inputMask"; type: "string" }
+        Property { name: "inputMethodHints"; type: "Qt::InputMethodHints" }
+        Property { name: "acceptableInput"; type: "bool"; isReadonly: true }
+        Property { name: "echoMode"; type: "EchoMode" }
+        Property { name: "activeFocusOnPress"; type: "bool" }
+        Property { name: "passwordCharacter"; type: "string" }
+        Property { name: "passwordMaskDelay"; revision: 4; type: "int" }
+        Property { name: "displayText"; type: "string"; isReadonly: true }
+        Property { name: "preeditText"; revision: 7; type: "string"; isReadonly: true }
+        Property { name: "autoScroll"; type: "bool" }
+        Property { name: "selectByMouse"; type: "bool" }
+        Property { name: "mouseSelectionMode"; type: "SelectionMode" }
+        Property { name: "persistentSelection"; type: "bool" }
+        Property { name: "canPaste"; type: "bool"; isReadonly: true }
+        Property { name: "canUndo"; type: "bool"; isReadonly: true }
+        Property { name: "canRedo"; type: "bool"; isReadonly: true }
+        Property { name: "inputMethodComposing"; type: "bool"; isReadonly: true }
+        Property { name: "contentWidth"; type: "double"; isReadonly: true }
+        Property { name: "contentHeight"; type: "double"; isReadonly: true }
+        Property { name: "renderType"; type: "RenderType" }
+        Property { name: "padding"; revision: 6; type: "double" }
+        Property { name: "topPadding"; revision: 6; type: "double" }
+        Property { name: "leftPadding"; revision: 6; type: "double" }
+        Property { name: "rightPadding"; revision: 6; type: "double" }
+        Property { name: "bottomPadding"; revision: 6; type: "double" }
+        Signal { name: "accepted" }
+        Signal { name: "editingFinished"; revision: 2 }
+        Signal { name: "textEdited"; revision: 9 }
+        Signal {
+            name: "fontChanged"
+            Parameter { name: "font"; type: "QFont" }
+        }
+        Signal {
+            name: "horizontalAlignmentChanged"
+            Parameter { name: "alignment"; type: "QQuickTextInput::HAlignment" }
+        }
+        Signal {
+            name: "verticalAlignmentChanged"
+            Parameter { name: "alignment"; type: "QQuickTextInput::VAlignment" }
+        }
+        Signal {
+            name: "readOnlyChanged"
+            Parameter { name: "isReadOnly"; type: "bool" }
+        }
+        Signal {
+            name: "cursorVisibleChanged"
+            Parameter { name: "isCursorVisible"; type: "bool" }
+        }
+        Signal {
+            name: "overwriteModeChanged"
+            Parameter { name: "overwriteMode"; type: "bool" }
+        }
+        Signal {
+            name: "maximumLengthChanged"
+            Parameter { name: "maximumLength"; type: "int" }
+        }
+        Signal {
+            name: "inputMaskChanged"
+            Parameter { name: "inputMask"; type: "string" }
+        }
+        Signal {
+            name: "echoModeChanged"
+            Parameter { name: "echoMode"; type: "QQuickTextInput::EchoMode" }
+        }
+        Signal {
+            name: "passwordMaskDelayChanged"
+            revision: 4
+            Parameter { name: "delay"; type: "int" }
+        }
+        Signal { name: "preeditTextChanged"; revision: 7 }
+        Signal {
+            name: "activeFocusOnPressChanged"
+            Parameter { name: "activeFocusOnPress"; type: "bool" }
+        }
+        Signal {
+            name: "autoScrollChanged"
+            Parameter { name: "autoScroll"; type: "bool" }
+        }
+        Signal {
+            name: "selectByMouseChanged"
+            Parameter { name: "selectByMouse"; type: "bool" }
+        }
+        Signal {
+            name: "mouseSelectionModeChanged"
+            Parameter { name: "mode"; type: "QQuickTextInput::SelectionMode" }
+        }
+        Signal { name: "contentSizeChanged" }
+        Signal { name: "paddingChanged"; revision: 6 }
+        Signal { name: "topPaddingChanged"; revision: 6 }
+        Signal { name: "leftPaddingChanged"; revision: 6 }
+        Signal { name: "rightPaddingChanged"; revision: 6 }
+        Signal { name: "bottomPaddingChanged"; revision: 6 }
+        Method { name: "selectAll" }
+        Method { name: "selectWord" }
+        Method {
+            name: "select"
+            Parameter { name: "start"; type: "int" }
+            Parameter { name: "end"; type: "int" }
+        }
+        Method { name: "deselect" }
+        Method {
+            name: "isRightToLeft"
+            type: "bool"
+            Parameter { name: "start"; type: "int" }
+            Parameter { name: "end"; type: "int" }
+        }
+        Method { name: "cut" }
+        Method { name: "copy" }
+        Method { name: "paste" }
+        Method { name: "undo" }
+        Method { name: "redo" }
+        Method {
+            name: "insert"
+            Parameter { name: "position"; type: "int" }
+            Parameter { name: "text"; type: "string" }
+        }
+        Method {
+            name: "remove"
+            Parameter { name: "start"; type: "int" }
+            Parameter { name: "end"; type: "int" }
+        }
+        Method {
+            name: "ensureVisible"
+            revision: 4
+            Parameter { name: "position"; type: "int" }
+        }
+        Method { name: "clear"; revision: 7 }
+        Method { name: "selectionChanged" }
+        Method { name: "createCursor" }
+        Method {
+            name: "updateCursorRectangle"
+            Parameter { name: "scroll"; type: "bool" }
+        }
+        Method { name: "updateCursorRectangle" }
+        Method { name: "q_canPasteChanged" }
+        Method { name: "q_updateAlignment" }
+        Method { name: "triggerPreprocess" }
+        Method { name: "q_validatorChanged" }
+        Method {
+            name: "positionAt"
+            Parameter { name: "args"; type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "positionToRectangle"
+            type: "QRectF"
+            Parameter { name: "pos"; type: "int" }
+        }
+        Method {
+            name: "moveCursorSelection"
+            Parameter { name: "pos"; type: "int" }
+        }
+        Method {
+            name: "moveCursorSelection"
+            Parameter { name: "pos"; type: "int" }
+            Parameter { name: "mode"; type: "SelectionMode" }
+        }
+        Method {
+            name: "inputMethodQuery"
+            revision: 4
+            type: "QVariant"
+            Parameter { name: "query"; type: "Qt::InputMethodQuery" }
+            Parameter { name: "argument"; type: "QVariant" }
+        }
+        Method {
+            name: "getText"
+            type: "string"
+            Parameter { name: "start"; type: "int" }
+            Parameter { name: "end"; type: "int" }
+        }
+    }
+    Component {
+        file: "private/qquicktext_p.h"
+        name: "QQuickTextLine"
+        prototype: "QObject"
+        Property { name: "number"; type: "int"; isReadonly: true }
+        Property { name: "width"; type: "double" }
+        Property { name: "height"; type: "double" }
+        Property { name: "x"; type: "double" }
+        Property { name: "y"; type: "double" }
+        Property { name: "implicitWidth"; revision: 15; type: "double"; isReadonly: true }
+        Property { name: "isLast"; revision: 15; type: "bool"; isReadonly: true }
+    }
+    Component {
+        file: "private/qquicktextmetrics_p.h"
+        name: "QQuickTextMetrics"
+        prototype: "QObject"
+        exports: ["QtQuick/TextMetrics 2.4"]
+        exportMetaObjectRevisions: [4]
+        Property { name: "font"; type: "QFont" }
+        Property { name: "text"; type: "string" }
+        Property { name: "advanceWidth"; type: "double"; isReadonly: true }
+        Property { name: "boundingRect"; type: "QRectF"; isReadonly: true }
+        Property { name: "width"; type: "double"; isReadonly: true }
+        Property { name: "height"; type: "double"; isReadonly: true }
+        Property { name: "tightBoundingRect"; type: "QRectF"; isReadonly: true }
+        Property { name: "elidedText"; type: "string"; isReadonly: true }
+        Property { name: "elide"; type: "Qt::TextElideMode" }
+        Property { name: "elideWidth"; type: "double" }
+        Signal { name: "metricsChanged" }
+    }
+    Component {
+        file: "private/qquickmultipointtoucharea_p.h"
+        name: "QQuickTouchPoint"
+        prototype: "QObject"
+        exports: ["QtQuick/TouchPoint 2.0", "QtQuick/TouchPoint 2.9"]
+        exportMetaObjectRevisions: [0, 9]
+        Property { name: "pointId"; type: "int"; isReadonly: true }
+        Property { name: "uniqueId"; revision: 9; type: "QPointingDeviceUniqueId"; isReadonly: true }
+        Property { name: "pressed"; type: "bool"; isReadonly: true }
+        Property { name: "x"; type: "double"; isReadonly: true }
+        Property { name: "y"; type: "double"; isReadonly: true }
+        Property { name: "ellipseDiameters"; revision: 9; type: "QSizeF"; isReadonly: true }
+        Property { name: "pressure"; type: "double"; isReadonly: true }
+        Property { name: "rotation"; revision: 9; type: "double"; isReadonly: true }
+        Property { name: "velocity"; type: "QVector2D"; isReadonly: true }
+        Property { name: "area"; type: "QRectF"; isReadonly: true }
+        Property { name: "startX"; type: "double"; isReadonly: true }
+        Property { name: "startY"; type: "double"; isReadonly: true }
+        Property { name: "previousX"; type: "double"; isReadonly: true }
+        Property { name: "previousY"; type: "double"; isReadonly: true }
+        Property { name: "sceneX"; type: "double"; isReadonly: true }
+        Property { name: "sceneY"; type: "double"; isReadonly: true }
+        Signal { name: "uniqueIdChanged"; revision: 9 }
+        Signal { name: "ellipseDiametersChanged"; revision: 9 }
+        Signal { name: "rotationChanged"; revision: 9 }
+    }
+    Component {
+        file: "qquickitem.h"
+        name: "QQuickTransform"
+        prototype: "QObject"
+        Method { name: "update" }
+    }
+    Component {
+        file: "private/qquicktransition_p.h"
+        name: "QQuickTransition"
+        defaultProperty: "animations"
+        prototype: "QObject"
+        exports: ["QtQuick/Transition 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "from"; type: "string" }
+        Property { name: "to"; type: "string" }
+        Property { name: "reversible"; type: "bool" }
+        Property { name: "running"; type: "bool"; isReadonly: true }
+        Property { name: "animations"; type: "QQuickAbstractAnimation"; isList: true; isReadonly: true }
+        Property { name: "enabled"; type: "bool" }
+    }
+    Component {
+        file: "private/qquicktranslate_p.h"
+        name: "QQuickTranslate"
+        prototype: "QQuickTransform"
+        exports: ["QtQuick/Translate 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "x"; type: "double" }
+        Property { name: "y"; type: "double" }
+    }
+    Component {
+        file: "private/qquickanimator_p.h"
+        name: "QQuickUniformAnimator"
+        prototype: "QQuickAnimator"
+        exports: [
+            "QtQuick/UniformAnimator 2.12",
+            "QtQuick/UniformAnimator 2.2"
+        ]
+        exportMetaObjectRevisions: [12, 2]
+        Property { name: "uniform"; type: "string" }
+        Signal {
+            name: "uniformChanged"
+            Parameter { type: "string" }
+        }
+    }
+    Component {
+        file: "private/qquickanimation_p.h"
+        name: "QQuickVector3dAnimation"
+        prototype: "QQuickPropertyAnimation"
+        exports: [
+            "QtQuick/Vector3dAnimation 2.0",
+            "QtQuick/Vector3dAnimation 2.12"
+        ]
+        exportMetaObjectRevisions: [0, 12]
+        Property { name: "from"; type: "QVector3D" }
+        Property { name: "to"; type: "QVector3D" }
+    }
+    Component {
+        file: "private/qquicklistview_p.h"
+        name: "QQuickViewSection"
+        prototype: "QObject"
+        exports: ["QtQuick/ViewSection 2.0"]
+        exportMetaObjectRevisions: [0]
+        Enum {
+            name: "SectionCriteria"
+            values: ["FullString", "FirstCharacter"]
+        }
+        Enum {
+            name: "LabelPositioning"
+            values: ["InlineLabels", "CurrentLabelAtStart", "NextLabelAtEnd"]
+        }
+        Property { name: "property"; type: "string" }
+        Property { name: "criteria"; type: "SectionCriteria" }
+        Property { name: "delegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "labelPositioning"; type: "int" }
+        Signal { name: "sectionsChanged" }
+    }
+    Component {
+        file: "private/qquickitemviewtransition_p.h"
+        name: "QQuickViewTransitionAttached"
+        prototype: "QObject"
+        exports: ["QtQuick/ViewTransition 2.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        attachedType: "QQuickViewTransitionAttached"
+        Property { name: "index"; type: "int"; isReadonly: true }
+        Property { name: "item"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property { name: "destination"; type: "QPointF"; isReadonly: true }
+        Property { name: "targetIndexes"; type: "QList<int>"; isReadonly: true }
+        Property { name: "targetItems"; type: "QObject"; isList: true; isReadonly: true }
+    }
+    Component {
+        file: "private/qquickevents_p_p.h"
+        name: "QQuickWheelEvent"
+        prototype: "QObject"
+        Property { name: "x"; type: "double"; isReadonly: true }
+        Property { name: "y"; type: "double"; isReadonly: true }
+        Property { name: "angleDelta"; type: "QPoint"; isReadonly: true }
+        Property { name: "pixelDelta"; type: "QPoint"; isReadonly: true }
+        Property { name: "buttons"; type: "int"; isReadonly: true }
+        Property { name: "modifiers"; type: "int"; isReadonly: true }
+        Property { name: "inverted"; type: "bool"; isReadonly: true }
+        Property { name: "accepted"; type: "bool" }
+    }
+    Component {
+        file: "private/qquickwheelhandler_p.h"
+        name: "QQuickWheelHandler"
+        prototype: "QQuickSinglePointHandler"
+        exports: ["QtQuick/WheelHandler 2.14", "QtQuick/WheelHandler 2.15"]
+        exportMetaObjectRevisions: [14, 15]
+        Property { name: "orientation"; type: "Qt::Orientation" }
+        Property { name: "invertible"; type: "bool" }
+        Property { name: "activeTimeout"; type: "double" }
+        Property { name: "rotation"; type: "double" }
+        Property { name: "rotationScale"; type: "double" }
+        Property { name: "property"; type: "string" }
+        Property { name: "targetScaleMultiplier"; type: "double" }
+        Property { name: "targetTransformAroundCursor"; type: "bool" }
+        Signal {
+            name: "wheel"
+            Parameter { name: "event"; type: "QQuickPointerScrollEvent"; isPointer: true }
+        }
+    }
+    Component {
+        file: "private/qquickanimator_p.h"
+        name: "QQuickXAnimator"
+        prototype: "QQuickAnimator"
+        exports: ["QtQuick/XAnimator 2.12", "QtQuick/XAnimator 2.2"]
+        exportMetaObjectRevisions: [12, 2]
+    }
+    Component {
+        file: "private/qquickanimator_p.h"
+        name: "QQuickYAnimator"
+        prototype: "QQuickAnimator"
+        exports: ["QtQuick/YAnimator 2.12", "QtQuick/YAnimator 2.2"]
+        exportMetaObjectRevisions: [12, 2]
+    }
+    Component {
+        file: "private/qquickforeignutils_p.h"
+        name: "QRegExpValidator"
+        prototype: "QValidator"
+        exports: ["QtQuick/RegExpValidator 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "regExp"; type: "QRegExp" }
+        Signal {
+            name: "regExpChanged"
+            Parameter { name: "regExp"; type: "QRegExp" }
+        }
+    }
+    Component {
+        file: "private/qquickforeignutils_p.h"
+        name: "QRegularExpressionValidator"
+        prototype: "QValidator"
+        exports: ["QtQuick/RegularExpressionValidator 2.14"]
+        exportMetaObjectRevisions: [14]
+        Property { name: "regularExpression"; type: "QRegularExpression" }
+        Signal {
+            name: "regularExpressionChanged"
+            Parameter { name: "re"; type: "QRegularExpression" }
+        }
+        Method {
+            name: "setRegularExpression"
+            Parameter { name: "re"; type: "QRegularExpression" }
+        }
+    }
+    Component {
+        file: "private/qquickforeignutils_p.h"
+        name: "QValidator"
+        prototype: "QObject"
+        Enum {
+            name: "State"
+            values: ["Invalid", "Intermediate", "Acceptable"]
+        }
+        Signal { name: "changed" }
+    }
+}
diff --git a/deployment_test/QtQuick.2/qmldir b/deployment_test/QtQuick.2/qmldir
new file mode 100644
index 0000000000000000000000000000000000000000..e4e7f5d00b6c8b3429fb5fcdbae15f6e71bd95a1
--- /dev/null
+++ b/deployment_test/QtQuick.2/qmldir
@@ -0,0 +1,6 @@
+module QtQuick
+plugin qtquick2plugin
+classname QtQuick2Plugin
+typeinfo plugins.qmltypes
+depends QtQml 2.15
+designersupported
diff --git a/deployment_test/QtQuick.2/qtquick2plugin.dll b/deployment_test/QtQuick.2/qtquick2plugin.dll
new file mode 100644
index 0000000000000000000000000000000000000000..8af255d64c5547e09b8e62c10f401ad1726c73ba
Binary files /dev/null and b/deployment_test/QtQuick.2/qtquick2plugin.dll differ
diff --git a/deployment_test/QtQuick/Controls.2/AbstractButton.qml b/deployment_test/QtQuick/Controls.2/AbstractButton.qml
new file mode 100644
index 0000000000000000000000000000000000000000..50ddb933a7aa6675d7fa5d94b605b205a3bc0ac0
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/AbstractButton.qml
@@ -0,0 +1,47 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+
+T.AbstractButton {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+}
diff --git a/deployment_test/QtQuick/Controls.2/Action.qml b/deployment_test/QtQuick/Controls.2/Action.qml
new file mode 100644
index 0000000000000000000000000000000000000000..996e9086a0de60bf80cf9da809272e53493209b9
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Action.qml
@@ -0,0 +1,40 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+
+T.Action { }
diff --git a/deployment_test/QtQuick/Controls.2/ActionGroup.qml b/deployment_test/QtQuick/Controls.2/ActionGroup.qml
new file mode 100644
index 0000000000000000000000000000000000000000..89e72c8fcfef447f6dff7e5c5faac6a014eec269
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/ActionGroup.qml
@@ -0,0 +1,40 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+
+T.ActionGroup { }
diff --git a/deployment_test/QtQuick/Controls.2/ApplicationWindow.qml b/deployment_test/QtQuick/Controls.2/ApplicationWindow.qml
new file mode 100644
index 0000000000000000000000000000000000000000..4686a298e8c48b8956a403d185914d718723e943
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/ApplicationWindow.qml
@@ -0,0 +1,55 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Window 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Templates 2.12 as T
+
+T.ApplicationWindow {
+    id: window
+
+    color: palette.window
+
+    overlay.modal: Rectangle {
+        color: Color.transparent(window.palette.shadow, 0.5)
+    }
+
+    overlay.modeless: Rectangle {
+        color: Color.transparent(window.palette.shadow, 0.12)
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/BusyIndicator.qml b/deployment_test/QtQuick/Controls.2/BusyIndicator.qml
new file mode 100644
index 0000000000000000000000000000000000000000..ff5c191cbc3efcccd70360c1bfcbf7c020531312
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/BusyIndicator.qml
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Templates 2.12 as T
+
+T.BusyIndicator {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    padding: 6
+
+    contentItem: BusyIndicatorImpl {
+        implicitWidth: 48
+        implicitHeight: 48
+
+        pen: control.palette.dark
+        fill: control.palette.dark
+
+        running: control.running
+        opacity: control.running ? 1 : 0
+        Behavior on opacity { OpacityAnimator { duration: 250 } }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Button.qml b/deployment_test/QtQuick/Controls.2/Button.qml
new file mode 100644
index 0000000000000000000000000000000000000000..a9e7fce63ba5cc173f067490f2ccbbe47f320924
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Button.qml
@@ -0,0 +1,80 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Templates 2.12 as T
+
+T.Button {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    padding: 6
+    horizontalPadding: padding + 2
+    spacing: 6
+
+    icon.width: 24
+    icon.height: 24
+    icon.color: control.checked || control.highlighted ? control.palette.brightText :
+                control.flat && !control.down ? (control.visualFocus ? control.palette.highlight : control.palette.windowText) : control.palette.buttonText
+
+    contentItem: IconLabel {
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.checked || control.highlighted ? control.palette.brightText :
+               control.flat && !control.down ? (control.visualFocus ? control.palette.highlight : control.palette.windowText) : control.palette.buttonText
+    }
+
+    background: Rectangle {
+        implicitWidth: 100
+        implicitHeight: 40
+        visible: !control.flat || control.down || control.checked || control.highlighted
+        color: Color.blend(control.checked || control.highlighted ? control.palette.dark : control.palette.button,
+                                                                    control.palette.mid, control.down ? 0.5 : 0.0)
+        border.color: control.palette.highlight
+        border.width: control.visualFocus ? 2 : 0
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/ButtonGroup.qml b/deployment_test/QtQuick/Controls.2/ButtonGroup.qml
new file mode 100644
index 0000000000000000000000000000000000000000..cf0355ba7b1b8034f60ea7daf42c5ecf72a5c61e
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/ButtonGroup.qml
@@ -0,0 +1,40 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+
+T.ButtonGroup { }
diff --git a/deployment_test/QtQuick/Controls.2/CheckBox.qml b/deployment_test/QtQuick/Controls.2/CheckBox.qml
new file mode 100644
index 0000000000000000000000000000000000000000..b1f50ed1bb1da55fc2a3381aa9fb1f2cedea953f
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/CheckBox.qml
@@ -0,0 +1,93 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+
+T.CheckBox {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    padding: 6
+    spacing: 6
+
+    // keep in sync with CheckDelegate.qml (shared CheckIndicator.qml was removed for performance reasons)
+    indicator: Rectangle {
+        implicitWidth: 28
+        implicitHeight: 28
+
+        x: control.text ? (control.mirrored ? control.width - width - control.rightPadding : control.leftPadding) : control.leftPadding + (control.availableWidth - width) / 2
+        y: control.topPadding + (control.availableHeight - height) / 2
+
+        color: control.down ? control.palette.light : control.palette.base
+        border.width: control.visualFocus ? 2 : 1
+        border.color: control.visualFocus ? control.palette.highlight : control.palette.mid
+
+        ColorImage {
+            x: (parent.width - width) / 2
+            y: (parent.height - height) / 2
+            defaultColor: "#353637"
+            color: control.palette.text
+            source: "qrc:/qt-project.org/imports/QtQuick/Controls.2/images/check.png"
+            visible: control.checkState === Qt.Checked
+        }
+
+        Rectangle {
+            x: (parent.width - width) / 2
+            y: (parent.height - height) / 2
+            width: 16
+            height: 3
+            color: control.palette.text
+            visible: control.checkState === Qt.PartiallyChecked
+        }
+    }
+
+    contentItem: CheckLabel {
+        leftPadding: control.indicator && !control.mirrored ? control.indicator.width + control.spacing : 0
+        rightPadding: control.indicator && control.mirrored ? control.indicator.width + control.spacing : 0
+
+        text: control.text
+        font: control.font
+        color: control.palette.windowText
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/CheckDelegate.qml b/deployment_test/QtQuick/Controls.2/CheckDelegate.qml
new file mode 100644
index 0000000000000000000000000000000000000000..71b390acb1803030f02e2e5c6d61ffa22b2df855
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/CheckDelegate.qml
@@ -0,0 +1,110 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+
+T.CheckDelegate {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    padding: 12
+    spacing: 12
+
+    icon.width: 24
+    icon.height: 24
+    icon.color: control.palette.text
+
+    contentItem: IconLabel {
+        leftPadding: control.mirrored ? control.indicator.width + control.spacing : 0
+        rightPadding: !control.mirrored ? control.indicator.width + control.spacing : 0
+
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+        alignment: control.display === IconLabel.IconOnly || control.display === IconLabel.TextUnderIcon ? Qt.AlignCenter : Qt.AlignLeft
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.palette.text
+    }
+
+    // keep in sync with CheckBox.qml (shared CheckIndicator.qml was removed for performance reasons)
+    indicator: Rectangle {
+        implicitWidth: 28
+        implicitHeight: 28
+
+        x: control.mirrored ? control.leftPadding : control.width - width - control.rightPadding
+        y: control.topPadding + (control.availableHeight - height) / 2
+
+        color: control.down ? control.palette.light : control.palette.base
+        border.width: control.visualFocus ? 2 : 1
+        border.color: control.visualFocus ? control.palette.highlight : control.palette.mid
+
+        ColorImage {
+            x: (parent.width - width) / 2
+            y: (parent.height - height) / 2
+            defaultColor: "#353637"
+            color: control.palette.text
+            source: "qrc:/qt-project.org/imports/QtQuick/Controls.2/images/check.png"
+            visible: control.checkState === Qt.Checked
+        }
+
+        Rectangle {
+            x: (parent.width - width) / 2
+            y: (parent.height - height) / 2
+            width: 16
+            height: 3
+            color: control.palette.text
+            visible: control.checkState === Qt.PartiallyChecked
+        }
+    }
+
+    background: Rectangle {
+        implicitWidth: 100
+        implicitHeight: 40
+        visible: control.down || control.highlighted
+        color: control.down ? control.palette.midlight : control.palette.light
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/ComboBox.qml b/deployment_test/QtQuick/Controls.2/ComboBox.qml
new file mode 100644
index 0000000000000000000000000000000000000000..e9f93d66f6ecb8ed64e67ba1804405b1f1a65559
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/ComboBox.qml
@@ -0,0 +1,142 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.15
+import QtQuick.Window 2.15
+import QtQuick.Controls 2.15
+import QtQuick.Controls.impl 2.15
+import QtQuick.Templates 2.15 as T
+
+T.ComboBox {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    leftPadding: padding + (!control.mirrored || !indicator || !indicator.visible ? 0 : indicator.width + spacing)
+    rightPadding: padding + (control.mirrored || !indicator || !indicator.visible ? 0 : indicator.width + spacing)
+
+    delegate: ItemDelegate {
+        width: ListView.view.width
+        text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole] : model[control.textRole]) : modelData
+        palette.text: control.palette.text
+        palette.highlightedText: control.palette.highlightedText
+        font.weight: control.currentIndex === index ? Font.DemiBold : Font.Normal
+        highlighted: control.highlightedIndex === index
+        hoverEnabled: control.hoverEnabled
+    }
+
+    indicator: ColorImage {
+        x: control.mirrored ? control.padding : control.width - width - control.padding
+        y: control.topPadding + (control.availableHeight - height) / 2
+        color: control.palette.dark
+        defaultColor: "#353637"
+        source: "qrc:/qt-project.org/imports/QtQuick/Controls.2/images/double-arrow.png"
+        opacity: enabled ? 1 : 0.3
+    }
+
+    contentItem: T.TextField {
+        leftPadding: !control.mirrored ? 12 : control.editable && activeFocus ? 3 : 1
+        rightPadding: control.mirrored ? 12 : control.editable && activeFocus ? 3 : 1
+        topPadding: 6 - control.padding
+        bottomPadding: 6 - control.padding
+
+        text: control.editable ? control.editText : control.displayText
+
+        enabled: control.editable
+        autoScroll: control.editable
+        readOnly: control.down
+        inputMethodHints: control.inputMethodHints
+        validator: control.validator
+        selectByMouse: control.selectTextByMouse
+
+        font: control.font
+        color: control.editable ? control.palette.text : control.palette.buttonText
+        selectionColor: control.palette.highlight
+        selectedTextColor: control.palette.highlightedText
+        verticalAlignment: Text.AlignVCenter
+
+        background: Rectangle {
+            visible: control.enabled && control.editable && !control.flat
+            border.width: parent && parent.activeFocus ? 2 : 1
+            border.color: parent && parent.activeFocus ? control.palette.highlight : control.palette.button
+            color: control.palette.base
+        }
+    }
+
+    background: Rectangle {
+        implicitWidth: 140
+        implicitHeight: 40
+
+        color: control.down ? control.palette.mid : control.palette.button
+        border.color: control.palette.highlight
+        border.width: !control.editable && control.visualFocus ? 2 : 0
+        visible: !control.flat || control.down
+    }
+
+    popup: T.Popup {
+        y: control.height
+        width: control.width
+        height: Math.min(contentItem.implicitHeight, control.Window.height - topMargin - bottomMargin)
+        topMargin: 6
+        bottomMargin: 6
+
+        contentItem: ListView {
+            clip: true
+            implicitHeight: contentHeight
+            model: control.delegateModel
+            currentIndex: control.highlightedIndex
+            highlightMoveDuration: 0
+
+            Rectangle {
+                z: 10
+                width: parent.width
+                height: parent.height
+                color: "transparent"
+                border.color: control.palette.mid
+            }
+
+            T.ScrollIndicator.vertical: ScrollIndicator { }
+        }
+
+        background: Rectangle {
+            color: control.palette.window
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Container.qml b/deployment_test/QtQuick/Controls.2/Container.qml
new file mode 100644
index 0000000000000000000000000000000000000000..83ab957d33b984797fc49f463f120c8e4a4babb8
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Container.qml
@@ -0,0 +1,47 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+
+T.Container {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+}
diff --git a/deployment_test/QtQuick/Controls.2/Control.qml b/deployment_test/QtQuick/Controls.2/Control.qml
new file mode 100644
index 0000000000000000000000000000000000000000..a963a56330c800e75dcd1b27f3ece3db3f308245
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Control.qml
@@ -0,0 +1,47 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+
+T.Control {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+}
diff --git a/deployment_test/QtQuick/Controls.2/DelayButton.qml b/deployment_test/QtQuick/Controls.2/DelayButton.qml
new file mode 100644
index 0000000000000000000000000000000000000000..1c545a71e67a38942934bdbba4021cab24064b2e
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/DelayButton.qml
@@ -0,0 +1,105 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Templates 2.12 as T
+
+T.DelayButton {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    padding: 6
+    horizontalPadding: padding + 2
+
+    transition: Transition {
+        NumberAnimation {
+            duration: control.delay * (control.pressed ? 1.0 - control.progress : 0.3 * control.progress)
+        }
+    }
+
+    contentItem: ItemGroup {
+        ClippedText {
+            clip: control.progress > 0
+            clipX: -control.leftPadding + control.progress * control.width
+            clipWidth: (1.0 - control.progress) * control.width
+            visible: control.progress < 1
+
+            text: control.text
+            font: control.font
+            opacity: enabled ? 1 : 0.3
+            color: control.palette.buttonText
+            horizontalAlignment: Text.AlignHCenter
+            verticalAlignment: Text.AlignVCenter
+            elide: Text.ElideRight
+        }
+
+        ClippedText {
+            clip: control.progress > 0
+            clipX: -control.leftPadding
+            clipWidth: control.progress * control.width
+            visible: control.progress > 0
+
+            text: control.text
+            font: control.font
+            opacity: enabled ? 1 : 0.3
+            color: control.palette.brightText
+            horizontalAlignment: Text.AlignHCenter
+            verticalAlignment: Text.AlignVCenter
+            elide: Text.ElideRight
+        }
+    }
+
+    background: Rectangle {
+        implicitWidth: 100
+        implicitHeight: 40
+        color: Color.blend(control.palette.button, control.palette.mid, control.down ? 0.5 : 0.0)
+        border.color: control.palette.highlight
+        border.width: control.visualFocus ? 2 : 0
+
+        PaddedRectangle {
+            padding: control.visualFocus ? 2 : 0
+            width: control.progress * parent.width
+            height: parent.height
+            color: Color.blend(control.palette.dark, control.palette.mid, control.down ? 0.5 : 0.0)
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Dial.qml b/deployment_test/QtQuick/Controls.2/Dial.qml
new file mode 100644
index 0000000000000000000000000000000000000000..cc4618a56927c6d7c7f8921998179deac73ba40e
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Dial.qml
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Templates 2.12 as T
+
+T.Dial {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding) || 184 // ### remove 184 in Qt 6
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding) || 184 // ### remove 184 in Qt 6
+
+    background: DialImpl {
+        implicitWidth: 184
+        implicitHeight: 184
+        color: control.visualFocus ? control.palette.highlight : control.palette.dark
+        progress: control.position
+        opacity: control.enabled ? 1 : 0.3
+    }
+
+    handle: ColorImage {
+        x: control.background.x + control.background.width / 2 - control.handle.width / 2
+        y: control.background.y + control.background.height / 2 - control.handle.height / 2
+        width: 14
+        height: 10
+        defaultColor: "#353637"
+        color: control.visualFocus ? control.palette.highlight : control.palette.dark
+        source: "qrc:/qt-project.org/imports/QtQuick/Controls.2/images/dial-indicator.png"
+        antialiasing: true
+        opacity: control.enabled ? 1 : 0.3
+        transform: [
+            Translate {
+                y: -Math.min(control.background.width, control.background.height) * 0.4 + control.handle.height / 2
+            },
+            Rotation {
+                angle: control.angle
+                origin.x: control.handle.width / 2
+                origin.y: control.handle.height / 2
+            }
+        ]
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Dialog.qml b/deployment_test/QtQuick/Controls.2/Dialog.qml
new file mode 100644
index 0000000000000000000000000000000000000000..6c2e4b1b190246f58ed99aee0c7d093d1fa5814d
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Dialog.qml
@@ -0,0 +1,86 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+
+T.Dialog {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding,
+                            implicitHeaderWidth,
+                            implicitFooterWidth)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding
+                             + (implicitHeaderHeight > 0 ? implicitHeaderHeight + spacing : 0)
+                             + (implicitFooterHeight > 0 ? implicitFooterHeight + spacing : 0))
+
+    padding: 12
+
+    background: Rectangle {
+        color: control.palette.window
+        border.color: control.palette.dark
+    }
+
+    header: Label {
+        text: control.title
+        visible: control.title
+        elide: Label.ElideRight
+        font.bold: true
+        padding: 12
+        background: Rectangle {
+            x: 1; y: 1
+            width: parent.width - 2
+            height: parent.height - 1
+            color: control.palette.window
+        }
+    }
+
+    footer: DialogButtonBox {
+        visible: count > 0
+    }
+
+    T.Overlay.modal: Rectangle {
+        color: Color.transparent(control.palette.shadow, 0.5)
+    }
+
+    T.Overlay.modeless: Rectangle {
+        color: Color.transparent(control.palette.shadow, 0.12)
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/DialogButtonBox.qml b/deployment_test/QtQuick/Controls.2/DialogButtonBox.qml
new file mode 100644
index 0000000000000000000000000000000000000000..3c9d5b48eb2626d54a1ae895ecb3c14cc6ab57b1
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/DialogButtonBox.qml
@@ -0,0 +1,72 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+
+T.DialogButtonBox {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            (control.count === 1 ? implicitContentWidth * 2 : implicitContentWidth) + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+    contentWidth: contentItem.contentWidth
+
+    spacing: 1
+    padding: 12
+    alignment: count === 1 ? Qt.AlignRight : undefined
+
+    delegate: Button {
+        width: control.count === 1 ? control.availableWidth / 2 : undefined
+    }
+
+    contentItem: ListView {
+        model: control.contentModel
+        spacing: control.spacing
+        orientation: ListView.Horizontal
+        boundsBehavior: Flickable.StopAtBounds
+        snapMode: ListView.SnapToItem
+    }
+
+    background: Rectangle {
+        implicitHeight: 40
+        x: 1; y: 1
+        width: parent.width - 2
+        height: parent.height - 2
+        color: control.palette.window
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Drawer.qml b/deployment_test/QtQuick/Controls.2/Drawer.qml
new file mode 100644
index 0000000000000000000000000000000000000000..17465fd44c58b5e03ec32145e526a2293cee6939
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Drawer.qml
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Templates 2.12 as T
+
+T.Drawer {
+    id: control
+
+    parent: T.Overlay.overlay
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    topPadding: control.edge === Qt.BottomEdge
+    leftPadding: control.edge === Qt.RightEdge
+    rightPadding: control.edge === Qt.LeftEdge
+    bottomPadding: control.edge === Qt.TopEdge
+
+    enter: Transition { SmoothedAnimation { velocity: 5 } }
+    exit: Transition { SmoothedAnimation { velocity: 5 } }
+
+    background: Rectangle {
+        color: control.palette.window
+        Rectangle {
+            readonly property bool horizontal: control.edge === Qt.LeftEdge || control.edge === Qt.RightEdge
+            width: horizontal ? 1 : parent.width
+            height: horizontal ? parent.height : 1
+            color: control.palette.dark
+            x: control.edge === Qt.LeftEdge ? parent.width - 1 : 0
+            y: control.edge === Qt.TopEdge ? parent.height - 1 : 0
+        }
+    }
+
+    T.Overlay.modal: Rectangle {
+        color: Color.transparent(control.palette.shadow, 0.5)
+    }
+
+    T.Overlay.modeless: Rectangle {
+        color: Color.transparent(control.palette.shadow, 0.12)
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Frame.qml b/deployment_test/QtQuick/Controls.2/Frame.qml
new file mode 100644
index 0000000000000000000000000000000000000000..2fe461040e2570f2b9a3dde2afd53bc1854c2417
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Frame.qml
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Templates 2.12 as T
+
+T.Frame {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    padding: 12
+
+    background: Rectangle {
+        color: "transparent"
+        border.color: control.palette.mid
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/ApplicationWindow.qml b/deployment_test/QtQuick/Controls.2/Fusion/ApplicationWindow.qml
new file mode 100644
index 0000000000000000000000000000000000000000..9079403ec57fe593b7d794896f05431b7c0bfdb4
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/ApplicationWindow.qml
@@ -0,0 +1,55 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Window 2.2
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.ApplicationWindow {
+    id: window
+
+    color: palette.window
+
+    overlay.modal: Rectangle {
+        color: Fusion.topShadow
+    }
+
+    overlay.modeless: Rectangle {
+        color: Fusion.topShadow
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/BusyIndicator.qml b/deployment_test/QtQuick/Controls.2/Fusion/BusyIndicator.qml
new file mode 100644
index 0000000000000000000000000000000000000000..554c3368de7d84a442b5db95bf299e8e4d49e96f
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/BusyIndicator.qml
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.BusyIndicator {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    padding: 6
+
+    contentItem: BusyIndicatorImpl {
+        implicitWidth: 28
+        implicitHeight: 28
+        color: control.palette.text
+
+        running: control.running
+        opacity: control.running ? 1 : 0
+        Behavior on opacity { OpacityAnimator { duration: 250 } }
+
+        RotationAnimator on rotation {
+            running: control.running || contentItem.visible
+            from: 0
+            to: 360
+            duration: 1000
+            loops: Animation.Infinite
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/Button.qml b/deployment_test/QtQuick/Controls.2/Fusion/Button.qml
new file mode 100644
index 0000000000000000000000000000000000000000..7822634de30701a3bb1df7a1843ee8092b658afc
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/Button.qml
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.Button {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    padding: 4
+    spacing: 6
+
+    icon.width: 16
+    icon.height: 16
+
+    contentItem: IconLabel {
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.palette.buttonText
+    }
+
+    background: ButtonPanel {
+        implicitWidth: 80
+        implicitHeight: 24
+
+        control: control
+        visible: !control.flat || control.down || control.checked || control.highlighted || control.visualFocus || control.hovered
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/ButtonPanel.qml b/deployment_test/QtQuick/Controls.2/Fusion/ButtonPanel.qml
new file mode 100644
index 0000000000000000000000000000000000000000..125aa2f3dd6f716205b3e8ef3aa6dab7d646811e
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/ButtonPanel.qml
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+Rectangle {
+    id: panel
+
+    property Item control
+    property bool highlighted: control.highlighted
+
+    visible: !control.flat || control.down || control.checked
+
+    color: Fusion.buttonColor(control.palette, panel.highlighted, control.down || control.checked, control.hovered)
+    gradient: control.down || control.checked ? null : buttonGradient
+
+    Gradient {
+        id: buttonGradient
+        GradientStop {
+            position: 0
+            color: Fusion.gradientStart(Fusion.buttonColor(panel.control.palette, panel.highlighted, panel.control.down, panel.control.hovered))
+        }
+        GradientStop {
+            position: 1
+            color: Fusion.gradientStop(Fusion.buttonColor(panel.control.palette, panel.highlighted, panel.control.down, panel.control.hovered))
+        }
+    }
+
+    radius: 2
+    border.color: Fusion.buttonOutline(control.palette, panel.highlighted || control.visualFocus, control.enabled)
+
+    Rectangle {
+        x: 1; y: 1
+        width: parent.width - 2
+        height: parent.height - 2
+        border.color: Fusion.innerContrastLine
+        color: "transparent"
+        radius: 2
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/CheckBox.qml b/deployment_test/QtQuick/Controls.2/Fusion/CheckBox.qml
new file mode 100644
index 0000000000000000000000000000000000000000..edb4c77faab397dbe5a8a6b5cd6e32af2e6c36c8
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/CheckBox.qml
@@ -0,0 +1,72 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.CheckBox {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    padding: 6
+    spacing: 6
+
+    indicator: CheckIndicator {
+        x: control.text ? (control.mirrored ? control.width - width - control.rightPadding : control.leftPadding) : control.leftPadding + (control.availableWidth - width) / 2
+        y: control.topPadding + (control.availableHeight - height) / 2
+        control: control
+    }
+
+    contentItem: Text {
+        leftPadding: control.indicator && !control.mirrored ? control.indicator.width + control.spacing : 0
+        rightPadding: control.indicator && control.mirrored ? control.indicator.width + control.spacing : 0
+
+        text: control.text
+        font: control.font
+        color: control.palette.windowText
+        elide: Text.ElideRight
+        verticalAlignment: Text.AlignVCenter
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/CheckDelegate.qml b/deployment_test/QtQuick/Controls.2/Fusion/CheckDelegate.qml
new file mode 100644
index 0000000000000000000000000000000000000000..1b97b1fd38d2c0967e5496a59272240ddff51b15
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/CheckDelegate.qml
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.CheckDelegate {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    padding: 6
+    spacing: 6
+
+    icon.width: 16
+    icon.height: 16
+
+    contentItem: IconLabel {
+        leftPadding: control.mirrored ? control.indicator.width + control.spacing : 0
+        rightPadding: !control.mirrored ? control.indicator.width + control.spacing : 0
+
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+        alignment: control.display === IconLabel.IconOnly || control.display === IconLabel.TextUnderIcon ? Qt.AlignCenter : Qt.AlignLeft
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.highlighted ? Fusion.highlightedText(control.palette) : control.palette.text
+    }
+
+    indicator: CheckIndicator {
+        x: control.mirrored ? control.leftPadding : control.width - width - control.rightPadding
+        y: control.topPadding + (control.availableHeight - height) / 2
+
+        control: control
+    }
+
+    background: Rectangle {
+        implicitWidth: 100
+        implicitHeight: 20
+        color: control.down ? Fusion.buttonColor(control.palette, false, true, true)
+                            : control.highlighted ? Fusion.highlight(control.palette) : control.palette.base
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/CheckIndicator.qml b/deployment_test/QtQuick/Controls.2/Fusion/CheckIndicator.qml
new file mode 100644
index 0000000000000000000000000000000000000000..7dcfee30511fea99b1832382ec2a5db91619a69a
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/CheckIndicator.qml
@@ -0,0 +1,92 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+Rectangle {
+    id: indicator
+
+    property Item control
+    readonly property color pressedColor: Fusion.mergedColors(control.palette.base, control.palette.windowText, 85)
+    readonly property color checkMarkColor: Qt.darker(control.palette.text, 1.2)
+
+    implicitWidth: 14
+    implicitHeight: 14
+
+    color: control.down ? indicator.pressedColor : control.palette.base
+    border.color: control.visualFocus ? Fusion.highlightedOutline(control.palette)
+                                      : Qt.lighter(Fusion.outline(control.palette), 1.1)
+
+    Rectangle {
+        x: 1; y: 1
+        width: parent.width - 2
+        height: 1
+        color: Fusion.topShadow
+        visible: indicator.control.enabled && !indicator.control.down
+    }
+
+    ColorImage {
+        x: (parent.width - width) / 2
+        y: (parent.height - height) / 2
+        color: Color.transparent(indicator.checkMarkColor, 210 / 255)
+        source: "qrc:/qt-project.org/imports/QtQuick/Controls.2/Fusion/images/checkmark.png"
+        visible: indicator.control.checkState === Qt.Checked || (indicator.control.checked && indicator.control.checkState === undefined)
+    }
+
+    Rectangle {
+        x: 3; y: 3
+        width: parent.width - 6
+        height: parent.width - 6
+
+        visible: indicator.control.checkState === Qt.PartiallyChecked
+
+        gradient: Gradient {
+            GradientStop {
+                position: 0
+                color: Color.transparent(indicator.checkMarkColor, 80 / 255)
+            }
+            GradientStop {
+                position: 1
+                color: Color.transparent(indicator.checkMarkColor, 140 / 255)
+            }
+        }
+        border.color: Color.transparent(indicator.checkMarkColor, 180 / 255)
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/ComboBox.qml b/deployment_test/QtQuick/Controls.2/Fusion/ComboBox.qml
new file mode 100644
index 0000000000000000000000000000000000000000..5e26f90ec4353c582bcba88539750cdc553b270e
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/ComboBox.qml
@@ -0,0 +1,176 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.15
+import QtQuick.Window 2.15
+import QtQuick.Templates 2.15 as T
+import QtQuick.Controls 2.15
+import QtQuick.Controls.impl 2.15
+import QtQuick.Controls.Fusion 2.15
+import QtQuick.Controls.Fusion.impl 2.15
+
+T.ComboBox {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    leftPadding: padding + (!control.mirrored || !indicator || !indicator.visible ? 0 : indicator.width + spacing)
+    rightPadding: padding + (control.mirrored || !indicator || !indicator.visible ? 0 : indicator.width + spacing)
+
+    delegate: MenuItem {
+        width: ListView.view.width
+        text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole] : model[control.textRole]) : modelData
+        font.weight: control.currentIndex === index ? Font.DemiBold : Font.Normal
+        highlighted: control.highlightedIndex === index
+        hoverEnabled: control.hoverEnabled
+    }
+
+    indicator: ColorImage {
+        x: control.mirrored ? control.padding : control.width - width - control.padding
+        y: control.topPadding + (control.availableHeight - height) / 2
+        color: control.editable ? control.palette.text : control.palette.buttonText
+        source: "qrc:/qt-project.org/imports/QtQuick/Controls.2/Fusion/images/arrow.png"
+        width: 20
+        fillMode: Image.Pad
+    }
+
+    contentItem: T.TextField {
+        topPadding: 4
+        leftPadding: 4 - control.padding
+        rightPadding: 4 - control.padding
+        bottomPadding: 4
+
+        text: control.editable ? control.editText : control.displayText
+
+        enabled: control.editable
+        autoScroll: control.editable
+        readOnly: control.down
+        inputMethodHints: control.inputMethodHints
+        validator: control.validator
+        selectByMouse: control.selectTextByMouse
+
+        font: control.font
+        color: control.editable ? control.palette.text : control.palette.buttonText
+        selectionColor: control.palette.highlight
+        selectedTextColor: control.palette.highlightedText
+        verticalAlignment: Text.AlignVCenter
+
+        background: PaddedRectangle {
+            clip: true
+            radius: 2
+            padding: 1
+            leftPadding: control.mirrored ? -2 : padding
+            rightPadding: !control.mirrored ? -2 : padding
+            color: control.palette.base
+            visible: control.editable && !control.flat
+
+            Rectangle {
+                x: parent.width - width
+                y: 1
+                width: 1
+                height: parent.height - 2
+                color: Fusion.buttonOutline(control.palette, control.activeFocus, control.enabled)
+            }
+
+            Rectangle {
+                x: 1
+                y: 1
+                width: parent.width - 3
+                height: 1
+                color: Fusion.topShadow
+            }
+        }
+
+        Rectangle {
+            x: 1 - control.leftPadding
+            y: 1
+            width: control.width - 2
+            height: control.height - 2
+            color: "transparent"
+            border.color: Color.transparent(Fusion.highlightedOutline(control.palette), 40 / 255)
+            visible: control.activeFocus
+            radius: 1.7
+        }
+    }
+
+    background: ButtonPanel {
+        implicitWidth: 120
+        implicitHeight: 24
+
+        control: control
+        visible: !control.flat || control.down
+        // ### TODO: fix control.contentItem.activeFocus
+        highlighted: control.visualFocus || control.contentItem.activeFocus
+    }
+
+    popup: T.Popup {
+        width: control.width
+        height: Math.min(contentItem.implicitHeight + 2, control.Window.height - topMargin - bottomMargin)
+        topMargin: 6
+        bottomMargin: 6
+        palette: control.palette
+        padding: 1
+
+        contentItem: ListView {
+            clip: true
+            implicitHeight: contentHeight
+            model: control.delegateModel
+            currentIndex: control.highlightedIndex
+            highlightRangeMode: ListView.ApplyRange
+            highlightMoveDuration: 0
+
+            T.ScrollBar.vertical: ScrollBar { }
+        }
+
+        background: Rectangle {
+            color: control.popup.palette.window
+            border.color: Fusion.outline(control.palette)
+
+            Rectangle {
+                z: -1
+                x: 1; y: 1
+                width: parent.width
+                height: parent.height
+                color: control.palette.shadow
+                opacity: 0.2
+            }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/DelayButton.qml b/deployment_test/QtQuick/Controls.2/Fusion/DelayButton.qml
new file mode 100644
index 0000000000000000000000000000000000000000..622de111df599798e6b083a6cf1dc9373c1c29ca
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/DelayButton.qml
@@ -0,0 +1,116 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.DelayButton {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    padding: 6
+
+    transition: Transition {
+        NumberAnimation {
+            duration: control.delay * (control.pressed ? 1.0 - control.progress : 0.3 * control.progress)
+        }
+    }
+
+    contentItem: ItemGroup {
+        ClippedText {
+            clip: control.progress > 0
+            clipX: -control.leftPadding + (control.mirrored ? 0 : control.progress * control.width)
+            clipWidth: control.width
+            visible: control.mirrored ? control.progress > 0 : control.progress < 1
+
+            text: control.text
+            font: control.font
+            color: control.mirrored ? control.palette.brightText : control.palette.buttonText
+            horizontalAlignment: Text.AlignHCenter
+            verticalAlignment: Text.AlignVCenter
+            elide: Text.ElideRight
+        }
+
+        ClippedText {
+            clip: control.progress > 0
+            clipX: -control.leftPadding
+            clipWidth: (control.mirrored ? 1.0 - control.progress : control.progress) * control.width
+            visible: control.mirrored ? control.progress < 1 : control.progress > 0
+
+            text: control.text
+            font: control.font
+            color: control.mirrored ? control.palette.buttonText : control.palette.brightText
+            horizontalAlignment: Text.AlignHCenter
+            verticalAlignment: Text.AlignVCenter
+            elide: Text.ElideRight
+        }
+    }
+
+    background: ButtonPanel {
+        implicitWidth: 80
+        implicitHeight: 24
+
+        control: control
+        highlighted: false
+        scale: control.mirrored ? -1 : 1
+
+        Rectangle {
+            width: control.progress * parent.width
+            height: parent.height
+
+            radius: 2
+            border.color: Qt.darker(Fusion.highlight(control.palette), 1.4)
+            gradient: Gradient {
+                GradientStop {
+                    position: 0
+                    color: Qt.lighter(Fusion.highlight(control.palette), 1.2)
+                }
+                GradientStop {
+                    position: 1
+                    color: Fusion.highlight(control.palette)
+                }
+            }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/Dial.qml b/deployment_test/QtQuick/Controls.2/Fusion/Dial.qml
new file mode 100644
index 0000000000000000000000000000000000000000..a133724260f43c13c8c3fda5052a4903a482fd24
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/Dial.qml
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.Dial {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding) || 100 // ### remove 100 in Qt 6
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding) || 100 // ### remove 100 in Qt 6
+
+    background: DialImpl {
+        implicitWidth: 100
+        implicitHeight: 100
+        palette: control.palette
+        highlight: control.visualFocus
+    }
+
+    handle: KnobImpl {
+        x: control.background.x + control.background.width / 2 - control.handle.width / 2
+        y: control.background.y + control.background.height / 2 - control.handle.height / 2
+        width: control.width / 7
+        height: control.height / 7
+        palette: control.palette
+        transform: [
+            Translate {
+                y: -Math.min(control.background.width, control.background.height) * 0.42 + control.handle.height
+            },
+            Rotation {
+                angle: control.angle
+                origin.x: control.handle.width / 2
+                origin.y: control.handle.height / 2
+            }
+        ]
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/Dialog.qml b/deployment_test/QtQuick/Controls.2/Fusion/Dialog.qml
new file mode 100644
index 0000000000000000000000000000000000000000..79e179d9e849ef27248b5a77f7be4565aa1a5759
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/Dialog.qml
@@ -0,0 +1,100 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.Dialog {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding,
+                            implicitHeaderWidth,
+                            implicitFooterWidth)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding
+                             + (implicitHeaderHeight > 0 ? implicitHeaderHeight + spacing : 0)
+                             + (implicitFooterHeight > 0 ? implicitFooterHeight + spacing : 0))
+
+    padding: 6
+
+    background: Rectangle {
+        color: control.palette.window
+        border.color: control.palette.mid
+        radius: 2
+
+        Rectangle {
+            z: -1
+            x: 1; y: 1
+            width: parent.width
+            height: parent.height
+            color: control.palette.shadow
+            opacity: 0.2
+            radius: 2
+        }
+    }
+
+    header: Label {
+        text: control.title
+        visible: control.title
+        elide: Label.ElideRight
+        font.bold: true
+        padding: 6
+        background: Rectangle {
+            x: 1; y: 1
+            width: parent.width - 2
+            height: parent.height - 1
+            color: control.palette.window
+            radius: 2
+        }
+    }
+
+    footer: DialogButtonBox {
+        visible: count > 0
+    }
+
+    T.Overlay.modal: Rectangle {
+        color: Fusion.topShadow
+    }
+
+    T.Overlay.modeless: Rectangle {
+        color: Fusion.topShadow
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/DialogButtonBox.qml b/deployment_test/QtQuick/Controls.2/Fusion/DialogButtonBox.qml
new file mode 100644
index 0000000000000000000000000000000000000000..a0b0f243c2031cbb99c0619edd989fcb7ab00010
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/DialogButtonBox.qml
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.DialogButtonBox {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    spacing: 6
+    padding: 6
+    alignment: Qt.AlignRight
+
+    delegate: Button { }
+
+    contentItem: ListView {
+        model: control.contentModel
+        spacing: control.spacing
+        orientation: ListView.Horizontal
+        boundsBehavior: Flickable.StopAtBounds
+        snapMode: ListView.SnapToItem
+    }
+
+    background: Rectangle {
+        implicitHeight: 32
+        x: 1; y: 1
+        width: parent.width - 2
+        height: parent.height - 2
+        color: control.palette.window
+        radius: 2
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/Drawer.qml b/deployment_test/QtQuick/Controls.2/Fusion/Drawer.qml
new file mode 100644
index 0000000000000000000000000000000000000000..5a23dde1ff7aa673d0bad4c8fc625cb115ea8a12
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/Drawer.qml
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.Drawer {
+    id: control
+
+    parent: T.Overlay.overlay
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    topPadding: control.edge === Qt.BottomEdge
+    leftPadding: control.edge === Qt.RightEdge
+    rightPadding: control.edge === Qt.LeftEdge
+    bottomPadding: control.edge === Qt.TopEdge
+
+    enter: Transition { SmoothedAnimation { velocity: 5 } }
+    exit: Transition { SmoothedAnimation { velocity: 5 } }
+
+    background: Rectangle {
+        color: control.palette.window
+        readonly property bool horizontal: control.edge === Qt.LeftEdge || control.edge === Qt.RightEdge
+        Rectangle {
+            width: parent.horizontal ? 1 : parent.width
+            height: parent.horizontal ? parent.height : 1
+            color: control.palette.mid
+            x: control.edge === Qt.LeftEdge ? parent.width - 1 : 0
+            y: control.edge === Qt.TopEdge ? parent.height - 1 : 0
+        }
+        Rectangle {
+            width: parent.horizontal ? 1 : parent.width
+            height: parent.horizontal ? parent.height : 1
+            color: control.palette.shadow
+            opacity: 0.2
+            x: control.edge === Qt.LeftEdge ? parent.width : 0
+            y: control.edge === Qt.TopEdge ? parent.height : 0
+        }
+    }
+
+    T.Overlay.modal: Rectangle {
+        color: Fusion.topShadow
+    }
+
+    T.Overlay.modeless: Rectangle {
+        color: Fusion.topShadow
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/Frame.qml b/deployment_test/QtQuick/Controls.2/Fusion/Frame.qml
new file mode 100644
index 0000000000000000000000000000000000000000..c2df635198148fc0aaaf4c02830651d9113f29eb
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/Frame.qml
@@ -0,0 +1,58 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.Frame {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    padding: 9
+
+    background: Rectangle {
+        color: "transparent"
+        border.color: Qt.lighter(Fusion.outline(control.palette), 1.08)
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/GroupBox.qml b/deployment_test/QtQuick/Controls.2/Fusion/GroupBox.qml
new file mode 100644
index 0000000000000000000000000000000000000000..3df3e1e60d511a02b54cf8c02e3a7c6a90baf603
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/GroupBox.qml
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.GroupBox {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding,
+                            implicitLabelWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    spacing: 6
+    padding: 9
+    topPadding: padding + (implicitLabelWidth > 0 ? implicitLabelHeight + spacing : 0)
+
+    label: Text {
+        x: control.leftPadding
+        width: control.availableWidth
+
+        text: control.title
+        font: control.font
+        color: control.palette.windowText
+        elide: Text.ElideRight
+        verticalAlignment: Text.AlignVCenter
+    }
+
+    background: Rectangle {
+        y: control.topPadding - control.bottomPadding
+        width: parent.width
+        height: parent.height - control.topPadding + control.bottomPadding
+
+        radius: 2
+        color: Color.transparent("black", 3 / 255)
+        border.color: Qt.lighter(Fusion.outline(control.palette), 1.08)
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/HorizontalHeaderView.qml b/deployment_test/QtQuick/Controls.2/Fusion/HorizontalHeaderView.qml
new file mode 100644
index 0000000000000000000000000000000000000000..bbd9dc3f1309f3221b47448a720e07937db3db12
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/HorizontalHeaderView.qml
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.15
+import QtQuick.Controls 2.15
+import QtQuick.Templates 2.15 as T
+
+T.HorizontalHeaderView {
+    id: control
+
+    implicitWidth: syncView ? syncView.width : 0
+    implicitHeight: contentHeight
+
+    delegate: Rectangle {
+        // Qt6: add cellPadding (and font etc) as public API in headerview
+        readonly property real cellPadding: 8
+
+        implicitWidth: text.implicitWidth + (cellPadding * 2)
+        implicitHeight: Math.max(control.height, text.implicitHeight + (cellPadding * 2))
+        border.color: "#cacaca"
+
+        gradient: Gradient {
+            GradientStop {
+                position: 0
+                color: "#fbfbfb"
+            }
+            GradientStop {
+                position: 1
+                color: "#e0dfe0"
+            }
+        }
+
+        Text {
+            id: text
+            text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole]
+                                        : model[control.textRole])
+                                   : modelData
+            width: parent.width
+            height: parent.height
+            horizontalAlignment: Text.AlignHCenter
+            verticalAlignment: Text.AlignVCenter
+            color: "#ff26282a"
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/ItemDelegate.qml b/deployment_test/QtQuick/Controls.2/Fusion/ItemDelegate.qml
new file mode 100644
index 0000000000000000000000000000000000000000..4c15ae68894b2c815bbe19f0cf43cbd6089fe860
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/ItemDelegate.qml
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.ItemDelegate {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    padding: 6
+    spacing: 6
+
+    icon.width: 16
+    icon.height: 16
+
+    contentItem: IconLabel {
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+        alignment: control.display === IconLabel.IconOnly || control.display === IconLabel.TextUnderIcon ? Qt.AlignCenter : Qt.AlignLeft
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.highlighted ? Fusion.highlightedText(control.palette) : control.palette.text
+    }
+
+    background: Rectangle {
+        implicitWidth: 100
+        implicitHeight: 20
+        color: control.down ? Fusion.buttonColor(control.palette, false, true, true)
+                            : control.highlighted ? Fusion.highlight(control.palette) : control.palette.base
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/Label.qml b/deployment_test/QtQuick/Controls.2/Fusion/Label.qml
new file mode 100644
index 0000000000000000000000000000000000000000..9821f71c988bf1b3c9a7131a9d878e956be0e014
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/Label.qml
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.Label {
+    id: control
+
+    color: control.palette.windowText
+    linkColor: control.palette.link
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/Menu.qml b/deployment_test/QtQuick/Controls.2/Fusion/Menu.qml
new file mode 100644
index 0000000000000000000000000000000000000000..8bace6b93f31e013239545119375a53a15c4c9ad
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/Menu.qml
@@ -0,0 +1,95 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+import QtQuick.Window 2.12
+
+T.Menu {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    margins: 0
+    padding: 1
+    overlap: 2
+
+    delegate: MenuItem { }
+
+    contentItem: ListView {
+        implicitHeight: contentHeight
+        model: control.contentModel
+        interactive: Window.window
+                        ? contentHeight + control.topPadding + control.bottomPadding > Window.window.height
+                        : false
+        clip: true
+        currentIndex: control.currentIndex
+
+        ScrollIndicator.vertical: ScrollIndicator {}
+    }
+
+    background: Rectangle {
+        implicitWidth: 200
+        implicitHeight: 20
+
+        color: control.palette.base
+        border.color: Fusion.outline(control.palette)
+
+        Rectangle {
+            z: -1
+            x: 1; y: 1
+            width: parent.width
+            height: parent.height
+            color: control.palette.shadow
+            opacity: 0.2
+        }
+    }
+
+    T.Overlay.modal: Rectangle {
+        color: Fusion.topShadow
+    }
+
+    T.Overlay.modeless: Rectangle {
+        color: Fusion.topShadow
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/MenuBar.qml b/deployment_test/QtQuick/Controls.2/Fusion/MenuBar.qml
new file mode 100644
index 0000000000000000000000000000000000000000..4ba71feed654fedb46887dccb513c5c29701720d
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/MenuBar.qml
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.MenuBar {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    delegate: MenuBarItem { }
+
+    contentItem: Row {
+        spacing: control.spacing
+        Repeater {
+            model: control.contentModel
+        }
+    }
+
+    background: Rectangle {
+        implicitHeight: 20
+
+        color: control.palette.window
+
+        Rectangle {
+            y: parent.height - height
+            width: parent.width
+            height: 1
+            color: Fusion.mergedColors(Qt.darker(control.palette.window, 1.2),
+                                       Qt.lighter(Fusion.outline(control.palette), 1.4), 60)
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/MenuBarItem.qml b/deployment_test/QtQuick/Controls.2/Fusion/MenuBarItem.qml
new file mode 100644
index 0000000000000000000000000000000000000000..9fa685dcc0d8a4860a09b9cc49844ee614d34846
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/MenuBarItem.qml
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.MenuBarItem {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    padding: 6
+    spacing: 6
+
+    icon.width: 16
+    icon.height: 16
+
+    contentItem: IconLabel {
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+        alignment: Qt.AlignLeft
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.down || control.highlighted ? Fusion.highlightedText(control.palette) : control.palette.text
+    }
+
+    background: Rectangle {
+        implicitWidth: 20
+        implicitHeight: 20
+
+        color: Fusion.highlight(control.palette)
+        visible: control.down || control.highlighted
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/MenuItem.qml b/deployment_test/QtQuick/Controls.2/Fusion/MenuItem.qml
new file mode 100644
index 0000000000000000000000000000000000000000..a428fbc8d27e61785e63723ed0f26bcc5b7fcf02
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/MenuItem.qml
@@ -0,0 +1,103 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.MenuItem {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    padding: 6
+    spacing: 6
+
+    icon.width: 16
+    icon.height: 16
+
+    contentItem: IconLabel {
+        readonly property real arrowPadding: control.subMenu && control.arrow ? control.arrow.width + control.spacing : 0
+        readonly property real indicatorPadding: control.checkable && control.indicator ? control.indicator.width + control.spacing : 0
+        leftPadding: !control.mirrored ? indicatorPadding : arrowPadding
+        rightPadding: control.mirrored ? indicatorPadding : arrowPadding
+
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+        alignment: Qt.AlignLeft
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.down || control.highlighted ? Fusion.highlightedText(control.palette) : control.palette.text
+    }
+
+    arrow: ColorImage {
+        x: control.mirrored ? control.padding : control.width - width - control.padding
+        y: control.topPadding + (control.availableHeight - height) / 2
+        width: 20
+
+        visible: control.subMenu
+        rotation: control.mirrored ? 90 : -90
+        color: control.down || control.hovered || control.highlighted ? Fusion.highlightedText(control.palette) : control.palette.text
+        source: "qrc:/qt-project.org/imports/QtQuick/Controls.2/Fusion/images/arrow.png"
+        fillMode: Image.Pad
+    }
+
+    indicator: CheckIndicator {
+        x: control.mirrored ? control.width - width - control.rightPadding : control.leftPadding
+        y: control.topPadding + (control.availableHeight - height) / 2
+
+        control: control
+        visible: control.checkable
+    }
+
+    background: Rectangle {
+        implicitWidth: 200
+        implicitHeight: 20
+
+        color: Fusion.highlight(control.palette)
+        visible: control.down || control.highlighted
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/MenuSeparator.qml b/deployment_test/QtQuick/Controls.2/Fusion/MenuSeparator.qml
new file mode 100644
index 0000000000000000000000000000000000000000..522ada150e32bea86dbf3e7745eede1a40539fb6
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/MenuSeparator.qml
@@ -0,0 +1,60 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.MenuSeparator {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    padding: 5
+    verticalPadding: 1
+
+    contentItem: Rectangle {
+        implicitWidth: 188
+        implicitHeight: 1
+        color: Qt.lighter(Fusion.darkShade, 1.06)
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/Page.qml b/deployment_test/QtQuick/Controls.2/Fusion/Page.qml
new file mode 100644
index 0000000000000000000000000000000000000000..ce4b1d54c8348953ca244a5a3e9010e64ae9701c
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/Page.qml
@@ -0,0 +1,59 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.Page {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding,
+                            implicitHeaderWidth,
+                            implicitFooterWidth)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding
+                             + (implicitHeaderHeight > 0 ? implicitHeaderHeight + spacing : 0)
+                             + (implicitFooterHeight > 0 ? implicitFooterHeight + spacing : 0))
+
+    background: Rectangle {
+        color: control.palette.window
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/PageIndicator.qml b/deployment_test/QtQuick/Controls.2/Fusion/PageIndicator.qml
new file mode 100644
index 0000000000000000000000000000000000000000..5679b14f29b6e3ef3a052eab5d77d043115981f8
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/PageIndicator.qml
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.PageIndicator {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    padding: 4
+    spacing: 4
+
+    delegate: Rectangle {
+        implicitWidth: 6
+        implicitHeight: 6
+
+        radius: width / 2
+        color: control.palette.shadow
+
+        opacity: index === currentIndex ? 0.95 : pressed ? 0.75 : 0.45
+        Behavior on opacity { OpacityAnimator { duration: 100 } }
+    }
+
+    contentItem: Row {
+        spacing: control.spacing
+
+        Repeater {
+            model: control.count
+            delegate: control.delegate
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/Pane.qml b/deployment_test/QtQuick/Controls.2/Fusion/Pane.qml
new file mode 100644
index 0000000000000000000000000000000000000000..28be3b47f3c92bfe039c252a0f0920c375841e05
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/Pane.qml
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.Pane {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    padding: 9
+
+    background: Rectangle {
+        color: control.palette.window
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/Popup.qml b/deployment_test/QtQuick/Controls.2/Fusion/Popup.qml
new file mode 100644
index 0000000000000000000000000000000000000000..25a8c5ae0758fe06cd8030b2337f9e3f5ea6528d
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/Popup.qml
@@ -0,0 +1,67 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.Popup {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    padding: 6
+
+    background: Rectangle {
+        color: control.palette.window
+        border.color: control.palette.mid
+        radius: 2
+    }
+
+    T.Overlay.modal: Rectangle {
+        color: Fusion.topShadow
+    }
+
+    T.Overlay.modeless: Rectangle {
+        color: Fusion.topShadow
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/ProgressBar.qml b/deployment_test/QtQuick/Controls.2/Fusion/ProgressBar.qml
new file mode 100644
index 0000000000000000000000000000000000000000..5deade587d46048ce107f473acb4244ceafb46c8
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/ProgressBar.qml
@@ -0,0 +1,117 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.ProgressBar {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    contentItem: Item {
+        implicitWidth: 120
+        implicitHeight: 24
+        scale: control.mirrored ? -1 : 1
+
+        Rectangle {
+            height: parent.height
+            width: (control.indeterminate ? 1.0 : control.position) * parent.width
+
+            radius: 2
+            border.color: Qt.darker(Fusion.highlight(control.palette), 1.4)
+            gradient: Gradient {
+                GradientStop {
+                    position: 0
+                    color: Qt.lighter(Fusion.highlight(control.palette), 1.2)
+                }
+                GradientStop {
+                    position: 1
+                    color: Fusion.highlight(control.palette)
+                }
+            }
+        }
+
+        Item {
+            x: 1; y: 1
+            width: parent.width - 2
+            height: parent.height - 2
+            visible: control.indeterminate
+            clip: true
+
+            ColorImage {
+                width: Math.ceil(parent.width / implicitWidth + 1) * implicitWidth
+                height: parent.height
+
+                mirror: control.mirrored
+                fillMode: Image.TileHorizontally
+                source: "qrc:/qt-project.org/imports/QtQuick/Controls.2/Fusion/images/progressmask.png"
+                color: Color.transparent(Qt.lighter(Fusion.highlight(control.palette), 1.2), 160 / 255)
+
+                visible: control.indeterminate
+                NumberAnimation on x {
+                    running: control.indeterminate && control.visible
+                    from: -31 // progressmask.png width
+                    to: 0
+                    loops: Animation.Infinite
+                    duration: 750
+                }
+            }
+        }
+    }
+
+    background: Rectangle {
+        implicitWidth: 120
+        implicitHeight: 24
+
+        radius: 2
+        color: control.palette.base
+        border.color: Fusion.outline(control.palette)
+
+        Rectangle {
+            x: 1; y: 1; height: 1
+            width: parent.width - 2
+            color: Fusion.topShadow
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/RadioButton.qml b/deployment_test/QtQuick/Controls.2/Fusion/RadioButton.qml
new file mode 100644
index 0000000000000000000000000000000000000000..a940aff3ccd4856c11606f4ca4cc8a24f2d9969b
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/RadioButton.qml
@@ -0,0 +1,72 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.RadioButton {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    padding: 6
+    spacing: 6
+
+    indicator: RadioIndicator {
+        x: control.text ? (control.mirrored ? control.width - width - control.rightPadding : control.leftPadding) : control.leftPadding + (control.availableWidth - width) / 2
+        y: control.topPadding + (control.availableHeight - height) / 2
+        control: control
+    }
+
+    contentItem: Text {
+        leftPadding: control.indicator && !control.mirrored ? control.indicator.width + control.spacing : 0
+        rightPadding: control.indicator && control.mirrored ? control.indicator.width + control.spacing : 0
+
+        text: control.text
+        font: control.font
+        color: control.palette.windowText
+        elide: Text.ElideRight
+        verticalAlignment: Text.AlignVCenter
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/RadioDelegate.qml b/deployment_test/QtQuick/Controls.2/Fusion/RadioDelegate.qml
new file mode 100644
index 0000000000000000000000000000000000000000..e8555a17e163d04733e450bb8eb2ac2d447def3f
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/RadioDelegate.qml
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.RadioDelegate {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    padding: 6
+    spacing: 6
+
+    icon.width: 16
+    icon.height: 16
+
+    contentItem: IconLabel {
+        leftPadding: control.mirrored ? control.indicator.width + control.spacing : 0
+        rightPadding: !control.mirrored ? control.indicator.width + control.spacing : 0
+
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+        alignment: control.display === IconLabel.IconOnly || control.display === IconLabel.TextUnderIcon ? Qt.AlignCenter : Qt.AlignLeft
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.highlighted ? Fusion.highlightedText(control.palette) : control.palette.text
+    }
+
+    indicator: RadioIndicator {
+        x: control.mirrored ? control.leftPadding : control.width - width - control.rightPadding
+        y: control.topPadding + (control.availableHeight - height) / 2
+
+        control: control
+    }
+
+    background: Rectangle {
+        implicitWidth: 100
+        implicitHeight: 20
+        color: control.down ? Fusion.buttonColor(control.palette, false, true, true)
+                            : control.highlighted ? Fusion.highlight(control.palette) : control.palette.base
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/RadioIndicator.qml b/deployment_test/QtQuick/Controls.2/Fusion/RadioIndicator.qml
new file mode 100644
index 0000000000000000000000000000000000000000..c73cd49f477c6cbf2828f8be85e9fdf44659ca8d
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/RadioIndicator.qml
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+Rectangle {
+    id: indicator
+
+    property Item control
+    readonly property color pressedColor: Fusion.mergedColors(control.palette.base, control.palette.windowText, 85)
+    readonly property color checkMarkColor: Qt.darker(control.palette.text, 1.2)
+
+    implicitWidth: 14
+    implicitHeight: 14
+
+    radius: width / 2
+    color: control.down ? indicator.pressedColor : control.palette.base
+    border.color: control.visualFocus ? Fusion.highlightedOutline(control.palette)
+                                      : Qt.darker(control.palette.window, 1.5)
+
+    Rectangle {
+        y: 1
+        width: parent.width
+        height: parent.height - 1
+        radius: width / 2
+        color: "transparent"
+        border.color: Fusion.topShadow
+        visible: indicator.control.enabled && !indicator.control.down
+    }
+
+    Rectangle {
+        x: (parent.width - width) / 2
+        y: (parent.height - height) / 2
+        width: parent.width / 2.32
+        height: parent.height / 2.32
+        radius: width / 2
+        color: Color.transparent(indicator.checkMarkColor, 180 / 255)
+        border.color: Color.transparent(indicator.checkMarkColor, 200 / 255)
+        visible: indicator.control.checked
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/RangeSlider.qml b/deployment_test/QtQuick/Controls.2/Fusion/RangeSlider.qml
new file mode 100644
index 0000000000000000000000000000000000000000..7edbed57637837854d8d53d67a86941358b1e036
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/RangeSlider.qml
@@ -0,0 +1,82 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.RangeSlider {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            Math.max(first.implicitHandleWidth,
+                                     second.implicitHandleWidth) + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             Math.max(first.implicitHandleHeight,
+                                      second.implicitHandleHeight) + topPadding + bottomPadding)
+
+    first.handle: SliderHandle {
+        x: control.leftPadding + Math.round(control.horizontal ? control.first.visualPosition * (control.availableWidth - width) : (control.availableWidth - width) / 2)
+        y: control.topPadding + Math.round(control.horizontal ? (control.availableHeight - height) / 2 : control.first.visualPosition * (control.availableHeight - height))
+
+        palette: control.palette
+        pressed: control.first.pressed
+        hovered: control.first.hovered
+        vertical: control.vertical
+        visualFocus: activeFocus
+    }
+
+    second.handle: SliderHandle {
+        x: control.leftPadding + Math.round(control.horizontal ? control.second.visualPosition * (control.availableWidth - width) : (control.availableWidth - width) / 2)
+        y: control.topPadding + Math.round(control.horizontal ? (control.availableHeight - height) / 2 : control.second.visualPosition * (control.availableHeight - height))
+
+        palette: control.palette
+        pressed: control.second.pressed
+        hovered: control.second.hovered
+        vertical: control.vertical
+        visualFocus: activeFocus
+    }
+
+    background: SliderGroove {
+        control: control
+        offset: control.first.position
+        progress: control.second.position
+        visualProgress: control.second.visualPosition
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/RoundButton.qml b/deployment_test/QtQuick/Controls.2/Fusion/RoundButton.qml
new file mode 100644
index 0000000000000000000000000000000000000000..59bf4c16d2dd6a0fd35671c71f5e46ccadd013be
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/RoundButton.qml
@@ -0,0 +1,99 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.RoundButton {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    padding: 6
+    spacing: 6
+
+    icon.width: 16
+    icon.height: 16
+
+    contentItem: IconLabel {
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.palette.buttonText
+    }
+
+    background: Rectangle {
+        implicitWidth: 32
+        implicitHeight: 32
+        visible: !control.flat || control.down || control.checked
+
+        gradient: Gradient {
+            GradientStop {
+                position: 0
+                color: control.down || control.checked ? Fusion.buttonColor(control.palette, control.highlighted, control.down || control.checked, control.hovered)
+                                                       : Fusion.gradientStart(Fusion.buttonColor(control.palette, control.highlighted, control.down, control.hovered))
+            }
+            GradientStop {
+                position: 1
+                color: control.down || control.checked ? Fusion.buttonColor(control.palette, control.highlighted, control.down || control.checked, control.hovered)
+                                                       : Fusion.gradientStop(Fusion.buttonColor(control.palette, control.highlighted, control.down, control.hovered))
+            }
+        }
+
+        radius: control.radius
+        border.color: Fusion.buttonOutline(control.palette, control.highlighted || control.visualFocus, control.enabled)
+
+        Rectangle {
+            x: 1; y: 1
+            width: parent.width - 2
+            height: parent.height - 2
+            border.color: Fusion.innerContrastLine
+            color: "transparent"
+            radius: control.radius
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/ScrollBar.qml b/deployment_test/QtQuick/Controls.2/Fusion/ScrollBar.qml
new file mode 100644
index 0000000000000000000000000000000000000000..93b58f0e34e0878d6dfa51659a0188323bbd110d
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/ScrollBar.qml
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.ScrollBar {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    padding: 2
+    visible: control.policy !== T.ScrollBar.AlwaysOff
+    minimumSize: orientation == Qt.Horizontal ? height / width : width / height
+
+    contentItem: Rectangle {
+        implicitWidth: control.interactive ? 6 : 2
+        implicitHeight: control.interactive ? 6 : 2
+
+        radius: width / 2
+        color: control.pressed ? control.palette.dark : control.palette.mid
+        opacity: 0.0
+
+        states: State {
+            name: "active"
+            when: control.policy === T.ScrollBar.AlwaysOn || (control.active && control.size < 1.0)
+            PropertyChanges { target: control.contentItem; opacity: 0.75 }
+        }
+
+        transitions: Transition {
+            from: "active"
+            SequentialAnimation {
+                PauseAnimation { duration: 450 }
+                NumberAnimation { target: control.contentItem; duration: 200; property: "opacity"; to: 0.0 }
+            }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/ScrollIndicator.qml b/deployment_test/QtQuick/Controls.2/Fusion/ScrollIndicator.qml
new file mode 100644
index 0000000000000000000000000000000000000000..efe0b2fa815f34bbb2a1ee4bf808f2f1b88c0db6
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/ScrollIndicator.qml
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.ScrollIndicator {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    padding: 2
+
+    contentItem: Rectangle {
+        implicitWidth: 2
+        implicitHeight: 2
+
+        color: control.palette.mid
+        visible: control.size < 1.0
+        opacity: 0.0
+
+        states: State {
+            name: "active"
+            when: control.active
+            PropertyChanges { target: control.contentItem; opacity: 0.75 }
+        }
+
+        transitions: [
+            Transition {
+                from: "active"
+                SequentialAnimation {
+                    PauseAnimation { duration: 450 }
+                    NumberAnimation { target: control.contentItem; duration: 200; property: "opacity"; to: 0.0 }
+                }
+            }
+        ]
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/Slider.qml b/deployment_test/QtQuick/Controls.2/Fusion/Slider.qml
new file mode 100644
index 0000000000000000000000000000000000000000..d212a233b016bb202103fcdf94997a85861ab9ec
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/Slider.qml
@@ -0,0 +1,68 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.Slider {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitHandleWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitHandleHeight + topPadding + bottomPadding)
+
+    handle: SliderHandle {
+        x: control.leftPadding + Math.round(control.horizontal ? control.visualPosition * (control.availableWidth - width) : (control.availableWidth - width) / 2)
+        y: control.topPadding + Math.round(control.horizontal ? (control.availableHeight - height) / 2 : control.visualPosition * (control.availableHeight - height))
+
+        palette: control.palette
+        pressed: control.pressed
+        hovered: control.hovered
+        vertical: control.vertical
+        visualFocus: control.visualFocus
+    }
+
+    background: SliderGroove {
+        control: control
+        progress: control.position
+        visualProgress: control.visualPosition
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/SliderGroove.qml b/deployment_test/QtQuick/Controls.2/Fusion/SliderGroove.qml
new file mode 100644
index 0000000000000000000000000000000000000000..381a02b5983dd9bc8b748685076870bb01bf39ee
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/SliderGroove.qml
@@ -0,0 +1,94 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+Rectangle {
+    id: groove
+
+    property Item control
+    property real offset
+    property real progress
+    property real visualProgress
+
+    x: control.horizontal ? 0 : (control.availableWidth - width) / 2
+    y: control.horizontal ? (control.availableHeight - height) / 2 : 0
+
+    implicitWidth: control.horizontal ? 160 : 5
+    implicitHeight: control.horizontal ? 5 : 160
+    width: control.horizontal ? control.availableWidth : implicitWidth
+    height: control.horizontal ? implicitHeight : control.availableHeight
+
+    radius: 2
+    border.color: Fusion.outline(control.palette)
+    scale: control.horizontal && control.mirrored ? -1 : 1
+
+    gradient: Gradient {
+        GradientStop {
+            position: 0
+            color: Qt.darker(Fusion.grooveColor(groove.control.palette), 1.1)
+        }
+        GradientStop {
+            position: 1
+            color: Qt.lighter(Fusion.grooveColor(groove.control.palette), 1.1)
+        }
+    }
+
+    Rectangle {
+        x: groove.control.horizontal ? groove.offset * parent.width : 0
+        y: groove.control.horizontal ? 0 : groove.visualProgress * parent.height
+        width: groove.control.horizontal ? groove.progress * parent.width - groove.offset * parent.width : 5
+        height: groove.control.horizontal ? 5 : groove.progress * parent.height - groove.offset * parent.height
+
+        radius: 2
+        border.color: Qt.darker(Fusion.highlightedOutline(groove.control.palette), 1.1)
+
+        gradient: Gradient {
+            GradientStop {
+                position: 0
+                color: Fusion.highlight(groove.control.palette)
+            }
+            GradientStop {
+                position: 1
+                color: Qt.lighter(Fusion.highlight(groove.control.palette), 1.2)
+            }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/SliderHandle.qml b/deployment_test/QtQuick/Controls.2/Fusion/SliderHandle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..c53af57e6a5f0ce08662a13f95067ef0c78b600f
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/SliderHandle.qml
@@ -0,0 +1,86 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+Rectangle {
+    id: handle
+
+    property var palette
+    property bool pressed
+    property bool hovered
+    property bool vertical
+    property bool visualFocus
+
+    implicitWidth: 13
+    implicitHeight: 13
+
+    gradient: Gradient {
+        GradientStop {
+            position: 0
+            color: Fusion.gradientStart(Fusion.buttonColor(handle.palette, handle.visualFocus, handle.pressed, handle.hovered))
+        }
+        GradientStop {
+            position: 1
+            color: Fusion.gradientStop(Fusion.buttonColor(handle.palette, handle.visualFocus, handle.pressed, handle.hovered))
+        }
+    }
+    rotation: handle.vertical ? -90 : 0
+    border.width: 1
+    border.color: "transparent"
+    radius: 2
+
+    Rectangle {
+        width: parent.width
+        height: parent.height
+        border.color: handle.visualFocus ? Fusion.highlightedOutline(handle.palette) : Fusion.outline(handle.palette)
+        color: "transparent"
+        radius: 2
+
+        Rectangle {
+            x: 1; y: 1
+            width: parent.width - 2
+            height: parent.height - 2
+            border.color: Fusion.innerContrastLine
+            color: "transparent"
+            radius: 2
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/SpinBox.qml b/deployment_test/QtQuick/Controls.2/Fusion/SpinBox.qml
new file mode 100644
index 0000000000000000000000000000000000000000..41754f63fc985c3548bf8e3e00cd5dea919cc814
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/SpinBox.qml
@@ -0,0 +1,182 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.SpinBox {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentItem.implicitWidth + 2 * padding +
+                            Math.max(up.implicitIndicatorWidth,
+                                     down.implicitIndicatorWidth))
+    implicitHeight: Math.max(implicitContentHeight + topPadding + bottomPadding,
+                             implicitBackgroundHeight,
+                             up.implicitIndicatorHeight +
+                             down.implicitIndicatorHeight)
+
+    padding: 4
+    leftPadding: padding + (control.mirrored ? (up.indicator ? up.indicator.width : 0) : (down.indicator ? down.indicator.width : 0))
+    rightPadding: padding + (control.mirrored ? (down.indicator ? down.indicator.width : 0) : (up.indicator ? up.indicator.width : 0))
+
+    validator: IntValidator {
+        locale: control.locale.name
+        bottom: Math.min(control.from, control.to)
+        top: Math.max(control.from, control.to)
+    }
+
+    contentItem: TextInput {
+        z: 2
+        text: control.displayText
+
+        font: control.font
+        color: control.palette.text
+        selectionColor: control.palette.highlight
+        selectedTextColor: control.palette.highlightedText
+        horizontalAlignment: Qt.AlignHCenter
+        verticalAlignment: Qt.AlignVCenter
+
+        readOnly: !control.editable
+        validator: control.validator
+        inputMethodHints: control.inputMethodHints
+    }
+
+    up.indicator: PaddedRectangle {
+        x: control.mirrored ? 1 : parent.width - width - 1
+        y: 1
+        height: parent.height / 2 - 1
+        implicitWidth: 16
+        implicitHeight: 10
+
+        radius: 1.7
+        clip: true
+        topPadding: -2
+        leftPadding: -2
+        color: control.up.pressed ? Fusion.buttonColor(control.palette, false, true, true) : "transparent"
+
+        ColorImage {
+            scale: -1
+            width: parent.width
+            height: parent.height
+            opacity: enabled ? 1.0 : 0.5
+            color: control.palette.buttonText
+            source: "qrc:/qt-project.org/imports/QtQuick/Controls.2/Fusion/images/arrow.png"
+            fillMode: Image.Pad
+        }
+    }
+
+    down.indicator: PaddedRectangle {
+        x: control.mirrored ? 1 : parent.width - width - 1
+        y: parent.height - height - 1
+        height: parent.height / 2 - 1
+        implicitWidth: 16
+        implicitHeight: 10
+
+        radius: 1.7
+        clip: true
+        topPadding: -2
+        leftPadding: -2
+        color: control.down.pressed ? Fusion.buttonColor(control.palette, false, true, true) : "transparent"
+
+        ColorImage {
+            width: parent.width
+            height: parent.height
+            opacity: enabled ? 1.0 : 0.5
+            color: control.palette.buttonText
+            source: "qrc:/qt-project.org/imports/QtQuick/Controls.2/Fusion/images/arrow.png"
+            fillMode: Image.Pad
+        }
+    }
+
+    background: Rectangle {
+        implicitWidth: 120
+        implicitHeight: 24
+
+        radius: 2
+        color: control.palette.base
+        border.color: control.activeFocus ? Fusion.highlightedOutline(control.palette) : Fusion.outline(control.palette)
+
+        Rectangle {
+            x: 2
+            y: 1
+            width: parent.width - 4
+            height: 1
+            color: Fusion.topShadow
+        }
+
+        Rectangle {
+            x: control.mirrored ? 1 : parent.width - width - 1
+            y: 1
+            width: Math.max(control.up.indicator ? control.up.indicator.width : 0,
+                            control.down.indicator ? control.down.indicator.width : 0) + 1
+            height: parent.height - 2
+
+            radius: 2
+            gradient: Gradient {
+                GradientStop {
+                    position: 0
+                    color: Fusion.gradientStart(Fusion.buttonColor(control.palette, control.visualFocus, false, control.up.hovered || control.down.hovered))
+                }
+                GradientStop {
+                    position: 1
+                    color: Fusion.gradientStop(Fusion.buttonColor(control.palette, control.visualFocus, false, control.up.hovered || control.down.hovered))
+                }
+            }
+
+            Rectangle {
+                x: control.mirrored ? parent.width - 1 : 0
+                height: parent.height
+                width: 1
+                color: Fusion.outline(control.palette)
+            }
+        }
+
+        Rectangle {
+            x: 1; y: 1
+            width: parent.width - 2
+            height: parent.height - 2
+            color: "transparent"
+            border.color: Color.transparent(Fusion.highlightedOutline(control.palette), 40 / 255)
+            visible: control.activeFocus
+            radius: 1.7
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/SplitView.qml b/deployment_test/QtQuick/Controls.2/Fusion/SplitView.qml
new file mode 100644
index 0000000000000000000000000000000000000000..6a04b4da133d2c68da8f9a59967a77fae6b25850
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/SplitView.qml
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.13
+import QtQuick.Templates 2.13 as T
+import QtQuick.Controls 2.13
+import QtQuick.Controls.impl 2.13
+import QtQuick.Controls.Fusion 2.13
+
+T.SplitView {
+    id: control
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    handle: Rectangle {
+        implicitWidth: control.orientation === Qt.Horizontal ? 2 : control.width
+        implicitHeight: control.orientation === Qt.Horizontal ? control.height : 2
+        color: T.SplitHandle.pressed ? palette.dark
+            : (T.SplitHandle.hovered ? control.palette.midlight : control.palette.mid)
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/SwipeDelegate.qml b/deployment_test/QtQuick/Controls.2/Fusion/SwipeDelegate.qml
new file mode 100644
index 0000000000000000000000000000000000000000..48c531ea4434aa42b5e209282a45e4e19876b426
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/SwipeDelegate.qml
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.SwipeDelegate {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    padding: 6
+    spacing: 6
+
+    icon.width: 16
+    icon.height: 16
+
+    swipe.transition: Transition { SmoothedAnimation { velocity: 3; easing.type: Easing.InOutCubic } }
+
+    contentItem: IconLabel {
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+        alignment: control.display === IconLabel.IconOnly || control.display === IconLabel.TextUnderIcon ? Qt.AlignCenter : Qt.AlignLeft
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.highlighted ? Fusion.highlightedText(control.palette) : control.palette.text
+    }
+
+    background: Rectangle {
+        implicitWidth: 100
+        implicitHeight: 20
+        color: control.down ? Fusion.buttonColor(control.palette, false, true, true)
+                            : control.highlighted ? Fusion.highlight(control.palette) : control.palette.base
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/Switch.qml b/deployment_test/QtQuick/Controls.2/Fusion/Switch.qml
new file mode 100644
index 0000000000000000000000000000000000000000..bf18003a8df0c5d84c9b3d5edcc9c7a59957e3de
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/Switch.qml
@@ -0,0 +1,72 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.Switch {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    padding: 6
+    spacing: 6
+
+    indicator: SwitchIndicator {
+        x: control.text ? (control.mirrored ? control.width - width - control.rightPadding : control.leftPadding) : control.leftPadding + (control.availableWidth - width) / 2
+        y: control.topPadding + (control.availableHeight - height) / 2
+        control: control
+    }
+
+    contentItem: Text {
+        leftPadding: control.indicator && !control.mirrored ? control.indicator.width + control.spacing : 0
+        rightPadding: control.indicator && control.mirrored ? control.indicator.width + control.spacing : 0
+
+        text: control.text
+        font: control.font
+        color: control.palette.text
+        elide: Text.ElideRight
+        verticalAlignment: Text.AlignVCenter
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/SwitchDelegate.qml b/deployment_test/QtQuick/Controls.2/Fusion/SwitchDelegate.qml
new file mode 100644
index 0000000000000000000000000000000000000000..67c419244e8c7e3f5404e7ff12a9a82d4109cdef
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/SwitchDelegate.qml
@@ -0,0 +1,86 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.SwitchDelegate {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    padding: 6
+    spacing: 6
+
+    icon.width: 16
+    icon.height: 16
+
+    indicator: SwitchIndicator {
+        x: control.text ? (control.mirrored ? control.leftPadding : control.width - width - control.rightPadding) : control.leftPadding + (control.availableWidth - width) / 2
+        y: control.topPadding + (control.availableHeight - height) / 2
+        control: control
+    }
+
+    contentItem: IconLabel {
+        leftPadding: control.mirrored ? control.indicator.width + control.spacing : 0
+        rightPadding: !control.mirrored ? control.indicator.width + control.spacing : 0
+
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+        alignment: control.display === IconLabel.IconOnly || control.display === IconLabel.TextUnderIcon ? Qt.AlignCenter : Qt.AlignLeft
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.highlighted ? Fusion.highlightedText(control.palette) : control.palette.text
+    }
+
+    background: Rectangle {
+        implicitWidth: 100
+        implicitHeight: 20
+        color: control.down ? Fusion.buttonColor(control.palette, false, true, true)
+                            : control.highlighted ? Fusion.highlight(control.palette) : control.palette.base
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/SwitchIndicator.qml b/deployment_test/QtQuick/Controls.2/Fusion/SwitchIndicator.qml
new file mode 100644
index 0000000000000000000000000000000000000000..ae7c89a088d37ba17f0a8538279fd239296664f1
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/SwitchIndicator.qml
@@ -0,0 +1,137 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+Rectangle {
+    id: indicator
+
+    property Item control
+    readonly property color pressedColor: Fusion.mergedColors(control.palette.base, control.palette.windowText, 85)
+    readonly property color checkMarkColor: Qt.darker(control.palette.text, 1.2)
+
+    implicitWidth: 40
+    implicitHeight: 16
+
+    radius: 2
+    border.color: Fusion.outline(control.palette)
+
+    gradient: Gradient {
+        GradientStop {
+            position: 0
+            color: Qt.darker(Fusion.grooveColor(indicator.control.palette), 1.1)
+        }
+        GradientStop {
+            position: 1
+            color: Qt.lighter(Fusion.grooveColor(indicator.control.palette), 1.1)
+        }
+    }
+
+    Rectangle {
+        x: indicator.control.mirrored ? handle.x : 0
+        width: indicator.control.mirrored ? parent.width - handle.x : handle.x + handle.width
+        height: parent.height
+
+        opacity: indicator.control.checked ? 1 : 0
+        Behavior on opacity {
+            enabled: !indicator.control.down
+            NumberAnimation { duration: 80 }
+        }
+
+        radius: 2
+        border.color: Qt.darker(Fusion.highlightedOutline(indicator.control.palette), 1.1)
+        border.width: indicator.control.enabled ? 1 : 0
+
+        gradient: Gradient {
+            GradientStop {
+                position: 0
+                color: Fusion.highlight(indicator.control.palette)
+            }
+            GradientStop {
+                position: 1
+                color: Qt.lighter(Fusion.highlight(indicator.control.palette), 1.2)
+            }
+        }
+    }
+
+    Rectangle {
+        id: handle
+        x: Math.max(0, Math.min(parent.width - width, indicator.control.visualPosition * parent.width - (width / 2)))
+        y: (parent.height - height) / 2
+        width: 20
+        height: 16
+        radius: 2
+
+        gradient: Gradient {
+            GradientStop {
+                position: 0
+                color: Fusion.gradientStart(Fusion.buttonColor(indicator.control.palette, indicator.control.visualFocus, indicator.control.pressed, indicator.control.hovered))
+            }
+            GradientStop {
+                position: 1
+                color: Fusion.gradientStop(Fusion.buttonColor(indicator.control.palette, indicator.control.visualFocus, indicator.control.pressed, indicator.control.hovered))
+            }
+        }
+        border.width: 1
+        border.color: "transparent"
+
+        Rectangle {
+            width: parent.width
+            height: parent.height
+            border.color: indicator.control.visualFocus ? Fusion.highlightedOutline(indicator.control.palette) : Fusion.outline(indicator.control.palette)
+            color: "transparent"
+            radius: 2
+
+            Rectangle {
+                x: 1; y: 1
+                width: parent.width - 2
+                height: parent.height - 2
+                border.color: Fusion.innerContrastLine
+                color: "transparent"
+                radius: 2
+            }
+        }
+
+        Behavior on x {
+            enabled: !indicator.control.down
+            SmoothedAnimation { velocity: 200 }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/TabBar.qml b/deployment_test/QtQuick/Controls.2/Fusion/TabBar.qml
new file mode 100644
index 0000000000000000000000000000000000000000..233a2acdfcad62310530427a54aada8dd1ce5b6f
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/TabBar.qml
@@ -0,0 +1,80 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.TabBar {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    spacing: -1
+
+    contentItem: ListView {
+        model: control.contentModel
+        currentIndex: control.currentIndex
+
+        spacing: control.spacing
+        orientation: ListView.Horizontal
+        boundsBehavior: Flickable.StopAtBounds
+        flickableDirection: Flickable.AutoFlickIfNeeded
+        snapMode: ListView.SnapToItem
+
+        highlightMoveDuration: 0
+        highlightRangeMode: ListView.ApplyRange
+        preferredHighlightBegin: 40
+        preferredHighlightEnd: width - 40
+    }
+
+    background: Item {
+        implicitHeight: 21
+
+        Rectangle {
+            width: parent.width
+            height: 1
+            y: control.position === T.TabBar.Header ? parent.height - 1 : 0
+            color: Fusion.outline(control.palette)
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/TabButton.qml b/deployment_test/QtQuick/Controls.2/Fusion/TabButton.qml
new file mode 100644
index 0000000000000000000000000000000000000000..136503b6b32151e4c3dd050f12e0dac3b2961538
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/TabButton.qml
@@ -0,0 +1,97 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.TabButton {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    padding: 2
+    horizontalPadding: 4
+    spacing: 6
+
+    icon.width: 16
+    icon.height: 16
+
+    z: checked
+
+    contentItem: IconLabel {
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.palette.buttonText
+    }
+
+    background: Rectangle {
+        y: control.checked || control.TabBar.position !== T.TabBar.Header ? 0 : 2
+        implicitHeight: 21
+        height: control.height - (control.checked ? 0 : 2)
+
+        border.color: Qt.lighter(Fusion.outline(control.palette), 1.1)
+
+        gradient: Gradient {
+            GradientStop {
+                position: 0
+                color: control.checked ? Qt.lighter(Fusion.tabFrameColor(control.palette), 1.04)
+                                       : Qt.darker(Fusion.tabFrameColor(control.palette), 1.08)
+            }
+            GradientStop {
+                position: control.checked ? 0 : 0.85
+                color: control.checked ? Qt.lighter(Fusion.tabFrameColor(control.palette), 1.04)
+                                       : Qt.darker(Fusion.tabFrameColor(control.palette), 1.08)
+            }
+            GradientStop {
+                position: 1
+                color: control.checked ? Fusion.tabFrameColor(control.palette)
+                                       : Qt.darker(Fusion.tabFrameColor(control.palette), 1.16)
+            }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/TextArea.qml b/deployment_test/QtQuick/Controls.2/Fusion/TextArea.qml
new file mode 100644
index 0000000000000000000000000000000000000000..c7107ac444061690848e207343568f8731278bb6
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/TextArea.qml
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.TextArea {
+    id: control
+
+    implicitWidth: Math.max(contentWidth + leftPadding + rightPadding,
+                            implicitBackgroundWidth + leftInset + rightInset,
+                            placeholder.implicitWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(contentHeight + topPadding + bottomPadding,
+                             implicitBackgroundHeight + topInset + bottomInset,
+                             placeholder.implicitHeight + topPadding + bottomPadding)
+
+    padding: 6
+    leftPadding: padding + 4
+
+    color: control.palette.text
+    selectionColor: control.palette.highlight
+    selectedTextColor: control.palette.highlightedText
+    placeholderTextColor: Color.transparent(control.color, 0.5)
+
+    PlaceholderText {
+        id: placeholder
+        x: control.leftPadding
+        y: control.topPadding
+        width: control.width - (control.leftPadding + control.rightPadding)
+        height: control.height - (control.topPadding + control.bottomPadding)
+
+        text: control.placeholderText
+        font: control.font
+        color: control.placeholderTextColor
+        verticalAlignment: control.verticalAlignment
+        visible: !control.length && !control.preeditText && (!control.activeFocus || control.horizontalAlignment !== Qt.AlignHCenter)
+        elide: Text.ElideRight
+        renderType: control.renderType
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/TextField.qml b/deployment_test/QtQuick/Controls.2/Fusion/TextField.qml
new file mode 100644
index 0000000000000000000000000000000000000000..d5b5788d2bc4e7ea99b0b63dd0f23317b0c2192f
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/TextField.qml
@@ -0,0 +1,103 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.TextField {
+    id: control
+
+    implicitWidth: implicitBackgroundWidth + leftInset + rightInset
+                   || Math.max(contentWidth, placeholder.implicitWidth) + leftPadding + rightPadding
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding,
+                             placeholder.implicitHeight + topPadding + bottomPadding)
+
+    padding: 4
+
+    color: control.palette.text
+    selectionColor: control.palette.highlight
+    selectedTextColor: control.palette.highlightedText
+    placeholderTextColor: Color.transparent(control.color, 0.5)
+    verticalAlignment: TextInput.AlignVCenter
+
+    PlaceholderText {
+        id: placeholder
+        x: control.leftPadding
+        y: control.topPadding
+        width: control.width - (control.leftPadding + control.rightPadding)
+        height: control.height - (control.topPadding + control.bottomPadding)
+
+        text: control.placeholderText
+        font: control.font
+        color: control.placeholderTextColor
+        verticalAlignment: control.verticalAlignment
+        visible: !control.length && !control.preeditText && (!control.activeFocus || control.horizontalAlignment !== Qt.AlignHCenter)
+        elide: Text.ElideRight
+        renderType: control.renderType
+    }
+
+    background: Rectangle {
+        implicitWidth: 120
+        implicitHeight: 24
+
+        radius: 2
+        color: control.palette.base
+        border.color: control.activeFocus ? Fusion.highlightedOutline(control.palette) : Fusion.outline(control.palette)
+
+        Rectangle {
+            x: 1; y: 1
+            width: parent.width - 2
+            height: parent.height - 2
+            color: "transparent"
+            border.color: Color.transparent(Fusion.highlightedOutline(control.palette), 40 / 255)
+            visible: control.activeFocus
+            radius: 1.7
+        }
+
+        Rectangle {
+            x: 2
+            y: 1
+            width: parent.width - 4
+            height: 1
+            color: Fusion.topShadow
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/ToolBar.qml b/deployment_test/QtQuick/Controls.2/Fusion/ToolBar.qml
new file mode 100644
index 0000000000000000000000000000000000000000..fa069c0b756e60a266a5ead32243c5e25b34f283
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/ToolBar.qml
@@ -0,0 +1,83 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.ToolBar {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    horizontalPadding: 6
+    topPadding: control.position === T.ToolBar.Footer ? 1 : 0
+    bottomPadding: control.position === T.ToolBar.Header ? 1 : 0
+
+    background: Rectangle {
+        implicitHeight: 26
+
+        gradient: Gradient {
+            GradientStop {
+                position: 0
+                color: Qt.lighter(control.palette.window, 1.04)
+            }
+            GradientStop {
+                position: 1
+                color: control.palette.window
+            }
+        }
+
+        Rectangle {
+            width: parent.width
+            height: 1
+            color: control.position === T.ToolBar.Header ? Fusion.lightShade : Fusion.darkShade
+        }
+
+        Rectangle {
+            y: parent.height - height
+            width: parent.width
+            height: 1
+            color: control.position === T.ToolBar.Header ? Fusion.darkShade : Fusion.lightShade
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/ToolButton.qml b/deployment_test/QtQuick/Controls.2/Fusion/ToolButton.qml
new file mode 100644
index 0000000000000000000000000000000000000000..4c00b402753eaa8292df29746b8da09367b3bf8c
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/ToolButton.qml
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.ToolButton {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    padding: 6
+    spacing: 6
+
+    icon.width: 16
+    icon.height: 16
+
+    contentItem: IconLabel {
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.palette.buttonText
+    }
+
+    background: ButtonPanel {
+        implicitWidth: 20
+        implicitHeight: 20
+
+        control: control
+        visible: control.down || control.checked || control.highlighted || control.visualFocus || control.hovered
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/ToolSeparator.qml b/deployment_test/QtQuick/Controls.2/Fusion/ToolSeparator.qml
new file mode 100644
index 0000000000000000000000000000000000000000..5d366652144f91c0a21b65a1ad09b74107522ad8
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/ToolSeparator.qml
@@ -0,0 +1,67 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.ToolSeparator {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    padding: vertical ? 6 : 2
+    verticalPadding: vertical ? 2 : 6
+
+    contentItem: Rectangle {
+        implicitWidth: vertical ? 2 : 8
+        implicitHeight: vertical ? 8 : 2
+        color: Qt.darker(control.palette.window, 1.1)
+
+        Rectangle {
+            x: 1
+            width: 1
+            height: parent.height
+            color: Qt.lighter(control.palette.window, 1.1)
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/ToolTip.qml b/deployment_test/QtQuick/Controls.2/Fusion/ToolTip.qml
new file mode 100644
index 0000000000000000000000000000000000000000..b505e2c99d3983df25871bb656df26f863c96f93
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/ToolTip.qml
@@ -0,0 +1,80 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.ToolTip {
+    id: control
+
+    x: parent ? (parent.width - implicitWidth) / 2 : 0
+    y: -implicitHeight - 3
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    margins: 6
+    padding: 6
+
+    closePolicy: T.Popup.CloseOnEscape | T.Popup.CloseOnPressOutsideParent | T.Popup.CloseOnReleaseOutsideParent
+
+    contentItem: Text {
+        text: control.text
+        font: control.font
+        wrapMode: Text.Wrap
+        color: control.palette.toolTipText
+    }
+
+    background: Rectangle {
+        color: control.palette.toolTipBase
+        border.color: control.palette.toolTipText
+
+        Rectangle {
+            z: -1
+            x: 1; y: 1
+            width: parent.width
+            height: parent.height
+            color: control.palette.shadow
+            opacity: 0.5
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/Tumbler.qml b/deployment_test/QtQuick/Controls.2/Fusion/Tumbler.qml
new file mode 100644
index 0000000000000000000000000000000000000000..0129f06cebbb8aceaf9625da6830ad83004502b4
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/Tumbler.qml
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Fusion 2.12
+import QtQuick.Controls.Fusion.impl 2.12
+
+T.Tumbler {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding) || 60 // ### remove 60 in Qt 6
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding) || 200 // ### remove 200 in Qt 6
+
+    delegate: Text {
+        text: modelData
+        color: control.palette.windowText
+        font: control.font
+        opacity: (1.0 - Math.abs(Tumbler.displacement) / (control.visibleItemCount / 2)) * (control.enabled ? 1 : 0.6)
+        horizontalAlignment: Text.AlignHCenter
+        verticalAlignment: Text.AlignVCenter
+    }
+
+    contentItem: TumblerView {
+        implicitWidth: 60
+        implicitHeight: 200
+        model: control.model
+        delegate: control.delegate
+        path: Path {
+            startX: control.contentItem.width / 2
+            startY: -control.contentItem.delegateHeight / 2
+            PathLine {
+                x: control.contentItem.width / 2
+                y: (control.visibleItemCount + 1) * control.contentItem.delegateHeight - control.contentItem.delegateHeight / 2
+            }
+        }
+
+        property real delegateHeight: control.availableHeight / control.visibleItemCount
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/VerticalHeaderView.qml b/deployment_test/QtQuick/Controls.2/Fusion/VerticalHeaderView.qml
new file mode 100644
index 0000000000000000000000000000000000000000..b220cdf23b63217161277e756846f9994a6ffd19
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/VerticalHeaderView.qml
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.15
+import QtQuick.Controls 2.15
+import QtQuick.Templates 2.15 as T
+
+T.VerticalHeaderView {
+    id: control
+
+    implicitWidth: contentWidth
+    implicitHeight: syncView ? syncView.height : 0
+
+    delegate: Rectangle {
+        // Qt6: add cellPadding (and font etc) as public API in headerview
+        readonly property real cellPadding: 8
+
+        implicitWidth: Math.max(control.width, text.implicitWidth + (cellPadding * 2))
+        implicitHeight: text.implicitHeight + (cellPadding * 2)
+        border.color: "#cacaca"
+
+        gradient: Gradient {
+            GradientStop {
+                position: 0
+                color: "#fbfbfb"
+            }
+            GradientStop {
+                position: 1
+                color: "#e0dfe0"
+            }
+        }
+
+        Text {
+            id: text
+            text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole]
+                                        : model[control.textRole])
+                                   : modelData
+            width: parent.width
+            height: parent.height
+            horizontalAlignment: Text.AlignHCenter
+            verticalAlignment: Text.AlignVCenter
+            color: "#ff26282a"
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/plugins.qmltypes b/deployment_test/QtQuick/Controls.2/Fusion/plugins.qmltypes
new file mode 100644
index 0000000000000000000000000000000000000000..681b8b90f908d73290e92926a272059e8f17c67f
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/plugins.qmltypes
@@ -0,0 +1,414 @@
+import QtQuick.tooling 1.2
+
+// This file describes the plugin-supplied types contained in the library.
+// It is used for QML tooling purposes only.
+//
+// This file was auto-generated by:
+// 'qmlplugindump -nonrelocatable -dependencies dependencies.json QtQuick.Controls.Fusion 2.15'
+
+Module {
+    dependencies: ["QtQuick.Controls 2.0"]
+    Component {
+        name: "QQuickFusionBusyIndicator"
+        defaultProperty: "data"
+        prototype: "QQuickPaintedItem"
+        exports: ["QtQuick.Controls.Fusion.impl/BusyIndicatorImpl 2.3"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "color"; type: "QColor" }
+        Property { name: "running"; type: "bool" }
+    }
+    Component {
+        name: "QQuickFusionDial"
+        defaultProperty: "data"
+        prototype: "QQuickPaintedItem"
+        exports: ["QtQuick.Controls.Fusion.impl/DialImpl 2.3"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "highlight"; type: "bool" }
+        Property { name: "palette"; type: "QPalette" }
+    }
+    Component {
+        name: "QQuickFusionKnob"
+        defaultProperty: "data"
+        prototype: "QQuickPaintedItem"
+        exports: ["QtQuick.Controls.Fusion.impl/KnobImpl 2.3"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "palette"; type: "QPalette" }
+    }
+    Component {
+        name: "QQuickFusionStyle"
+        prototype: "QObject"
+        exports: ["QtQuick.Controls.Fusion.impl/Fusion 2.3"]
+        isCreatable: false
+        isSingleton: true
+        exportMetaObjectRevisions: [0]
+        Property { name: "lightShade"; type: "QColor"; isReadonly: true }
+        Property { name: "darkShade"; type: "QColor"; isReadonly: true }
+        Property { name: "topShadow"; type: "QColor"; isReadonly: true }
+        Property { name: "innerContrastLine"; type: "QColor"; isReadonly: true }
+        Method {
+            name: "highlight"
+            type: "QColor"
+            Parameter { name: "palette"; type: "QPalette" }
+        }
+        Method {
+            name: "highlightedText"
+            type: "QColor"
+            Parameter { name: "palette"; type: "QPalette" }
+        }
+        Method {
+            name: "outline"
+            type: "QColor"
+            Parameter { name: "palette"; type: "QPalette" }
+        }
+        Method {
+            name: "highlightedOutline"
+            type: "QColor"
+            Parameter { name: "palette"; type: "QPalette" }
+        }
+        Method {
+            name: "tabFrameColor"
+            type: "QColor"
+            Parameter { name: "palette"; type: "QPalette" }
+        }
+        Method {
+            name: "buttonColor"
+            type: "QColor"
+            Parameter { name: "palette"; type: "QPalette" }
+            Parameter { name: "highlighted"; type: "bool" }
+            Parameter { name: "down"; type: "bool" }
+            Parameter { name: "hovered"; type: "bool" }
+        }
+        Method {
+            name: "buttonColor"
+            type: "QColor"
+            Parameter { name: "palette"; type: "QPalette" }
+            Parameter { name: "highlighted"; type: "bool" }
+            Parameter { name: "down"; type: "bool" }
+        }
+        Method {
+            name: "buttonColor"
+            type: "QColor"
+            Parameter { name: "palette"; type: "QPalette" }
+            Parameter { name: "highlighted"; type: "bool" }
+        }
+        Method {
+            name: "buttonColor"
+            type: "QColor"
+            Parameter { name: "palette"; type: "QPalette" }
+        }
+        Method {
+            name: "buttonOutline"
+            type: "QColor"
+            Parameter { name: "palette"; type: "QPalette" }
+            Parameter { name: "highlighted"; type: "bool" }
+            Parameter { name: "enabled"; type: "bool" }
+        }
+        Method {
+            name: "buttonOutline"
+            type: "QColor"
+            Parameter { name: "palette"; type: "QPalette" }
+            Parameter { name: "highlighted"; type: "bool" }
+        }
+        Method {
+            name: "buttonOutline"
+            type: "QColor"
+            Parameter { name: "palette"; type: "QPalette" }
+        }
+        Method {
+            name: "gradientStart"
+            type: "QColor"
+            Parameter { name: "baseColor"; type: "QColor" }
+        }
+        Method {
+            name: "gradientStop"
+            type: "QColor"
+            Parameter { name: "baseColor"; type: "QColor" }
+        }
+        Method {
+            name: "mergedColors"
+            type: "QColor"
+            Parameter { name: "colorA"; type: "QColor" }
+            Parameter { name: "colorB"; type: "QColor" }
+            Parameter { name: "factor"; type: "int" }
+        }
+        Method {
+            name: "mergedColors"
+            type: "QColor"
+            Parameter { name: "colorA"; type: "QColor" }
+            Parameter { name: "colorB"; type: "QColor" }
+        }
+        Method {
+            name: "grooveColor"
+            type: "QColor"
+            Parameter { name: "palette"; type: "QPalette" }
+        }
+    }
+    Component {
+        name: "QQuickItem"
+        defaultProperty: "data"
+        prototype: "QObject"
+        Enum {
+            name: "Flags"
+            values: {
+                "ItemClipsChildrenToShape": 1,
+                "ItemAcceptsInputMethod": 2,
+                "ItemIsFocusScope": 4,
+                "ItemHasContents": 8,
+                "ItemAcceptsDrops": 16
+            }
+        }
+        Enum {
+            name: "TransformOrigin"
+            values: {
+                "TopLeft": 0,
+                "Top": 1,
+                "TopRight": 2,
+                "Left": 3,
+                "Center": 4,
+                "Right": 5,
+                "BottomLeft": 6,
+                "Bottom": 7,
+                "BottomRight": 8
+            }
+        }
+        Property { name: "parent"; type: "QQuickItem"; isPointer: true }
+        Property { name: "data"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "resources"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "children"; type: "QQuickItem"; isList: true; isReadonly: true }
+        Property { name: "x"; type: "double" }
+        Property { name: "y"; type: "double" }
+        Property { name: "z"; type: "double" }
+        Property { name: "width"; type: "double" }
+        Property { name: "height"; type: "double" }
+        Property { name: "opacity"; type: "double" }
+        Property { name: "enabled"; type: "bool" }
+        Property { name: "visible"; type: "bool" }
+        Property { name: "visibleChildren"; type: "QQuickItem"; isList: true; isReadonly: true }
+        Property { name: "states"; type: "QQuickState"; isList: true; isReadonly: true }
+        Property { name: "transitions"; type: "QQuickTransition"; isList: true; isReadonly: true }
+        Property { name: "state"; type: "string" }
+        Property { name: "childrenRect"; type: "QRectF"; isReadonly: true }
+        Property { name: "anchors"; type: "QQuickAnchors"; isReadonly: true; isPointer: true }
+        Property { name: "left"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "right"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "horizontalCenter"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "top"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "bottom"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "verticalCenter"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "baseline"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "baselineOffset"; type: "double" }
+        Property { name: "clip"; type: "bool" }
+        Property { name: "focus"; type: "bool" }
+        Property { name: "activeFocus"; type: "bool"; isReadonly: true }
+        Property { name: "activeFocusOnTab"; revision: 1; type: "bool" }
+        Property { name: "rotation"; type: "double" }
+        Property { name: "scale"; type: "double" }
+        Property { name: "transformOrigin"; type: "TransformOrigin" }
+        Property { name: "transformOriginPoint"; type: "QPointF"; isReadonly: true }
+        Property { name: "transform"; type: "QQuickTransform"; isList: true; isReadonly: true }
+        Property { name: "smooth"; type: "bool" }
+        Property { name: "antialiasing"; type: "bool" }
+        Property { name: "implicitWidth"; type: "double" }
+        Property { name: "implicitHeight"; type: "double" }
+        Property { name: "containmentMask"; revision: 11; type: "QObject"; isPointer: true }
+        Property { name: "layer"; type: "QQuickItemLayer"; isReadonly: true; isPointer: true }
+        Signal {
+            name: "childrenRectChanged"
+            Parameter { type: "QRectF" }
+        }
+        Signal {
+            name: "baselineOffsetChanged"
+            Parameter { type: "double" }
+        }
+        Signal {
+            name: "stateChanged"
+            Parameter { type: "string" }
+        }
+        Signal {
+            name: "focusChanged"
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "activeFocusChanged"
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "activeFocusOnTabChanged"
+            revision: 1
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "parentChanged"
+            Parameter { type: "QQuickItem"; isPointer: true }
+        }
+        Signal {
+            name: "transformOriginChanged"
+            Parameter { type: "TransformOrigin" }
+        }
+        Signal {
+            name: "smoothChanged"
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "antialiasingChanged"
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "clipChanged"
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "windowChanged"
+            revision: 1
+            Parameter { name: "window"; type: "QQuickWindow"; isPointer: true }
+        }
+        Signal { name: "containmentMaskChanged"; revision: 11 }
+        Method { name: "update" }
+        Method {
+            name: "grabToImage"
+            revision: 4
+            type: "bool"
+            Parameter { name: "callback"; type: "QJSValue" }
+            Parameter { name: "targetSize"; type: "QSize" }
+        }
+        Method {
+            name: "grabToImage"
+            revision: 4
+            type: "bool"
+            Parameter { name: "callback"; type: "QJSValue" }
+        }
+        Method {
+            name: "contains"
+            type: "bool"
+            Parameter { name: "point"; type: "QPointF" }
+        }
+        Method {
+            name: "mapFromItem"
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "mapToItem"
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "mapFromGlobal"
+            revision: 7
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "mapToGlobal"
+            revision: 7
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+        Method { name: "forceActiveFocus" }
+        Method {
+            name: "forceActiveFocus"
+            Parameter { name: "reason"; type: "Qt::FocusReason" }
+        }
+        Method {
+            name: "nextItemInFocusChain"
+            revision: 1
+            type: "QQuickItem*"
+            Parameter { name: "forward"; type: "bool" }
+        }
+        Method { name: "nextItemInFocusChain"; revision: 1; type: "QQuickItem*" }
+        Method {
+            name: "childAt"
+            type: "QQuickItem*"
+            Parameter { name: "x"; type: "double" }
+            Parameter { name: "y"; type: "double" }
+        }
+    }
+    Component {
+        name: "QQuickPaintedItem"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        Enum {
+            name: "RenderTarget"
+            values: {
+                "Image": 0,
+                "FramebufferObject": 1,
+                "InvertedYFramebufferObject": 2
+            }
+        }
+        Enum {
+            name: "PerformanceHints"
+            values: {
+                "FastFBOResizing": 1
+            }
+        }
+        Property { name: "contentsSize"; type: "QSize" }
+        Property { name: "fillColor"; type: "QColor" }
+        Property { name: "contentsScale"; type: "double" }
+        Property { name: "renderTarget"; type: "RenderTarget" }
+        Property { name: "textureSize"; type: "QSize" }
+    }
+    Component {
+        prototype: "QQuickRectangle"
+        name: "QtQuick.Controls.Fusion.impl/ButtonPanel 2.3"
+        exports: ["QtQuick.Controls.Fusion.impl/ButtonPanel 2.3"]
+        exportMetaObjectRevisions: [3]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "control"; type: "QQuickItem"; isPointer: true }
+        Property { name: "highlighted"; type: "bool" }
+    }
+    Component {
+        prototype: "QQuickRectangle"
+        name: "QtQuick.Controls.Fusion.impl/CheckIndicator 2.3"
+        exports: ["QtQuick.Controls.Fusion.impl/CheckIndicator 2.3"]
+        exportMetaObjectRevisions: [3]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "control"; type: "QQuickItem"; isPointer: true }
+        Property { name: "pressedColor"; type: "QColor"; isReadonly: true }
+        Property { name: "checkMarkColor"; type: "QColor"; isReadonly: true }
+    }
+    Component {
+        prototype: "QQuickRectangle"
+        name: "QtQuick.Controls.Fusion.impl/RadioIndicator 2.3"
+        exports: ["QtQuick.Controls.Fusion.impl/RadioIndicator 2.3"]
+        exportMetaObjectRevisions: [3]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "control"; type: "QQuickItem"; isPointer: true }
+        Property { name: "pressedColor"; type: "QColor"; isReadonly: true }
+        Property { name: "checkMarkColor"; type: "QColor"; isReadonly: true }
+    }
+    Component {
+        prototype: "QQuickRectangle"
+        name: "QtQuick.Controls.Fusion.impl/SliderGroove 2.3"
+        exports: ["QtQuick.Controls.Fusion.impl/SliderGroove 2.3"]
+        exportMetaObjectRevisions: [3]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "control"; type: "QQuickItem"; isPointer: true }
+        Property { name: "offset"; type: "double" }
+        Property { name: "progress"; type: "double" }
+        Property { name: "visualProgress"; type: "double" }
+    }
+    Component {
+        prototype: "QQuickRectangle"
+        name: "QtQuick.Controls.Fusion.impl/SliderHandle 2.3"
+        exports: ["QtQuick.Controls.Fusion.impl/SliderHandle 2.3"]
+        exportMetaObjectRevisions: [3]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "palette"; type: "QVariant" }
+        Property { name: "pressed"; type: "bool" }
+        Property { name: "hovered"; type: "bool" }
+        Property { name: "vertical"; type: "bool" }
+        Property { name: "visualFocus"; type: "bool" }
+    }
+    Component {
+        prototype: "QQuickRectangle"
+        name: "QtQuick.Controls.Fusion.impl/SwitchIndicator 2.3"
+        exports: ["QtQuick.Controls.Fusion.impl/SwitchIndicator 2.3"]
+        exportMetaObjectRevisions: [3]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "control"; type: "QQuickItem"; isPointer: true }
+        Property { name: "pressedColor"; type: "QColor"; isReadonly: true }
+        Property { name: "checkMarkColor"; type: "QColor"; isReadonly: true }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/qmldir b/deployment_test/QtQuick/Controls.2/Fusion/qmldir
new file mode 100644
index 0000000000000000000000000000000000000000..b584adc8a4c84033b3fa53d172351e22ab0e6140
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Fusion/qmldir
@@ -0,0 +1,4 @@
+module QtQuick.Controls.Fusion
+plugin qtquickcontrols2fusionstyleplugin
+classname QtQuickControls2FusionStylePlugin
+depends QtQuick.Controls 2.5
diff --git a/deployment_test/QtQuick/Controls.2/Fusion/qtquickcontrols2fusionstyleplugin.dll b/deployment_test/QtQuick/Controls.2/Fusion/qtquickcontrols2fusionstyleplugin.dll
new file mode 100644
index 0000000000000000000000000000000000000000..74a41d993e9e1794fb69cf1875f7500de78cb9bc
Binary files /dev/null and b/deployment_test/QtQuick/Controls.2/Fusion/qtquickcontrols2fusionstyleplugin.dll differ
diff --git a/deployment_test/QtQuick/Controls.2/GroupBox.qml b/deployment_test/QtQuick/Controls.2/GroupBox.qml
new file mode 100644
index 0000000000000000000000000000000000000000..96f776f292ce8e747c8784365462d9171c7c3c4a
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/GroupBox.qml
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Templates 2.12 as T
+
+T.GroupBox {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding,
+                            implicitLabelWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    spacing: 6
+    padding: 12
+    topPadding: padding + (implicitLabelWidth > 0 ? implicitLabelHeight + spacing : 0)
+
+    label: Text {
+        x: control.leftPadding
+        width: control.availableWidth
+
+        text: control.title
+        font: control.font
+        color: control.palette.windowText
+        elide: Text.ElideRight
+        verticalAlignment: Text.AlignVCenter
+    }
+
+    background: Rectangle {
+        y: control.topPadding - control.bottomPadding
+        width: parent.width
+        height: parent.height - control.topPadding + control.bottomPadding
+
+        color: "transparent"
+        border.color: control.palette.mid
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/HorizontalHeaderView.qml b/deployment_test/QtQuick/Controls.2/HorizontalHeaderView.qml
new file mode 100644
index 0000000000000000000000000000000000000000..ec91af258e2dede9998baed8b8825fb8b55441e3
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/HorizontalHeaderView.qml
@@ -0,0 +1,68 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.15
+import QtQuick.Controls 2.15
+import QtQuick.Templates 2.15 as T
+
+T.HorizontalHeaderView {
+    id: control
+
+    implicitWidth: syncView ? syncView.width : 0
+    implicitHeight: contentHeight
+
+    delegate: Rectangle {
+        // Qt6: add cellPadding (and font etc) as public API in headerview
+        readonly property real cellPadding: 8
+
+        implicitWidth: text.implicitWidth + (cellPadding * 2)
+        implicitHeight: Math.max(control.height, text.implicitHeight + (cellPadding * 2))
+        color: "#f6f6f6"
+        border.color: "#e4e4e4"
+
+        Text {
+            id: text
+            text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole]
+                                        : model[control.textRole])
+                                   : modelData
+            width: parent.width
+            height: parent.height
+            horizontalAlignment: Text.AlignHCenter
+            verticalAlignment: Text.AlignVCenter
+            color: "#ff26282a"
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/ApplicationWindow.qml b/deployment_test/QtQuick/Controls.2/Imagine/ApplicationWindow.qml
new file mode 100644
index 0000000000000000000000000000000000000000..7bfcc3f9fc7b66a66e82e4440c4e14d5e3ce2506
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/ApplicationWindow.qml
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Window 2.2
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.ApplicationWindow {
+    id: window
+
+    // ### remove?
+    overlay.modal: NinePatchImage {
+        source: Imagine.url + "applicationwindow-overlay"
+        NinePatchImageSelector on source {
+            states: [
+                {"modal": true}
+            ]
+        }
+    }
+
+    // ### remove?
+    overlay.modeless: NinePatchImage {
+        source: Imagine.url + "applicationwindow-overlay"
+        NinePatchImageSelector on source {
+            states: [
+                {"modal": false}
+            ]
+        }
+    }
+
+    background: NinePatchImage {
+        width: window.width
+        height: window.height
+
+        source: Imagine.url + "applicationwindow-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"active": window.active}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/BusyIndicator.qml b/deployment_test/QtQuick/Controls.2/Imagine/BusyIndicator.qml
new file mode 100644
index 0000000000000000000000000000000000000000..652365b16dc70a7677e421a57332d8ef1515bed5
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/BusyIndicator.qml
@@ -0,0 +1,88 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.BusyIndicator {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    contentItem: AnimatedImage {
+        opacity: control.running ? 1 : 0
+        playing: control.running || opacity > 0
+        visible: control.running || opacity > 0
+        Behavior on opacity { OpacityAnimator { duration: 250 } }
+
+        source: Imagine.url + "busyindicator-animation"
+        AnimatedImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"running": control.running},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+    }
+
+    background: NinePatchImage {
+        source: Imagine.url + "busyindicator-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"running": control.running},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/Button.qml b/deployment_test/QtQuick/Controls.2/Imagine/Button.qml
new file mode 100644
index 0000000000000000000000000000000000000000..e7171eb14bb3e65e867f6800bdecc820b9ee4dc4
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/Button.qml
@@ -0,0 +1,99 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.Button {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    spacing: 6 // ###
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    icon.width: 24
+    icon.height: 24
+    icon.color: control.enabled && control.flat && control.highlighted ? control.palette.highlight
+        : control.enabled && (control.down || control.checked || control.highlighted) && !control.flat
+        ? control.palette.brightText : control.flat ? control.palette.windowText : control.palette.buttonText
+
+    contentItem: IconLabel {
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.enabled && control.flat && control.highlighted ? control.palette.highlight
+            : control.enabled && (control.down || control.checked || control.highlighted) && !control.flat
+            ? control.palette.brightText : control.flat ? control.palette.windowText : control.palette.buttonText
+    }
+
+    background: NinePatchImage {
+        source: Imagine.url + "button-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"pressed": control.down},
+                {"checked": control.checked},
+                {"checkable": control.checkable},
+                {"focused": control.visualFocus},
+                {"highlighted": control.highlighted},
+                {"mirrored": control.mirrored},
+                {"flat": control.flat},
+                {"hovered": control.hovered}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/CheckBox.qml b/deployment_test/QtQuick/Controls.2/Imagine/CheckBox.qml
new file mode 100644
index 0000000000000000000000000000000000000000..b91ceb40f2d73e9e8e17849b41029abd4f23bcd4
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/CheckBox.qml
@@ -0,0 +1,106 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.CheckBox {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    spacing: 6 // ###
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    indicator: Image {
+        x: text ? (control.mirrored ? control.width - width - control.rightPadding : control.leftPadding) : control.leftPadding + (control.availableWidth - width) / 2
+        y: control.topPadding + (control.availableHeight - height) / 2
+
+        source: Imagine.url + "checkbox-indicator"
+        ImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"pressed": control.down},
+                {"checked": control.checkState === Qt.Checked},
+                {"partially-checked": control.checkState === Qt.PartiallyChecked},
+                {"focused": control.visualFocus},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+    }
+
+    contentItem: Text {
+        leftPadding: control.indicator && !control.mirrored ? control.indicator.width + control.spacing : 0
+        rightPadding: control.indicator && control.mirrored ? control.indicator.width + control.spacing : 0
+
+        text: control.text
+        font: control.font
+        color: control.palette.windowText
+        elide: Text.ElideRight
+        verticalAlignment: Text.AlignVCenter
+    }
+
+    background: NinePatchImage {
+        source: Imagine.url + "checkbox-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"pressed": control.down},
+                {"checked": control.checkState === Qt.Checked},
+                {"partially-checked": control.checkState === Qt.PartiallyChecked},
+                {"focused": control.visualFocus},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/CheckDelegate.qml b/deployment_test/QtQuick/Controls.2/Imagine/CheckDelegate.qml
new file mode 100644
index 0000000000000000000000000000000000000000..1997515282bcb42c7e4db6b309c8c3d0ac7b36d4
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/CheckDelegate.qml
@@ -0,0 +1,118 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.CheckDelegate {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    spacing: 12 // ###
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    icon.width: 24
+    icon.height: 24
+    icon.color: control.palette.text
+
+    indicator: Image {
+        x: control.mirrored ? control.leftPadding : control.width - width - control.rightPadding
+        y: control.topPadding + (control.availableHeight - height) / 2
+
+        source: Imagine.url + "checkdelegate-indicator"
+        ImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"pressed": control.down},
+                {"checked": control.checkState === Qt.Checked},
+                {"partially-checked": control.checkState === Qt.PartiallyChecked},
+                {"focused": control.visualFocus},
+                {"highlighted": control.highlighted},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+    }
+
+    contentItem: IconLabel {
+        leftPadding: control.mirrored ? control.indicator.width + control.spacing : 0
+        rightPadding: !control.mirrored ? control.indicator.width + control.spacing : 0
+
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+        alignment: control.display === IconLabel.IconOnly || control.display === IconLabel.TextUnderIcon ? Qt.AlignCenter : Qt.AlignLeft
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.palette.text
+    }
+
+    background: NinePatchImage {
+        source: Imagine.url + "checkdelegate-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"pressed": control.down},
+                {"checked": control.checkState === Qt.Checked},
+                {"partially-checked": control.checkState === Qt.PartiallyChecked},
+                {"focused": control.visualFocus},
+                {"highlighted": control.highlighted},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/ComboBox.qml b/deployment_test/QtQuick/Controls.2/Imagine/ComboBox.qml
new file mode 100644
index 0000000000000000000000000000000000000000..d657e734ad544b045740f5a8e148e058a4701c01
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/ComboBox.qml
@@ -0,0 +1,174 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.15
+import QtQuick.Window 2.15
+import QtQuick.Templates 2.15 as T
+import QtQuick.Controls 2.15
+import QtQuick.Controls.Imagine 2.15
+import QtQuick.Controls.Imagine.impl 2.15
+
+T.ComboBox {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentItem.implicitWidth + background ? (background.leftPadding + background.rightPadding) : 0)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             Math.max(implicitContentHeight,
+                                      implicitIndicatorHeight) + background ? (background.topPadding + background.bottomPadding) : 0)
+
+    leftPadding: padding + (!control.mirrored || !indicator || !indicator.visible ? 0 : indicator.width + spacing)
+    rightPadding: padding + (control.mirrored || !indicator || !indicator.visible ? 0 : indicator.width + spacing)
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    delegate: ItemDelegate {
+        width: ListView.view.width
+        text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole] : model[control.textRole]) : modelData
+        font.weight: control.currentIndex === index ? Font.DemiBold : Font.Normal
+        highlighted: control.highlightedIndex === index
+        hoverEnabled: control.hoverEnabled
+    }
+
+    indicator: Image {
+        x: control.mirrored ? control.padding : control.width - width - control.padding
+        y: control.topPadding + (control.availableHeight - height) / 2
+
+        source: Imagine.url + "combobox-indicator"
+        ImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"pressed": control.pressed},
+                {"editable": control.editable},
+                {"open": control.down},
+                {"focused": control.visualFocus},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered},
+                {"flat": control.flat}
+            ]
+        }
+    }
+
+    contentItem: T.TextField {
+        topPadding: control.background ? control.background.topPadding : 0
+        leftPadding: control.background ? control.background.leftPadding : 0
+        rightPadding: control.background ? control.background.rightPadding : 0
+        bottomPadding: control.background ? control.background.bottomPadding : 0
+
+        text: control.editable ? control.editText : control.displayText
+
+        enabled: control.editable
+        autoScroll: control.editable
+        readOnly: control.down
+        inputMethodHints: control.inputMethodHints
+        validator: control.validator
+        selectByMouse: control.selectTextByMouse
+
+        font: control.font
+        color: control.flat ? control.palette.windowText : control.editable ? control.palette.text : control.palette.buttonText
+        selectionColor: control.palette.highlight
+        selectedTextColor: control.palette.highlightedText
+        verticalAlignment: Text.AlignVCenter
+    }
+
+    background: NinePatchImage {
+        source: Imagine.url + "combobox-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"pressed": control.pressed},
+                {"editable": control.editable},
+                {"open": control.down},
+                {"focused": control.visualFocus || (control.editable && control.activeFocus)},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered},
+                {"flat": control.flat}
+            ]
+        }
+    }
+
+    popup: T.Popup {
+        width: control.width
+        height: Math.min(contentItem.implicitHeight + topPadding + bottomPadding, control.Window.height - topMargin - bottomMargin)
+
+        topMargin: background.topInset
+        bottomMargin: background.bottomInset
+
+        topPadding: background.topPadding
+        leftPadding: background.leftPadding
+        rightPadding: background.rightPadding
+        bottomPadding: background.bottomPadding
+
+        topInset: background ? -background.topInset || 0 : 0
+        leftInset: background ? -background.leftInset || 0 : 0
+        rightInset: background ? -background.rightInset || 0 : 0
+        bottomInset: background ? -background.bottomInset || 0 : 0
+
+        palette.text: control.palette.text
+        palette.highlight: control.palette.highlight
+        palette.highlightedText: control.palette.highlightedText
+        palette.windowText: control.palette.windowText
+        palette.buttonText: control.palette.buttonText
+
+        contentItem: ListView {
+            clip: true
+            implicitHeight: contentHeight
+            model: control.delegateModel
+            currentIndex: control.highlightedIndex
+            highlightMoveDuration: 0
+
+            T.ScrollIndicator.vertical: ScrollIndicator { }
+        }
+
+        background: NinePatchImage {
+            source: Imagine.url + "combobox-popup"
+            NinePatchImageSelector on source {
+                states: [
+                    {"disabled": !control.enabled},
+                    {"pressed": control.pressed},
+                    {"editable": control.editable},
+                    {"focused": control.visualFocus || (control.editable && control.activeFocus)},
+                    {"mirrored": control.mirrored},
+                    {"hovered": control.hovered},
+                    {"flat": control.flat}
+                ]
+            }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/DelayButton.qml b/deployment_test/QtQuick/Controls.2/Imagine/DelayButton.qml
new file mode 100644
index 0000000000000000000000000000000000000000..f60b5eaeee29a9ea2662ab6e7da18ab5712ef209
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/DelayButton.qml
@@ -0,0 +1,138 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+import QtGraphicalEffects 1.12
+
+T.DelayButton {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    transition: Transition {
+        NumberAnimation {
+            duration: control.delay * (control.pressed ? 1.0 - control.progress : 0.3 * control.progress)
+        }
+    }
+
+    contentItem: Text {
+        text: control.text
+        font: control.font
+        color: control.palette.buttonText
+        horizontalAlignment: Text.AlignHCenter
+        verticalAlignment: Text.AlignVCenter
+        elide: Text.ElideRight
+    }
+
+    background: NinePatchImage {
+        source: Imagine.url + "delaybutton-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"pressed": control.down},
+                {"checked": control.checked},
+                {"focused": control.visualFocus},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+
+        readonly property NinePatchImage progress: NinePatchImage {
+            parent: control.background
+            width: control.progress * parent.width
+            height: parent.height
+            visible: false
+
+            source: Imagine.url + "delaybutton-progress"
+            NinePatchImageSelector on source {
+                states: [
+                    {"disabled": !control.enabled},
+                    {"pressed": control.down},
+                    {"checked": control.checked},
+                    {"focused": control.visualFocus},
+                    {"mirrored": control.mirrored},
+                    {"hovered": control.hovered}
+                ]
+            }
+        }
+
+        readonly property NinePatchImage mask: NinePatchImage {
+            width: control.background.width
+            height: control.background.height
+            visible: false
+
+            source: Imagine.url + "delaybutton-mask"
+            NinePatchImageSelector on source {
+                states: [
+                    {"disabled": !control.enabled},
+                    {"pressed": control.down},
+                    {"checked": control.checked},
+                    {"focused": control.visualFocus},
+                    {"mirrored": control.mirrored},
+                    {"hovered": control.hovered}
+                ]
+            }
+        }
+
+        readonly property OpacityMask effect: OpacityMask {
+            parent: control.background
+            width: source.width
+            height: source.height
+            source: control.background.progress
+
+            maskSource: ShaderEffectSource {
+                sourceItem: control.background.mask
+                sourceRect: Qt.rect(0, 0, control.background.effect.width, control.background.effect.height)
+            }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/Dial.qml b/deployment_test/QtQuick/Controls.2/Imagine/Dial.qml
new file mode 100644
index 0000000000000000000000000000000000000000..f8c394f3d3c44d67fa96e084a383d508921abefe
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/Dial.qml
@@ -0,0 +1,105 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.Dial {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                           (handle ? handle.implicitWidth : 0) + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                            (handle ? handle.implicitHeight : 0) + topPadding + bottomPadding)
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    handle: Image {
+        x: background.x + background.width / 2 - handle.width / 2
+        y: background.y + background.height / 2 - handle.height / 2
+
+        source: Imagine.url + "dial-handle"
+        ImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"pressed": control.pressed},
+                {"focused": control.visualFocus},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+
+        transform: [
+            Translate {
+                y: -Math.min(control.background.width, control.background.height) * 0.4 + control.handle.height / 2
+            },
+            Rotation {
+                angle: control.angle
+                origin.x: handle.width / 2
+                origin.y: handle.height / 2
+            }
+        ]
+    }
+
+    background: NinePatchImage {
+        x: control.width / 2 - width / 2
+        y: control.height / 2 - height / 2
+        width: Math.max(64, Math.min(control.width, control.height))
+        height: width
+        fillMode: Image.PreserveAspectFit
+
+        source: Imagine.url + "dial-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"pressed": control.pressed},
+                {"focused": control.visualFocus},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/Dialog.qml b/deployment_test/QtQuick/Controls.2/Imagine/Dialog.qml
new file mode 100644
index 0000000000000000000000000000000000000000..730b7f573bb94a56818f0caf6f1e55c01b8d1370
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/Dialog.qml
@@ -0,0 +1,117 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.Dialog {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding,
+                            implicitHeaderWidth,
+                            implicitFooterWidth)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding
+                             + (implicitHeaderHeight > 0 ? implicitHeaderHeight + spacing : 0)
+                             + (implicitFooterHeight > 0 ? implicitFooterHeight + spacing : 0))
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    background: NinePatchImage {
+        source: Imagine.url + "dialog-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"modal": control.modal},
+                {"dim": control.dim}
+            ]
+        }
+    }
+
+    header: Label {
+        text: control.title
+        visible: control.title
+        elide: Label.ElideRight
+        font.bold: true
+        padding: 12
+
+        background: NinePatchImage {
+            width: parent.width
+            height: parent.height
+
+            source: Imagine.url + "dialog-title"
+            NinePatchImageSelector on source {
+                states: [
+                    {"modal": control.modal},
+                    {"dim": control.dim}
+                ]
+            }
+        }
+    }
+
+    footer: DialogButtonBox {
+        visible: count > 0
+    }
+
+    T.Overlay.modal: NinePatchImage {
+        source: Imagine.url + "dialog-overlay"
+        NinePatchImageSelector on source {
+            states: [
+                {"modal": true}
+            ]
+        }
+    }
+
+    T.Overlay.modeless: NinePatchImage {
+        source: Imagine.url + "dialog-overlay"
+        NinePatchImageSelector on source {
+            states: [
+                {"modal": false}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/DialogButtonBox.qml b/deployment_test/QtQuick/Controls.2/Imagine/DialogButtonBox.qml
new file mode 100644
index 0000000000000000000000000000000000000000..c24b29fc48e75261facd189f1d16d27d055b7d37
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/DialogButtonBox.qml
@@ -0,0 +1,85 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.DialogButtonBox {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            (control.count === 1 ? contentWidth * 2 : contentWidth) + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    spacing: 6
+
+    delegate: Button {
+        width: control.count === 1 ? control.availableWidth / 2 : undefined
+        flat: true
+    }
+
+    contentItem: ListView {
+        model: control.contentModel
+        spacing: control.spacing
+        orientation: ListView.Horizontal
+        boundsBehavior: Flickable.StopAtBounds
+        snapMode: ListView.SnapToItem
+    }
+
+    background: NinePatchImage {
+        source: Imagine.url + "dialogbuttonbox-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"mirrored": control.mirrored}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/Drawer.qml b/deployment_test/QtQuick/Controls.2/Imagine/Drawer.qml
new file mode 100644
index 0000000000000000000000000000000000000000..2c93ba751fbfb9cab2c3276a77fe05f14e8117a9
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/Drawer.qml
@@ -0,0 +1,96 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.Drawer {
+    id: control
+
+    parent: T.ApplicationWindow.overlay
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    enter: Transition { SmoothedAnimation { velocity: 5 } }
+    exit: Transition { SmoothedAnimation { velocity: 5 } }
+
+    background: NinePatchImage {
+        source: Imagine.url + "drawer-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"modal": control.modal},
+                {"dim": control.dim},
+                {"top": control.edge === Qt.TopEdge},
+                {"left": control.edge === Qt.LeftEdge},
+                {"right": control.edge === Qt.RightEdge},
+                {"bottom": control.edge === Qt.BottomEdge}
+            ]
+        }
+    }
+
+    T.Overlay.modal: NinePatchImage {
+        source: Imagine.url + "drawer-overlay"
+        NinePatchImageSelector on source {
+            states: [
+                {"modal": true}
+            ]
+        }
+    }
+
+    T.Overlay.modeless: NinePatchImage {
+        source: Imagine.url + "drawer-overlay"
+        NinePatchImageSelector on source {
+            states: [
+                {"modal": false}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/Frame.qml b/deployment_test/QtQuick/Controls.2/Imagine/Frame.qml
new file mode 100644
index 0000000000000000000000000000000000000000..2bef3c88a9dd47d82287aebcc5e211df1e1a6a59
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/Frame.qml
@@ -0,0 +1,69 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.Frame {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    background: NinePatchImage {
+        source: Imagine.url + "frame-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"mirrored": control.mirrored}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/GroupBox.qml b/deployment_test/QtQuick/Controls.2/Imagine/GroupBox.qml
new file mode 100644
index 0000000000000000000000000000000000000000..7abdb6f05c068c8e30330b141e03f1ce6b67dfb7
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/GroupBox.qml
@@ -0,0 +1,101 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.GroupBox {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding,
+                            implicitLabelWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    topPadding: (background ? background.topPadding : 0) + (implicitLabelWidth > 0 ? implicitLabelHeight + spacing : 0)
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+    padding: 12
+
+    label: Label {
+        width: control.width
+
+        topPadding: background.topPadding
+        leftPadding: background.leftPadding
+        rightPadding: background.rightPadding
+        bottomPadding: background.bottomPadding
+
+        text: control.title
+        font: control.font
+        elide: Text.ElideRight
+        verticalAlignment: Text.AlignVCenter
+
+        color: control.palette.windowText
+
+        background: NinePatchImage {
+            width: parent.width
+            height: parent.height
+
+            source: Imagine.url + "groupbox-title"
+            NinePatchImageSelector on source {
+                states: [
+                    {"disabled": !control.enabled},
+                    {"mirrored": control.mirrored}
+                ]
+            }
+        }
+    }
+
+    background: NinePatchImage {
+        x: -leftInset
+        y: control.topPadding - control.bottomPadding - topInset
+        width: control.width + leftInset + rightInset
+        height: control.height + topInset + bottomInset - control.topPadding + control.padding
+
+        source: Imagine.url + "groupbox-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"mirrored": control.mirrored}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/HorizontalHeaderView.qml b/deployment_test/QtQuick/Controls.2/Imagine/HorizontalHeaderView.qml
new file mode 100644
index 0000000000000000000000000000000000000000..ec91af258e2dede9998baed8b8825fb8b55441e3
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/HorizontalHeaderView.qml
@@ -0,0 +1,68 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.15
+import QtQuick.Controls 2.15
+import QtQuick.Templates 2.15 as T
+
+T.HorizontalHeaderView {
+    id: control
+
+    implicitWidth: syncView ? syncView.width : 0
+    implicitHeight: contentHeight
+
+    delegate: Rectangle {
+        // Qt6: add cellPadding (and font etc) as public API in headerview
+        readonly property real cellPadding: 8
+
+        implicitWidth: text.implicitWidth + (cellPadding * 2)
+        implicitHeight: Math.max(control.height, text.implicitHeight + (cellPadding * 2))
+        color: "#f6f6f6"
+        border.color: "#e4e4e4"
+
+        Text {
+            id: text
+            text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole]
+                                        : model[control.textRole])
+                                   : modelData
+            width: parent.width
+            height: parent.height
+            horizontalAlignment: Text.AlignHCenter
+            verticalAlignment: Text.AlignVCenter
+            color: "#ff26282a"
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/ItemDelegate.qml b/deployment_test/QtQuick/Controls.2/Imagine/ItemDelegate.qml
new file mode 100644
index 0000000000000000000000000000000000000000..0b3edeaff96c0f88d0bdb509648e8e78d10048ce
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/ItemDelegate.qml
@@ -0,0 +1,94 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.ItemDelegate {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    spacing: 12 // ###
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    icon.width: 24
+    icon.height: 24
+    icon.color: control.palette.text
+
+    contentItem: IconLabel {
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+        alignment: control.display === IconLabel.IconOnly || control.display === IconLabel.TextUnderIcon ? Qt.AlignCenter : Qt.AlignLeft
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.palette.text
+    }
+
+    background: NinePatchImage {
+        source: Imagine.url + "itemdelegate-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"pressed": control.down},
+                {"focused": control.visualFocus},
+                {"highlighted": control.highlighted},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/Label.qml b/deployment_test/QtQuick/Controls.2/Imagine/Label.qml
new file mode 100644
index 0000000000000000000000000000000000000000..82c0ef475faa102ee45a3c6fd869dd6bc3f6163b
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/Label.qml
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.Label {
+    id: control
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    color: control.palette.windowText
+    linkColor: control.palette.link
+
+    background: NinePatchImage {
+        source: Imagine.url + "label-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/Menu.qml b/deployment_test/QtQuick/Controls.2/Imagine/Menu.qml
new file mode 100644
index 0000000000000000000000000000000000000000..832565e6b110041cc24bcb48c572a478ed435a2c
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/Menu.qml
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+import QtQuick.Window 2.12
+
+T.Menu {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    topMargin: background ? background.topInset : 0
+    leftMargin: background ? background.leftInset : 0
+    rightMargin: background ? background.rightInset : 0
+    bottomMargin: background ? background.bottomInset : 0
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    delegate: MenuItem { }
+
+    contentItem: ListView {
+        implicitHeight: contentHeight
+        model: control.contentModel
+        interactive: Window.window
+                        ? contentHeight + control.topPadding + control.bottomPadding > Window.window.height
+                        : false
+        clip: true
+        currentIndex: control.currentIndex
+
+        T.ScrollIndicator.vertical: ScrollIndicator { }
+    }
+
+    background: NinePatchImage {
+        source: Imagine.url + "menu-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"modal": control.modal},
+                {"dim": control.dim}
+            ]
+        }
+    }
+
+    T.Overlay.modal: NinePatchImage {
+        source: Imagine.url + "menu-overlay"
+        NinePatchImageSelector on source {
+            states: [
+                {"modal": true}
+            ]
+        }
+    }
+
+    T.Overlay.modeless: NinePatchImage {
+        source: Imagine.url + "menu-overlay"
+        NinePatchImageSelector on source {
+            states: [
+                {"modal": false}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/MenuItem.qml b/deployment_test/QtQuick/Controls.2/Imagine/MenuItem.qml
new file mode 100644
index 0000000000000000000000000000000000000000..f85fc657f246910ce415604522b26966214abb6e
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/MenuItem.qml
@@ -0,0 +1,138 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.MenuItem {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    spacing: 6 // ###
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    icon.width: 24
+    icon.height: 24
+    icon.color: control.palette.windowText
+
+    contentItem: IconLabel {
+        readonly property real arrowPadding: control.subMenu && control.arrow ? control.arrow.width + control.spacing : 0
+        readonly property real indicatorPadding: control.checkable && control.indicator ? control.indicator.width + control.spacing : 0
+        leftPadding: !control.mirrored ? indicatorPadding : arrowPadding
+        rightPadding: control.mirrored ? indicatorPadding : arrowPadding
+
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+        alignment: Qt.AlignLeft
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.palette.windowText
+    }
+
+    arrow: Image {
+        x: control.mirrored ? control.leftPadding : control.width - width - control.rightPadding
+        y: control.topPadding + (control.availableHeight - height) / 2
+
+        visible: control.subMenu
+        source: Imagine.url + "menuitem-arrow"
+        ImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"pressed": control.down},
+                {"checked": control.checked},
+                {"focused": control.visualFocus},
+                {"highlighted": control.highlighted},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+    }
+
+    indicator: Image {
+        x: control.text ? (control.mirrored ? control.width - width - control.rightPadding : control.leftPadding) : control.leftPadding + (control.availableWidth - width) / 2
+        y: control.topPadding + (control.availableHeight - height) / 2
+
+        visible: control.checkable
+        source: Imagine.url + "menuitem-indicator"
+        ImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"pressed": control.down},
+                {"checked": control.checked},
+                {"focused": control.visualFocus},
+                {"highlighted": control.highlighted},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+    }
+
+    background: NinePatchImage {
+        source: Imagine.url + "menuitem-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"pressed": control.down},
+                {"checked": control.checked},
+                {"focused": control.visualFocus},
+                {"highlighted": control.highlighted},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/MenuSeparator.qml b/deployment_test/QtQuick/Controls.2/Imagine/MenuSeparator.qml
new file mode 100644
index 0000000000000000000000000000000000000000..9ed39087369ef45ace179a87b084d7ce9d1869f8
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/MenuSeparator.qml
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.MenuSeparator {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    contentItem: NinePatchImage {
+        source: Imagine.url + "menuseparator-separator"
+        NinePatchImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"mirrored": control.mirrored}
+            ]
+        }
+    }
+
+    background: NinePatchImage {
+        source: Imagine.url + "menuseparator-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"mirrored": control.mirrored}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/Page.qml b/deployment_test/QtQuick/Controls.2/Imagine/Page.qml
new file mode 100644
index 0000000000000000000000000000000000000000..07ec0a758f5f3b80d39d9fd6b3e7a118c07d8d7b
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/Page.qml
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.Page {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding,
+                            implicitHeaderWidth,
+                            implicitFooterWidth)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding
+                             + (implicitHeaderHeight > 0 ? implicitHeaderHeight + spacing : 0)
+                             + (implicitFooterHeight > 0 ? implicitFooterHeight + spacing : 0))
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    background: NinePatchImage {
+        source: Imagine.url + "page-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"mirrored": control.mirrored}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/PageIndicator.qml b/deployment_test/QtQuick/Controls.2/Imagine/PageIndicator.qml
new file mode 100644
index 0000000000000000000000000000000000000000..8da89f5a164a91cdc8566eceac44bb398a76d3d0
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/PageIndicator.qml
@@ -0,0 +1,92 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.PageIndicator {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    delegate: Image {
+        source: Imagine.url + "pageindicator-delegate"
+        ImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"pressed": pressed},
+                {"current": index === control.currentIndex},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered} // ### TODO: context property
+            ]
+        }
+    }
+
+    contentItem: Row {
+        spacing: control.spacing
+
+        Repeater {
+            model: control.count
+            delegate: control.delegate
+        }
+    }
+
+    background: NinePatchImage {
+        source: Imagine.url + "pageindicator-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/Pane.qml b/deployment_test/QtQuick/Controls.2/Imagine/Pane.qml
new file mode 100644
index 0000000000000000000000000000000000000000..970b22b94dd90ab56faccfb1485723dfab1259f9
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/Pane.qml
@@ -0,0 +1,69 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.Pane {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    background: NinePatchImage {
+        source: Imagine.url + "pane-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"mirrored": control.mirrored}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/Popup.qml b/deployment_test/QtQuick/Controls.2/Imagine/Popup.qml
new file mode 100644
index 0000000000000000000000000000000000000000..8f69bef4634c0080a52aeb13890af81ff59f44ff
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/Popup.qml
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.Popup {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    topPadding: background ? background.topPadding : undefined
+    leftPadding: background ? background.leftPadding : undefined
+    rightPadding: background ? background.rightPadding : undefined
+    bottomPadding: background ? background.bottomPadding : undefined
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    background: NinePatchImage {
+        source: Imagine.url + "popup-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"modal": control.modal},
+                {"dim": control.dim}
+            ]
+        }
+    }
+
+    T.Overlay.modal: NinePatchImage {
+        source: Imagine.url + "popup-overlay"
+        NinePatchImageSelector on source {
+            states: [
+                {"modal": true}
+            ]
+        }
+    }
+
+    T.Overlay.modeless: NinePatchImage {
+        source: Imagine.url + "popup-overlay"
+        NinePatchImageSelector on source {
+            states: [
+                {"modal": false}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/ProgressBar.qml b/deployment_test/QtQuick/Controls.2/Imagine/ProgressBar.qml
new file mode 100644
index 0000000000000000000000000000000000000000..2f78004ed048b4a5a9a037cb3757ad3762be0545
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/ProgressBar.qml
@@ -0,0 +1,142 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+import QtGraphicalEffects 1.12
+
+T.ProgressBar {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    contentItem: Item {
+        implicitWidth: control.indeterminate ? animation.implicitWidth || progress.implicitWidth : progress.implicitWidth
+        implicitHeight: control.indeterminate ? animation.implicitHeight || progress.implicitHeight : progress.implicitHeight
+        scale: control.mirrored ? -1 : 1
+
+        readonly property bool hasMask: mask.status !== Image.Null
+
+        readonly property NinePatchImage progress: NinePatchImage {
+            parent: control.contentItem
+            width: control.position * parent.width
+            height: parent.height
+            visible: !control.indeterminate && !control.contentItem.hasMask
+
+            source: Imagine.url + "progressbar-progress"
+            NinePatchImageSelector on source {
+                states: [
+                    {"disabled": !control.enabled},
+                    {"indeterminate": control.indeterminate},
+                    {"mirrored": control.mirrored},
+                    {"hovered": control.hovered}
+                ]
+            }
+        }
+
+        readonly property AnimatedImage animation: AnimatedImage {
+            parent: control.contentItem
+            width: parent.width
+            height: parent.height
+            playing: control.indeterminate
+            visible: control.indeterminate && !control.contentItem.hasMask
+
+            source: Imagine.url + "progressbar-animation"
+            AnimatedImageSelector on source {
+                states: [
+                    {"disabled": !control.enabled},
+                    {"mirrored": control.mirrored},
+                    {"hovered": control.hovered}
+                ]
+            }
+        }
+
+        readonly property NinePatchImage mask: NinePatchImage {
+            width: control.availableWidth
+            height: control.availableHeight
+            visible: false
+
+            source: Imagine.url + "progressbar-mask"
+            NinePatchImageSelector on source {
+                states: [
+                    {"disabled": !control.enabled},
+                    {"indeterminate": control.indeterminate},
+                    {"mirrored": control.mirrored},
+                    {"hovered": control.hovered}
+                ]
+            }
+        }
+
+        readonly property OpacityMask effect: OpacityMask {
+            parent: control.contentItem
+            width: source.width
+            height: source.height
+            source: control.indeterminate ? control.contentItem.animation : control.contentItem.progress
+
+            maskSource: ShaderEffectSource {
+                sourceItem: control.contentItem.mask
+                sourceRect: Qt.rect(0, 0, control.contentItem.effect.width, control.contentItem.effect.height)
+            }
+        }
+    }
+
+    background: NinePatchImage {
+        source: Imagine.url + "progressbar-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"indeterminate": control.indeterminate},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/RadioButton.qml b/deployment_test/QtQuick/Controls.2/Imagine/RadioButton.qml
new file mode 100644
index 0000000000000000000000000000000000000000..a50bc127654ddf25251f0ca505951bc01f51622a
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/RadioButton.qml
@@ -0,0 +1,104 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.RadioButton {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    spacing: 6 // ###
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    indicator: Image {
+        x: control.text ? (control.mirrored ? control.width - width - control.rightPadding : control.leftPadding) : control.leftPadding + (control.availableWidth - width) / 2
+        y: control.topPadding + (control.availableHeight - height) / 2
+
+        source: Imagine.url + "radiobutton-indicator"
+        ImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"pressed": control.down},
+                {"checked": control.checked},
+                {"focused": control.visualFocus},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+    }
+
+    contentItem: Text {
+        leftPadding: control.indicator && !control.mirrored ? control.indicator.width + control.spacing : 0
+        rightPadding: control.indicator && control.mirrored ? control.indicator.width + control.spacing : 0
+
+        text: control.text
+        font: control.font
+        color: control.palette.windowText
+        elide: Text.ElideRight
+        verticalAlignment: Text.AlignVCenter
+    }
+
+    background: NinePatchImage {
+        source: Imagine.url + "radiobutton-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"pressed": control.down},
+                {"checked": control.checked},
+                {"focused": control.visualFocus},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/RadioDelegate.qml b/deployment_test/QtQuick/Controls.2/Imagine/RadioDelegate.qml
new file mode 100644
index 0000000000000000000000000000000000000000..5a8356f8783b3c029c7c98c295ce296caa89d29a
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/RadioDelegate.qml
@@ -0,0 +1,116 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.RadioDelegate {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    spacing: 12 // ###
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    icon.width: 24
+    icon.height: 24
+    icon.color: control.palette.text
+
+    indicator: Image {
+        x: control.mirrored ? control.leftPadding : control.width - width - control.rightPadding
+        y: control.topPadding + (control.availableHeight - height) / 2
+
+        source: Imagine.url + "radiodelegate-indicator"
+        ImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"pressed": control.down},
+                {"checked": control.checked},
+                {"focused": control.visualFocus},
+                {"highlighted": control.highlighted},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+    }
+
+    contentItem: IconLabel {
+        leftPadding: control.mirrored ? control.indicator.width + control.spacing : 0
+        rightPadding: !control.mirrored ? control.indicator.width + control.spacing : 0
+
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+        alignment: control.display === IconLabel.IconOnly || control.display === IconLabel.TextUnderIcon ? Qt.AlignCenter : Qt.AlignLeft
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.palette.text
+    }
+
+    background: NinePatchImage {
+        source: Imagine.url + "radiodelegate-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"pressed": control.down},
+                {"checked": control.checked},
+                {"focused": control.visualFocus},
+                {"highlighted": control.highlighted},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/RangeSlider.qml b/deployment_test/QtQuick/Controls.2/Imagine/RangeSlider.qml
new file mode 100644
index 0000000000000000000000000000000000000000..47d90cf3e1559b47adf7976b58394c2540cbbba2
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/RangeSlider.qml
@@ -0,0 +1,134 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.RangeSlider {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            first.implicitHandleWidth + leftPadding + rightPadding,
+                            second.implicitHandleWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             first.implicitHandleHeight + topPadding + bottomPadding,
+                             second.implicitHandleHeight + topPadding + bottomPadding)
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    first.handle: Image {
+        x: control.leftPadding + (control.horizontal ? control.first.visualPosition * (control.availableWidth - width) : (control.availableWidth - width) / 2)
+        y: control.topPadding + (control.horizontal ? (control.availableHeight - height) / 2 : control.first.visualPosition * (control.availableHeight - height))
+
+        source: Imagine.url + "rangeslider-handle"
+        ImageSelector on source {
+            states: [
+                {"first": true},
+                {"vertical": control.vertical},
+                {"horizontal": control.horizontal},
+                {"disabled": !control.enabled},
+                {"pressed": control.first.pressed},
+                {"focused": control.first.handle.activeFocus},
+                {"mirrored": control.mirrored},
+                {"hovered": control.first.hovered}
+            ]
+        }
+    }
+
+    second.handle: Image {
+        x: control.leftPadding + (control.horizontal ? control.second.visualPosition * (control.availableWidth - width) : (control.availableWidth - width) / 2)
+        y: control.topPadding + (control.horizontal ? (control.availableHeight - height) / 2 : control.second.visualPosition * (control.availableHeight - height))
+
+        source: Imagine.url + "rangeslider-handle"
+        ImageSelector on source {
+            states: [
+                {"second": true},
+                {"vertical": control.vertical},
+                {"horizontal": control.horizontal},
+                {"disabled": !control.enabled},
+                {"pressed": control.second.pressed},
+                {"focused": control.second.handle.activeFocus},
+                {"mirrored": control.mirrored},
+                {"hovered": control.second.hovered}
+            ]
+        }
+    }
+
+    background: NinePatchImage {
+        scale: control.horizontal && control.mirrored ? -1 : 1
+
+        source: Imagine.url + "rangeslider-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"vertical": control.vertical},
+                {"horizontal": control.horizontal},
+                {"disabled": !control.enabled},
+                {"focused": control.visualFocus},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+
+        NinePatchImage {
+            x: control.horizontal ? control.first.handle.width / 2 + control.first.position * (parent.width - control.first.handle.width) : (parent.width - width) / 2
+            y: control.horizontal ? (parent.height - height) / 2 : control.first.handle.height / 2 + control.second.visualPosition * (parent.height - control.first.handle.height)
+            width: control.horizontal ? control.second.position * (parent.width - control.first.handle.width) - control.first.position * (parent.width - control.first.handle.width) : parent.width
+            height: control.vertical ? control.second.position * (parent.height - control.first.handle.height) - control.first.position * (parent.height - control.first.handle.height): parent.height
+
+            source: Imagine.url + "rangeslider-progress"
+            NinePatchImageSelector on source {
+                states: [
+                    {"vertical": control.vertical},
+                    {"horizontal": control.horizontal},
+                    {"disabled": !control.enabled},
+                    {"focused": control.visualFocus},
+                    {"mirrored": control.mirrored},
+                    {"hovered": control.hovered}
+                ]
+            }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/RoundButton.qml b/deployment_test/QtQuick/Controls.2/Imagine/RoundButton.qml
new file mode 100644
index 0000000000000000000000000000000000000000..fe4cbb3663347fb819f1bdd7c34ef01839b5eac7
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/RoundButton.qml
@@ -0,0 +1,98 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.RoundButton {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    icon.width: 24
+    icon.height: 24
+    icon.color: control.enabled && control.flat && control.highlighted ? control.palette.highlight
+        : control.enabled && (control.down || control.checked || control.highlighted) && !control.flat
+        ? control.palette.brightText : control.flat ? control.palette.windowText : control.palette.buttonText
+
+    contentItem: IconLabel {
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.enabled && control.flat && control.highlighted ? control.palette.highlight
+            : control.enabled && (control.down || control.checked || control.highlighted) && !control.flat
+            ? control.palette.brightText : control.flat ? control.palette.windowText : control.palette.buttonText
+    }
+
+    background: NinePatchImage {
+        // ### TODO: radius?
+        source: Imagine.url + "roundbutton-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"pressed": control.down},
+                {"checked": control.checked},
+                {"checkable": control.checkable},
+                {"focused": control.visualFocus},
+                {"highlighted": control.highlighted},
+                {"flat": control.flat},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/ScrollBar.qml b/deployment_test/QtQuick/Controls.2/Imagine/ScrollBar.qml
new file mode 100644
index 0000000000000000000000000000000000000000..68772e12d607a053f6b35b4813a842309c9a284b
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/ScrollBar.qml
@@ -0,0 +1,119 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.ScrollBar {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    visible: control.policy !== T.ScrollBar.AlwaysOff
+    minimumSize: orientation == Qt.Horizontal ? height / width : width / height
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    contentItem: NinePatchImage {
+        width: control.availableWidth
+        height: control.availableHeight
+
+        source: Imagine.url + "scrollbar-handle"
+        NinePatchImageSelector on source {
+            states: [
+                {"vertical": control.vertical},
+                {"horizontal": control.horizontal},
+                {"disabled": !control.enabled},
+                {"interactive": control.interactive},
+                {"pressed": control.pressed},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+        opacity: 0.0
+    }
+
+    background: NinePatchImage {
+        source: Imagine.url + "scrollbar-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"vertical": control.vertical},
+                {"horizontal": control.horizontal},
+                {"disabled": !control.enabled},
+                {"interactive": control.interactive},
+                {"pressed": control.pressed},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+        opacity: 0.0
+    }
+
+    states: [
+        State {
+            name: "active"
+            when: control.policy === T.ScrollBar.AlwaysOn || (control.active && control.size < 1.0)
+        }
+    ]
+
+    transitions: [
+        Transition {
+            to: "active"
+            NumberAnimation { targets: [control.contentItem, control.background]; property: "opacity"; to: 1.0 }
+        },
+        Transition {
+            from: "active"
+            SequentialAnimation {
+                PropertyAction{ targets: [control.contentItem, control.background]; property: "opacity"; value: 1.0 }
+                PauseAnimation { duration: 3000 }
+                NumberAnimation { targets: [control.contentItem, control.background]; property: "opacity"; to: 0.0 }
+            }
+        }
+    ]
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/ScrollIndicator.qml b/deployment_test/QtQuick/Controls.2/Imagine/ScrollIndicator.qml
new file mode 100644
index 0000000000000000000000000000000000000000..896cd87685b338a4b53cc668917a89caf96985d3
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/ScrollIndicator.qml
@@ -0,0 +1,111 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.ScrollIndicator {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    contentItem: NinePatchImage {
+        width: control.availableWidth
+        height: control.availableHeight
+
+        source: Imagine.url + "scrollindicator-handle"
+        NinePatchImageSelector on source {
+            states: [
+                {"vertical": control.vertical},
+                {"horizontal": control.horizontal},
+                {"disabled": !control.enabled},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+        opacity: 0.0
+    }
+
+    background: NinePatchImage {
+        source: Imagine.url + "scrollindicator-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"vertical": control.vertical},
+                {"horizontal": control.horizontal},
+                {"disabled": !control.enabled},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+        opacity: 0.0
+    }
+
+    states: [
+        State {
+            name: "active"
+            when: (control.active && control.size < 1.0)
+        }
+    ]
+
+    transitions: [
+        Transition {
+            to: "active"
+            NumberAnimation { targets: [contentItem, control.background]; property: "opacity"; to: 1.0 }
+        },
+        Transition {
+            from: "active"
+            SequentialAnimation {
+                PauseAnimation { duration: 5000 }
+                NumberAnimation { targets: [contentItem, control.background]; property: "opacity"; to: 0.0 }
+            }
+        }
+    ]
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/Slider.qml b/deployment_test/QtQuick/Controls.2/Imagine/Slider.qml
new file mode 100644
index 0000000000000000000000000000000000000000..fe9c338880dabf36d33861ecf1193df3ae7df49a
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/Slider.qml
@@ -0,0 +1,120 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.Slider {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitHandleWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitHandleHeight + topPadding + bottomPadding)
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    handle: Image {
+        x: Math.round(control.leftPadding + (control.horizontal ? control.visualPosition * (control.availableWidth - width) : (control.availableWidth - width) / 2))
+        y: Math.round(control.topPadding + (control.horizontal ? (control.availableHeight - height) / 2 : control.visualPosition * (control.availableHeight - height)))
+
+        source: Imagine.url + "slider-handle"
+        ImageSelector on source {
+            states: [
+                {"vertical": control.vertical},
+                {"horizontal": control.horizontal},
+                {"disabled": !control.enabled},
+                {"pressed": control.pressed},
+                {"focused": control.visualFocus},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+    }
+
+    background: NinePatchImage {
+        scale: control.horizontal && control.mirrored ? -1 : 1
+
+        source: Imagine.url + "slider-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"vertical": control.vertical},
+                {"horizontal": control.horizontal},
+                {"disabled": !control.enabled},
+                {"pressed": control.down},
+                {"focused": control.visualFocus},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+
+        NinePatchImage {
+            x: control.horizontal ? 0 : (parent.width - width) / 2
+            y: control.horizontal
+               ? (parent.height - height) / 2
+               : control.handle.height / 2 + control.visualPosition * (parent.height - control.handle.height)
+            width: control.horizontal
+                ? control.handle.width / 2 + control.position * (parent.width - control.handle.width)
+                : parent.width
+            height: control.vertical
+                ? control.handle.height / 2 + control.position * (parent.height - control.handle.height)
+                : parent.height
+
+            source: Imagine.url + "slider-progress"
+            NinePatchImageSelector on source {
+                states: [
+                    {"vertical": control.vertical},
+                    {"horizontal": control.horizontal},
+                    {"disabled": !control.enabled},
+                    {"pressed": control.down},
+                    {"focused": control.visualFocus},
+                    {"mirrored": control.mirrored},
+                    {"hovered": control.hovered}
+                ]
+            }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/SpinBox.qml b/deployment_test/QtQuick/Controls.2/Imagine/SpinBox.qml
new file mode 100644
index 0000000000000000000000000000000000000000..61135806769cf96a8cd3d2beb8364c49e3276c14
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/SpinBox.qml
@@ -0,0 +1,152 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.SpinBox {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentItem.implicitWidth + 2 * padding +
+                            up.implicitIndicatorWidth +
+                            down.implicitIndicatorWidth)
+    implicitHeight: Math.max(implicitContentHeight + topPadding + bottomPadding,
+                             implicitBackgroundHeight,
+                             up.implicitIndicatorHeight,
+                             down.implicitIndicatorHeight)
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: (background ? background.leftPadding : 0) + (control.mirrored ? (up.indicator ? up.indicator.width : 0) : (down.indicator ? down.indicator.width : 0))
+    rightPadding: (background ? background.rightPadding : 0) + (control.mirrored ? (down.indicator ? down.indicator.width : 0) : (up.indicator ? up.indicator.width : 0))
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    validator: IntValidator {
+        locale: control.locale.name
+        bottom: Math.min(control.from, control.to)
+        top: Math.max(control.from, control.to)
+    }
+
+    contentItem: TextInput {
+        z: 2
+        text: control.displayText
+        opacity: control.enabled ? 1 : 0.3
+
+        font: control.font
+        color: control.palette.text
+        selectionColor: control.palette.highlight
+        selectedTextColor: control.palette.highlightedText
+        horizontalAlignment: Qt.AlignHCenter
+        verticalAlignment: Qt.AlignVCenter
+
+        readOnly: !control.editable
+        validator: control.validator
+        inputMethodHints: control.inputMethodHints
+
+        NinePatchImage {
+            z: -1
+            width: control.width
+            height: control.height
+            visible: control.editable
+
+            source: Imagine.url + "spinbox-editor"
+            NinePatchImageSelector on source {
+                states: [
+                    {"disabled": !control.enabled},
+                    {"focused": control.activeFocus},
+                    {"mirrored": control.mirrored},
+                    {"hovered": control.hovered}
+                ]
+            }
+        }
+    }
+
+    up.indicator: NinePatchImage {
+        x: control.mirrored ? 0 : parent.width - width
+        height: parent.height
+
+        source: Imagine.url + "spinbox-indicator"
+        NinePatchImageSelector on source {
+            states: [
+                {"up": true},
+                {"disabled": !control.up.indicator.enabled},
+                {"editable": control.editable},
+                {"pressed": control.up.pressed},
+                {"focused": control.activeFocus},
+                {"mirrored": control.mirrored},
+                {"hovered": control.up.hovered}
+            ]
+        }
+    }
+
+    down.indicator: NinePatchImage {
+        x: control.mirrored ? parent.width - width : 0
+        height: parent.height
+
+        source: Imagine.url + "spinbox-indicator"
+        NinePatchImageSelector on source {
+            states: [
+                {"down": true},
+                {"disabled": !control.down.indicator.enabled},
+                {"editable": control.editable},
+                {"pressed": control.down.pressed},
+                {"focused": control.activeFocus},
+                {"mirrored": control.mirrored},
+                {"hovered": control.down.hovered}
+            ]
+        }
+    }
+
+    background: NinePatchImage {
+        source: Imagine.url + "spinbox-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"editable": control.editable},
+                {"focused": control.activeFocus},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/SplitView.qml b/deployment_test/QtQuick/Controls.2/Imagine/SplitView.qml
new file mode 100644
index 0000000000000000000000000000000000000000..a4a858f430d3fc68df7244283bb85e9421bff03b
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/SplitView.qml
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.13
+import QtQuick.Templates 2.13 as T
+import QtQuick.Controls.Imagine 2.13
+import QtQuick.Controls.Imagine.impl 2.13
+
+T.SplitView {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    handle: NinePatchImage {
+        source: Imagine.url + "splitview-handle"
+        NinePatchImageSelector on source {
+            states: [
+                {"vertical": control.orientation === Qt.Vertical},
+                {"horizontal":control.orientation === Qt.Horizontal},
+                {"disabled": !control.enabled},
+                {"pressed": T.SplitHandle.pressed},
+                {"mirrored": control.mirrored},
+                {"hovered": T.SplitHandle.hovered}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/StackView.qml b/deployment_test/QtQuick/Controls.2/Imagine/StackView.qml
new file mode 100644
index 0000000000000000000000000000000000000000..407b1d15dd784cfb87133577a6dc1d464e148841
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/StackView.qml
@@ -0,0 +1,91 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.StackView {
+    id: control
+
+    implicitWidth: implicitBackgroundWidth
+    implicitHeight: implicitBackgroundHeight
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    popEnter: Transition {
+        XAnimator { from: (control.mirrored ? -1 : 1) * -control.width; to: 0; duration: 400; easing.type: Easing.OutCubic }
+    }
+
+    popExit: Transition {
+        XAnimator { from: 0; to: (control.mirrored ? -1 : 1) * control.width; duration: 400; easing.type: Easing.OutCubic }
+    }
+
+    pushEnter: Transition {
+        XAnimator { from: (control.mirrored ? -1 : 1) * control.width; to: 0; duration: 400; easing.type: Easing.OutCubic }
+    }
+
+    pushExit: Transition {
+        XAnimator { from: 0; to: (control.mirrored ? -1 : 1) * -control.width; duration: 400; easing.type: Easing.OutCubic }
+    }
+
+    replaceEnter: Transition {
+        XAnimator { from: (control.mirrored ? -1 : 1) * control.width; to: 0; duration: 400; easing.type: Easing.OutCubic }
+    }
+
+    replaceExit: Transition {
+        XAnimator { from: 0; to: (control.mirrored ? -1 : 1) * -control.width; duration: 400; easing.type: Easing.OutCubic }
+    }
+
+    background: NinePatchImage {
+        source: Imagine.url + "stackview-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"mirrored": control.mirrored}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/SwipeDelegate.qml b/deployment_test/QtQuick/Controls.2/Imagine/SwipeDelegate.qml
new file mode 100644
index 0000000000000000000000000000000000000000..3850253f63314c609a741fb42c65933220103bb1
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/SwipeDelegate.qml
@@ -0,0 +1,96 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.SwipeDelegate {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    spacing: 12 // ###
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    icon.width: 24
+    icon.height: 24
+    icon.color: control.palette.text
+
+    swipe.transition: Transition { SmoothedAnimation { velocity: 3; easing.type: Easing.InOutCubic } }
+
+    contentItem: IconLabel {
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+        alignment: control.display === IconLabel.IconOnly || control.display === IconLabel.TextUnderIcon ? Qt.AlignCenter : Qt.AlignLeft
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.palette.text
+    }
+
+    background: NinePatchImage {
+        source: Imagine.url + "swipedelegate-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"pressed": control.down},
+                {"focused": control.visualFocus},
+                {"highlighted": control.highlighted},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/SwipeView.qml b/deployment_test/QtQuick/Controls.2/Imagine/SwipeView.qml
new file mode 100644
index 0000000000000000000000000000000000000000..70d65fef56d6d17f0f1d40ec3730351d5ac93286
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/SwipeView.qml
@@ -0,0 +1,90 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.SwipeView {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    contentItem: ListView {
+        model: control.contentModel
+        interactive: control.interactive
+        currentIndex: control.currentIndex
+        focus: control.focus
+
+        spacing: control.spacing
+        orientation: control.orientation
+        snapMode: ListView.SnapOneItem
+        boundsBehavior: Flickable.StopAtBounds
+
+        highlightRangeMode: ListView.StrictlyEnforceRange
+        preferredHighlightBegin: 0
+        preferredHighlightEnd: 0
+        highlightMoveDuration: 250
+    }
+
+    background: NinePatchImage {
+        source: Imagine.url + "swipeview-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"vertical": control.vertical},
+                {"horizontal": control.horizontal},
+                {"disabled": !control.enabled},
+                {"interactive": control.interactive},
+                {"focused": control.contentItem.activeFocus},
+                {"mirrored": control.mirrored}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/Switch.qml b/deployment_test/QtQuick/Controls.2/Imagine/Switch.qml
new file mode 100644
index 0000000000000000000000000000000000000000..50b407acb49d75f6152973c196d3eeb7c0952570
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/Switch.qml
@@ -0,0 +1,134 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.Switch {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    spacing: 6 // ###
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    indicator: NinePatchImage {
+        x: control.text ? (control.mirrored ? control.width - width - control.rightPadding : control.leftPadding) : control.leftPadding + (control.availableWidth - width) / 2
+        y: control.topPadding + (control.availableHeight - height) / 2
+        width: Math.max(implicitWidth, handle.leftPadding && handle.rightPadding ? handle.implicitWidth : 2 * handle.implicitWidth)
+        height: Math.max(implicitHeight, handle.implicitHeight)
+
+        source: Imagine.url + "switch-indicator"
+        NinePatchImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"pressed": control.down},
+                {"checked": control.checked},
+                {"focused": control.visualFocus},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+
+        property NinePatchImage handle: NinePatchImage {
+            readonly property real minPos: parent.leftPadding - leftPadding
+            readonly property real maxPos: parent.width - width + rightPadding - parent.rightPadding
+            readonly property real dragPos: control.visualPosition * parent.width - (width / 2)
+
+            parent: control.indicator
+
+            x: Math.max(minPos, Math.min(maxPos, control.visualPosition * parent.width - (width / 2)))
+            y: (parent.height - height) / 2
+
+            source: Imagine.url + "switch-handle"
+            NinePatchImageSelector on source {
+                states: [
+                    {"disabled": !control.enabled},
+                    {"pressed": control.down},
+                    {"checked": control.checked},
+                    {"focused": control.visualFocus},
+                    {"mirrored": control.mirrored},
+                    {"hovered": control.hovered}
+                ]
+            }
+
+            Behavior on x {
+                enabled: !control.down
+                SmoothedAnimation { velocity: 200 }
+            }
+        }
+    }
+
+    contentItem: Text {
+        leftPadding: control.indicator && !control.mirrored ? control.indicator.width + control.spacing : 0
+        rightPadding: control.indicator && control.mirrored ? control.indicator.width + control.spacing : 0
+
+        text: control.text
+        font: control.font
+        color: control.palette.windowText
+        elide: Text.ElideRight
+        verticalAlignment: Text.AlignVCenter
+    }
+
+    background: NinePatchImage {
+        source: Imagine.url + "switch-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"pressed": control.down},
+                {"checked": control.checked},
+                {"focused": control.visualFocus},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/SwitchDelegate.qml b/deployment_test/QtQuick/Controls.2/Imagine/SwitchDelegate.qml
new file mode 100644
index 0000000000000000000000000000000000000000..73e5aac01421a2cc010dddd0a7c0bcaee53a6882
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/SwitchDelegate.qml
@@ -0,0 +1,147 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.SwitchDelegate {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    spacing: 12 // ###
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    icon.width: 24
+    icon.height: 24
+    icon.color: control.palette.text
+
+    indicator: NinePatchImage {
+        x: control.text ? (control.mirrored ? control.leftPadding : control.width - width - control.rightPadding) : control.leftPadding + (control.availableWidth - width) / 2
+        y: control.topPadding + (control.availableHeight - height) / 2
+        width: Math.max(implicitWidth, handle.leftPadding && handle.rightPadding ? handle.implicitWidth : 2 * handle.implicitWidth)
+        height: Math.max(implicitHeight, handle.implicitHeight)
+
+        source: Imagine.url + "switchdelegate-indicator"
+        NinePatchImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"pressed": control.down},
+                {"checked": control.checked},
+                {"focused": control.visualFocus},
+                {"highlighted": control.highlighted},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+
+        property NinePatchImage handle: NinePatchImage {
+            readonly property real minPos: parent.leftPadding - leftPadding
+            readonly property real maxPos: parent.width - width + rightPadding - parent.rightPadding
+            readonly property real dragPos: control.visualPosition * parent.width - (width / 2)
+
+            parent: control.indicator
+
+            x: Math.max(minPos, Math.min(maxPos, control.visualPosition * parent.width - (width / 2)))
+            y: (parent.height - height) / 2
+
+            source: Imagine.url + "switchdelegate-handle"
+            NinePatchImageSelector on source {
+                states: [
+                    {"disabled": !control.enabled},
+                    {"pressed": control.down},
+                    {"checked": control.checked},
+                    {"focused": control.visualFocus},
+                    {"highlighted": control.highlighted},
+                    {"mirrored": control.mirrored},
+                    {"hovered": control.hovered}
+                ]
+            }
+
+            Behavior on x {
+                enabled: !control.down
+                SmoothedAnimation { velocity: 200 }
+            }
+        }
+    }
+
+    contentItem: IconLabel {
+        leftPadding: control.mirrored ? control.indicator.width + control.spacing : 0
+        rightPadding: !control.mirrored ? control.indicator.width + control.spacing : 0
+
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+        alignment: control.display === IconLabel.IconOnly || control.display === IconLabel.TextUnderIcon ? Qt.AlignCenter : Qt.AlignLeft
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.palette.text
+    }
+
+    background: NinePatchImage {
+        source: Imagine.url + "switchdelegate-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"pressed": control.down},
+                {"checked": control.checked},
+                {"focused": control.visualFocus},
+                {"highlighted": control.highlighted},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/TabBar.qml b/deployment_test/QtQuick/Controls.2/Imagine/TabBar.qml
new file mode 100644
index 0000000000000000000000000000000000000000..69516e03e47cbb1458363b47d6f7e3946f7671ef
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/TabBar.qml
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.TabBar {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    contentItem: ListView {
+        model: control.contentModel
+        currentIndex: control.currentIndex
+
+        spacing: control.spacing
+        orientation: ListView.Horizontal
+        boundsBehavior: Flickable.StopAtBounds
+        flickableDirection: Flickable.AutoFlickIfNeeded
+        snapMode: ListView.SnapToItem
+
+        highlightMoveDuration: 0
+        highlightRangeMode: ListView.ApplyRange
+        preferredHighlightBegin: 48
+        preferredHighlightEnd: width - 48
+    }
+
+    background: NinePatchImage {
+        source: Imagine.url + "tabbar-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"header": control.position === T.TabBar.Header },
+                {"footer": control.position === T.TabBar.Footer },
+                {"mirrored": control.mirrored}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/TabButton.qml b/deployment_test/QtQuick/Controls.2/Imagine/TabButton.qml
new file mode 100644
index 0000000000000000000000000000000000000000..1cdcfc4bd4e5e54b4d2825ebcca97c2b9e2f447a
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/TabButton.qml
@@ -0,0 +1,92 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.TabButton {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    spacing: 6 // ###
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    icon.width: 24
+    icon.height: 24
+    icon.color: control.palette.buttonText
+
+    contentItem: IconLabel {
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.palette.buttonText
+    }
+
+    background: NinePatchImage {
+        source: Imagine.url + "tabbutton-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"pressed": control.down},
+                {"checked": control.checked},
+                {"focused": control.visualFocus},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/TextArea.qml b/deployment_test/QtQuick/Controls.2/Imagine/TextArea.qml
new file mode 100644
index 0000000000000000000000000000000000000000..c7505b5209a20cc5c5a78bfee9e9f77322466bfe
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/TextArea.qml
@@ -0,0 +1,97 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.TextArea {
+    id: control
+
+    implicitWidth: Math.max(contentWidth + leftPadding + rightPadding,
+                            implicitBackgroundWidth + leftInset + rightInset,
+                            placeholder.implicitWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(contentHeight + topPadding + bottomPadding,
+                             implicitBackgroundHeight + topInset + bottomInset,
+                             placeholder.implicitHeight + topPadding + bottomPadding)
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    color: control.palette.text
+    selectionColor: control.palette.highlight
+    selectedTextColor: control.palette.highlightedText
+    verticalAlignment: Qt.AlignVCenter
+    placeholderTextColor: Color.transparent(control.color, 0.5)
+
+    PlaceholderText {
+        id: placeholder
+        x: control.leftPadding
+        y: control.topPadding
+        width: control.width - (control.leftPadding + control.rightPadding)
+        height: control.height - (control.topPadding + control.bottomPadding)
+
+        text: control.placeholderText
+        font: control.font
+        color: control.placeholderTextColor
+        verticalAlignment: control.verticalAlignment
+        visible: !control.length && !control.preeditText && (!control.activeFocus || control.horizontalAlignment !== Qt.AlignHCenter)
+        elide: Text.ElideRight
+        renderType: control.renderType
+    }
+
+    background: NinePatchImage {
+        source: Imagine.url + "textarea-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"focused": control.activeFocus},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/TextField.qml b/deployment_test/QtQuick/Controls.2/Imagine/TextField.qml
new file mode 100644
index 0000000000000000000000000000000000000000..3ff0ad4431a7bdad4a406a4544b17767ef3cdc6b
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/TextField.qml
@@ -0,0 +1,96 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.TextField {
+    id: control
+
+    implicitWidth: implicitBackgroundWidth + leftInset + rightInset
+                   || Math.max(contentWidth, placeholder.implicitWidth) + leftPadding + rightPadding
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding,
+                             placeholder.implicitHeight + topPadding + bottomPadding)
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    color: control.palette.text
+    selectionColor: control.palette.highlight
+    selectedTextColor: control.palette.highlightedText
+    placeholderTextColor: Color.transparent(control.color, 0.5)
+    verticalAlignment: Qt.AlignVCenter
+
+    PlaceholderText {
+        id: placeholder
+        x: control.leftPadding
+        y: control.topPadding
+        width: control.width - (control.leftPadding + control.rightPadding)
+        height: control.height - (control.topPadding + control.bottomPadding)
+
+        text: control.placeholderText
+        font: control.font
+        color: control.placeholderTextColor
+        verticalAlignment: control.verticalAlignment
+        visible: !control.length && !control.preeditText && (!control.activeFocus || control.horizontalAlignment !== Qt.AlignHCenter)
+        elide: Text.ElideRight
+        renderType: control.renderType
+    }
+
+    background: NinePatchImage {
+        source: Imagine.url + "textfield-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"focused": control.activeFocus},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/ToolBar.qml b/deployment_test/QtQuick/Controls.2/Imagine/ToolBar.qml
new file mode 100644
index 0000000000000000000000000000000000000000..99bcd3ba975fb65f6c2a379c64283183778fbeb5
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/ToolBar.qml
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.ToolBar {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    background: NinePatchImage {
+        source: Imagine.url + "toolbar-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"header": control.position === T.ToolBar.Header },
+                {"footer": control.position === T.ToolBar.Footer },
+                {"mirrored": control.mirrored}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/ToolButton.qml b/deployment_test/QtQuick/Controls.2/Imagine/ToolButton.qml
new file mode 100644
index 0000000000000000000000000000000000000000..cc22f88d2942a4616363d86e027e9690a7c501e4
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/ToolButton.qml
@@ -0,0 +1,95 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.ToolButton {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    spacing: 6 // ###
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    icon.width: 24
+    icon.height: 24
+    icon.color: control.palette.buttonText
+
+    contentItem: IconLabel {
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.palette.buttonText
+    }
+
+    background: NinePatchImage {
+        source: Imagine.url + "toolbutton-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"pressed": control.down},
+                {"checked": control.checked},
+                {"checkable": control.checkable},
+                {"focused": control.visualFocus},
+                {"highlighted": control.highlighted},
+                {"flat": control.flat},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/ToolSeparator.qml b/deployment_test/QtQuick/Controls.2/Imagine/ToolSeparator.qml
new file mode 100644
index 0000000000000000000000000000000000000000..c0887e4d62d9e1839c0210ed0e3f00d5614e616f
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/ToolSeparator.qml
@@ -0,0 +1,83 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.ToolSeparator {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    contentItem: NinePatchImage {
+        source: Imagine.url + "toolseparator-separator"
+        NinePatchImageSelector on source {
+            states: [
+                {"vertical": control.vertical},
+                {"horizontal": control.horizontal},
+                {"disabled": !control.enabled},
+                {"mirrored": control.mirrored}
+            ]
+        }
+    }
+
+    background: NinePatchImage {
+        source: Imagine.url + "toolseparator-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"vertical": control.vertical},
+                {"horizontal": control.horizontal},
+                {"disabled": !control.enabled},
+                {"mirrored": control.mirrored}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/ToolTip.qml b/deployment_test/QtQuick/Controls.2/Imagine/ToolTip.qml
new file mode 100644
index 0000000000000000000000000000000000000000..21d75ebcb5a6cb8e18c51ed3a18f6b447b125a7d
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/ToolTip.qml
@@ -0,0 +1,85 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.ToolTip {
+    id: control
+
+    x: parent ? (parent.width - implicitWidth) / 2 : 0 - (background ? background.leftInset : 0)
+    y: -implicitHeight - (background ? background.topInset : 0)
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    topMargin: background ? background.topInset : 0
+    leftMargin: background ? background.leftInset : 0
+    rightMargin: background ? background.rightInset : 0
+    bottomMargin: background ? background.bottomInset : 0
+
+    topPadding: background ? background.topPadding : 0
+    leftPadding: background ? background.leftPadding : 0
+    rightPadding: background ? background.rightPadding : 0
+    bottomPadding: background ? background.bottomPadding : 0
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    closePolicy: T.Popup.CloseOnEscape | T.Popup.CloseOnPressOutsideParent | T.Popup.CloseOnReleaseOutsideParent
+
+    contentItem: Text {
+        text: control.text
+        font: control.font
+        wrapMode: Text.Wrap
+        color: control.palette.toolTipText
+    }
+
+    background: NinePatchImage {
+        source: Imagine.url + "tooltip-background"
+        NinePatchImageSelector on source {
+            states: [
+                // ###
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/Tumbler.qml b/deployment_test/QtQuick/Controls.2/Imagine/Tumbler.qml
new file mode 100644
index 0000000000000000000000000000000000000000..12025cc5beebdd4fa9d11d393a2ecf0890c18680
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/Tumbler.qml
@@ -0,0 +1,94 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Imagine 2.12
+import QtQuick.Controls.Imagine.impl 2.12
+
+T.Tumbler {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding) || 60 // ### remove 60 in Qt 6
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding) || 200 // ### remove 200 in Qt 6
+
+    topInset: background ? -background.topInset || 0 : 0
+    leftInset: background ? -background.leftInset || 0 : 0
+    rightInset: background ? -background.rightInset || 0 : 0
+    bottomInset: background ? -background.bottomInset || 0 : 0
+
+    delegate: Text {
+        text: modelData
+        font: control.font
+        color: control.palette.text
+        opacity: (1.0 - Math.abs(Tumbler.displacement) / (control.visibleItemCount / 2)) * (control.enabled ? 1 : 0.6)
+        horizontalAlignment: Text.AlignHCenter
+        verticalAlignment: Text.AlignVCenter
+    }
+
+    contentItem: TumblerView {
+        implicitWidth: 60
+        implicitHeight: 200
+        model: control.model
+        delegate: control.delegate
+        path: Path {
+            startX: control.contentItem.width / 2
+            startY: -control.contentItem.delegateHeight / 2
+            PathLine {
+                x: control.contentItem.width / 2
+                y: (control.visibleItemCount + 1) * control.contentItem.delegateHeight - control.contentItem.delegateHeight / 2
+            }
+        }
+
+        property real delegateHeight: control.availableHeight / control.visibleItemCount
+    }
+
+    background: NinePatchImage {
+        source: Imagine.url + "tumbler-background"
+        NinePatchImageSelector on source {
+            states: [
+                {"disabled": !control.enabled},
+                {"focused": control.visualFocus},
+                {"mirrored": control.mirrored},
+                {"hovered": control.hovered}
+            ]
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/VerticalHeaderView.qml b/deployment_test/QtQuick/Controls.2/Imagine/VerticalHeaderView.qml
new file mode 100644
index 0000000000000000000000000000000000000000..3fc9ca5acea3b9059627fe2a71f9924db097876b
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/VerticalHeaderView.qml
@@ -0,0 +1,68 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.15
+import QtQuick.Controls 2.15
+import QtQuick.Templates 2.15 as T
+
+T.VerticalHeaderView {
+    id: control
+
+    implicitWidth: contentWidth
+    implicitHeight: syncView ? syncView.height : 0
+
+    delegate: Rectangle {
+        // Qt6: add cellPadding (and font etc) as public API in headerview
+        readonly property real cellPadding: 8
+
+        implicitWidth: Math.max(control.width, text.implicitWidth + (cellPadding * 2))
+        implicitHeight: text.implicitHeight + (cellPadding * 2)
+        color: "#f6f6f6"
+        border.color: "#e4e4e4"
+
+        Text {
+            id: text
+            text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole]
+                                        : model[control.textRole])
+                                   : modelData
+            width: parent.width
+            height: parent.height
+            horizontalAlignment: Text.AlignHCenter
+            verticalAlignment: Text.AlignVCenter
+            color: "#ff26282a"
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/plugins.qmltypes b/deployment_test/QtQuick/Controls.2/Imagine/plugins.qmltypes
new file mode 100644
index 0000000000000000000000000000000000000000..785b6dba07422bd1e913a3e3c89267de52995d3f
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/plugins.qmltypes
@@ -0,0 +1,347 @@
+import QtQuick.tooling 1.2
+
+// This file describes the plugin-supplied types contained in the library.
+// It is used for QML tooling purposes only.
+//
+// This file was auto-generated by:
+// 'qmlplugindump -nonrelocatable -dependencies dependencies.json QtQuick.Controls.Imagine 2.15'
+
+Module {
+    dependencies: ["QtQuick.Controls 2.0"]
+    Component {
+        name: "QQuickAnimatedImageSelector"
+        prototype: "QQuickImageSelector"
+        exports: ["QtQuick.Controls.Imagine.impl/AnimatedImageSelector 2.3"]
+        exportMetaObjectRevisions: [0]
+    }
+    Component { name: "QQuickAttachedObject"; prototype: "QObject" }
+    Component {
+        name: "QQuickImage"
+        defaultProperty: "data"
+        prototype: "QQuickImageBase"
+        Enum {
+            name: "HAlignment"
+            values: {
+                "AlignLeft": 1,
+                "AlignRight": 2,
+                "AlignHCenter": 4
+            }
+        }
+        Enum {
+            name: "VAlignment"
+            values: {
+                "AlignTop": 32,
+                "AlignBottom": 64,
+                "AlignVCenter": 128
+            }
+        }
+        Enum {
+            name: "FillMode"
+            values: {
+                "Stretch": 0,
+                "PreserveAspectFit": 1,
+                "PreserveAspectCrop": 2,
+                "Tile": 3,
+                "TileVertically": 4,
+                "TileHorizontally": 5,
+                "Pad": 6
+            }
+        }
+        Property { name: "fillMode"; type: "FillMode" }
+        Property { name: "paintedWidth"; type: "double"; isReadonly: true }
+        Property { name: "paintedHeight"; type: "double"; isReadonly: true }
+        Property { name: "horizontalAlignment"; type: "HAlignment" }
+        Property { name: "verticalAlignment"; type: "VAlignment" }
+        Property { name: "mipmap"; revision: 3; type: "bool" }
+        Property { name: "autoTransform"; revision: 5; type: "bool" }
+        Property { name: "sourceClipRect"; revision: 15; type: "QRectF" }
+        Signal { name: "paintedGeometryChanged" }
+        Signal {
+            name: "horizontalAlignmentChanged"
+            Parameter { name: "alignment"; type: "HAlignment" }
+        }
+        Signal {
+            name: "verticalAlignmentChanged"
+            Parameter { name: "alignment"; type: "VAlignment" }
+        }
+        Signal {
+            name: "mipmapChanged"
+            revision: 3
+            Parameter { type: "bool" }
+        }
+        Signal { name: "autoTransformChanged"; revision: 5 }
+    }
+    Component {
+        name: "QQuickImageBase"
+        defaultProperty: "data"
+        prototype: "QQuickImplicitSizeItem"
+        Enum {
+            name: "LoadPixmapOptions"
+            values: {
+                "NoOption": 0,
+                "HandleDPR": 1,
+                "UseProviderOptions": 2
+            }
+        }
+        Enum {
+            name: "Status"
+            values: {
+                "Null": 0,
+                "Ready": 1,
+                "Loading": 2,
+                "Error": 3
+            }
+        }
+        Property { name: "status"; type: "Status"; isReadonly: true }
+        Property { name: "source"; type: "QUrl" }
+        Property { name: "progress"; type: "double"; isReadonly: true }
+        Property { name: "asynchronous"; type: "bool" }
+        Property { name: "cache"; type: "bool" }
+        Property { name: "sourceSize"; type: "QSize" }
+        Property { name: "mirror"; type: "bool" }
+        Property { name: "currentFrame"; revision: 14; type: "int" }
+        Property { name: "frameCount"; revision: 14; type: "int"; isReadonly: true }
+        Property { name: "colorSpace"; revision: 15; type: "QColorSpace" }
+        Signal {
+            name: "sourceChanged"
+            Parameter { type: "QUrl" }
+        }
+        Signal {
+            name: "statusChanged"
+            Parameter { type: "QQuickImageBase::Status" }
+        }
+        Signal {
+            name: "progressChanged"
+            Parameter { name: "progress"; type: "double" }
+        }
+        Signal { name: "currentFrameChanged"; revision: 14 }
+        Signal { name: "frameCountChanged"; revision: 14 }
+        Signal { name: "sourceClipRectChanged"; revision: 15 }
+        Signal { name: "colorSpaceChanged"; revision: 15 }
+    }
+    Component {
+        name: "QQuickImageSelector"
+        prototype: "QObject"
+        exports: ["QtQuick.Controls.Imagine.impl/ImageSelector 2.3"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "source"; type: "QUrl"; isReadonly: true }
+        Property { name: "name"; type: "string" }
+        Property { name: "path"; type: "string" }
+        Property { name: "states"; type: "QVariantList" }
+        Property { name: "separator"; type: "string" }
+        Property { name: "cache"; type: "bool" }
+    }
+    Component {
+        name: "QQuickImagineStyle"
+        prototype: "QQuickAttachedObject"
+        exports: ["QtQuick.Controls.Imagine/Imagine 2.3"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        Property { name: "path"; type: "string" }
+        Property { name: "url"; type: "QUrl"; isReadonly: true }
+    }
+    Component {
+        name: "QQuickImplicitSizeItem"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        Property { name: "implicitWidth"; type: "double"; isReadonly: true }
+        Property { name: "implicitHeight"; type: "double"; isReadonly: true }
+    }
+    Component {
+        name: "QQuickItem"
+        defaultProperty: "data"
+        prototype: "QObject"
+        Enum {
+            name: "Flags"
+            values: {
+                "ItemClipsChildrenToShape": 1,
+                "ItemAcceptsInputMethod": 2,
+                "ItemIsFocusScope": 4,
+                "ItemHasContents": 8,
+                "ItemAcceptsDrops": 16
+            }
+        }
+        Enum {
+            name: "TransformOrigin"
+            values: {
+                "TopLeft": 0,
+                "Top": 1,
+                "TopRight": 2,
+                "Left": 3,
+                "Center": 4,
+                "Right": 5,
+                "BottomLeft": 6,
+                "Bottom": 7,
+                "BottomRight": 8
+            }
+        }
+        Property { name: "parent"; type: "QQuickItem"; isPointer: true }
+        Property { name: "data"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "resources"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "children"; type: "QQuickItem"; isList: true; isReadonly: true }
+        Property { name: "x"; type: "double" }
+        Property { name: "y"; type: "double" }
+        Property { name: "z"; type: "double" }
+        Property { name: "width"; type: "double" }
+        Property { name: "height"; type: "double" }
+        Property { name: "opacity"; type: "double" }
+        Property { name: "enabled"; type: "bool" }
+        Property { name: "visible"; type: "bool" }
+        Property { name: "visibleChildren"; type: "QQuickItem"; isList: true; isReadonly: true }
+        Property { name: "states"; type: "QQuickState"; isList: true; isReadonly: true }
+        Property { name: "transitions"; type: "QQuickTransition"; isList: true; isReadonly: true }
+        Property { name: "state"; type: "string" }
+        Property { name: "childrenRect"; type: "QRectF"; isReadonly: true }
+        Property { name: "anchors"; type: "QQuickAnchors"; isReadonly: true; isPointer: true }
+        Property { name: "left"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "right"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "horizontalCenter"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "top"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "bottom"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "verticalCenter"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "baseline"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "baselineOffset"; type: "double" }
+        Property { name: "clip"; type: "bool" }
+        Property { name: "focus"; type: "bool" }
+        Property { name: "activeFocus"; type: "bool"; isReadonly: true }
+        Property { name: "activeFocusOnTab"; revision: 1; type: "bool" }
+        Property { name: "rotation"; type: "double" }
+        Property { name: "scale"; type: "double" }
+        Property { name: "transformOrigin"; type: "TransformOrigin" }
+        Property { name: "transformOriginPoint"; type: "QPointF"; isReadonly: true }
+        Property { name: "transform"; type: "QQuickTransform"; isList: true; isReadonly: true }
+        Property { name: "smooth"; type: "bool" }
+        Property { name: "antialiasing"; type: "bool" }
+        Property { name: "implicitWidth"; type: "double" }
+        Property { name: "implicitHeight"; type: "double" }
+        Property { name: "containmentMask"; revision: 11; type: "QObject"; isPointer: true }
+        Property { name: "layer"; type: "QQuickItemLayer"; isReadonly: true; isPointer: true }
+        Signal {
+            name: "childrenRectChanged"
+            Parameter { type: "QRectF" }
+        }
+        Signal {
+            name: "baselineOffsetChanged"
+            Parameter { type: "double" }
+        }
+        Signal {
+            name: "stateChanged"
+            Parameter { type: "string" }
+        }
+        Signal {
+            name: "focusChanged"
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "activeFocusChanged"
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "activeFocusOnTabChanged"
+            revision: 1
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "parentChanged"
+            Parameter { type: "QQuickItem"; isPointer: true }
+        }
+        Signal {
+            name: "transformOriginChanged"
+            Parameter { type: "TransformOrigin" }
+        }
+        Signal {
+            name: "smoothChanged"
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "antialiasingChanged"
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "clipChanged"
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "windowChanged"
+            revision: 1
+            Parameter { name: "window"; type: "QQuickWindow"; isPointer: true }
+        }
+        Signal { name: "containmentMaskChanged"; revision: 11 }
+        Method { name: "update" }
+        Method {
+            name: "grabToImage"
+            revision: 4
+            type: "bool"
+            Parameter { name: "callback"; type: "QJSValue" }
+            Parameter { name: "targetSize"; type: "QSize" }
+        }
+        Method {
+            name: "grabToImage"
+            revision: 4
+            type: "bool"
+            Parameter { name: "callback"; type: "QJSValue" }
+        }
+        Method {
+            name: "contains"
+            type: "bool"
+            Parameter { name: "point"; type: "QPointF" }
+        }
+        Method {
+            name: "mapFromItem"
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "mapToItem"
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "mapFromGlobal"
+            revision: 7
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "mapToGlobal"
+            revision: 7
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+        Method { name: "forceActiveFocus" }
+        Method {
+            name: "forceActiveFocus"
+            Parameter { name: "reason"; type: "Qt::FocusReason" }
+        }
+        Method {
+            name: "nextItemInFocusChain"
+            revision: 1
+            type: "QQuickItem*"
+            Parameter { name: "forward"; type: "bool" }
+        }
+        Method { name: "nextItemInFocusChain"; revision: 1; type: "QQuickItem*" }
+        Method {
+            name: "childAt"
+            type: "QQuickItem*"
+            Parameter { name: "x"; type: "double" }
+            Parameter { name: "y"; type: "double" }
+        }
+    }
+    Component {
+        name: "QQuickNinePatchImage"
+        defaultProperty: "data"
+        prototype: "QQuickImage"
+        exports: ["QtQuick.Controls.Imagine.impl/NinePatchImage 2.3"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "topPadding"; type: "double"; isReadonly: true }
+        Property { name: "leftPadding"; type: "double"; isReadonly: true }
+        Property { name: "rightPadding"; type: "double"; isReadonly: true }
+        Property { name: "bottomPadding"; type: "double"; isReadonly: true }
+        Property { name: "topInset"; type: "double"; isReadonly: true }
+        Property { name: "leftInset"; type: "double"; isReadonly: true }
+        Property { name: "rightInset"; type: "double"; isReadonly: true }
+        Property { name: "bottomInset"; type: "double"; isReadonly: true }
+    }
+    Component {
+        name: "QQuickNinePatchImageSelector"
+        prototype: "QQuickImageSelector"
+        exports: ["QtQuick.Controls.Imagine.impl/NinePatchImageSelector 2.3"]
+        exportMetaObjectRevisions: [0]
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/qmldir b/deployment_test/QtQuick/Controls.2/Imagine/qmldir
new file mode 100644
index 0000000000000000000000000000000000000000..7b4b3ea0f7bbcafe5c0f0a4fc2cba6b771dbb353
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Imagine/qmldir
@@ -0,0 +1,5 @@
+module QtQuick.Controls.Imagine
+plugin qtquickcontrols2imaginestyleplugin
+classname QtQuickControls2ImagineStylePlugin
+depends QtQuick.Controls 2.5
+depends QtGraphicalEffects 1.0
diff --git a/deployment_test/QtQuick/Controls.2/Imagine/qtquickcontrols2imaginestyleplugin.dll b/deployment_test/QtQuick/Controls.2/Imagine/qtquickcontrols2imaginestyleplugin.dll
new file mode 100644
index 0000000000000000000000000000000000000000..e9aec7995f36a69daf33a80ff4b537b774651362
Binary files /dev/null and b/deployment_test/QtQuick/Controls.2/Imagine/qtquickcontrols2imaginestyleplugin.dll differ
diff --git a/deployment_test/QtQuick/Controls.2/ItemDelegate.qml b/deployment_test/QtQuick/Controls.2/ItemDelegate.qml
new file mode 100644
index 0000000000000000000000000000000000000000..6229e2bbadb8d52b11f5c226206bf758d5911e57
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/ItemDelegate.qml
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Templates 2.12 as T
+
+T.ItemDelegate {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    padding: 12
+    spacing: 8
+
+    icon.width: 24
+    icon.height: 24
+    icon.color: control.palette.text
+
+    contentItem: IconLabel {
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+        alignment: control.display === IconLabel.IconOnly || control.display === IconLabel.TextUnderIcon ? Qt.AlignCenter : Qt.AlignLeft
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.highlighted ? control.palette.highlightedText : control.palette.text
+    }
+
+    background: Rectangle {
+        implicitWidth: 100
+        implicitHeight: 40
+        visible: control.down || control.highlighted || control.visualFocus
+        color: Color.blend(control.down ? control.palette.midlight : control.palette.light,
+                                          control.palette.highlight, control.visualFocus ? 0.15 : 0.0)
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Label.qml b/deployment_test/QtQuick/Controls.2/Label.qml
new file mode 100644
index 0000000000000000000000000000000000000000..9a42635fcf613792efc48b89ce440195edb5fca1
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Label.qml
@@ -0,0 +1,47 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Templates 2.12 as T
+
+T.Label {
+    id: control
+
+    color: control.palette.windowText
+    linkColor: control.palette.link
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/ApplicationWindow.qml b/deployment_test/QtQuick/Controls.2/Material/ApplicationWindow.qml
new file mode 100644
index 0000000000000000000000000000000000000000..6a10ed7fe1bd4c776c4f18b3df286d6f75415329
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/ApplicationWindow.qml
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Window 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Material 2.12
+
+T.ApplicationWindow {
+    id: window
+
+    color: Material.backgroundColor
+
+    overlay.modal: Rectangle {
+        color: window.Material.backgroundDimColor
+        Behavior on opacity { NumberAnimation { duration: 150 } }
+    }
+
+    overlay.modeless: Rectangle {
+        color: window.Material.backgroundDimColor
+        Behavior on opacity { NumberAnimation { duration: 150 } }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/BoxShadow.qml b/deployment_test/QtQuick/Controls.2/Material/BoxShadow.qml
new file mode 100644
index 0000000000000000000000000000000000000000..5a746c0f9b2b5cc3b3d3e710785cc3fe60e3515d
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/BoxShadow.qml
@@ -0,0 +1,70 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+/*
+   A implementation of CSS's box-shadow, used by ElevationEffect for a Material Design
+   elevation shadow effect.
+ */
+RectangularGlow {
+    // The 4 properties from CSS box-shadow, plus the inherited color property
+    property int offsetX
+    property int offsetY
+    property int blurRadius
+    property int spreadRadius
+
+    // The source item the shadow is being applied to, used for correctly
+    // calculating the corner radious
+    property Item source
+
+    property bool fullWidth
+    property bool fullHeight
+
+    x: (parent.width - width)/2 + offsetX
+    y: (parent.height - height)/2 + offsetY
+
+    implicitWidth: source ? source.width : parent.width
+    implicitHeight: source ? source.height : parent.height
+
+    width: implicitWidth + 2 * spreadRadius + (fullWidth ? 2 * cornerRadius : 0)
+    height: implicitHeight + 2 * spreadRadius + (fullHeight ? 2 * cornerRadius : 0)
+    glowRadius: blurRadius/2
+    spread: 0.05
+    cornerRadius: blurRadius + (source && source.radius || 0)
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/BusyIndicator.qml b/deployment_test/QtQuick/Controls.2/Material/BusyIndicator.qml
new file mode 100644
index 0000000000000000000000000000000000000000..8173248cd211d5c869c385545946226e5692bf24
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/BusyIndicator.qml
@@ -0,0 +1,61 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+T.BusyIndicator {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    padding: 6
+
+    contentItem: BusyIndicatorImpl {
+        implicitWidth: control.Material.touchTarget
+        implicitHeight: control.Material.touchTarget
+        color: control.Material.accentColor
+
+        running: control.running
+        opacity: control.running ? 1 : 0
+        Behavior on opacity { OpacityAnimator { duration: 250 } }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/Button.qml b/deployment_test/QtQuick/Controls.2/Material/Button.qml
new file mode 100644
index 0000000000000000000000000000000000000000..04c6664c3429cc57046e8cab208ac73789fc07fa
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/Button.qml
@@ -0,0 +1,118 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+T.Button {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    topInset: 6
+    bottomInset: 6
+    padding: 12
+    horizontalPadding: padding - 4
+    spacing: 6
+
+    icon.width: 24
+    icon.height: 24
+    icon.color: !enabled ? Material.hintTextColor :
+        flat && highlighted ? Material.accentColor :
+        highlighted ? Material.primaryHighlightedTextColor : Material.foreground
+
+    Material.elevation: flat ? control.down || control.hovered ? 2 : 0
+                             : control.down ? 8 : 2
+    Material.background: flat ? "transparent" : undefined
+
+    contentItem: IconLabel {
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: !control.enabled ? control.Material.hintTextColor :
+            control.flat && control.highlighted ? control.Material.accentColor :
+            control.highlighted ? control.Material.primaryHighlightedTextColor : control.Material.foreground
+    }
+
+    background: Rectangle {
+        implicitWidth: 64
+        implicitHeight: control.Material.buttonHeight
+
+        radius: 2
+        color: !control.enabled ? control.Material.buttonDisabledColor :
+                control.highlighted ? control.Material.highlightedButtonColor : control.Material.buttonColor
+
+        PaddedRectangle {
+            y: parent.height - 4
+            width: parent.width
+            height: 4
+            radius: 2
+            topPadding: -2
+            clip: true
+            visible: control.checkable && (!control.highlighted || control.flat)
+            color: control.checked && control.enabled ? control.Material.accentColor : control.Material.secondaryTextColor
+        }
+
+        // The layer is disabled when the button color is transparent so you can do
+        // Material.background: "transparent" and get a proper flat button without needing
+        // to set Material.elevation as well
+        layer.enabled: control.enabled && control.Material.buttonColor.a > 0
+        layer.effect: ElevationEffect {
+            elevation: control.Material.elevation
+        }
+
+        Ripple {
+            clipRadius: 2
+            width: parent.width
+            height: parent.height
+            pressed: control.pressed
+            anchor: control
+            active: control.down || control.visualFocus || control.hovered
+            color: control.flat && control.highlighted ? control.Material.highlightedRippleColor : control.Material.rippleColor
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/CheckBox.qml b/deployment_test/QtQuick/Controls.2/Material/CheckBox.qml
new file mode 100644
index 0000000000000000000000000000000000000000..159e2f12dcb48e57b2b87c6bb08dbf200cd59e86
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/CheckBox.qml
@@ -0,0 +1,83 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+T.CheckBox {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    spacing: 8
+    padding: 8
+    verticalPadding: padding + 7
+
+    indicator: CheckIndicator {
+        x: control.text ? (control.mirrored ? control.width - width - control.rightPadding : control.leftPadding) : control.leftPadding + (control.availableWidth - width) / 2
+        y: control.topPadding + (control.availableHeight - height) / 2
+        control: control
+
+        Ripple {
+            x: (parent.width - width) / 2
+            y: (parent.height - height) / 2
+            width: 28; height: 28
+
+            z: -1
+            anchor: control
+            pressed: control.pressed
+            active: control.down || control.visualFocus || control.hovered
+            color: control.checked ? control.Material.highlightedRippleColor : control.Material.rippleColor
+        }
+    }
+
+    contentItem: Text {
+        leftPadding: control.indicator && !control.mirrored ? control.indicator.width + control.spacing : 0
+        rightPadding: control.indicator && control.mirrored ? control.indicator.width + control.spacing : 0
+
+        text: control.text
+        font: control.font
+        color: control.enabled ? control.Material.foreground : control.Material.hintTextColor
+        elide: Text.ElideRight
+        verticalAlignment: Text.AlignVCenter
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/CheckDelegate.qml b/deployment_test/QtQuick/Controls.2/Material/CheckDelegate.qml
new file mode 100644
index 0000000000000000000000000000000000000000..c7d7575ee8ab48836f51f32184efc12f611fc3b8
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/CheckDelegate.qml
@@ -0,0 +1,98 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+T.CheckDelegate {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    padding: 16
+    verticalPadding: 8
+    spacing: 16
+
+    icon.width: 24
+    icon.height: 24
+    icon.color: enabled ? Material.foreground : Material.hintTextColor
+
+    indicator: CheckIndicator {
+        x: control.text ? (control.mirrored ? control.leftPadding : control.width - width - control.rightPadding) : control.leftPadding + (control.availableWidth - width) / 2
+        y: control.topPadding + (control.availableHeight - height) / 2
+        control: control
+    }
+
+    contentItem: IconLabel {
+        leftPadding: !control.mirrored ? 0 : control.indicator.width + control.spacing
+        rightPadding: control.mirrored ? 0 : control.indicator.width + control.spacing
+
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+        alignment: control.display === IconLabel.IconOnly || control.display === IconLabel.TextUnderIcon ? Qt.AlignCenter : Qt.AlignLeft
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.enabled ? control.Material.foreground : control.Material.hintTextColor
+    }
+
+    background: Rectangle {
+        implicitHeight: control.Material.delegateHeight
+
+        color: control.highlighted ? control.Material.listHighlightColor : "transparent"
+
+        Ripple {
+            width: parent.width
+            height: parent.height
+
+            clip: visible
+            pressed: control.pressed
+            anchor: control
+            active: control.down || control.visualFocus || control.hovered
+            color: control.Material.rippleColor
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/CheckIndicator.qml b/deployment_test/QtQuick/Controls.2/Material/CheckIndicator.qml
new file mode 100644
index 0000000000000000000000000000000000000000..7caf8553301aa59a9f3c480a4f83a6c39edd8e92
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/CheckIndicator.qml
@@ -0,0 +1,120 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+Rectangle {
+    id: indicatorItem
+    implicitWidth: 18
+    implicitHeight: 18
+    color: "transparent"
+    border.color: !control.enabled ? control.Material.hintTextColor
+        : checkState !== Qt.Unchecked ? control.Material.accentColor : control.Material.secondaryTextColor
+    border.width: checkState !== Qt.Unchecked ? width / 2 : 2
+    radius: 2
+
+    property Item control
+    property int checkState: control.checkState
+
+    Behavior on border.width {
+        NumberAnimation {
+            duration: 100
+            easing.type: Easing.OutCubic
+        }
+    }
+
+    Behavior on border.color {
+        ColorAnimation {
+            duration: 100
+            easing.type: Easing.OutCubic
+        }
+    }
+
+    // TODO: This needs to be transparent
+    Image {
+        id: checkImage
+        x: (parent.width - width) / 2
+        y: (parent.height - height) / 2
+        width: 14
+        height: 14
+        source: "qrc:/qt-project.org/imports/QtQuick/Controls.2/Material/images/check.png"
+        fillMode: Image.PreserveAspectFit
+
+        scale: indicatorItem.checkState === Qt.Checked ? 1 : 0
+        Behavior on scale { NumberAnimation { duration: 100 } }
+    }
+
+    Rectangle {
+        x: (parent.width - width) / 2
+        y: (parent.height - height) / 2
+        width: 12
+        height: 3
+
+        scale: indicatorItem.checkState === Qt.PartiallyChecked ? 1 : 0
+        Behavior on scale { NumberAnimation { duration: 100 } }
+    }
+
+    states: [
+        State {
+            name: "checked"
+            when: indicatorItem.checkState === Qt.Checked
+        },
+        State {
+            name: "partiallychecked"
+            when: indicatorItem.checkState === Qt.PartiallyChecked
+        }
+    ]
+
+    transitions: Transition {
+        SequentialAnimation {
+            NumberAnimation {
+                target: indicatorItem
+                property: "scale"
+                // Go down 2 pixels in size.
+                to: 1 - 2 / indicatorItem.width
+                duration: 120
+            }
+            NumberAnimation {
+                target: indicatorItem
+                property: "scale"
+                to: 1
+                duration: 120
+            }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/ComboBox.qml b/deployment_test/QtQuick/Controls.2/Material/ComboBox.qml
new file mode 100644
index 0000000000000000000000000000000000000000..a9bdd93436491c3547878edeacc732101913cf23
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/ComboBox.qml
@@ -0,0 +1,180 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.15
+import QtQuick.Window 2.15
+import QtQuick.Controls 2.15
+import QtQuick.Controls.impl 2.15
+import QtQuick.Templates 2.15 as T
+import QtQuick.Controls.Material 2.15
+import QtQuick.Controls.Material.impl 2.15
+
+T.ComboBox {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    topInset: 6
+    bottomInset: 6
+
+    leftPadding: padding + (!control.mirrored || !indicator || !indicator.visible ? 0 : indicator.width + spacing)
+    rightPadding: padding + (control.mirrored || !indicator || !indicator.visible ? 0 : indicator.width + spacing)
+
+    Material.elevation: flat ? control.pressed || control.hovered ? 2 : 0
+                             : control.pressed ? 8 : 2
+    Material.background: flat ? "transparent" : undefined
+    Material.foreground: flat ? undefined : Material.primaryTextColor
+
+    delegate: MenuItem {
+        width: ListView.view.width
+        text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole] : model[control.textRole]) : modelData
+        Material.foreground: control.currentIndex === index ? ListView.view.contentItem.Material.accent : ListView.view.contentItem.Material.foreground
+        highlighted: control.highlightedIndex === index
+        hoverEnabled: control.hoverEnabled
+    }
+
+    indicator: ColorImage {
+        x: control.mirrored ? control.padding : control.width - width - control.padding
+        y: control.topPadding + (control.availableHeight - height) / 2
+        color: control.enabled ? control.Material.foreground : control.Material.hintTextColor
+        source: "qrc:/qt-project.org/imports/QtQuick/Controls.2/Material/images/drop-indicator.png"
+    }
+
+    contentItem: T.TextField {
+        padding: 6
+        leftPadding: control.editable ? 2 : control.mirrored ? 0 : 12
+        rightPadding: control.editable ? 2 : control.mirrored ? 12 : 0
+
+        text: control.editable ? control.editText : control.displayText
+
+        enabled: control.editable
+        autoScroll: control.editable
+        readOnly: control.down
+        inputMethodHints: control.inputMethodHints
+        validator: control.validator
+        selectByMouse: control.selectTextByMouse
+
+        font: control.font
+        color: control.enabled ? control.Material.foreground : control.Material.hintTextColor
+        selectionColor: control.Material.accentColor
+        selectedTextColor: control.Material.primaryHighlightedTextColor
+        verticalAlignment: Text.AlignVCenter
+
+        cursorDelegate: CursorDelegate { }
+    }
+
+    background: Rectangle {
+        implicitWidth: 120
+        implicitHeight: control.Material.buttonHeight
+
+        radius: control.flat ? 0 : 2
+        color: !control.editable ? control.Material.dialogColor : "transparent"
+
+        layer.enabled: control.enabled && !control.editable && control.Material.background.a > 0
+        layer.effect: ElevationEffect {
+            elevation: control.Material.elevation
+        }
+
+        Rectangle {
+            visible: control.editable
+            y: parent.y + control.baselineOffset
+            width: parent.width
+            height: control.activeFocus ? 2 : 1
+            color: control.editable && control.activeFocus ? control.Material.accentColor : control.Material.hintTextColor
+        }
+
+        Ripple {
+            clip: control.flat
+            clipRadius: control.flat ? 0 : 2
+            x: control.editable && control.indicator ? control.indicator.x : 0
+            width: control.editable && control.indicator ? control.indicator.width : parent.width
+            height: parent.height
+            pressed: control.pressed
+            anchor: control.editable && control.indicator ? control.indicator : control
+            active: control.pressed || control.visualFocus || control.hovered
+            color: control.Material.rippleColor
+        }
+    }
+
+    popup: T.Popup {
+        y: control.editable ? control.height - 5 : 0
+        width: control.width
+        height: Math.min(contentItem.implicitHeight, control.Window.height - topMargin - bottomMargin)
+        transformOrigin: Item.Top
+        topMargin: 12
+        bottomMargin: 12
+
+        Material.theme: control.Material.theme
+        Material.accent: control.Material.accent
+        Material.primary: control.Material.primary
+
+        enter: Transition {
+            // grow_fade_in
+            NumberAnimation { property: "scale"; from: 0.9; to: 1.0; easing.type: Easing.OutQuint; duration: 220 }
+            NumberAnimation { property: "opacity"; from: 0.0; to: 1.0; easing.type: Easing.OutCubic; duration: 150 }
+        }
+
+        exit: Transition {
+            // shrink_fade_out
+            NumberAnimation { property: "scale"; from: 1.0; to: 0.9; easing.type: Easing.OutQuint; duration: 220 }
+            NumberAnimation { property: "opacity"; from: 1.0; to: 0.0; easing.type: Easing.OutCubic; duration: 150 }
+        }
+
+        contentItem: ListView {
+            clip: true
+            implicitHeight: contentHeight
+            model: control.delegateModel
+            currentIndex: control.highlightedIndex
+            highlightMoveDuration: 0
+
+            T.ScrollIndicator.vertical: ScrollIndicator { }
+        }
+
+        background: Rectangle {
+            radius: 2
+            color: parent.Material.dialogColor
+
+            layer.enabled: control.enabled
+            layer.effect: ElevationEffect {
+                elevation: 8
+            }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/CursorDelegate.qml b/deployment_test/QtQuick/Controls.2/Material/CursorDelegate.qml
new file mode 100644
index 0000000000000000000000000000000000000000..fe2d25c675c00c9a343d036c4dcf7318b5cf57e6
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/CursorDelegate.qml
@@ -0,0 +1,65 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls.Material 2.12
+
+Rectangle {
+    id: cursor
+
+    color: parent.Material.accentColor
+    width: 2
+    visible: parent.activeFocus && !parent.readOnly && parent.selectionStart === parent.selectionEnd
+
+    Connections {
+        target: cursor.parent
+        function onCursorPositionChanged() {
+            // keep a moving cursor visible
+            cursor.opacity = 1
+            timer.restart()
+        }
+    }
+
+    Timer {
+        id: timer
+        running: cursor.parent.activeFocus && !cursor.parent.readOnly && interval != 0
+        repeat: true
+        interval: Qt.styleHints.cursorFlashTime / 2
+        onTriggered: cursor.opacity = !cursor.opacity ? 1 : 0
+        // force the cursor visible when gaining focus
+        onRunningChanged: cursor.opacity = 1
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/DelayButton.qml b/deployment_test/QtQuick/Controls.2/Material/DelayButton.qml
new file mode 100644
index 0000000000000000000000000000000000000000..6b5ef3ad007eea042d6160b469d177e572f23542
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/DelayButton.qml
@@ -0,0 +1,117 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+T.DelayButton {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    topInset: 6
+    bottomInset: 6
+    padding: 12
+    horizontalPadding: padding - 4
+
+    Material.elevation: control.down ? 8 : 2
+
+    transition: Transition {
+        NumberAnimation {
+            duration: control.delay * (control.pressed ? 1.0 - control.progress : 0.3 * control.progress)
+        }
+    }
+
+    contentItem: Text {
+        text: control.text
+        font: control.font
+        color: !control.enabled ? control.Material.hintTextColor : control.Material.foreground
+        horizontalAlignment: Text.AlignHCenter
+        verticalAlignment: Text.AlignVCenter
+        elide: Text.ElideRight
+    }
+
+    // TODO: Add a proper ripple/ink effect for mouse/touch input and focus state
+    background: Rectangle {
+        implicitWidth: 64
+        implicitHeight: control.Material.buttonHeight
+
+        radius: 2
+        color: !control.enabled ? control.Material.buttonDisabledColor : control.Material.buttonColor
+
+        PaddedRectangle {
+            y: parent.height - 4
+            width: parent.width
+            height: 4
+            radius: 2
+            topPadding: -2
+            clip: true
+            color: control.checked && control.enabled ? control.Material.accentColor : control.Material.secondaryTextColor
+
+            PaddedRectangle {
+                width: parent.width * control.progress
+                height: 4
+                radius: 2
+                topPadding: -2
+                rightPadding: Math.max(-2, width - parent.width)
+                clip: true
+                color: control.Material.accentColor
+            }
+        }
+
+        layer.enabled: control.enabled && control.Material.buttonColor.a > 0
+        layer.effect: ElevationEffect {
+            elevation: control.Material.elevation
+        }
+
+        Ripple {
+            clipRadius: 2
+            width: parent.width
+            height: parent.height
+            pressed: control.pressed
+            anchor: control
+            active: control.down || control.visualFocus || control.hovered
+            color: control.Material.rippleColor
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/Dial.qml b/deployment_test/QtQuick/Controls.2/Material/Dial.qml
new file mode 100644
index 0000000000000000000000000000000000000000..1f80a7fe78134eff7333253ff173406bfe082340
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/Dial.qml
@@ -0,0 +1,85 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+T.Dial {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding) || 100 // ### remove 100 in Qt 6
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding) || 100 // ### remove 100 in Qt 6
+
+    background: Rectangle {
+        implicitWidth: 100
+        implicitHeight: 100
+
+        x: control.width / 2 - width / 2
+        y: control.height / 2 - height / 2
+        width: Math.max(64, Math.min(control.width, control.height))
+        height: width
+        color: "transparent"
+        radius: width / 2
+
+        border.color: control.enabled ? control.Material.accentColor : control.Material.hintTextColor
+    }
+
+    handle: SliderHandle {
+        x: control.background.x + control.background.width / 2 - control.handle.width / 2
+        y: control.background.y + control.background.height / 2 - control.handle.height / 2
+        transform: [
+            Translate {
+                y: -control.background.height * 0.4 + control.handle.height / 2
+            },
+            Rotation {
+                angle: control.angle
+                origin.x: control.handle.width / 2
+                origin.y: control.handle.height / 2
+            }
+        ]
+        implicitWidth: 10
+        implicitHeight: 10
+
+        value: control.value
+        handleHasFocus: control.visualFocus
+        handlePressed: control.pressed
+        handleHovered: control.hovered
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/Dialog.qml b/deployment_test/QtQuick/Controls.2/Material/Dialog.qml
new file mode 100644
index 0000000000000000000000000000000000000000..364c0e570d582fc496564acc7d8f3b70e7485913
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/Dialog.qml
@@ -0,0 +1,113 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+T.Dialog {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding,
+                            implicitHeaderWidth,
+                            implicitFooterWidth)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding
+                             + (implicitHeaderHeight > 0 ? implicitHeaderHeight + spacing : 0)
+                             + (implicitFooterHeight > 0 ? implicitFooterHeight + spacing : 0))
+
+    padding: 24
+    topPadding: 20
+
+    Material.elevation: 24
+
+    enter: Transition {
+        // grow_fade_in
+        NumberAnimation { property: "scale"; from: 0.9; to: 1.0; easing.type: Easing.OutQuint; duration: 220 }
+        NumberAnimation { property: "opacity"; from: 0.0; to: 1.0; easing.type: Easing.OutCubic; duration: 150 }
+    }
+
+    exit: Transition {
+        // shrink_fade_out
+        NumberAnimation { property: "scale"; from: 1.0; to: 0.9; easing.type: Easing.OutQuint; duration: 220 }
+        NumberAnimation { property: "opacity"; from: 1.0; to: 0.0; easing.type: Easing.OutCubic; duration: 150 }
+    }
+
+    background: Rectangle {
+        radius: 2
+        color: control.Material.dialogColor
+
+        layer.enabled: control.Material.elevation > 0
+        layer.effect: ElevationEffect {
+            elevation: control.Material.elevation
+        }
+    }
+
+    header: Label {
+        text: control.title
+        visible: control.title
+        elide: Label.ElideRight
+        padding: 24
+        bottomPadding: 0
+        // TODO: QPlatformTheme::TitleBarFont
+        font.bold: true
+        font.pixelSize: 16
+        background: PaddedRectangle {
+            radius: 2
+            color: control.Material.dialogColor
+            bottomPadding: -2
+            clip: true
+        }
+    }
+
+    footer: DialogButtonBox {
+        visible: count > 0
+    }
+
+    T.Overlay.modal: Rectangle {
+        color: control.Material.backgroundDimColor
+        Behavior on opacity { NumberAnimation { duration: 150 } }
+    }
+
+    T.Overlay.modeless: Rectangle {
+        color: control.Material.backgroundDimColor
+        Behavior on opacity { NumberAnimation { duration: 150 } }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/DialogButtonBox.qml b/deployment_test/QtQuick/Controls.2/Material/DialogButtonBox.qml
new file mode 100644
index 0000000000000000000000000000000000000000..c53b821034646cd3bbc2dcf8e6110dbe303461ed
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/DialogButtonBox.qml
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+T.DialogButtonBox {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    spacing: 8
+    padding: 8
+    verticalPadding: 2
+    alignment: Qt.AlignRight
+    buttonLayout: T.DialogButtonBox.AndroidLayout
+
+    Material.foreground: Material.accent
+
+    delegate: Button { flat: true }
+
+    contentItem: ListView {
+        model: control.contentModel
+        spacing: control.spacing
+        orientation: ListView.Horizontal
+        boundsBehavior: Flickable.StopAtBounds
+        snapMode: ListView.SnapToItem
+    }
+
+    background: PaddedRectangle {
+        implicitHeight: control.Material.dialogButtonBoxHeight
+        radius: 2
+        color: control.Material.dialogColor
+        // Rounded corners should be only at the top or at the bottom
+        topPadding: control.position === T.DialogButtonBox.Footer ? -2 : 0
+        bottomPadding: control.position === T.DialogButtonBox.Header ? -2 : 0
+        clip: true
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/Drawer.qml b/deployment_test/QtQuick/Controls.2/Material/Drawer.qml
new file mode 100644
index 0000000000000000000000000000000000000000..3d64cdef47a41826160723a59d0da405ec5023cc
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/Drawer.qml
@@ -0,0 +1,91 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+T.Drawer {
+    id: control
+
+    parent: T.Overlay.overlay
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    topPadding: !dim && edge === Qt.BottomEdge && Material.elevation === 0
+    leftPadding: !dim && edge === Qt.RightEdge && Material.elevation === 0
+    rightPadding: !dim && edge === Qt.LeftEdge && Material.elevation === 0
+    bottomPadding: !dim && edge === Qt.TopEdge && Material.elevation === 0
+
+    enter: Transition { SmoothedAnimation { velocity: 5 } }
+    exit: Transition { SmoothedAnimation { velocity: 5 } }
+
+    Material.elevation: !interactive && !dim ? 0 : 16
+
+    background: Rectangle {
+        color: control.Material.dialogColor
+
+        Rectangle {
+            readonly property bool horizontal: control.edge === Qt.LeftEdge || control.edge === Qt.RightEdge
+            width: horizontal ? 1 : parent.width
+            height: horizontal ? parent.height : 1
+            color: control.Material.dividerColor
+            x: control.edge === Qt.LeftEdge ? parent.width - 1 : 0
+            y: control.edge === Qt.TopEdge ? parent.height - 1 : 0
+            visible: !control.dim && control.Material.elevation === 0
+        }
+
+        layer.enabled: control.position > 0
+        layer.effect: ElevationEffect {
+            elevation: control.Material.elevation
+            fullHeight: true
+        }
+    }
+
+    T.Overlay.modal: Rectangle {
+        color: control.Material.backgroundDimColor
+        Behavior on opacity { NumberAnimation { duration: 150 } }
+    }
+
+    T.Overlay.modeless: Rectangle {
+        color: control.Material.backgroundDimColor
+        Behavior on opacity { NumberAnimation { duration: 150 } }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/ElevationEffect.qml b/deployment_test/QtQuick/Controls.2/Material/ElevationEffect.qml
new file mode 100644
index 0000000000000000000000000000000000000000..73a2a238f92f0e331f4904529617a2ebddc6462c
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/ElevationEffect.qml
@@ -0,0 +1,279 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+/*
+   An effect for standard Material Design elevation shadows. Useful for using as \c layer.effect.
+ */
+Item {
+    id: effect
+
+    /*
+       The source the effect is applied to.
+     */
+    property var source
+
+    /*
+       The elevation of the \l source Item.
+     */
+    property int elevation: 0
+
+    /*
+       Set to \c true if the \l source Item is the same width as its parent and the shadow
+       should be full width instead of rounding around the corner of the Item.
+
+       \sa fullHeight
+     */
+    property bool fullWidth: false
+
+    /*
+       Set to \c true if the \l source Item is the same height as its parent and the shadow
+       should be full height instead of rounding around the corner of the Item.
+
+       \sa fullWidth
+     */
+    property bool fullHeight: false
+
+    /*
+       \internal
+
+       The actual source Item the effect is applied to.
+     */
+    readonly property Item sourceItem: source.sourceItem
+
+    /*
+     * The following shadow values are taken from Angular Material
+     *
+     * The MIT License (MIT)
+     *
+     * Copyright (c) 2014-2016 Google, Inc. http://angularjs.org
+     *
+     * Permission is hereby granted, free of charge, to any person obtaining a copy
+     * of this software and associated documentation files (the "Software"), to deal
+     * in the Software without restriction, including without limitation the rights
+     * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+     * copies of the Software, and to permit persons to whom the Software is
+     * furnished to do so, subject to the following conditions:
+     *
+     * The above copyright notice and this permission notice shall be included in all
+     * copies or substantial portions of the Software.
+     *
+     * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+     * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+     * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+     * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+     * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+     * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+     * SOFTWARE.
+     */
+    /*
+       \internal
+
+       The shadows to use for each possible elevation. There are three shadows that when combined
+       make up the elevation.
+     */
+    readonly property var _shadows: [
+        [{offset: 0, blur: 0, spread: 0},
+         {offset: 0, blur: 0, spread: 0},
+         {offset: 0, blur: 0, spread: 0}],
+
+        [{offset: 1, blur: 3, spread: 0},
+         {offset: 1, blur: 1, spread: 0},
+         {offset: 2, blur: 1, spread: -1}],
+
+        [{offset: 1, blur: 5, spread: 0},
+         {offset: 2, blur: 2, spread: 0},
+         {offset: 3, blur: 1, spread: -2}],
+
+        [{offset: 1, blur: 8, spread: 0},
+         {offset: 3, blur: 4, spread: 0},
+         {offset: 3, blur: 3, spread: -2}],
+
+        [{offset: 2, blur: 4, spread: -1},
+         {offset: 4, blur: 5, spread: 0},
+         {offset: 1, blur: 10, spread: 0}],
+
+        [{offset: 3, blur: 5, spread: -1},
+         {offset: 5, blur: 8, spread: 0},
+         {offset: 1, blur: 14, spread: 0}],
+
+        [{offset: 3, blur: 5, spread: -1},
+         {offset: 6, blur: 10, spread: 0},
+         {offset: 1, blur: 18, spread: 0}],
+
+        [{offset: 4, blur: 5, spread: -2},
+         {offset: 7, blur: 10, spread: 1},
+         {offset: 2, blur: 16, spread: 1}],
+
+        [{offset: 5, blur: 5, spread: -3},
+         {offset: 8, blur: 10, spread: 1},
+         {offset: 3, blur: 14, spread: 2}],
+
+        [{offset: 5, blur: 6, spread: -3},
+         {offset: 9, blur: 12, spread: 1},
+         {offset: 3, blur: 16, spread: 2}],
+
+        [{offset: 6, blur: 6, spread: -3},
+         {offset: 10, blur: 14, spread: 1},
+         {offset: 4, blur: 18, spread: 3}],
+
+        [{offset: 6, blur: 7, spread: -4},
+         {offset: 11, blur: 15, spread: 1},
+         {offset: 4, blur: 20, spread: 3}],
+
+        [{offset: 7, blur: 8, spread: -4},
+         {offset: 12, blur: 17, spread: 2},
+         {offset: 5, blur: 22, spread: 4}],
+
+        [{offset: 7, blur: 8, spread: -4},
+         {offset: 13, blur: 19, spread: 2},
+         {offset: 5, blur: 24, spread: 4}],
+
+        [{offset: 7, blur: 9, spread: -4},
+         {offset: 14, blur: 21, spread: 2},
+         {offset: 5, blur: 26, spread: 4}],
+
+        [{offset: 8, blur: 9, spread: -5},
+         {offset: 15, blur: 22, spread: 2},
+         {offset: 6, blur: 28, spread: 5}],
+
+        [{offset: 8, blur: 10, spread: -5},
+         {offset: 16, blur: 24, spread: 2},
+         {offset: 6, blur: 30, spread: 5}],
+
+        [{offset: 8, blur: 11, spread: -5},
+         {offset: 17, blur: 26, spread: 2},
+         {offset: 6, blur: 32, spread: 5}],
+
+        [{offset: 9, blur: 11, spread: -5},
+         {offset: 18, blur: 28, spread: 2},
+         {offset: 7, blur: 34, spread: 6}],
+
+        [{offset: 9, blur: 12, spread: -6},
+         {offset: 19, blur: 29, spread: 2},
+         {offset: 7, blur: 36, spread: 6}],
+
+        [{offset: 10, blur: 13, spread: -6},
+         {offset: 20, blur: 31, spread: 3},
+         {offset: 8, blur: 38, spread: 7}],
+
+        [{offset: 10, blur: 13, spread: -6},
+         {offset: 21, blur: 33, spread: 3},
+         {offset: 8, blur: 40, spread: 7}],
+
+        [{offset: 10, blur: 14, spread: -6},
+         {offset: 22, blur: 35, spread: 3},
+         {offset: 8, blur: 42, spread: 7}],
+
+        [{offset: 11, blur: 14, spread: -7},
+         {offset: 23, blur: 36, spread: 3},
+         {offset: 9, blur: 44, spread: 8}],
+
+        [{offset: 11, blur: 15, spread: -7},
+         {offset: 24, blur: 38, spread: 3},
+         {offset: 9, blur: 46, spread: 8}]
+    ]
+
+    /*
+       \internal
+
+       The current shadow based on the elevation.
+     */
+    readonly property var _shadow: _shadows[Math.max(0, Math.min(elevation, _shadows.length - 1))]
+
+    // Nest the shadows and source view in two items rendered as a layer
+    // so the shadow is not clipped by the bounds of the source view
+    Item {
+        property int margin: -100
+
+        x: margin
+        y: margin
+        width: parent.width - 2 * margin
+        height: parent.height - 2 * margin
+
+        // By rendering as a layer, the shadow will never show through the source item,
+        // even when the source item's opacity is less than 1
+        layer.enabled: true
+
+        // The box shadows automatically pick up the size of the source Item and not
+        // the size of the parent, so we don't need to worry about the extra padding
+        // in the parent Item
+        BoxShadow {
+            offsetY: effect._shadow[0].offset
+            blurRadius: effect._shadow[0].blur
+            spreadRadius: effect._shadow[0].spread
+            color: Qt.rgba(0,0,0, 0.2)
+
+            fullWidth: effect.fullWidth
+            fullHeight: effect.fullHeight
+            source: effect.sourceItem
+        }
+
+        BoxShadow {
+            offsetY: effect._shadow[1].offset
+            blurRadius: effect._shadow[1].blur
+            spreadRadius: effect._shadow[1].spread
+            color: Qt.rgba(0,0,0, 0.14)
+
+            fullWidth: effect.fullWidth
+            fullHeight: effect.fullHeight
+            source: effect.sourceItem
+        }
+
+        BoxShadow {
+            offsetY: effect._shadow[2].offset
+            blurRadius: effect._shadow[2].blur
+            spreadRadius: effect._shadow[2].spread
+            color: Qt.rgba(0,0,0, 0.12)
+
+            fullWidth: effect.fullWidth
+            fullHeight: effect.fullHeight
+            source: effect.sourceItem
+        }
+
+        ShaderEffect {
+            property alias source: effect.source
+
+            x: (parent.width - width)/2
+            y: (parent.height - height)/2
+            width: effect.sourceItem.width
+            height: effect.sourceItem.height
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/Frame.qml b/deployment_test/QtQuick/Controls.2/Material/Frame.qml
new file mode 100644
index 0000000000000000000000000000000000000000..0001825ea40358b357a3a1cb65af09f2be9439af
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/Frame.qml
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+T.Frame {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    padding: 12
+    verticalPadding: Material.frameVerticalPadding
+
+    background: Rectangle {
+        radius: 2
+        color: control.Material.elevation > 0 ? control.Material.backgroundColor : "transparent"
+        border.color: control.Material.frameColor
+
+        layer.enabled: control.enabled && control.Material.elevation > 0
+        layer.effect: ElevationEffect {
+            elevation: control.Material.elevation
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/GroupBox.qml b/deployment_test/QtQuick/Controls.2/Material/GroupBox.qml
new file mode 100644
index 0000000000000000000000000000000000000000..e18a5949ec00db9fad73c4d5a70183c1ba9b72a9
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/GroupBox.qml
@@ -0,0 +1,81 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+T.GroupBox {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding,
+                            implicitLabelWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    spacing: 6
+    padding: 12
+    topPadding: Material.frameVerticalPadding + (implicitLabelWidth > 0 ? implicitLabelHeight + spacing : 0)
+    bottomPadding: Material.frameVerticalPadding
+
+    label: Text {
+        x: control.leftPadding
+        width: control.availableWidth
+
+        text: control.title
+        font: control.font
+        color: control.enabled ? control.Material.foreground : control.Material.hintTextColor
+        elide: Text.ElideRight
+        verticalAlignment: Text.AlignVCenter
+    }
+
+    background: Rectangle {
+        y: control.topPadding - control.bottomPadding
+        width: parent.width
+        height: parent.height - control.topPadding + control.bottomPadding
+
+        radius: 2
+        color: control.Material.elevation > 0 ? control.Material.backgroundColor : "transparent"
+        border.color: control.Material.frameColor
+
+        layer.enabled: control.enabled && control.Material.elevation > 0
+        layer.effect: ElevationEffect {
+            elevation: control.Material.elevation
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/HorizontalHeaderView.qml b/deployment_test/QtQuick/Controls.2/Material/HorizontalHeaderView.qml
new file mode 100644
index 0000000000000000000000000000000000000000..fd672f34a9285f09a74688eb2e5c69b5a833ddcd
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/HorizontalHeaderView.qml
@@ -0,0 +1,69 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.15
+import QtQuick.Controls 2.15
+import QtQuick.Templates 2.15 as T
+import QtQuick.Controls.Material 2.15
+import QtQuick.Controls.Material.impl 2.15
+
+T.HorizontalHeaderView {
+    id: control
+
+    implicitWidth: syncView ? syncView.width : 0
+    implicitHeight: contentHeight
+
+    delegate: Rectangle {
+        // Qt6: add cellPadding (and font etc) as public API in headerview
+        readonly property real cellPadding: 8
+
+        implicitWidth: text.implicitWidth + (cellPadding * 2)
+        implicitHeight: Math.max(control.height, text.implicitHeight + (cellPadding * 2))
+        color: control.Material.backgroundColor
+
+        Text {
+            id: text
+            text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole]
+                                        : model[control.textRole])
+                                   : modelData
+            width: parent.width
+            height: parent.height
+            horizontalAlignment: Text.AlignHCenter
+            verticalAlignment: Text.AlignVCenter
+            color: enabled ? control.Material.foreground : control.Material.hintTextColor
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/ItemDelegate.qml b/deployment_test/QtQuick/Controls.2/Material/ItemDelegate.qml
new file mode 100644
index 0000000000000000000000000000000000000000..2078ce6cb5ed5d3c85ffde66185750b319555cd3
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/ItemDelegate.qml
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+T.ItemDelegate {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    padding: 16
+    verticalPadding: 8
+    spacing: 16
+
+    icon.width: 24
+    icon.height: 24
+    icon.color: enabled ? Material.foreground : Material.hintTextColor
+
+    contentItem: IconLabel {
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+        alignment: control.display === IconLabel.IconOnly || control.display === IconLabel.TextUnderIcon ? Qt.AlignCenter : Qt.AlignLeft
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.enabled ? control.Material.foreground : control.Material.hintTextColor
+    }
+
+    background: Rectangle {
+        implicitHeight: control.Material.delegateHeight
+
+        color: control.highlighted ? control.Material.listHighlightColor : "transparent"
+
+        Ripple {
+            width: parent.width
+            height: parent.height
+
+            clip: visible
+            pressed: control.pressed
+            anchor: control
+            active: control.down || control.visualFocus || control.hovered
+            color: control.Material.rippleColor
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/Label.qml b/deployment_test/QtQuick/Controls.2/Material/Label.qml
new file mode 100644
index 0000000000000000000000000000000000000000..ad923a24d56130e2e451a965aeffa20d93dccadc
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/Label.qml
@@ -0,0 +1,46 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Material 2.12
+
+T.Label {
+    id: control
+
+    color: enabled ? Material.foreground : Material.hintTextColor
+    linkColor: Material.accentColor
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/Menu.qml b/deployment_test/QtQuick/Controls.2/Material/Menu.qml
new file mode 100644
index 0000000000000000000000000000000000000000..94bcc15ed664a691ab5e23992b3f3278a1021d7e
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/Menu.qml
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+import QtQuick.Window 2.12
+
+T.Menu {
+    id: control
+
+    Material.elevation: 8
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    margins: 0
+    verticalPadding: 8
+
+    transformOrigin: !cascade ? Item.Top : (mirrored ? Item.TopRight : Item.TopLeft)
+
+    delegate: MenuItem { }
+
+    enter: Transition {
+        // grow_fade_in
+        NumberAnimation { property: "scale"; from: 0.9; to: 1.0; easing.type: Easing.OutQuint; duration: 220 }
+        NumberAnimation { property: "opacity"; from: 0.0; to: 1.0; easing.type: Easing.OutCubic; duration: 150 }
+    }
+
+    exit: Transition {
+        // shrink_fade_out
+        NumberAnimation { property: "scale"; from: 1.0; to: 0.9; easing.type: Easing.OutQuint; duration: 220 }
+        NumberAnimation { property: "opacity"; from: 1.0; to: 0.0; easing.type: Easing.OutCubic; duration: 150 }
+    }
+
+    contentItem: ListView {
+        implicitHeight: contentHeight
+
+        model: control.contentModel
+        interactive: Window.window
+                        ? contentHeight + control.topPadding + control.bottomPadding > Window.window.height
+                        : false
+        clip: true
+        currentIndex: control.currentIndex
+
+        ScrollIndicator.vertical: ScrollIndicator {}
+    }
+
+    background: Rectangle {
+        implicitWidth: 200
+        implicitHeight: control.Material.menuItemHeight
+
+        radius: 3
+        color: control.Material.dialogColor
+
+        layer.enabled: control.Material.elevation > 0
+        layer.effect: ElevationEffect {
+            elevation: control.Material.elevation
+        }
+    }
+
+    T.Overlay.modal: Rectangle {
+        color: control.Material.backgroundDimColor
+        Behavior on opacity { NumberAnimation { duration: 150 } }
+    }
+
+    T.Overlay.modeless: Rectangle {
+        color: control.Material.backgroundDimColor
+        Behavior on opacity { NumberAnimation { duration: 150 } }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/MenuBar.qml b/deployment_test/QtQuick/Controls.2/Material/MenuBar.qml
new file mode 100644
index 0000000000000000000000000000000000000000..66252d6edb6d86d61598680ac8a694ca37ec6977
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/MenuBar.qml
@@ -0,0 +1,65 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+T.MenuBar {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    delegate: MenuBarItem { }
+
+    contentItem: Row {
+        spacing: control.spacing
+        Repeater {
+            model: control.contentModel
+        }
+    }
+
+    background: Rectangle {
+        implicitHeight: 40
+        color: control.Material.dialogColor
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/MenuBarItem.qml b/deployment_test/QtQuick/Controls.2/Material/MenuBarItem.qml
new file mode 100644
index 0000000000000000000000000000000000000000..588d6fbb7a132abde8fce734a0f00a3104535b63
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/MenuBarItem.qml
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+T.MenuBarItem {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    padding: 16
+    verticalPadding: 12
+    spacing: 16
+
+    icon.width: 24
+    icon.height: 24
+    icon.color: enabled ? Material.foreground : Material.hintTextColor
+
+    contentItem: IconLabel {
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+        alignment: Qt.AlignLeft
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.enabled ? control.Material.foreground : control.Material.hintTextColor
+    }
+
+    background: Rectangle {
+        implicitWidth: 40
+        implicitHeight: 40
+        color: control.highlighted ? control.Material.listHighlightColor : "transparent"
+
+        Ripple {
+            width: parent.width
+            height: parent.height
+
+            clip: visible
+            pressed: control.pressed
+            anchor: control
+            active: control.down || control.highlighted
+            color: control.Material.rippleColor
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/MenuItem.qml b/deployment_test/QtQuick/Controls.2/Material/MenuItem.qml
new file mode 100644
index 0000000000000000000000000000000000000000..a5d2f8a156312e0de04bcc09ffa425c11c68703a
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/MenuItem.qml
@@ -0,0 +1,112 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+T.MenuItem {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    padding: 16
+    verticalPadding: Material.menuItemVerticalPadding
+    spacing: 16
+
+    icon.width: 24
+    icon.height: 24
+    icon.color: enabled ? Material.foreground : Material.hintTextColor
+
+    indicator: CheckIndicator {
+        x: control.text ? (control.mirrored ? control.width - width - control.rightPadding : control.leftPadding) : control.leftPadding + (control.availableWidth - width) / 2
+        y: control.topPadding + (control.availableHeight - height) / 2
+        visible: control.checkable
+        control: control
+        checkState: control.checked ? Qt.Checked : Qt.Unchecked
+    }
+
+    arrow: ColorImage {
+        x: control.mirrored ? control.padding : control.width - width - control.padding
+        y: control.topPadding + (control.availableHeight - height) / 2
+
+        visible: control.subMenu
+        mirror: control.mirrored
+        color: control.enabled ? control.Material.foreground : control.Material.hintTextColor
+        source: "qrc:/qt-project.org/imports/QtQuick/Controls.2/Material/images/arrow-indicator.png"
+    }
+
+    contentItem: IconLabel {
+        readonly property real arrowPadding: control.subMenu && control.arrow ? control.arrow.width + control.spacing : 0
+        readonly property real indicatorPadding: control.checkable && control.indicator ? control.indicator.width + control.spacing : 0
+        leftPadding: !control.mirrored ? indicatorPadding : arrowPadding
+        rightPadding: control.mirrored ? indicatorPadding : arrowPadding
+
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+        alignment: Qt.AlignLeft
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.enabled ? control.Material.foreground : control.Material.hintTextColor
+    }
+
+    background: Rectangle {
+        implicitWidth: 200
+        implicitHeight: control.Material.menuItemHeight
+        color: control.highlighted ? control.Material.listHighlightColor : "transparent"
+
+        Ripple {
+            width: parent.width
+            height: parent.height
+
+            clip: visible
+            pressed: control.pressed
+            anchor: control
+            active: control.down || control.highlighted
+            color: control.Material.rippleColor
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/MenuSeparator.qml b/deployment_test/QtQuick/Controls.2/Material/MenuSeparator.qml
new file mode 100644
index 0000000000000000000000000000000000000000..6d80c049067b0e7c5cb57f1a7393aef0c3741ec1
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/MenuSeparator.qml
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Material 2.12
+
+T.MenuSeparator {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    verticalPadding: 8
+
+    contentItem: Rectangle {
+        implicitWidth: 200
+        implicitHeight: 1
+        color: control.Material.dividerColor
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/Page.qml b/deployment_test/QtQuick/Controls.2/Material/Page.qml
new file mode 100644
index 0000000000000000000000000000000000000000..4da0ecc6e08d9b405dee9fe97944a063ab0ec81e
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/Page.qml
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Material 2.12
+
+T.Page {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding,
+                            implicitHeaderWidth,
+                            implicitFooterWidth)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding
+                             + (implicitHeaderHeight > 0 ? implicitHeaderHeight + spacing : 0)
+                             + (implicitFooterHeight > 0 ? implicitFooterHeight + spacing : 0))
+
+    background: Rectangle {
+        color: control.Material.backgroundColor
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/PageIndicator.qml b/deployment_test/QtQuick/Controls.2/Material/PageIndicator.qml
new file mode 100644
index 0000000000000000000000000000000000000000..5e6ca2452064c6c91b6eaa1d54652fe3767f5e4f
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/PageIndicator.qml
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Material 2.12
+
+T.PageIndicator {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    padding: 6
+    spacing: 6
+
+    delegate: Rectangle {
+        implicitWidth: 8
+        implicitHeight: 8
+
+        radius: width / 2
+        color: control.enabled ? control.Material.foreground : control.Material.hintTextColor
+
+        opacity: index === currentIndex ? 0.95 : pressed ? 0.7 : 0.45
+        Behavior on opacity { OpacityAnimator { duration: 100 } }
+    }
+
+    contentItem: Row {
+        spacing: control.spacing
+
+        Repeater {
+            model: control.count
+            delegate: control.delegate
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/Pane.qml b/deployment_test/QtQuick/Controls.2/Material/Pane.qml
new file mode 100644
index 0000000000000000000000000000000000000000..988e225aaed20d3b1b30939ce07ca7e23a1b04db
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/Pane.qml
@@ -0,0 +1,61 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+T.Pane {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    padding: 12
+
+    background: Rectangle {
+        color: control.Material.backgroundColor
+        radius: control.Material.elevation > 0 ? 2 : 0
+
+        layer.enabled: control.enabled && control.Material.elevation > 0
+        layer.effect: ElevationEffect {
+            elevation: control.Material.elevation
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/Popup.qml b/deployment_test/QtQuick/Controls.2/Material/Popup.qml
new file mode 100644
index 0000000000000000000000000000000000000000..1b576385c047f3b41cd327e373d0bef4c2a261af
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/Popup.qml
@@ -0,0 +1,85 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+T.Popup {
+    id: control
+
+    Material.elevation: 24
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    padding: 12
+
+    enter: Transition {
+        // grow_fade_in
+        NumberAnimation { property: "scale"; from: 0.9; to: 1.0; easing.type: Easing.OutQuint; duration: 220 }
+        NumberAnimation { property: "opacity"; from: 0.0; to: 1.0; easing.type: Easing.OutCubic; duration: 150 }
+    }
+
+    exit: Transition {
+        // shrink_fade_out
+        NumberAnimation { property: "scale"; from: 1.0; to: 0.9; easing.type: Easing.OutQuint; duration: 220 }
+        NumberAnimation { property: "opacity"; from: 1.0; to: 0.0; easing.type: Easing.OutCubic; duration: 150 }
+    }
+
+    background: Rectangle {
+        radius: 2
+        color: control.Material.dialogColor
+
+        layer.enabled: control.Material.elevation > 0
+        layer.effect: ElevationEffect {
+            elevation: control.Material.elevation
+        }
+    }
+
+    T.Overlay.modal: Rectangle {
+        color: control.Material.backgroundDimColor
+        Behavior on opacity { NumberAnimation { duration: 150 } }
+    }
+
+    T.Overlay.modeless: Rectangle {
+        color: control.Material.backgroundDimColor
+        Behavior on opacity { NumberAnimation { duration: 150 } }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/ProgressBar.qml b/deployment_test/QtQuick/Controls.2/Material/ProgressBar.qml
new file mode 100644
index 0000000000000000000000000000000000000000..2848f0371ffa98b45e243c9afab61f1b5dddee33
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/ProgressBar.qml
@@ -0,0 +1,67 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+T.ProgressBar {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    contentItem: ProgressBarImpl {
+        implicitHeight: 4
+
+        scale: control.mirrored ? -1 : 1
+        color: control.Material.accentColor
+        progress: control.position
+        indeterminate: control.visible && control.indeterminate
+    }
+
+    background: Rectangle {
+        implicitWidth: 200
+        implicitHeight: 4
+        y: (control.height - height) / 2
+        height: 4
+
+        color: Qt.rgba(control.Material.accentColor.r, control.Material.accentColor.g, control.Material.accentColor.b, 0.25)
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/RadioButton.qml b/deployment_test/QtQuick/Controls.2/Material/RadioButton.qml
new file mode 100644
index 0000000000000000000000000000000000000000..dadcc84f3203b6ddfe3f176fb96060a0d3c8e98f
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/RadioButton.qml
@@ -0,0 +1,83 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+T.RadioButton {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    spacing: 8
+    padding: 8
+    verticalPadding: padding + 6
+
+    indicator: RadioIndicator {
+        x: control.text ? (control.mirrored ? control.width - width - control.rightPadding : control.leftPadding) : control.leftPadding + (control.availableWidth - width) / 2
+        y: control.topPadding + (control.availableHeight - height) / 2
+        control: control
+
+        Ripple {
+            x: (parent.width - width) / 2
+            y: (parent.height - height) / 2
+            width: 28; height: 28
+
+            z: -1
+            anchor: control
+            pressed: control.pressed
+            active: control.down || control.visualFocus || control.hovered
+            color: control.checked ? control.Material.highlightedRippleColor : control.Material.rippleColor
+        }
+    }
+
+    contentItem: Text {
+        leftPadding: control.indicator && !control.mirrored ? control.indicator.width + control.spacing : 0
+        rightPadding: control.indicator && control.mirrored ? control.indicator.width + control.spacing : 0
+
+        text: control.text
+        font: control.font
+        color: control.enabled ? control.Material.foreground : control.Material.hintTextColor
+        elide: Text.ElideRight
+        verticalAlignment: Text.AlignVCenter
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/RadioDelegate.qml b/deployment_test/QtQuick/Controls.2/Material/RadioDelegate.qml
new file mode 100644
index 0000000000000000000000000000000000000000..c977d332095680277dcefe0b07d9ac53b340a1bb
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/RadioDelegate.qml
@@ -0,0 +1,98 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+T.RadioDelegate {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    padding: 16
+    verticalPadding: 8
+    spacing: 16
+
+    icon.width: 24
+    icon.height: 24
+    icon.color: enabled ? Material.foreground : Material.hintTextColor
+
+    indicator: RadioIndicator {
+        x: control.text ? (control.mirrored ? control.leftPadding : control.width - width - control.rightPadding) : control.leftPadding + (control.availableWidth - width) / 2
+        y: control.topPadding + (control.availableHeight - height) / 2
+        control: control
+    }
+
+    contentItem: IconLabel {
+        leftPadding: !control.mirrored ? 0 : control.indicator.width + control.spacing
+        rightPadding: control.mirrored ? 0 : control.indicator.width + control.spacing
+
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+        alignment: control.display === IconLabel.IconOnly || control.display === IconLabel.TextUnderIcon ? Qt.AlignCenter : Qt.AlignLeft
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.enabled ? control.Material.foreground : control.Material.hintTextColor
+    }
+
+    background: Rectangle {
+        implicitHeight: control.Material.delegateHeight
+
+        color: control.highlighted ? control.Material.listHighlightColor : "transparent"
+
+        Ripple {
+            width: parent.width
+            height: parent.height
+
+            clip: visible
+            pressed: control.pressed
+            anchor: control
+            active: control.down || control.visualFocus || control.hovered
+            color: control.Material.rippleColor
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/RadioIndicator.qml b/deployment_test/QtQuick/Controls.2/Material/RadioIndicator.qml
new file mode 100644
index 0000000000000000000000000000000000000000..e2c551848dc916919bcb3b00cadb53155cc72ba6
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/RadioIndicator.qml
@@ -0,0 +1,62 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+Rectangle {
+    id: indicator
+    implicitWidth: 20
+    implicitHeight: 20
+    radius: width / 2
+    border.width: 2
+    border.color: !control.enabled ? control.Material.hintTextColor
+        : control.checked || control.down ? control.Material.accentColor : control.Material.secondaryTextColor
+    color: "transparent"
+
+    property Item control
+
+    Rectangle {
+        x: (parent.width - width) / 2
+        y: (parent.height - height) / 2
+        width: 10
+        height: 10
+        radius: width / 2
+        color: parent.border.color
+        visible: indicator.control.checked || indicator.control.down
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/RangeSlider.qml b/deployment_test/QtQuick/Controls.2/Material/RangeSlider.qml
new file mode 100644
index 0000000000000000000000000000000000000000..f05601a7e027254b5318c5788b6754eead27aa6c
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/RangeSlider.qml
@@ -0,0 +1,92 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+T.RangeSlider {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            first.implicitHandleWidth + leftPadding + rightPadding,
+                            second.implicitHandleWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             first.implicitHandleHeight + topPadding + bottomPadding,
+                             second.implicitHandleHeight + topPadding + bottomPadding)
+
+    padding: 6
+
+    first.handle: SliderHandle {
+        x: control.leftPadding + (control.horizontal ? control.first.visualPosition * (control.availableWidth - width) : (control.availableWidth - width) / 2)
+        y: control.topPadding + (control.horizontal ? (control.availableHeight - height) / 2 : control.first.visualPosition * (control.availableHeight - height))
+        value: first.value
+        handleHasFocus: activeFocus
+        handlePressed: first.pressed
+        handleHovered: first.hovered
+    }
+
+    second.handle: SliderHandle {
+        x: control.leftPadding + (control.horizontal ? control.second.visualPosition * (control.availableWidth - width) : (control.availableWidth - width) / 2)
+        y: control.topPadding + (control.horizontal ? (control.availableHeight - height) / 2 : control.second.visualPosition * (control.availableHeight - height))
+        value: second.value
+        handleHasFocus: activeFocus
+        handlePressed: second.pressed
+        handleHovered: second.hovered
+    }
+
+    background: Rectangle {
+        x: control.leftPadding + (control.horizontal ? 0 : (control.availableWidth - width) / 2)
+        y: control.topPadding + (control.horizontal ? (control.availableHeight - height) / 2 : 0)
+        implicitWidth: control.horizontal ? 200 : 48
+        implicitHeight: control.horizontal ? 48 : 200
+        width: control.horizontal ? control.availableWidth : 4
+        height: control.horizontal ? 4 : control.availableHeight
+        scale: control.horizontal && control.mirrored ? -1 : 1
+        color: control.enabled ? Color.transparent(control.Material.accentColor, 0.33) : control.Material.sliderDisabledColor
+
+        Rectangle {
+            x: control.horizontal ? control.first.position * parent.width : 0
+            y: control.horizontal ? 0 : control.second.visualPosition * parent.height
+            width: control.horizontal ? control.second.position * parent.width - control.first.position * parent.width : 4
+            height: control.horizontal ? 4 : control.second.position * parent.height - control.first.position * parent.height
+
+            color: control.enabled ? control.Material.accentColor : control.Material.sliderDisabledColor
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/RectangularGlow.qml b/deployment_test/QtQuick/Controls.2/Material/RectangularGlow.qml
new file mode 100644
index 0000000000000000000000000000000000000000..c01e536de50045d60a641e0fbcd1e88eac39baed
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/RectangularGlow.qml
@@ -0,0 +1,240 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+
+/*
+   A cross-graphics API implementation of QtGraphicalEffects' RectangularGlow.
+ */
+Item {
+    id: rootItem
+
+    /*
+        This property defines how many pixels outside the item area are reached
+        by the glow.
+
+        The value ranges from 0.0 (no glow) to inf (infinite glow). By default,
+        the property is set to \c 0.0.
+
+        \table
+        \header
+        \li Output examples with different glowRadius values
+        \li
+        \li
+        \row
+            \li \image RectangularGlow_glowRadius1.png
+            \li \image RectangularGlow_glowRadius2.png
+            \li \image RectangularGlow_glowRadius3.png
+        \row
+            \li \b { glowRadius: 10 }
+            \li \b { glowRadius: 20 }
+            \li \b { glowRadius: 40 }
+        \row
+            \li \l spread: 0
+            \li \l spread: 0
+            \li \l spread: 0
+        \row
+            \li \l color: #ffffff
+            \li \l color: #ffffff
+            \li \l color: #ffffff
+        \row
+            \li \l cornerRadius: 25
+            \li \l cornerRadius: 25
+            \li \l cornerRadius: 25
+        \endtable
+
+    */
+    property real glowRadius: 0.0
+
+    /*
+        This property defines how large part of the glow color is strenghtened
+        near the source edges.
+
+        The value ranges from 0.0 (no strenght increase) to 1.0 (maximum
+        strenght increase). By default, the property is set to \c 0.0.
+
+        \table
+        \header
+        \li Output examples with different spread values
+        \li
+        \li
+        \row
+            \li \image RectangularGlow_spread1.png
+            \li \image RectangularGlow_spread2.png
+            \li \image RectangularGlow_spread3.png
+        \row
+            \li \b { spread: 0.0 }
+            \li \b { spread: 0.5 }
+            \li \b { spread: 1.0 }
+        \row
+            \li \l glowRadius: 20
+            \li \l glowRadius: 20
+            \li \l glowRadius: 20
+        \row
+            \li \l color: #ffffff
+            \li \l color: #ffffff
+            \li \l color: #ffffff
+        \row
+            \li \l cornerRadius: 25
+            \li \l cornerRadius: 25
+            \li \l cornerRadius: 25
+        \endtable
+    */
+    property real spread: 0.0
+
+    /*
+        This property defines the RGBA color value which is used for the glow.
+
+        By default, the property is set to \c "white".
+
+        \table
+        \header
+        \li Output examples with different color values
+        \li
+        \li
+        \row
+            \li \image RectangularGlow_color1.png
+            \li \image RectangularGlow_color2.png
+            \li \image RectangularGlow_color3.png
+        \row
+            \li \b { color: #ffffff }
+            \li \b { color: #55ff55 }
+            \li \b { color: #5555ff }
+        \row
+            \li \l glowRadius: 20
+            \li \l glowRadius: 20
+            \li \l glowRadius: 20
+        \row
+            \li \l spread: 0
+            \li \l spread: 0
+            \li \l spread: 0
+        \row
+            \li \l cornerRadius: 25
+            \li \l cornerRadius: 25
+            \li \l cornerRadius: 25
+        \endtable
+    */
+    property color color: "white"
+
+    /*
+        This property defines the corner radius that is used to draw a glow with
+        rounded corners.
+
+        The value ranges from 0.0 to half of the effective width or height of
+        the glow, whichever is smaller. This can be calculated with: \c{
+        min(width, height) / 2.0 + glowRadius}
+
+        By default, the property is bound to glowRadius property. The glow
+        behaves as if the rectangle was blurred when adjusting the glowRadius
+        property.
+
+        \table
+        \header
+        \li Output examples with different cornerRadius values
+        \li
+        \li
+        \row
+            \li \image RectangularGlow_cornerRadius1.png
+            \li \image RectangularGlow_cornerRadius2.png
+            \li \image RectangularGlow_cornerRadius3.png
+        \row
+            \li \b { cornerRadius: 0 }
+            \li \b { cornerRadius: 25 }
+            \li \b { cornerRadius: 50 }
+        \row
+            \li \l glowRadius: 20
+            \li \l glowRadius: 20
+            \li \l glowRadius: 20
+        \row
+            \li \l spread: 0
+            \li \l spread: 0
+            \li \l spread: 0
+        \row
+            \li \l color: #ffffff
+            \li \l color: #ffffff
+            \li \l color: #ffffff
+        \endtable
+    */
+    property real cornerRadius: glowRadius
+
+    /*
+        This property allows the effect output pixels to be cached in order to
+        improve the rendering performance.
+
+        Every time the source or effect properties are changed, the pixels in
+        the cache must be updated. Memory consumption is increased, because an
+        extra buffer of memory is required for storing the effect output.
+
+        It is recommended to disable the cache when the source or the effect
+        properties are animated.
+
+        By default, the property is set to \c false.
+    */
+    property bool cached: false
+
+    ShaderEffectSource {
+         id: cacheItem
+         anchors.fill: shaderItem
+         visible: rootItem.cached
+         smooth: true
+         sourceItem: shaderItem
+         live: true
+         hideSource: visible
+     }
+
+    ShaderEffect {
+        id: shaderItem
+
+        x: (parent.width - width) / 2.0
+        y: (parent.height - height) / 2.0
+        width: parent.width + rootItem.glowRadius * 2 + cornerRadius * 2
+        height: parent.height + rootItem.glowRadius * 2 + cornerRadius * 2
+
+        function clampedCornerRadius() {
+            var maxCornerRadius = Math.min(rootItem.width, rootItem.height) / 2 + rootItem.glowRadius;
+            return Math.max(0, Math.min(rootItem.cornerRadius, maxCornerRadius))
+        }
+
+        property color color: rootItem.color
+        property real inverseSpread: 1.0 - rootItem.spread
+        property real relativeSizeX: ((inverseSpread * inverseSpread) * rootItem.glowRadius + cornerRadius * 2.0) / width
+        property real relativeSizeY: relativeSizeX * (width / height)
+        property real spread: rootItem.spread / 2.0
+        property real cornerRadius: clampedCornerRadius()
+
+        fragmentShader: "qrc:/qt-project.org/imports/QtQuick/Controls.2/Material/shaders/RectangularGlow.frag"
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/RoundButton.qml b/deployment_test/QtQuick/Controls.2/Material/RoundButton.qml
new file mode 100644
index 0000000000000000000000000000000000000000..13d0f9dbe4e0467d091ae4f51eb678b172131e95
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/RoundButton.qml
@@ -0,0 +1,115 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+T.RoundButton {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    topInset: 6
+    leftInset: 6
+    rightInset: 6
+    bottomInset: 6
+    padding: 12
+    spacing: 6
+
+    icon.width: 24
+    icon.height: 24
+    icon.color: !enabled ? Material.hintTextColor :
+        flat && highlighted ? Material.accentColor :
+        highlighted ? Material.primaryHighlightedTextColor : Material.foreground
+
+    Material.elevation: flat ? control.down || control.hovered ? 2 : 0
+                             : control.down ? 12 : 6
+    Material.background: flat ? "transparent" : undefined
+
+    contentItem: IconLabel {
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: !control.enabled ? control.Material.hintTextColor :
+            control.flat && control.highlighted ? control.Material.accentColor :
+            control.highlighted ? control.Material.primaryHighlightedTextColor : control.Material.foreground
+    }
+
+    // TODO: Add a proper ripple/ink effect for mouse/touch input and focus state
+    background: Rectangle {
+        implicitWidth: control.Material.buttonHeight
+        implicitHeight: control.Material.buttonHeight
+
+        radius: control.radius
+        color: !control.enabled ? control.Material.buttonDisabledColor
+            : control.checked || control.highlighted ? control.Material.highlightedButtonColor : control.Material.buttonColor
+
+        Rectangle {
+            width: parent.width
+            height: parent.height
+            radius: control.radius
+            visible: control.hovered || control.visualFocus
+            color: control.Material.rippleColor
+        }
+
+        Rectangle {
+            width: parent.width
+            height: parent.height
+            radius: control.radius
+            visible: control.down
+            color: control.Material.rippleColor
+        }
+
+        // The layer is disabled when the button color is transparent so that you can do
+        // Material.background: "transparent" and get a proper flat button without needing
+        // to set Material.elevation as well
+        layer.enabled: control.enabled && control.Material.buttonColor.a > 0
+        layer.effect: ElevationEffect {
+            elevation: control.Material.elevation
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/ScrollBar.qml b/deployment_test/QtQuick/Controls.2/Material/ScrollBar.qml
new file mode 100644
index 0000000000000000000000000000000000000000..fda643462e3004b32101d21abe783e2330ebd622
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/ScrollBar.qml
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Material 2.12
+
+T.ScrollBar {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    padding: control.interactive ? 1 : 2
+    visible: control.policy !== T.ScrollBar.AlwaysOff
+    minimumSize: orientation == Qt.Horizontal ? height / width : width / height
+
+    contentItem: Rectangle {
+        implicitWidth: control.interactive ? 13 : 4
+        implicitHeight: control.interactive ? 13 : 4
+
+        color: control.pressed ? control.Material.scrollBarPressedColor :
+               control.interactive && control.hovered ? control.Material.scrollBarHoveredColor : control.Material.scrollBarColor
+        opacity: 0.0
+    }
+
+    background: Rectangle {
+        implicitWidth: control.interactive ? 16 : 4
+        implicitHeight: control.interactive ? 16 : 4
+        color: "#0e000000"
+        opacity: 0.0
+        visible: control.interactive
+    }
+
+    states: State {
+        name: "active"
+        when: control.policy === T.ScrollBar.AlwaysOn || (control.active && control.size < 1.0)
+    }
+
+    transitions: [
+        Transition {
+            to: "active"
+            NumberAnimation { targets: [control.contentItem, control.background]; property: "opacity"; to: 1.0 }
+        },
+        Transition {
+            from: "active"
+            SequentialAnimation {
+                PropertyAction{ targets: [control.contentItem, control.background]; property: "opacity"; value: 1.0 }
+                PauseAnimation { duration: 2450 }
+                NumberAnimation { targets: [control.contentItem, control.background]; property: "opacity"; to: 0.0 }
+            }
+        }
+    ]
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/ScrollIndicator.qml b/deployment_test/QtQuick/Controls.2/Material/ScrollIndicator.qml
new file mode 100644
index 0000000000000000000000000000000000000000..19f23ad2d4409c098e526b1d4a6872f364f6f738
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/ScrollIndicator.qml
@@ -0,0 +1,75 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Material 2.12
+
+T.ScrollIndicator {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    padding: 2
+
+    contentItem: Rectangle {
+        implicitWidth: 4
+        implicitHeight: 4
+
+        color: control.Material.scrollBarColor
+        visible: control.size < 1.0
+        opacity: 0.0
+
+        states: State {
+            name: "active"
+            when: control.active
+            PropertyChanges { target: control.contentItem; opacity: 0.75 }
+        }
+
+        transitions: [
+            Transition {
+                from: "active"
+                SequentialAnimation {
+                    PauseAnimation { duration: 450 }
+                    NumberAnimation { target: control.contentItem; duration: 200; property: "opacity"; to: 0.0 }
+                }
+            }
+        ]
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/Slider.qml b/deployment_test/QtQuick/Controls.2/Material/Slider.qml
new file mode 100644
index 0000000000000000000000000000000000000000..ac7a0c420d8fb9dd2f0343e62973c5d0c96851ac
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/Slider.qml
@@ -0,0 +1,81 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+T.Slider {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitHandleWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitHandleHeight + topPadding + bottomPadding)
+
+    padding: 6
+
+    handle: SliderHandle {
+        x: control.leftPadding + (control.horizontal ? control.visualPosition * (control.availableWidth - width) : (control.availableWidth - width) / 2)
+        y: control.topPadding + (control.horizontal ? (control.availableHeight - height) / 2 : control.visualPosition * (control.availableHeight - height))
+        value: control.value
+        handleHasFocus: control.visualFocus
+        handlePressed: control.pressed
+        handleHovered: control.hovered
+    }
+
+    background: Rectangle {
+        x: control.leftPadding + (control.horizontal ? 0 : (control.availableWidth - width) / 2)
+        y: control.topPadding + (control.horizontal ? (control.availableHeight - height) / 2 : 0)
+        implicitWidth: control.horizontal ? 200 : 48
+        implicitHeight: control.horizontal ? 48 : 200
+        width: control.horizontal ? control.availableWidth : 4
+        height: control.horizontal ? 4 : control.availableHeight
+        scale: control.horizontal && control.mirrored ? -1 : 1
+        color: control.enabled ? Color.transparent(control.Material.accentColor, 0.33) : control.Material.sliderDisabledColor
+
+        Rectangle {
+            x: control.horizontal ? 0 : (parent.width - width) / 2
+            y: control.horizontal ? (parent.height - height) / 2 : control.visualPosition * parent.height
+            width: control.horizontal ? control.position * parent.width : 4
+            height: control.horizontal ? 4 : control.position * parent.height
+
+            color: control.enabled ? control.Material.accentColor : control.Material.sliderDisabledColor
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/SliderHandle.qml b/deployment_test/QtQuick/Controls.2/Material/SliderHandle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..c9078bc8a982f8dde969f8b42c18e10cca6c6bed
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/SliderHandle.qml
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+Item {
+    id: root
+    implicitWidth: initialSize
+    implicitHeight: initialSize
+
+    property real value: 0
+    property bool handleHasFocus: false
+    property bool handlePressed: false
+    property bool handleHovered: false
+    readonly property int initialSize: 13
+    readonly property var control: parent
+
+    Rectangle {
+        id: handleRect
+        width: parent.width
+        height: parent.height
+        radius: width / 2
+        scale: root.handlePressed ? 1.5 : 1
+        color: control.enabled ? root.control.Material.accentColor : root.control.Material.sliderDisabledColor
+
+        Behavior on scale {
+            NumberAnimation {
+                duration: 250
+            }
+        }
+    }
+
+    Ripple {
+        x: (parent.width - width) / 2
+        y: (parent.height - height) / 2
+        width: 22; height: 22
+        pressed: root.handlePressed
+        active: root.handlePressed || root.handleHasFocus || root.handleHovered
+        color: root.control.Material.highlightedRippleColor
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/SpinBox.qml b/deployment_test/QtQuick/Controls.2/Material/SpinBox.qml
new file mode 100644
index 0000000000000000000000000000000000000000..23c86bc3d538be2fb6f387fbc3d0151e39273d00
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/SpinBox.qml
@@ -0,0 +1,156 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+T.SpinBox {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentItem.implicitWidth +
+                            up.implicitIndicatorWidth +
+                            down.implicitIndicatorWidth)
+    implicitHeight: Math.max(implicitContentHeight + topPadding + bottomPadding,
+                             implicitBackgroundHeight,
+                             up.implicitIndicatorHeight,
+                             down.implicitIndicatorHeight)
+
+    spacing: 6
+    topPadding: 8
+    bottomPadding: 16
+    leftPadding: (control.mirrored ? (up.indicator ? up.indicator.width : 0) : (down.indicator ? down.indicator.width : 0))
+    rightPadding: (control.mirrored ? (down.indicator ? down.indicator.width : 0) : (up.indicator ? up.indicator.width : 0))
+
+    validator: IntValidator {
+        locale: control.locale.name
+        bottom: Math.min(control.from, control.to)
+        top: Math.max(control.from, control.to)
+    }
+
+    contentItem: TextInput {
+        text: control.displayText
+
+        font: control.font
+        color: enabled ? control.Material.foreground : control.Material.hintTextColor
+        selectionColor: control.Material.textSelectionColor
+        selectedTextColor: control.Material.foreground
+        horizontalAlignment: Qt.AlignHCenter
+        verticalAlignment: Qt.AlignVCenter
+
+        cursorDelegate: CursorDelegate { }
+
+        readOnly: !control.editable
+        validator: control.validator
+        inputMethodHints: control.inputMethodHints
+    }
+
+    up.indicator: Item {
+        x: control.mirrored ? 0 : parent.width - width
+        implicitWidth: control.Material.touchTarget
+        implicitHeight: control.Material.touchTarget
+        height: parent.height
+        width: height
+
+        Ripple {
+            clipRadius: 2
+            x: control.spacing
+            y: control.spacing
+            width: parent.width - 2 * control.spacing
+            height: parent.height - 2 * control.spacing
+            pressed: control.up.pressed
+            active: control.up.pressed || control.up.hovered || control.visualFocus
+            color: control.Material.rippleColor
+        }
+
+        Rectangle {
+            x: (parent.width - width) / 2
+            y: (parent.height - height) / 2
+            width: Math.min(parent.width / 3, parent.height / 3)
+            height: 2
+            color: enabled ? control.Material.foreground : control.Material.spinBoxDisabledIconColor
+        }
+        Rectangle {
+            x: (parent.width - width) / 2
+            y: (parent.height - height) / 2
+            width: 2
+            height: Math.min(parent.width / 3, parent.height / 3)
+            color: enabled ? control.Material.foreground : control.Material.spinBoxDisabledIconColor
+        }
+    }
+
+    down.indicator: Item {
+        x: control.mirrored ? parent.width - width : 0
+        implicitWidth: control.Material.touchTarget
+        implicitHeight: control.Material.touchTarget
+        height: parent.height
+        width: height
+
+        Ripple {
+            clipRadius: 2
+            x: control.spacing
+            y: control.spacing
+            width: parent.width - 2 * control.spacing
+            height: parent.height - 2 * control.spacing
+            pressed: control.down.pressed
+            active: control.down.pressed || control.down.hovered || control.visualFocus
+            color: control.Material.rippleColor
+        }
+
+        Rectangle {
+            x: (parent.width - width) / 2
+            y: (parent.height - height) / 2
+            width: parent.width / 3
+            height: 2
+            color: enabled ? control.Material.foreground : control.Material.spinBoxDisabledIconColor
+        }
+    }
+
+    background: Item {
+        implicitWidth: 192
+        implicitHeight: control.Material.touchTarget
+
+        Rectangle {
+            x: parent.width / 2 - width / 2
+            y: parent.y + parent.height - height - control.bottomPadding / 2
+            width: control.availableWidth
+            height: control.activeFocus ? 2 : 1
+            color: control.activeFocus ? control.Material.accentColor : control.Material.hintTextColor
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/SplitView.qml b/deployment_test/QtQuick/Controls.2/Material/SplitView.qml
new file mode 100644
index 0000000000000000000000000000000000000000..5544e833e9f1d5d53d8d2392d6aa65e95f941dd2
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/SplitView.qml
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.13
+import QtQuick.Templates 2.13 as T
+import QtQuick.Controls 2.13
+import QtQuick.Controls.impl 2.13
+import QtQuick.Controls.Material 2.13
+
+T.SplitView {
+    id: control
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    handle: Rectangle {
+        implicitWidth: control.orientation === Qt.Horizontal ? 6 : control.width
+        implicitHeight: control.orientation === Qt.Horizontal ? control.height : 6
+        color: T.SplitHandle.pressed ? control.Material.background
+            : Qt.lighter(control.Material.background, T.SplitHandle.hovered ? 1.2 : 1.1)
+
+        Rectangle {
+            color: control.Material.secondaryTextColor
+            width: control.orientation === Qt.Horizontal ? thickness : length
+            height: control.orientation === Qt.Horizontal ? length : thickness
+            radius: thickness
+            x: (parent.width - width) / 2
+            y: (parent.height - height) / 2
+
+            property int length: parent.T.SplitHandle.pressed ? 3 : 8
+            readonly property int thickness: parent.T.SplitHandle.pressed ? 3 : 1
+
+            Behavior on length {
+                NumberAnimation {
+                    duration: 100
+                }
+            }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/StackView.qml b/deployment_test/QtQuick/Controls.2/Material/StackView.qml
new file mode 100644
index 0000000000000000000000000000000000000000..dd5d6ce657dd9b6ea8e50e82969110b61c187ad4
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/StackView.qml
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Material 2.12
+
+T.StackView {
+    id: control
+
+    popEnter: Transition {
+        // slide_in_left
+        NumberAnimation { property: "x"; from: (control.mirrored ? -0.5 : 0.5) *  -control.width; to: 0; duration: 200; easing.type: Easing.OutCubic }
+        NumberAnimation { property: "opacity"; from: 0.0; to: 1.0; duration: 200; easing.type: Easing.OutCubic }
+    }
+
+    popExit: Transition {
+        // slide_out_right
+        NumberAnimation { property: "x"; from: 0; to: (control.mirrored ? -0.5 : 0.5) * control.width; duration: 200; easing.type: Easing.OutCubic }
+        NumberAnimation { property: "opacity"; from: 1.0; to: 0.0; duration: 200; easing.type: Easing.OutCubic }
+    }
+
+    pushEnter: Transition {
+        // slide_in_right
+        NumberAnimation { property: "x"; from: (control.mirrored ? -0.5 : 0.5) * control.width; to: 0; duration: 200; easing.type: Easing.OutCubic }
+        NumberAnimation { property: "opacity"; from: 0.0; to: 1.0; duration: 200; easing.type: Easing.OutCubic }
+    }
+
+    pushExit: Transition {
+        // slide_out_left
+        NumberAnimation { property: "x"; from: 0; to: (control.mirrored ? -0.5 : 0.5) * -control.width; duration: 200; easing.type: Easing.OutCubic }
+        NumberAnimation { property: "opacity"; from: 1.0; to: 0.0; duration: 200; easing.type: Easing.OutCubic }
+    }
+
+    replaceEnter: Transition {
+        // slide_in_right
+        NumberAnimation { property: "x"; from: (control.mirrored ? -0.5 : 0.5) * control.width; to: 0; duration: 200; easing.type: Easing.OutCubic }
+        NumberAnimation { property: "opacity"; from: 0.0; to: 1.0; duration: 200; easing.type: Easing.OutCubic }
+    }
+
+    replaceExit: Transition {
+        // slide_out_left
+        NumberAnimation { property: "x"; from: 0; to: (control.mirrored ? -0.5 : 0.5) * -control.width; duration: 200; easing.type: Easing.OutCubic }
+        NumberAnimation { property: "opacity"; from: 1.0; to: 0.0; duration: 200; easing.type: Easing.OutCubic }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/SwipeDelegate.qml b/deployment_test/QtQuick/Controls.2/Material/SwipeDelegate.qml
new file mode 100644
index 0000000000000000000000000000000000000000..d06799be020056eb4f16e4315e411ad6d84f29a6
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/SwipeDelegate.qml
@@ -0,0 +1,99 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+T.SwipeDelegate {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    padding: 16
+    verticalPadding: 8
+    spacing: 16
+
+    icon.width: 24
+    icon.height: 24
+    icon.color: enabled ? Material.foreground : Material.hintTextColor
+
+    swipe.transition: Transition { SmoothedAnimation { velocity: 3; easing.type: Easing.InOutCubic } }
+
+    contentItem: IconLabel {
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+        alignment: control.display === IconLabel.IconOnly || control.display === IconLabel.TextUnderIcon ? Qt.AlignCenter : Qt.AlignLeft
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.enabled ? control.Material.foreground : control.Material.hintTextColor
+    }
+
+    background: Rectangle {
+        implicitHeight: control.Material.delegateHeight
+
+        color: control.Material.backgroundColor
+
+        Rectangle {
+            width: parent.width
+            height: parent.height
+            visible: control.highlighted
+            color: control.Material.listHighlightColor
+        }
+
+        Ripple {
+            width: parent.width
+            height: parent.height
+
+            clip: visible
+            pressed: control.pressed
+            anchor: control
+            active: control.down || control.visualFocus || control.hovered
+            color: control.Material.rippleColor
+            enabled: control.swipe.position === 0
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/SwipeView.qml b/deployment_test/QtQuick/Controls.2/Material/SwipeView.qml
new file mode 100644
index 0000000000000000000000000000000000000000..a84f16c5b0a4a3f28c4398e7d168f44064733d38
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/SwipeView.qml
@@ -0,0 +1,66 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Material 2.12
+
+T.SwipeView {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    contentItem: ListView {
+        model: control.contentModel
+        interactive: control.interactive
+        currentIndex: control.currentIndex
+        focus: control.focus
+
+        spacing: control.spacing
+        orientation: control.orientation
+        snapMode: ListView.SnapOneItem
+        boundsBehavior: Flickable.StopAtBounds
+
+        highlightRangeMode: ListView.StrictlyEnforceRange
+        preferredHighlightBegin: 0
+        preferredHighlightEnd: 0
+        highlightMoveDuration: 250
+        maximumFlickVelocity: 4 * (control.orientation === Qt.Horizontal ? width : height)
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/Switch.qml b/deployment_test/QtQuick/Controls.2/Material/Switch.qml
new file mode 100644
index 0000000000000000000000000000000000000000..fd0db9256cf7f6c76ea12330381159b3abb67f48
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/Switch.qml
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+import QtQuick.Templates 2.12 as T
+
+T.Switch {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    padding: 8
+    spacing: 8
+
+    indicator: SwitchIndicator {
+        x: text ? (control.mirrored ? control.width - width - control.rightPadding : control.leftPadding) : control.leftPadding + (control.availableWidth - width) / 2
+        y: control.topPadding + (control.availableHeight - height) / 2
+        control: control
+
+        Ripple {
+            x: parent.handle.x + parent.handle.width / 2 - width / 2
+            y: parent.handle.y + parent.handle.height / 2 - height / 2
+            width: 28; height: 28
+            pressed: control.pressed
+            active: control.down || control.visualFocus || control.hovered
+            color: control.checked ? control.Material.highlightedRippleColor : control.Material.rippleColor
+        }
+    }
+
+    contentItem: Text {
+        leftPadding: control.indicator && !control.mirrored ? control.indicator.width + control.spacing : 0
+        rightPadding: control.indicator && control.mirrored ? control.indicator.width + control.spacing : 0
+
+        text: control.text
+        font: control.font
+        color: control.enabled ? control.Material.foreground : control.Material.hintTextColor
+        elide: Text.ElideRight
+        verticalAlignment: Text.AlignVCenter
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/SwitchDelegate.qml b/deployment_test/QtQuick/Controls.2/Material/SwitchDelegate.qml
new file mode 100644
index 0000000000000000000000000000000000000000..834a3dfa8502b0da9c4c2a71755f4f7d0e9579d8
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/SwitchDelegate.qml
@@ -0,0 +1,98 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+T.SwitchDelegate {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    padding: 16
+    verticalPadding: Material.switchDelegateVerticalPadding
+    spacing: 16
+
+    icon.width: 24
+    icon.height: 24
+    icon.color: enabled ? Material.foreground : Material.hintTextColor
+
+    indicator: SwitchIndicator {
+        x: control.text ? (control.mirrored ? control.leftPadding : control.width - width - control.rightPadding) : control.leftPadding + (control.availableWidth - width) / 2
+        y: control.topPadding + (control.availableHeight - height) / 2
+        control: control
+    }
+
+    contentItem: IconLabel {
+        leftPadding: !control.mirrored ? 0 : control.indicator.width + control.spacing
+        rightPadding: control.mirrored ? 0 : control.indicator.width + control.spacing
+
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+        alignment: control.display === IconLabel.IconOnly || control.display === IconLabel.TextUnderIcon ? Qt.AlignCenter : Qt.AlignLeft
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.enabled ? control.Material.foreground : control.Material.hintTextColor
+    }
+
+    background: Rectangle {
+        implicitHeight: control.Material.delegateHeight
+
+        color: control.highlighted ? control.Material.listHighlightColor : "transparent"
+
+        Ripple {
+            width: parent.width
+            height: parent.height
+
+            clip: visible
+            pressed: control.pressed
+            anchor: control
+            active: control.down || control.visualFocus || control.hovered
+            color: control.Material.rippleColor
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/SwitchIndicator.qml b/deployment_test/QtQuick/Controls.2/Material/SwitchIndicator.qml
new file mode 100644
index 0000000000000000000000000000000000000000..3034e771acc8ddb93195207c4596a02b72a633c8
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/SwitchIndicator.qml
@@ -0,0 +1,81 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+Item {
+    id: indicator
+    implicitWidth: 38
+    implicitHeight: 32
+
+    property Item control
+    property alias handle: handle
+
+    Material.elevation: 1
+
+    Rectangle {
+        width: parent.width
+        height: 14
+        radius: height / 2
+        y: parent.height / 2 - height / 2
+        color: indicator.control.enabled ? (indicator.control.checked ? indicator.control.Material.switchCheckedTrackColor : indicator.control.Material.switchUncheckedTrackColor)
+                               : indicator.control.Material.switchDisabledTrackColor
+    }
+
+    Rectangle {
+        id: handle
+        x: Math.max(0, Math.min(parent.width - width, indicator.control.visualPosition * parent.width - (width / 2)))
+        y: (parent.height - height) / 2
+        width: 20
+        height: 20
+        radius: width / 2
+        color: indicator.control.enabled ? (indicator.control.checked ? indicator.control.Material.switchCheckedHandleColor : indicator.control.Material.switchUncheckedHandleColor)
+                               : indicator.control.Material.switchDisabledHandleColor
+
+        Behavior on x {
+            enabled: !indicator.control.pressed
+            SmoothedAnimation {
+                duration: 300
+            }
+        }
+        layer.enabled: indicator.Material.elevation > 0
+        layer.effect: ElevationEffect {
+            elevation: indicator.Material.elevation
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/TabBar.qml b/deployment_test/QtQuick/Controls.2/Material/TabBar.qml
new file mode 100644
index 0000000000000000000000000000000000000000..98c9132ae509b84a1a7f01bdee4012835a2376bc
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/TabBar.qml
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+T.TabBar {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    spacing: 1
+
+    contentItem: ListView {
+        model: control.contentModel
+        currentIndex: control.currentIndex
+
+        spacing: control.spacing
+        orientation: ListView.Horizontal
+        boundsBehavior: Flickable.StopAtBounds
+        flickableDirection: Flickable.AutoFlickIfNeeded
+        snapMode: ListView.SnapToItem
+
+        highlightMoveDuration: 250
+        highlightResizeDuration: 0
+        highlightFollowsCurrentItem: true
+        highlightRangeMode: ListView.ApplyRange
+        preferredHighlightBegin: 48
+        preferredHighlightEnd: width - 48
+
+        highlight: Item {
+            z: 2
+            Rectangle {
+                height: 2
+                width: parent.width
+                y: control.position === T.TabBar.Footer ? 0 : parent.height - height
+                color: control.Material.accentColor
+            }
+        }
+    }
+
+    background: Rectangle {
+        color: control.Material.backgroundColor
+
+        layer.enabled: control.Material.elevation > 0
+        layer.effect: ElevationEffect {
+            elevation: control.Material.elevation
+            fullWidth: true
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/TabButton.qml b/deployment_test/QtQuick/Controls.2/Material/TabButton.qml
new file mode 100644
index 0000000000000000000000000000000000000000..5245652c23137190d34a57a003cf3dd2d141fc77
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/TabButton.qml
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+T.TabButton {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    padding: 12
+    spacing: 6
+
+    icon.width: 24
+    icon.height: 24
+    icon.color: !enabled ? Material.hintTextColor : down || checked ? Material.accentColor : Material.foreground
+
+    contentItem: IconLabel {
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: !control.enabled ? control.Material.hintTextColor : control.down || control.checked ? control.Material.accentColor : control.Material.foreground
+    }
+
+    background: Ripple {
+        implicitHeight: control.Material.touchTarget
+
+        clip: true
+        pressed: control.pressed
+        anchor: control
+        active: control.down || control.visualFocus || control.hovered
+        color: control.Material.rippleColor
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/TextArea.qml b/deployment_test/QtQuick/Controls.2/Material/TextArea.qml
new file mode 100644
index 0000000000000000000000000000000000000000..249b64017c765c81bdfb0e4174ccb8083e88cc00
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/TextArea.qml
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+T.TextArea {
+    id: control
+
+    implicitWidth: Math.max(contentWidth + leftPadding + rightPadding,
+                            implicitBackgroundWidth + leftInset + rightInset,
+                            placeholder.implicitWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(contentHeight + topPadding + bottomPadding,
+                             implicitBackgroundHeight + topInset + bottomInset,
+                             placeholder.implicitHeight + 1 + topPadding + bottomPadding)
+
+    topPadding: 8
+    bottomPadding: 16
+
+    color: enabled ? Material.foreground : Material.hintTextColor
+    selectionColor: Material.accentColor
+    selectedTextColor: Material.primaryHighlightedTextColor
+    placeholderTextColor: Material.hintTextColor
+    cursorDelegate: CursorDelegate { }
+
+    PlaceholderText {
+        id: placeholder
+        x: control.leftPadding
+        y: control.topPadding
+        width: control.width - (control.leftPadding + control.rightPadding)
+        height: control.height - (control.topPadding + control.bottomPadding)
+        text: control.placeholderText
+        font: control.font
+        color: control.placeholderTextColor
+        verticalAlignment: control.verticalAlignment
+        elide: Text.ElideRight
+        renderType: control.renderType
+        visible: !control.length && !control.preeditText && (!control.activeFocus || control.horizontalAlignment !== Qt.AlignHCenter)
+    }
+
+    background: Rectangle {
+        y: parent.height - height - control.bottomPadding / 2
+        implicitWidth: 120
+        height: control.activeFocus ? 2 : 1
+        color: control.activeFocus ? control.Material.accentColor : control.Material.hintTextColor
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/TextField.qml b/deployment_test/QtQuick/Controls.2/Material/TextField.qml
new file mode 100644
index 0000000000000000000000000000000000000000..ed42b295d492186cd96bc3dd6c45f66b77e0395e
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/TextField.qml
@@ -0,0 +1,86 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+T.TextField {
+    id: control
+
+    implicitWidth: implicitBackgroundWidth + leftInset + rightInset
+                   || Math.max(contentWidth, placeholder.implicitWidth) + leftPadding + rightPadding
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding,
+                             placeholder.implicitHeight + topPadding + bottomPadding)
+
+    topPadding: 8
+    bottomPadding: 16
+
+    color: enabled ? Material.foreground : Material.hintTextColor
+    selectionColor: Material.accentColor
+    selectedTextColor: Material.primaryHighlightedTextColor
+    placeholderTextColor: Material.hintTextColor
+    verticalAlignment: TextInput.AlignVCenter
+
+    cursorDelegate: CursorDelegate { }
+
+    PlaceholderText {
+        id: placeholder
+        x: control.leftPadding
+        y: control.topPadding
+        width: control.width - (control.leftPadding + control.rightPadding)
+        height: control.height - (control.topPadding + control.bottomPadding)
+        text: control.placeholderText
+        font: control.font
+        color: control.placeholderTextColor
+        verticalAlignment: control.verticalAlignment
+        elide: Text.ElideRight
+        renderType: control.renderType
+        visible: !control.length && !control.preeditText && (!control.activeFocus || control.horizontalAlignment !== Qt.AlignHCenter)
+    }
+
+    background: Rectangle {
+        y: control.height - height - control.bottomPadding + 8
+        implicitWidth: 120
+        height: control.activeFocus || control.hovered ? 2 : 1
+        color: control.activeFocus ? control.Material.accentColor
+                                   : (control.hovered ? control.Material.primaryTextColor : control.Material.hintTextColor)
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/ToolBar.qml b/deployment_test/QtQuick/Controls.2/Material/ToolBar.qml
new file mode 100644
index 0000000000000000000000000000000000000000..5b887598ebee6500ff5e6f42553c666cdaa8e26b
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/ToolBar.qml
@@ -0,0 +1,66 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+T.ToolBar {
+    id: control
+
+    Material.elevation: 4
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    Material.foreground: Material.toolTextColor
+
+    spacing: 16
+
+    background: Rectangle {
+        implicitHeight: 48
+        color: control.Material.toolBarColor
+
+        layer.enabled: control.Material.elevation > 0
+        layer.effect: ElevationEffect {
+            elevation: control.Material.elevation
+            fullWidth: true
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/ToolButton.qml b/deployment_test/QtQuick/Controls.2/Material/ToolButton.qml
new file mode 100644
index 0000000000000000000000000000000000000000..69c424414e0d88ed801a94a24e194bbea938deb6
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/ToolButton.qml
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Material 2.12
+import QtQuick.Controls.Material.impl 2.12
+
+T.ToolButton {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    padding: 6
+    spacing: 6
+
+    icon.width: 24
+    icon.height: 24
+    icon.color: !enabled ? Material.hintTextColor : checked || highlighted ? Material.accent : Material.foreground
+
+    contentItem: IconLabel {
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: !control.enabled ? control.Material.hintTextColor :
+                control.checked || control.highlighted ? control.Material.accent : control.Material.foreground
+    }
+
+    background: Ripple {
+        implicitWidth: control.Material.touchTarget
+        implicitHeight: control.Material.touchTarget
+
+        readonly property bool square: control.contentItem.width <= control.contentItem.height
+
+        x: (parent.width - width) / 2
+        y: (parent.height - height) / 2
+        clip: !square
+        width: square ? parent.height / 2 : parent.width
+        height: square ? parent.height / 2 : parent.height
+        pressed: control.pressed
+        anchor: control
+        active: control.enabled && (control.down || control.visualFocus || control.hovered)
+        color: control.Material.rippleColor
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/ToolSeparator.qml b/deployment_test/QtQuick/Controls.2/Material/ToolSeparator.qml
new file mode 100644
index 0000000000000000000000000000000000000000..9436765733c6cd08437de5667bbe9ff1291f193e
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/ToolSeparator.qml
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Material 2.12
+
+T.ToolSeparator {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    horizontalPadding: vertical ? 12 : 5
+    verticalPadding: vertical ? 5 : 12
+
+    contentItem: Rectangle {
+        implicitWidth: vertical ? 1 : 38
+        implicitHeight: vertical ? 38 : 1
+        color: control.Material.hintTextColor
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/ToolTip.qml b/deployment_test/QtQuick/Controls.2/Material/ToolTip.qml
new file mode 100644
index 0000000000000000000000000000000000000000..83afe4b1f145ae6148fcd4d1f13dd876f5dafa58
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/ToolTip.qml
@@ -0,0 +1,83 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Material 2.12
+
+T.ToolTip {
+    id: control
+
+    x: parent ? (parent.width - implicitWidth) / 2 : 0
+    y: -implicitHeight - 24
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    margins: 12
+    padding: 8
+    horizontalPadding: padding + 8
+
+    closePolicy: T.Popup.CloseOnEscape | T.Popup.CloseOnPressOutsideParent | T.Popup.CloseOnReleaseOutsideParent
+
+    Material.theme: Material.Dark
+
+    enter: Transition {
+        // toast_enter
+        NumberAnimation { property: "opacity"; from: 0.0; to: 1.0; easing.type: Easing.OutQuad; duration: 500 }
+    }
+
+    exit: Transition {
+        // toast_exit
+        NumberAnimation { property: "opacity"; from: 1.0; to: 0.0; easing.type: Easing.InQuad; duration: 500 }
+    }
+
+    contentItem: Text {
+        text: control.text
+        font: control.font
+        wrapMode: Text.Wrap
+        color: control.Material.foreground
+    }
+
+    background: Rectangle {
+        implicitHeight: control.Material.tooltipHeight
+        color: control.Material.tooltipColor
+        opacity: 0.9
+        radius: 2
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/Tumbler.qml b/deployment_test/QtQuick/Controls.2/Material/Tumbler.qml
new file mode 100644
index 0000000000000000000000000000000000000000..30d66c5828879304f749a5de079cd745613a637b
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/Tumbler.qml
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Material 2.12
+
+T.Tumbler {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding) || 60 // ### remove 60 in Qt 6
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding) || 200 // ### remove 200 in Qt 6
+
+    delegate: Text {
+        text: modelData
+        color: control.Material.foreground
+        font: control.font
+        opacity: (1.0 - Math.abs(Tumbler.displacement) / (control.visibleItemCount / 2)) * (control.enabled ? 1 : 0.6)
+        horizontalAlignment: Text.AlignHCenter
+        verticalAlignment: Text.AlignVCenter
+    }
+
+    contentItem: TumblerView {
+        implicitWidth: 60
+        implicitHeight: 200
+        model: control.model
+        delegate: control.delegate
+        path: Path {
+            startX: control.contentItem.width / 2
+            startY: -control.contentItem.delegateHeight / 2
+            PathLine {
+                x: control.contentItem.width / 2
+                y: (control.visibleItemCount + 1) * control.contentItem.delegateHeight - control.contentItem.delegateHeight / 2
+            }
+        }
+
+        property real delegateHeight: control.availableHeight / control.visibleItemCount
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/VerticalHeaderView.qml b/deployment_test/QtQuick/Controls.2/Material/VerticalHeaderView.qml
new file mode 100644
index 0000000000000000000000000000000000000000..5fc5aebeab5adb32fb99418a60b87f02f29ae033
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/VerticalHeaderView.qml
@@ -0,0 +1,69 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.15
+import QtQuick.Controls 2.15
+import QtQuick.Templates 2.15 as T
+import QtQuick.Controls.Material 2.15
+import QtQuick.Controls.Material.impl 2.15
+
+T.VerticalHeaderView {
+    id: control
+
+    implicitWidth: contentWidth
+    implicitHeight: syncView ? syncView.height : 0
+
+    delegate: Rectangle {
+        // Qt6: add cellPadding (and font etc) as public API in headerview
+        readonly property real cellPadding: 8
+
+        implicitWidth: Math.max(control.width, text.implicitWidth + (cellPadding * 2))
+        implicitHeight: text.implicitHeight + (cellPadding * 2)
+        color: control.Material.backgroundColor
+
+        Text {
+            id: text
+            text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole]
+                                        : model[control.textRole])
+                                   : modelData
+            width: parent.width
+            height: parent.height
+            horizontalAlignment: Text.AlignHCenter
+            verticalAlignment: Text.AlignVCenter
+            color: enabled ? control.Material.foreground : control.Material.hintTextColor
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/plugins.qmltypes b/deployment_test/QtQuick/Controls.2/Material/plugins.qmltypes
new file mode 100644
index 0000000000000000000000000000000000000000..e290e0eab67261260fae48461ae1ac5e1bbb67fa
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/plugins.qmltypes
@@ -0,0 +1,459 @@
+import QtQuick.tooling 1.2
+
+// This file describes the plugin-supplied types contained in the library.
+// It is used for QML tooling purposes only.
+//
+// This file was auto-generated by:
+// 'qmlplugindump -nonrelocatable -dependencies dependencies.json QtQuick.Controls.Material 2.15'
+
+Module {
+    dependencies: ["QtQuick.Controls 2.0"]
+    Component { name: "QQuickAttachedObject"; prototype: "QObject" }
+    Component {
+        name: "QQuickItem"
+        defaultProperty: "data"
+        prototype: "QObject"
+        Enum {
+            name: "Flags"
+            values: {
+                "ItemClipsChildrenToShape": 1,
+                "ItemAcceptsInputMethod": 2,
+                "ItemIsFocusScope": 4,
+                "ItemHasContents": 8,
+                "ItemAcceptsDrops": 16
+            }
+        }
+        Enum {
+            name: "TransformOrigin"
+            values: {
+                "TopLeft": 0,
+                "Top": 1,
+                "TopRight": 2,
+                "Left": 3,
+                "Center": 4,
+                "Right": 5,
+                "BottomLeft": 6,
+                "Bottom": 7,
+                "BottomRight": 8
+            }
+        }
+        Property { name: "parent"; type: "QQuickItem"; isPointer: true }
+        Property { name: "data"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "resources"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "children"; type: "QQuickItem"; isList: true; isReadonly: true }
+        Property { name: "x"; type: "double" }
+        Property { name: "y"; type: "double" }
+        Property { name: "z"; type: "double" }
+        Property { name: "width"; type: "double" }
+        Property { name: "height"; type: "double" }
+        Property { name: "opacity"; type: "double" }
+        Property { name: "enabled"; type: "bool" }
+        Property { name: "visible"; type: "bool" }
+        Property { name: "visibleChildren"; type: "QQuickItem"; isList: true; isReadonly: true }
+        Property { name: "states"; type: "QQuickState"; isList: true; isReadonly: true }
+        Property { name: "transitions"; type: "QQuickTransition"; isList: true; isReadonly: true }
+        Property { name: "state"; type: "string" }
+        Property { name: "childrenRect"; type: "QRectF"; isReadonly: true }
+        Property { name: "anchors"; type: "QQuickAnchors"; isReadonly: true; isPointer: true }
+        Property { name: "left"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "right"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "horizontalCenter"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "top"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "bottom"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "verticalCenter"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "baseline"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "baselineOffset"; type: "double" }
+        Property { name: "clip"; type: "bool" }
+        Property { name: "focus"; type: "bool" }
+        Property { name: "activeFocus"; type: "bool"; isReadonly: true }
+        Property { name: "activeFocusOnTab"; revision: 1; type: "bool" }
+        Property { name: "rotation"; type: "double" }
+        Property { name: "scale"; type: "double" }
+        Property { name: "transformOrigin"; type: "TransformOrigin" }
+        Property { name: "transformOriginPoint"; type: "QPointF"; isReadonly: true }
+        Property { name: "transform"; type: "QQuickTransform"; isList: true; isReadonly: true }
+        Property { name: "smooth"; type: "bool" }
+        Property { name: "antialiasing"; type: "bool" }
+        Property { name: "implicitWidth"; type: "double" }
+        Property { name: "implicitHeight"; type: "double" }
+        Property { name: "containmentMask"; revision: 11; type: "QObject"; isPointer: true }
+        Property { name: "layer"; type: "QQuickItemLayer"; isReadonly: true; isPointer: true }
+        Signal {
+            name: "childrenRectChanged"
+            Parameter { type: "QRectF" }
+        }
+        Signal {
+            name: "baselineOffsetChanged"
+            Parameter { type: "double" }
+        }
+        Signal {
+            name: "stateChanged"
+            Parameter { type: "string" }
+        }
+        Signal {
+            name: "focusChanged"
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "activeFocusChanged"
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "activeFocusOnTabChanged"
+            revision: 1
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "parentChanged"
+            Parameter { type: "QQuickItem"; isPointer: true }
+        }
+        Signal {
+            name: "transformOriginChanged"
+            Parameter { type: "TransformOrigin" }
+        }
+        Signal {
+            name: "smoothChanged"
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "antialiasingChanged"
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "clipChanged"
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "windowChanged"
+            revision: 1
+            Parameter { name: "window"; type: "QQuickWindow"; isPointer: true }
+        }
+        Signal { name: "containmentMaskChanged"; revision: 11 }
+        Method { name: "update" }
+        Method {
+            name: "grabToImage"
+            revision: 4
+            type: "bool"
+            Parameter { name: "callback"; type: "QJSValue" }
+            Parameter { name: "targetSize"; type: "QSize" }
+        }
+        Method {
+            name: "grabToImage"
+            revision: 4
+            type: "bool"
+            Parameter { name: "callback"; type: "QJSValue" }
+        }
+        Method {
+            name: "contains"
+            type: "bool"
+            Parameter { name: "point"; type: "QPointF" }
+        }
+        Method {
+            name: "mapFromItem"
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "mapToItem"
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "mapFromGlobal"
+            revision: 7
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "mapToGlobal"
+            revision: 7
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+        Method { name: "forceActiveFocus" }
+        Method {
+            name: "forceActiveFocus"
+            Parameter { name: "reason"; type: "Qt::FocusReason" }
+        }
+        Method {
+            name: "nextItemInFocusChain"
+            revision: 1
+            type: "QQuickItem*"
+            Parameter { name: "forward"; type: "bool" }
+        }
+        Method { name: "nextItemInFocusChain"; revision: 1; type: "QQuickItem*" }
+        Method {
+            name: "childAt"
+            type: "QQuickItem*"
+            Parameter { name: "x"; type: "double" }
+            Parameter { name: "y"; type: "double" }
+        }
+    }
+    Component {
+        name: "QQuickMaterialBusyIndicator"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        exports: ["QtQuick.Controls.Material.impl/BusyIndicatorImpl 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "color"; type: "QColor" }
+        Property { name: "running"; type: "bool" }
+    }
+    Component {
+        name: "QQuickMaterialProgressBar"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        exports: ["QtQuick.Controls.Material.impl/ProgressBarImpl 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "color"; type: "QColor" }
+        Property { name: "progress"; type: "double" }
+        Property { name: "indeterminate"; type: "bool" }
+    }
+    Component {
+        name: "QQuickMaterialRipple"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        exports: ["QtQuick.Controls.Material.impl/Ripple 2.0"]
+        exportMetaObjectRevisions: [0]
+        Enum {
+            name: "Trigger"
+            values: {
+                "Press": 0,
+                "Release": 1
+            }
+        }
+        Property { name: "color"; type: "QColor" }
+        Property { name: "clipRadius"; type: "double" }
+        Property { name: "pressed"; type: "bool" }
+        Property { name: "active"; type: "bool" }
+        Property { name: "anchor"; type: "QQuickItem"; isPointer: true }
+        Property { name: "trigger"; type: "Trigger" }
+    }
+    Component {
+        name: "QQuickMaterialStyle"
+        prototype: "QQuickAttachedObject"
+        exports: ["QtQuick.Controls.Material/Material 2.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        Enum {
+            name: "Theme"
+            values: {
+                "Light": 0,
+                "Dark": 1,
+                "System": 2
+            }
+        }
+        Enum {
+            name: "Variant"
+            values: {
+                "Normal": 0,
+                "Dense": 1
+            }
+        }
+        Enum {
+            name: "Color"
+            values: {
+                "Red": 0,
+                "Pink": 1,
+                "Purple": 2,
+                "DeepPurple": 3,
+                "Indigo": 4,
+                "Blue": 5,
+                "LightBlue": 6,
+                "Cyan": 7,
+                "Teal": 8,
+                "Green": 9,
+                "LightGreen": 10,
+                "Lime": 11,
+                "Yellow": 12,
+                "Amber": 13,
+                "Orange": 14,
+                "DeepOrange": 15,
+                "Brown": 16,
+                "Grey": 17,
+                "BlueGrey": 18
+            }
+        }
+        Enum {
+            name: "Shade"
+            values: {
+                "Shade50": 0,
+                "Shade100": 1,
+                "Shade200": 2,
+                "Shade300": 3,
+                "Shade400": 4,
+                "Shade500": 5,
+                "Shade600": 6,
+                "Shade700": 7,
+                "Shade800": 8,
+                "Shade900": 9,
+                "ShadeA100": 10,
+                "ShadeA200": 11,
+                "ShadeA400": 12,
+                "ShadeA700": 13
+            }
+        }
+        Property { name: "theme"; type: "Theme" }
+        Property { name: "primary"; type: "QVariant" }
+        Property { name: "accent"; type: "QVariant" }
+        Property { name: "foreground"; type: "QVariant" }
+        Property { name: "background"; type: "QVariant" }
+        Property { name: "elevation"; type: "int" }
+        Property { name: "primaryColor"; type: "QColor"; isReadonly: true }
+        Property { name: "accentColor"; type: "QColor"; isReadonly: true }
+        Property { name: "backgroundColor"; type: "QColor"; isReadonly: true }
+        Property { name: "primaryTextColor"; type: "QColor"; isReadonly: true }
+        Property { name: "primaryHighlightedTextColor"; type: "QColor"; isReadonly: true }
+        Property { name: "secondaryTextColor"; type: "QColor"; isReadonly: true }
+        Property { name: "hintTextColor"; type: "QColor"; isReadonly: true }
+        Property { name: "textSelectionColor"; type: "QColor"; isReadonly: true }
+        Property { name: "dropShadowColor"; type: "QColor"; isReadonly: true }
+        Property { name: "dividerColor"; type: "QColor"; isReadonly: true }
+        Property { name: "iconColor"; type: "QColor"; isReadonly: true }
+        Property { name: "iconDisabledColor"; type: "QColor"; isReadonly: true }
+        Property { name: "buttonColor"; type: "QColor"; isReadonly: true }
+        Property { name: "buttonDisabledColor"; type: "QColor"; isReadonly: true }
+        Property { name: "highlightedButtonColor"; type: "QColor"; isReadonly: true }
+        Property { name: "frameColor"; type: "QColor"; isReadonly: true }
+        Property { name: "rippleColor"; type: "QColor"; isReadonly: true }
+        Property { name: "highlightedRippleColor"; type: "QColor"; isReadonly: true }
+        Property { name: "switchUncheckedTrackColor"; type: "QColor"; isReadonly: true }
+        Property { name: "switchCheckedTrackColor"; type: "QColor"; isReadonly: true }
+        Property { name: "switchUncheckedHandleColor"; type: "QColor"; isReadonly: true }
+        Property { name: "switchCheckedHandleColor"; type: "QColor"; isReadonly: true }
+        Property { name: "switchDisabledTrackColor"; type: "QColor"; isReadonly: true }
+        Property { name: "switchDisabledHandleColor"; type: "QColor"; isReadonly: true }
+        Property { name: "scrollBarColor"; type: "QColor"; isReadonly: true }
+        Property { name: "scrollBarHoveredColor"; type: "QColor"; isReadonly: true }
+        Property { name: "scrollBarPressedColor"; type: "QColor"; isReadonly: true }
+        Property { name: "dialogColor"; type: "QColor"; isReadonly: true }
+        Property { name: "backgroundDimColor"; type: "QColor"; isReadonly: true }
+        Property { name: "listHighlightColor"; type: "QColor"; isReadonly: true }
+        Property { name: "tooltipColor"; type: "QColor"; isReadonly: true }
+        Property { name: "toolBarColor"; type: "QColor"; isReadonly: true }
+        Property { name: "toolTextColor"; type: "QColor"; isReadonly: true }
+        Property { name: "spinBoxDisabledIconColor"; type: "QColor"; isReadonly: true }
+        Property { name: "sliderDisabledColor"; revision: 15; type: "QColor"; isReadonly: true }
+        Property { name: "touchTarget"; type: "int"; isReadonly: true }
+        Property { name: "buttonHeight"; type: "int"; isReadonly: true }
+        Property { name: "delegateHeight"; type: "int"; isReadonly: true }
+        Property { name: "dialogButtonBoxHeight"; type: "int"; isReadonly: true }
+        Property { name: "frameVerticalPadding"; type: "int"; isReadonly: true }
+        Property { name: "menuItemHeight"; type: "int"; isReadonly: true }
+        Property { name: "menuItemVerticalPadding"; type: "int"; isReadonly: true }
+        Property { name: "switchDelegateVerticalPadding"; type: "int"; isReadonly: true }
+        Property { name: "tooltipHeight"; type: "int"; isReadonly: true }
+        Signal { name: "paletteChanged" }
+        Method {
+            name: "color"
+            type: "QColor"
+            Parameter { name: "color"; type: "Color" }
+            Parameter { name: "shade"; type: "Shade" }
+        }
+        Method {
+            name: "color"
+            type: "QColor"
+            Parameter { name: "color"; type: "Color" }
+        }
+        Method {
+            name: "shade"
+            type: "QColor"
+            Parameter { name: "color"; type: "QColor" }
+            Parameter { name: "shade"; type: "Shade" }
+        }
+    }
+    Component {
+        prototype: "QQuickItem"
+        name: "QtQuick.Controls.Material.impl/BoxShadow 2.0"
+        exports: ["QtQuick.Controls.Material.impl/BoxShadow 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "offsetX"; type: "int" }
+        Property { name: "offsetY"; type: "int" }
+        Property { name: "blurRadius"; type: "int" }
+        Property { name: "spreadRadius"; type: "int" }
+        Property { name: "source"; type: "QQuickItem"; isPointer: true }
+        Property { name: "fullWidth"; type: "bool" }
+        Property { name: "fullHeight"; type: "bool" }
+        Property { name: "glowRadius"; type: "double" }
+        Property { name: "spread"; type: "double" }
+        Property { name: "color"; type: "QColor" }
+        Property { name: "cornerRadius"; type: "double" }
+        Property { name: "cached"; type: "bool" }
+    }
+    Component {
+        prototype: "QQuickRectangle"
+        name: "QtQuick.Controls.Material.impl/CheckIndicator 2.0"
+        exports: ["QtQuick.Controls.Material.impl/CheckIndicator 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "control"; type: "QQuickItem"; isPointer: true }
+        Property { name: "checkState"; type: "int" }
+    }
+    Component {
+        prototype: "QQuickRectangle"
+        name: "QtQuick.Controls.Material.impl/CursorDelegate 2.0"
+        exports: ["QtQuick.Controls.Material.impl/CursorDelegate 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+    }
+    Component {
+        prototype: "QQuickItem"
+        name: "QtQuick.Controls.Material.impl/ElevationEffect 2.0"
+        exports: ["QtQuick.Controls.Material.impl/ElevationEffect 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "source"; type: "QVariant" }
+        Property { name: "elevation"; type: "int" }
+        Property { name: "fullWidth"; type: "bool" }
+        Property { name: "fullHeight"; type: "bool" }
+        Property { name: "sourceItem"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property { name: "_shadows"; type: "QVariant"; isReadonly: true }
+        Property { name: "_shadow"; type: "QVariant"; isReadonly: true }
+    }
+    Component {
+        prototype: "QQuickRectangle"
+        name: "QtQuick.Controls.Material.impl/RadioIndicator 2.0"
+        exports: ["QtQuick.Controls.Material.impl/RadioIndicator 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "control"; type: "QQuickItem"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickItem"
+        name: "QtQuick.Controls.Material.impl/RectangularGlow 2.0"
+        exports: ["QtQuick.Controls.Material.impl/RectangularGlow 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "glowRadius"; type: "double" }
+        Property { name: "spread"; type: "double" }
+        Property { name: "color"; type: "QColor" }
+        Property { name: "cornerRadius"; type: "double" }
+        Property { name: "cached"; type: "bool" }
+    }
+    Component {
+        prototype: "QQuickItem"
+        name: "QtQuick.Controls.Material.impl/SliderHandle 2.0"
+        exports: ["QtQuick.Controls.Material.impl/SliderHandle 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "value"; type: "double" }
+        Property { name: "handleHasFocus"; type: "bool" }
+        Property { name: "handlePressed"; type: "bool" }
+        Property { name: "handleHovered"; type: "bool" }
+        Property { name: "initialSize"; type: "int"; isReadonly: true }
+        Property { name: "control"; type: "QVariant"; isReadonly: true }
+    }
+    Component {
+        prototype: "QQuickItem"
+        name: "QtQuick.Controls.Material.impl/SwitchIndicator 2.0"
+        exports: ["QtQuick.Controls.Material.impl/SwitchIndicator 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "control"; type: "QQuickItem"; isPointer: true }
+        Property { name: "handle"; type: "QQuickRectangle"; isReadonly: true; isPointer: true }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Material/qmldir b/deployment_test/QtQuick/Controls.2/Material/qmldir
new file mode 100644
index 0000000000000000000000000000000000000000..870a03827b7abf9ea04c66be00c0c60c80a526f2
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Material/qmldir
@@ -0,0 +1,4 @@
+module QtQuick.Controls.Material
+plugin qtquickcontrols2materialstyleplugin
+classname QtQuickControls2MaterialStylePlugin
+depends QtQuick.Controls 2.5
diff --git a/deployment_test/QtQuick/Controls.2/Material/qtquickcontrols2materialstyleplugin.dll b/deployment_test/QtQuick/Controls.2/Material/qtquickcontrols2materialstyleplugin.dll
new file mode 100644
index 0000000000000000000000000000000000000000..6af69066933a5be1e9c6f1a17106a8038b25d7c0
Binary files /dev/null and b/deployment_test/QtQuick/Controls.2/Material/qtquickcontrols2materialstyleplugin.dll differ
diff --git a/deployment_test/QtQuick/Controls.2/Menu.qml b/deployment_test/QtQuick/Controls.2/Menu.qml
new file mode 100644
index 0000000000000000000000000000000000000000..cf3a52f248575b0d7a91c137cddc448aa5a94ba6
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Menu.qml
@@ -0,0 +1,82 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Window 2.12
+
+T.Menu {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    margins: 0
+    overlap: 1
+
+    delegate: MenuItem { }
+
+    contentItem: ListView {
+        implicitHeight: contentHeight
+        model: control.contentModel
+        interactive: Window.window
+                        ? contentHeight + control.topPadding + control.bottomPadding > Window.window.height
+                        : false
+        clip: true
+        currentIndex: control.currentIndex
+
+        ScrollIndicator.vertical: ScrollIndicator {}
+    }
+
+    background: Rectangle {
+        implicitWidth: 200
+        implicitHeight: 40
+        color: control.palette.window
+        border.color: control.palette.dark
+    }
+
+    T.Overlay.modal: Rectangle {
+        color: Color.transparent(control.palette.shadow, 0.5)
+    }
+
+    T.Overlay.modeless: Rectangle {
+        color: Color.transparent(control.palette.shadow, 0.12)
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/MenuBar.qml b/deployment_test/QtQuick/Controls.2/MenuBar.qml
new file mode 100644
index 0000000000000000000000000000000000000000..122cdc5310150555379bac460310bf5f3f7277dc
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/MenuBar.qml
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+
+T.MenuBar {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    delegate: MenuBarItem { }
+
+    contentItem: Row {
+        spacing: control.spacing
+        Repeater {
+            model: control.contentModel
+        }
+    }
+
+    background: Rectangle {
+        implicitHeight: 40
+        color: control.palette.button
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/MenuBarItem.qml b/deployment_test/QtQuick/Controls.2/MenuBarItem.qml
new file mode 100644
index 0000000000000000000000000000000000000000..f6835412a83cee9b2130999720117767ca234989
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/MenuBarItem.qml
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+
+T.MenuBarItem {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    spacing: 6
+    padding: 6
+    leftPadding: 12
+    rightPadding: 16
+
+    icon.width: 24
+    icon.height: 24
+    icon.color: control.palette.buttonText
+
+    contentItem: IconLabel {
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+        alignment: Qt.AlignLeft
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.palette.buttonText
+    }
+
+    background: Rectangle {
+        implicitWidth: 40
+        implicitHeight: 40
+        color: control.down || control.highlighted ? control.palette.mid : "transparent"
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/MenuItem.qml b/deployment_test/QtQuick/Controls.2/MenuItem.qml
new file mode 100644
index 0000000000000000000000000000000000000000..22cdf3ea4a944dbd32d6ded700eb8d48d7ed0851
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/MenuItem.qml
@@ -0,0 +1,105 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Templates 2.12 as T
+
+T.MenuItem {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    padding: 6
+    spacing: 6
+
+    icon.width: 24
+    icon.height: 24
+    icon.color: control.palette.windowText
+
+    contentItem: IconLabel {
+        readonly property real arrowPadding: control.subMenu && control.arrow ? control.arrow.width + control.spacing : 0
+        readonly property real indicatorPadding: control.checkable && control.indicator ? control.indicator.width + control.spacing : 0
+        leftPadding: !control.mirrored ? indicatorPadding : arrowPadding
+        rightPadding: control.mirrored ? indicatorPadding : arrowPadding
+
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+        alignment: Qt.AlignLeft
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.palette.windowText
+    }
+
+    indicator: ColorImage {
+        x: control.mirrored ? control.width - width - control.rightPadding : control.leftPadding
+        y: control.topPadding + (control.availableHeight - height) / 2
+
+        visible: control.checked
+        source: control.checkable ? "qrc:/qt-project.org/imports/QtQuick/Controls.2/images/check.png" : ""
+        color: control.palette.windowText
+        defaultColor: "#353637"
+    }
+
+    arrow: ColorImage {
+        x: control.mirrored ? control.leftPadding : control.width - width - control.rightPadding
+        y: control.topPadding + (control.availableHeight - height) / 2
+
+        visible: control.subMenu
+        mirror: control.mirrored
+        source: control.subMenu ? "qrc:/qt-project.org/imports/QtQuick/Controls.2/images/arrow-indicator.png" : ""
+        color: control.palette.windowText
+        defaultColor: "#353637"
+    }
+
+    background: Rectangle {
+        implicitWidth: 200
+        implicitHeight: 40
+        x: 1
+        y: 1
+        width: control.width - 2
+        height: control.height - 2
+        color: control.down ? control.palette.midlight : control.highlighted ? control.palette.light : "transparent"
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/MenuSeparator.qml b/deployment_test/QtQuick/Controls.2/MenuSeparator.qml
new file mode 100644
index 0000000000000000000000000000000000000000..cc5c2b6e8f8978dc4681a08eb0d77aef744dcd25
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/MenuSeparator.qml
@@ -0,0 +1,58 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Templates 2.12 as T
+
+T.MenuSeparator {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    padding: 2
+    verticalPadding: padding + 4
+
+    contentItem: Rectangle {
+        implicitWidth: 188
+        implicitHeight: 1
+        color: control.palette.mid
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Page.qml b/deployment_test/QtQuick/Controls.2/Page.qml
new file mode 100644
index 0000000000000000000000000000000000000000..4b3cf3d26e86272c2c1fb6469e7a5d6f65cc00ef
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Page.qml
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Templates 2.12 as T
+
+T.Page {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding,
+                            implicitHeaderWidth,
+                            implicitFooterWidth)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding
+                             + (implicitHeaderHeight > 0 ? implicitHeaderHeight + spacing : 0)
+                             + (implicitFooterHeight > 0 ? implicitFooterHeight + spacing : 0))
+
+    background: Rectangle {
+        color: control.palette.window
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/PageIndicator.qml b/deployment_test/QtQuick/Controls.2/PageIndicator.qml
new file mode 100644
index 0000000000000000000000000000000000000000..78f9e3cf76cd71b139e55cb2bba03ea7be85adeb
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/PageIndicator.qml
@@ -0,0 +1,72 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Templates 2.12 as T
+
+T.PageIndicator {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    padding: 6
+    spacing: 6
+
+    delegate: Rectangle {
+        implicitWidth: 8
+        implicitHeight: 8
+
+        radius: width / 2
+        color: control.palette.dark
+
+        opacity: index === currentIndex ? 0.95 : pressed ? 0.7 : 0.45
+        Behavior on opacity { OpacityAnimator { duration: 100 } }
+    }
+
+    contentItem: Row {
+        spacing: control.spacing
+
+        Repeater {
+            model: control.count
+            delegate: control.delegate
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Pane.qml b/deployment_test/QtQuick/Controls.2/Pane.qml
new file mode 100644
index 0000000000000000000000000000000000000000..47b916e321be2e3df51d5e19c40e808f6796c1a9
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Pane.qml
@@ -0,0 +1,55 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Templates 2.12 as T
+
+T.Pane {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    padding: 12
+
+    background: Rectangle {
+        color: control.palette.window
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Popup.qml b/deployment_test/QtQuick/Controls.2/Popup.qml
new file mode 100644
index 0000000000000000000000000000000000000000..ee243c10cd12eec667aad5a3c9ba0a76be1c0f78
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Popup.qml
@@ -0,0 +1,64 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Templates 2.12 as T
+
+T.Popup {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    padding: 12
+
+    background: Rectangle {
+        color: control.palette.window
+        border.color: control.palette.dark
+    }
+
+    T.Overlay.modal: Rectangle {
+        color: Color.transparent(control.palette.shadow, 0.5)
+    }
+
+    T.Overlay.modeless: Rectangle {
+        color: Color.transparent(control.palette.shadow, 0.12)
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/ProgressBar.qml b/deployment_test/QtQuick/Controls.2/ProgressBar.qml
new file mode 100644
index 0000000000000000000000000000000000000000..61cdea43e34cd9166b8cc35e822deddb6e4f41cd
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/ProgressBar.qml
@@ -0,0 +1,67 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+
+T.ProgressBar {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    contentItem: ProgressBarImpl {
+        implicitHeight: 6
+        implicitWidth: 116
+        scale: control.mirrored ? -1 : 1
+        progress: control.position
+        indeterminate: control.visible && control.indeterminate
+        color: control.palette.dark
+    }
+
+    background: Rectangle {
+        implicitWidth: 200
+        implicitHeight: 6
+        y: (control.height - height) / 2
+        height: 6
+
+        color: control.palette.midlight
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/RadioButton.qml b/deployment_test/QtQuick/Controls.2/RadioButton.qml
new file mode 100644
index 0000000000000000000000000000000000000000..cdf0c30ec4815a851df42af1b1ec19c95c448551
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/RadioButton.qml
@@ -0,0 +1,86 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Templates 2.12 as T
+
+T.RadioButton {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    padding: 6
+    spacing: 6
+
+    // keep in sync with RadioDelegate.qml (shared RadioIndicator.qml was removed for performance reasons)
+    indicator: Rectangle {
+        implicitWidth: 28
+        implicitHeight: 28
+
+        x: control.text ? (control.mirrored ? control.width - width - control.rightPadding : control.leftPadding) : control.leftPadding + (control.availableWidth - width) / 2
+        y: control.topPadding + (control.availableHeight - height) / 2
+
+        radius: width / 2
+        color: control.down ? control.palette.light : control.palette.base
+        border.width: control.visualFocus ? 2 : 1
+        border.color: control.visualFocus ? control.palette.highlight : control.palette.mid
+
+        Rectangle {
+            x: (parent.width - width) / 2
+            y: (parent.height - height) / 2
+            width: 20
+            height: 20
+            radius: width / 2
+            color: control.palette.text
+            visible: control.checked
+        }
+    }
+
+    contentItem: CheckLabel {
+        leftPadding: control.indicator && !control.mirrored ? control.indicator.width + control.spacing : 0
+        rightPadding: control.indicator && control.mirrored ? control.indicator.width + control.spacing : 0
+
+        text: control.text
+        font: control.font
+        color: control.palette.windowText
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/RadioDelegate.qml b/deployment_test/QtQuick/Controls.2/RadioDelegate.qml
new file mode 100644
index 0000000000000000000000000000000000000000..a7e7dec0043a473355c0c364b2df4b0f71716d42
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/RadioDelegate.qml
@@ -0,0 +1,103 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Templates 2.12 as T
+
+T.RadioDelegate {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    padding: 12
+    spacing: 12
+
+    icon.width: 24
+    icon.height: 24
+    icon.color: control.palette.text
+
+    contentItem: IconLabel {
+        leftPadding: control.mirrored ? control.indicator.width + control.spacing : 0
+        rightPadding: !control.mirrored ? control.indicator.width + control.spacing : 0
+
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+        alignment: control.display === IconLabel.IconOnly || control.display === IconLabel.TextUnderIcon ? Qt.AlignCenter : Qt.AlignLeft
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.palette.text
+    }
+
+    // keep in sync with RadioButton.qml (shared RadioIndicator.qml was removed for performance reasons)
+    indicator: Rectangle {
+        implicitWidth: 28
+        implicitHeight: 28
+
+        x: control.mirrored ? control.leftPadding : control.width - width - control.rightPadding
+        y: control.topPadding + (control.availableHeight - height) / 2
+
+        radius: width / 2
+        color: control.down ? control.palette.light : control.palette.base
+        border.width: control.visualFocus ? 2 : 1
+        border.color: control.visualFocus ? control.palette.highlight : control.palette.mid
+
+        Rectangle {
+            x: (parent.width - width) / 2
+            y: (parent.height - height) / 2
+            width: 20
+            height: 20
+            radius: width / 2
+            color: control.palette.text
+            visible: control.checked
+        }
+    }
+
+    background: Rectangle {
+        implicitWidth: 100
+        implicitHeight: 40
+        visible: control.down || control.highlighted
+        color: control.down ? control.palette.midlight : control.palette.light
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/RangeSlider.qml b/deployment_test/QtQuick/Controls.2/RangeSlider.qml
new file mode 100644
index 0000000000000000000000000000000000000000..c3e7c964647a3bed9ffee2215362f2b97963a248
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/RangeSlider.qml
@@ -0,0 +1,96 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Templates 2.12 as T
+
+T.RangeSlider {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            first.implicitHandleWidth + leftPadding + rightPadding,
+                            second.implicitHandleWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             first.implicitHandleHeight + topPadding + bottomPadding,
+                             second.implicitHandleHeight + topPadding + bottomPadding)
+
+    padding: 6
+
+    first.handle: Rectangle {
+        x: control.leftPadding + (control.horizontal ? control.first.visualPosition * (control.availableWidth - width) : (control.availableWidth - width) / 2)
+        y: control.topPadding + (control.horizontal ? (control.availableHeight - height) / 2 : control.first.visualPosition * (control.availableHeight - height))
+        implicitWidth: 28
+        implicitHeight: 28
+        radius: width / 2
+        border.width: activeFocus ? 2 : 1
+        border.color: activeFocus ? control.palette.highlight : control.enabled ? control.palette.mid : control.palette.midlight
+        color: control.first.pressed ? control.palette.light : control.palette.window
+    }
+
+    second.handle: Rectangle {
+        x: control.leftPadding + (control.horizontal ? control.second.visualPosition * (control.availableWidth - width) : (control.availableWidth - width) / 2)
+        y: control.topPadding + (control.horizontal ? (control.availableHeight - height) / 2 : control.second.visualPosition * (control.availableHeight - height))
+        implicitWidth: 28
+        implicitHeight: 28
+        radius: width / 2
+        border.width: activeFocus ? 2 : 1
+        border.color: activeFocus ? control.palette.highlight : control.enabled ? control.palette.mid : control.palette.midlight
+        color: control.second.pressed ? control.palette.light : control.palette.window
+    }
+
+    background: Rectangle {
+        x: control.leftPadding + (control.horizontal ? 0 : (control.availableWidth - width) / 2)
+        y: control.topPadding + (control.horizontal ? (control.availableHeight - height) / 2 : 0)
+        implicitWidth: control.horizontal ? 200 : 6
+        implicitHeight: control.horizontal ? 6 : 200
+        width: control.horizontal ? control.availableWidth : implicitWidth
+        height: control.horizontal ? implicitHeight : control.availableHeight
+        radius: 3
+        color: control.palette.midlight
+        scale: control.horizontal && control.mirrored ? -1 : 1
+
+        Rectangle {
+            x: control.horizontal ? control.first.position * parent.width + 3 : 0
+            y: control.horizontal ? 0 : control.second.visualPosition * parent.height + 3
+            width: control.horizontal ? control.second.position * parent.width - control.first.position * parent.width - 6 : 6
+            height: control.horizontal ? 6 : control.second.position * parent.height - control.first.position * parent.height - 6
+
+            color: control.palette.dark
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/RoundButton.qml b/deployment_test/QtQuick/Controls.2/RoundButton.qml
new file mode 100644
index 0000000000000000000000000000000000000000..825d52529a07ad68a90a78084c824189180cfa71
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/RoundButton.qml
@@ -0,0 +1,81 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Templates 2.12 as T
+
+T.RoundButton {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    padding: 6
+    spacing: 6
+
+    icon.width: 24
+    icon.height: 24
+    icon.color: control.checked || control.highlighted ? control.palette.brightText :
+                control.flat && !control.down ? (control.visualFocus ? control.palette.highlight : control.palette.windowText) : control.palette.buttonText
+
+    contentItem: IconLabel {
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.checked || control.highlighted ? control.palette.brightText :
+               control.flat && !control.down ? (control.visualFocus ? control.palette.highlight : control.palette.windowText) : control.palette.buttonText
+    }
+
+    background: Rectangle {
+        implicitWidth: 40
+        implicitHeight: 40
+        radius: control.radius
+        opacity: enabled ? 1 : 0.3
+        visible: !control.flat || control.down || control.checked || control.highlighted
+        color: Color.blend(control.checked || control.highlighted ? control.palette.dark : control.palette.button,
+                                                                    control.palette.mid, control.down ? 0.5 : 0.0)
+        border.color: control.palette.highlight
+        border.width: control.visualFocus ? 2 : 0
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/ScrollBar.qml b/deployment_test/QtQuick/Controls.2/ScrollBar.qml
new file mode 100644
index 0000000000000000000000000000000000000000..0948fb1d1ee47303e942130cbcd066a583197022
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/ScrollBar.qml
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Templates 2.12 as T
+
+T.ScrollBar {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    padding: 2
+    visible: control.policy !== T.ScrollBar.AlwaysOff
+    minimumSize: orientation == Qt.Horizontal ? height / width : width / height
+
+    contentItem: Rectangle {
+        implicitWidth: control.interactive ? 6 : 2
+        implicitHeight: control.interactive ? 6 : 2
+
+        radius: width / 2
+        color: control.pressed ? control.palette.dark : control.palette.mid
+        opacity: 0.0
+
+        states: State {
+            name: "active"
+            when: control.policy === T.ScrollBar.AlwaysOn || (control.active && control.size < 1.0)
+            PropertyChanges { target: control.contentItem; opacity: 0.75 }
+        }
+
+        transitions: Transition {
+            from: "active"
+            SequentialAnimation {
+                PauseAnimation { duration: 450 }
+                NumberAnimation { target: control.contentItem; duration: 200; property: "opacity"; to: 0.0 }
+            }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/ScrollIndicator.qml b/deployment_test/QtQuick/Controls.2/ScrollIndicator.qml
new file mode 100644
index 0000000000000000000000000000000000000000..795c20ee73d49fd049c8461c67079198438b1f73
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/ScrollIndicator.qml
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Templates 2.12 as T
+
+T.ScrollIndicator {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    padding: 2
+
+    contentItem: Rectangle {
+        implicitWidth: 2
+        implicitHeight: 2
+
+        color: control.palette.mid
+        visible: control.size < 1.0
+        opacity: 0.0
+
+        states: State {
+            name: "active"
+            when: control.active
+            PropertyChanges { target: control.contentItem; opacity: 0.75 }
+        }
+
+        transitions: [
+            Transition {
+                from: "active"
+                SequentialAnimation {
+                    PauseAnimation { duration: 450 }
+                    NumberAnimation { target: control.contentItem; duration: 200; property: "opacity"; to: 0.0 }
+                }
+            }
+        ]
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/ScrollView.qml b/deployment_test/QtQuick/Controls.2/ScrollView.qml
new file mode 100644
index 0000000000000000000000000000000000000000..f775d62462d58b0b173f1ecc75c6c934fd498471
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/ScrollView.qml
@@ -0,0 +1,65 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Templates 2.12 as T
+
+T.ScrollView {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    ScrollBar.vertical: ScrollBar {
+        parent: control
+        x: control.mirrored ? 0 : control.width - width
+        y: control.topPadding
+        height: control.availableHeight
+        active: control.ScrollBar.horizontal.active
+    }
+
+    ScrollBar.horizontal: ScrollBar {
+        parent: control
+        x: control.leftPadding
+        y: control.height - height
+        width: control.availableWidth
+        active: control.ScrollBar.vertical.active
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Slider.qml b/deployment_test/QtQuick/Controls.2/Slider.qml
new file mode 100644
index 0000000000000000000000000000000000000000..6d532389baff3276cfd141b7a52271d877463b81
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Slider.qml
@@ -0,0 +1,83 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Templates 2.12 as T
+
+T.Slider {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitHandleWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitHandleHeight + topPadding + bottomPadding)
+
+    padding: 6
+
+    handle: Rectangle {
+        x: control.leftPadding + (control.horizontal ? control.visualPosition * (control.availableWidth - width) : (control.availableWidth - width) / 2)
+        y: control.topPadding + (control.horizontal ? (control.availableHeight - height) / 2 : control.visualPosition * (control.availableHeight - height))
+        implicitWidth: 28
+        implicitHeight: 28
+        radius: width / 2
+        color: control.pressed ? control.palette.light : control.palette.window
+        border.width: control.visualFocus ? 2 : 1
+        border.color: control.visualFocus ? control.palette.highlight : control.enabled ? control.palette.mid : control.palette.midlight
+    }
+
+    background: Rectangle {
+        x: control.leftPadding + (control.horizontal ? 0 : (control.availableWidth - width) / 2)
+        y: control.topPadding + (control.horizontal ? (control.availableHeight - height) / 2 : 0)
+        implicitWidth: control.horizontal ? 200 : 6
+        implicitHeight: control.horizontal ? 6 : 200
+        width: control.horizontal ? control.availableWidth : implicitWidth
+        height: control.horizontal ? implicitHeight : control.availableHeight
+        radius: 3
+        color: control.palette.midlight
+        scale: control.horizontal && control.mirrored ? -1 : 1
+
+        Rectangle {
+            y: control.horizontal ? 0 : control.visualPosition * parent.height
+            width: control.horizontal ? control.position * parent.width : 6
+            height: control.horizontal ? 6 : control.position * parent.height
+
+            radius: 3
+            color: control.palette.dark
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/SpinBox.qml b/deployment_test/QtQuick/Controls.2/SpinBox.qml
new file mode 100644
index 0000000000000000000000000000000000000000..d1c2ea5bc0c7f46593bc25331e04640e459fb07f
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/SpinBox.qml
@@ -0,0 +1,135 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Templates 2.12 as T
+
+T.SpinBox {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentItem.implicitWidth + 2 * padding +
+                            up.implicitIndicatorWidth +
+                            down.implicitIndicatorWidth)
+    implicitHeight: Math.max(implicitContentHeight + topPadding + bottomPadding,
+                             implicitBackgroundHeight,
+                             up.implicitIndicatorHeight,
+                             down.implicitIndicatorHeight)
+
+    padding: 6
+    leftPadding: padding + (control.mirrored ? (up.indicator ? up.indicator.width : 0) : (down.indicator ? down.indicator.width : 0))
+    rightPadding: padding + (control.mirrored ? (down.indicator ? down.indicator.width : 0) : (up.indicator ? up.indicator.width : 0))
+
+    validator: IntValidator {
+        locale: control.locale.name
+        bottom: Math.min(control.from, control.to)
+        top: Math.max(control.from, control.to)
+    }
+
+    contentItem: TextInput {
+        z: 2
+        text: control.displayText
+
+        font: control.font
+        color: control.palette.text
+        selectionColor: control.palette.highlight
+        selectedTextColor: control.palette.highlightedText
+        horizontalAlignment: Qt.AlignHCenter
+        verticalAlignment: Qt.AlignVCenter
+
+        readOnly: !control.editable
+        validator: control.validator
+        inputMethodHints: control.inputMethodHints
+
+        Rectangle {
+            x: -6 - (control.down.indicator ? 1 : 0)
+            y: -6
+            width: control.width - (control.up.indicator ? control.up.indicator.width - 1 : 0) - (control.down.indicator ? control.down.indicator.width - 1 : 0)
+            height: control.height
+            visible: control.activeFocus
+            color: "transparent"
+            border.color: control.palette.highlight
+            border.width: 2
+        }
+    }
+
+    up.indicator: Rectangle {
+        x: control.mirrored ? 0 : parent.width - width
+        height: parent.height
+        implicitWidth: 40
+        implicitHeight: 40
+        color: control.up.pressed ? control.palette.mid : control.palette.button
+
+        Rectangle {
+            x: (parent.width - width) / 2
+            y: (parent.height - height) / 2
+            width: parent.width / 3
+            height: 2
+            color: enabled ? control.palette.buttonText : control.palette.mid
+        }
+        Rectangle {
+            x: (parent.width - width) / 2
+            y: (parent.height - height) / 2
+            width: 2
+            height: parent.width / 3
+            color: enabled ? control.palette.buttonText : control.palette.mid
+        }
+    }
+
+    down.indicator: Rectangle {
+        x: control.mirrored ? parent.width - width : 0
+        height: parent.height
+        implicitWidth: 40
+        implicitHeight: 40
+        color: control.down.pressed ? control.palette.mid : control.palette.button
+
+        Rectangle {
+            x: (parent.width - width) / 2
+            y: (parent.height - height) / 2
+            width: parent.width / 3
+            height: 2
+            color: enabled ? control.palette.buttonText : control.palette.mid
+        }
+    }
+
+    background: Rectangle {
+        implicitWidth: 140
+        color: enabled ? control.palette.base : control.palette.button
+        border.color: control.palette.button
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/SplitView.qml b/deployment_test/QtQuick/Controls.2/SplitView.qml
new file mode 100644
index 0000000000000000000000000000000000000000..9d37a83e6231bfbdf0f1a4b17b25445b32b9b058
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/SplitView.qml
@@ -0,0 +1,55 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.13
+import QtQuick.Templates 2.13 as T
+import QtQuick.Controls 2.13
+import QtQuick.Controls.impl 2.13
+
+T.SplitView {
+    id: control
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    handle: Rectangle {
+        implicitWidth: control.orientation === Qt.Horizontal ? 6 : control.width
+        implicitHeight: control.orientation === Qt.Horizontal ? control.height : 6
+        color: T.SplitHandle.pressed ? control.palette.mid
+            : (T.SplitHandle.hovered ? control.palette.midlight : control.palette.button)
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/StackView.qml b/deployment_test/QtQuick/Controls.2/StackView.qml
new file mode 100644
index 0000000000000000000000000000000000000000..3e416b8716ced27c199bd66dae120e64d099e8b9
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/StackView.qml
@@ -0,0 +1,67 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Templates 2.12 as T
+
+T.StackView {
+    id: control
+
+    popEnter: Transition {
+        XAnimator { from: (control.mirrored ? -1 : 1) * -control.width; to: 0; duration: 400; easing.type: Easing.OutCubic }
+    }
+
+    popExit: Transition {
+        XAnimator { from: 0; to: (control.mirrored ? -1 : 1) * control.width; duration: 400; easing.type: Easing.OutCubic }
+    }
+
+    pushEnter: Transition {
+        XAnimator { from: (control.mirrored ? -1 : 1) * control.width; to: 0; duration: 400; easing.type: Easing.OutCubic }
+    }
+
+    pushExit: Transition {
+        XAnimator { from: 0; to: (control.mirrored ? -1 : 1) * -control.width; duration: 400; easing.type: Easing.OutCubic }
+    }
+
+    replaceEnter: Transition {
+        XAnimator { from: (control.mirrored ? -1 : 1) * control.width; to: 0; duration: 400; easing.type: Easing.OutCubic }
+    }
+
+    replaceExit: Transition {
+        XAnimator { from: 0; to: (control.mirrored ? -1 : 1) * -control.width; duration: 400; easing.type: Easing.OutCubic }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/SwipeDelegate.qml b/deployment_test/QtQuick/Controls.2/SwipeDelegate.qml
new file mode 100644
index 0000000000000000000000000000000000000000..37d66bb664db42b8c4f9d5348cdad0df1a9eaf35
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/SwipeDelegate.qml
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Templates 2.12 as T
+
+T.SwipeDelegate {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    padding: 12
+    spacing: 12
+
+    icon.width: 24
+    icon.height: 24
+    icon.color: control.palette.text
+
+    swipe.transition: Transition { SmoothedAnimation { velocity: 3; easing.type: Easing.InOutCubic } }
+
+    contentItem: IconLabel {
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+        alignment: control.display === IconLabel.IconOnly || control.display === IconLabel.TextUnderIcon ? Qt.AlignCenter : Qt.AlignLeft
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.palette.text
+    }
+
+    background: Rectangle {
+        implicitWidth: 100
+        implicitHeight: 40
+        color: Color.blend(control.down ? control.palette.midlight : control.palette.light,
+                                          control.palette.highlight, control.visualFocus ? 0.15 : 0.0)
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/SwipeView.qml b/deployment_test/QtQuick/Controls.2/SwipeView.qml
new file mode 100644
index 0000000000000000000000000000000000000000..7722d2588f8bb3b6ae97b7d784e5a8700966c72f
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/SwipeView.qml
@@ -0,0 +1,66 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Templates 2.12 as T
+
+T.SwipeView {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    contentItem: ListView {
+        model: control.contentModel
+        interactive: control.interactive
+        currentIndex: control.currentIndex
+        focus: control.focus
+
+        spacing: control.spacing
+        orientation: control.orientation
+        snapMode: ListView.SnapOneItem
+        boundsBehavior: Flickable.StopAtBounds
+
+        highlightRangeMode: ListView.StrictlyEnforceRange
+        preferredHighlightBegin: 0
+        preferredHighlightEnd: 0
+        highlightMoveDuration: 250
+        maximumFlickVelocity: 4 * (control.orientation === Qt.Horizontal ? width : height)
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Switch.qml b/deployment_test/QtQuick/Controls.2/Switch.qml
new file mode 100644
index 0000000000000000000000000000000000000000..f62e2502c72f0d43248ef7f2073d17028f248537
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Switch.qml
@@ -0,0 +1,92 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+
+T.Switch {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    padding: 6
+    spacing: 6
+
+    indicator: PaddedRectangle {
+        implicitWidth: 56
+        implicitHeight: 28
+
+        x: control.text ? (control.mirrored ? control.width - width - control.rightPadding : control.leftPadding) : control.leftPadding + (control.availableWidth - width) / 2
+        y: control.topPadding + (control.availableHeight - height) / 2
+
+        radius: 8
+        leftPadding: 0
+        rightPadding: 0
+        padding: (height - 16) / 2
+        color: control.checked ? control.palette.dark : control.palette.midlight
+
+        Rectangle {
+            x: Math.max(0, Math.min(parent.width - width, control.visualPosition * parent.width - (width / 2)))
+            y: (parent.height - height) / 2
+            width: 28
+            height: 28
+            radius: 16
+            color: control.down ? control.palette.light : control.palette.window
+            border.width: control.visualFocus ? 2 : 1
+            border.color: control.visualFocus ? control.palette.highlight : control.enabled ? control.palette.mid : control.palette.midlight
+
+            Behavior on x {
+                enabled: !control.down
+                SmoothedAnimation { velocity: 200 }
+            }
+        }
+    }
+
+    contentItem: CheckLabel {
+        leftPadding: control.indicator && !control.mirrored ? control.indicator.width + control.spacing : 0
+        rightPadding: control.indicator && control.mirrored ? control.indicator.width + control.spacing : 0
+
+        text: control.text
+        font: control.font
+        color: control.palette.windowText
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/SwitchDelegate.qml b/deployment_test/QtQuick/Controls.2/SwitchDelegate.qml
new file mode 100644
index 0000000000000000000000000000000000000000..d6447e774763e80f6a2a9d480b44849d6a993aca
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/SwitchDelegate.qml
@@ -0,0 +1,109 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+
+T.SwitchDelegate {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    padding: 12
+    spacing: 12
+
+    icon.width: 24
+    icon.height: 24
+    icon.color: control.palette.text
+
+    indicator: PaddedRectangle {
+        implicitWidth: 56
+        implicitHeight: 28
+
+        x: control.text ? (control.mirrored ? control.leftPadding : control.width - width - control.rightPadding) : control.leftPadding + (control.availableWidth - width) / 2
+        y: control.topPadding + (control.availableHeight - height) / 2
+
+        radius: 8
+        leftPadding: 0
+        rightPadding: 0
+        padding: (height - 16) / 2
+        color: control.checked ? control.palette.dark : control.palette.midlight
+
+        Rectangle {
+            x: Math.max(0, Math.min(parent.width - width, control.visualPosition * parent.width - (width / 2)))
+            y: (parent.height - height) / 2
+            width: 28
+            height: 28
+            radius: 16
+            color: control.down ? control.palette.light : control.palette.window
+            border.width: control.visualFocus ? 2 : 1
+            border.color: control.visualFocus ? control.palette.highlight : control.enabled ? control.palette.mid : control.palette.midlight
+
+            Behavior on x {
+                enabled: !control.down
+                SmoothedAnimation { velocity: 200 }
+            }
+        }
+    }
+
+    contentItem: IconLabel {
+        leftPadding: control.mirrored ? control.indicator.width + control.spacing : 0
+        rightPadding: !control.mirrored ? control.indicator.width + control.spacing : 0
+
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+        alignment: control.display === IconLabel.IconOnly || control.display === IconLabel.TextUnderIcon ? Qt.AlignCenter : Qt.AlignLeft
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.palette.text
+    }
+
+    background: Rectangle {
+        implicitWidth: 100
+        implicitHeight: 40
+        visible: control.down || control.highlighted
+        color: control.down ? control.palette.midlight : control.palette.light
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/TabBar.qml b/deployment_test/QtQuick/Controls.2/TabBar.qml
new file mode 100644
index 0000000000000000000000000000000000000000..83f6b3b277f416cec333bb43ef2380e8d1ebff43
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/TabBar.qml
@@ -0,0 +1,69 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+
+T.TabBar {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    spacing: 1
+
+    contentItem: ListView {
+        model: control.contentModel
+        currentIndex: control.currentIndex
+
+        spacing: control.spacing
+        orientation: ListView.Horizontal
+        boundsBehavior: Flickable.StopAtBounds
+        flickableDirection: Flickable.AutoFlickIfNeeded
+        snapMode: ListView.SnapToItem
+
+        highlightMoveDuration: 0
+        highlightRangeMode: ListView.ApplyRange
+        preferredHighlightBegin: 40
+        preferredHighlightEnd: width - 40
+    }
+
+    background: Rectangle {
+        color: control.palette.window
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/TabButton.qml b/deployment_test/QtQuick/Controls.2/TabButton.qml
new file mode 100644
index 0000000000000000000000000000000000000000..f8b303eaf576a8bac1c5a0d1405d82e2e428a3cc
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/TabButton.qml
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Templates 2.12 as T
+
+T.TabButton {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    padding: 6
+    spacing: 6
+
+    icon.width: 24
+    icon.height: 24
+    icon.color: checked ? control.palette.windowText : control.palette.brightText
+
+    contentItem: IconLabel {
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.checked ? control.palette.windowText : control.palette.brightText
+    }
+
+    background: Rectangle {
+        implicitHeight: 40
+        color: Color.blend(control.checked ? control.palette.window : control.palette.dark,
+                                             control.palette.mid, control.down ? 0.5 : 0.0)
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/TextArea.qml b/deployment_test/QtQuick/Controls.2/TextArea.qml
new file mode 100644
index 0000000000000000000000000000000000000000..45790e67b26ff98b66d24a60b11001c6e022a7dc
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/TextArea.qml
@@ -0,0 +1,75 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Templates 2.12 as T
+
+T.TextArea {
+    id: control
+
+    implicitWidth: Math.max(contentWidth + leftPadding + rightPadding,
+                            implicitBackgroundWidth + leftInset + rightInset,
+                            placeholder.implicitWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(contentHeight + topPadding + bottomPadding,
+                             implicitBackgroundHeight + topInset + bottomInset,
+                             placeholder.implicitHeight + topPadding + bottomPadding)
+
+    padding: 6
+    leftPadding: padding + 4
+
+    color: control.palette.text
+    placeholderTextColor: Color.transparent(control.color, 0.5)
+    selectionColor: control.palette.highlight
+    selectedTextColor: control.palette.highlightedText
+
+    PlaceholderText {
+        id: placeholder
+        x: control.leftPadding
+        y: control.topPadding
+        width: control.width - (control.leftPadding + control.rightPadding)
+        height: control.height - (control.topPadding + control.bottomPadding)
+
+        text: control.placeholderText
+        font: control.font
+        color: control.placeholderTextColor
+        verticalAlignment: control.verticalAlignment
+        visible: !control.length && !control.preeditText && (!control.activeFocus || control.horizontalAlignment !== Qt.AlignHCenter)
+        elide: Text.ElideRight
+        renderType: control.renderType
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/TextField.qml b/deployment_test/QtQuick/Controls.2/TextField.qml
new file mode 100644
index 0000000000000000000000000000000000000000..4d9cb6916eefd1a0cdfbe48dcfae795d02807963
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/TextField.qml
@@ -0,0 +1,83 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Templates 2.12 as T
+
+T.TextField {
+    id: control
+
+    implicitWidth: implicitBackgroundWidth + leftInset + rightInset
+                   || Math.max(contentWidth, placeholder.implicitWidth) + leftPadding + rightPadding
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding,
+                             placeholder.implicitHeight + topPadding + bottomPadding)
+
+    padding: 6
+    leftPadding: padding + 4
+
+    color: control.palette.text
+    selectionColor: control.palette.highlight
+    selectedTextColor: control.palette.highlightedText
+    placeholderTextColor: Color.transparent(control.color, 0.5)
+    verticalAlignment: TextInput.AlignVCenter
+
+    PlaceholderText {
+        id: placeholder
+        x: control.leftPadding
+        y: control.topPadding
+        width: control.width - (control.leftPadding + control.rightPadding)
+        height: control.height - (control.topPadding + control.bottomPadding)
+
+        text: control.placeholderText
+        font: control.font
+        color: control.placeholderTextColor
+        verticalAlignment: control.verticalAlignment
+        visible: !control.length && !control.preeditText && (!control.activeFocus || control.horizontalAlignment !== Qt.AlignHCenter)
+        elide: Text.ElideRight
+        renderType: control.renderType
+    }
+
+    background: Rectangle {
+        implicitWidth: 200
+        implicitHeight: 40
+        border.width: control.activeFocus ? 2 : 1
+        color: control.palette.base
+        border.color: control.activeFocus ? control.palette.highlight : control.palette.mid
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/ToolBar.qml b/deployment_test/QtQuick/Controls.2/ToolBar.qml
new file mode 100644
index 0000000000000000000000000000000000000000..1e07b6bf79f7a297e688d4925ea029df44939aeb
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/ToolBar.qml
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Templates 2.12 as T
+
+T.ToolBar {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    background: Rectangle {
+        implicitHeight: 40
+        color: control.palette.button
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/ToolButton.qml b/deployment_test/QtQuick/Controls.2/ToolButton.qml
new file mode 100644
index 0000000000000000000000000000000000000000..63aaf893e2eb5850b21bb836b62f5a31c05c4720
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/ToolButton.qml
@@ -0,0 +1,75 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Templates 2.12 as T
+
+T.ToolButton {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    padding: 6
+    spacing: 6
+
+    icon.width: 24
+    icon.height: 24
+    icon.color: visualFocus ? control.palette.highlight : control.palette.buttonText
+
+    contentItem: IconLabel {
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: control.visualFocus ? control.palette.highlight : control.palette.buttonText
+    }
+
+    background: Rectangle {
+        implicitWidth: 40
+        implicitHeight: 40
+
+        opacity: control.down ? 1.0 : 0.5
+        color: control.down || control.checked || control.highlighted ? control.palette.mid : control.palette.button
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/ToolSeparator.qml b/deployment_test/QtQuick/Controls.2/ToolSeparator.qml
new file mode 100644
index 0000000000000000000000000000000000000000..188d075835c59999cb29bd0d0aa354ba230a42db
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/ToolSeparator.qml
@@ -0,0 +1,58 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Templates 2.12 as T
+
+T.ToolSeparator {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    padding: vertical ? 6 : 2
+    verticalPadding: vertical ? 2 : 6
+
+    contentItem: Rectangle {
+        implicitWidth: vertical ? 1 : 30
+        implicitHeight: vertical ? 30 : 1
+        color: control.palette.mid
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/ToolTip.qml b/deployment_test/QtQuick/Controls.2/ToolTip.qml
new file mode 100644
index 0000000000000000000000000000000000000000..e03899038003b1e87958ecec6ec22c0e4346bdd0
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/ToolTip.qml
@@ -0,0 +1,69 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Templates 2.12 as T
+
+T.ToolTip {
+    id: control
+
+    x: parent ? (parent.width - implicitWidth) / 2 : 0
+    y: -implicitHeight - 3
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    margins: 6
+    padding: 6
+
+    closePolicy: T.Popup.CloseOnEscape | T.Popup.CloseOnPressOutsideParent | T.Popup.CloseOnReleaseOutsideParent
+
+    contentItem: Text {
+        text: control.text
+        font: control.font
+        wrapMode: Text.Wrap
+        color: control.palette.toolTipText
+    }
+
+    background: Rectangle {
+        border.color: control.palette.dark
+        color: control.palette.toolTipBase
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Tumbler.qml b/deployment_test/QtQuick/Controls.2/Tumbler.qml
new file mode 100644
index 0000000000000000000000000000000000000000..cd10263b4cc95f13089770911cd74014c817d973
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Tumbler.qml
@@ -0,0 +1,75 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Templates 2.12 as T
+
+T.Tumbler {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding) || 60 // ### remove 60 in Qt 6
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding) || 200 // ### remove 200 in Qt 6
+
+    delegate: Text {
+        text: modelData
+        color: control.visualFocus ? control.palette.highlight : control.palette.text
+        font: control.font
+        opacity: 1.0 - Math.abs(Tumbler.displacement) / (control.visibleItemCount / 2)
+        horizontalAlignment: Text.AlignHCenter
+        verticalAlignment: Text.AlignVCenter
+    }
+
+    contentItem: TumblerView {
+        implicitWidth: 60
+        implicitHeight: 200
+        model: control.model
+        delegate: control.delegate
+        path: Path {
+            startX: control.contentItem.width / 2
+            startY: -control.contentItem.delegateHeight / 2
+            PathLine {
+                x: control.contentItem.width / 2
+                y: (control.visibleItemCount + 1) * control.contentItem.delegateHeight - control.contentItem.delegateHeight / 2
+            }
+        }
+
+        property real delegateHeight: control.availableHeight / control.visibleItemCount
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/ApplicationWindow.qml b/deployment_test/QtQuick/Controls.2/Universal/ApplicationWindow.qml
new file mode 100644
index 0000000000000000000000000000000000000000..153b9e8e31c0923a65d62cefba1b653ee9599179
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/ApplicationWindow.qml
@@ -0,0 +1,62 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Window 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Universal 2.12
+import QtQuick.Controls.Universal.impl 2.12
+
+T.ApplicationWindow {
+    id: window
+
+    color: Universal.background
+
+    overlay.modal: Rectangle {
+        color: window.Universal.baseLowColor
+    }
+
+    overlay.modeless: Rectangle {
+        color: window.Universal.baseLowColor
+    }
+
+    FocusRectangle {
+        parent: window.activeFocusControl
+        width: parent ? parent.width : 0
+        height: parent ? parent.height : 0
+        visible: parent && !!parent.useSystemFocusVisuals && !!parent.visualFocus
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/BusyIndicator.qml b/deployment_test/QtQuick/Controls.2/Universal/BusyIndicator.qml
new file mode 100644
index 0000000000000000000000000000000000000000..2ad21b4691e01909d3fd77b0becfaa3369555026
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/BusyIndicator.qml
@@ -0,0 +1,60 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Universal 2.12
+import QtQuick.Controls.Universal.impl 2.12
+
+T.BusyIndicator {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    contentItem: BusyIndicatorImpl {
+        implicitWidth: 20
+        implicitHeight: 20
+
+        readonly property real size: Math.min(control.availableWidth, control.availableHeight)
+
+        count: size < 60 ? 5 : 6 // "Small" vs. "Large"
+        color: control.Universal.accent
+        visible: control.running
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/Button.qml b/deployment_test/QtQuick/Controls.2/Universal/Button.qml
new file mode 100644
index 0000000000000000000000000000000000000000..657b283532993333aba2e611149881559d010bf6
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/Button.qml
@@ -0,0 +1,90 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Universal 2.12
+
+T.Button {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    padding: 8
+    verticalPadding: padding - 4
+    spacing: 8
+
+    icon.width: 20
+    icon.height: 20
+    icon.color: Color.transparent(Universal.foreground, enabled ? 1.0 : 0.2)
+
+    property bool useSystemFocusVisuals: true
+
+    contentItem: IconLabel {
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: Color.transparent(control.Universal.foreground, enabled ? 1.0 : 0.2)
+    }
+
+    background: Rectangle {
+        implicitWidth: 32
+        implicitHeight: 32
+
+        visible: !control.flat || control.down || control.checked || control.highlighted
+        color: control.down ? control.Universal.baseMediumLowColor :
+               control.enabled && (control.highlighted || control.checked) ? control.Universal.accent :
+                                                                             control.Universal.baseLowColor
+
+        Rectangle {
+            width: parent.width
+            height: parent.height
+            color: "transparent"
+            visible: control.hovered
+            border.width: 2 // ButtonBorderThemeThickness
+            border.color: control.Universal.baseMediumLowColor
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/CheckBox.qml b/deployment_test/QtQuick/Controls.2/Universal/CheckBox.qml
new file mode 100644
index 0000000000000000000000000000000000000000..9494f4d2a7473de5977d3348d1f252d7c70e6ec9
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/CheckBox.qml
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Universal 2.12
+import QtQuick.Controls.Universal.impl 2.12
+
+T.CheckBox {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    padding: 6
+    spacing: 8
+
+    property bool useSystemFocusVisuals: true
+
+    indicator: CheckIndicator {
+        x: control.text ? (control.mirrored ? control.width - width - control.rightPadding : control.leftPadding) : control.leftPadding + (control.availableWidth - width) / 2
+        y: control.topPadding + (control.availableHeight - height) / 2
+        control: control
+    }
+
+    contentItem: Text {
+        leftPadding: control.indicator && !control.mirrored ? control.indicator.width + control.spacing : 0
+        rightPadding: control.indicator && control.mirrored ? control.indicator.width + control.spacing : 0
+
+        text: control.text
+        font: control.font
+        elide: Text.ElideRight
+        verticalAlignment: Text.AlignVCenter
+
+        opacity: enabled ? 1.0 : 0.2
+        color: control.Universal.foreground
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/CheckDelegate.qml b/deployment_test/QtQuick/Controls.2/Universal/CheckDelegate.qml
new file mode 100644
index 0000000000000000000000000000000000000000..b544c42e0ecd840f888727a51babb07fc0ca9190
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/CheckDelegate.qml
@@ -0,0 +1,97 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Universal 2.12
+import QtQuick.Controls.Universal.impl 2.12
+
+T.CheckDelegate {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    spacing: 12
+
+    padding: 12
+    topPadding: padding - 1
+    bottomPadding: padding + 1
+
+    icon.width: 20
+    icon.height: 20
+    icon.color: Color.transparent(Universal.foreground, enabled ? 1.0 : 0.2)
+
+    indicator: CheckIndicator {
+        x: control.text ? (control.mirrored ? control.leftPadding : control.width - width - control.rightPadding) : control.leftPadding + (control.availableWidth - width) / 2
+        y: control.topPadding + (control.availableHeight - height) / 2
+        control: control
+    }
+
+    contentItem: IconLabel {
+        leftPadding: !control.mirrored ? 0 : control.indicator.width + control.spacing
+        rightPadding: control.mirrored ? 0 : control.indicator.width + control.spacing
+
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+        alignment: control.display === IconLabel.IconOnly || control.display === IconLabel.TextUnderIcon ? Qt.AlignCenter : Qt.AlignLeft
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: Color.transparent(control.Universal.foreground, enabled ? 1.0 : 0.2)
+    }
+
+    background: Rectangle {
+        visible: control.down || control.highlighted || control.visualFocus || control.hovered
+        color: control.down ? control.Universal.listMediumColor :
+               control.hovered ? control.Universal.listLowColor : control.Universal.altMediumLowColor
+        Rectangle {
+            width: parent.width
+            height: parent.height
+            visible: control.visualFocus || control.highlighted
+            color: control.Universal.accent
+            opacity: control.Universal.theme === Universal.Light ? 0.4 : 0.6
+        }
+
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/CheckIndicator.qml b/deployment_test/QtQuick/Controls.2/Universal/CheckIndicator.qml
new file mode 100644
index 0000000000000000000000000000000000000000..8f41617a0a8667b761e8209b51049aad3f49c25c
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/CheckIndicator.qml
@@ -0,0 +1,82 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Universal 2.12
+
+Rectangle {
+    id: indicator
+    implicitWidth: 20
+    implicitHeight: 20
+
+    color: !control.enabled ? "transparent" :
+            control.down && !partiallyChecked ? control.Universal.baseMediumColor :
+            control.checkState === Qt.Checked ? control.Universal.accent : "transparent"
+    border.color: !control.enabled ? control.Universal.baseLowColor :
+                   control.down ? control.Universal.baseMediumColor :
+                   control.checked ? control.Universal.accent : control.Universal.baseMediumHighColor
+    border.width: 2 // CheckBoxBorderThemeThickness
+
+    property Item control
+    readonly property bool partiallyChecked: control.checkState === Qt.PartiallyChecked
+
+    ColorImage {
+        x: (parent.width - width) / 2
+        y: (parent.height - height) / 2
+
+        visible: indicator.control.checkState === Qt.Checked
+        color: !indicator.control.enabled ? indicator.control.Universal.baseLowColor : indicator.control.Universal.chromeWhiteColor
+        source: "qrc:/qt-project.org/imports/QtQuick/Controls.2/Universal/images/checkmark.png"
+    }
+
+    Rectangle {
+        x: (parent.width - width) / 2
+        y: (parent.height - height) / 2
+        width: indicator.partiallyChecked ? parent.width / 2 : parent.width
+        height: indicator.partiallyChecked ? parent.height / 2 : parent.height
+
+        visible: !indicator.control.pressed && indicator.control.hovered || indicator.partiallyChecked
+        color: !indicator.partiallyChecked ? "transparent" :
+               !indicator.control.enabled ? indicator.control.Universal.baseLowColor :
+                indicator.control.down ? indicator.control.Universal.baseMediumColor :
+                indicator.control.hovered ? indicator.control.Universal.baseHighColor : indicator.control.Universal.baseMediumHighColor
+        border.width: indicator.partiallyChecked ? 0 : 2 // CheckBoxBorderThemeThickness
+        border.color: indicator.control.Universal.baseMediumLowColor
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/ComboBox.qml b/deployment_test/QtQuick/Controls.2/Universal/ComboBox.qml
new file mode 100644
index 0000000000000000000000000000000000000000..9b88ccf9350060c98fc12b61f802539c92176db9
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/ComboBox.qml
@@ -0,0 +1,159 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.15
+import QtQuick.Window 2.15
+import QtQuick.Controls 2.15
+import QtQuick.Controls.impl 2.15
+import QtQuick.Templates 2.15 as T
+import QtQuick.Controls.Universal 2.15
+
+T.ComboBox {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    leftPadding: padding + (!control.mirrored || !indicator || !indicator.visible ? 0 : indicator.width + spacing)
+    rightPadding: padding + (control.mirrored || !indicator || !indicator.visible ? 0 : indicator.width + spacing)
+
+    Universal.theme: editable && activeFocus ? Universal.Light : undefined
+
+    delegate: ItemDelegate {
+        width: ListView.view.width
+        text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole] : model[control.textRole]) : modelData
+        font.weight: control.currentIndex === index ? Font.DemiBold : Font.Normal
+        highlighted: control.highlightedIndex === index
+        hoverEnabled: control.hoverEnabled
+    }
+
+    indicator: ColorImage {
+        x: control.mirrored ? control.padding : control.width - width - control.padding
+        y: control.topPadding + (control.availableHeight - height) / 2
+        color: !control.enabled ? control.Universal.baseLowColor : control.Universal.baseMediumHighColor
+        source: "qrc:/qt-project.org/imports/QtQuick/Controls.2/Universal/images/downarrow.png"
+
+        Rectangle {
+            z: -1
+            width: parent.width
+            height: parent.height
+            color: control.activeFocus ? control.Universal.accent :
+                   control.pressed ? control.Universal.baseMediumLowColor :
+                   control.hovered ? control.Universal.baseLowColor : "transparent"
+            visible: control.editable && !contentItem.hovered && (control.pressed || control.hovered)
+            opacity: control.activeFocus && !control.pressed ? 0.4 : 1.0
+        }
+    }
+
+    contentItem: T.TextField {
+        leftPadding: control.mirrored ? 1 : 12
+        rightPadding: control.mirrored ? 10 : 1
+        topPadding: 5 - control.topPadding
+        bottomPadding: 7 - control.bottomPadding
+
+        text: control.editable ? control.editText : control.displayText
+
+        enabled: control.editable
+        autoScroll: control.editable
+        readOnly: control.down
+        inputMethodHints: control.inputMethodHints
+        validator: control.validator
+        selectByMouse: control.selectTextByMouse
+
+        font: control.font
+        color: !control.enabled ? control.Universal.chromeDisabledLowColor :
+                control.editable && control.activeFocus ? control.Universal.chromeBlackHighColor : control.Universal.foreground
+        selectionColor: control.Universal.accent
+        selectedTextColor: control.Universal.chromeWhiteColor
+        verticalAlignment: Text.AlignVCenter
+    }
+
+    background: Rectangle {
+        implicitWidth: 120
+        implicitHeight: 32
+
+        border.width: control.flat ? 0 : 2 // ComboBoxBorderThemeThickness
+        border.color: !control.enabled ? control.Universal.baseLowColor :
+                       control.editable && control.activeFocus ? control.Universal.accent :
+                       control.down ? control.Universal.baseMediumLowColor :
+                       control.hovered ? control.Universal.baseMediumColor : control.Universal.baseMediumLowColor
+        color: !control.enabled ? control.Universal.baseLowColor :
+                control.down ? control.Universal.listMediumColor :
+                control.flat && control.hovered ? control.Universal.listLowColor :
+                control.editable && control.activeFocus ? control.Universal.background : control.Universal.altMediumLowColor
+        visible: !control.flat || control.pressed || control.hovered || control.visualFocus
+
+        Rectangle {
+            x: 2
+            y: 2
+            width: parent.width - 4
+            height: parent.height - 4
+
+            visible: control.visualFocus && !control.editable
+            color: control.Universal.accent
+            opacity: control.Universal.theme === Universal.Light ? 0.4 : 0.6
+        }
+    }
+
+    popup: T.Popup {
+        width: control.width
+        height: Math.min(contentItem.implicitHeight, control.Window.height - topMargin - bottomMargin)
+        topMargin: 8
+        bottomMargin: 8
+
+        Universal.theme: control.Universal.theme
+        Universal.accent: control.Universal.accent
+
+        contentItem: ListView {
+            clip: true
+            implicitHeight: contentHeight
+            model: control.delegateModel
+            currentIndex: control.highlightedIndex
+            highlightMoveDuration: 0
+
+            T.ScrollIndicator.vertical: ScrollIndicator { }
+        }
+
+        background: Rectangle {
+            color: control.Universal.chromeMediumLowColor
+            border.color: control.Universal.chromeHighColor
+            border.width: 1 // FlyoutBorderThemeThickness
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/DelayButton.qml b/deployment_test/QtQuick/Controls.2/Universal/DelayButton.qml
new file mode 100644
index 0000000000000000000000000000000000000000..2a3a3b3a02495f5bc73350403ba7bb500e3f0fb9
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/DelayButton.qml
@@ -0,0 +1,94 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Universal 2.12
+
+T.DelayButton {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    padding: 8
+    verticalPadding: padding - 4
+
+    property bool useSystemFocusVisuals: true
+
+    transition: Transition {
+        NumberAnimation {
+            duration: control.delay * (control.pressed ? 1.0 - control.progress : 0.3 * control.progress)
+        }
+    }
+
+    contentItem: Text {
+        text: control.text
+        font: control.font
+        elide: Text.ElideRight
+        horizontalAlignment: Text.AlignHCenter
+        verticalAlignment: Text.AlignVCenter
+
+        opacity: enabled ? 1.0 : 0.2
+        color: control.Universal.foreground
+    }
+
+    background: Rectangle {
+        implicitWidth: 32
+        implicitHeight: 32
+
+        color: control.down ? control.Universal.baseMediumLowColor :
+               control.enabled && control.checked ? control.Universal.accent : control.Universal.baseLowColor
+
+        Rectangle {
+            visible: !control.checked
+            width: parent.width * control.progress
+            height: parent.height
+            color: control.Universal.accent
+        }
+
+        Rectangle {
+            width: parent.width
+            height: parent.height
+            color: "transparent"
+            visible: control.hovered
+            border.width: 2 // ButtonBorderThemeThickness
+            border.color: control.Universal.baseMediumLowColor
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/Dial.qml b/deployment_test/QtQuick/Controls.2/Universal/Dial.qml
new file mode 100644
index 0000000000000000000000000000000000000000..f45d912eea69557b5d1d376c6bc45e86ae1b7977
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/Dial.qml
@@ -0,0 +1,86 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Universal 2.12
+
+T.Dial {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding) || 100 // ### remove 100 in Qt 6
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding) || 100 // ### remove 100 in Qt 6
+
+    background: Rectangle {
+        implicitWidth: 100
+        implicitHeight: 100
+
+        x: control.width / 2 - width / 2
+        y: control.height / 2 - height / 2
+        width: Math.max(64, Math.min(control.width, control.height))
+        height: width
+        radius: width / 2
+        color: "transparent"
+        border.color: !control.enabled ? control.Universal.baseLowColor : control.Universal.baseMediumColor
+        border.width: 2
+    }
+
+    handle: Rectangle {
+        implicitWidth: 14
+        implicitHeight: 14
+
+        x: control.background.x + control.background.width / 2 - control.handle.width / 2
+        y: control.background.y + control.background.height / 2 - control.handle.height / 2
+
+        radius: width / 2
+        color: !control.enabled ? control.Universal.baseLowColor :
+                control.pressed ? control.Universal.baseMediumColor :
+                control.hovered ? control.Universal.baseHighColor : control.Universal.baseMediumHighColor
+
+        transform: [
+            Translate {
+                y: -control.background.height * 0.4 + control.handle.height / 2
+            },
+            Rotation {
+                angle: control.angle
+                origin.x: control.handle.width / 2
+                origin.y: control.handle.height / 2
+            }
+        ]
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/Dialog.qml b/deployment_test/QtQuick/Controls.2/Universal/Dialog.qml
new file mode 100644
index 0000000000000000000000000000000000000000..6151d0908b1497b5c400dab970a8f84e1df19942
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/Dialog.qml
@@ -0,0 +1,91 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.Universal 2.12
+
+T.Dialog {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding,
+                            implicitHeaderWidth,
+                            implicitFooterWidth)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding
+                             + (implicitHeaderHeight > 0 ? implicitHeaderHeight + spacing : 0)
+                             + (implicitFooterHeight > 0 ? implicitFooterHeight + spacing : 0))
+
+    padding: 24
+    verticalPadding: 18
+
+    background: Rectangle {
+        color: control.Universal.chromeMediumLowColor
+        border.color: control.Universal.chromeHighColor
+        border.width: 1 // FlyoutBorderThemeThickness
+    }
+
+    header: Label {
+        text: control.title
+        visible: control.title
+        elide: Label.ElideRight
+        topPadding: 18
+        leftPadding: 24
+        rightPadding: 24
+        // TODO: QPlatformTheme::TitleBarFont
+        font.pixelSize: 20
+        background: Rectangle {
+            x: 1; y: 1 // // FlyoutBorderThemeThickness
+            color: control.Universal.chromeMediumLowColor
+            width: parent.width - 2
+            height: parent.height - 1
+        }
+    }
+
+    footer: DialogButtonBox {
+        visible: count > 0
+    }
+
+    T.Overlay.modal: Rectangle {
+        color: control.Universal.baseLowColor
+    }
+
+    T.Overlay.modeless: Rectangle {
+        color: control.Universal.baseLowColor
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/DialogButtonBox.qml b/deployment_test/QtQuick/Controls.2/Universal/DialogButtonBox.qml
new file mode 100644
index 0000000000000000000000000000000000000000..0458c39dab15dfddefa9d2fca419d1efffb5100a
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/DialogButtonBox.qml
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.Universal 2.12
+
+T.DialogButtonBox {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            (control.count === 1 ? implicitContentWidth * 2 : implicitContentWidth) + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+    contentWidth: contentItem.contentWidth
+
+    spacing: 4
+    padding: 24
+    topPadding: position === T.DialogButtonBox.Footer ? 6 : 24
+    bottomPadding: position === T.DialogButtonBox.Header ? 6 : 24
+    alignment: count === 1 ? Qt.AlignRight : undefined
+
+    delegate: Button {
+        width: control.count === 1 ? control.availableWidth / 2 : undefined
+    }
+
+    contentItem: ListView {
+        model: control.contentModel
+        spacing: control.spacing
+        orientation: ListView.Horizontal
+        boundsBehavior: Flickable.StopAtBounds
+        snapMode: ListView.SnapToItem
+    }
+
+    background: Rectangle {
+        implicitHeight: 32
+        color: control.Universal.chromeMediumLowColor
+        x: 1; y: 1
+        width: parent.width - 2
+        height: parent.height - 2
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/Drawer.qml b/deployment_test/QtQuick/Controls.2/Universal/Drawer.qml
new file mode 100644
index 0000000000000000000000000000000000000000..7ec1d7f88af754de49a5ad1cd30d089dc7bc5b7d
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/Drawer.qml
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Universal 2.12
+
+T.Drawer {
+    id: control
+
+    parent: T.Overlay.overlay
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    topPadding: control.edge === Qt.BottomEdge
+    leftPadding: control.edge === Qt.RightEdge
+    rightPadding: control.edge === Qt.LeftEdge
+    bottomPadding: control.edge === Qt.TopEdge
+
+    enter: Transition { SmoothedAnimation { velocity: 5 } }
+    exit: Transition { SmoothedAnimation { velocity: 5 } }
+
+    background: Rectangle {
+        color: control.Universal.chromeMediumLowColor
+        Rectangle {
+            readonly property bool horizontal: control.edge === Qt.LeftEdge || control.edge === Qt.RightEdge
+            width: horizontal ? 1 : parent.width
+            height: horizontal ? parent.height : 1
+            color: control.Universal.chromeHighColor
+            x: control.edge === Qt.LeftEdge ? parent.width - 1 : 0
+            y: control.edge === Qt.TopEdge ? parent.height - 1 : 0
+        }
+    }
+
+    T.Overlay.modal: Rectangle {
+        color: control.Universal.baseLowColor
+    }
+
+    T.Overlay.modeless: Rectangle {
+        color: control.Universal.baseLowColor
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/Frame.qml b/deployment_test/QtQuick/Controls.2/Universal/Frame.qml
new file mode 100644
index 0000000000000000000000000000000000000000..8bb44849963305dcdfa446596919bbc25573637f
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/Frame.qml
@@ -0,0 +1,55 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Universal 2.12
+
+T.Frame {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    padding: 12
+
+    background: Rectangle {
+        color: "transparent"
+        border.color: control.Universal.chromeDisabledLowColor
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/GroupBox.qml b/deployment_test/QtQuick/Controls.2/Universal/GroupBox.qml
new file mode 100644
index 0000000000000000000000000000000000000000..dc156dd79880956bd824928f35c9287c6456e831
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/GroupBox.qml
@@ -0,0 +1,75 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Universal 2.12
+
+T.GroupBox {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding,
+                            implicitLabelWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    spacing: 12
+    padding: 12
+    topPadding: padding + (implicitLabelWidth > 0 ? implicitLabelHeight + spacing : 0)
+
+    label: Text {
+        x: control.leftPadding
+        width: control.availableWidth
+
+        text: control.title
+        font: control.font
+        elide: Text.ElideRight
+        verticalAlignment: Text.AlignVCenter
+
+        opacity: enabled ? 1.0 : 0.2
+        color: control.Universal.foreground
+    }
+
+    background: Rectangle {
+        y: control.topPadding - control.bottomPadding
+        width: parent.width
+        height: parent.height - control.topPadding + control.bottomPadding
+
+        color: "transparent"
+        border.color: control.Universal.chromeDisabledLowColor
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/HorizontalHeaderView.qml b/deployment_test/QtQuick/Controls.2/Universal/HorizontalHeaderView.qml
new file mode 100644
index 0000000000000000000000000000000000000000..47daa8ce9041c165e9c1c326c620bd9a37dd28a3
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/HorizontalHeaderView.qml
@@ -0,0 +1,70 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.15
+import QtQuick.Controls 2.15
+import QtQuick.Controls.impl 2.15
+import QtQuick.Templates 2.15 as T
+import QtQuick.Controls.Universal 2.15
+import QtQuick.Controls.Universal.impl 2.15
+
+T.HorizontalHeaderView {
+    id: control
+
+    implicitWidth: syncView ? syncView.width : 0
+    implicitHeight: contentHeight
+
+    delegate: Rectangle {
+        // Qt6: add cellPadding (and font etc) as public API in headerview
+        readonly property real cellPadding: 8
+
+        implicitWidth: text.implicitWidth + (cellPadding * 2)
+        implicitHeight: Math.max(control.height, text.implicitHeight + (cellPadding * 2))
+        color: control.Universal.background
+
+        Text {
+            id: text
+            text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole]
+                                        : model[control.textRole])
+                                   : modelData
+            width: parent.width
+            height: parent.height
+            horizontalAlignment: Text.AlignHCenter
+            verticalAlignment: Text.AlignVCenter
+            color: Color.transparent(control.Universal.foreground, enabled ? 1.0 : 0.2)
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/ItemDelegate.qml b/deployment_test/QtQuick/Controls.2/Universal/ItemDelegate.qml
new file mode 100644
index 0000000000000000000000000000000000000000..ed98540597e30f7277bd365fb68ad80db4d29b2b
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/ItemDelegate.qml
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Universal 2.12
+
+T.ItemDelegate {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    spacing: 12
+
+    padding: 12
+    topPadding: padding - 1
+    bottomPadding: padding + 1
+
+    icon.width: 20
+    icon.height: 20
+    icon.color: Color.transparent(Universal.foreground, enabled ? 1.0 : 0.2)
+
+    contentItem: IconLabel {
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+        alignment: control.display === IconLabel.IconOnly || control.display === IconLabel.TextUnderIcon ? Qt.AlignCenter : Qt.AlignLeft
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: Color.transparent(control.Universal.foreground, enabled ? 1.0 : 0.2)
+    }
+
+    background: Rectangle {
+        visible: control.down || control.highlighted || control.visualFocus || control.hovered
+        color: control.down ? control.Universal.listMediumColor :
+               control.hovered ? control.Universal.listLowColor : control.Universal.altMediumLowColor
+        Rectangle {
+            width: parent.width
+            height: parent.height
+            visible: control.visualFocus || control.highlighted
+            color: control.Universal.accent
+            opacity: control.Universal.theme === Universal.Light ? 0.4 : 0.6
+        }
+
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/Label.qml b/deployment_test/QtQuick/Controls.2/Universal/Label.qml
new file mode 100644
index 0000000000000000000000000000000000000000..c66435c3761d9019cf1ff2291210bdce069b68b2
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/Label.qml
@@ -0,0 +1,47 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Universal 2.12
+
+T.Label {
+    id: control
+
+    opacity: enabled ? 1.0 : 0.2
+    color: control.Universal.foreground
+    linkColor: Universal.accent
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/Menu.qml b/deployment_test/QtQuick/Controls.2/Universal/Menu.qml
new file mode 100644
index 0000000000000000000000000000000000000000..4814d006558181007d93af147000ad41534d4bb4
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/Menu.qml
@@ -0,0 +1,83 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Universal 2.12
+import QtQuick.Window 2.12
+
+T.Menu {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    margins: 0
+    overlap: 1
+
+    delegate: MenuItem { }
+
+    contentItem: ListView {
+        implicitHeight: contentHeight
+        model: control.contentModel
+        interactive: Window.window
+                        ? contentHeight + control.topPadding + control.bottomPadding > Window.window.height
+                        : false
+        clip: true
+        currentIndex: control.currentIndex
+
+        ScrollIndicator.vertical: ScrollIndicator {}
+    }
+
+    background: Rectangle {
+        implicitWidth: 200
+        implicitHeight: 40
+        color: control.Universal.chromeMediumLowColor
+        border.color: control.Universal.chromeHighColor
+        border.width: 1 // FlyoutBorderThemeThickness
+    }
+
+    T.Overlay.modal: Rectangle {
+        color: control.Universal.baseLowColor
+    }
+
+    T.Overlay.modeless: Rectangle {
+        color: control.Universal.baseLowColor
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/MenuBar.qml b/deployment_test/QtQuick/Controls.2/Universal/MenuBar.qml
new file mode 100644
index 0000000000000000000000000000000000000000..2317f50581282b58d509054eb705a72db8fb8576
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/MenuBar.qml
@@ -0,0 +1,64 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Universal 2.12
+
+T.MenuBar {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    delegate: MenuBarItem { }
+
+    contentItem: Row {
+        spacing: control.spacing
+        Repeater {
+            model: control.contentModel
+        }
+    }
+
+    background: Rectangle {
+        implicitHeight: 40
+        color: control.Universal.chromeMediumColor
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/MenuBarItem.qml b/deployment_test/QtQuick/Controls.2/Universal/MenuBarItem.qml
new file mode 100644
index 0000000000000000000000000000000000000000..30f1fc57f7d68a0a004576a989fa55f1f3054459
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/MenuBarItem.qml
@@ -0,0 +1,91 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Universal 2.12
+
+T.MenuBarItem {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    padding: 12
+    topPadding: padding - 1
+    bottomPadding: padding + 1
+    spacing: 12
+
+    icon.width: 20
+    icon.height: 20
+    icon.color: !enabled ? Universal.baseLowColor : Universal.baseHighColor
+
+    contentItem: IconLabel {
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+        alignment: Qt.AlignLeft
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: !control.enabled ? control.Universal.baseLowColor : control.Universal.baseHighColor
+    }
+
+    background: Rectangle {
+        implicitWidth: 40
+        implicitHeight: 40
+
+        color: !control.enabled ? control.Universal.baseLowColor :
+                control.down ? control.Universal.listMediumColor :
+                control.highlighted ? control.Universal.listLowColor : "transparent"
+
+        Rectangle {
+            x: 1; y: 1
+            width: parent.width - 2
+            height: parent.height - 2
+
+            visible: control.visualFocus
+            color: control.Universal.accent
+            opacity: control.Universal.theme === Universal.Light ? 0.4 : 0.6
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/MenuItem.qml b/deployment_test/QtQuick/Controls.2/Universal/MenuItem.qml
new file mode 100644
index 0000000000000000000000000000000000000000..23d0ee3c528870435639eb98881ab2935f0f6492
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/MenuItem.qml
@@ -0,0 +1,115 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Universal 2.12
+
+T.MenuItem {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    padding: 12
+    topPadding: padding - 1
+    bottomPadding: padding + 1
+    spacing: 12
+
+    icon.width: 20
+    icon.height: 20
+    icon.color: !enabled ? Universal.baseLowColor : Universal.baseHighColor
+
+    contentItem: IconLabel {
+        readonly property real arrowPadding: control.subMenu && control.arrow ? control.arrow.width + control.spacing : 0
+        readonly property real indicatorPadding: control.checkable && control.indicator ? control.indicator.width + control.spacing : 0
+        leftPadding: !control.mirrored ? indicatorPadding : arrowPadding
+        rightPadding: control.mirrored ? indicatorPadding : arrowPadding
+
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+        alignment: Qt.AlignLeft
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: !control.enabled ? control.Universal.baseLowColor : control.Universal.baseHighColor
+    }
+
+    arrow: ColorImage {
+        x: control.mirrored ? control.leftPadding : control.width - width - control.rightPadding
+        y: control.topPadding + (control.availableHeight - height) / 2
+
+        visible: control.subMenu
+        mirror: control.mirrored
+        color: !enabled ? control.Universal.baseLowColor : control.Universal.baseHighColor
+        source: "qrc:/qt-project.org/imports/QtQuick/Controls.2/Universal/images/rightarrow.png"
+    }
+
+    indicator: ColorImage {
+        x: control.text ? (control.mirrored ? control.width - width - control.rightPadding : control.leftPadding) : control.leftPadding + (control.availableWidth - width) / 2
+        y: control.topPadding + (control.availableHeight - height) / 2
+
+        visible: control.checked
+        color: !control.enabled ? control.Universal.baseLowColor : control.down ? control.Universal.baseHighColor : control.Universal.baseMediumHighColor
+        source: !control.checkable ? "" : "qrc:/qt-project.org/imports/QtQuick/Controls.2/Universal/images/checkmark.png"
+    }
+
+    background: Rectangle {
+        implicitWidth: 200
+        implicitHeight: 40
+
+        color: !control.enabled ? control.Universal.baseLowColor :
+                control.down ? control.Universal.listMediumColor :
+                control.highlighted ? control.Universal.listLowColor : control.Universal.altMediumLowColor
+
+        Rectangle {
+            x: 1; y: 1
+            width: parent.width - 2
+            height: parent.height - 2
+
+            visible: control.visualFocus
+            color: control.Universal.accent
+            opacity: control.Universal.theme === Universal.Light ? 0.4 : 0.6
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/MenuSeparator.qml b/deployment_test/QtQuick/Controls.2/Universal/MenuSeparator.qml
new file mode 100644
index 0000000000000000000000000000000000000000..72f9f6f7f20365c08417b6db49eaaee29b6c1af3
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/MenuSeparator.qml
@@ -0,0 +1,62 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Universal 2.12
+
+T.MenuSeparator {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    padding: 12
+    topPadding: 9
+    bottomPadding: 10
+
+    contentItem: Rectangle {
+        implicitWidth: 188
+        implicitHeight: 1
+        color: control.Universal.baseMediumLowColor
+    }
+
+    background: Rectangle {
+        color: control.Universal.altMediumLowColor
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/Page.qml b/deployment_test/QtQuick/Controls.2/Universal/Page.qml
new file mode 100644
index 0000000000000000000000000000000000000000..347d6d9a82ba2fc5298015bcbef1c92e2d949f31
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/Page.qml
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Universal 2.12
+
+T.Page {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding,
+                            implicitHeaderWidth,
+                            implicitFooterWidth)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding
+                             + (implicitHeaderHeight > 0 ? implicitHeaderHeight + spacing : 0)
+                             + (implicitFooterHeight > 0 ? implicitFooterHeight + spacing : 0))
+
+    background: Rectangle {
+        color: control.Universal.background
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/PageIndicator.qml b/deployment_test/QtQuick/Controls.2/Universal/PageIndicator.qml
new file mode 100644
index 0000000000000000000000000000000000000000..3dcc84ab4a5330e4343cae41596ffef758c956e3
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/PageIndicator.qml
@@ -0,0 +1,69 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Universal 2.12
+
+T.PageIndicator {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    padding: 6
+    spacing: 7
+
+    delegate: Rectangle {
+        implicitWidth: 5
+        implicitHeight: 5
+
+        radius: width / 2
+        color: index === control.currentIndex ? control.Universal.baseMediumHighColor :
+                                      pressed ? control.Universal.baseMediumLowColor : control.Universal.baseLowColor
+    }
+
+    contentItem: Row {
+        spacing: control.spacing
+
+        Repeater {
+            model: control.count
+            delegate: control.delegate
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/Pane.qml b/deployment_test/QtQuick/Controls.2/Universal/Pane.qml
new file mode 100644
index 0000000000000000000000000000000000000000..63a5ecec455ed5df8de6260e6da60fd6ee0d5f9d
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/Pane.qml
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Universal 2.12
+
+T.Pane {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    padding: 12
+
+    background: Rectangle {
+        color: control.Universal.background
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/Popup.qml b/deployment_test/QtQuick/Controls.2/Universal/Popup.qml
new file mode 100644
index 0000000000000000000000000000000000000000..e39134e12fb7569dce9af410fe4023d154f51b30
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/Popup.qml
@@ -0,0 +1,64 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Universal 2.12
+
+T.Popup {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    padding: 12
+
+    background: Rectangle {
+        color: control.Universal.chromeMediumLowColor
+        border.color: control.Universal.chromeHighColor
+        border.width: 1 // FlyoutBorderThemeThickness
+    }
+
+    T.Overlay.modal: Rectangle {
+        color: control.Universal.baseLowColor
+    }
+
+    T.Overlay.modeless: Rectangle {
+        color: control.Universal.baseLowColor
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/ProgressBar.qml b/deployment_test/QtQuick/Controls.2/Universal/ProgressBar.qml
new file mode 100644
index 0000000000000000000000000000000000000000..ce79bd5470c3944e73c6e463f3d045e70d3f6cfa
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/ProgressBar.qml
@@ -0,0 +1,68 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Universal 2.12
+import QtQuick.Controls.Universal.impl 2.12
+
+T.ProgressBar {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    contentItem: ProgressBarImpl {
+        implicitHeight: 10
+
+        scale: control.mirrored ? -1 : 1
+        color: control.Universal.accent
+        progress: control.position
+        indeterminate: control.visible && control.indeterminate
+    }
+
+    background: Rectangle {
+        implicitWidth: 100
+        implicitHeight: 10
+        y: (control.height - height) / 2
+        height: 10
+
+        visible: !control.indeterminate
+        color: control.Universal.baseLowColor
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/RadioButton.qml b/deployment_test/QtQuick/Controls.2/Universal/RadioButton.qml
new file mode 100644
index 0000000000000000000000000000000000000000..a50cdf9bcc1690f59facf0c0004c3dcbddfb5063
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/RadioButton.qml
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Universal 2.12
+import QtQuick.Controls.Universal.impl 2.12
+
+T.RadioButton {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    padding: 6
+    spacing: 8
+
+    property bool useSystemFocusVisuals: true
+
+    indicator: RadioIndicator {
+        x: control.text ? (control.mirrored ? control.width - width - control.rightPadding : control.leftPadding) : control.leftPadding + (control.availableWidth - width) / 2
+        y: control.topPadding + (control.availableHeight - height) / 2
+        control: control
+    }
+
+    contentItem: Text {
+        leftPadding: control.indicator && !control.mirrored ? control.indicator.width + control.spacing : 0
+        rightPadding: control.indicator && control.mirrored ? control.indicator.width + control.spacing : 0
+
+        text: control.text
+        font: control.font
+        elide: Text.ElideRight
+        verticalAlignment: Text.AlignVCenter
+
+        opacity: enabled ? 1.0 : 0.2
+        color: control.Universal.foreground
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/RadioDelegate.qml b/deployment_test/QtQuick/Controls.2/Universal/RadioDelegate.qml
new file mode 100644
index 0000000000000000000000000000000000000000..9fc910f3454287af14483b680093ff8f3be291c8
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/RadioDelegate.qml
@@ -0,0 +1,97 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Universal 2.12
+import QtQuick.Controls.Universal.impl 2.12
+
+T.RadioDelegate {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    spacing: 12
+
+    padding: 12
+    topPadding: padding - 1
+    bottomPadding: padding + 1
+
+    icon.width: 20
+    icon.height: 20
+    icon.color: Color.transparent(Universal.foreground, enabled ? 1.0 : 0.2)
+
+    indicator: RadioIndicator {
+        x: control.text ? (control.mirrored ? control.leftPadding : control.width - width - control.rightPadding) : control.leftPadding + (control.availableWidth - width) / 2
+        y: control.topPadding + (control.availableHeight - height) / 2
+        control: control
+    }
+
+    contentItem: IconLabel {
+        leftPadding: !control.mirrored ? 0 : control.indicator.width + control.spacing
+        rightPadding: control.mirrored ? 0 : control.indicator.width + control.spacing
+
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+        alignment: control.display === IconLabel.IconOnly || control.display === IconLabel.TextUnderIcon ? Qt.AlignCenter : Qt.AlignLeft
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: Color.transparent(control.Universal.foreground, enabled ? 1.0 : 0.2)
+    }
+
+    background: Rectangle {
+        visible: control.down || control.highlighted || control.visualFocus || control.hovered
+        color: control.down ? control.Universal.listMediumColor :
+               control.hovered ? control.Universal.listLowColor : control.Universal.altMediumLowColor
+        Rectangle {
+            width: parent.width
+            height: parent.height
+            visible: control.visualFocus || control.highlighted
+            color: control.Universal.accent
+            opacity: control.Universal.theme === Universal.Light ? 0.4 : 0.6
+        }
+
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/RadioIndicator.qml b/deployment_test/QtQuick/Controls.2/Universal/RadioIndicator.qml
new file mode 100644
index 0000000000000000000000000000000000000000..1a32decbbedf2aca51707ce7f17fa0bc55f6f907
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/RadioIndicator.qml
@@ -0,0 +1,80 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Controls.Universal 2.12
+
+Rectangle {
+    id: indicator
+    implicitWidth: 20
+    implicitHeight: 20
+    radius: width / 2
+    color: "transparent"
+    border.width: 2 // RadioButtonBorderThemeThickness
+    border.color:  control.checked ? "transparent" :
+                  !control.enabled ? control.Universal.baseLowColor :
+                   control.down ? control.Universal.baseMediumColor :
+                   control.hovered ? control.Universal.baseHighColor : control.Universal.baseMediumHighColor
+
+    property var control
+
+    Rectangle {
+        id: checkOuterEllipse
+        width: parent.width
+        height: parent.height
+
+        radius: width / 2
+        opacity: indicator.control.checked ? 1 : 0
+        color: "transparent"
+        border.width: 2 // RadioButtonBorderThemeThickness
+        border.color: !indicator.control.enabled ? indicator.control.Universal.baseLowColor :
+                       indicator.control.down ? indicator.control.Universal.baseMediumColor : indicator.control.Universal.accent
+    }
+
+    Rectangle {
+        id: checkGlyph
+        x: (parent.width - width) / 2
+        y: (parent.height - height) / 2
+        width: parent.width / 2
+        height: parent.height / 2
+
+        radius: width / 2
+        opacity: indicator.control.checked ? 1 : 0
+        color: !indicator.control.enabled ? indicator.control.Universal.baseLowColor :
+                indicator.control.down ? indicator.control.Universal.baseMediumColor :
+                indicator.control.hovered ? indicator.control.Universal.baseHighColor : indicator.control.Universal.baseMediumHighColor
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/RangeSlider.qml b/deployment_test/QtQuick/Controls.2/Universal/RangeSlider.qml
new file mode 100644
index 0000000000000000000000000000000000000000..f2e4d71e9fc2f67f12123eb3cfab4d8b1e98fa50
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/RangeSlider.qml
@@ -0,0 +1,109 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Universal 2.12
+
+T.RangeSlider {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            first.implicitHandleWidth + leftPadding + rightPadding,
+                            second.implicitHandleWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             first.implicitHandleHeight + topPadding + bottomPadding,
+                             second.implicitHandleHeight + topPadding + bottomPadding)
+
+    padding: 6
+
+    first.handle: Rectangle {
+        implicitWidth: control.horizontal ? 8 : 24
+        implicitHeight: control.horizontal ? 24 : 8
+
+        x: control.leftPadding + (control.horizontal ? control.first.visualPosition * (control.availableWidth - width) : (control.availableWidth - width) / 2)
+        y: control.topPadding + (control.horizontal ? (control.availableHeight - height) / 2 : control.first.visualPosition * (control.availableHeight - height))
+
+        radius: 4
+        color: control.first.pressed ? control.Universal.chromeHighColor :
+               control.first.hovered ? control.Universal.chromeAltLowColor :
+               control.enabled ? control.Universal.accent : control.Universal.chromeDisabledHighColor
+    }
+
+    second.handle: Rectangle {
+        implicitWidth: control.horizontal ? 8 : 24
+        implicitHeight: control.horizontal ? 24 : 8
+
+        x: control.leftPadding + (control.horizontal ? control.second.visualPosition * (control.availableWidth - width) : (control.availableWidth - width) / 2)
+        y: control.topPadding + (control.horizontal ? (control.availableHeight - height) / 2 : control.second.visualPosition * (control.availableHeight - height))
+
+        radius: 4
+        color: control.second.pressed ? control.Universal.chromeHighColor :
+               control.second.hovered ? control.Universal.chromeAltLowColor :
+               control.enabled ? control.Universal.accent : control.Universal.chromeDisabledHighColor
+    }
+
+    background: Item {
+        implicitWidth: control.horizontal ? 200 : 18
+        implicitHeight: control.horizontal ? 18 : 200
+
+        x: control.leftPadding + (control.horizontal ? 0 : (control.availableWidth - width) / 2)
+        y: control.topPadding + (control.horizontal ? (control.availableHeight - height) / 2 : 0)
+        width: control.horizontal ? control.availableWidth : implicitWidth
+        height: control.horizontal ? implicitHeight : control.availableHeight
+
+        scale: control.horizontal && control.mirrored ? -1 : 1
+
+        Rectangle {
+            x: control.horizontal ? 0 : (parent.width - width) / 2
+            y: control.horizontal ? (parent.height - height) / 2 : 0
+            width: control.horizontal ? parent.width : 2 // SliderBackgroundThemeHeight
+            height: control.vertical ? parent.height : 2 // SliderBackgroundThemeHeight
+
+            color: control.hovered && !control.pressed ? control.Universal.baseMediumColor :
+                   control.enabled ? control.Universal.baseMediumLowColor : control.Universal.chromeDisabledHighColor
+        }
+
+        Rectangle {
+            x: control.horizontal ? control.first.position * parent.width : (parent.width - width) / 2
+            y: control.horizontal ? (parent.height - height) / 2 : control.second.visualPosition * parent.height
+            width: control.horizontal ? control.second.position * parent.width - control.first.position * parent.width : 2 // SliderBackgroundThemeHeight
+            height: control.vertical ? control.second.position * parent.height - control.first.position * parent.height : 2 // SliderBackgroundThemeHeight
+
+            color: control.enabled ? control.Universal.accent : control.Universal.chromeDisabledHighColor
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/RoundButton.qml b/deployment_test/QtQuick/Controls.2/Universal/RoundButton.qml
new file mode 100644
index 0000000000000000000000000000000000000000..2eedf96eaea3d3f53932b875cf9f5b17eb81b5fe
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/RoundButton.qml
@@ -0,0 +1,91 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Universal 2.12
+
+T.RoundButton {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    padding: 8
+    spacing: 8
+
+    icon.width: 20
+    icon.height: 20
+    icon.color: Color.transparent(Universal.foreground, enabled ? 1.0 : 0.2)
+
+    property bool useSystemFocusVisuals: true
+
+    contentItem: IconLabel {
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: Color.transparent(control.Universal.foreground, enabled ? 1.0 : 0.2)
+    }
+
+    background: Rectangle {
+        implicitWidth: 32
+        implicitHeight: 32
+
+        radius: control.radius
+        visible: !control.flat || control.down || control.checked || control.highlighted
+        color: control.down ? control.Universal.baseMediumLowColor :
+               control.enabled && (control.highlighted || control.checked) ? control.Universal.accent :
+                                                                             control.Universal.baseLowColor
+
+        Rectangle {
+            width: parent.width
+            height: parent.height
+            radius: control.radius
+            color: "transparent"
+            visible: control.hovered
+            border.width: 2 // ButtonBorderThemeThickness
+            border.color: control.Universal.baseMediumLowColor
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/ScrollBar.qml b/deployment_test/QtQuick/Controls.2/Universal/ScrollBar.qml
new file mode 100644
index 0000000000000000000000000000000000000000..8b8e325d955347ec0fee8971777d26dc7c87a3dc
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/ScrollBar.qml
@@ -0,0 +1,93 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Universal 2.12
+
+T.ScrollBar {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    visible: control.policy !== T.ScrollBar.AlwaysOff
+    minimumSize: orientation == Qt.Horizontal ? height / width : width / height
+
+    // TODO: arrows
+
+    contentItem: Rectangle {
+        implicitWidth: control.interactive ? 12 : 6
+        implicitHeight: control.interactive ? 12: 6
+
+        color: control.pressed ? control.Universal.baseMediumColor :
+               control.interactive && control.hovered ? control.Universal.baseMediumLowColor : control.Universal.chromeHighColor
+        opacity: 0.0
+    }
+
+    background: Rectangle {
+        implicitWidth: control.interactive ? 12 : 6
+        implicitHeight: control.interactive ? 12: 6
+
+        color: control.Universal.chromeLowColor
+        visible: control.size < 1.0
+        opacity: 0.0
+    }
+
+    states: [
+        State {
+            name: "active"
+            when: control.policy === T.ScrollBar.AlwaysOn || (control.active && control.size < 1.0)
+        }
+    ]
+
+    transitions: [
+        Transition {
+            to: "active"
+            NumberAnimation { targets: [control.contentItem, control.background]; property: "opacity"; to: 1.0 }
+        },
+        Transition {
+            from: "active"
+            SequentialAnimation {
+                PropertyAction{ targets: [control.contentItem, control.background]; property: "opacity"; value: 1.0 }
+                PauseAnimation { duration: 3000 }
+                NumberAnimation { targets: [control.contentItem, control.background]; property: "opacity"; to: 0.0 }
+            }
+        }
+    ]
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/ScrollIndicator.qml b/deployment_test/QtQuick/Controls.2/Universal/ScrollIndicator.qml
new file mode 100644
index 0000000000000000000000000000000000000000..ab66ee7c97ec60a9e73ce66b5ad7d5e9f4d38c08
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/ScrollIndicator.qml
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Universal 2.12
+
+T.ScrollIndicator {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    contentItem: Rectangle {
+        implicitWidth: 6
+        implicitHeight: 6
+
+        color: control.Universal.baseMediumLowColor
+        visible: control.size < 1.0
+        opacity: 0.0
+
+        states: [
+            State {
+                name: "active"
+                when: control.active
+            }
+        ]
+
+        transitions: [
+            Transition {
+                to: "active"
+                NumberAnimation { target: control.contentItem; property: "opacity"; to: 1.0 }
+            },
+            Transition {
+                from: "active"
+                SequentialAnimation {
+                    PauseAnimation { duration: 5000 }
+                    NumberAnimation { target: control.contentItem; property: "opacity"; to: 0.0 }
+                }
+            }
+        ]
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/Slider.qml b/deployment_test/QtQuick/Controls.2/Universal/Slider.qml
new file mode 100644
index 0000000000000000000000000000000000000000..8f427b1ed391b795195dab02e8e310898db6400f
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/Slider.qml
@@ -0,0 +1,96 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Universal 2.12
+
+T.Slider {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitHandleWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitHandleHeight + topPadding + bottomPadding)
+
+    padding: 6
+
+    property bool useSystemFocusVisuals: true
+
+    handle: Rectangle {
+        implicitWidth: control.horizontal ? 8 : 24
+        implicitHeight: control.horizontal ? 24 : 8
+
+        x: control.leftPadding + (control.horizontal ? control.visualPosition * (control.availableWidth - width) : (control.availableWidth - width) / 2)
+        y: control.topPadding + (control.horizontal ? (control.availableHeight - height) / 2 : control.visualPosition * (control.availableHeight - height))
+
+        radius: 4
+        color: control.pressed ? control.Universal.chromeHighColor :
+               control.hovered ? control.Universal.chromeAltLowColor :
+               control.enabled ? control.Universal.accent : control.Universal.chromeDisabledHighColor
+    }
+
+    background: Item {
+        implicitWidth: control.horizontal ? 200 : 18
+        implicitHeight: control.horizontal ? 18 : 200
+
+        x: control.leftPadding + (control.horizontal ? 0 : (control.availableWidth - width) / 2)
+        y: control.topPadding + (control.horizontal ? (control.availableHeight - height) / 2 : 0)
+        width: control.horizontal ? control.availableWidth : implicitWidth
+        height: control.horizontal ? implicitHeight : control.availableHeight
+
+        scale: control.horizontal && control.mirrored ? -1 : 1
+
+        Rectangle {
+            x: control.horizontal ? 0 : (parent.width - width) / 2
+            y: control.horizontal ? (parent.height - height) / 2 : 0
+            width: control.horizontal ? parent.width : 2 // SliderTrackThemeHeight
+            height: !control.horizontal ? parent.height : 2 // SliderTrackThemeHeight
+
+            color: control.hovered && !control.pressed ? control.Universal.baseMediumColor :
+                   control.enabled ? control.Universal.baseMediumLowColor : control.Universal.chromeDisabledHighColor
+        }
+
+        Rectangle {
+            x: control.horizontal ? 0 : (parent.width - width) / 2
+            y: control.horizontal ? (parent.height - height) / 2 : control.visualPosition * parent.height
+            width: control.horizontal ? control.position * parent.width : 2 // SliderTrackThemeHeight
+            height: !control.horizontal ? control.position * parent.height : 2 // SliderTrackThemeHeight
+
+            color: control.enabled ? control.Universal.accent : control.Universal.chromeDisabledHighColor
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/SpinBox.qml b/deployment_test/QtQuick/Controls.2/Universal/SpinBox.qml
new file mode 100644
index 0000000000000000000000000000000000000000..dfe927f5829ac453ddfc33773f3506fe7ac3fdc3
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/SpinBox.qml
@@ -0,0 +1,148 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Universal 2.12
+
+T.SpinBox {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentItem.implicitWidth + 16 +
+                            up.implicitIndicatorWidth +
+                            down.implicitIndicatorWidth)
+    implicitHeight: Math.max(implicitContentHeight + topPadding + bottomPadding,
+                             implicitBackgroundHeight,
+                             up.implicitIndicatorHeight,
+                             down.implicitIndicatorHeight)
+
+    // TextControlThemePadding + 2 (border)
+    padding: 12
+    topPadding: padding - 7
+    leftPadding: padding + (control.mirrored ? (up.indicator ? up.indicator.width : 0) : (down.indicator ? down.indicator.width : 0))
+    rightPadding: padding - 4 + (control.mirrored ? (down.indicator ? down.indicator.width : 0) : (up.indicator ? up.indicator.width : 0))
+    bottomPadding: padding - 5
+
+    Universal.theme: activeFocus ? Universal.Light : undefined
+
+    validator: IntValidator {
+        locale: control.locale.name
+        bottom: Math.min(control.from, control.to)
+        top: Math.max(control.from, control.to)
+    }
+
+    contentItem: TextInput {
+        text: control.displayText
+
+        font: control.font
+        color: !enabled ? control.Universal.chromeDisabledLowColor :
+                activeFocus ? control.Universal.chromeBlackHighColor : control.Universal.foreground
+        selectionColor: control.Universal.accent
+        selectedTextColor: control.Universal.chromeWhiteColor
+        horizontalAlignment: Qt.AlignHCenter
+        verticalAlignment: TextInput.AlignVCenter
+
+        readOnly: !control.editable
+        validator: control.validator
+        inputMethodHints: control.inputMethodHints
+    }
+
+    up.indicator: Item {
+        implicitWidth: 28
+        height: parent.height + 4
+        y: -2
+        x: control.mirrored ? 0 : parent.width - width
+
+        Rectangle {
+            x: 2; y: 4
+            width: parent.width - 4
+            height: parent.height - 8
+            color: control.activeFocus ? control.Universal.accent :
+                   control.up.pressed ? control.Universal.baseMediumLowColor :
+                   control.up.hovered ? control.Universal.baseLowColor : "transparent"
+            visible: control.up.pressed || control.up.hovered
+            opacity: control.activeFocus && !control.up.pressed ? 0.4 : 1.0
+        }
+
+        ColorImage {
+            x: (parent.width - width) / 2
+            y: (parent.height - height) / 2
+            color: !enabled ? control.Universal.chromeDisabledLowColor :
+                              control.activeFocus ? control.Universal.chromeBlackHighColor : control.Universal.baseHighColor
+            source: "qrc:/qt-project.org/imports/QtQuick/Controls.2/Universal/images/" + (control.mirrored ? "left" : "right") + "arrow.png"
+        }
+    }
+
+    down.indicator: Item {
+        implicitWidth: 28
+        height: parent.height + 4
+        y: -2
+        x: control.mirrored ? parent.width - width : 0
+
+        Rectangle {
+            x: 2; y: 4
+            width: parent.width - 4
+            height: parent.height - 8
+            color: control.activeFocus ? control.Universal.accent :
+                   control.down.pressed ? control.Universal.baseMediumLowColor :
+                   control.down.hovered ? control.Universal.baseLowColor : "transparent"
+            visible: control.down.pressed || control.down.hovered
+            opacity: control.activeFocus && !control.down.pressed ? 0.4 : 1.0
+        }
+
+        ColorImage {
+            x: (parent.width - width) / 2
+            y: (parent.height - height) / 2
+            color: !enabled ? control.Universal.chromeDisabledLowColor :
+                              control.activeFocus ? control.Universal.chromeBlackHighColor : control.Universal.baseHighColor
+            source: "qrc:/qt-project.org/imports/QtQuick/Controls.2/Universal/images/" + (control.mirrored ? "right" : "left") + "arrow.png"
+        }
+    }
+
+    background: Rectangle {
+        implicitWidth: 60 + 28 // TextControlThemeMinWidth - 4 (border)
+        implicitHeight: 28 // TextControlThemeMinHeight - 4 (border)
+
+        border.width: 2 // TextControlBorderThemeThickness
+        border.color: !control.enabled ? control.Universal.baseLowColor :
+                       control.activeFocus ? control.Universal.accent :
+                       control.hovered ? control.Universal.baseMediumColor : control.Universal.chromeDisabledLowColor
+        color: control.enabled ? control.Universal.background : control.Universal.baseLowColor
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/SplitView.qml b/deployment_test/QtQuick/Controls.2/Universal/SplitView.qml
new file mode 100644
index 0000000000000000000000000000000000000000..a4ed22ddc0c101be87e7aca3a44b38cd69878808
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/SplitView.qml
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.13
+import QtQuick.Templates 2.13 as T
+import QtQuick.Controls 2.13
+import QtQuick.Controls.impl 2.13
+import QtQuick.Controls.Universal 2.13
+
+T.SplitView {
+    id: control
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    handle: Rectangle {
+        implicitWidth: control.orientation === Qt.Horizontal ? 6 : control.width
+        implicitHeight: control.orientation === Qt.Horizontal ? control.height : 6
+        color: T.SplitHandle.pressed ? control.Universal.baseMediumColor
+            : (T.SplitHandle.hovered ? control.Universal.baseMediumLowColor : control.Universal.chromeHighColor)
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/StackView.qml b/deployment_test/QtQuick/Controls.2/Universal/StackView.qml
new file mode 100644
index 0000000000000000000000000000000000000000..5a3f7751eaa0791ea9eb1477ff043c1e13b4b759
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/StackView.qml
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Universal 2.12
+
+T.StackView {
+    id: control
+
+    popEnter: Transition {
+        ParallelAnimation {
+            NumberAnimation { property: "opacity"; from: 0; to: 1; duration: 200; easing.type: Easing.InQuint }
+            NumberAnimation { property: "x"; from: (control.mirrored ? -0.3 : 0.3) * -control.width; to: 0; duration: 400; easing.type: Easing.OutCubic }
+        }
+    }
+
+    popExit: Transition {
+        NumberAnimation { property: "opacity"; from: 1; to: 0; duration: 200; easing.type: Easing.OutQuint }
+    }
+
+    pushEnter: Transition {
+        ParallelAnimation {
+            NumberAnimation { property: "opacity"; from: 0; to: 1; duration: 200; easing.type: Easing.InQuint }
+            NumberAnimation { property: "x"; from: (control.mirrored ? -0.3 : 0.3) * control.width; to: 0; duration: 400; easing.type: Easing.OutCubic }
+        }
+    }
+
+    pushExit: Transition {
+        NumberAnimation { property: "opacity"; from: 1; to: 0; duration: 200; easing.type: Easing.OutQuint }
+    }
+
+    replaceEnter: Transition {
+        ParallelAnimation {
+            NumberAnimation { property: "opacity"; from: 0; to: 1; duration: 200; easing.type: Easing.InQuint }
+            NumberAnimation { property: "x"; from: (control.mirrored ? -0.3 : 0.3) * control.width; to: 0; duration: 400; easing.type: Easing.OutCubic }
+        }
+    }
+
+    replaceExit: Transition {
+        NumberAnimation { property: "opacity"; from: 1; to: 0; duration: 200; easing.type: Easing.OutQuint }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/SwipeDelegate.qml b/deployment_test/QtQuick/Controls.2/Universal/SwipeDelegate.qml
new file mode 100644
index 0000000000000000000000000000000000000000..066049a789759d2028737987bb019f75a225e44f
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/SwipeDelegate.qml
@@ -0,0 +1,93 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Universal 2.12
+
+T.SwipeDelegate {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    spacing: 12
+
+    padding: 12
+    topPadding: padding - 1
+    bottomPadding: padding + 1
+
+    icon.width: 20
+    icon.height: 20
+    icon.color: Color.transparent(Universal.foreground, enabled ? 1.0 : 0.2)
+
+    swipe.transition: Transition { SmoothedAnimation { velocity: 3; easing.type: Easing.InOutCubic } }
+
+    contentItem: IconLabel {
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+        alignment: control.display === IconLabel.IconOnly || control.display === IconLabel.TextUnderIcon ? Qt.AlignCenter : Qt.AlignLeft
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: Color.transparent(control.Universal.foreground, enabled ? 1.0 : 0.2)
+    }
+
+    background: Rectangle {
+        color: control.Universal.background
+
+        Rectangle {
+            width: parent.width
+            height: parent.height
+            color: control.down ? control.Universal.listMediumColor :
+                   control.hovered ? control.Universal.listLowColor : control.Universal.altMediumLowColor
+            Rectangle {
+                width: parent.width
+                height: parent.height
+                visible: control.visualFocus || control.highlighted
+                color: control.Universal.accent
+                opacity: control.Universal.theme === Universal.Light ? 0.4 : 0.6
+            }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/Switch.qml b/deployment_test/QtQuick/Controls.2/Universal/Switch.qml
new file mode 100644
index 0000000000000000000000000000000000000000..284b122913508ddb5187163c49ab60eacee1ff36
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/Switch.qml
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Universal 2.12
+import QtQuick.Controls.Universal.impl 2.12
+
+T.Switch {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    padding: 5
+    spacing: 8
+
+    property bool useSystemFocusVisuals: true
+
+    indicator: SwitchIndicator {
+        x: control.text ? (control.mirrored ? control.width - width - control.rightPadding : control.leftPadding) : control.leftPadding + (control.availableWidth - width) / 2
+        y: control.topPadding + (control.availableHeight - height) / 2
+        control: control
+    }
+
+    contentItem: Text {
+        leftPadding: control.indicator && !control.mirrored ? control.indicator.width + control.spacing : 0
+        rightPadding: control.indicator && control.mirrored ? control.indicator.width + control.spacing : 0
+
+        text: control.text
+        font: control.font
+        elide: Text.ElideRight
+        verticalAlignment: Text.AlignVCenter
+
+        opacity: enabled ? 1.0 : 0.2
+        color: control.Universal.foreground
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/SwitchDelegate.qml b/deployment_test/QtQuick/Controls.2/Universal/SwitchDelegate.qml
new file mode 100644
index 0000000000000000000000000000000000000000..56ba849436f383254d10f1c103eff71d517be02c
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/SwitchDelegate.qml
@@ -0,0 +1,97 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Universal 2.12
+import QtQuick.Controls.Universal.impl 2.12
+
+T.SwitchDelegate {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding,
+                             implicitIndicatorHeight + topPadding + bottomPadding)
+
+    spacing: 12
+
+    padding: 12
+    topPadding: padding - 1
+    bottomPadding: padding + 1
+
+    icon.width: 20
+    icon.height: 20
+    icon.color: Color.transparent(Universal.foreground, enabled ? 1.0 : 0.2)
+
+    indicator: SwitchIndicator {
+        x: control.text ? (control.mirrored ? control.leftPadding : control.width - width - control.rightPadding) : control.leftPadding + (control.availableWidth - width) / 2
+        y: control.topPadding + (control.availableHeight - height) / 2
+        control: control
+    }
+
+    contentItem: IconLabel {
+        leftPadding: !control.mirrored ? 0 : control.indicator.width + control.spacing
+        rightPadding: control.mirrored ? 0 : control.indicator.width + control.spacing
+
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+        alignment: control.display === IconLabel.IconOnly || control.display === IconLabel.TextUnderIcon ? Qt.AlignCenter : Qt.AlignLeft
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: Color.transparent(control.Universal.foreground, enabled ? 1.0 : 0.2)
+    }
+
+    background: Rectangle {
+        visible: control.down || control.highlighted || control.visualFocus || control.hovered
+        color: control.down ? control.Universal.listMediumColor :
+               control.hovered ? control.Universal.listLowColor : control.Universal.altMediumLowColor
+        Rectangle {
+            width: parent.width
+            height: parent.height
+            visible: control.visualFocus || control.highlighted
+            color: control.Universal.accent
+            opacity: control.Universal.theme === Universal.Light ? 0.4 : 0.6
+        }
+
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/SwitchIndicator.qml b/deployment_test/QtQuick/Controls.2/Universal/SwitchIndicator.qml
new file mode 100644
index 0000000000000000000000000000000000000000..10f39515bdde4a791baad4ed1c89620a257a77a3
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/SwitchIndicator.qml
@@ -0,0 +1,81 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Universal 2.12
+
+Item {
+    id: indicator
+    implicitWidth: 44
+    implicitHeight: 20
+
+    Rectangle {
+        width: parent.width
+        height: parent.height
+
+        radius: 10
+        color: !indicator.control.enabled ? "transparent" :
+                indicator.control.pressed ? indicator.control.Universal.baseMediumColor :
+                indicator.control.checked ? indicator.control.Universal.accent : "transparent"
+        border.color: !indicator.control.enabled ? indicator.control.Universal.baseLowColor :
+                       indicator.control.checked && !indicator.control.pressed ? indicator.control.Universal.accent :
+                       indicator.control.hovered && !indicator.control.checked && !indicator.control.pressed ? indicator.control.Universal.baseHighColor : indicator.control.Universal.baseMediumColor
+        opacity: indicator.control.hovered && indicator.control.checked && !indicator.control.pressed ? (indicator.control.Universal.theme === Universal.Light ? 0.7 : 0.9) : 1.0
+        border.width: 2
+    }
+
+    property Item control
+
+    Rectangle {
+        width: 10
+        height: 10
+        radius: 5
+
+        color: !indicator.control.enabled ? indicator.control.Universal.baseLowColor :
+                indicator.control.pressed || indicator.control.checked ? indicator.control.Universal.chromeWhiteColor :
+                indicator.control.hovered && !indicator.control.checked ? indicator.control.Universal.baseHighColor : indicator.control.Universal.baseMediumHighColor
+
+        x: Math.max(5, Math.min(parent.width - width - 5,
+                                indicator.control.visualPosition * parent.width - (width / 2)))
+        y: (parent.height - height) / 2
+
+        Behavior on x {
+            enabled: !indicator.control.pressed
+            SmoothedAnimation { velocity: 200 }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/TabBar.qml b/deployment_test/QtQuick/Controls.2/Universal/TabBar.qml
new file mode 100644
index 0000000000000000000000000000000000000000..c7d27cbd21329dcf687e5849bf8323628042b82f
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/TabBar.qml
@@ -0,0 +1,70 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Universal 2.12
+
+T.TabBar {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    contentItem: ListView {
+        model: control.contentModel
+        currentIndex: control.currentIndex
+
+        spacing: control.spacing
+        orientation: ListView.Horizontal
+        boundsBehavior: Flickable.StopAtBounds
+        flickableDirection: Flickable.AutoFlickIfNeeded
+        snapMode: ListView.SnapToItem
+
+        highlightMoveDuration: 100
+        highlightRangeMode: ListView.ApplyRange
+        preferredHighlightBegin: 48
+        preferredHighlightEnd: width - 48
+    }
+
+    background: Rectangle {
+        implicitWidth: 200
+        implicitHeight: 48
+        color: control.Universal.background
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/TabButton.qml b/deployment_test/QtQuick/Controls.2/Universal/TabButton.qml
new file mode 100644
index 0000000000000000000000000000000000000000..66e3d7255687c9b48045ed1ec5d693dad8be8b03
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/TabButton.qml
@@ -0,0 +1,70 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Universal 2.12
+
+T.TabButton {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    padding: 12 // PivotItemMargin
+    spacing: 8
+
+    icon.width: 20
+    icon.height: 20
+    icon.color: Color.transparent(control.hovered ? control.Universal.baseMediumHighColor : control.Universal.foreground,
+                                                    control.checked || control.down || control.hovered ? 1.0 : 0.2)
+
+    contentItem: IconLabel {
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: Color.transparent(control.hovered ? control.Universal.baseMediumHighColor : control.Universal.foreground,
+                                 control.checked || control.down || control.hovered ? 1.0 : 0.2)
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/TextArea.qml b/deployment_test/QtQuick/Controls.2/Universal/TextArea.qml
new file mode 100644
index 0000000000000000000000000000000000000000..03ad4a89ea9744f1184db357858195b381ddb84c
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/TextArea.qml
@@ -0,0 +1,94 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Universal 2.12
+
+T.TextArea {
+    id: control
+
+    implicitWidth: Math.max(contentWidth + leftPadding + rightPadding,
+                            implicitBackgroundWidth + leftInset + rightInset,
+                            placeholder.implicitWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(contentHeight + topPadding + bottomPadding,
+                             implicitBackgroundHeight + topInset + bottomInset,
+                             placeholder.implicitHeight + topPadding + bottomPadding)
+
+    // TextControlThemePadding + 2 (border)
+    padding: 12
+    topPadding: padding - 7
+    rightPadding: padding - 4
+    bottomPadding: padding - 5
+
+    Universal.theme: activeFocus ? Universal.Light : undefined
+
+    color: !enabled ? Universal.chromeDisabledLowColor : Universal.foreground
+    selectionColor: Universal.accent
+    selectedTextColor: Universal.chromeWhiteColor
+    placeholderTextColor: !enabled ? Universal.chromeDisabledLowColor :
+                                     activeFocus ? Universal.chromeBlackMediumLowColor :
+                                                   Universal.baseMediumColor
+
+    PlaceholderText {
+        id: placeholder
+        x: control.leftPadding
+        y: control.topPadding
+        width: control.width - (control.leftPadding + control.rightPadding)
+        height: control.height - (control.topPadding + control.bottomPadding)
+
+        text: control.placeholderText
+        font: control.font
+        color: control.placeholderTextColor
+        visible: !control.length && !control.preeditText && (!control.activeFocus || control.horizontalAlignment !== Qt.AlignHCenter)
+        verticalAlignment: control.verticalAlignment
+        elide: Text.ElideRight
+        renderType: control.renderType
+    }
+
+    background: Rectangle {
+        implicitWidth: 60 // TextControlThemeMinWidth - 4 (border)
+        implicitHeight: 28 // TextControlThemeMinHeight - 4 (border)
+
+        border.width: 2 // TextControlBorderThemeThickness
+        border.color: !control.enabled ? control.Universal.baseLowColor :
+                       control.activeFocus ? control.Universal.accent :
+                       control.hovered ? control.Universal.baseMediumColor : control.Universal.chromeDisabledLowColor
+        color: control.enabled ? control.Universal.background : control.Universal.baseLowColor
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/TextField.qml b/deployment_test/QtQuick/Controls.2/Universal/TextField.qml
new file mode 100644
index 0000000000000000000000000000000000000000..ba5bf685f8d68496509e7ee5f309ff90cae0a76f
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/TextField.qml
@@ -0,0 +1,94 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Universal 2.12
+
+T.TextField {
+    id: control
+
+    implicitWidth: implicitBackgroundWidth + leftInset + rightInset
+                   || Math.max(contentWidth, placeholder.implicitWidth) + leftPadding + rightPadding
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding,
+                             placeholder.implicitHeight + topPadding + bottomPadding)
+
+    // TextControlThemePadding + 2 (border)
+    padding: 12
+    topPadding: padding - 7
+    rightPadding: padding - 4
+    bottomPadding: padding - 5
+
+    Universal.theme: activeFocus ? Universal.Light : undefined
+
+    color: !enabled ? Universal.chromeDisabledLowColor : Universal.foreground
+    selectionColor: Universal.accent
+    selectedTextColor: Universal.chromeWhiteColor
+    placeholderTextColor: !enabled ? Universal.chromeDisabledLowColor :
+                                     activeFocus ? Universal.chromeBlackMediumLowColor :
+                                                   Universal.baseMediumColor
+    verticalAlignment: TextInput.AlignVCenter
+
+    PlaceholderText {
+        id: placeholder
+        x: control.leftPadding
+        y: control.topPadding
+        width: control.width - (control.leftPadding + control.rightPadding)
+        height: control.height - (control.topPadding + control.bottomPadding)
+
+        text: control.placeholderText
+        font: control.font
+        color: control.placeholderTextColor
+        visible: !control.length && !control.preeditText && (!control.activeFocus || control.horizontalAlignment !== Qt.AlignHCenter)
+        verticalAlignment: control.verticalAlignment
+        elide: Text.ElideRight
+        renderType: control.renderType
+    }
+
+    background: Rectangle {
+        implicitWidth: 60 // TextControlThemeMinWidth - 4 (border)
+        implicitHeight: 28 // TextControlThemeMinHeight - 4 (border)
+
+        border.width: 2 // TextControlBorderThemeThickness
+        border.color: !control.enabled ? control.Universal.baseLowColor :
+                       control.activeFocus ? control.Universal.accent :
+                       control.hovered ? control.Universal.baseMediumColor : control.Universal.chromeDisabledLowColor
+        color: control.enabled ? control.Universal.background : control.Universal.baseLowColor
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/ToolBar.qml b/deployment_test/QtQuick/Controls.2/Universal/ToolBar.qml
new file mode 100644
index 0000000000000000000000000000000000000000..5a385e8e4482cdd463ef58c5ac33062f7cf77fed
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/ToolBar.qml
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Universal 2.12
+
+T.ToolBar {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    background: Rectangle {
+        implicitHeight: 48 // AppBarThemeCompactHeight
+        color: control.Universal.chromeMediumColor
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/ToolButton.qml b/deployment_test/QtQuick/Controls.2/Universal/ToolButton.qml
new file mode 100644
index 0000000000000000000000000000000000000000..f36dac2286a8cc22775ebd065d99f43aaec16996
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/ToolButton.qml
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+import QtQuick.Controls.Universal 2.12
+
+T.ToolButton {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    padding: 6
+    spacing: 8
+
+    icon.width: 20
+    icon.height: 20
+    icon.color: Color.transparent(Universal.foreground, enabled ? 1.0 : 0.2)
+
+    property bool useSystemFocusVisuals: true
+
+    contentItem: IconLabel {
+        spacing: control.spacing
+        mirrored: control.mirrored
+        display: control.display
+
+        icon: control.icon
+        text: control.text
+        font: control.font
+        color: Color.transparent(control.Universal.foreground, enabled ? 1.0 : 0.2)
+    }
+
+    background: Rectangle {
+        implicitWidth: 68
+        implicitHeight: 48 // AppBarThemeCompactHeight
+
+        color: control.enabled && (control.highlighted || control.checked) ? control.Universal.accent : "transparent"
+
+        Rectangle {
+            width: parent.width
+            height: parent.height
+            visible: control.down || control.hovered
+            color: control.down ? control.Universal.listMediumColor : control.Universal.listLowColor
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/ToolSeparator.qml b/deployment_test/QtQuick/Controls.2/Universal/ToolSeparator.qml
new file mode 100644
index 0000000000000000000000000000000000000000..ee8e6e1cbd052d9bcad14940957037a4deb56914
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/ToolSeparator.qml
@@ -0,0 +1,59 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Universal 2.12
+
+T.ToolSeparator {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding)
+
+    leftPadding: vertical ? 16 : 12
+    rightPadding: vertical ? 15 : 12
+    topPadding: vertical ? 12 : 16
+    bottomPadding: vertical ? 12 : 15
+
+    contentItem: Rectangle {
+        implicitWidth: vertical ? 1 : 20
+        implicitHeight: vertical ? 20 : 1
+        color: control.Universal.baseMediumLowColor
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/ToolTip.qml b/deployment_test/QtQuick/Controls.2/Universal/ToolTip.qml
new file mode 100644
index 0000000000000000000000000000000000000000..431cdf7c18770fd44e5535f360be739d4bce70e4
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/ToolTip.qml
@@ -0,0 +1,72 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Universal 2.12
+
+T.ToolTip {
+    id: control
+
+    x: parent ? (parent.width - implicitWidth) / 2 : 0
+    y: -implicitHeight - 16
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            contentWidth + leftPadding + rightPadding)
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             contentHeight + topPadding + bottomPadding)
+
+    margins: 8
+    padding: 8
+    topPadding: padding - 3
+    bottomPadding: padding - 1
+
+    closePolicy: T.Popup.CloseOnEscape | T.Popup.CloseOnPressOutsideParent | T.Popup.CloseOnReleaseOutsideParent
+
+    contentItem: Text {
+        text: control.text
+        font: control.font
+        wrapMode: Text.Wrap
+        opacity: enabled ? 1.0 : 0.2
+        color: control.Universal.foreground
+    }
+
+    background: Rectangle {
+        color: control.Universal.chromeMediumLowColor
+        border.color: control.Universal.chromeHighColor
+        border.width: 1 // ToolTipBorderThemeThickness
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/Tumbler.qml b/deployment_test/QtQuick/Controls.2/Universal/Tumbler.qml
new file mode 100644
index 0000000000000000000000000000000000000000..d0e7b12fdbd8f33a2ba53dd12540cf57d495aec4
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/Tumbler.qml
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Templates 2.12 as T
+import QtQuick.Controls.Universal 2.12
+import QtQuick.Controls 2.12
+import QtQuick.Controls.impl 2.12
+
+T.Tumbler {
+    id: control
+
+    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
+                            implicitContentWidth + leftPadding + rightPadding) || 60 // ### remove 60 in Qt 6
+    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
+                             implicitContentHeight + topPadding + bottomPadding) || 200 // ### remove 200 in Qt 6
+
+    delegate: Text {
+        text: modelData
+        font: control.font
+        color: control.Universal.foreground
+        opacity: (1.0 - Math.abs(Tumbler.displacement) / (control.visibleItemCount / 2)) * (control.enabled ? 1 : 0.6)
+        horizontalAlignment: Text.AlignHCenter
+        verticalAlignment: Text.AlignVCenter
+    }
+
+    contentItem: TumblerView {
+        implicitWidth: 60
+        implicitHeight: 200
+        model: control.model
+        delegate: control.delegate
+        path: Path {
+            startX: control.contentItem.width / 2
+            startY: -control.contentItem.delegateHeight / 2
+            PathLine {
+                x: control.contentItem.width / 2
+                y: (control.visibleItemCount + 1) * control.contentItem.delegateHeight - control.contentItem.delegateHeight / 2
+            }
+        }
+
+        property real delegateHeight: control.availableHeight / control.visibleItemCount
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/VerticalHeaderView.qml b/deployment_test/QtQuick/Controls.2/Universal/VerticalHeaderView.qml
new file mode 100644
index 0000000000000000000000000000000000000000..04408d68a338b9660bc1b5831fd8ab5949620308
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/VerticalHeaderView.qml
@@ -0,0 +1,70 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.15
+import QtQuick.Controls 2.15
+import QtQuick.Controls.impl 2.15
+import QtQuick.Templates 2.15 as T
+import QtQuick.Controls.Universal 2.15
+import QtQuick.Controls.Universal.impl 2.15
+
+T.VerticalHeaderView {
+    id: control
+
+    implicitWidth: contentWidth
+    implicitHeight: syncView ? syncView.height : 0
+
+    delegate: Rectangle {
+        // Qt6: add cellPadding (and font etc) as public API in headerview
+        readonly property real cellPadding: 8
+
+        implicitWidth: Math.max(control.width, text.implicitWidth + (cellPadding * 2))
+        implicitHeight: text.implicitHeight + (cellPadding * 2)
+        color: control.Universal.background
+
+        Text {
+            id: text
+            text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole]
+                                        : model[control.textRole])
+                                   : modelData
+            width: parent.width
+            height: parent.height
+            horizontalAlignment: Text.AlignHCenter
+            verticalAlignment: Text.AlignVCenter
+            color: Color.transparent(control.Universal.foreground, enabled ? 1.0 : 0.2)
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/plugins.qmltypes b/deployment_test/QtQuick/Controls.2/Universal/plugins.qmltypes
new file mode 100644
index 0000000000000000000000000000000000000000..c38e39e1aa268688ea3e67ccfab62acd529d58fe
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/plugins.qmltypes
@@ -0,0 +1,340 @@
+import QtQuick.tooling 1.2
+
+// This file describes the plugin-supplied types contained in the library.
+// It is used for QML tooling purposes only.
+//
+// This file was auto-generated by:
+// 'qmlplugindump -nonrelocatable -dependencies dependencies.json QtQuick.Controls.Universal 2.15'
+
+Module {
+    dependencies: ["QtQuick.Controls 2.0"]
+    Component { name: "QQuickAttachedObject"; prototype: "QObject" }
+    Component {
+        name: "QQuickItem"
+        defaultProperty: "data"
+        prototype: "QObject"
+        Enum {
+            name: "Flags"
+            values: {
+                "ItemClipsChildrenToShape": 1,
+                "ItemAcceptsInputMethod": 2,
+                "ItemIsFocusScope": 4,
+                "ItemHasContents": 8,
+                "ItemAcceptsDrops": 16
+            }
+        }
+        Enum {
+            name: "TransformOrigin"
+            values: {
+                "TopLeft": 0,
+                "Top": 1,
+                "TopRight": 2,
+                "Left": 3,
+                "Center": 4,
+                "Right": 5,
+                "BottomLeft": 6,
+                "Bottom": 7,
+                "BottomRight": 8
+            }
+        }
+        Property { name: "parent"; type: "QQuickItem"; isPointer: true }
+        Property { name: "data"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "resources"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "children"; type: "QQuickItem"; isList: true; isReadonly: true }
+        Property { name: "x"; type: "double" }
+        Property { name: "y"; type: "double" }
+        Property { name: "z"; type: "double" }
+        Property { name: "width"; type: "double" }
+        Property { name: "height"; type: "double" }
+        Property { name: "opacity"; type: "double" }
+        Property { name: "enabled"; type: "bool" }
+        Property { name: "visible"; type: "bool" }
+        Property { name: "visibleChildren"; type: "QQuickItem"; isList: true; isReadonly: true }
+        Property { name: "states"; type: "QQuickState"; isList: true; isReadonly: true }
+        Property { name: "transitions"; type: "QQuickTransition"; isList: true; isReadonly: true }
+        Property { name: "state"; type: "string" }
+        Property { name: "childrenRect"; type: "QRectF"; isReadonly: true }
+        Property { name: "anchors"; type: "QQuickAnchors"; isReadonly: true; isPointer: true }
+        Property { name: "left"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "right"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "horizontalCenter"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "top"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "bottom"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "verticalCenter"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "baseline"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "baselineOffset"; type: "double" }
+        Property { name: "clip"; type: "bool" }
+        Property { name: "focus"; type: "bool" }
+        Property { name: "activeFocus"; type: "bool"; isReadonly: true }
+        Property { name: "activeFocusOnTab"; revision: 1; type: "bool" }
+        Property { name: "rotation"; type: "double" }
+        Property { name: "scale"; type: "double" }
+        Property { name: "transformOrigin"; type: "TransformOrigin" }
+        Property { name: "transformOriginPoint"; type: "QPointF"; isReadonly: true }
+        Property { name: "transform"; type: "QQuickTransform"; isList: true; isReadonly: true }
+        Property { name: "smooth"; type: "bool" }
+        Property { name: "antialiasing"; type: "bool" }
+        Property { name: "implicitWidth"; type: "double" }
+        Property { name: "implicitHeight"; type: "double" }
+        Property { name: "containmentMask"; revision: 11; type: "QObject"; isPointer: true }
+        Property { name: "layer"; type: "QQuickItemLayer"; isReadonly: true; isPointer: true }
+        Signal {
+            name: "childrenRectChanged"
+            Parameter { type: "QRectF" }
+        }
+        Signal {
+            name: "baselineOffsetChanged"
+            Parameter { type: "double" }
+        }
+        Signal {
+            name: "stateChanged"
+            Parameter { type: "string" }
+        }
+        Signal {
+            name: "focusChanged"
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "activeFocusChanged"
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "activeFocusOnTabChanged"
+            revision: 1
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "parentChanged"
+            Parameter { type: "QQuickItem"; isPointer: true }
+        }
+        Signal {
+            name: "transformOriginChanged"
+            Parameter { type: "TransformOrigin" }
+        }
+        Signal {
+            name: "smoothChanged"
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "antialiasingChanged"
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "clipChanged"
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "windowChanged"
+            revision: 1
+            Parameter { name: "window"; type: "QQuickWindow"; isPointer: true }
+        }
+        Signal { name: "containmentMaskChanged"; revision: 11 }
+        Method { name: "update" }
+        Method {
+            name: "grabToImage"
+            revision: 4
+            type: "bool"
+            Parameter { name: "callback"; type: "QJSValue" }
+            Parameter { name: "targetSize"; type: "QSize" }
+        }
+        Method {
+            name: "grabToImage"
+            revision: 4
+            type: "bool"
+            Parameter { name: "callback"; type: "QJSValue" }
+        }
+        Method {
+            name: "contains"
+            type: "bool"
+            Parameter { name: "point"; type: "QPointF" }
+        }
+        Method {
+            name: "mapFromItem"
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "mapToItem"
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "mapFromGlobal"
+            revision: 7
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "mapToGlobal"
+            revision: 7
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+        Method { name: "forceActiveFocus" }
+        Method {
+            name: "forceActiveFocus"
+            Parameter { name: "reason"; type: "Qt::FocusReason" }
+        }
+        Method {
+            name: "nextItemInFocusChain"
+            revision: 1
+            type: "QQuickItem*"
+            Parameter { name: "forward"; type: "bool" }
+        }
+        Method { name: "nextItemInFocusChain"; revision: 1; type: "QQuickItem*" }
+        Method {
+            name: "childAt"
+            type: "QQuickItem*"
+            Parameter { name: "x"; type: "double" }
+            Parameter { name: "y"; type: "double" }
+        }
+    }
+    Component {
+        name: "QQuickPaintedItem"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        Enum {
+            name: "RenderTarget"
+            values: {
+                "Image": 0,
+                "FramebufferObject": 1,
+                "InvertedYFramebufferObject": 2
+            }
+        }
+        Enum {
+            name: "PerformanceHints"
+            values: {
+                "FastFBOResizing": 1
+            }
+        }
+        Property { name: "contentsSize"; type: "QSize" }
+        Property { name: "fillColor"; type: "QColor" }
+        Property { name: "contentsScale"; type: "double" }
+        Property { name: "renderTarget"; type: "RenderTarget" }
+        Property { name: "textureSize"; type: "QSize" }
+    }
+    Component {
+        name: "QQuickUniversalBusyIndicator"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        exports: ["QtQuick.Controls.Universal.impl/BusyIndicatorImpl 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "count"; type: "int" }
+        Property { name: "color"; type: "QColor" }
+    }
+    Component {
+        name: "QQuickUniversalFocusRectangle"
+        defaultProperty: "data"
+        prototype: "QQuickPaintedItem"
+        exports: ["QtQuick.Controls.Universal.impl/FocusRectangle 2.0"]
+        exportMetaObjectRevisions: [0]
+    }
+    Component {
+        name: "QQuickUniversalProgressBar"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        exports: ["QtQuick.Controls.Universal.impl/ProgressBarImpl 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "color"; type: "QColor" }
+        Property { name: "progress"; type: "double" }
+        Property { name: "indeterminate"; type: "bool" }
+    }
+    Component {
+        name: "QQuickUniversalStyle"
+        prototype: "QQuickAttachedObject"
+        exports: ["QtQuick.Controls.Universal/Universal 2.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        Enum {
+            name: "Theme"
+            values: {
+                "Light": 0,
+                "Dark": 1,
+                "System": 2
+            }
+        }
+        Enum {
+            name: "Color"
+            values: {
+                "Lime": 0,
+                "Green": 1,
+                "Emerald": 2,
+                "Teal": 3,
+                "Cyan": 4,
+                "Cobalt": 5,
+                "Indigo": 6,
+                "Violet": 7,
+                "Pink": 8,
+                "Magenta": 9,
+                "Crimson": 10,
+                "Red": 11,
+                "Orange": 12,
+                "Amber": 13,
+                "Yellow": 14,
+                "Brown": 15,
+                "Olive": 16,
+                "Steel": 17,
+                "Mauve": 18,
+                "Taupe": 19
+            }
+        }
+        Property { name: "theme"; type: "Theme" }
+        Property { name: "accent"; type: "QVariant" }
+        Property { name: "foreground"; type: "QVariant" }
+        Property { name: "background"; type: "QVariant" }
+        Property { name: "altHighColor"; type: "QColor"; isReadonly: true }
+        Property { name: "altLowColor"; type: "QColor"; isReadonly: true }
+        Property { name: "altMediumColor"; type: "QColor"; isReadonly: true }
+        Property { name: "altMediumHighColor"; type: "QColor"; isReadonly: true }
+        Property { name: "altMediumLowColor"; type: "QColor"; isReadonly: true }
+        Property { name: "baseHighColor"; type: "QColor"; isReadonly: true }
+        Property { name: "baseLowColor"; type: "QColor"; isReadonly: true }
+        Property { name: "baseMediumColor"; type: "QColor"; isReadonly: true }
+        Property { name: "baseMediumHighColor"; type: "QColor"; isReadonly: true }
+        Property { name: "baseMediumLowColor"; type: "QColor"; isReadonly: true }
+        Property { name: "chromeAltLowColor"; type: "QColor"; isReadonly: true }
+        Property { name: "chromeBlackHighColor"; type: "QColor"; isReadonly: true }
+        Property { name: "chromeBlackLowColor"; type: "QColor"; isReadonly: true }
+        Property { name: "chromeBlackMediumLowColor"; type: "QColor"; isReadonly: true }
+        Property { name: "chromeBlackMediumColor"; type: "QColor"; isReadonly: true }
+        Property { name: "chromeDisabledHighColor"; type: "QColor"; isReadonly: true }
+        Property { name: "chromeDisabledLowColor"; type: "QColor"; isReadonly: true }
+        Property { name: "chromeHighColor"; type: "QColor"; isReadonly: true }
+        Property { name: "chromeLowColor"; type: "QColor"; isReadonly: true }
+        Property { name: "chromeMediumColor"; type: "QColor"; isReadonly: true }
+        Property { name: "chromeMediumLowColor"; type: "QColor"; isReadonly: true }
+        Property { name: "chromeWhiteColor"; type: "QColor"; isReadonly: true }
+        Property { name: "listLowColor"; type: "QColor"; isReadonly: true }
+        Property { name: "listMediumColor"; type: "QColor"; isReadonly: true }
+        Signal { name: "paletteChanged" }
+        Method {
+            name: "color"
+            type: "QColor"
+            Parameter { name: "color"; type: "Color" }
+        }
+    }
+    Component {
+        prototype: "QQuickRectangle"
+        name: "QtQuick.Controls.Universal.impl/CheckIndicator 2.0"
+        exports: ["QtQuick.Controls.Universal.impl/CheckIndicator 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "control"; type: "QQuickItem"; isPointer: true }
+        Property { name: "partiallyChecked"; type: "bool"; isReadonly: true }
+    }
+    Component {
+        prototype: "QQuickRectangle"
+        name: "QtQuick.Controls.Universal.impl/RadioIndicator 2.0"
+        exports: ["QtQuick.Controls.Universal.impl/RadioIndicator 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "control"; type: "QVariant" }
+    }
+    Component {
+        prototype: "QQuickItem"
+        name: "QtQuick.Controls.Universal.impl/SwitchIndicator 2.0"
+        exports: ["QtQuick.Controls.Universal.impl/SwitchIndicator 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "control"; type: "QQuickItem"; isPointer: true }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/Universal/qmldir b/deployment_test/QtQuick/Controls.2/Universal/qmldir
new file mode 100644
index 0000000000000000000000000000000000000000..6870a4e10e1f1044229b53637b0d3ca65b11f085
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/Universal/qmldir
@@ -0,0 +1,4 @@
+module QtQuick.Controls.Universal
+plugin qtquickcontrols2universalstyleplugin
+classname QtQuickControls2UniversalStylePlugin
+depends QtQuick.Controls 2.5
diff --git a/deployment_test/QtQuick/Controls.2/Universal/qtquickcontrols2universalstyleplugin.dll b/deployment_test/QtQuick/Controls.2/Universal/qtquickcontrols2universalstyleplugin.dll
new file mode 100644
index 0000000000000000000000000000000000000000..28f0ad2ee40bbdcf984f827b86e916d51e006c9b
Binary files /dev/null and b/deployment_test/QtQuick/Controls.2/Universal/qtquickcontrols2universalstyleplugin.dll differ
diff --git a/deployment_test/QtQuick/Controls.2/VerticalHeaderView.qml b/deployment_test/QtQuick/Controls.2/VerticalHeaderView.qml
new file mode 100644
index 0000000000000000000000000000000000000000..3fc9ca5acea3b9059627fe2a71f9924db097876b
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/VerticalHeaderView.qml
@@ -0,0 +1,68 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.15
+import QtQuick.Controls 2.15
+import QtQuick.Templates 2.15 as T
+
+T.VerticalHeaderView {
+    id: control
+
+    implicitWidth: contentWidth
+    implicitHeight: syncView ? syncView.height : 0
+
+    delegate: Rectangle {
+        // Qt6: add cellPadding (and font etc) as public API in headerview
+        readonly property real cellPadding: 8
+
+        implicitWidth: Math.max(control.width, text.implicitWidth + (cellPadding * 2))
+        implicitHeight: text.implicitHeight + (cellPadding * 2)
+        color: "#f6f6f6"
+        border.color: "#e4e4e4"
+
+        Text {
+            id: text
+            text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole]
+                                        : model[control.textRole])
+                                   : modelData
+            width: parent.width
+            height: parent.height
+            horizontalAlignment: Text.AlignHCenter
+            verticalAlignment: Text.AlignVCenter
+            color: "#ff26282a"
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/plugins.qmltypes b/deployment_test/QtQuick/Controls.2/plugins.qmltypes
new file mode 100644
index 0000000000000000000000000000000000000000..e8212c55f66ec5a035f0d8af58f42ad75a093530
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/plugins.qmltypes
@@ -0,0 +1,895 @@
+import QtQuick.tooling 1.2
+
+// This file describes the plugin-supplied types contained in the library.
+// It is used for QML tooling purposes only.
+//
+// This file was auto-generated by:
+// 'qmlplugindump -nonrelocatable -dependencies dependencies.json QtQuick.Controls 2.15'
+
+Module {
+    dependencies: [
+        "QtQuick 2.11",
+        "QtQuick.Templates 2.5",
+        "QtQuick.Window 2.2"
+    ]
+    Component {
+        name: "QQuickCheckLabel"
+        defaultProperty: "data"
+        prototype: "QQuickText"
+        exports: ["QtQuick.Controls.impl/CheckLabel 2.3"]
+        exportMetaObjectRevisions: [0]
+    }
+    Component {
+        name: "QQuickClippedText"
+        defaultProperty: "data"
+        prototype: "QQuickText"
+        exports: ["QtQuick.Controls.impl/ClippedText 2.2"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "clipX"; type: "double" }
+        Property { name: "clipY"; type: "double" }
+        Property { name: "clipWidth"; type: "double" }
+        Property { name: "clipHeight"; type: "double" }
+    }
+    Component {
+        name: "QQuickColor"
+        prototype: "QObject"
+        exports: ["QtQuick.Controls.impl/Color 2.3"]
+        isCreatable: false
+        isSingleton: true
+        exportMetaObjectRevisions: [0]
+        Method {
+            name: "transparent"
+            type: "QColor"
+            Parameter { name: "color"; type: "QColor" }
+            Parameter { name: "opacity"; type: "double" }
+        }
+        Method {
+            name: "blend"
+            type: "QColor"
+            Parameter { name: "a"; type: "QColor" }
+            Parameter { name: "b"; type: "QColor" }
+            Parameter { name: "factor"; type: "double" }
+        }
+    }
+    Component {
+        name: "QQuickColorImage"
+        defaultProperty: "data"
+        prototype: "QQuickImage"
+        exports: ["QtQuick.Controls.impl/ColorImage 2.3"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "color"; type: "QColor" }
+        Property { name: "defaultColor"; type: "QColor" }
+    }
+    Component {
+        name: "QQuickDefaultBusyIndicator"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        exports: ["QtQuick.Controls.impl/BusyIndicatorImpl 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "pen"; type: "QColor" }
+        Property { name: "fill"; type: "QColor" }
+        Property { name: "running"; type: "bool" }
+    }
+    Component {
+        name: "QQuickDefaultDial"
+        defaultProperty: "data"
+        prototype: "QQuickPaintedItem"
+        exports: ["QtQuick.Controls.impl/DialImpl 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "progress"; type: "double" }
+        Property { name: "color"; type: "QColor" }
+    }
+    Component {
+        name: "QQuickDefaultProgressBar"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        exports: ["QtQuick.Controls.impl/ProgressBarImpl 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "indeterminate"; type: "bool" }
+        Property { name: "progress"; type: "double" }
+        Property { name: "color"; type: "QColor" }
+    }
+    Component {
+        name: "QQuickDefaultStyle"
+        prototype: "QObject"
+        exports: ["QtQuick.Controls.impl/Default 2.1"]
+        isCreatable: false
+        isSingleton: true
+        exportMetaObjectRevisions: [0]
+        Property { name: "backgroundColor"; type: "QColor"; isReadonly: true }
+        Property { name: "overlayModalColor"; type: "QColor"; isReadonly: true }
+        Property { name: "overlayDimColor"; type: "QColor"; isReadonly: true }
+        Property { name: "textColor"; type: "QColor"; isReadonly: true }
+        Property { name: "textDarkColor"; type: "QColor"; isReadonly: true }
+        Property { name: "textLightColor"; type: "QColor"; isReadonly: true }
+        Property { name: "textLinkColor"; type: "QColor"; isReadonly: true }
+        Property { name: "textSelectionColor"; type: "QColor"; isReadonly: true }
+        Property { name: "textDisabledColor"; type: "QColor"; isReadonly: true }
+        Property { name: "textDisabledLightColor"; type: "QColor"; isReadonly: true }
+        Property { name: "textPlaceholderColor"; type: "QColor"; isReadonly: true }
+        Property { name: "focusColor"; type: "QColor"; isReadonly: true }
+        Property { name: "focusLightColor"; type: "QColor"; isReadonly: true }
+        Property { name: "focusPressedColor"; type: "QColor"; isReadonly: true }
+        Property { name: "buttonColor"; type: "QColor"; isReadonly: true }
+        Property { name: "buttonPressedColor"; type: "QColor"; isReadonly: true }
+        Property { name: "buttonCheckedColor"; type: "QColor"; isReadonly: true }
+        Property { name: "buttonCheckedPressedColor"; type: "QColor"; isReadonly: true }
+        Property { name: "buttonCheckedFocusColor"; type: "QColor"; isReadonly: true }
+        Property { name: "toolButtonColor"; type: "QColor"; isReadonly: true }
+        Property { name: "tabButtonColor"; type: "QColor"; isReadonly: true }
+        Property { name: "tabButtonPressedColor"; type: "QColor"; isReadonly: true }
+        Property { name: "tabButtonCheckedPressedColor"; type: "QColor"; isReadonly: true }
+        Property { name: "delegateColor"; type: "QColor"; isReadonly: true }
+        Property { name: "delegatePressedColor"; type: "QColor"; isReadonly: true }
+        Property { name: "delegateFocusColor"; type: "QColor"; isReadonly: true }
+        Property { name: "indicatorPressedColor"; type: "QColor"; isReadonly: true }
+        Property { name: "indicatorDisabledColor"; type: "QColor"; isReadonly: true }
+        Property { name: "indicatorFrameColor"; type: "QColor"; isReadonly: true }
+        Property { name: "indicatorFramePressedColor"; type: "QColor"; isReadonly: true }
+        Property { name: "indicatorFrameDisabledColor"; type: "QColor"; isReadonly: true }
+        Property { name: "frameDarkColor"; type: "QColor"; isReadonly: true }
+        Property { name: "frameLightColor"; type: "QColor"; isReadonly: true }
+        Property { name: "scrollBarColor"; type: "QColor"; isReadonly: true }
+        Property { name: "scrollBarPressedColor"; type: "QColor"; isReadonly: true }
+        Property { name: "progressBarColor"; type: "QColor"; isReadonly: true }
+        Property { name: "pageIndicatorColor"; type: "QColor"; isReadonly: true }
+        Property { name: "separatorColor"; type: "QColor"; isReadonly: true }
+        Property { name: "disabledDarkColor"; type: "QColor"; isReadonly: true }
+        Property { name: "disabledLightColor"; type: "QColor"; isReadonly: true }
+    }
+    Component {
+        name: "QQuickIconImage"
+        defaultProperty: "data"
+        prototype: "QQuickImage"
+        exports: ["QtQuick.Controls.impl/IconImage 2.3"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "name"; type: "string" }
+        Property { name: "color"; type: "QColor" }
+    }
+    Component {
+        name: "QQuickIconLabel"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        exports: ["QtQuick.Controls.impl/IconLabel 2.3"]
+        exportMetaObjectRevisions: [0]
+        Enum {
+            name: "Display"
+            values: {
+                "IconOnly": 0,
+                "TextOnly": 1,
+                "TextBesideIcon": 2,
+                "TextUnderIcon": 3
+            }
+        }
+        Property { name: "icon"; type: "QQuickIcon" }
+        Property { name: "text"; type: "string" }
+        Property { name: "font"; type: "QFont" }
+        Property { name: "color"; type: "QColor" }
+        Property { name: "display"; type: "Display" }
+        Property { name: "spacing"; type: "double" }
+        Property { name: "mirrored"; type: "bool" }
+        Property { name: "alignment"; type: "Qt::Alignment" }
+        Property { name: "topPadding"; type: "double" }
+        Property { name: "leftPadding"; type: "double" }
+        Property { name: "rightPadding"; type: "double" }
+        Property { name: "bottomPadding"; type: "double" }
+    }
+    Component {
+        name: "QQuickImplicitSizeItem"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        Property { name: "implicitWidth"; type: "double"; isReadonly: true }
+        Property { name: "implicitHeight"; type: "double"; isReadonly: true }
+    }
+    Component {
+        name: "QQuickItemGroup"
+        defaultProperty: "data"
+        prototype: "QQuickImplicitSizeItem"
+        exports: ["QtQuick.Controls.impl/ItemGroup 2.2"]
+        exportMetaObjectRevisions: [0]
+    }
+    Component {
+        name: "QQuickMnemonicLabel"
+        defaultProperty: "data"
+        prototype: "QQuickText"
+        exports: ["QtQuick.Controls.impl/MnemonicLabel 2.3"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "text"; type: "string" }
+        Property { name: "mnemonicVisible"; type: "bool" }
+    }
+    Component {
+        name: "QQuickOverlay"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        exports: ["QtQuick.Controls/Overlay 2.3"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        attachedType: "QQuickOverlayAttached"
+        Property { name: "modal"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "modeless"; type: "QQmlComponent"; isPointer: true }
+        Signal { name: "pressed" }
+        Signal { name: "released" }
+    }
+    Component {
+        name: "QQuickPaddedRectangle"
+        defaultProperty: "data"
+        prototype: "QQuickRectangle"
+        exports: ["QtQuick.Controls.impl/PaddedRectangle 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "padding"; type: "double" }
+        Property { name: "topPadding"; type: "double" }
+        Property { name: "leftPadding"; type: "double" }
+        Property { name: "rightPadding"; type: "double" }
+        Property { name: "bottomPadding"; type: "double" }
+    }
+    Component {
+        name: "QQuickPlaceholderText"
+        defaultProperty: "data"
+        prototype: "QQuickText"
+        exports: ["QtQuick.Controls.impl/PlaceholderText 2.2"]
+        exportMetaObjectRevisions: [0]
+    }
+    Component {
+        name: "QQuickSplitHandleAttached"
+        prototype: "QObject"
+        exports: ["QtQuick.Controls/SplitHandle 2.13"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        Property { name: "hovered"; type: "bool"; isReadonly: true }
+        Property { name: "pressed"; type: "bool"; isReadonly: true }
+    }
+    Component {
+        name: "QQuickText"
+        defaultProperty: "data"
+        prototype: "QQuickImplicitSizeItem"
+        Enum {
+            name: "HAlignment"
+            values: {
+                "AlignLeft": 1,
+                "AlignRight": 2,
+                "AlignHCenter": 4,
+                "AlignJustify": 8
+            }
+        }
+        Enum {
+            name: "VAlignment"
+            values: {
+                "AlignTop": 32,
+                "AlignBottom": 64,
+                "AlignVCenter": 128
+            }
+        }
+        Enum {
+            name: "TextStyle"
+            values: {
+                "Normal": 0,
+                "Outline": 1,
+                "Raised": 2,
+                "Sunken": 3
+            }
+        }
+        Enum {
+            name: "TextFormat"
+            values: {
+                "PlainText": 0,
+                "RichText": 1,
+                "MarkdownText": 3,
+                "AutoText": 2,
+                "StyledText": 4
+            }
+        }
+        Enum {
+            name: "TextElideMode"
+            values: {
+                "ElideLeft": 0,
+                "ElideRight": 1,
+                "ElideMiddle": 2,
+                "ElideNone": 3
+            }
+        }
+        Enum {
+            name: "WrapMode"
+            values: {
+                "NoWrap": 0,
+                "WordWrap": 1,
+                "WrapAnywhere": 3,
+                "WrapAtWordBoundaryOrAnywhere": 4,
+                "Wrap": 4
+            }
+        }
+        Enum {
+            name: "RenderType"
+            values: {
+                "QtRendering": 0,
+                "NativeRendering": 1
+            }
+        }
+        Enum {
+            name: "LineHeightMode"
+            values: {
+                "ProportionalHeight": 0,
+                "FixedHeight": 1
+            }
+        }
+        Enum {
+            name: "FontSizeMode"
+            values: {
+                "FixedSize": 0,
+                "HorizontalFit": 1,
+                "VerticalFit": 2,
+                "Fit": 3
+            }
+        }
+        Property { name: "text"; type: "string" }
+        Property { name: "font"; type: "QFont" }
+        Property { name: "color"; type: "QColor" }
+        Property { name: "linkColor"; type: "QColor" }
+        Property { name: "style"; type: "TextStyle" }
+        Property { name: "styleColor"; type: "QColor" }
+        Property { name: "horizontalAlignment"; type: "HAlignment" }
+        Property { name: "effectiveHorizontalAlignment"; type: "HAlignment"; isReadonly: true }
+        Property { name: "verticalAlignment"; type: "VAlignment" }
+        Property { name: "wrapMode"; type: "WrapMode" }
+        Property { name: "lineCount"; type: "int"; isReadonly: true }
+        Property { name: "truncated"; type: "bool"; isReadonly: true }
+        Property { name: "maximumLineCount"; type: "int" }
+        Property { name: "textFormat"; type: "TextFormat" }
+        Property { name: "elide"; type: "TextElideMode" }
+        Property { name: "contentWidth"; type: "double"; isReadonly: true }
+        Property { name: "contentHeight"; type: "double"; isReadonly: true }
+        Property { name: "paintedWidth"; type: "double"; isReadonly: true }
+        Property { name: "paintedHeight"; type: "double"; isReadonly: true }
+        Property { name: "lineHeight"; type: "double" }
+        Property { name: "lineHeightMode"; type: "LineHeightMode" }
+        Property { name: "baseUrl"; type: "QUrl" }
+        Property { name: "minimumPixelSize"; type: "int" }
+        Property { name: "minimumPointSize"; type: "int" }
+        Property { name: "fontSizeMode"; type: "FontSizeMode" }
+        Property { name: "renderType"; type: "RenderType" }
+        Property { name: "hoveredLink"; revision: 2; type: "string"; isReadonly: true }
+        Property { name: "padding"; revision: 6; type: "double" }
+        Property { name: "topPadding"; revision: 6; type: "double" }
+        Property { name: "leftPadding"; revision: 6; type: "double" }
+        Property { name: "rightPadding"; revision: 6; type: "double" }
+        Property { name: "bottomPadding"; revision: 6; type: "double" }
+        Property { name: "fontInfo"; revision: 9; type: "QJSValue"; isReadonly: true }
+        Property { name: "advance"; revision: 10; type: "QSizeF"; isReadonly: true }
+        Signal {
+            name: "textChanged"
+            Parameter { name: "text"; type: "string" }
+        }
+        Signal {
+            name: "linkActivated"
+            Parameter { name: "link"; type: "string" }
+        }
+        Signal {
+            name: "linkHovered"
+            revision: 2
+            Parameter { name: "link"; type: "string" }
+        }
+        Signal {
+            name: "fontChanged"
+            Parameter { name: "font"; type: "QFont" }
+        }
+        Signal {
+            name: "styleChanged"
+            Parameter { name: "style"; type: "QQuickText::TextStyle" }
+        }
+        Signal {
+            name: "horizontalAlignmentChanged"
+            Parameter { name: "alignment"; type: "QQuickText::HAlignment" }
+        }
+        Signal {
+            name: "verticalAlignmentChanged"
+            Parameter { name: "alignment"; type: "QQuickText::VAlignment" }
+        }
+        Signal {
+            name: "textFormatChanged"
+            Parameter { name: "textFormat"; type: "QQuickText::TextFormat" }
+        }
+        Signal {
+            name: "elideModeChanged"
+            Parameter { name: "mode"; type: "QQuickText::TextElideMode" }
+        }
+        Signal { name: "contentSizeChanged" }
+        Signal {
+            name: "contentWidthChanged"
+            Parameter { name: "contentWidth"; type: "double" }
+        }
+        Signal {
+            name: "contentHeightChanged"
+            Parameter { name: "contentHeight"; type: "double" }
+        }
+        Signal {
+            name: "lineHeightChanged"
+            Parameter { name: "lineHeight"; type: "double" }
+        }
+        Signal {
+            name: "lineHeightModeChanged"
+            Parameter { name: "mode"; type: "LineHeightMode" }
+        }
+        Signal {
+            name: "lineLaidOut"
+            Parameter { name: "line"; type: "QQuickTextLine"; isPointer: true }
+        }
+        Signal { name: "paddingChanged"; revision: 6 }
+        Signal { name: "topPaddingChanged"; revision: 6 }
+        Signal { name: "leftPaddingChanged"; revision: 6 }
+        Signal { name: "rightPaddingChanged"; revision: 6 }
+        Signal { name: "bottomPaddingChanged"; revision: 6 }
+        Signal { name: "fontInfoChanged"; revision: 9 }
+        Method { name: "doLayout" }
+        Method { name: "forceLayout"; revision: 9 }
+        Method {
+            name: "linkAt"
+            revision: 3
+            type: "string"
+            Parameter { name: "x"; type: "double" }
+            Parameter { name: "y"; type: "double" }
+        }
+    }
+    Component {
+        name: "QQuickTumblerView"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        exports: ["QtQuick.Controls.impl/TumblerView 2.1"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "model"; type: "QVariant" }
+        Property { name: "delegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "path"; type: "QQuickPath"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickAbstractButton"
+        name: "QtQuick.Controls/AbstractButton 2.0"
+        exports: ["QtQuick.Controls/AbstractButton 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+    }
+    Component {
+        prototype: "QQuickAction"
+        name: "QtQuick.Controls/Action 2.3"
+        exports: ["QtQuick.Controls/Action 2.3"]
+        exportMetaObjectRevisions: [3]
+        isComposite: true
+    }
+    Component {
+        prototype: "QQuickActionGroup"
+        name: "QtQuick.Controls/ActionGroup 2.3"
+        exports: ["QtQuick.Controls/ActionGroup 2.3"]
+        exportMetaObjectRevisions: [3]
+        isComposite: true
+        defaultProperty: "actions"
+    }
+    Component {
+        prototype: "QQuickApplicationWindow"
+        name: "QtQuick.Controls/ApplicationWindow 2.0"
+        exports: ["QtQuick.Controls/ApplicationWindow 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "contentData"
+    }
+    Component {
+        prototype: "QQuickBusyIndicator"
+        name: "QtQuick.Controls/BusyIndicator 2.0"
+        exports: ["QtQuick.Controls/BusyIndicator 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+    }
+    Component {
+        prototype: "QQuickButton"
+        name: "QtQuick.Controls/Button 2.0"
+        exports: ["QtQuick.Controls/Button 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+    }
+    Component {
+        prototype: "QQuickButtonGroup"
+        name: "QtQuick.Controls/ButtonGroup 2.0"
+        exports: ["QtQuick.Controls/ButtonGroup 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+    }
+    Component {
+        prototype: "QQuickCheckBox"
+        name: "QtQuick.Controls/CheckBox 2.0"
+        exports: ["QtQuick.Controls/CheckBox 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+    }
+    Component {
+        prototype: "QQuickCheckDelegate"
+        name: "QtQuick.Controls/CheckDelegate 2.0"
+        exports: ["QtQuick.Controls/CheckDelegate 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+    }
+    Component {
+        prototype: "QQuickComboBox"
+        name: "QtQuick.Controls/ComboBox 2.0"
+        exports: ["QtQuick.Controls/ComboBox 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+    }
+    Component {
+        prototype: "QQuickContainer"
+        name: "QtQuick.Controls/Container 2.0"
+        exports: ["QtQuick.Controls/Container 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "contentData"
+    }
+    Component {
+        prototype: "QQuickControl"
+        name: "QtQuick.Controls/Control 2.0"
+        exports: ["QtQuick.Controls/Control 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+    }
+    Component {
+        prototype: "QQuickDelayButton"
+        name: "QtQuick.Controls/DelayButton 2.2"
+        exports: ["QtQuick.Controls/DelayButton 2.2"]
+        exportMetaObjectRevisions: [2]
+        isComposite: true
+        defaultProperty: "data"
+    }
+    Component {
+        prototype: "QQuickDial"
+        name: "QtQuick.Controls/Dial 2.0"
+        exports: ["QtQuick.Controls/Dial 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+    }
+    Component {
+        prototype: "QQuickDialog"
+        name: "QtQuick.Controls/Dialog 2.1"
+        exports: ["QtQuick.Controls/Dialog 2.1"]
+        exportMetaObjectRevisions: [1]
+        isComposite: true
+        defaultProperty: "contentData"
+    }
+    Component {
+        prototype: "QQuickDialogButtonBox"
+        name: "QtQuick.Controls/DialogButtonBox 2.1"
+        exports: ["QtQuick.Controls/DialogButtonBox 2.1"]
+        exportMetaObjectRevisions: [1]
+        isComposite: true
+        defaultProperty: "contentData"
+    }
+    Component {
+        prototype: "QQuickDrawer"
+        name: "QtQuick.Controls/Drawer 2.0"
+        exports: ["QtQuick.Controls/Drawer 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "contentData"
+    }
+    Component {
+        prototype: "QQuickFrame"
+        name: "QtQuick.Controls/Frame 2.0"
+        exports: ["QtQuick.Controls/Frame 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "contentData"
+    }
+    Component {
+        prototype: "QQuickGroupBox"
+        name: "QtQuick.Controls/GroupBox 2.0"
+        exports: ["QtQuick.Controls/GroupBox 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "contentData"
+    }
+    Component {
+        prototype: "QQuickHorizontalHeaderView"
+        name: "QtQuick.Controls/HorizontalHeaderView 2.15"
+        exports: ["QtQuick.Controls/HorizontalHeaderView 2.15"]
+        exportMetaObjectRevisions: [15]
+        isComposite: true
+        defaultProperty: "flickableData"
+    }
+    Component {
+        prototype: "QQuickItemDelegate"
+        name: "QtQuick.Controls/ItemDelegate 2.0"
+        exports: ["QtQuick.Controls/ItemDelegate 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+    }
+    Component {
+        prototype: "QQuickLabel"
+        name: "QtQuick.Controls/Label 2.0"
+        exports: ["QtQuick.Controls/Label 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+    }
+    Component {
+        prototype: "QQuickMenu"
+        name: "QtQuick.Controls/Menu 2.0"
+        exports: ["QtQuick.Controls/Menu 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "contentData"
+    }
+    Component {
+        prototype: "QQuickMenuBar"
+        name: "QtQuick.Controls/MenuBar 2.3"
+        exports: ["QtQuick.Controls/MenuBar 2.3"]
+        exportMetaObjectRevisions: [3]
+        isComposite: true
+        defaultProperty: "contentData"
+    }
+    Component {
+        prototype: "QQuickMenuBarItem"
+        name: "QtQuick.Controls/MenuBarItem 2.3"
+        exports: ["QtQuick.Controls/MenuBarItem 2.3"]
+        exportMetaObjectRevisions: [3]
+        isComposite: true
+        defaultProperty: "data"
+    }
+    Component {
+        prototype: "QQuickMenuItem"
+        name: "QtQuick.Controls/MenuItem 2.0"
+        exports: ["QtQuick.Controls/MenuItem 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+    }
+    Component {
+        prototype: "QQuickMenuSeparator"
+        name: "QtQuick.Controls/MenuSeparator 2.1"
+        exports: ["QtQuick.Controls/MenuSeparator 2.1"]
+        exportMetaObjectRevisions: [1]
+        isComposite: true
+        defaultProperty: "data"
+    }
+    Component {
+        prototype: "QQuickPage"
+        name: "QtQuick.Controls/Page 2.0"
+        exports: ["QtQuick.Controls/Page 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "contentData"
+    }
+    Component {
+        prototype: "QQuickPageIndicator"
+        name: "QtQuick.Controls/PageIndicator 2.0"
+        exports: ["QtQuick.Controls/PageIndicator 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+    }
+    Component {
+        prototype: "QQuickPane"
+        name: "QtQuick.Controls/Pane 2.0"
+        exports: ["QtQuick.Controls/Pane 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "contentData"
+    }
+    Component {
+        prototype: "QQuickPopup"
+        name: "QtQuick.Controls/Popup 2.0"
+        exports: ["QtQuick.Controls/Popup 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "contentData"
+    }
+    Component {
+        prototype: "QQuickProgressBar"
+        name: "QtQuick.Controls/ProgressBar 2.0"
+        exports: ["QtQuick.Controls/ProgressBar 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+    }
+    Component {
+        prototype: "QQuickRadioButton"
+        name: "QtQuick.Controls/RadioButton 2.0"
+        exports: ["QtQuick.Controls/RadioButton 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+    }
+    Component {
+        prototype: "QQuickRadioDelegate"
+        name: "QtQuick.Controls/RadioDelegate 2.0"
+        exports: ["QtQuick.Controls/RadioDelegate 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+    }
+    Component {
+        prototype: "QQuickRangeSlider"
+        name: "QtQuick.Controls/RangeSlider 2.0"
+        exports: ["QtQuick.Controls/RangeSlider 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+    }
+    Component {
+        prototype: "QQuickRoundButton"
+        name: "QtQuick.Controls/RoundButton 2.1"
+        exports: ["QtQuick.Controls/RoundButton 2.1"]
+        exportMetaObjectRevisions: [1]
+        isComposite: true
+        defaultProperty: "data"
+    }
+    Component {
+        prototype: "QQuickScrollBar"
+        name: "QtQuick.Controls/ScrollBar 2.0"
+        exports: ["QtQuick.Controls/ScrollBar 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+    }
+    Component {
+        prototype: "QQuickScrollIndicator"
+        name: "QtQuick.Controls/ScrollIndicator 2.0"
+        exports: ["QtQuick.Controls/ScrollIndicator 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+    }
+    Component {
+        prototype: "QQuickScrollView"
+        name: "QtQuick.Controls/ScrollView 2.2"
+        exports: ["QtQuick.Controls/ScrollView 2.2"]
+        exportMetaObjectRevisions: [2]
+        isComposite: true
+        defaultProperty: "contentData"
+    }
+    Component {
+        prototype: "QQuickSlider"
+        name: "QtQuick.Controls/Slider 2.0"
+        exports: ["QtQuick.Controls/Slider 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+    }
+    Component {
+        prototype: "QQuickSpinBox"
+        name: "QtQuick.Controls/SpinBox 2.0"
+        exports: ["QtQuick.Controls/SpinBox 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+    }
+    Component {
+        prototype: "QQuickSplitView"
+        name: "QtQuick.Controls/SplitView 2.13"
+        exports: ["QtQuick.Controls/SplitView 2.13"]
+        exportMetaObjectRevisions: [13]
+        isComposite: true
+        defaultProperty: "contentData"
+    }
+    Component {
+        prototype: "QQuickStackView"
+        name: "QtQuick.Controls/StackView 2.0"
+        exports: ["QtQuick.Controls/StackView 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+    }
+    Component {
+        prototype: "QQuickSwipeDelegate"
+        name: "QtQuick.Controls/SwipeDelegate 2.0"
+        exports: ["QtQuick.Controls/SwipeDelegate 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+    }
+    Component {
+        prototype: "QQuickSwipeView"
+        name: "QtQuick.Controls/SwipeView 2.0"
+        exports: ["QtQuick.Controls/SwipeView 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "contentData"
+    }
+    Component {
+        prototype: "QQuickSwitch"
+        name: "QtQuick.Controls/Switch 2.0"
+        exports: ["QtQuick.Controls/Switch 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+    }
+    Component {
+        prototype: "QQuickSwitchDelegate"
+        name: "QtQuick.Controls/SwitchDelegate 2.0"
+        exports: ["QtQuick.Controls/SwitchDelegate 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+    }
+    Component {
+        prototype: "QQuickTabBar"
+        name: "QtQuick.Controls/TabBar 2.0"
+        exports: ["QtQuick.Controls/TabBar 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "contentData"
+    }
+    Component {
+        prototype: "QQuickTabButton"
+        name: "QtQuick.Controls/TabButton 2.0"
+        exports: ["QtQuick.Controls/TabButton 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+    }
+    Component {
+        prototype: "QQuickTextArea"
+        name: "QtQuick.Controls/TextArea 2.0"
+        exports: ["QtQuick.Controls/TextArea 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+    }
+    Component {
+        prototype: "QQuickTextField"
+        name: "QtQuick.Controls/TextField 2.0"
+        exports: ["QtQuick.Controls/TextField 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+    }
+    Component {
+        prototype: "QQuickToolBar"
+        name: "QtQuick.Controls/ToolBar 2.0"
+        exports: ["QtQuick.Controls/ToolBar 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "contentData"
+    }
+    Component {
+        prototype: "QQuickToolButton"
+        name: "QtQuick.Controls/ToolButton 2.0"
+        exports: ["QtQuick.Controls/ToolButton 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+    }
+    Component {
+        prototype: "QQuickToolSeparator"
+        name: "QtQuick.Controls/ToolSeparator 2.1"
+        exports: ["QtQuick.Controls/ToolSeparator 2.1"]
+        exportMetaObjectRevisions: [1]
+        isComposite: true
+        defaultProperty: "data"
+    }
+    Component {
+        prototype: "QQuickToolTip"
+        name: "QtQuick.Controls/ToolTip 2.0"
+        exports: ["QtQuick.Controls/ToolTip 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "contentData"
+    }
+    Component {
+        prototype: "QQuickTumbler"
+        name: "QtQuick.Controls/Tumbler 2.0"
+        exports: ["QtQuick.Controls/Tumbler 2.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+    }
+    Component {
+        prototype: "QQuickVerticalHeaderView"
+        name: "QtQuick.Controls/VerticalHeaderView 2.15"
+        exports: ["QtQuick.Controls/VerticalHeaderView 2.15"]
+        exportMetaObjectRevisions: [15]
+        isComposite: true
+        defaultProperty: "flickableData"
+    }
+}
diff --git a/deployment_test/QtQuick/Controls.2/qmldir b/deployment_test/QtQuick/Controls.2/qmldir
new file mode 100644
index 0000000000000000000000000000000000000000..c9ccb8f9f1051327780db8d6bf4174f623ec4884
--- /dev/null
+++ b/deployment_test/QtQuick/Controls.2/qmldir
@@ -0,0 +1,5 @@
+module QtQuick.Controls
+plugin qtquickcontrols2plugin
+classname QtQuickControls2Plugin
+depends QtQuick.Templates 2.5
+designersupported
diff --git a/deployment_test/QtQuick/Controls.2/qtquickcontrols2plugin.dll b/deployment_test/QtQuick/Controls.2/qtquickcontrols2plugin.dll
new file mode 100644
index 0000000000000000000000000000000000000000..b0fc113a8a485a2fd3b7cf0d8762d3bc3052ce84
Binary files /dev/null and b/deployment_test/QtQuick/Controls.2/qtquickcontrols2plugin.dll differ
diff --git a/deployment_test/QtQuick/Controls/ApplicationWindow.qml b/deployment_test/QtQuick/Controls/ApplicationWindow.qml
new file mode 100644
index 0000000000000000000000000000000000000000..7d215556e3e6bed4a0ae913dcb4da03beccae4d6
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/ApplicationWindow.qml
@@ -0,0 +1,265 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQml 2.14 as Qml
+import QtQuick.Window 2.2
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Layouts 1.0
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype ApplicationWindow
+    \since 5.1
+    \inqmlmodule QtQuick.Controls
+    \ingroup applicationwindow
+    \ingroup controls
+    \brief Provides a top-level application window.
+
+    \image applicationwindow.png
+
+    ApplicationWindow is a \l Window that adds convenience for positioning items,
+    such as \l MenuBar, \l ToolBar, and \l StatusBar in a platform independent
+    manner.
+
+    \code
+    ApplicationWindow {
+        id: window
+        visible: true
+
+        menuBar: MenuBar {
+            Menu { MenuItem {...} }
+            Menu { MenuItem {...} }
+        }
+
+        toolBar: ToolBar {
+            RowLayout {
+                anchors.fill: parent
+                ToolButton {...}
+            }
+        }
+
+        TabView {
+            id: myContent
+            anchors.fill: parent
+            ...
+        }
+    }
+    \endcode
+
+    \note By default, an ApplicationWindow is not visible.
+
+    The \l{Qt Quick Controls 1 - Gallery} example is a good starting
+    point to explore this type.
+*/
+
+Window {
+    id: root
+
+    /*!
+        \qmlproperty MenuBar ApplicationWindow::menuBar
+
+        This property holds the \l MenuBar.
+
+        By default, this value is not set.
+    */
+    property MenuBar menuBar: null
+
+    /*!
+        \qmlproperty Item ApplicationWindow::toolBar
+
+        This property holds the toolbar \l Item.
+
+        It can be set to any Item type, but is generally used with \l ToolBar.
+
+        By default, this value is not set. When you set the toolbar item, it will
+        be anchored automatically into the application window.
+    */
+    property Item toolBar
+
+    /*!
+        \qmlproperty Item ApplicationWindow::statusBar
+
+        This property holds the status bar \l Item.
+
+        It can be set to any Item type, but is generally used with \l StatusBar.
+
+        By default, this value is not set. When you set the status bar item, it
+        will be anchored automatically into the application window.
+    */
+    property Item statusBar
+
+    // The below documentation was supposed to be written as a grouped property, but qdoc would
+    // not render it correctly due to a bug (QTBUG-34206)
+    /*!
+        \qmlproperty ContentItem ApplicationWindow::contentItem
+
+        This group holds the size constraints of the content item. This is the area between the
+        \l ToolBar and the \l StatusBar.
+        The \l ApplicationWindow will use this as input when calculating the effective size
+        constraints of the actual window.
+        It holds these 6 properties for describing the minimum, implicit and maximum sizes:
+        \table
+            \header \li Grouped property            \li Description
+            \row    \li contentItem.minimumWidth    \li The minimum width of the content item.
+            \row    \li contentItem.minimumHeight   \li The minimum height of the content item.
+            \row    \li contentItem.implicitWidth   \li The implicit width of the content item.
+            \row    \li contentItem.implicitHeight  \li The implicit height of the content item.
+            \row    \li contentItem.maximumWidth    \li The maximum width of the content item.
+            \row    \li contentItem.maximumHeight   \li The maximum height of the content item.
+        \endtable
+    */
+    property alias contentItem : contentArea
+
+    /*! The style Component for the window.
+        \sa {Qt Quick Controls 1 Styles QML Types}
+    */
+    property Component style: Settings.styleComponent(Settings.style, "ApplicationWindowStyle.qml", root)
+
+    /*! \internal */
+    property alias __style: styleLoader.item
+
+    /*! \internal */
+    property alias __panel: panelLoader.item
+
+    /*! \internal */
+    property real __topBottomMargins: __panel.contentArea.y + __panel.statusBarArea.height
+    /*! \internal
+        There is a similar macro QWINDOWSIZE_MAX in qwindow_p.h that is used to limit the
+        range of QWindow::maximum{Width,Height}
+        However, in case we have a very big number (> 2^31) conversion will fail, and it will be
+        converted to 0, resulting in that we will call setMaximumWidth(0)....
+        We therefore need to enforce the limit at a level where we are still operating on
+        floating point values.
+    */
+    readonly property real __qwindowsize_max: (1 << 24) - 1
+
+    /*! \internal */
+    property real __width: 0
+    Qml.Binding {
+        target: root
+        property: "__width"
+        when: (root.minimumWidth <= root.maximumWidth) && !contentArea.__noImplicitWidthGiven
+        value: Math.max(Math.min(root.maximumWidth, contentArea.implicitWidth), root.minimumWidth)
+        restoreMode: Binding.RestoreBinding
+    }
+    /*! \internal */
+    property real __height: 0
+    Qml.Binding {
+        target: root
+        property: "__height"
+        when: (root.minimumHeight <= root.maximumHeight) && !contentArea.__noImplicitHeightGiven
+        value: Math.max(Math.min(root.maximumHeight, contentArea.implicitHeight + __topBottomMargins), root.minimumHeight)
+        restoreMode: Binding.RestoreBinding
+    }
+    /* As soon as an application developer writes
+         width: 200
+       this binding will be broken. This is the reason for this indirection
+       via __width (and __height)
+    */
+    width: __width
+    height: __height
+
+    minimumWidth: contentArea.__noMinimumWidthGiven ? 0 : contentArea.minimumWidth
+    minimumHeight: contentArea.__noMinimumHeightGiven ? 0 : (contentArea.minimumHeight + __topBottomMargins)
+
+    maximumWidth: Math.min(__qwindowsize_max, contentArea.maximumWidth)
+    maximumHeight: Math.min(__qwindowsize_max, contentArea.maximumHeight + __topBottomMargins)
+
+    /*! \internal */
+    default property alias data: contentArea.data
+
+    flags: Qt.Window | Qt.WindowFullscreenButtonHint |
+        Qt.WindowTitleHint | Qt.WindowSystemMenuHint | Qt.WindowMinMaxButtonsHint |
+        Qt.WindowCloseButtonHint | Qt.WindowFullscreenButtonHint
+    // QTBUG-35049: Windows is removing features we didn't ask for, even though Qt::CustomizeWindowHint is not set
+    // Otherwise Qt.Window | Qt.WindowFullscreenButtonHint would be enough
+
+    Loader {
+        id: panelLoader
+        anchors.fill: parent
+        sourceComponent: __style ? __style.panel : null
+        onStatusChanged: if (status === Loader.Error) console.error("Failed to load Style for", root)
+        focus: true
+        Loader {
+            id: styleLoader
+            sourceComponent: style
+            property var __control: root
+            property QtObject styleData: QtObject {
+                readonly property bool hasColor: root.color != "#ffffff"
+            }
+            onStatusChanged: if (status === Loader.Error) console.error("Failed to load Style for", root)
+        }
+
+        Qml.Binding {
+            target: toolBar
+            property: "parent"
+            value: __panel.toolBarArea
+            restoreMode: Binding.RestoreBinding
+        }
+        Qml.Binding {
+            target: statusBar
+            property: "parent"
+            value: __panel.statusBarArea
+            restoreMode: Binding.RestoreBinding
+        }
+
+        Qml.Binding {
+            property: "parent"
+            target: menuBar ? menuBar.__contentItem : null
+            when: menuBar && !menuBar.__isNative
+            value: __panel.menuBarArea
+            restoreMode: Binding.RestoreBinding
+        }
+        Qml.Binding {
+            target: menuBar
+            property: "__parentWindow"
+            value: root
+            restoreMode: Binding.RestoreBinding
+        }
+
+        Keys.forwardTo: menuBar ? [menuBar.__contentItem, __panel] : []
+
+        ContentItem {
+            id: contentArea
+            anchors.fill: parent
+            parent: __panel.contentArea
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/ApplicationWindow.qmlc b/deployment_test/QtQuick/Controls/ApplicationWindow.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..1d62e59f5dc0dbb365effcd90720283c9e5edb19
Binary files /dev/null and b/deployment_test/QtQuick/Controls/ApplicationWindow.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/BusyIndicator.qml b/deployment_test/QtQuick/Controls/BusyIndicator.qml
new file mode 100644
index 0000000000000000000000000000000000000000..6c9972ad5636944fbb56e073668b9cd42520c746
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/BusyIndicator.qml
@@ -0,0 +1,85 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype BusyIndicator
+    \inqmlmodule QtQuick.Controls
+    \since 5.2
+    \ingroup controls
+    \brief A busy indicator.
+
+    \image busyindicator.png
+
+    The busy indicator should be used to indicate activity while content is
+    being loaded or the UI is blocked waiting for a resource to become available.
+
+    The following snippet shows how to use the BusyIndicator:
+
+    \qml
+    BusyIndicator {
+        running: image.status === Image.Loading
+    }
+    \endqml
+
+    You can create a custom appearance for a Busy Indicator by
+    assigning a \l {BusyIndicatorStyle}.
+ */
+Control {
+    id: indicator
+
+    /*! \qmlproperty bool BusyIndicator::running
+
+    This property holds whether the busy indicator is currently indicating
+    activity.
+
+    \note The indicator is only visible when this property is set to \c true.
+
+    The default value is \c true.
+    */
+    property bool running: true
+
+    Accessible.role: Accessible.Indicator
+    Accessible.name: "busy"
+
+    style: Settings.styleComponent(Settings.style, "BusyIndicatorStyle.qml", indicator)
+}
diff --git a/deployment_test/QtQuick/Controls/BusyIndicator.qmlc b/deployment_test/QtQuick/Controls/BusyIndicator.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..7d8ba9f56c828c9a1f7ab4d1dc987d8968547d2c
Binary files /dev/null and b/deployment_test/QtQuick/Controls/BusyIndicator.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Button.qml b/deployment_test/QtQuick/Controls/Button.qml
new file mode 100644
index 0000000000000000000000000000000000000000..c3f292381b25b36b795ef2d605ef0d693175a271
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Button.qml
@@ -0,0 +1,134 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQml 2.14 as Qml
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype Button
+    \inqmlmodule QtQuick.Controls
+    \since 5.1
+    \ingroup controls
+    \brief A push button with a text label.
+
+    \image button.png
+
+    The push button is perhaps the most commonly used widget in any graphical
+    user interface. Pushing (or clicking) a button commands the computer to
+    perform some action or answer a question. Common examples of buttons are
+    OK, Apply, Cancel, Close, Yes, No, and Help buttons.
+
+    \qml
+    Button {
+        text: "Button"
+    }
+    \endqml
+
+    Button is similar to the QPushButton widget.
+
+    You can create a custom appearance for a Button by
+    assigning a \l {ButtonStyle}.
+ */
+BasicButton {
+    id: button
+
+    /*! This property holds whether the push button is the default button.
+        Default buttons decide what happens when the user presses enter in a
+        dialog without giving a button explicit focus. \note This property only
+        changes the appearance of the button. The expected behavior needs to be
+        implemented by the user.
+
+        The default value is \c false.
+    */
+    property bool isDefault: false
+
+    /*! Assign a \l Menu to this property to get a pull-down menu button.
+
+        The default value is \c null.
+     */
+    property Menu menu: null
+
+    __effectivePressed: __behavior.effectivePressed || menu && menu.__popupVisible
+
+    activeFocusOnTab: true
+
+    Accessible.name: text
+
+    style: Settings.styleComponent(Settings.style, "ButtonStyle.qml", button)
+
+    Qml.Binding {
+        target: menu
+        property: "__minimumWidth"
+        value: button.__panel.width
+        restoreMode: Binding.RestoreBinding
+    }
+
+    Qml.Binding {
+        target: menu
+        property: "__visualItem"
+        value: button
+        restoreMode: Binding.RestoreBinding
+    }
+
+    Connections {
+        target: __behavior
+        function onEffectivePressedChanged() {
+            if (!Settings.hasTouchScreen && __behavior.effectivePressed && menu)
+                popupMenuTimer.start()
+        }
+        function onReleased() {
+            if (Settings.hasTouchScreen && __behavior.containsMouse && menu)
+                popupMenuTimer.start()
+        }
+    }
+
+    Timer {
+        id: popupMenuTimer
+        interval: 10
+        onTriggered: {
+            __behavior.keyPressed = false
+            if (Qt.application.layoutDirection === Qt.RightToLeft)
+                menu.__popup(Qt.rect(button.width, button.height, 0, 0), 0)
+            else
+                menu.__popup(Qt.rect(0, button.height, 0, 0), 0)
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Button.qmlc b/deployment_test/QtQuick/Controls/Button.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..eead900b461574b063d0fcb5114364aced6fd77e
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Button.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Calendar.qml b/deployment_test/QtQuick/Controls/Calendar.qml
new file mode 100644
index 0000000000000000000000000000000000000000..bf3d6737deee359509338b93a473355c889f6250
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Calendar.qml
@@ -0,0 +1,456 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.9
+import QtQuick.Controls 1.5
+import QtQuick.Controls.Styles 1.1
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype Calendar
+    \inqmlmodule QtQuick.Controls
+    \since 5.3
+    \ingroup controls
+    \brief Provides a way to select dates from a calendar.
+
+    \image calendar.png
+
+    Calendar allows selection of dates from a grid of days, similar to
+    QCalendarWidget.
+
+    The dates on the calendar can be selected with the mouse, or navigated
+    with the keyboard.
+
+    The selected date can be set through \l selectedDate.
+    A minimum and maximum date can be set through \l minimumDate and
+    \l maximumDate. The earliest minimum date that can be set is 1 January, 1
+    AD. The latest maximum date that can be set is 25 October, 275759 AD.
+
+    \code
+    Calendar {
+        minimumDate: new Date(2017, 0, 1)
+        maximumDate: new Date(2018, 0, 1)
+    }
+    \endcode
+
+    The selected date is displayed using the format in the application's
+    default locale.
+
+    Week numbers can be displayed by setting the weekNumbersVisible property to
+    \c true.
+
+    \qml
+    Calendar {
+        weekNumbersVisible: true
+    }
+    \endqml
+
+    You can create a custom appearance for Calendar by assigning a
+    \l {CalendarStyle}.
+*/
+
+Control {
+    id: calendar
+
+    /*!
+        \qmlproperty date Calendar::selectedDate
+
+        The date that has been selected by the user.
+
+        This property is subject to the following validation:
+
+        \list
+            \li If selectedDate is outside the range of \l minimumDate and
+                \l maximumDate, it will be clamped to be within that range.
+
+            \li selectedDate will not be changed if \c undefined or some other
+                invalid value is assigned.
+
+            \li If there are hours, minutes, seconds or milliseconds set, they
+                will be removed.
+        \endlist
+
+        The default value is the current date, which is equivalent to:
+
+        \code
+        new Date()
+        \endcode
+    */
+    property alias selectedDate: rangedDate.date
+
+    /*!
+        \qmlproperty date Calendar::minimumDate
+
+        The earliest date that this calendar will accept.
+
+        By default, this property is set to the earliest minimum date
+        (1 January, 1 AD).
+    */
+    property alias minimumDate: rangedDate.minimumDate
+
+    /*!
+        \qmlproperty date Calendar::maximumDate
+
+        The latest date that this calendar will accept.
+
+        By default, this property is set to the latest maximum date
+        (25 October, 275759 AD).
+    */
+    property alias maximumDate: rangedDate.maximumDate
+
+    /*!
+        This property determines which month in visibleYear is shown on the
+        calendar.
+
+        The month is from \c 0 to \c 11 to be consistent with the JavaScript
+        Date object.
+
+        \sa visibleYear
+    */
+    property int visibleMonth: selectedDate.getMonth()
+
+    /*!
+        This property determines which year is shown on the
+        calendar.
+
+        \sa visibleMonth
+    */
+    property int visibleYear: selectedDate.getFullYear()
+
+    onSelectedDateChanged: {
+        // When the selected date changes, the view should move back to that date.
+        visibleMonth = selectedDate.getMonth();
+        visibleYear = selectedDate.getFullYear();
+    }
+
+    RangedDate {
+        id: rangedDate
+        date: new Date()
+        minimumDate: CalendarUtils.minimumCalendarDate
+        maximumDate: CalendarUtils.maximumCalendarDate
+    }
+
+    /*!
+        This property determines the visibility of the frame
+        surrounding the calendar.
+
+        The default value is \c true.
+    */
+    property bool frameVisible: true
+
+    /*!
+        This property determines the visibility of week numbers.
+
+        The default value is \c false.
+    */
+    property bool weekNumbersVisible: false
+
+    /*!
+        This property determines the visibility of the navigation bar.
+        \since QtQuick.Controls 1.3
+
+        The default value is \c true.
+    */
+    property bool navigationBarVisible: true
+
+    /*!
+        \qmlproperty enum Calendar::dayOfWeekFormat
+
+        The format in which the days of the week (in the header) are displayed.
+
+        \c Locale.ShortFormat is the default and recommended format, as
+        \c Locale.NarrowFormat may not be fully supported by each locale (see
+        \l {Locale String Format Types}) and
+        \c Locale.LongFormat may not fit within the header cells.
+    */
+    property int dayOfWeekFormat: Locale.ShortFormat
+
+    /*!
+        \qmlproperty object Calendar::locale
+        \since QtQuick.Controls 1.6
+
+        This property controls the locale that this calendar uses to display
+        itself.
+
+        The locale affects how dates and day names are localized, as well as
+        which day is considered the first in a week.
+
+        The following example sets an Australian locale:
+
+        \code
+        locale: Qt.locale("en_AU")
+        \endcode
+
+        The default value is equivalent to \c Qt.locale().
+    */
+    property var locale: Qt.locale()
+
+    // left for compatibility reasons; can be removed in next minor version/Qt 6
+    property alias __locale: calendar.locale
+
+    /*!
+        \internal
+
+        This property holds the model that will be used by the Calendar to
+        populate the dates available to the user.
+    */
+    property CalendarModel __model: CalendarModel {
+        locale: calendar.locale
+
+        // TODO: don't set the hour when QTBUG-56787 is fixed
+        visibleDate: new Date(visibleYear, visibleMonth, 1, 12)
+    }
+
+    style: Settings.styleComponent(Settings.style, "CalendarStyle.qml", calendar)
+
+    /*!
+        \qmlsignal Calendar::hovered(date date)
+
+        Emitted when the mouse hovers over a valid date in the calendar.
+
+        \e date is the date that was hovered over.
+
+        The corresponding handler is \c onHovered.
+    */
+    signal hovered(date date)
+
+    /*!
+        \qmlsignal Calendar::pressed(date date)
+
+        Emitted when the mouse is pressed on a valid date in the calendar.
+
+        This is also emitted when dragging the mouse to another date while it is pressed.
+
+        \e date is the date that the mouse was pressed on.
+
+        The corresponding handler is \c onPressed.
+    */
+    signal pressed(date date)
+
+    /*!
+        \qmlsignal Calendar::released(date date)
+
+        Emitted when the mouse is released over a valid date in the calendar.
+
+        \e date is the date that the mouse was released over.
+
+        The corresponding handler is \c onReleased.
+    */
+    signal released(date date)
+
+    /*!
+        \qmlsignal Calendar::clicked(date date)
+
+        Emitted when the mouse is clicked on a valid date in the calendar.
+
+        \e date is the date that the mouse was clicked on.
+
+        The corresponding handler is \c onClicked.
+    */
+    signal clicked(date date)
+
+    /*!
+        \qmlsignal Calendar::doubleClicked(date date)
+
+        Emitted when the mouse is double-clicked on a valid date in the calendar.
+
+        \e date is the date that the mouse was double-clicked on.
+
+        The corresponding handler is \c onDoubleClicked.
+    */
+    signal doubleClicked(date date)
+
+    /*!
+        \qmlsignal Calendar::pressAndHold(date date)
+        \since QtQuick.Controls 1.3
+
+        Emitted when the mouse is pressed and held on a valid date in the calendar.
+
+        \e date is the date that the mouse was pressed on.
+
+        The corresponding handler is \c onPressAndHold.
+    */
+    signal pressAndHold(date date)
+
+    /*!
+        \qmlmethod void Calendar::showPreviousMonth()
+        Sets visibleMonth to the previous month.
+    */
+    function showPreviousMonth() {
+        if (visibleMonth === 0) {
+            visibleMonth = CalendarUtils.monthsInAYear - 1;
+            --visibleYear;
+        } else {
+            --visibleMonth;
+        }
+    }
+
+    /*!
+        \qmlmethod void Calendar::showNextMonth()
+        Sets visibleMonth to the next month.
+    */
+    function showNextMonth() {
+        if (visibleMonth === CalendarUtils.monthsInAYear - 1) {
+            visibleMonth = 0;
+            ++visibleYear;
+        } else {
+            ++visibleMonth;
+        }
+    }
+
+    /*!
+        \qmlmethod void Calendar::showPreviousYear()
+        Sets visibleYear to the previous year.
+    */
+    function showPreviousYear() {
+        if (visibleYear - 1 >= minimumDate.getFullYear()) {
+            --visibleYear;
+        }
+    }
+
+    /*!
+        \qmlmethod void Calendar::showNextYear()
+        Sets visibleYear to the next year.
+    */
+    function showNextYear() {
+        if (visibleYear + 1 <= maximumDate.getFullYear()) {
+            ++visibleYear;
+        }
+    }
+
+    /*!
+        Selects the month before the current month in \l selectedDate.
+    */
+    function __selectPreviousMonth() {
+        calendar.selectedDate = CalendarUtils.setMonth(calendar.selectedDate, calendar.selectedDate.getMonth() - 1);
+    }
+
+    /*!
+        Selects the month after the current month in \l selectedDate.
+    */
+    function __selectNextMonth() {
+        calendar.selectedDate = CalendarUtils.setMonth(calendar.selectedDate, calendar.selectedDate.getMonth() + 1);
+    }
+
+    /*!
+        Selects the week before the current week in \l selectedDate.
+    */
+    function __selectPreviousWeek() {
+        var newDate = new Date(calendar.selectedDate);
+        newDate.setDate(newDate.getDate() - CalendarUtils.daysInAWeek);
+        calendar.selectedDate = newDate;
+    }
+
+    /*!
+        Selects the week after the current week in \l selectedDate.
+    */
+    function __selectNextWeek() {
+        var newDate = new Date(calendar.selectedDate);
+        newDate.setDate(newDate.getDate() + CalendarUtils.daysInAWeek);
+        calendar.selectedDate = newDate;
+    }
+
+    /*!
+        Selects the first day of the current month in \l selectedDate.
+    */
+    function __selectFirstDayOfMonth() {
+        var newDate = new Date(calendar.selectedDate);
+        newDate.setDate(1);
+        calendar.selectedDate = newDate;
+    }
+
+    /*!
+        Selects the last day of the current month in \l selectedDate.
+    */
+    function __selectLastDayOfMonth() {
+        var newDate = new Date(calendar.selectedDate);
+        newDate.setDate(CalendarUtils.daysInMonth(newDate));
+        calendar.selectedDate = newDate;
+    }
+
+    /*!
+        Selects the day before the current day in \l selectedDate.
+    */
+    function __selectPreviousDay() {
+        var newDate = new Date(calendar.selectedDate);
+        newDate.setDate(newDate.getDate() - 1);
+        calendar.selectedDate = newDate;
+    }
+
+    /*!
+        Selects the day after the current day in \l selectedDate.
+    */
+    function __selectNextDay() {
+        var newDate = new Date(calendar.selectedDate);
+        newDate.setDate(newDate.getDate() + 1);
+        calendar.selectedDate = newDate;
+    }
+
+    Keys.onLeftPressed: {
+        calendar.__selectPreviousDay();
+    }
+
+    Keys.onUpPressed: {
+        calendar.__selectPreviousWeek();
+    }
+
+    Keys.onDownPressed: {
+        calendar.__selectNextWeek();
+    }
+
+    Keys.onRightPressed: {
+        calendar.__selectNextDay();
+    }
+
+    Keys.onPressed: {
+        if (event.key === Qt.Key_Home) {
+            calendar.__selectFirstDayOfMonth();
+            event.accepted = true;
+        } else if (event.key === Qt.Key_End) {
+            calendar.__selectLastDayOfMonth();
+            event.accepted = true;
+        } else if (event.key === Qt.Key_PageUp) {
+            calendar.__selectPreviousMonth();
+            event.accepted = true;
+        } else if (event.key === Qt.Key_PageDown) {
+            calendar.__selectNextMonth();
+            event.accepted = true;
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Calendar.qmlc b/deployment_test/QtQuick/Controls/Calendar.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..0c6fe8b3d9161435ac29dc50ea2fd2429a504fc5
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Calendar.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/CheckBox.qml b/deployment_test/QtQuick/Controls/CheckBox.qml
new file mode 100644
index 0000000000000000000000000000000000000000..d2448168b79c27df0b5c51ed1e859e5b2ae80078
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/CheckBox.qml
@@ -0,0 +1,197 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype CheckBox
+    \inqmlmodule QtQuick.Controls
+    \since 5.1
+    \ingroup controls
+    \brief A checkbox with a text label.
+
+    \image checkbox.png
+
+    A CheckBox is an option button that can be toggled on (checked) or off
+    (unchecked). Checkboxes are typically used to represent features in an
+    application that can be enabled or disabled without affecting others.
+
+    The state of the checkbox can be set with the \l {AbstractCheckable::checked}{checked} property.
+
+    In addition to the checked and unchecked states, there is a third state:
+    partially checked. This state indicates that the
+    regular checked/unchecked state can not be determined; generally because of
+    other states that affect the checkbox. This state is useful when several
+    child nodes are selected in a treeview, for example.
+
+    The partially checked state can be made available to the user by setting
+    \l partiallyCheckedEnabled to \c true, or set directly by setting
+    \l checkedState to \c Qt.PartiallyChecked. \l checkedState behaves
+    identically to \l {AbstractCheckable::checked}{checked} when \l partiallyCheckedEnabled
+    is \c false; setting one will appropriately set the other.
+
+    The label is shown next to the checkbox, and you can set the label text using its
+    \l {AbstractCheckable::text}{text} property.
+
+    \qml
+    Column {
+        CheckBox {
+            text: qsTr("Breakfast")
+            checked: true
+        }
+        CheckBox {
+            text: qsTr("Lunch")
+        }
+        CheckBox {
+            text: qsTr("Dinner")
+            checked: true
+        }
+    }
+    \endqml
+
+    Whenever a CheckBox is clicked, it emits the \l {AbstractCheckable::clicked}{clicked()} signal.
+
+    You can create a custom appearance for a CheckBox by
+    assigning a \l {CheckBoxStyle}.
+*/
+
+AbstractCheckable {
+    id: checkBox
+
+    /*!
+        \qmlproperty enumeration CheckBox::checkedState
+
+        This property indicates the current checked state of the checkbox.
+
+        Possible values:
+        \c Qt.UnChecked - The checkbox is not checked (default).
+        \c Qt.Checked - The checkbox is checked.
+        \c Qt.PartiallyChecked - The checkbox is in a partially checked (or
+        "mixed") state.
+
+        The \l {AbstractCheckable::checked}{checked} property also determines whether
+        this property is \c Qt.Checked or \c Qt.UnChecked, and vice versa.
+    */
+    property int checkedState: checked ? Qt.Checked : Qt.Unchecked
+
+    /*!
+        This property determines whether the \c Qt.PartiallyChecked state is
+        available.
+
+        A checkbox may be in a partially checked state when the regular checked
+        state can not be determined.
+
+        Setting \l checkedState to \c Qt.PartiallyChecked will implicitly set
+        this property to \c true.
+
+        If this property is \c true, \l {AbstractCheckable::checked}{checked} will be \c false.
+
+        By default, this property is \c false.
+    */
+    property bool partiallyCheckedEnabled: false
+
+    /*!
+        \internal
+        True if onCheckedChanged should be ignored because we were reacting
+        to onCheckedStateChanged.
+    */
+    property bool __ignoreChecked: false
+
+    /*!
+        \internal
+        True if onCheckedStateChanged should be ignored because we were reacting
+        to onCheckedChanged.
+    */
+    property bool __ignoreCheckedState: false
+
+    style: Settings.styleComponent(Settings.style, "CheckBoxStyle.qml", checkBox)
+
+    activeFocusOnTab: true
+
+    Accessible.role: Accessible.CheckBox
+    Accessible.name: text
+
+    __cycleStatesHandler: __cycleCheckBoxStates
+
+    onCheckedChanged: {
+        if (!__ignoreChecked) {
+            __ignoreCheckedState = true;
+            checkedState = checked ? Qt.Checked : Qt.Unchecked;
+            __ignoreCheckedState = false;
+        }
+    }
+
+    onCheckedStateChanged: {
+        __ignoreChecked = true;
+        if (checkedState === Qt.PartiallyChecked) {
+            partiallyCheckedEnabled = true;
+            checked = false;
+        } else if (!__ignoreCheckedState) {
+            checked = checkedState === Qt.Checked;
+        }
+        __ignoreChecked = false;
+    }
+
+    onPartiallyCheckedEnabledChanged: {
+        if (exclusiveGroup && partiallyCheckedEnabled) {
+            console.warn("Cannot have partially checked boxes in an ExclusiveGroup.");
+        }
+    }
+
+    onExclusiveGroupChanged: {
+        if (exclusiveGroup && partiallyCheckedEnabled) {
+            console.warn("Cannot have partially checked boxes in an ExclusiveGroup.");
+        }
+    }
+
+    /*! \internal */
+    function __cycleCheckBoxStates() {
+        if (!partiallyCheckedEnabled) {
+            checked = !checked;
+        } else {
+            switch (checkedState) {
+                case Qt.Unchecked: checkedState = Qt.Checked; break;
+                case Qt.Checked: checkedState = Qt.PartiallyChecked; break;
+                case Qt.PartiallyChecked: checkedState = Qt.Unchecked; break;
+            }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/CheckBox.qmlc b/deployment_test/QtQuick/Controls/CheckBox.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..5c0afdb566ba02df1380f62156c460755c911ec8
Binary files /dev/null and b/deployment_test/QtQuick/Controls/CheckBox.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/ComboBox.qml b/deployment_test/QtQuick/Controls/ComboBox.qml
new file mode 100644
index 0000000000000000000000000000000000000000..b01cfe120edb7432d22e21e6e6d471824205d7c6
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/ComboBox.qml
@@ -0,0 +1,717 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQml 2.14 as Qml
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype ComboBox
+    \inqmlmodule QtQuick.Controls
+    \since 5.1
+    \ingroup controls
+    \brief Provides a drop-down list functionality.
+
+    \image combobox.png
+
+    Add items to the ComboBox by assigning it a ListModel, or a list of strings
+    to the \l model property.
+
+    \qml
+       ComboBox {
+           width: 200
+           model: [ "Banana", "Apple", "Coconut" ]
+       }
+    \endqml
+
+    In this example we are demonstrating how to use a ListModel with a combo box.
+
+    \qml
+       ComboBox {
+           currentIndex: 2
+           model: ListModel {
+               id: cbItems
+               ListElement { text: "Banana"; color: "Yellow" }
+               ListElement { text: "Apple"; color: "Green" }
+               ListElement { text: "Coconut"; color: "Brown" }
+           }
+           width: 200
+           onCurrentIndexChanged: console.debug(cbItems.get(currentIndex).text + ", " + cbItems.get(currentIndex).color)
+       }
+    \endqml
+
+    You can make a combo box editable by setting the \l editable property. An editable combo box will
+    autocomplete its text based on what is available in the model.
+
+    In the next example we demonstrate how you can append content to an editable combo box by
+    reacting to the \l accepted signal. Note that you have to explicitly prevent duplicates.
+
+    \qml
+        ComboBox {
+            editable: true
+            model: ListModel {
+                id: model
+                ListElement { text: "Banana"; color: "Yellow" }
+                ListElement { text: "Apple"; color: "Green" }
+                ListElement { text: "Coconut"; color: "Brown" }
+            }
+            onAccepted: {
+                if (find(currentText) === -1) {
+                    model.append({text: editText})
+                    currentIndex = find(editText)
+                }
+            }
+        }
+    \endqml
+
+
+    You can create a custom appearance for a ComboBox by
+    assigning a \l {ComboBoxStyle}.
+*/
+
+Control {
+    id: comboBox
+
+    /*! \qmlproperty model ComboBox::model
+        The model to populate the ComboBox from.
+
+        Changing the model after initialization will reset \l currentIndex to \c 0.
+    */
+    property alias model: popupItems.model
+
+    /*! The model role used for populating the ComboBox. */
+    property string textRole: ""
+
+    /*! \qmlproperty int ComboBox::currentIndex
+        The index of the currently selected item in the ComboBox.
+
+        Setting currentIndex to \c -1 will reset the selection and clear the text
+        label. If \l editable is \c true, you may also need to manually clear \l editText.
+
+        \sa model
+    */
+    property alias currentIndex: popup.__selectedIndex
+
+    /*! \qmlproperty string ComboBox::currentText
+        The text of the currently selected item in the ComboBox.
+
+        \note Since \c currentText depends on \c currentIndex, there's no way to ensure \c currentText
+        will be up to date whenever a \c onCurrentIndexChanged handler is called.
+    */
+    readonly property alias currentText: popup.currentText
+
+    /*! This property holds whether the combo box can be edited by the user.
+     The default value is \c false.
+     \since QtQuick.Controls 1.1
+    */
+    property bool editable: false
+
+    /*! \qmlproperty string ComboBox::editText
+        \since QtQuick.Controls 1.1
+        This property specifies text being manipulated by the user for an editable combo box.
+    */
+    property alias editText: input.text
+
+    /*! \qmlproperty enumeration ComboBox::inputMethodHints
+        \since QtQuick.Controls 1.5
+    Provides hints to the input method about the expected content of the combo box and how it
+    should operate.
+
+    The value is a bit-wise combination of flags or \c Qt.ImhNone if no hints are set.
+
+    Flags that alter behavior are:
+
+    \list
+    \li Qt.ImhHiddenText - Characters should be hidden, as is typically used when entering passwords.
+    \li Qt.ImhSensitiveData - Typed text should not be stored by the active input method
+            in any persistent storage like predictive user dictionary.
+    \li Qt.ImhNoAutoUppercase - The input method should not try to automatically switch to upper case
+            when a sentence ends.
+    \li Qt.ImhPreferNumbers - Numbers are preferred (but not required).
+    \li Qt.ImhPreferUppercase - Upper case letters are preferred (but not required).
+    \li Qt.ImhPreferLowercase - Lower case letters are preferred (but not required).
+    \li Qt.ImhNoPredictiveText - Do not use predictive text (i.e. dictionary lookup) while typing.
+
+    \li Qt.ImhDate - The text editor functions as a date field.
+    \li Qt.ImhTime - The text editor functions as a time field.
+    \endlist
+
+    Flags that restrict input (exclusive flags) are:
+
+    \list
+    \li Qt.ImhDigitsOnly - Only digits are allowed.
+    \li Qt.ImhFormattedNumbersOnly - Only number input is allowed. This includes decimal point and minus sign.
+    \li Qt.ImhUppercaseOnly - Only upper case letter input is allowed.
+    \li Qt.ImhLowercaseOnly - Only lower case letter input is allowed.
+    \li Qt.ImhDialableCharactersOnly - Only characters suitable for phone dialing are allowed.
+    \li Qt.ImhEmailCharactersOnly - Only characters suitable for email addresses are allowed.
+    \li Qt.ImhUrlCharactersOnly - Only characters suitable for URLs are allowed.
+    \endlist
+
+    Masks:
+
+    \list
+    \li Qt.ImhExclusiveInputMask - This mask yields nonzero if any of the exclusive flags are used.
+    \endlist
+    */
+    property alias inputMethodHints: input.inputMethodHints
+
+    /*! This property specifies whether the combobox should gain active focus when pressed.
+        The default value is \c false. */
+    property bool activeFocusOnPress: false
+
+    /*! \qmlproperty bool ComboBox::pressed
+
+        This property holds whether the button is being pressed. */
+    readonly property bool pressed: mouseArea.effectivePressed || popup.__popupVisible
+
+    /*! \qmlproperty bool ComboBox::hovered
+
+        This property indicates whether the control is being hovered.
+    */
+    readonly property bool hovered: mouseArea.containsMouse || input.containsMouse
+
+    /*! \qmlproperty int ComboBox::count
+        \since QtQuick.Controls 1.1
+        This property holds the number of items in the combo box.
+    */
+    readonly property alias count: popupItems.count
+
+    /*! \qmlmethod string ComboBox::textAt(int index)
+        Returns the text for a given \a index.
+        If an invalid index is provided, \c null is returned
+        \since QtQuick.Controls 1.1
+    */
+    function textAt (index) {
+        if (index >= count || index < 0)
+            return null;
+        return popupItems.objectAt(index).text;
+    }
+
+    /*! \qmlmethod int ComboBox::find(string text)
+        Finds and returns the index of a given \a text
+        If no match is found, \c -1 is returned. The search is case sensitive.
+        \since QtQuick.Controls 1.1
+    */
+    function find (text) {
+        return input.find(text, Qt.MatchExactly)
+    }
+
+    /*!
+        \qmlproperty Validator ComboBox::validator
+        \since QtQuick.Controls 1.1
+
+        Allows you to set a text validator for an editable ComboBox.
+        When a validator is set,
+        the text field will only accept input which leaves the text property in
+        an intermediate state. The accepted signal will only be sent
+        if the text is in an acceptable state when enter is pressed.
+
+        Currently supported validators are \l[QtQuick]{IntValidator},
+        \l[QtQuick]{DoubleValidator}, and \l[QtQuick]{RegExpValidator}. An
+        example of using validators is shown below, which allows input of
+        integers between 11 and 31 into the text field:
+
+        \note This property is only applied when \l editable is \c true
+
+        \qml
+        import QtQuick 2.2
+        import QtQuick.Controls 1.2
+
+        ComboBox {
+            editable: true
+            model: 10
+            validator: IntValidator {bottom: 0; top: 10;}
+            focus: true
+        }
+        \endqml
+
+        \sa acceptableInput, accepted, editable
+    */
+    property alias validator: input.validator
+
+    /*!
+        \since QtQuick.Controls 1.3
+
+        This property contains the edit \l Menu for working
+        with text selection. Set it to \c null if no menu
+        is wanted.
+
+        \note The menu is only in use when \l editable is \c true
+    */
+    property Component menu: input.editMenu.defaultMenu
+
+    /*!
+        \qmlproperty bool ComboBox::acceptableInput
+        \since QtQuick.Controls 1.1
+
+        Returns \c true if the combo box contains acceptable
+        text in the editable text field.
+
+        If a validator was set, this property will return \c
+        true if the current text satisfies the validator or mask as
+        a final string (not as an intermediate string).
+
+        \sa validator, accepted
+
+    */
+    readonly property alias acceptableInput: input.acceptableInput
+
+    /*!
+        \qmlproperty bool ComboBox::selectByMouse
+        \since QtQuick.Controls 1.3
+
+        This property determines if the user can select the text in
+        the editable text field with the mouse.
+
+        The default value is \c true.
+    */
+    property bool selectByMouse: true
+
+    /*!
+        \qmlproperty bool ComboBox::inputMethodComposing
+        \since QtQuick.Controls 1.3
+
+        This property holds whether an editable ComboBox has partial text input from an input method.
+
+        While it is composing an input method may rely on mouse or key events from the ComboBox
+        to edit or commit the partial text. This property can be used to determine when to disable
+        events handlers that may interfere with the correct operation of an input method.
+    */
+    readonly property bool inputMethodComposing: !!input.inputMethodComposing
+
+    /*!
+        \qmlsignal ComboBox::accepted()
+        \since QtQuick.Controls 1.1
+
+        This signal is emitted when the Return or Enter key is pressed on an
+        \l editable combo box. If the confirmed string is not currently in the model,
+        the currentIndex will be set to -1 and the \l currentText will be updated
+        accordingly.
+
+        \note If there is a \l validator set on the combobox,
+        the signal will only be emitted if the input is in an acceptable state.
+
+        The corresponding handler is \c onAccepted.
+    */
+    signal accepted
+
+    /*!
+        \qmlsignal ComboBox::activated(int index)
+        \since QtQuick.Controls 1.1
+
+        This signal is similar to currentIndex changed, but will only
+        be emitted if the combo box index was changed by the user, not
+        when set programmatically.
+
+        \e index is the activated model index, or \c -1 if a new string is
+        accepted.
+
+        The corresponding handler is \c onActivated.
+    */
+    signal activated(int index)
+
+    /*!
+        \qmlmethod void ComboBox::selectAll()
+        \since QtQuick.Controls 1.1
+
+        Causes all \l editText to be selected.
+    */
+    function selectAll() {
+        input.selectAll()
+    }
+
+    /*! \internal */
+    function __selectPrevItem() {
+        input.blockUpdate = true
+        if (currentIndex > 0) {
+            currentIndex--;
+            input.text = popup.currentText;
+            activated(currentIndex);
+        }
+        input.blockUpdate = false;
+    }
+
+    /*! \internal */
+    function __selectNextItem() {
+        input.blockUpdate = true;
+        if (currentIndex < popupItems.count - 1) {
+            currentIndex++;
+            input.text = popup.currentText;
+            activated(currentIndex);
+        }
+        input.blockUpdate = false;
+    }
+
+    /*! \internal */
+    property var __popup: popup
+
+    style: Settings.styleComponent(Settings.style, "ComboBoxStyle.qml", comboBox)
+
+    activeFocusOnTab: true
+
+    Accessible.name: editable ? editText : currentText
+    Accessible.role: Accessible.ComboBox
+    Accessible.editable: editable
+
+    MouseArea {
+        id: mouseArea
+        property bool overridePressed: false
+        readonly property bool effectivePressed: (pressed || overridePressed) && containsMouse
+        anchors.fill: parent
+        hoverEnabled: Settings.hoverEnabled
+        onPressed: {
+            if (comboBox.activeFocusOnPress)
+                forceActiveFocus()
+            if (!Settings.hasTouchScreen)
+                popup.toggleShow()
+            else
+                overridePressed = true
+        }
+        onCanceled: overridePressed = false
+        onClicked: {
+            if (Settings.hasTouchScreen)
+                popup.toggleShow()
+            overridePressed = false
+        }
+        onWheel: {
+            if (wheel.angleDelta.y > 0) {
+                __selectPrevItem();
+            } else if (wheel.angleDelta.y < 0){
+                __selectNextItem();
+            }
+        }
+    }
+
+    Component.onCompleted: {
+        if (currentIndex === -1)
+            currentIndex = 0
+
+        popup.ready = true
+        popup.resolveTextValue(textRole)
+    }
+
+    Keys.onPressed: {
+        // Perform one-character based lookup for non-editable combo box
+        if (!editable && event.text.length > 0) {
+            var index = input.find(event.text, Qt.MatchStartsWith);
+            if (index >= 0 && index !== currentIndex) {
+                currentIndex = index;
+                activated(currentIndex);
+            }
+        }
+    }
+
+    TextInputWithHandles {
+        id: input
+
+        visible: editable
+        enabled: editable
+        focus: true
+        clip: contentWidth > width
+
+        control: comboBox
+        cursorHandle: __style ? __style.__cursorHandle : undefined
+        selectionHandle: __style ? __style.__selectionHandle : undefined
+
+        anchors.fill: parent
+        anchors.leftMargin: __style ? __style.padding.left : 0
+        anchors.topMargin: __style ? __style.padding.top : 0
+        anchors.rightMargin: __style ? __panel.dropDownButtonWidth + __style.padding.right : 0
+        anchors.bottomMargin: __style ? __style.padding.bottom: 0
+
+        verticalAlignment: Text.AlignVCenter
+
+        font: __panel && __panel.font !== undefined ? __panel.font : TextSingleton.font
+        renderType: __style ? __style.renderType : Text.NativeRendering
+        color: __panel ? __panel.textColor : "black"
+        selectionColor: __panel ? __panel.selectionColor : "blue"
+        selectedTextColor: __panel ? __panel.selectedTextColor : "white"
+        onAccepted: {
+            var idx = input.find(editText, Qt.MatchFixedString)
+            if (idx > -1) {
+                editTextMatches = true;
+                currentIndex = idx;
+                editText = textAt(idx);
+            } else {
+                editTextMatches = false;
+                currentIndex = -1;
+                popup.currentText = editText;
+            }
+            comboBox.accepted();
+        }
+
+        property bool blockUpdate: false
+        property string prevText
+        property bool editTextMatches: true
+
+        function find (text, searchType) {
+            for (var i = 0 ; i < popupItems.count ; ++i) {
+                var currentString = popupItems.objectAt(i).text
+                if (searchType === Qt.MatchExactly) {
+                    if (text === currentString)
+                        return i;
+                } else if (searchType === Qt.CaseSensitive) {
+                    if (currentString.indexOf(text) === 0)
+                        return i;
+                } else if (searchType === Qt.MatchFixedString) {
+                    if (currentString.toLowerCase().indexOf(text.toLowerCase()) === 0
+                            && currentString.length === text.length)
+                        return i;
+                } else if (currentString.toLowerCase().indexOf(text.toLowerCase()) === 0) {
+                    return i
+                }
+            }
+            return -1;
+        }
+
+        // Finds first entry and shortest entry. Used by editable combo
+        function tryComplete (inputText) {
+            var candidate = "";
+            var shortestString = "";
+            for (var i = 0 ; i < popupItems.count ; ++i) {
+                var currentString = popupItems.objectAt(i).text;
+
+                if (currentString.toLowerCase().indexOf(inputText.toLowerCase()) === 0) {
+                    if (candidate.length) { // Find smallest possible match
+                        var cmp = 0;
+
+                        // We try to complete the shortest string that matches our search
+                        if (currentString.length < candidate.length)
+                            candidate = currentString
+
+                        while (cmp < Math.min(currentString.length, shortestString.length)
+                               && shortestString[cmp].toLowerCase() === currentString[cmp].toLowerCase())
+                            cmp++;
+                        shortestString = shortestString.substring(0, cmp);
+                    } else { // First match, select as current index and find other matches
+                        candidate = currentString;
+                        shortestString = currentString;
+                    }
+                }
+            }
+
+            if (candidate.length)
+                return inputText + candidate.substring(inputText.length, candidate.length);
+            return inputText;
+        }
+
+        property bool allowComplete: false
+        Keys.forwardTo: comboBox
+        Keys.onPressed: allowComplete = (event.key !== Qt.Key_Backspace && event.key !== Qt.Key_Delete);
+
+        onTextChanged: {
+            if (editable && !blockUpdate && allowComplete && text.length > 0) {
+                var completed = input.tryComplete(text)
+                if (completed.length > text.length) {
+                    var oldtext = input.text;
+                    input.text = completed;
+                    input.select(text.length, oldtext.length);
+                }
+            }
+            prevText = text
+        }
+    }
+
+    Qml.Binding {
+        target: input
+        property: "text"
+        value: popup.currentText
+        when: input.editTextMatches
+        restoreMode: Binding.RestoreBinding
+    }
+
+    onTextRoleChanged: popup.resolveTextValue(textRole)
+
+    ExclusiveGroup { id: eg }
+
+    Menu {
+        id: popup
+        objectName: "popup"
+
+        style: isPopup ? __style.__popupStyle : __style.__dropDownStyle
+
+        property string currentText: selectedText
+        onSelectedTextChanged: popup.currentText = selectedText
+
+        property string selectedText
+        property int triggeredIndex: -1
+        on__SelectedIndexChanged: {
+            if (__selectedIndex === -1)
+                popup.currentText = ""
+            else
+                updateSelectedText()
+            if (triggeredIndex >= 0 && triggeredIndex == __selectedIndex) {
+                activated(currentIndex)
+                triggeredIndex = -1
+            }
+        }
+        property string textRole: ""
+
+        property bool ready: false
+        property bool isPopup: !editable && !!__panel && __panel.popup
+
+        property int y: isPopup ? (comboBox.__panel.height - comboBox.__panel.implicitHeight) / 2.0 : comboBox.__panel.height
+        __minimumWidth: comboBox.width
+        __visualItem: comboBox
+
+        property bool modelIsArray: false
+
+        Instantiator {
+            id: popupItems
+            active: false
+
+            property bool updatingModel: false
+            onModelChanged: {
+                popup.modelIsArray = !!model ? model.constructor === Array : false
+                if (active) {
+                    if (updatingModel && popup.__selectedIndex === 0) {
+                        // We still want to update the currentText
+                        popup.updateSelectedText()
+                    } else {
+                        updatingModel = true
+                        popup.__selectedIndex = 0
+                    }
+                }
+                popup.resolveTextValue(comboBox.textRole)
+            }
+
+            MenuItem {
+                text: popup.textRole === '' ?
+                        modelData :
+                          ((popup.modelIsArray ? modelData[popup.textRole] : model[popup.textRole]) || '')
+                onTriggered: {
+                    popup.triggeredIndex = index
+                    comboBox.editText = text
+                }
+                onTextChanged: if (index === currentIndex) popup.updateSelectedText();
+                checkable: true
+                exclusiveGroup: eg
+            }
+            onObjectAdded: {
+                popup.insertItem(index, object)
+                if (!updatingModel && index === popup.__selectedIndex)
+                    popup.selectedText = object["text"]
+            }
+            onObjectRemoved: popup.removeItem(object)
+
+        }
+
+        function resolveTextValue(initialTextRole) {
+            if (!ready || !model) {
+                popupItems.active = false
+                return;
+            }
+
+            var get = model['get'];
+            if (!get && popup.modelIsArray && !!model[0]) {
+                if (model[0].constructor !== String && model[0].constructor !== Number)
+                    get = function(i) { return model[i]; }
+            }
+
+            var modelMayHaveRoles = get !== undefined
+            textRole = initialTextRole
+            if (textRole === "" && modelMayHaveRoles && get(0)) {
+                // No text role set, check whether model has a suitable role
+                // If 'text' is found, or there's only one role, pick that.
+                var listElement = get(0)
+                var roleName = ""
+                var roleCount = 0
+                for (var role in listElement) {
+                    if (listElement[role].constructor === Function)
+                        continue;
+                    if (role === "text") {
+                        roleName = role
+                        break
+                    } else if (!roleName) {
+                        roleName = role
+                    }
+                    ++roleCount
+                }
+                if (roleCount > 1 && roleName !== "text") {
+                    console.warn("No suitable 'textRole' found for ComboBox.")
+                } else {
+                    textRole = roleName
+                }
+            }
+
+            if (!popupItems.active)
+                popupItems.active = true
+            else
+                updateSelectedText()
+        }
+
+        function toggleShow() {
+            if (popup.__popupVisible) {
+                popup.__dismissAndDestroy()
+            } else {
+                if (items[__selectedIndex])
+                    items[__selectedIndex].checked = true
+                __currentIndex = comboBox.currentIndex
+                if (Qt.application.layoutDirection === Qt.RightToLeft)
+                    __popup(Qt.rect(comboBox.width, y, 0, 0), isPopup ? __selectedIndex : 0)
+                else
+                    __popup(Qt.rect(0, y, 0, 0), isPopup ? __selectedIndex : 0)
+            }
+        }
+
+        function updateSelectedText() {
+            var selectedItem;
+            if (__selectedIndex !== -1 && (selectedItem = items[__selectedIndex])) {
+                input.editTextMatches = true
+                selectedText = Qt.binding(function () { return selectedItem.text })
+                if (currentText !== selectedText) // __selectedIndex went form -1 to 0
+                    selectedTextChanged()
+            }
+        }
+    }
+
+    // The key bindings below will only be in use when popup is
+    // not visible. Otherwise, native popup key handling will take place:
+    Keys.onSpacePressed: {
+        if (!editable)
+            popup.toggleShow()
+        else
+            event.accepted = false
+    }
+
+    Keys.onUpPressed: __selectPrevItem()
+    Keys.onDownPressed: __selectNextItem()
+}
diff --git a/deployment_test/QtQuick/Controls/ComboBox.qmlc b/deployment_test/QtQuick/Controls/ComboBox.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..ab188cc3439aa3141ca72e2dbc00bec075674425
Binary files /dev/null and b/deployment_test/QtQuick/Controls/ComboBox.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/GroupBox.qml b/deployment_test/QtQuick/Controls/GroupBox.qml
new file mode 100644
index 0000000000000000000000000000000000000000..0a414ed251b26f2d93079b21cdb2e14fe6cb0b07
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/GroupBox.qml
@@ -0,0 +1,232 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+import QtQuick.Controls.Styles 1.1
+import QtQuick.Layouts 1.0
+
+/*!
+    \qmltype GroupBox
+    \inqmlmodule QtQuick.Controls
+    \since 5.1
+    \ingroup controls
+    \brief GroupBox provides a group box frame with a title.
+
+    \image groupbox.png
+
+    A group box provides a frame, a title on top and displays various other controls inside itself. Group boxes can also be checkable.
+
+    Child controls in checkable group boxes are enabled or disabled depending on whether or not the group box is checked.
+
+    You can minimize the space consumption of a group box by enabling the flat property.
+    In most styles, enabling this property results in the removal of the left, right and bottom edges of the frame.
+
+    To add content to a group box, you can reparent it to its contentItem property.
+
+    The implicit size of the GroupBox is calculated based on the size of its content. If you want to anchor
+    items inside the group box, you must specify an explicit width and height on the GroupBox itself.
+
+    The following example shows how we use a GroupBox:
+
+    \qml
+    GroupBox {
+        title: "Joining for?"
+
+        Column {
+            spacing: 10
+
+            CheckBox {
+                text: "Breakfast"
+                checked: true
+            }
+            CheckBox {
+                text: "Lunch"
+                checked: false
+            }
+            CheckBox {
+                text: "Dinner"
+                checked: true
+            }
+        }
+    }
+    \endqml
+
+    \sa CheckBox, RadioButton, Layout
+
+*/
+
+FocusScope {
+    id: groupbox
+
+    /*!
+        This property holds the group box title text.
+
+        There is no default title text.
+    */
+    property string title
+
+    /*!
+        This property holds whether the group box is painted flat or has a frame.
+
+        A group box usually consists of a surrounding frame with a title at the top.
+        If this property is enabled, only the top part of the frame is drawn in most styles;
+        otherwise, the whole frame is drawn.
+
+        By default, this property is disabled, so group boxes are not flat unless explicitly specified.
+
+        \note In some styles, flat and non-flat group boxes have similar representations and may not be as
+              distinguishable as they are in other styles.
+    */
+    property bool flat: false
+
+    /*!
+        This property holds whether the group box has a checkbox in its title.
+
+        If this property is true, the group box displays its title using a checkbox in place of an ordinary label.
+        If the checkbox is checked, the group box's children are enabled; otherwise, they are disabled and inaccessible.
+
+        By default, group boxes are not checkable.
+    */
+    property bool checkable: false
+
+    /*!
+        \qmlproperty bool GroupBox::checked
+
+        This property holds whether the group box is checked.
+
+        If the group box is checkable, it is displayed with a check box. If the check box is checked, the group
+        box's children are enabled; otherwise, the children are disabled and are inaccessible to the user.
+
+        By default, checkable group boxes are also checked.
+    */
+    property alias checked: check.checked
+
+
+    /*! \internal */
+    default property alias __content: container.data
+
+    /*!
+        \qmlproperty Item GroupBox::contentItem
+
+        This property holds the content Item of the group box.
+
+        Items declared as children of a GroupBox are automatically parented to the GroupBox's contentItem.
+        Items created dynamically need to be explicitly parented to the contentItem:
+
+        \note The implicit size of the GroupBox is calculated based on the size of its content. If you want to anchor
+        items inside the group box, you must specify an explicit width and height on the GroupBox itself.
+    */
+    readonly property alias contentItem: container
+
+    /*! \internal */
+    property Component style: Settings.styleComponent(Settings.style, "GroupBoxStyle.qml", groupbox)
+
+    /*! \internal */
+    property alias __checkbox: check
+
+    /*! \internal */
+    property alias __style: styleLoader.item
+
+    implicitWidth: Math.max((!anchors.fill ? container.calcWidth() : 0) + loader.leftMargin + loader.rightMargin,
+                            sizeHint.implicitWidth + (checkable ? 24 : 6))
+    implicitHeight: (!anchors.fill ? container.calcHeight() : 0) + loader.topMargin + loader.bottomMargin
+
+    Layout.minimumWidth: implicitWidth
+    Layout.minimumHeight: implicitHeight
+
+    Accessible.role: Accessible.Grouping
+    Accessible.name: title
+
+    activeFocusOnTab: false
+
+
+    data: [
+        Loader {
+            id: loader
+            anchors.fill: parent
+            property int topMargin: __style ? __style.padding.top : 0
+            property int bottomMargin: __style ? __style.padding.bottom : 0
+            property int leftMargin: __style ? __style.padding.left : 0
+            property int rightMargin: __style ? __style.padding.right : 0
+            sourceComponent: styleLoader.item ? styleLoader.item.panel : null
+            onLoaded: item.z = -1
+            Text { id: sizeHint ; visible: false ; text: title }
+            Loader {
+                id: styleLoader
+                property alias __control: groupbox
+                sourceComponent: groupbox.style
+            }
+        },
+        CheckBox {
+            id: check
+            objectName: "check"
+            checked: true
+            text: groupbox.title
+            visible: checkable
+            anchors.top: parent.top
+            anchors.left: parent.left
+            anchors.right: parent.right
+            height: loader.topMargin
+            activeFocusOnTab: groupbox.checkable
+            style: CheckBoxStyle { panel: Item{} }
+        },
+        Item {
+            id: container
+            objectName: "container"
+            z: 1
+            focus: true
+            anchors.fill: parent
+
+            anchors.topMargin: loader.topMargin
+            anchors.leftMargin: loader.leftMargin
+            anchors.rightMargin: loader.rightMargin
+            anchors.bottomMargin: loader.bottomMargin
+            enabled: (!groupbox.checkable || groupbox.checked)
+
+            property Item layoutItem: container.children.length === 1 ? container.children[0] : null
+            function calcWidth () { return (layoutItem ? (layoutItem.implicitWidth || layoutItem.width) +
+                                                         (layoutItem.anchors.fill ? layoutItem.anchors.leftMargin +
+                                                                                    layoutItem.anchors.rightMargin : 0) : container.childrenRect.width) }
+            function calcHeight () { return (layoutItem ? (layoutItem.implicitHeight || layoutItem.height) +
+                                                          (layoutItem.anchors.fill ? layoutItem.anchors.topMargin +
+                                                                                     layoutItem.anchors.bottomMargin : 0) : container.childrenRect.height) }
+        }]
+}
diff --git a/deployment_test/QtQuick/Controls/GroupBox.qmlc b/deployment_test/QtQuick/Controls/GroupBox.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..39d88b0ada2069fceab8b031d00e73505f971553
Binary files /dev/null and b/deployment_test/QtQuick/Controls/GroupBox.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Label.qml b/deployment_test/QtQuick/Controls/Label.qml
new file mode 100644
index 0000000000000000000000000000000000000000..ea3f27b30e73b4807aa5cfde7c94a606c62e9c7f
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Label.qml
@@ -0,0 +1,92 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.6
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype Label
+    \inqmlmodule QtQuick.Controls
+    \since 5.1
+    \ingroup controls
+    \brief A text label.
+
+    \image label.png
+
+    In addition to the normal \l Text type, Label follows the font and
+    color scheme of the system.
+    Use the \c text property to assign a text to the label. For other properties
+    check \l Text.
+
+    A simple label looks like this:
+    \qml
+    Label {
+        text: "Hello world"
+    }
+    \endqml
+
+    You can use the properties of \l Text to change the appearance
+    of the text as desired:
+    \qml
+    Label {
+        text: "Hello world"
+        font.pixelSize: 22
+        font.italic: true
+        color: "steelblue"
+    }
+    \endqml
+
+    \sa Text, TextField, TextEdit
+*/
+
+Text {
+    /*!
+        \qmlproperty string Label::text
+
+        The text to display. Use this property to get and set it.
+    */
+
+    id: label
+    color: SystemPaletteSingleton.windowText(enabled)
+    activeFocusOnTab: false
+    renderType: Settings.isMobile ? Text.QtRendering : Text.NativeRendering
+    Accessible.name: text
+    Accessible.role: Accessible.StaticText
+}
diff --git a/deployment_test/QtQuick/Controls/Label.qmlc b/deployment_test/QtQuick/Controls/Label.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..22bf8874ac2b1958529d24515e2d036291aa8428
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Label.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Menu.qml b/deployment_test/QtQuick/Controls/Menu.qml
new file mode 100644
index 0000000000000000000000000000000000000000..f91e86345bea04bb6c557495f287b75c14a2292e
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Menu.qml
@@ -0,0 +1,180 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Styles 1.1
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype Menu
+    \inqmlmodule QtQuick.Controls
+    \since 5.1
+    \ingroup menus
+    \ingroup controls
+    \brief Provides a menu component for use as a context menu, popup menu, or
+    as part of a menu bar.
+
+    \image menu.png
+
+    \code
+    Menu {
+        title: "Edit"
+
+        MenuItem {
+            text: "Cut"
+            shortcut: "Ctrl+X"
+            onTriggered: ...
+        }
+
+        MenuItem {
+            text: "Copy"
+            shortcut: "Ctrl+C"
+            onTriggered: ...
+        }
+
+        MenuItem {
+            text: "Paste"
+            shortcut: "Ctrl+V"
+            onTriggered: ...
+        }
+
+        MenuSeparator { }
+
+        Menu {
+            title: "More Stuff"
+
+            MenuItem {
+                text: "Do Nothing"
+            }
+        }
+    }
+    \endcode
+
+    The main uses for menus:
+    \list
+    \li
+       as a \e top-level menu in a \l MenuBar
+    \li
+       as a \e submenu inside another menu
+    \li
+       as a standalone or \e context menu
+    \endlist
+
+    Note that some properties, such as \c enabled, \c text, or \c iconSource,
+    only make sense in a particular use case of the menu.
+
+    \sa MenuBar, MenuItem, MenuSeparator
+*/
+
+MenuPrivate {
+    id: root
+
+    /*! \internal
+      \omit
+      Documented in qqquickmenu.cpp.
+      \endomit
+    */
+    function addMenu(title) {
+        return root.insertMenu(items.length, title)
+    }
+
+    /*! \internal
+      \omit
+      Documented in qquickmenu.cpp.
+      \endomit
+    */
+    function insertMenu(index, title) {
+        if (!__selfComponent)
+            __selfComponent = Qt.createComponent("Menu.qml", root)
+        var submenu = __selfComponent.createObject(__selfComponent, { "title": title })
+        root.insertItem(index, submenu)
+        return submenu
+    }
+
+    /*! \internal */
+    property Component __selfComponent: null
+
+    /*! \qmlproperty Component Menu::style
+        \since QtQuick.Controls.Styles 1.2
+
+        The style Component for this control.
+        \sa {MenuStyle}
+
+    */
+    property Component style
+
+    Component.onCompleted: {
+        if (!style) {
+            __usingDefaultStyle = true
+            style = Qt.binding(function() { return Settings.styleComponent(Settings.style, "MenuStyle.qml", root) })
+        }
+    }
+
+    /*! \internal */
+    property bool __usingDefaultStyle: false
+    /*! \internal */
+    property var __parentContentItem: __parentMenu ? __parentMenu.__contentItem : null
+    /*! \internal */
+    property int __currentIndex: -1
+    /*! \internal */
+    onAboutToHide: __currentIndex = -1
+    on__MenuPopupDestroyed: contentLoader.active = false
+    onPopupVisibleChanged: {
+        if (__popupVisible)
+            contentLoader.active = true
+    }
+
+    /*! \internal */
+    __contentItem: Loader {
+        id: contentLoader
+        Component {
+            id: menuContent
+            MenuContentItem {
+                __menu: root
+            }
+        }
+
+        sourceComponent: root.__isNative ? null : menuContent
+        active: false
+        focus: true
+        Keys.forwardTo: item ? [item, root.__parentContentItem] : []
+        property bool altPressed: root.__parentContentItem ? root.__parentContentItem.altPressed : false
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Menu.qmlc b/deployment_test/QtQuick/Controls/Menu.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..ec01b60ccc5319e255f18a92116bd8daf719944e
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Menu.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/MenuBar.qml b/deployment_test/QtQuick/Controls/MenuBar.qml
new file mode 100644
index 0000000000000000000000000000000000000000..78fd7cc7ed25b3e5a689da898fb49fa0e436f83b
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/MenuBar.qml
@@ -0,0 +1,347 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQml 2.14 as Qml
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Styles 1.1
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype MenuBar
+    \inqmlmodule QtQuick.Controls
+    \since 5.1
+    \ingroup applicationwindow
+    \ingroup controls
+    \brief Provides a horizontal menu bar.
+
+    \image menubar.png
+
+    MenuBar can be added to an \l ApplicationWindow, providing menu options
+    to access additional functionality of the application.
+
+    \code
+    ApplicationWindow {
+        ...
+        menuBar: MenuBar {
+            Menu {
+                title: "File"
+                MenuItem { text: "Open..." }
+                MenuItem { text: "Close" }
+            }
+
+            Menu {
+                title: "Edit"
+                MenuItem { text: "Cut" }
+                MenuItem { text: "Copy" }
+                MenuItem { text: "Paste" }
+            }
+        }
+    }
+    \endcode
+
+    \sa ApplicationWindow::menuBar
+*/
+
+MenuBarPrivate {
+    id: root
+
+    /*! \qmlproperty Component MenuBar::style
+        \since QtQuick.Controls.Styles 1.2
+
+        The style Component for this control.
+        \sa {MenuBarStyle}
+
+    */
+    property Component style: Settings.styleComponent(Settings.style, "MenuBarStyle.qml", root)
+
+    /*! \internal */
+    property QtObject __style: styleLoader.item
+
+    __isNative: !__style.hasOwnProperty("__isNative") || __style.__isNative
+
+    /*! \internal */
+    __contentItem: Loader {
+        id: topLoader
+        sourceComponent: __menuBarComponent
+        active: !root.__isNative
+        focus: true
+        Keys.forwardTo: [item]
+        property real preferredWidth: parent && active ? parent.width : 0
+        property bool altPressed: item ? item.__altPressed : false
+
+        Loader {
+            id: styleLoader
+            property alias __control: topLoader.item
+            sourceComponent: root.style
+            onStatusChanged: {
+                if (status === Loader.Error)
+                    console.error("Failed to load Style for", root)
+            }
+        }
+    }
+
+    /*! \internal */
+    property Component __menuBarComponent: Loader {
+        id: menuBarLoader
+
+        Accessible.role: Accessible.MenuBar
+
+        onStatusChanged: if (status === Loader.Error) console.error("Failed to load panel for", root)
+
+        visible: status === Loader.Ready
+        sourceComponent: d.style ? d.style.background : undefined
+
+        width: implicitWidth || root.__contentItem.preferredWidth
+        height: Math.max(row.height + d.heightPadding, item ? item.implicitHeight : 0)
+
+        Qml.Binding {
+            // Make sure the styled menu bar is in the background
+            target: menuBarLoader.item
+            property: "z"
+            value: menuMouseArea.z - 1
+            restoreMode: Binding.RestoreBinding
+        }
+
+        QtObject {
+            id: d
+
+            property Style style: __style
+
+            property int openedMenuIndex: -1
+            property bool preselectMenuItem: false
+            property real heightPadding: style ? style.padding.top + style.padding.bottom : 0
+
+            property bool altPressed: false
+            property bool altPressedAgain: false
+            property var mnemonicsMap: ({})
+
+            function openMenuAtIndex(index) {
+                if (openedMenuIndex === index)
+                    return;
+
+                var oldIndex = openedMenuIndex
+                openedMenuIndex = index
+
+                if (oldIndex !== -1) {
+                    var menu = root.menus[oldIndex]
+                    if (menu.__popupVisible)
+                        menu.__dismissAndDestroy()
+                }
+
+                if (openedMenuIndex !== -1) {
+                    menu = root.menus[openedMenuIndex]
+                    if (menu.enabled) {
+                        if (menu.__usingDefaultStyle)
+                            menu.style = d.style.menuStyle
+
+                        var xPos = row.LayoutMirroring.enabled ? menuItemLoader.width : 0
+                        menu.__popup(Qt.rect(xPos, menuBarLoader.height - d.heightPadding, 0, 0), 0)
+
+                        if (preselectMenuItem)
+                            menu.__currentIndex = 0
+                    }
+                }
+            }
+
+            function dismissActiveFocus(event, reason) {
+                if (reason) {
+                    altPressedAgain = false
+                    altPressed = false
+                    openMenuAtIndex(-1)
+                    root.__contentItem.parent.forceActiveFocus()
+                } else {
+                    event.accepted = false
+                }
+            }
+
+            function maybeOpenFirstMenu(event) {
+                if (altPressed && openedMenuIndex === -1) {
+                    preselectMenuItem = true
+                    openMenuAtIndex(0)
+                } else {
+                    event.accepted = false
+                }
+            }
+        }
+        property alias __altPressed: d.altPressed // Needed for the menu contents
+
+        focus: true
+
+        Keys.onPressed: {
+            var action = null
+            if (event.key === Qt.Key_Alt) {
+                if (!d.altPressed)
+                    d.altPressed = true
+                else
+                    d.altPressedAgain = true
+            } else if (d.altPressed && (action = d.mnemonicsMap[event.text.toUpperCase()])) {
+                d.preselectMenuItem = true
+                action.trigger()
+                event.accepted = true
+            }
+        }
+
+        Keys.onReleased: d.dismissActiveFocus(event, d.altPressedAgain && d.openedMenuIndex === -1)
+        Keys.onEscapePressed: d.dismissActiveFocus(event, d.openedMenuIndex === -1)
+
+        Keys.onUpPressed: d.maybeOpenFirstMenu(event)
+        Keys.onDownPressed: d.maybeOpenFirstMenu(event)
+
+        Keys.onLeftPressed: {
+            if (d.openedMenuIndex > 0) {
+                var idx = d.openedMenuIndex - 1
+                while (idx >= 0 && !(root.menus[idx].enabled && root.menus[idx].visible))
+                    idx--
+                if (idx >= 0) {
+                    d.preselectMenuItem = true
+                    d.openMenuAtIndex(idx)
+                }
+            } else {
+                event.accepted = false;
+            }
+        }
+
+        Keys.onRightPressed: {
+            if (d.openedMenuIndex !== -1 && d.openedMenuIndex < root.menus.length - 1) {
+                var idx = d.openedMenuIndex + 1
+                while (idx < root.menus.length && !(root.menus[idx].enabled && root.menus[idx].visible))
+                    idx++
+                if (idx < root.menus.length) {
+                    d.preselectMenuItem = true
+                    d.openMenuAtIndex(idx)
+                }
+            } else {
+                event.accepted = false;
+            }
+        }
+
+        Keys.forwardTo: d.openedMenuIndex !== -1 ? [root.menus[d.openedMenuIndex].__contentItem] : []
+
+        Row {
+            id: row
+            x: d.style ? d.style.padding.left : 0
+            y: d.style ? d.style.padding.top : 0
+            width: parent.width - (d.style ? d.style.padding.left + d.style.padding.right : 0)
+            LayoutMirroring.enabled: Qt.application.layoutDirection === Qt.RightToLeft
+
+            Repeater {
+                id: itemsRepeater
+                model: root.menus
+                Loader {
+                    id: menuItemLoader
+
+                    Accessible.role: Accessible.MenuItem
+                    Accessible.name: StyleHelpers.removeMnemonics(opts.text)
+                    Accessible.onPressAction: d.openMenuAtIndex(opts.index)
+
+                    property var styleData: QtObject {
+                        id: opts
+                        readonly property int index: __menuItemIndex
+                        readonly property string text: !!__menuItem && __menuItem.title
+                        readonly property bool enabled: !!__menuItem && __menuItem.enabled
+                        readonly property bool selected: menuMouseArea.hoveredItem === menuItemLoader
+                        readonly property bool open: !!__menuItem && __menuItem.__popupVisible || d.openedMenuIndex === index
+                        readonly property bool underlineMnemonic: d.altPressed
+                    }
+
+                    height: Math.max(menuBarLoader.height - d.heightPadding,
+                                     menuItemLoader.item ? menuItemLoader.item.implicitHeight : 0)
+
+                    readonly property var __menuItem: modelData
+                    readonly property int __menuItemIndex: index
+                    sourceComponent: d.style ? d.style.itemDelegate : null
+                    visible: __menuItem.visible
+
+                    Connections {
+                        target: __menuItem
+                        function onAboutToHide() {
+                            if (d.openedMenuIndex === index) {
+                                d.openMenuAtIndex(-1)
+                                menuMouseArea.hoveredItem = null
+                            }
+                        }
+                    }
+
+                    Connections {
+                        target: __menuItem.__action
+                        function onTriggered() { d.openMenuAtIndex(__menuItemIndex) }
+                    }
+
+                    Component.onCompleted: {
+                        __menuItem.__visualItem = menuItemLoader
+
+                        var title = __menuItem.title
+                        var ampersandPos = title.indexOf("&")
+                        if (ampersandPos !== -1)
+                            d.mnemonicsMap[title[ampersandPos + 1].toUpperCase()] = __menuItem.__action
+                    }
+                }
+            }
+        }
+
+        MouseArea {
+            id: menuMouseArea
+            anchors.fill: parent
+            hoverEnabled: Settings.hoverEnabled
+
+            onPositionChanged: updateCurrentItem(mouse)
+            onPressed: updateCurrentItem(mouse)
+            onExited: hoveredItem = null
+
+            property Item currentItem: null
+            property Item hoveredItem: null
+            function updateCurrentItem(mouse) {
+                var pos = mapToItem(row, mouse.x, mouse.y)
+                if (pressed || !hoveredItem
+                    || !hoveredItem.contains(Qt.point(pos.x - currentItem.x, pos.y - currentItem.y))) {
+                    hoveredItem = row.childAt(pos.x, pos.y)
+                    if (!hoveredItem)
+                        return false;
+                    currentItem = hoveredItem
+                    if (pressed || d.openedMenuIndex !== -1) {
+                        d.preselectMenuItem = false
+                        d.openMenuAtIndex(currentItem.__menuItemIndex)
+                    }
+                }
+                return true;
+            }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/MenuBar.qmlc b/deployment_test/QtQuick/Controls/MenuBar.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..c2a200cfc44beb3cee3576b88c56fb319aa702eb
Binary files /dev/null and b/deployment_test/QtQuick/Controls/MenuBar.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Private/AbstractCheckable.qml b/deployment_test/QtQuick/Controls/Private/AbstractCheckable.qml
new file mode 100644
index 0000000000000000000000000000000000000000..e96f0500b5028115b80e2bd5b01b940bec17f3c1
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Private/AbstractCheckable.qml
@@ -0,0 +1,178 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+import QtQuick.Window 2.2
+
+/*!
+    \qmltype AbstractCheckable
+    \inqmlmodule QtQuick.Controls
+    \brief An abstract representation of a checkable control with a label
+    \qmlabstract
+    \internal
+
+    A checkable control is one that has two states: checked (on) and
+    unchecked (off). AbstractCheckable encapsulates the basic behavior and
+    states that are required by checkable controls.
+
+    Examples of checkable controls are RadioButton and
+    CheckBox. CheckBox extends AbstractCheckable's behavior by adding a third
+    state: partially checked.
+*/
+
+Control {
+    id: abstractCheckable
+
+    /*!
+        Emitted whenever the control is clicked.
+    */
+    signal clicked
+
+    /*!
+        \qmlproperty bool AbstractCheckable::pressed
+
+        This property is \c true if the control is being pressed.
+        Set this property to manually invoke a mouse click.
+    */
+    property alias pressed: mouseArea.effectivePressed
+
+    /*! \qmlproperty bool AbstractCheckcable::hovered
+
+        This property indicates whether the control is being hovered.
+    */
+    readonly property alias hovered: mouseArea.containsMouse
+
+    /*!
+        This property is \c true if the control is checked.
+    */
+    property bool checked: false
+    Accessible.checked: checked
+    Accessible.checkable: true
+
+    /*!
+        This property is \c true if the control takes the focus when it is
+        pressed; \l{QQuickItem::forceActiveFocus()}{forceActiveFocus()} will be
+        called on the control.
+    */
+    property bool activeFocusOnPress: false
+
+    /*!
+        This property stores the ExclusiveGroup that the control belongs to.
+    */
+    property ExclusiveGroup exclusiveGroup: null
+
+    /*!
+        This property holds the text that the label should display.
+    */
+    property string text
+
+    /*!
+        This property holds the button tooltip.
+
+        \since QtQuick.Controls 1.7
+    */
+    property string tooltip
+    Accessible.description: tooltip
+
+    /*! \internal */
+    property var __cycleStatesHandler: cycleRadioButtonStates
+
+    activeFocusOnTab: true
+
+    MouseArea {
+        id: mouseArea
+        focus: true
+        anchors.fill: parent
+        hoverEnabled: Settings.hoverEnabled
+        enabled: !keyPressed
+
+        property bool keyPressed: false
+        property bool effectivePressed: pressed && containsMouse || keyPressed
+
+        onClicked: abstractCheckable.clicked();
+
+        onPressed: if (activeFocusOnPress) forceActiveFocus();
+
+        onExited: Tooltip.hideText()
+        onCanceled: Tooltip.hideText()
+
+        onReleased: {
+            if (containsMouse && (!exclusiveGroup || !checked))
+                __cycleStatesHandler();
+        }
+
+        Timer {
+            interval: 1000
+            running: mouseArea.containsMouse && !pressed && tooltip.length && mouseArea.Window.visibility !== Window.Hidden
+            onTriggered: Tooltip.showText(mouseArea, Qt.point(mouseArea.mouseX, mouseArea.mouseY), tooltip)
+        }
+    }
+
+    /*! \internal */
+    onExclusiveGroupChanged: {
+        if (exclusiveGroup)
+            exclusiveGroup.bindCheckable(abstractCheckable)
+    }
+
+    Keys.onPressed: {
+        if (event.key === Qt.Key_Space && !event.isAutoRepeat && !mouseArea.pressed)
+            mouseArea.keyPressed = true;
+    }
+
+    Keys.onReleased: {
+        if (event.key === Qt.Key_Space && !event.isAutoRepeat && mouseArea.keyPressed) {
+            mouseArea.keyPressed = false;
+            if (!exclusiveGroup || !checked)
+                __cycleStatesHandler();
+            clicked();
+        }
+    }
+
+    Action {
+        // handle mnemonic
+        text: abstractCheckable.text
+        onTriggered: {
+            if (!abstractCheckable.exclusiveGroup || !abstractCheckable.checked)
+                abstractCheckable.__cycleStatesHandler();
+            abstractCheckable.clicked();
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Private/AbstractCheckable.qmlc b/deployment_test/QtQuick/Controls/Private/AbstractCheckable.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..2f984afd9eb74f456cffb67e9c67d8f69da7aabb
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Private/AbstractCheckable.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Private/BasicButton.qml b/deployment_test/QtQuick/Controls/Private/BasicButton.qml
new file mode 100644
index 0000000000000000000000000000000000000000..d5c5d28fa0097b3e392f1e70b50c58a5979db40f
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Private/BasicButton.qml
@@ -0,0 +1,241 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+import QtQuick.Controls.Styles 1.1
+import QtQuick.Window 2.2
+
+/*!
+    \qmltype BasicButton
+    \internal
+    \qmlabstract
+    \inqmlmodule QtQuick.Controls.Private
+*/
+
+Control {
+    id: button
+
+    /*! This signal is emitted when the button is clicked. */
+    signal clicked
+
+    /*! \qmlproperty bool BasicButton::pressed
+
+        This property holds whether the button is being pressed. */
+    readonly property alias pressed: button.__effectivePressed
+
+    /*! \qmlproperty bool BasicButton::hovered
+
+        This property indicates whether the control is being hovered.
+    */
+    readonly property alias hovered: behavior.containsMouse
+
+    /*! This property holds whether the button is checkable.
+
+        The default value is \c false. */
+    property bool checkable: false
+    Accessible.checkable: checkable
+
+    /*! This property holds whether the button is checked.
+
+        Only checkable buttons can be checked.
+
+        The default value is \c false. */
+    property bool checked: false
+    Accessible.checked: checked
+
+    /*! This property holds the ExclusiveGroup that the button belongs to.
+
+        The default value is \c null. */
+    property ExclusiveGroup exclusiveGroup: null
+
+    /*! This property holds the associated button action.
+
+        If a button has an action associated, the action defines the
+        button's properties like checked, text, tooltip etc.
+
+        When an action is set, it's still possible to override the \l text,
+        \l tooltip, \l iconSource, and \l iconName properties.
+
+        The default value is \c null. */
+    property Action action: null
+
+    /*! This property specifies whether the button should gain active focus when pressed.
+
+        The default value is \c false. */
+    property bool activeFocusOnPress: false
+
+    /*! This property holds the text shown on the button. If the button has no
+        text, the \l text property will be an empty string.
+
+        The default value is the empty string.
+    */
+    property string text: action ? action.text : ""
+
+    /*! This property holds the button tooltip. */
+    property string tooltip: action ? (action.tooltip || StyleHelpers.removeMnemonics(action.text)) : ""
+
+    /*! This property holds the icon shown on the button. If the button has no
+        icon, the iconSource property will be an empty string.
+
+        The default value is the empty string.
+    */
+    property url iconSource: action ? action.iconSource : ""
+
+    /*! The image label source as theme name.
+        When an icon from the platform icon theme is found, this takes
+        precedence over iconSource.
+
+        \include icons.qdocinc iconName
+    */
+    property string iconName: action ? action.iconName : ""
+
+    /*! \internal */
+    property string __position: "only"
+    /*! \internal */
+    readonly property bool __iconOverriden: button.action && (button.action.iconSource !== button.iconSource || button.action.iconName !== button.iconName)
+    /*! \internal */
+    property Action __action: action || ownAction
+    /*! \internal */
+    readonly property Action __iconAction: __iconOverriden ? ownAction : __action
+
+    /*! \internal */
+    onExclusiveGroupChanged: {
+        if (exclusiveGroup)
+            exclusiveGroup.bindCheckable(button)
+    }
+
+    Accessible.role: Accessible.Button
+    Accessible.description: tooltip
+
+    /*! \internal */
+    function accessiblePressAction() {
+        __action.trigger(button)
+    }
+
+    Action {
+        id: ownAction
+        enabled: button.enabled
+        iconSource: !button.action || __iconOverriden ? button.iconSource : ""
+        iconName: !button.action || __iconOverriden ? button.iconName : ""
+
+        // let ownAction handle mnemonic if and only if the button does
+        // not already have an action assigned to avoid ambiguous shortcuts
+        text: button.action ? "" : button.text
+    }
+
+    Connections {
+        target: __action
+        function onTriggered() { button.clicked() }
+    }
+
+    activeFocusOnTab: true
+
+    Keys.onPressed: {
+        if (event.key === Qt.Key_Space && !event.isAutoRepeat && !behavior.pressed) {
+            behavior.keyPressed = true;
+            event.accepted = true;
+        }
+    }
+
+    onFocusChanged: if (!focus) behavior.keyPressed = false
+
+    Keys.onReleased: {
+        if (event.key === Qt.Key_Space && !event.isAutoRepeat && behavior.keyPressed) {
+            behavior.keyPressed = false;
+            __action.trigger(button)
+            behavior.toggle()
+            event.accepted = true;
+        }
+    }
+
+    MouseArea {
+        id: behavior
+        property bool keyPressed: false
+        property bool effectivePressed: pressed && containsMouse || keyPressed
+
+        anchors.fill: parent
+        hoverEnabled: Settings.hoverEnabled
+        enabled: !keyPressed
+
+        function toggle() {
+            if (button.checkable && !button.action && !(button.checked && button.exclusiveGroup))
+                button.checked = !button.checked
+        }
+
+        onReleased: {
+            if (containsMouse) {
+                toggle()
+                __action.trigger(button)
+            }
+        }
+        onExited: Tooltip.hideText()
+        onCanceled: Tooltip.hideText()
+        onPressed: {
+            if (activeFocusOnPress)
+                button.forceActiveFocus()
+        }
+
+        Timer {
+            interval: 1000
+            running: behavior.containsMouse && !pressed && tooltip.length && behavior.Window.visibility !== Window.Hidden
+            onTriggered: Tooltip.showText(behavior, Qt.point(behavior.mouseX, behavior.mouseY), tooltip)
+        }
+    }
+
+    /*! \internal */
+    property var __behavior: behavior
+
+    /*! \internal */
+    property bool __effectivePressed: behavior.effectivePressed
+
+    states: [
+        State {
+            name: "boundAction"
+            when: action !== null
+            PropertyChanges {
+                target: button
+                enabled: action.enabled
+                checkable: action.checkable
+                checked: action.checked
+            }
+        }
+    ]
+}
diff --git a/deployment_test/QtQuick/Controls/Private/BasicButton.qmlc b/deployment_test/QtQuick/Controls/Private/BasicButton.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..b463219e720936ae8c645eaa783dad16de3205ba
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Private/BasicButton.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Private/BasicTableView.qml b/deployment_test/QtQuick/Controls/Private/BasicTableView.qml
new file mode 100644
index 0000000000000000000000000000000000000000..cd6114a1eff611e131a863699c06a99a7c231b7f
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Private/BasicTableView.qml
@@ -0,0 +1,792 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+import QtQml 2.14 as Qml
+import QtQuick 2.6
+import QtQuick.Controls 1.5
+import QtQuick.Controls.Private 1.0
+import QtQuick.Controls.Styles 1.2
+import QtQuick.Window 2.2
+
+/*!
+    \qmltype BasicTableView
+    \qmlabstract
+    \inqmlmodule QtQuick.Controls.Private
+*/
+
+ScrollView {
+    id: root
+
+    /*! \qmlproperty bool BasicTableView::alternatingRowColors
+
+        This property is set to \c true if the view alternates the row color.
+        The default value is \c true.
+    */
+    property bool alternatingRowColors: true
+
+    /*! \qmlproperty bool BasicTableView::headerVisible
+
+        This property determines if the header is visible.
+        The default value is \c true.
+    */
+    property bool headerVisible: true
+
+    /*! \qmlproperty bool BasicTableView::backgroundVisible
+
+        This property determines if the background should be filled or not.
+
+        The default value is \c true.
+
+        \note The rowDelegate is not affected by this property
+    */
+    property alias backgroundVisible: colorRect.visible
+
+    /*! \qmlproperty Component BasicTableView::itemDelegate
+        \internal
+
+        Documentation differs between TableView and TreeView.
+        See qtquickcontrols-treeview.qdoc and qtquickcontrols-tableview.qdoc
+    */
+    property Component itemDelegate: __style ? __style.itemDelegate : null
+
+    /*! \qmlproperty Component BasicTableView::rowDelegate
+
+        This property defines a delegate to draw a row.
+
+        In the row delegate you have access to the following special properties:
+        \list
+        \li  styleData.alternate - true when the row uses the alternate background color
+        \li  styleData.selected - true when the row is currently selected
+        \li  styleData.row - the index of the row
+        \li  styleData.hasActiveFocus - true when the row has focus (since QtQuick.Controls 1.3)
+        \li  styleData.pressed - true when the row is pressed (since QtQuick.Controls 1.3)
+        \endlist
+
+        \note For performance reasons, created delegates can be recycled
+        across multiple table rows. This implies that when you make use of implicit
+        properties such as \c styleData.row or \c model, these values can change
+        after the delegate has been constructed. This means that you should not assume
+        that content is fixed when \c Component.onCompleted is called, but instead rely on
+        bindings to such properties.
+    */
+    property Component rowDelegate: __style ? __style.rowDelegate : null
+
+    /*! \qmlproperty Component BasicTableView::headerDelegate
+
+        This property defines a delegate to draw a header.
+
+        In the header delegate you have access to the following special properties:
+        \list
+        \li  styleData.value - the value or text for this item
+        \li  styleData.column - the index of the column
+        \li  styleData.pressed - true when the column is being pressed
+        \li  styleData.containsMouse - true when the column is under the mouse
+        \li  styleData.textAlignment - the horizontal text alignment of the column (since QtQuickControls 1.1)
+        \endlist
+    */
+    property Component headerDelegate: __style ? __style.headerDelegate : null
+
+    /*! \qmlproperty int BasicTableView::sortIndicatorColumn
+
+        Index of the current sort column.
+        The default value is \c {0}.
+    */
+    property int sortIndicatorColumn
+
+    /*! \qmlproperty bool BasicTableView::sortIndicatorVisible
+
+        This property shows or hides the sort indicator
+        The default value is \c false.
+        \note The view itself does not sort the data.
+    */
+    property bool sortIndicatorVisible: false
+
+    /*! \qmlproperty enumeration BasicTableView::sortIndicatorOrder
+
+        This sets the sorting order of the sort indicator
+        The allowed values are:
+        \list
+        \li Qt.AscendingOrder - the default
+        \li Qt.DescendingOrder
+        \endlist
+    */
+    property int sortIndicatorOrder: Qt.AscendingOrder
+
+    /*! \qmlproperty Component BasicTableView::contentHeader
+        This is the content header of the view.
+    */
+    property alias contentHeader: listView.header
+
+    /*! \qmlproperty Component BasicTableView::contentFooter
+        This is the content footer of the view.
+    */
+    property alias contentFooter: listView.footer
+
+    /*! \qmlproperty int BasicTableView::columnCount
+        The current number of columns
+    */
+    readonly property alias columnCount: columnModel.count
+
+    /*! \qmlpropertygroup BasicTableView::section
+        \internal
+        \qmlproperty string BasicTableView::section.property
+        \qmlproperty enumeration BasicTableView::section.criteria
+        \qmlproperty Component BasicTableView::section.delegate
+        \qmlproperty enumeration BasicTableView::section.labelPositioning
+
+        Moved to the qdoc files to keep the grouped property layout.
+        See qtquickcontrols-treeview.qdoc and qtquickcontrols-tableview.qdoc
+    */
+    property alias section: listView.section
+
+    /*!
+        \qmlproperty enumeration BasicTableView::selectionMode
+        \since QtQuick.Controls 1.1
+
+        This enum indicates how the view responds to user selections:
+
+        The possible modes are:
+
+        \list
+
+        \li SelectionMode.NoSelection - Items cannot be selected.
+
+        \li SelectionMode.SingleSelection - When the user selects an item,
+            any already-selected item becomes unselected, and the user cannot
+            unselect the selected item. (Default)
+
+        \li SelectionMode.MultiSelection - When the user selects an item in the usual way,
+            the selection status of that item is toggled and the other items are left alone.
+
+        \li SelectionMode.ExtendedSelection - When the user selects an item in the usual way,
+            the selection is cleared and the new item selected. However, if the user presses the
+            Ctrl key when clicking on an item, the clicked item gets toggled and all other items
+            are left untouched. If the user presses the Shift key while clicking
+            on an item, all items between the current item and the clicked item are selected or unselected,
+            depending on the state of the clicked item. Multiple items can be selected by dragging the
+            mouse over them.
+
+        \li SelectionMode.ContiguousSelection - When the user selects an item in the usual way,
+            the selection is cleared and the new item selected. However, if the user presses the Shift key while
+            clicking on an item, all items between the current item and the clicked item are selected.
+
+        \endlist
+    */
+    property int selectionMode: SelectionMode.SingleSelection
+
+    /*!
+        \qmlmethod TableViewColumn BasicTableView::addColumn(object column)
+
+        Adds a \a column and returns the added column.
+
+        The \a column argument can be an instance of TableViewColumn,
+        or a Component. The component has to contain a TableViewColumn.
+        Otherwise  \c null is returned.
+    */
+    function addColumn(column) {
+        return insertColumn(columnCount, column)
+    }
+
+    /*!
+        \qmlmethod TableViewColumn BasicTableView::insertColumn(int index, object column)
+
+        Inserts a \a column at the given \a index and returns the inserted column.
+
+        The \a column argument can be an instance of TableViewColumn,
+        or a Component. The component has to contain a TableViewColumn.
+        Otherwise  \c null is returned.
+    */
+    function insertColumn(index, column) {
+        if (__isTreeView && index === 0 && columnCount > 0) {
+            console.warn(__viewTypeName + "::insertColumn(): Can't replace column 0")
+            return null
+        }
+        var object = column
+        if (typeof column['createObject'] === 'function') {
+            object = column.createObject(root)
+        } else if (object.__view) {
+            console.warn(__viewTypeName + "::insertColumn(): you cannot add a column to multiple views")
+            return null
+        }
+        if (index >= 0 && index <= columnCount && object.accessibleRole === Accessible.ColumnHeader) {
+            object.__view = root
+            columnModel.insert(index, {columnItem: object})
+            if (root.__columns[index] !== object) {
+                // The new column needs to be put into __columns at the specified index
+                // so the list needs to be recreated to be correct
+                var arr = []
+                for (var i = 0; i < index; ++i)
+                    arr.push(root.__columns[i])
+                arr.push(object)
+                for (i = index; i < root.__columns.length; ++i)
+                    arr.push(root.__columns[i])
+                root.__columns = arr
+            }
+            return object
+        }
+
+        if (object !== column)
+            object.destroy()
+        console.warn(__viewTypeName + "::insertColumn(): invalid argument")
+        return null
+    }
+
+    /*!
+        \qmlmethod void BasicTableView::removeColumn(int index)
+
+        Removes and destroys a column at the given \a index.
+    */
+    function removeColumn(index) {
+        if (index < 0 || index >= columnCount) {
+            console.warn(__viewTypeName + "::removeColumn(): invalid argument")
+            return
+        }
+        if (__isTreeView && index === 0) {
+            console.warn(__viewTypeName + "::removeColumn(): Can't remove column 0")
+            return
+        }
+        var column = columnModel.get(index).columnItem
+        columnModel.remove(index, 1)
+        column.destroy()
+    }
+
+    /*!
+        \qmlmethod void BasicTableView::moveColumn(int from, int to)
+
+        Moves a column \a from index \a to another.
+    */
+    function moveColumn(from, to) {
+        if (from < 0 || from >= columnCount || to < 0 || to >= columnCount) {
+            console.warn(__viewTypeName + "::moveColumn(): invalid argument")
+            return
+        }
+        if (__isTreeView && to === 0) {
+            console.warn(__viewTypeName + "::moveColumn(): Can't move column 0")
+            return
+        }
+        if (sortIndicatorColumn === from)
+            sortIndicatorColumn = to
+        columnModel.move(from, to, 1)
+    }
+
+    /*!
+        \qmlmethod TableViewColumn BasicTableView::getColumn(int index)
+
+        Returns the column at the given \a index
+        or \c null if the \a index is invalid.
+    */
+    function getColumn(index) {
+        if (index < 0 || index >= columnCount)
+            return null
+        return columnModel.get(index).columnItem
+    }
+
+    /*!
+        \qmlmethod void BasicTableView::resizeColumnsToContents()
+
+        Resizes all columns to ensure that the column contents and the headers will fit.
+        \since QtQuick.Controls 1.2
+    */
+    function resizeColumnsToContents () {
+        for (var i = 0; i < __columns.length; ++i) {
+            var col = getColumn(i)
+            var header = __listView.headerItem.headerRepeater.itemAt(i)
+            if (col) {
+                col.resizeToContents()
+                if (col.width < header.implicitWidth)
+                    col.width = header.implicitWidth
+            }
+        }
+    }
+
+    // Internal stuff. Do not look
+
+    Component.onCompleted: {
+        for (var i = 0; i < __columns.length; ++i) {
+            var column = __columns[i]
+            if (column.accessibleRole === Accessible.ColumnHeader)
+                addColumn(column)
+        }
+    }
+
+    activeFocusOnTab: true
+
+    implicitWidth: 200
+    implicitHeight: 150
+
+    frameVisible: true
+    __scrollBarTopMargin: headerVisible && (listView.transientScrollBars || Qt.platform.os === "osx")
+                          ? listView.headerItem.height : 0
+
+    /*! \internal
+        Use this to display user-friendly messages in TableView and TreeView common functions.
+    */
+    property string __viewTypeName
+
+    /*! \internal */
+    readonly property bool __isTreeView: __viewTypeName === "TreeView"
+
+    /*! \internal */
+    default property alias __columns: root.data
+
+    /*! \internal */
+    property alias __currentRowItem: listView.currentItem
+
+    /*! \internal
+        This property is forwarded to TableView::currentRow, but not to any TreeView property.
+    */
+    property alias __currentRow: listView.currentIndex
+
+    /*! \internal */
+    readonly property alias __listView: listView
+
+    /*! \internal */
+    property Component __itemDelegateLoader: null
+
+    /*! \internal
+        Allows to override the model property in cases like TreeView,
+        where we want to use a proxy/adaptor model between the user's model
+        and whatever a ListView can swallow.
+    */
+    property var __model
+
+    /*! \internal */
+    property bool __activateItemOnSingleClick: __style ? __style.activateItemOnSingleClick : false
+
+    /*! \internal */
+    property Item __mouseArea
+
+    ListView {
+        id: listView
+        focus: true
+        activeFocusOnTab: false
+        Keys.forwardTo: [__mouseArea]
+        anchors.fill: parent
+        contentWidth: headerItem.headerRow.width + listView.vScrollbarPadding
+        // ### FIXME Late configuration of the header item requires
+        // this binding to get the header visible after creation
+        contentY: -headerItem.height
+
+        currentIndex: -1
+        visible: columnCount > 0
+        interactive: Settings.hasTouchScreen
+        property var rowItemStack: [] // Used as a cache for rowDelegates
+
+        readonly property bool transientScrollBars: __style && !!__style.transientScrollBars
+        readonly property real vScrollbarPadding: __scroller.verticalScrollBar.visible
+                                                  && !transientScrollBars && Qt.platform.os === "osx" ?
+                                                  __verticalScrollBar.width + __scroller.scrollBarSpacing + root.__style.padding.right : 0
+
+        Qml.Binding {
+            // On Mac, we reserve the vSB space in the contentItem because the vSB should
+            // appear under the header. Unfortunately, the ListView header won't expand
+            // beyond the ListView's boundaries, that's why we need to ressort to this.
+            target: root.__scroller
+            when: Qt.platform.os === "osx"
+            property: "verticalScrollbarOffset"
+            value: 0
+            restoreMode: Binding.RestoreBinding
+        }
+
+        function incrementCurrentIndexBlocking() {
+            var oldIndex = __listView.currentIndex
+            __scroller.blockUpdates = true;
+            incrementCurrentIndex();
+            __scroller.blockUpdates = false;
+            return oldIndex !== __listView.currentIndex
+        }
+
+        function decrementCurrentIndexBlocking() {
+            var oldIndex = __listView.currentIndex
+            __scroller.blockUpdates = true;
+            decrementCurrentIndex();
+            __scroller.blockUpdates = false;
+            return oldIndex !== __listView.currentIndex
+        }
+
+        function scrollIfNeeded(key) {
+            var diff = key === Qt.Key_PageDown ? height :
+                       key === Qt.Key_PageUp ? -height : 0
+            if (diff !== 0)
+                __verticalScrollBar.value += diff
+        }
+
+        SystemPalette {
+            id: palette
+            colorGroup: enabled ? SystemPalette.Active : SystemPalette.Disabled
+        }
+
+        Rectangle {
+            id: colorRect
+            parent: viewport
+            anchors.fill: parent
+            color: __style ? __style.backgroundColor : palette.base
+            z: -2
+        }
+
+        // Fills extra rows with alternate color
+        Column {
+            id: rowfiller
+            Loader {
+                id: rowSizeItem
+                sourceComponent: root.rowDelegate
+                visible: false
+                property QtObject styleData: QtObject {
+                    property bool alternate: false
+                    property bool selected: false
+                    property bool hasActiveFocus: false
+                    property bool pressed: false
+                }
+            }
+            property int rowHeight: Math.floor(rowSizeItem.implicitHeight)
+            property int paddedRowCount: rowHeight != 0 ? height/rowHeight : 0
+
+            y: listView.contentHeight - listView.contentY + listView.originY
+            width: parent.width
+            visible: alternatingRowColors
+            height: listView.model && listView.model.count ? (viewport.height - listView.contentHeight) : 0
+            Repeater {
+                model: visible ? parent.paddedRowCount : 0
+                Loader {
+                    width: rowfiller.width
+                    height: rowfiller.rowHeight
+                    sourceComponent: root.rowDelegate
+                    property QtObject styleData: QtObject {
+                        readonly property bool alternate: (index + __listView.count) % 2 === 1
+                        readonly property bool selected: false
+                        readonly property bool hasActiveFocus: false
+                        readonly property bool pressed: false
+                    }
+                    readonly property var model: null
+                    readonly property var modelData: null
+                }
+            }
+        }
+
+        ListModel {
+            id: columnModel
+        }
+
+        highlightFollowsCurrentItem: true
+        model: root.__model
+
+        delegate: FocusScope {
+            id: rowItemContainer
+
+            activeFocusOnTab: false
+            z: rowItem.activeFocus ? 0.7 : rowItem.itemSelected ? 0.5 : 0
+
+            property Item rowItem
+            // We recycle instantiated row items to speed up list scrolling
+
+            Component.onDestruction: {
+                // move the rowItem back in cache
+                if (rowItem) {
+                    rowItem.visible = false;
+                    rowItem.parent = null;
+                    rowItem.rowIndex = -1;
+                    listView.rowItemStack.push(rowItem); // return rowItem to cache
+                }
+            }
+
+            Component.onCompleted: {
+                // retrieve row item from cache
+                if (listView.rowItemStack.length > 0)
+                    rowItem = listView.rowItemStack.pop();
+                else
+                    rowItem = rowComponent.createObject(listView);
+
+                // Bind container to item size
+                rowItemContainer.width = Qt.binding( function() { return rowItem.width });
+                rowItemContainer.height = Qt.binding( function() { return rowItem.height });
+
+                // Reassign row-specific bindings
+                rowItem.rowIndex = Qt.binding( function() { return model.index });
+                rowItem.itemModelData = Qt.binding( function() { return typeof modelData === "undefined" ? null : modelData });
+                rowItem.itemModel = Qt.binding( function() { return model });
+                rowItem.parent = rowItemContainer;
+                rowItem.visible = true;
+            }
+        }
+
+        Component {
+            id: rowComponent
+
+            FocusScope {
+                id: rowitem
+                visible: false
+
+                property int rowIndex
+                property var itemModelData
+                property var itemModel
+                property bool itemSelected: __mouseArea.selected(rowIndex)
+                property bool alternate: alternatingRowColors && rowIndex % 2 === 1
+                readonly property color itemTextColor: itemSelected ? __style.highlightedTextColor : __style.textColor
+                property Item branchDecoration: null
+
+                width: itemrow.width
+                height: rowstyle.height
+
+                onActiveFocusChanged: {
+                    if (activeFocus)
+                        listView.currentIndex = rowIndex
+                }
+
+                Loader {
+                    id: rowstyle
+                    // row delegate
+                    sourceComponent: rowitem.itemModel !== undefined ? root.rowDelegate : null
+                    // Row fills the view width regardless of item size
+                    // But scrollbar should not adjust to it
+                    height: item ? item.height : 16
+                    width: parent.width + __horizontalScrollBar.width
+                    x: listView.contentX
+
+                    // these properties are exposed to the row delegate
+                    // Note: these properties should be mirrored in the row filler as well
+                    property QtObject styleData: QtObject {
+                        readonly property int row: rowitem.rowIndex
+                        readonly property bool alternate: rowitem.alternate
+                        readonly property bool selected: rowitem.itemSelected
+                        readonly property bool hasActiveFocus: rowitem.activeFocus
+                        readonly property bool pressed: rowitem.rowIndex === __mouseArea.pressedRow
+                    }
+                    readonly property var model: rowitem.itemModel
+                    readonly property var modelData: rowitem.itemModelData
+                }
+                Row {
+                    id: itemrow
+                    height: parent.height
+                    Repeater {
+                        model: columnModel
+
+                        delegate: __itemDelegateLoader
+
+                        onItemAdded: {
+                            var columnItem = columnModel.get(index).columnItem
+                            item.__rowItem = rowitem
+                            item.__column = columnItem
+                        }
+                    }
+                }
+            }
+        }
+
+        headerPositioning: ListView.OverlayHeader
+        header: Item {
+            id: tableHeader
+            visible: headerVisible
+            width: Math.max(headerRow.width + listView.vScrollbarPadding, root.viewport.width)
+            height: visible ? headerRow.height : 0
+
+            property alias headerRow: row
+            property alias headerRepeater: repeater
+            Row {
+                id: row
+
+                Repeater {
+                    id: repeater
+
+                    property int targetIndex: -1
+                    property int dragIndex: -1
+
+                    model: columnModel
+
+                    delegate: Item {
+                        id: headerRowDelegate
+                        readonly property int column: index
+                        z:-index
+                        width: modelData.width
+                        implicitWidth: columnCount === 1 ? viewport.width + __verticalScrollBar.width : headerStyle.implicitWidth
+                        visible: modelData.visible
+                        height: headerStyle.height
+
+                        readonly property bool treeViewMovable: !__isTreeView || index > 0
+
+                        Loader {
+                            id: headerStyle
+                            sourceComponent: root.headerDelegate
+                            width: parent.width
+                            property QtObject styleData: QtObject {
+                                readonly property string value: modelData.title
+                                readonly property bool pressed: headerClickArea.pressed
+                                readonly property bool containsMouse: headerClickArea.containsMouse
+                                readonly property int column: index
+                                readonly property int textAlignment: modelData.horizontalAlignment
+                                readonly property bool resizable: modelData.resizable
+                            }
+                        }
+
+                        Rectangle{
+                            id: targetmark
+                            width: parent.width
+                            height:parent.height
+                            opacity: (treeViewMovable && index === repeater.targetIndex && repeater.targetIndex !== repeater.dragIndex) ? 0.5 : 0
+                            Behavior on opacity { NumberAnimation { duration: 160 } }
+                            color: palette.highlight
+                            visible: modelData.movable
+                        }
+
+                        MouseArea{
+                            id: headerClickArea
+                            drag.axis: Qt.YAxis
+                            hoverEnabled: Settings.hoverEnabled
+                            anchors.fill: parent
+                            onClicked: {
+                                if (sortIndicatorColumn === index)
+                                    sortIndicatorOrder = sortIndicatorOrder === Qt.AscendingOrder ? Qt.DescendingOrder : Qt.AscendingOrder
+                                sortIndicatorColumn = index
+                            }
+                            // Here we handle moving header sections
+                            // NOTE: the direction is different from the master branch
+                            // so this indicates that I am using an invalid assumption on item ordering
+                            onPositionChanged: {
+                                if (drag.active && modelData.movable && pressed && columnCount > 1) { // only do this while dragging
+                                    for (var h = columnCount-1 ; h >= 0 ; --h) {
+                                        if (headerRow.children[h].visible && drag.target.x + headerRowDelegate.width/2 > headerRow.children[h].x) {
+                                            repeater.targetIndex = h
+                                            break
+                                        }
+                                    }
+                                }
+                            }
+
+                            onPressed: {
+                                repeater.dragIndex = index
+                            }
+
+                            onReleased: {
+                                if (repeater.targetIndex >= 0 && repeater.targetIndex !== index ) {
+                                    var targetColumn = columnModel.get(repeater.targetIndex).columnItem
+                                    if (targetColumn.movable && (!__isTreeView || repeater.targetIndex > 0)) {
+                                        if (sortIndicatorColumn === index)
+                                            sortIndicatorColumn = repeater.targetIndex
+                                        columnModel.move(index, repeater.targetIndex, 1)
+                                    }
+                                }
+                                repeater.targetIndex = -1
+                                repeater.dragIndex = -1
+                            }
+                            drag.target: treeViewMovable && modelData.movable && columnCount > 1 ? draghandle : null
+                        }
+
+                        Loader {
+                            id: draghandle
+                            property QtObject styleData: QtObject{
+                                readonly property string value: modelData.title
+                                readonly property bool pressed: headerClickArea.pressed
+                                readonly property bool containsMouse: headerClickArea.containsMouse
+                                readonly property int column: index
+                                readonly property int textAlignment: modelData.horizontalAlignment
+                            }
+                            parent: tableHeader
+                            x: __implicitX
+                            property double __implicitX: headerRowDelegate.x
+                            width: modelData.width
+                            height: parent.height
+                            sourceComponent: root.headerDelegate
+                            visible: headerClickArea.pressed
+                            onVisibleChanged: {
+                                if (!visible)
+                                    x = Qt.binding(function () { return __implicitX })
+                            }
+                            opacity: 0.5
+                        }
+
+
+                        MouseArea {
+                            id: headerResizeHandle
+                            property int offset: 0
+                            readonly property int minimumSize: 20
+                            preventStealing: true
+                            anchors.rightMargin: -width/2
+                            width: Settings.hasTouchScreen ? Screen.pixelDensity * 3.5 : 16
+                            height: parent.height
+                            anchors.right: parent.right
+                            enabled: modelData.resizable && columnCount > 0
+                            onPositionChanged:  {
+                                var newHeaderWidth = modelData.width + (mouseX - offset)
+                                modelData.width = Math.max(minimumSize, newHeaderWidth)
+                            }
+
+                            onDoubleClicked: getColumn(index).resizeToContents()
+                            onPressedChanged: if (pressed) offset=mouseX
+                            cursorShape: enabled && repeater.dragIndex==-1 ? Qt.SplitHCursor : Qt.ArrowCursor
+                        }
+                    }
+                }
+            }
+
+            Loader {
+                property QtObject styleData: QtObject{
+                    readonly property string value: ""
+                    readonly property bool pressed: false
+                    readonly property bool containsMouse: false
+                    readonly property int column: -1
+                    readonly property int textAlignment: Text.AlignLeft
+                }
+
+                anchors.top: parent.top
+                anchors.right: parent.right
+                anchors.bottom: headerRow.bottom
+                sourceComponent: root.headerDelegate
+                readonly property real __remainingWidth: parent.width - headerRow.width
+                visible: __remainingWidth > 0
+                width: __remainingWidth
+                z:-1
+            }
+        }
+
+        function columnAt(offset) {
+            var item = listView.headerItem.headerRow.childAt(offset, 0)
+            return item ? item.column : -1
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Private/BasicTableView.qmlc b/deployment_test/QtQuick/Controls/Private/BasicTableView.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..4367a36474009dbb1562e832cbdf5f2f65dabfae
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Private/BasicTableView.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Private/CalendarHeaderModel.qml b/deployment_test/QtQuick/Controls/Private/CalendarHeaderModel.qml
new file mode 100644
index 0000000000000000000000000000000000000000..40328a8b16ffce505468db1b36a255c4ad8f8158
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Private/CalendarHeaderModel.qml
@@ -0,0 +1,109 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+
+/*
+    CalendarHeaderModel contains a list of the days of a week,
+    according to a \l locale. The \l locale affects which day of the week
+    is first in the model.
+
+    The only role provided by the model is \c dayOfWeek, which is one of the
+    following JavaScript values:
+
+    \list
+    \li \c Locale.Sunday
+    \li \c Locale.Monday
+    \li \c Locale.Tuesday
+    \li \c Locale.Wednesday
+    \li \c Locale.Thursday
+    \li \c Locale.Friday
+    \li \c Locale.Saturday
+    \endlist
+ */
+
+ListModel {
+    id: root
+
+    /*
+        The locale that this model should be based on.
+        This affects which day of the week is first in the model.
+    */
+    property var locale
+
+    ListElement {
+        dayOfWeek: Locale.Sunday
+    }
+    ListElement {
+        dayOfWeek: Locale.Monday
+    }
+    ListElement {
+        dayOfWeek: Locale.Tuesday
+    }
+    ListElement {
+        dayOfWeek: Locale.Wednesday
+    }
+    ListElement {
+        dayOfWeek: Locale.Thursday
+    }
+    ListElement {
+        dayOfWeek: Locale.Friday
+    }
+    ListElement {
+        dayOfWeek: Locale.Saturday
+    }
+
+    Component.onCompleted: updateFirstDayOfWeek()
+    onLocaleChanged: updateFirstDayOfWeek()
+
+    function updateFirstDayOfWeek() {
+        var daysOfWeek = [Locale.Sunday, Locale.Monday, Locale.Tuesday,
+            Locale.Wednesday, Locale.Thursday, Locale.Friday, Locale.Saturday];
+        var firstDayOfWeek = root.locale.firstDayOfWeek;
+
+        var shifted = daysOfWeek.splice(firstDayOfWeek, daysOfWeek.length - firstDayOfWeek);
+        daysOfWeek = shifted.concat(daysOfWeek)
+
+        if (firstDayOfWeek !== root.get(0).dayOfWeek) {
+            for (var i = 0; i < daysOfWeek.length; ++i) {
+                root.setProperty(i, "dayOfWeek", daysOfWeek[i]);
+            }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Private/CalendarHeaderModel.qmlc b/deployment_test/QtQuick/Controls/Private/CalendarHeaderModel.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..dba05b5ccfcc9be5ad8c3abdc78a1f6bcd96f8e6
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Private/CalendarHeaderModel.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Private/CalendarUtils.js b/deployment_test/QtQuick/Controls/Private/CalendarUtils.js
new file mode 100644
index 0000000000000000000000000000000000000000..9a93d8daed40252bdb3b7b690882bfe0fb19915e
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Private/CalendarUtils.js
@@ -0,0 +1,137 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+.pragma library
+
+var daysInAWeek = 7;
+var monthsInAYear = 12;
+
+// Not the number of weeks per month, but the number of weeks that are
+// shown on a typical calendar.
+var weeksOnACalendarMonth = 6;
+
+// Can't create year 1 directly...
+var minimumCalendarDate = new Date(-1, 0, 1);
+minimumCalendarDate.setFullYear(minimumCalendarDate.getFullYear() + 2);
+var maximumCalendarDate = new Date(275759, 9, 25);
+
+function daysInMonth(date) {
+    // Passing 0 as the day will give us the previous month, which will be
+    // date.getMonth() since we added 1 to it.
+    return new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();
+}
+
+/*!
+    Returns a copy of \a date with its month set to \a month, keeping the same
+    day if possible. Does not modify \a date.
+*/
+function setMonth(date, month) {
+    var oldDay = date.getDate();
+    var newDate = new Date(date);
+    // Set the day first, because setting the month could cause it to skip ahead
+    // a month if the day is larger than the latest day in that month.
+    newDate.setDate(1);
+    newDate.setMonth(month);
+    // We'd like to have the previous day still selected when we change
+    // months, but it might not be possible, so use the smallest of the two.
+    newDate.setDate(Math.min(oldDay, daysInMonth(newDate)));
+    return newDate;
+}
+
+/*!
+    Returns the cell rectangle for the cell at the given \a index, assuming
+    that the grid has a number of columns equal to \a columns and rows
+    equal to \a rows, with an available width of \a availableWidth and height
+    of \a availableHeight.
+
+    If \a gridLineWidth is greater than \c 0, the cell rectangle will be
+    calculated under the assumption that there is a grid between the cells:
+
+        31 |  1 |  2 |  3 |  4 |  5 |  6
+        --------------------------------
+         7 |  8 |  9 | 10 | 11 | 12 | 13
+        --------------------------------
+        14 | 15 | 16 | 17 | 18 | 19 | 20
+        --------------------------------
+        21 | 22 | 23 | 24 | 25 | 26 | 27
+        --------------------------------
+        28 | 29 | 30 | 31 |  1 |  2 |  3
+        --------------------------------
+         4 |  5 |  6 |  7 |  8 |  9 | 10
+*/
+function cellRectAt(index, columns, rows, availableWidth, availableHeight, gridLineWidth) {
+    var col = Math.floor(index % columns);
+    var row = Math.floor(index / columns);
+
+    var availableWidthMinusGridLines = availableWidth - ((columns - 1) * gridLineWidth);
+    var availableHeightMinusGridLines = availableHeight - ((rows - 1) * gridLineWidth);
+    var remainingHorizontalSpace = Math.floor(availableWidthMinusGridLines % columns);
+    var remainingVerticalSpace = Math.floor(availableHeightMinusGridLines % rows);
+    var baseCellWidth = Math.floor(availableWidthMinusGridLines / columns);
+    var baseCellHeight = Math.floor(availableHeightMinusGridLines / rows);
+
+    var rect = Qt.rect(0, 0, 0, 0);
+
+    rect.x = baseCellWidth * col;
+    rect.width = baseCellWidth;
+    if (remainingHorizontalSpace > 0) {
+        if (col < remainingHorizontalSpace) {
+            ++rect.width;
+        }
+
+        // This cell's x position should be increased by 1 for every column above it.
+        rect.x += Math.min(remainingHorizontalSpace, col);
+    }
+
+    rect.y = baseCellHeight * row;
+    rect.height = baseCellHeight;
+    if (remainingVerticalSpace > 0) {
+        if (row < remainingVerticalSpace) {
+            ++rect.height;
+        }
+
+        // This cell's y position should be increased by 1 for every row above it.
+        rect.y += Math.min(remainingVerticalSpace, row);
+    }
+
+    rect.x += col * gridLineWidth;
+    rect.y += row * gridLineWidth;
+
+    return rect;
+}
diff --git a/deployment_test/QtQuick/Controls/Private/CalendarUtils.jsc b/deployment_test/QtQuick/Controls/Private/CalendarUtils.jsc
new file mode 100644
index 0000000000000000000000000000000000000000..2b0e7a9237daaa336f523ed7cc68cf80dff905b0
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Private/CalendarUtils.jsc differ
diff --git a/deployment_test/QtQuick/Controls/Private/ColumnMenuContent.qml b/deployment_test/QtQuick/Controls/Private/ColumnMenuContent.qml
new file mode 100644
index 0000000000000000000000000000000000000000..5f8b4d684fd8a098cdc3cd17f3c849a6d4122588
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Private/ColumnMenuContent.qml
@@ -0,0 +1,252 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQml 2.14 as Qml
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+Item {
+    id: content
+
+    property Component menuItemDelegate
+    property Component scrollIndicatorStyle
+    property Component scrollerStyle
+    property var itemsModel
+    property int minWidth: 100
+    property real maxHeight: 800
+    readonly property bool mousePressed: hoverArea.pressed
+
+    signal triggered(var item)
+
+    function menuItemAt(index) {
+        list.currentIndex = index
+        return list.currentItem
+    }
+
+    width: Math.max(list.contentWidth, minWidth)
+    height: Math.min(list.contentHeight, fittedMaxHeight)
+
+    readonly property int currentIndex: __menu.__currentIndex
+    property Item currentItem: null
+    property int itemHeight: 23
+
+    Component.onCompleted: {
+        var children = list.contentItem.children
+        for (var i = 0; i < list.count; i++) {
+            var child = children[i]
+            if (child.visible && child.styleData.type === MenuItemType.Item) {
+                itemHeight = children[i].height
+                break
+            }
+        }
+    }
+
+    readonly property int fittingItems: Math.floor((maxHeight - downScroller.height) / itemHeight)
+    readonly property real fittedMaxHeight: itemHeight * fittingItems + downScroller.height
+    readonly property bool shouldUseScrollers: scrollView.style === emptyScrollerStyle && itemsModel.length > fittingItems
+    readonly property real upScrollerHeight: upScroller.visible ? upScroller.height : 0
+    readonly property real downScrollerHeight: downScroller.visible ? downScroller.height : 0
+    property var oldMousePos: undefined
+    property var openedSubmenu: null
+
+    function updateCurrentItem(mouse) {
+        var pos = mapToItem(list.contentItem, mouse.x, mouse.y)
+        var dx = 0
+        var dy = 0
+        var dist = 0
+        if (openedSubmenu && oldMousePos !== undefined) {
+            dx = mouse.x - oldMousePos.x
+            dy = mouse.y - oldMousePos.y
+            dist = Math.sqrt(dx * dx + dy * dy)
+        }
+        oldMousePos = mouse
+        if (openedSubmenu && dist > 5) {
+            var menuRect = __menu.__popupGeometry
+            var submenuRect = openedSubmenu.__popupGeometry
+            var angle = Math.atan2(dy, dx)
+            var ds = 0
+            if (submenuRect.x > menuRect.x) {
+                ds = menuRect.width - oldMousePos.x
+            } else {
+                angle = Math.PI - angle
+                ds = oldMousePos.x
+            }
+            var above = submenuRect.y - menuRect.y - oldMousePos.y
+            var below = submenuRect.height - above
+            var minAngle = Math.atan2(above, ds)
+            var maxAngle = Math.atan2(below, ds)
+            // This tests that the current mouse position is in
+            // the triangle defined by the previous mouse position
+            // and the submenu's top-left and bottom-left corners.
+            if (minAngle < angle && angle < maxAngle) {
+                sloppyTimer.start()
+                return
+            }
+        }
+
+        if (!currentItem || !currentItem.contains(Qt.point(pos.x - currentItem.x, pos.y - currentItem.y))) {
+            if (currentItem && !hoverArea.pressed
+                && currentItem.styleData.type === MenuItemType.Menu) {
+                currentItem.__closeSubMenu()
+                openedSubmenu = null
+            }
+            currentItem = list.itemAt(pos.x, pos.y)
+            if (currentItem) {
+                __menu.__currentIndex = currentItem.__menuItemIndex
+                if (currentItem.styleData.type === MenuItemType.Menu) {
+                    showCurrentItemSubMenu(false)
+                }
+            } else {
+                __menu.__currentIndex = -1
+            }
+        }
+    }
+
+    function showCurrentItemSubMenu(immediately) {
+        if (!currentItem.__menuItem.__popupVisible) {
+            currentItem.__showSubMenu(immediately)
+            openedSubmenu = currentItem.__menuItem
+        }
+    }
+
+    Timer {
+        id: sloppyTimer
+        interval: 1000
+
+        // Stop timer as soon as we hover one of the submenu items
+        property int currentIndex: openedSubmenu ? openedSubmenu.__currentIndex : -1
+        onCurrentIndexChanged: if (currentIndex !== -1) stop()
+
+        onTriggered: {
+            if (openedSubmenu && openedSubmenu.__currentIndex === -1)
+                updateCurrentItem(oldMousePos)
+        }
+    }
+
+    Component {
+        id: emptyScrollerStyle
+        Style {
+            padding { left: 0; right: 0; top: 0; bottom: 0 }
+            property bool scrollToClickedPosition: false
+            property Component frame: Item { visible: false }
+            property Component corner: Item { visible: false }
+            property Component __scrollbar: Item { visible: false }
+        }
+    }
+
+    ScrollView {
+        id: scrollView
+        anchors {
+            fill: parent
+            topMargin: upScrollerHeight
+            bottomMargin: downScrollerHeight
+        }
+
+        style: scrollerStyle || emptyScrollerStyle
+        __wheelAreaScrollSpeed: itemHeight
+
+        ListView {
+            id: list
+            model: itemsModel
+            delegate: menuItemDelegate
+            snapMode: ListView.SnapToItem
+            boundsBehavior: Flickable.StopAtBounds
+            highlightFollowsCurrentItem: true
+            highlightMoveDuration: 0
+        }
+    }
+
+    MouseArea {
+        id: hoverArea
+        anchors.left: scrollView.left
+        width: scrollView.width - scrollView.__verticalScrollBar.width
+        height: parent.height
+
+        hoverEnabled: Settings.hoverEnabled
+        acceptedButtons: Qt.AllButtons
+
+        onPositionChanged: updateCurrentItem({ "x": mouse.x, "y": mouse.y })
+        onPressed: updateCurrentItem({ "x": mouse.x, "y": mouse.y })
+        onReleased: {
+            if (currentItem && currentItem.__menuItem.enabled) {
+                if (currentItem.styleData.type === MenuItemType.Menu) {
+                    showCurrentItemSubMenu(true)
+                } else {
+                    content.triggered(currentItem)
+                }
+            }
+        }
+        onExited: {
+            if (currentItem && !currentItem.__menuItem.__popupVisible) {
+                currentItem = null
+                __menu.__currentIndex = -1
+            }
+        }
+
+        MenuContentScroller {
+            id: upScroller
+            direction: Qt.UpArrow
+            visible: shouldUseScrollers && !list.atYBeginning
+            function scrollABit() { list.contentY -= itemHeight }
+        }
+
+        MenuContentScroller {
+            id: downScroller
+            direction: Qt.DownArrow
+            visible: shouldUseScrollers && !list.atYEnd
+            function scrollABit() { list.contentY += itemHeight }
+        }
+    }
+
+    Timer {
+        interval: 1
+        running: true
+        repeat: false
+        onTriggered: list.positionViewAtIndex(currentIndex, !scrollView.__style
+                                                            ? ListView.Center : ListView.Beginning)
+    }
+
+    Qml.Binding {
+        target: scrollView.__verticalScrollBar
+        property: "singleStep"
+        value: itemHeight
+        restoreMode: Binding.RestoreBinding
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Private/ColumnMenuContent.qmlc b/deployment_test/QtQuick/Controls/Private/ColumnMenuContent.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..d5ada9cba3a8dc159269b06726e1d466067f5753
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Private/ColumnMenuContent.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Private/ContentItem.qml b/deployment_test/QtQuick/Controls/Private/ContentItem.qml
new file mode 100644
index 0000000000000000000000000000000000000000..2c5b37285dfff032d974fef8c150b6d86b37a121
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Private/ContentItem.qml
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Layouts 1.1
+
+Item {
+    id: contentItem
+    property real minimumWidth: __calcMinimum('Width')
+    property real minimumHeight: __calcMinimum('Height')
+    property real maximumWidth: Number.POSITIVE_INFINITY
+    property real maximumHeight: Number.POSITIVE_INFINITY
+    implicitWidth: __calcImplicitWidth()
+    implicitHeight: __calcImplicitHeight()
+
+    /*! \internal */
+    property Item __layoutItem: contentItem.visibleChildren.length === 1 ? contentItem.visibleChildren[0] : null
+    /*! \internal */
+    property real __marginsWidth: __layoutItem ? __layoutItem.anchors.leftMargin + __layoutItem.anchors.rightMargin : 0
+    /*! \internal */
+    property real __marginsHeight: __layoutItem ? __layoutItem.anchors.topMargin + __layoutItem.anchors.bottomMargin : 0
+
+    /*! \internal */
+    property bool __noMinimumWidthGiven : false
+    /*! \internal */
+    property bool __noMinimumHeightGiven : false
+    /*! \internal */
+    property bool __noImplicitWidthGiven : false
+    /*! \internal */
+    property bool __noImplicitHeightGiven : false
+
+    function __calcImplicitWidth() {
+        if (__layoutItem && __layoutItem.anchors.fill)
+            return __calcImplicit('Width')
+        return contentItem.childrenRect.x + contentItem.childrenRect.width
+    }
+
+    function __calcImplicitHeight() {
+        if (__layoutItem && __layoutItem.anchors.fill)
+            return __calcImplicit('Height')
+        return contentItem.childrenRect.y + contentItem.childrenRect.height
+    }
+
+    function __calcImplicit(hw) {
+        var pref = __layoutItem.Layout['preferred' + hw]
+        if (pref < 0) {
+            pref = __layoutItem['implicit' + hw]
+        }
+        contentItem['__noImplicit' + hw + 'Given'] = (pref === 0 ? true : false)
+        pref += contentItem['__margins' + hw]
+        return pref
+    }
+
+    function __calcMinimum(hw) {  // hw is 'Width' or 'Height'
+        return (__layoutItem && __layoutItem.anchors.fill) ? __calcMinMax('minimum', hw) : 0
+    }
+
+    function __calcMaximum(hw) {  // hw is 'Width' or 'Height'
+        return (__layoutItem && __layoutItem.anchors.fill) ? __calcMinMax('maximum', hw) : Number.POSITIVE_INFINITY
+    }
+
+    function __calcMinMax(minMaxConstraint, hw) {
+        var attachedPropName = minMaxConstraint + hw
+        var extent = __layoutItem.Layout[attachedPropName]
+
+        if (minMaxConstraint === 'minimum')
+            contentItem['__noMinimum' + hw + 'Given'] = (extent === 0 ? true : false)
+
+        extent += contentItem['__margins' + hw]
+        return extent
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Private/ContentItem.qmlc b/deployment_test/QtQuick/Controls/Private/ContentItem.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..d305adfdb6c04a31560765282481a3bdfa1d759d
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Private/ContentItem.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Private/Control.qml b/deployment_test/QtQuick/Controls/Private/Control.qml
new file mode 100644
index 0000000000000000000000000000000000000000..182a1e9933bf92cb8800f5e2f33d9b3c982108c5
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Private/Control.qml
@@ -0,0 +1,94 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls.Styles 1.1
+
+/*!
+        \qmltype Control
+        \internal
+        \qmlabstract
+        \inqmlmodule QtQuick.Controls.Private
+*/
+FocusScope {
+    id: root
+
+    /*! \qmlproperty Component Control::style
+
+        The style Component for this control.
+        \sa {Qt Quick Controls Styles QML Types}
+
+    */
+    property Component style
+
+    /*! \internal */
+    property QtObject __style: styleLoader.item
+
+    /*! \internal */
+    property Item __panel: panelLoader.item
+
+    /*! \internal */
+    property var styleHints
+
+    implicitWidth: __panel ? __panel.implicitWidth: 0
+    implicitHeight: __panel ? __panel.implicitHeight: 0
+    baselineOffset: __panel ? __panel.baselineOffset: 0
+    activeFocusOnTab: false
+
+    /*! \internal */
+    property alias __styleData: styleLoader.styleData
+
+    Loader {
+        id: styleLoader
+        sourceComponent: style
+        property Item __control: root
+        property QtObject styleData: null
+        onStatusChanged: {
+            if (status === Loader.Error)
+                console.error("Failed to load Style for", root)
+        }
+    }
+
+    Loader {
+        id: panelLoader
+        anchors.fill: parent
+        sourceComponent: __style ? __style.panel : null
+        onStatusChanged: if (status === Loader.Error) console.error("Failed to load Style for", root)
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Private/Control.qmlc b/deployment_test/QtQuick/Controls/Private/Control.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..38270477f94074e15d80bcf1dbaa8fcda54259fa
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Private/Control.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Private/EditMenu.qml b/deployment_test/QtQuick/Controls/Private/EditMenu.qml
new file mode 100644
index 0000000000000000000000000000000000000000..fde124ea3731437e7d5c08e0654c143595889887
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Private/EditMenu.qml
@@ -0,0 +1,88 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+Loader {
+    property Item control
+    property Item input
+    property Item cursorHandle
+    property Item selectionHandle
+    property Flickable flickable
+    property Component defaultMenu: item && item.defaultMenu ? item.defaultMenu : null
+    property QtObject menuInstance: null
+    property MouseArea mouseArea
+    property QtObject style: __style
+
+    Connections {
+        target: control
+        function onMenuChanged() {
+            if (menuInstance !== null) {
+                menuInstance.destroy()
+                menuInstance = null
+            }
+        }
+    }
+
+    function getMenuInstance()
+    {
+        // Lazy load menu when first requested
+        if (!menuInstance && control.menu) {
+            menuInstance = control.menu.createObject(input);
+        }
+        return menuInstance;
+    }
+
+    function syncStyle() {
+        if (!style)
+            return;
+
+        if (style.__editMenu)
+            sourceComponent = style.__editMenu;
+        else {
+            // todo: get ios/android/base menus from style as well
+            source = (Qt.resolvedUrl(Qt.platform.os === "ios" ? ""
+                : Qt.platform.os === "android" ? "" : "EditMenu_base.qml"));
+        }
+    }
+    onStyleChanged: syncStyle();
+    Component.onCompleted: syncStyle();
+}
diff --git a/deployment_test/QtQuick/Controls/Private/EditMenu.qmlc b/deployment_test/QtQuick/Controls/Private/EditMenu.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..e60c5cd67e90a12f6a41450c148b78f6dfa7b7c2
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Private/EditMenu.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Private/EditMenu_base.qml b/deployment_test/QtQuick/Controls/Private/EditMenu_base.qml
new file mode 100644
index 0000000000000000000000000000000000000000..346eba2da54468e116a25f930cf78ab424e619a7
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Private/EditMenu_base.qml
@@ -0,0 +1,173 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+Item {
+    id: editMenuBase
+    anchors.fill: parent
+
+    Component {
+        id: undoAction
+        Action {
+            text: qsTr("&Undo")
+            shortcut: StandardKey.Undo
+            iconName: "edit-undo"
+            enabled: input.canUndo
+            onTriggered: input.undo()
+        }
+    }
+
+    Component {
+        id: redoAction
+        Action {
+            text: qsTr("&Redo")
+            shortcut: StandardKey.Redo
+            iconName: "edit-redo"
+            enabled: input.canRedo
+            onTriggered: input.redo()
+        }
+    }
+
+    Component {
+        id: cutAction
+        Action {
+            text: qsTr("Cu&t")
+            shortcut: StandardKey.Cut
+            iconName: "edit-cut"
+            enabled: !input.readOnly && selectionStart !== selectionEnd
+            onTriggered: {
+                input.cut();
+                input.select(input.cursorPosition, input.cursorPosition);
+            }
+        }
+    }
+
+    Component {
+        id: copyAction
+        Action {
+            text: qsTr("&Copy")
+            shortcut: StandardKey.Copy
+            iconName: "edit-copy"
+            enabled: input.selectionStart !== input.selectionEnd
+            onTriggered: {
+                input.copy();
+                input.select(input.cursorPosition, input.cursorPosition);
+            }
+        }
+    }
+
+    Component {
+        id: pasteAction
+        Action {
+            text: qsTr("&Paste")
+            shortcut: StandardKey.Paste
+            iconName: "edit-paste"
+            enabled: input.canPaste
+            onTriggered: input.paste()
+        }
+    }
+
+    Component {
+        id: deleteAction
+        Action {
+            text: qsTr("Delete")
+            shortcut: StandardKey.Delete
+            iconName: "edit-delete"
+            enabled: !input.readOnly && input.selectionStart !== input.selectionEnd
+            onTriggered: input.remove(input.selectionStart, input.selectionEnd)
+        }
+    }
+
+    Component {
+        id: clearAction
+        Action {
+            text: qsTr("Clear")
+            shortcut: StandardKey.DeleteCompleteLine
+            iconName: "edit-clear"
+            enabled: !input.readOnly && input.length > 0
+            onTriggered: input.remove(0, input.length)
+        }
+    }
+
+    Component {
+        id: selectAllAction
+        Action {
+            text: qsTr("Select All")
+            shortcut: StandardKey.SelectAll
+            enabled: !(input.selectionStart === 0 && input.selectionEnd === input.length)
+            onTriggered: input.selectAll()
+        }
+    }
+
+    property Component defaultMenu: Menu {
+        MenuItem { action: undoAction.createObject(editMenuBase) }
+        MenuItem { action: redoAction.createObject(editMenuBase) }
+        MenuSeparator {}
+        MenuItem { action: cutAction.createObject(editMenuBase) }
+        MenuItem { action: copyAction.createObject(editMenuBase) }
+        MenuItem { action: pasteAction.createObject(editMenuBase) }
+        MenuItem { action: deleteAction.createObject(editMenuBase) }
+        MenuItem { action: clearAction.createObject(editMenuBase) }
+        MenuSeparator {}
+        MenuItem { action: selectAllAction.createObject(editMenuBase) }
+    }
+
+    Connections {
+        target: mouseArea
+
+        function onClicked() {
+            if (input.selectionStart === input.selectionEnd) {
+                var cursorPos = input.positionAt(mouse.x, mouse.y)
+                input.moveHandles(cursorPos, cursorPos)
+            }
+
+            input.activate()
+
+            if (control.menu) {
+                var menu = getMenuInstance();
+                menu.__dismissAndDestroy();
+                var menuPos = mapToItem(null, mouse.x, mouse.y)
+                menu.__popup(Qt.rect(menuPos.x, menuPos.y, 0, 0), -1, MenuPrivate.EditMenu);
+            }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Private/EditMenu_base.qmlc b/deployment_test/QtQuick/Controls/Private/EditMenu_base.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..270ae19ca5317e00b4219d5a36e1e5f9781cf8c1
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Private/EditMenu_base.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Private/FastGlow.qml b/deployment_test/QtQuick/Controls/Private/FastGlow.qml
new file mode 100644
index 0000000000000000000000000000000000000000..1a8b7a81d35afd8cff01b6f67e17e65a5006686c
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Private/FastGlow.qml
@@ -0,0 +1,330 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.4
+
+Item {
+    id: rootItem
+    property variant source
+    property real spread: 0.0
+    property real blur: 0.0
+    property color color: "white"
+    property bool transparentBorder: false
+    property bool cached: false
+
+    SourceProxy {
+        id: sourceProxy
+        input: rootItem.source
+    }
+
+    ShaderEffectSource {
+        id: cacheItem
+        anchors.fill: shaderItem
+        visible: rootItem.cached
+        smooth: true
+        sourceItem: shaderItem
+        live: true
+        hideSource: visible
+    }
+
+    property string __internalBlurVertexShader: "qrc:/QtQuick/Controls/Shaders/blur.vert"
+
+    property string __internalBlurFragmentShader: "qrc:/QtQuick/Controls/Shaders/blur.frag"
+
+    ShaderEffect {
+        id: level0
+        property variant source: sourceProxy.output
+        anchors.fill: parent
+        visible: false
+        smooth: true
+    }
+
+    ShaderEffectSource {
+        id: level1
+        width: Math.ceil(shaderItem.width / 32) * 32
+        height: Math.ceil(shaderItem.height / 32) * 32
+        sourceItem: level0
+        hideSource: rootItem.visible
+        sourceRect: transparentBorder ? Qt.rect(-64, -64, shaderItem.width, shaderItem.height) : Qt.rect(0,0,0,0)
+        smooth: true
+        visible: false
+    }
+
+    ShaderEffect {
+        id: effect1
+        property variant source: level1
+        property real yStep: 1/height
+        property real xStep: 1/width
+        anchors.fill: level2
+        visible: false
+        smooth: true
+        vertexShader: __internalBlurVertexShader
+        fragmentShader: __internalBlurFragmentShader
+    }
+
+    ShaderEffectSource {
+        id: level2
+        width: level1.width / 2
+        height: level1.height / 2
+        sourceItem: effect1
+        hideSource: rootItem.visible
+        visible: false
+        smooth: true
+    }
+
+    ShaderEffect {
+        id: effect2
+        property variant source: level2
+        property real yStep: 1/height
+        property real xStep: 1/width
+        anchors.fill: level3
+        visible: false
+        smooth: true
+        vertexShader: __internalBlurVertexShader
+        fragmentShader: __internalBlurFragmentShader
+    }
+
+    ShaderEffectSource {
+        id: level3
+        width: level2.width / 2
+        height: level2.height / 2
+        sourceItem: effect2
+        hideSource: rootItem.visible
+        visible: false
+        smooth: true
+    }
+
+    ShaderEffect {
+        id: effect3
+        property variant source: level3
+        property real yStep: 1/height
+        property real xStep: 1/width
+        anchors.fill: level4
+        visible: false
+        smooth: true
+        vertexShader: __internalBlurVertexShader
+        fragmentShader: __internalBlurFragmentShader
+    }
+
+    ShaderEffectSource {
+        id: level4
+        width: level3.width / 2
+        height: level3.height / 2
+        sourceItem: effect3
+        hideSource: rootItem.visible
+        visible: false
+        smooth: true
+    }
+
+    ShaderEffect {
+        id: effect4
+        property variant source: level4
+        property real yStep: 1/height
+        property real xStep: 1/width
+        anchors.fill: level5
+        visible: false
+        smooth: true
+        vertexShader: __internalBlurVertexShader
+        fragmentShader: __internalBlurFragmentShader
+    }
+
+    ShaderEffectSource {
+        id: level5
+        width: level4.width / 2
+        height: level4.height / 2
+        sourceItem: effect4
+        hideSource: rootItem.visible
+        visible: false
+        smooth: true
+    }
+
+    ShaderEffect {
+        id: effect5
+        property variant source: level5
+        property real yStep: 1/height
+        property real xStep: 1/width
+        anchors.fill: level6
+        visible: false
+        smooth: true
+        vertexShader: __internalBlurVertexShader
+        fragmentShader: __internalBlurFragmentShader
+    }
+
+    ShaderEffectSource {
+        id: level6
+        width: level5.width / 2
+        height: level5.height / 2
+        sourceItem: effect5
+        hideSource: rootItem.visible
+        visible: false
+        smooth: true
+    }
+
+    Item {
+        id: dummysource
+        width: 1
+        height: 1
+        visible: false
+    }
+
+    ShaderEffectSource {
+        id: dummy
+        width: 1
+        height: 1
+        sourceItem: dummysource
+        visible: false
+        smooth: false
+        live: false
+    }
+
+    ShaderEffect {
+        id: shaderItem
+        x: transparentBorder ? -64 : 0
+        y: transparentBorder ? -64 : 0
+        width: transparentBorder ? parent.width + 128 : parent.width
+        height: transparentBorder ? parent.height + 128 : parent.height
+
+        property variant source1: level1
+        property variant source2: level2
+        property variant source3: level3
+        property variant source4: level4
+        property variant source5: level5
+        property variant source6: level6
+        property real lod: rootItem.blur
+
+        property real weight1;
+        property real weight2;
+        property real weight3;
+        property real weight4;
+        property real weight5;
+        property real weight6;
+
+        property real spread: 1.0 - (rootItem.spread * 0.98)
+        property alias color: rootItem.color
+
+        function weight(v) {
+            if (v <= 0.0)
+                return 1
+            if (v >= 0.5)
+                return 0
+
+            return 1.0 - v / 0.5
+        }
+
+        function calculateWeights() {
+
+            var w1 = weight(Math.abs(lod - 0.100))
+            var w2 = weight(Math.abs(lod - 0.300))
+            var w3 = weight(Math.abs(lod - 0.500))
+            var w4 = weight(Math.abs(lod - 0.700))
+            var w5 = weight(Math.abs(lod - 0.900))
+            var w6 = weight(Math.abs(lod - 1.100))
+
+            var sum = w1 + w2 + w3 + w4 + w5 + w6;
+            weight1 = w1 / sum;
+            weight2 = w2 / sum;
+            weight3 = w3 / sum;
+            weight4 = w4 / sum;
+            weight5 = w5 / sum;
+            weight6 = w6 / sum;
+
+            upateSources()
+        }
+
+        function upateSources() {
+            var sources = new Array();
+            var weights = new Array();
+
+            if (weight1 > 0) {
+                sources.push(level1)
+                weights.push(weight1)
+            }
+
+            if (weight2 > 0) {
+                sources.push(level2)
+                weights.push(weight2)
+            }
+
+            if (weight3 > 0) {
+                sources.push(level3)
+                weights.push(weight3)
+            }
+
+            if (weight4 > 0) {
+                sources.push(level4)
+                weights.push(weight4)
+            }
+
+            if (weight5 > 0) {
+                sources.push(level5)
+                weights.push(weight5)
+            }
+
+            if (weight6 > 0) {
+                sources.push(level6)
+                weights.push(weight6)
+            }
+
+            for (var j = sources.length; j < 6; j++) {
+                sources.push(dummy)
+                weights.push(0.0)
+            }
+
+            source1 = sources[0]
+            source2 = sources[1]
+            source3 = sources[2]
+            source4 = sources[3]
+            source5 = sources[4]
+            source6 = sources[5]
+
+            weight1 = weights[0]
+            weight2 = weights[1]
+            weight3 = weights[2]
+            weight4 = weights[3]
+            weight5 = weights[4]
+            weight6 = weights[5]
+        }
+
+        Component.onCompleted: calculateWeights()
+
+        onLodChanged: calculateWeights()
+
+        fragmentShader: "qrc:/QtQuick/Controls/Shaders/glow.frag"
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Private/FastGlow.qmlc b/deployment_test/QtQuick/Controls/Private/FastGlow.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..71c1c44361dfbb018f2ce0fbf71cc4d3b1525ec5
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Private/FastGlow.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Private/FocusFrame.qml b/deployment_test/QtQuick/Controls/Private/FocusFrame.qml
new file mode 100644
index 0000000000000000000000000000000000000000..570df32b715f5e539bf147d690b859e1a76b3563
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Private/FocusFrame.qml
@@ -0,0 +1,67 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype FocusFrame
+    \internal
+    \inqmlmodule QtQuick.Controls.Private
+*/
+Item {
+    id: root
+    activeFocusOnTab: false
+    Accessible.role: Accessible.StatusBar
+
+    anchors.topMargin: focusMargin
+    anchors.leftMargin: focusMargin
+    anchors.rightMargin: focusMargin
+    anchors.bottomMargin: focusMargin
+
+    property int focusMargin: loader.item ? loader.item.margin : -3
+
+    Loader {
+        id: loader
+        z: 2
+        anchors.fill: parent
+        sourceComponent: Settings.styleComponent(Settings.style, "FocusFrameStyle.qml", root)
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Private/FocusFrame.qmlc b/deployment_test/QtQuick/Controls/Private/FocusFrame.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..7696bad6bff0decec158cb46d257788c64d44016
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Private/FocusFrame.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Private/HoverButton.qml b/deployment_test/QtQuick/Controls/Private/HoverButton.qml
new file mode 100644
index 0000000000000000000000000000000000000000..bc7f91bb2d11302c48882f5adf5a326596428192
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Private/HoverButton.qml
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+Item {
+    id: button
+    property alias source: image.source
+    signal clicked
+
+    Rectangle {
+        id: fillRect
+        anchors.fill: parent
+        color: "black"
+        opacity: mouse.pressed ? 0.07 : mouse.containsMouse ? 0.02 : 0.0
+    }
+
+    Rectangle {
+        border.color: gridColor
+        anchors.fill: parent
+        anchors.margins: -1
+        color: "transparent"
+        opacity: fillRect.opacity * 10
+    }
+
+    Image {
+        id: image
+        width: Math.min(implicitWidth, parent.width * 0.4)
+        height: Math.min(implicitHeight, parent.height * 0.4)
+        anchors.centerIn: parent
+        fillMode: Image.PreserveAspectFit
+        opacity: 0.6
+    }
+
+    MouseArea {
+        id: mouse
+        anchors.fill: parent
+        onClicked: button.clicked()
+        hoverEnabled: Settings.hoverEnabled
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Private/HoverButton.qmlc b/deployment_test/QtQuick/Controls/Private/HoverButton.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..c2ac174ad93589cf0d8a3f988b8b057997067714
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Private/HoverButton.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Private/MenuContentItem.qml b/deployment_test/QtQuick/Controls/Private/MenuContentItem.qml
new file mode 100644
index 0000000000000000000000000000000000000000..9fcb2f0f53c194034afd49c11d2b1c99d9ee4209
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Private/MenuContentItem.qml
@@ -0,0 +1,282 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQml 2.14 as Qml
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Styles 1.1
+import QtQuick.Controls.Private 1.0
+
+Loader {
+    id: menuFrameLoader
+
+    property var __menu
+
+    Accessible.role: Accessible.PopupMenu
+
+    visible: status === Loader.Ready
+    width: content.width + (d.style ? d.style.padding.left + d.style.padding.right : 0)
+    height: content.height + (d.style ? d.style.padding.top + d.style.padding.bottom : 0)
+
+    Loader {
+        id: styleLoader
+        active: !__menu.isNative
+        sourceComponent: __menu.style
+        property alias __control: menuFrameLoader
+        onStatusChanged: {
+            if (status === Loader.Error)
+                console.error("Failed to load Style for", __menu)
+        }
+    }
+    sourceComponent: d.style ? d.style.frame : undefined
+
+    QtObject {
+        id: d
+        property var mnemonicsMap: ({})
+        readonly property Style style: styleLoader.item
+        readonly property Component menuItemPanel: style ? style.menuItemPanel : null
+
+        function canBeHovered(index) {
+            var item = content.menuItemAt(index)
+            if (item && item.visible && item.styleData.type !== MenuItemType.Separator && item.styleData.enabled) {
+                __menu.__currentIndex = index
+                return true
+            }
+            return false
+        }
+
+        function triggerCurrent() {
+            var item = content.menuItemAt(__menu.__currentIndex)
+            if (item)
+                triggerAndDismiss(item)
+        }
+
+        function triggerAndDismiss(item) {
+            if (!item)
+                return;
+            if (item.styleData.type === MenuItemType.Separator)
+                __menu.__dismissAndDestroy()
+            else if (item.styleData.type === MenuItemType.Item)
+                item.__menuItem.trigger()
+        }
+    }
+
+    focus: true
+
+    Keys.onPressed: {
+        var item = null
+        if (!(event.modifiers & Qt.AltModifier)
+                && (item = d.mnemonicsMap[event.text.toUpperCase()])) {
+            if (item.styleData.type === MenuItemType.Menu) {
+                __menu.__currentIndex = item.__menuItemIndex
+                item.__showSubMenu(true)
+                item.__menuItem.__currentIndex = 0
+            } else {
+                d.triggerAndDismiss(item)
+            }
+            event.accepted = true
+        } else {
+            event.accepted = false
+        }
+    }
+
+    Keys.onEscapePressed: __menu.__dismissAndDestroy()
+
+    Keys.onDownPressed: {
+        if (__menu.__currentIndex < 0)
+            __menu.__currentIndex = -1
+
+        for (var i = __menu.__currentIndex + 1;
+             i < __menu.items.length && !d.canBeHovered(i); i++)
+            ;
+        event.accepted = true
+    }
+
+    Keys.onUpPressed: {
+        for (var i = __menu.__currentIndex - 1;
+             i >= 0 && !d.canBeHovered(i); i--)
+            ;
+        event.accepted = true
+    }
+
+    Keys.onLeftPressed: {
+        if ((event.accepted = __menu.__parentMenu.hasOwnProperty("title")))
+            __menu.__closeAndDestroy()
+    }
+
+    Keys.onRightPressed: {
+        var item = content.menuItemAt(__menu.__currentIndex)
+        if (item && item.styleData.type === MenuItemType.Menu
+                 && !item.__menuItem.__popupVisible) {
+            item.__showSubMenu(true)
+            item.__menuItem.__currentIndex = 0
+            event.accepted = true
+        } else {
+            event.accepted = false
+        }
+    }
+
+    Keys.onSpacePressed: d.triggerCurrent()
+    Keys.onReturnPressed: d.triggerCurrent()
+    Keys.onEnterPressed: d.triggerCurrent()
+
+    Qml.Binding {
+        // Make sure the styled frame is in the background
+        target: item
+        property: "z"
+        value: content.z - 1
+        restoreMode: Binding.RestoreBinding
+    }
+
+    ColumnMenuContent {
+        id: content
+        x: d.style ? d.style.padding.left : 0
+        y: d.style ? d.style.padding.top : 0
+        menuItemDelegate: menuItemComponent
+        scrollIndicatorStyle: d.style && d.style.scrollIndicator || null
+        scrollerStyle: d.style && d.style.__scrollerStyle
+        itemsModel: __menu.items
+        minWidth: __menu.__minimumWidth
+        maxHeight: d.style ? d.style.__maxPopupHeight : 0
+        onTriggered: d.triggerAndDismiss(item)
+    }
+
+    Component {
+        id: menuItemComponent
+        Loader {
+            id: menuItemLoader
+
+            Accessible.role: opts.type === MenuItemType.Item || opts.type === MenuItemType.Menu ?
+                                 Accessible.MenuItem : Accessible.NoRole
+            Accessible.name: StyleHelpers.removeMnemonics(opts.text)
+            Accessible.checkable: opts.checkable
+            Accessible.checked: opts.checked
+            Accessible.onPressAction: {
+                if (opts.type === MenuItemType.Item) {
+                    d.triggerAndDismiss(menuItemLoader)
+                } else if (opts.type === MenuItemType.Menu) {
+                    __showSubMenu(true /*immediately*/)
+                }
+            }
+
+            property QtObject styleData: QtObject {
+                id: opts
+                readonly property int index: __menuItemIndex
+                readonly property int type: __menuItem ? __menuItem.type : -1
+                readonly property bool selected: type !== MenuItemType.Separator && __menu.__currentIndex === index
+                readonly property bool pressed: type !== MenuItemType.Separator && __menu.__currentIndex === index
+                                                && content.mousePressed // TODO Add key pressed condition once we get delayed menu closing
+                readonly property string text: type === MenuItemType.Menu ? __menuItem.title :
+                                               type !== MenuItemType.Separator ? __menuItem.text : ""
+                readonly property bool underlineMnemonic: __menu.__contentItem.altPressed
+                readonly property string shortcut: !!__menuItem && __menuItem["shortcut"] || ""
+                readonly property var iconSource: !!__menuItem && __menuItem["iconSource"] || undefined
+                readonly property bool enabled: type !== MenuItemType.Separator && !!__menuItem && __menuItem.enabled
+                readonly property bool checked: !!__menuItem && !!__menuItem["checked"]
+                readonly property bool checkable: !!__menuItem && !!__menuItem["checkable"]
+                readonly property bool exclusive: !!__menuItem && !!__menuItem["exclusiveGroup"]
+                readonly property int scrollerDirection: Qt.NoArrow
+            }
+
+            readonly property var __menuItem: modelData
+            readonly property int __menuItemIndex: index
+
+            sourceComponent: d.menuItemPanel
+            enabled: visible && opts.enabled
+            visible: !!__menuItem && __menuItem.visible
+            active: visible
+
+            function __showSubMenu(immediately) {
+                if (!__menuItem.enabled)
+                    return;
+                if (immediately) {
+                    if (__menu.__currentIndex === __menuItemIndex) {
+                        if (__menuItem.__usingDefaultStyle)
+                            __menuItem.style = __menu.style
+                        __menuItem.__popup(Qt.rect(menuFrameLoader.width - (d.style.submenuOverlap + d.style.padding.right), -d.style.padding.top, 0, 0), -1)
+                    }
+                } else {
+                    openMenuTimer.start()
+                }
+            }
+
+            Timer {
+                id: openMenuTimer
+                interval: d.style.submenuPopupDelay
+                onTriggered: menuItemLoader.__showSubMenu(true)
+            }
+
+            function __closeSubMenu() {
+                if (openMenuTimer.running)
+                    openMenuTimer.stop()
+                else if (__menuItem.__popupVisible)
+                    closeMenuTimer.start()
+            }
+
+            Timer {
+                id: closeMenuTimer
+                interval: 1
+                onTriggered: {
+                    if (__menu.__currentIndex !== __menuItemIndex)
+                        __menuItem.__closeAndDestroy()
+                }
+            }
+
+            onLoaded: {
+                __menuItem.__visualItem = menuItemLoader
+
+                if (content.width < item.implicitWidth)
+                    content.width = item.implicitWidth
+
+                var title = opts.text
+                var ampersandPos = title.indexOf("&")
+                if (ampersandPos !== -1)
+                    d.mnemonicsMap[title[ampersandPos + 1].toUpperCase()] = menuItemLoader
+            }
+
+            Qml.Binding {
+                target: menuItemLoader.item
+                property: "width"
+                property alias menuItem: menuItemLoader.item
+                value: menuItem ? Math.max(__menu.__minimumWidth, content.width) - 2 * menuItem.x : 0
+                restoreMode: Binding.RestoreBinding
+            }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Private/MenuContentItem.qmlc b/deployment_test/QtQuick/Controls/Private/MenuContentItem.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..13d0eb1c1be2174a0b3043071f19fd3a5d920aa9
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Private/MenuContentItem.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Private/MenuContentScroller.qml b/deployment_test/QtQuick/Controls/Private/MenuContentScroller.qml
new file mode 100644
index 0000000000000000000000000000000000000000..f33d2040eaf6b79011ccaf26f2833c7f34f2773f
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Private/MenuContentScroller.qml
@@ -0,0 +1,83 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+MouseArea {
+    id: scrollIndicator
+    property int direction: 0
+
+    anchors {
+        top: direction === Qt.UpArrow ? parent.top : undefined
+        bottom: direction === Qt.DownArrow ? parent.bottom : undefined
+    }
+
+    hoverEnabled: visible && Settings.hoverEnabled
+    height: scrollerLoader.height
+    width: parent.width
+
+    Loader {
+        id: scrollerLoader
+
+        width: parent.width
+        sourceComponent: scrollIndicatorStyle
+        // Extra property values for desktop style
+        property var __menuItem: null
+        property var styleData: {
+            "index": -1,
+            "type": MenuItemType.ScrollIndicator,
+            "text": "",
+            "selected": scrollIndicator.containsMouse,
+            "scrollerDirection": scrollIndicator.direction,
+            "checkable": false,
+            "checked": false,
+            "enabled": true
+        }
+    }
+
+    Timer {
+        interval: 100
+        repeat: true
+        triggeredOnStart: true
+        running: parent.containsMouse
+        onTriggered: scrollABit()
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Private/MenuContentScroller.qmlc b/deployment_test/QtQuick/Controls/Private/MenuContentScroller.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..83238b25ef18eaa08e0b7af60513a0bea33bebac
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Private/MenuContentScroller.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Private/MenuItemSubControls.qml b/deployment_test/QtQuick/Controls/Private/MenuItemSubControls.qml
new file mode 100644
index 0000000000000000000000000000000000000000..818b957800779c5c65e4019db5412b50677bbfb2
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Private/MenuItemSubControls.qml
@@ -0,0 +1,48 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+
+QtObject {
+    property Component background: null
+    property Component label: null
+    property Component submenuIndicator: null
+    property Component shortcut: null
+    property Component checkmarkIndicator: null
+}
diff --git a/deployment_test/QtQuick/Controls/Private/MenuItemSubControls.qmlc b/deployment_test/QtQuick/Controls/Private/MenuItemSubControls.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..f1f2d80b0600dd7b993e7d5bfc2a084b7dc6fb32
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Private/MenuItemSubControls.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Private/ModalPopupBehavior.qml b/deployment_test/QtQuick/Controls/Private/ModalPopupBehavior.qml
new file mode 100644
index 0000000000000000000000000000000000000000..c9a4b68fd505b9e54443c792133b5f385e3bc26a
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Private/ModalPopupBehavior.qml
@@ -0,0 +1,134 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+
+// KNOWN ISSUES
+// none
+
+/*!
+        \qmltype ModalPopupBehavior
+        \internal
+        \inqmlmodule QtQuick.Controls.Private
+*/
+Item {
+    id: popupBehavior
+
+    property bool showing: false
+    property bool whenAlso: true            // modifier to the "showing" property
+    property bool consumeCancelClick: true
+    property int delay: 0                   // delay before popout becomes visible
+    property int deallocationDelay: 3000    // 3 seconds
+
+    property Component popupComponent
+
+    property alias popup: popupLoader.item  // read-only
+    property alias window: popupBehavior.root // read-only
+
+    signal prepareToShow
+    signal prepareToHide
+    signal cancelledByClick
+
+    // implementation
+
+    anchors.fill: parent
+
+    onShowingChanged: notifyChange()
+    onWhenAlsoChanged: notifyChange()
+    function notifyChange() {
+        if(showing && whenAlso) {
+            if(popupLoader.sourceComponent == undefined) {
+                popupLoader.sourceComponent = popupComponent;
+            }
+        } else {
+            mouseArea.enabled = false; // disable before opacity is changed in case it has fading behavior
+            if(Qt.isQtObject(popupLoader.item)) {
+                popupBehavior.prepareToHide();
+                popupLoader.item.opacity = 0;
+            }
+        }
+    }
+
+    property Item root: findRoot()
+    function findRoot() {
+        var p = parent;
+        while(p.parent != undefined)
+            p = p.parent;
+
+        return p;
+    }
+
+    MouseArea {
+        id: mouseArea
+        anchors.fill: parent
+        enabled: false  // enabled only when popout is showing
+        onPressed: {
+            popupBehavior.showing = false;
+            mouse.accepted = consumeCancelClick;
+            cancelledByClick();
+        }
+    }
+
+    Loader {
+        id: popupLoader
+    }
+
+    Timer { // visibility timer
+        running: Qt.isQtObject(popupLoader.item) && showing && whenAlso
+        interval: delay
+        onTriggered: {
+            popupBehavior.prepareToShow();
+            mouseArea.enabled = true;
+            popup.opacity = 1;
+        }
+    }
+
+    Timer { // deallocation timer
+        running: Qt.isQtObject(popupLoader.item) && popupLoader.item.opacity == 0
+        interval: deallocationDelay
+        onTriggered: popupLoader.sourceComponent = undefined
+    }
+
+    states: State {
+        name: "active"
+        when: Qt.isQtObject(popupLoader.item) && popupLoader.item.opacity > 0
+        ParentChange { target: popupBehavior; parent: root }
+    }
+ }
+
diff --git a/deployment_test/QtQuick/Controls/Private/ModalPopupBehavior.qmlc b/deployment_test/QtQuick/Controls/Private/ModalPopupBehavior.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..a300afa48000a8822c9ccdda0d96dca991a07d5c
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Private/ModalPopupBehavior.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Private/ScrollBar.qml b/deployment_test/QtQuick/Controls/Private/ScrollBar.qml
new file mode 100644
index 0000000000000000000000000000000000000000..eea7a73790248bee86861bf83f24e7df604be665
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Private/ScrollBar.qml
@@ -0,0 +1,237 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+        \qmltype ScrollBar
+        \internal
+        \inqmlmodule QtQuick.Controls.Private
+*/
+Item {
+    id: scrollbar
+
+    property bool isTransient: false
+    property bool active: false
+    property int orientation: Qt.Horizontal
+    property alias minimumValue: slider.minimumValue
+    property alias maximumValue: slider.maximumValue
+    property alias value: slider.value
+    property int singleStep: 20
+
+    activeFocusOnTab: false
+
+    Accessible.role: Accessible.ScrollBar
+    implicitWidth: panelLoader.implicitWidth
+    implicitHeight: panelLoader.implicitHeight
+
+    property bool upPressed
+    property bool downPressed
+    property bool pageUpPressed
+    property bool pageDownPressed
+    property bool handlePressed
+
+
+    property Item __panel: panelLoader.item
+    Loader {
+        id: panelLoader
+        anchors.fill: parent
+        sourceComponent: __style ? __style.__scrollbar : null
+        onStatusChanged: if (status === Loader.Error) console.error("Failed to load Style for", root)
+        property alias __control: scrollbar
+        property QtObject __styleData: QtObject {
+            readonly property alias horizontal: internal.horizontal
+            readonly property alias upPressed: scrollbar.upPressed
+            readonly property alias downPressed: scrollbar.downPressed
+            readonly property alias handlePressed: scrollbar.handlePressed
+        }
+    }
+
+    MouseArea {
+        id: internal
+        property bool horizontal: orientation === Qt.Horizontal
+        property int pageStep: internal.horizontal ? width : height
+        property bool scrollToClickposition: internal.scrollToClickPosition
+        anchors.fill: parent
+        cursorShape: __panel && __panel.visible ? Qt.ArrowCursor : Qt.IBeamCursor // forces a cursor change
+
+        property bool autoincrement: false
+        property bool scrollToClickPosition: __style ? __style.scrollToClickedPosition : 0
+
+        // Update hover item
+        onEntered: if (!pressed) __panel.activeControl = __panel.hitTest(mouseX, mouseY)
+        onExited: if (!pressed) __panel.activeControl = "none"
+        onMouseXChanged: if (!pressed) __panel.activeControl = __panel.hitTest(mouseX, mouseY)
+        hoverEnabled: Settings.hoverEnabled
+        preventStealing: true
+        property var pressedX
+        property var pressedY
+        property int oldPosition
+        property int grooveSize
+
+        Timer {
+            running: upPressed || downPressed || pageUpPressed || pageDownPressed
+            interval: 350
+            onTriggered: internal.autoincrement = true
+        }
+
+        Timer {
+            running: internal.autoincrement
+            interval: 60
+            repeat: true
+            onTriggered: {
+                if (upPressed && internal.containsMouse)
+                    internal.decrement();
+                else if (downPressed && internal.containsMouse)
+                    internal.increment();
+                else if (pageUpPressed)
+                    internal.decrementPage();
+                else if (pageDownPressed)
+                    internal.incrementPage();
+            }
+        }
+
+        onPositionChanged: {
+            if (handlePressed) {
+                if (!horizontal)
+                    slider.position = oldPosition + (mouseY - pressedY)
+                else
+                    slider.position = oldPosition + (mouseX - pressedX)
+            }
+        }
+
+        onPressed: {
+            if (mouse.source !== Qt.MouseEventNotSynthesized) {
+                mouse.accepted = false
+                return
+            }
+            __panel.activeControl = __panel.hitTest(mouseX, mouseY)
+            scrollToClickposition = scrollToClickPosition
+            var handleRect = __panel.subControlRect("handle")
+            var grooveRect = __panel.subControlRect("groove")
+            grooveSize =  horizontal ? grooveRect.width - handleRect.width:
+                                       grooveRect.height - handleRect.height;
+            if (__panel.activeControl === "handle") {
+                pressedX = mouseX;
+                pressedY = mouseY;
+                handlePressed = true;
+                oldPosition = slider.position;
+            } else if (__panel.activeControl === "up") {
+                decrement();
+                upPressed = Qt.binding(function() {return containsMouse});
+            } else if (__panel.activeControl === "down") {
+                increment();
+                downPressed = Qt.binding(function() {return containsMouse});
+            } else if (!scrollToClickposition){
+                if (__panel.activeControl === "upPage") {
+                    decrementPage();
+                    pageUpPressed = true;
+                } else if (__panel.activeControl === "downPage") {
+                    incrementPage();
+                    pageDownPressed = true;
+                }
+            } else { // scroll to click position
+                slider.position = horizontal ? mouseX -  handleRect.width/2 - grooveRect.x
+                                             : mouseY - handleRect.height/2 - grooveRect.y
+                pressedX = mouseX;
+                pressedY = mouseY;
+                handlePressed = true;
+                oldPosition = slider.position;
+            }
+        }
+
+        onReleased: {
+            __panel.activeControl = __panel.hitTest(mouseX, mouseY);
+            autoincrement = false;
+            upPressed = false;
+            downPressed = false;
+            handlePressed = false;
+            pageUpPressed = false;
+            pageDownPressed = false;
+        }
+
+        onWheel: {
+            var stepCount = -(wheel.angleDelta.x ? wheel.angleDelta.x : wheel.angleDelta.y) / 120
+            if (stepCount != 0) {
+                if (wheel.modifiers & Qt.ControlModifier || wheel.modifiers & Qt.ShiftModifier)
+                   incrementPage(stepCount)
+                else
+                   increment(stepCount)
+            }
+        }
+
+        function incrementPage(stepCount) {
+            value = boundValue(value + getSteps(pageStep, stepCount))
+        }
+
+        function decrementPage(stepCount) {
+            value = boundValue(value - getSteps(pageStep, stepCount))
+        }
+
+        function increment(stepCount) {
+            value = boundValue(value + getSteps(singleStep, stepCount))
+        }
+
+        function decrement(stepCount) {
+            value = boundValue(value - getSteps(singleStep, stepCount))
+        }
+
+        function boundValue(val) {
+            return Math.min(Math.max(val, minimumValue), maximumValue)
+        }
+
+        function getSteps(step, count) {
+            if (count)
+                step *= count
+            return step
+        }
+
+        RangeModel {
+            id: slider
+            minimumValue: 0.0
+            maximumValue: 1.0
+            value: 0
+            stepSize: 0.0
+            inverted: false
+            positionAtMaximum: internal.grooveSize
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Private/ScrollBar.qmlc b/deployment_test/QtQuick/Controls/Private/ScrollBar.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..5f71765fcc3a1fab8d4b961342133a04920d975e
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Private/ScrollBar.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Private/ScrollViewHelper.qml b/deployment_test/QtQuick/Controls/Private/ScrollViewHelper.qml
new file mode 100644
index 0000000000000000000000000000000000000000..f5ef5b1790edf27377d58947293d1cf30b941e18
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Private/ScrollViewHelper.qml
@@ -0,0 +1,234 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQml 2.14 as Qml
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+        \qmltype ScrollViewHeader
+        \internal
+        \inqmlmodule QtQuick.Controls.Private
+*/
+Item {
+    id: scrollHelper
+
+    property alias horizontalScrollBar: hscrollbar
+    property alias verticalScrollBar: vscrollbar
+    property bool blockUpdates: false
+    property int availableHeight
+    property int availableWidth
+    property int contentHeight
+    property int contentWidth
+    property bool active
+    property int horizontalScrollBarPolicy: Qt.ScrollBarAsNeeded
+    property int verticalScrollBarPolicy: Qt.ScrollBarAsNeeded
+
+
+    property int leftMargin: outerFrame && root.__style ? root.__style.padding.left : 0
+    property int rightMargin: outerFrame && root.__style ? root.__style.padding.right : 0
+    property int topMargin: outerFrame && root.__style ? root.__style.padding.top : 0
+    property int bottomMargin: outerFrame && root.__style ? root.__style.padding.bottom : 0
+
+    anchors.fill: parent
+
+    Timer {
+        id: layoutTimer
+        interval: 0;
+        onTriggered: {
+            blockUpdates = true;
+            scrollHelper.contentWidth = flickableItem !== null ? flickableItem.contentWidth : 0
+            scrollHelper.contentHeight = flickableItem !== null ? flickableItem.contentHeight : 0
+            scrollHelper.availableWidth = viewport.width
+            scrollHelper.availableHeight = viewport.height
+            blockUpdates = false;
+            hscrollbar.valueChanged();
+            vscrollbar.valueChanged();
+        }
+    }
+
+    Connections {
+        target: viewport
+        function onWidthChanged() { layoutTimer.running = true }
+        function onHeightChanged() { layoutTimer.running = true }
+    }
+
+    Connections {
+        target: flickableItem
+        function onContentWidthChanged() { layoutTimer.running = true }
+        function onContentHeightChanged() { layoutTimer.running = true }
+        function onContentXChanged() {
+            hscrollbar.flash()
+            vscrollbar.flash()
+        }
+        function onContentYChanged() {
+            hscrollbar.flash()
+            vscrollbar.flash()
+        }
+    }
+
+    Loader {
+        id: cornerFill
+        z: 1
+        sourceComponent: __style ? __style.corner : null
+        anchors.right: parent.right
+        anchors.bottom: parent.bottom
+        anchors.bottomMargin: bottomMargin
+        anchors.rightMargin: rightMargin
+        width: visible ? vscrollbar.width : 0
+        height: visible ? hscrollbar.height : 0
+        visible: hscrollbar.visible && !hscrollbar.isTransient && vscrollbar.visible && !vscrollbar.isTransient
+    }
+
+    ScrollBar {
+        id: hscrollbar
+        readonly property int scrollAmount: contentWidth - availableWidth
+        readonly property bool scrollable: scrollAmount > 0
+        isTransient: !!__panel && !!__panel.isTransient
+        active: !!__panel && (__panel.sunken || __panel.activeControl !== "none")
+        enabled: !isTransient || __panel.visible
+        orientation: Qt.Horizontal
+        visible: horizontalScrollBarPolicy ==  Qt.ScrollBarAsNeeded ? scrollable : horizontalScrollBarPolicy == Qt.ScrollBarAlwaysOn
+        height: visible ? implicitHeight : 0
+        z: 1
+        maximumValue: scrollable ? scrollAmount : 0
+        minimumValue: 0
+        anchors.bottom: parent.bottom
+        anchors.left: parent.left
+        anchors.right: cornerFill.left
+        anchors.leftMargin:  leftMargin
+        anchors.bottomMargin: bottomMargin
+        onScrollAmountChanged: {
+            var scrollableAmount = scrollable ? scrollAmount : 0
+            if (flickableItem && (flickableItem.atXBeginning || flickableItem.atXEnd)) {
+                value = Math.min(scrollableAmount, flickableItem.contentX - flickableItem.originX);
+            } else if (value > scrollableAmount) {
+                value = scrollableAmount;
+            }
+        }
+        onValueChanged: {
+            if (flickableItem && !blockUpdates) {
+                flickableItem.contentX = value + flickableItem.originX
+            }
+        }
+        Qml.Binding {
+            target: hscrollbar.__panel
+            property: "raised"
+            value: vscrollbar.active || scrollHelper.active
+            when: hscrollbar.isTransient
+            restoreMode: Binding.RestoreBinding
+        }
+        Qml.Binding {
+            target: hscrollbar.__panel
+            property: "visible"
+            value: true
+            when: !hscrollbar.isTransient || scrollHelper.active
+            restoreMode: Binding.RestoreBinding
+        }
+        function flash() {
+            if (hscrollbar.isTransient) {
+                hscrollbar.__panel.on = true
+                hscrollbar.__panel.visible = true
+                hFlasher.start()
+            }
+        }
+        Timer {
+            id: hFlasher
+            interval: 10
+            onTriggered: hscrollbar.__panel.on = false
+        }
+    }
+
+    ScrollBar {
+        id: vscrollbar
+        readonly property int scrollAmount: contentHeight - availableHeight
+        readonly property bool scrollable: scrollAmount > 0
+        isTransient: !!__panel && !!__panel.isTransient
+        active: !!__panel && (__panel.sunken || __panel.activeControl !== "none")
+        enabled: !isTransient || __panel.visible
+        orientation: Qt.Vertical
+        visible: verticalScrollBarPolicy === Qt.ScrollBarAsNeeded ? scrollable : verticalScrollBarPolicy === Qt.ScrollBarAlwaysOn
+        width: visible ? implicitWidth : 0
+        z: 1
+        anchors.bottom: cornerFill.top
+        maximumValue: scrollable ? scrollAmount + __viewTopMargin : 0
+        minimumValue: 0
+        anchors.right: parent.right
+        anchors.top: parent.top
+        anchors.topMargin: __scrollBarTopMargin + topMargin
+        anchors.rightMargin: rightMargin
+        onScrollAmountChanged: {
+            if (flickableItem && (flickableItem.atYBeginning || flickableItem.atYEnd)) {
+                value = flickableItem.contentY - flickableItem.originY
+            }
+        }
+        onValueChanged: {
+            if (flickableItem && !blockUpdates && enabled) {
+                flickableItem.contentY = value + flickableItem.originY
+            }
+        }
+        Qml.Binding {
+            target: vscrollbar.__panel
+            property: "raised"
+            value: hscrollbar.active || scrollHelper.active
+            when: vscrollbar.isTransient
+            restoreMode: Binding.RestoreBinding
+        }
+        Qml.Binding {
+            target: vscrollbar.__panel
+            property: "visible"
+            value: true
+            when: !vscrollbar.isTransient || scrollHelper.active
+            restoreMode: Binding.RestoreBinding
+        }
+        function flash() {
+            if (vscrollbar.isTransient) {
+                vscrollbar.__panel.on = true
+                vscrollbar.__panel.visible = true
+                vFlasher.start()
+            }
+        }
+        Timer {
+            id: vFlasher
+            interval: 10
+            onTriggered: vscrollbar.__panel.on = false
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Private/ScrollViewHelper.qmlc b/deployment_test/QtQuick/Controls/Private/ScrollViewHelper.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..44956859d6da80cf3d81198da659d26d6408cd3e
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Private/ScrollViewHelper.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Private/SourceProxy.qml b/deployment_test/QtQuick/Controls/Private/SourceProxy.qml
new file mode 100644
index 0000000000000000000000000000000000000000..275c24d398cd16160795110cf8b66f19bcb59db5
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Private/SourceProxy.qml
@@ -0,0 +1,136 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+
+Item {
+    id: rootItem
+    property variant input
+    property variant output
+    property variant sourceRect
+    visible: false
+
+    Component.onCompleted: evaluateInput()
+
+    onInputChanged: evaluateInput()
+
+    onSourceRectChanged: evaluateInput()
+
+    function evaluateInput() {
+        if (input == undefined) {
+            output =  input
+        }
+        else if (sourceRect != undefined && sourceRect != Qt.rect(0, 0, 0, 0) && !isQQuickShaderEffectSource(input)) {
+            proxySource.sourceItem = input
+            output = proxySource
+            proxySource.sourceRect = sourceRect
+        }
+        else if (isQQuickItemLayerEnabled(input)) {
+            output = input
+        }
+        else if ((isQQuickImage(input) && !hasTileMode(input) && !hasChildren(input))) {
+            output = input
+        }
+        else if (isQQuickShaderEffectSource(input)) {
+            output = input
+        }
+        else {
+            proxySource.sourceItem = input
+            output = proxySource
+            proxySource.sourceRect = Qt.rect(0, 0, 0, 0)
+        }
+    }
+
+    function isQQuickItemLayerEnabled(item) {
+        if (item.hasOwnProperty("layer")) {
+            var l = item["layer"]
+            if (l.hasOwnProperty("enabled") && l["enabled"].toString() == "true")
+                return true
+        }
+        return false
+    }
+
+    function isQQuickImage(item) {
+        var imageProperties = [ "fillMode", "progress", "asynchronous", "sourceSize", "status", "smooth" ]
+        return hasProperties(item, imageProperties)
+    }
+
+    function isQQuickShaderEffectSource(item) {
+        var shaderEffectSourceProperties = [ "hideSource", "format", "sourceItem", "mipmap", "wrapMode", "live", "recursive", "sourceRect" ]
+        return hasProperties(item, shaderEffectSourceProperties)
+    }
+
+    function hasProperties(item, properties) {
+        var counter = 0
+            for (var j = 0; j < properties.length; j++) {
+                if (item.hasOwnProperty(properties [j]))
+                    counter++
+            }
+        return properties.length == counter
+    }
+
+    function hasChildren(item) {
+        if (item.hasOwnProperty("childrenRect")) {
+            if (item["childrenRect"].toString() != "QRectF(0, 0, 0, 0)")
+                return true
+            else
+                return false
+        }
+        return false
+    }
+
+    function hasTileMode(item) {
+        if (item.hasOwnProperty("fillMode")) {
+            if (item["fillMode"].toString() != "0")
+                return true
+            else
+                return false
+        }
+        return false
+    }
+
+    ShaderEffectSource {
+        id: proxySource
+        live: rootItem.input != rootItem.output
+        hideSource: false
+        smooth: true
+        visible: false
+    }
+}
+
diff --git a/deployment_test/QtQuick/Controls/Private/SourceProxy.qmlc b/deployment_test/QtQuick/Controls/Private/SourceProxy.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..d8b51b1a08a9a675bcc7fa5720769760a68a77a0
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Private/SourceProxy.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Private/StackView.js b/deployment_test/QtQuick/Controls/Private/StackView.js
new file mode 100644
index 0000000000000000000000000000000000000000..b0b77e2193b46c687e75d05b8afd768d4c32efa1
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Private/StackView.js
@@ -0,0 +1,66 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+var stackView = [];
+
+function push(p)
+{
+    if (!p)
+        return
+    stackView.push(p)
+    __depth++
+    return p
+}
+
+function pop()
+{
+    if (stackView.length === 0)
+        return null
+    var p = stackView.pop()
+    __depth--
+    return p
+}
+
+function current()
+{
+    if (stackView.length === 0)
+        return null
+    return stackView[stackView.length-1]
+}
+
diff --git a/deployment_test/QtQuick/Controls/Private/StackView.jsc b/deployment_test/QtQuick/Controls/Private/StackView.jsc
new file mode 100644
index 0000000000000000000000000000000000000000..5b5da217ec90e65497e157008684319839f2ca85
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Private/StackView.jsc differ
diff --git a/deployment_test/QtQuick/Controls/Private/StackViewSlideDelegate.qml b/deployment_test/QtQuick/Controls/Private/StackViewSlideDelegate.qml
new file mode 100644
index 0000000000000000000000000000000000000000..dcc14448efac9974dd879fda1ab81228fa8d240a
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Private/StackViewSlideDelegate.qml
@@ -0,0 +1,141 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+
+/*!
+        \qmltype StackViewSlideTransition
+        \internal
+        \inqmlmodule QtQuick.Controls.Private
+*/
+StackViewDelegate {
+    id: root
+
+    property bool horizontal: true
+
+    function getTransition(properties)
+    {
+        return root[horizontal ? "horizontalSlide" : "verticalSlide"][properties.name]
+    }
+
+    function transitionFinished(properties)
+    {
+        properties.exitItem.x = 0
+        properties.exitItem.y = 0
+    }
+
+    property QtObject horizontalSlide: QtObject {
+        property Component pushTransition: StackViewTransition {
+            PropertyAnimation {
+                target: enterItem
+                property: "x"
+                from: target.width
+                to: 0
+                duration: 400
+                easing.type: Easing.OutCubic
+            }
+            PropertyAnimation {
+                target: exitItem
+                property: "x"
+                from: 0
+                to: -target.width
+                duration: 400
+                easing.type: Easing.OutCubic
+            }
+        }
+
+        property Component popTransition: StackViewTransition {
+            PropertyAnimation {
+                target: enterItem
+                property: "x"
+                from: -target.width
+                to: 0
+                duration: 400
+                easing.type: Easing.OutCubic
+            }
+            PropertyAnimation {
+                target: exitItem
+                property: "x"
+                from: 0
+                to: target.width
+                duration: 400
+                easing.type: Easing.OutCubic
+            }
+        }
+        property Component replaceTransition: pushTransition
+    }
+
+    property QtObject verticalSlide: QtObject {
+        property Component pushTransition: StackViewTransition {
+            PropertyAnimation {
+                target: enterItem
+                property: "y"
+                from: target.height
+                to: 0
+                duration: 300
+            }
+            PropertyAnimation {
+                target: exitItem
+                property: "y"
+                from: 0
+                to: -target.height
+                duration: 300
+            }
+        }
+
+        property Component popTransition: StackViewTransition {
+            PropertyAnimation {
+                target: enterItem
+                property: "y"
+                from: -target.height
+                to: 0
+                duration: 300
+            }
+            PropertyAnimation {
+                target: exitItem
+                property: "y"
+                from: 0
+                to: target.height
+                duration: 300
+            }
+        }
+        property Component replaceTransition: pushTransition
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Private/StackViewSlideDelegate.qmlc b/deployment_test/QtQuick/Controls/Private/StackViewSlideDelegate.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..abba15c25061f1ab3db77dc08b59fd6f892bc1b8
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Private/StackViewSlideDelegate.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Private/Style.qml b/deployment_test/QtQuick/Controls/Private/Style.qml
new file mode 100644
index 0000000000000000000000000000000000000000..805c9252f71cba427f7dfcff4a026f92bba952b9
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Private/Style.qml
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype Style
+    \internal
+    \inqmlmodule QtQuick.Controls.Private
+*/
+
+AbstractStyle {
+    /*! The control this style is attached to. */
+    readonly property Item control: __control
+}
diff --git a/deployment_test/QtQuick/Controls/Private/Style.qmlc b/deployment_test/QtQuick/Controls/Private/Style.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..a6b1a4ae466a5b002b3f9b000a57ebc15d1e3015
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Private/Style.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Private/SystemPaletteSingleton.qml b/deployment_test/QtQuick/Controls/Private/SystemPaletteSingleton.qml
new file mode 100644
index 0000000000000000000000000000000000000000..e4e82c552c5ed477a2732c22dc9beaa4187c23f7
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Private/SystemPaletteSingleton.qml
@@ -0,0 +1,61 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+pragma Singleton
+import QtQuick 2.2
+
+QtObject {
+    property SystemPalette active: SystemPalette { colorGroup: SystemPalette.Active }
+    property SystemPalette disabled: SystemPalette { colorGroup: SystemPalette.Disabled }
+
+    function alternateBase(enabled) { return enabled ? active.alternateBase : disabled.alternateBase }
+    function base(enabled) { return enabled ? active.base : disabled.base }
+    function button(enabled) { return enabled ? active.button : disabled.button }
+    function buttonText(enabled) { return enabled ? active.buttonText : disabled.buttonText }
+    function dark(enabled) { return enabled ? active.dark : disabled.dark }
+    function highlight(enabled) { return enabled ? active.highlight : disabled.highlight }
+    function highlightedText(enabled) { return enabled ? active.highlightedText : disabled.highlightedText }
+    function light(enabled) { return enabled ? active.light : disabled.light }
+    function mid(enabled) { return enabled ? active.mid : disabled.mid }
+    function midlight(enabled) { return enabled ? active.midlight : disabled.midlight }
+    function shadow(enabled) { return enabled ? active.shadow : disabled.shadow }
+    function text(enabled) { return enabled ? active.text : disabled.text }
+    function window(enabled) { return enabled ? active.window : disabled.window }
+    function windowText(enabled) { return enabled ? active.windowText : disabled.windowText }
+}
diff --git a/deployment_test/QtQuick/Controls/Private/SystemPaletteSingleton.qmlc b/deployment_test/QtQuick/Controls/Private/SystemPaletteSingleton.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..66abb87e3b51fb62f5a7ccb33c51f8524f13c28a
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Private/SystemPaletteSingleton.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Private/TabBar.qml b/deployment_test/QtQuick/Controls/Private/TabBar.qml
new file mode 100644
index 0000000000000000000000000000000000000000..1186968ddbefce5fd69313457e4eb4241ee7d32c
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Private/TabBar.qml
@@ -0,0 +1,331 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQml 2.14 as Qml
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+        \qmltype TabBar
+        \internal
+        \inqmlmodule QtQuick.Controls.Private
+*/
+FocusScope {
+    id: tabbar
+    height: Math.max(tabrow.height, Math.max(leftCorner.height, rightCorner.height))
+    width: tabView.width
+
+    activeFocusOnTab: true
+
+    Keys.onRightPressed: {
+        if (tabView && tabView.currentIndex < tabView.count - 1)
+            tabView.currentIndex = tabView.currentIndex + 1
+    }
+    Keys.onLeftPressed: {
+        if (tabView && tabView.currentIndex > 0)
+            tabView.currentIndex = tabView.currentIndex - 1
+    }
+
+    onTabViewChanged: parent = tabView
+    visible: tabView ? tabView.tabsVisible : true
+
+    property var tabView
+    property var style
+    property var styleItem: tabView.__styleItem ? tabView.__styleItem : null
+
+    property bool tabsMovable: styleItem ? styleItem.tabsMovable : false
+
+    property int tabsAlignment: styleItem ? styleItem.tabsAlignment : Qt.AlignLeft
+
+    property int tabOverlap: styleItem ? styleItem.tabOverlap : 0
+
+    property int elide: Text.ElideRight
+
+    property real availableWidth: tabbar.width - leftCorner.width - rightCorner.width
+
+    property var __selectedTabRect
+
+    function tab(index) {
+        for (var i = 0; i < tabrow.children.length; ++i) {
+            if (tabrow.children[i].tabindex == index) {
+                return tabrow.children[i]
+            }
+        }
+        return null;
+    }
+
+    /*! \internal */
+    function __isAncestorOf(item, child) {
+        //TODO: maybe removed from 5.2 if the function was merged in qtdeclarative
+        if (child === item)
+            return false;
+
+        while (child) {
+            child = child.parent;
+            if (child === item)
+                return true;
+        }
+        return false;
+    }
+    Loader {
+        id: background
+        anchors.fill: parent
+        sourceComponent: styleItem ? styleItem.tabBar : undefined
+    }
+
+    ListView {
+        id: tabrow
+        objectName: "tabrow"
+        Accessible.role: Accessible.PageTabList
+        LayoutMirroring.enabled: Qt.application.layoutDirection === Qt.RightToLeft
+        spacing: -tabOverlap
+        orientation: Qt.Horizontal
+        interactive: false
+        focus: true
+        clip: true
+
+        // Note this will silence the binding loop warnings caused by QTBUG-35038
+        // and should be removed when this issue is resolved.
+        property int contentWidthWorkaround: contentWidth > 0 ? contentWidth: 0
+        width: Math.min(availableWidth, count ? contentWidthWorkaround : availableWidth)
+        height: currentItem ? currentItem.height : 0
+
+        highlightMoveDuration: 0
+
+        // We cannot bind directly to the currentIndex because the actual model is
+        // populated after the listview is completed, resulting in an invalid contentItem
+        currentIndex: tabView.currentIndex < model.count ? tabView.currentIndex : -1
+        onCurrentIndexChanged: tabrow.positionViewAtIndex(currentIndex, ListView.Contain)
+
+        moveDisplaced: Transition {
+            NumberAnimation {
+                property: "x"
+                duration: 125
+                easing.type: Easing.OutQuad
+            }
+        }
+
+        states: [
+            State {
+                name: "left"
+                when: tabsAlignment === Qt.AlignLeft
+                AnchorChanges { target:tabrow ; anchors.left: parent.left }
+                PropertyChanges { target:tabrow ; anchors.leftMargin: leftCorner.width }
+            },
+            State {
+                name: "center"
+                when: tabsAlignment === Qt.AlignHCenter
+                AnchorChanges { target:tabrow ; anchors.horizontalCenter: tabbar.horizontalCenter }
+            },
+            State {
+                name: "right"
+                when: tabsAlignment === Qt.AlignRight
+                AnchorChanges { target:tabrow ; anchors.right: parent.right }
+                PropertyChanges { target:tabrow ; anchors.rightMargin: rightCorner.width }
+            }
+        ]
+
+        model: tabView.__tabs
+
+        delegate: MouseArea {
+            id: tabitem
+            objectName: "mousearea"
+            hoverEnabled: Settings.hoverEnabled
+            focus: true
+            enabled: modelData.enabled
+
+            Qml.Binding {
+                target: tabbar
+                when: selected
+                property: "__selectedTabRect"
+                value: Qt.rect(x, y, width, height)
+                restoreMode: Binding.RestoreBinding
+            }
+
+            drag.target: tabsMovable ? tabloader : null
+            drag.axis: Drag.XAxis
+            drag.minimumX: drag.active ? 0 : -Number.MAX_VALUE
+            drag.maximumX: tabrow.width - tabitem.width
+
+            property int tabindex: index
+            property bool selected : tabView.currentIndex === index
+            property string title: modelData.title
+            property bool nextSelected: tabView.currentIndex === index + 1
+            property bool previousSelected: tabView.currentIndex === index - 1
+
+            property bool keyPressed: false
+            property bool effectivePressed: pressed && containsMouse || keyPressed
+
+            z: selected ? 1 : -index
+            implicitWidth: tabloader.implicitWidth
+            implicitHeight: tabloader.implicitHeight
+
+            function changeTab() {
+                tabView.currentIndex = index;
+                var next = tabbar.nextItemInFocusChain(true);
+                if (__isAncestorOf(tabView.getTab(currentIndex), next))
+                    next.forceActiveFocus();
+            }
+
+            onClicked: {
+                if (tabrow.interactive) {
+                    changeTab()
+                }
+            }
+            onPressed: {
+                if (!tabrow.interactive) {
+                    changeTab()
+                }
+            }
+
+            Keys.onPressed: {
+                if (event.key === Qt.Key_Space && !event.isAutoRepeat && !tabitem.pressed)
+                    tabitem.keyPressed = true
+            }
+            Keys.onReleased: {
+                if (event.key === Qt.Key_Space && !event.isAutoRepeat && tabitem.keyPressed)
+                    tabitem.keyPressed = false
+            }
+            onFocusChanged: if (!focus) tabitem.keyPressed = false
+
+            Loader {
+                id: tabloader
+
+                property Item control: tabView
+                property int index: tabindex
+
+                property QtObject styleData: QtObject {
+                    readonly property alias index: tabitem.tabindex
+                    readonly property alias selected: tabitem.selected
+                    readonly property alias title: tabitem.title
+                    readonly property alias nextSelected: tabitem.nextSelected
+                    readonly property alias previousSelected: tabitem.previousSelected
+                    readonly property alias pressed: tabitem.effectivePressed
+                    readonly property alias hovered: tabitem.containsMouse
+                    readonly property alias enabled: tabitem.enabled
+                    readonly property bool activeFocus: tabitem.activeFocus
+                    readonly property real availableWidth: tabbar.availableWidth
+                    readonly property real totalWidth: tabrow.contentWidth
+                }
+
+                sourceComponent: loader.item ? loader.item.tab : null
+
+                Drag.keys: "application/x-tabbartab"
+                Drag.active: tabitem.drag.active
+                Drag.source: tabitem
+
+                property real __prevX: 0
+                property real __dragX: 0
+                onXChanged: {
+                    if (Drag.active) {
+                        // keep track for the snap back animation
+                        __dragX = tabitem.mapFromItem(tabrow, tabloader.x, 0).x
+
+                        // when moving to the left, the hot spot is the left edge and vice versa
+                        Drag.hotSpot.x = x < __prevX ? 0 : width
+                        __prevX = x
+                    }
+                }
+
+                width: tabitem.width
+                state: Drag.active ? "drag" : ""
+
+                transitions: [
+                    Transition {
+                        to: "drag"
+                        PropertyAction { target: tabloader; property: "parent"; value: tabrow }
+                    },
+                    Transition {
+                        from: "drag"
+                        SequentialAnimation {
+                            PropertyAction { target: tabloader; property: "parent"; value: tabitem }
+                            NumberAnimation {
+                                target: tabloader
+                                duration: 50
+                                easing.type: Easing.OutQuad
+                                property: "x"
+                                from: tabloader.__dragX
+                                to: 0
+                            }
+                        }
+                    }
+                ]
+            }
+
+            Accessible.role: Accessible.PageTab
+            Accessible.name: modelData.title
+        }
+    }
+
+    Loader {
+        id: leftCorner
+        anchors.verticalCenter: parent.verticalCenter
+        anchors.left: parent.left
+        sourceComponent: styleItem ? styleItem.leftCorner : undefined
+        width: item ? item.implicitWidth : 0
+        height: item ? item.implicitHeight : 0
+    }
+
+    Loader {
+        id: rightCorner
+        anchors.verticalCenter: parent.verticalCenter
+        anchors.right: parent.right
+        sourceComponent: styleItem ? styleItem.rightCorner : undefined
+        width: item ? item.implicitWidth : 0
+        height: item ? item.implicitHeight : 0
+    }
+
+    DropArea {
+        anchors.fill: tabrow
+        keys: "application/x-tabbartab"
+        onPositionChanged: {
+            var source = drag.source
+            var target = tabrow.itemAt(drag.x, drag.y)
+            if (source && target && source !== target) {
+                source = source.drag.target
+                target = target.drag.target
+                var center = target.parent.x + target.width / 2
+                if ((source.index > target.index && source.x < center)
+                        || (source.index < target.index && source.x + source.width > center))
+                    tabView.moveTab(source.index, target.index)
+            }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Private/TabBar.qmlc b/deployment_test/QtQuick/Controls/Private/TabBar.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..f737e1918262045870e3297ee8f58dd8e1cf2ef3
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Private/TabBar.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Private/TableViewItemDelegateLoader.qml b/deployment_test/QtQuick/Controls/Private/TableViewItemDelegateLoader.qml
new file mode 100644
index 0000000000000000000000000000000000000000..c5c6584a84a3e6a02e19a6dcfabe70b188e2db6a
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Private/TableViewItemDelegateLoader.qml
@@ -0,0 +1,102 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+import QtQuick 2.5
+import QtQuick.Controls 1.4
+import QtQuick.Controls.Styles 1.4
+
+/*!
+    \qmltype TableViewItemDelegateLoader
+    \internal
+    \qmlabstract
+    \inqmlmodule QtQuick.Controls.Private
+*/
+
+Loader {
+    id: itemDelegateLoader
+
+    width: __column ? __column.width : 0
+    height: parent ? parent.height : 0
+    visible: __column ? __column.visible : false
+
+    property bool isValid: false
+    sourceComponent: (__model === undefined || !isValid) ? null
+                     : __column && __column.delegate ? __column.delegate : __itemDelegate
+
+    // All these properties are internal
+    property int __index: index
+    property Item __rowItem: null
+    property var __model: __rowItem ? __rowItem.itemModel : undefined
+    property var __modelData: __rowItem ? __rowItem.itemModelData : undefined
+    property TableViewColumn __column: null
+    property Component __itemDelegate: null
+    property var __mouseArea: null
+    property var __style: null
+
+    // These properties are exposed to the item delegate
+    readonly property var model: __model
+    readonly property var modelData: __modelData
+
+    property QtObject styleData: QtObject {
+        readonly property int row: __rowItem ? __rowItem.rowIndex : -1
+        readonly property int column: __index
+        readonly property int elideMode: __column ? __column.elideMode : Text.ElideLeft
+        readonly property int textAlignment: __column ? __column.horizontalAlignment : Text.AlignLeft
+        readonly property bool selected: __rowItem ? __rowItem.itemSelected : false
+        readonly property bool hasActiveFocus: __rowItem ? __rowItem.activeFocus : false
+        readonly property bool pressed: __mouseArea && row === __mouseArea.pressedRow && column === __mouseArea.pressedColumn
+        readonly property color textColor: __rowItem ? __rowItem.itemTextColor : "black"
+        readonly property string role: __column ? __column.role : ""
+        readonly property var value: model && model.hasOwnProperty(role) ? model[role] // Qml ListModel and QAbstractItemModel
+                                     : modelData && modelData.hasOwnProperty(role) ? modelData[role] // QObjectList / QObject
+                                     : modelData != undefined ? modelData : "" // Models without role
+        onRowChanged: if (row !== -1) itemDelegateLoader.isValid = true
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Private/TableViewItemDelegateLoader.qmlc b/deployment_test/QtQuick/Controls/Private/TableViewItemDelegateLoader.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..c2a46fe39bf5592f496dc1d23f590728804f44d7
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Private/TableViewItemDelegateLoader.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Private/TableViewSelection.qml b/deployment_test/QtQuick/Controls/Private/TableViewSelection.qml
new file mode 100644
index 0000000000000000000000000000000000000000..e8af9dd99f48a857fc1d3f7b199b59e5463c18ea
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Private/TableViewSelection.qml
@@ -0,0 +1,196 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+
+QtObject {
+
+    property int count: 0
+    signal selectionChanged
+
+    property bool __dirty: false
+    property var __ranges: []
+
+    function forEach (callback) {
+        if (!(callback instanceof Function)) {
+            console.warn("TableViewSelection.forEach: argument is not a function")
+            return;
+        }
+        __forEach(callback, -1)
+    }
+
+    function contains(index) {
+        for (var i = 0 ; i < __ranges.length ; ++i) {
+            if (__ranges[i][0] <= index && index <= __ranges[i][1])
+                return true;
+            else if (__ranges[i][0] > index)
+                return false;
+        }
+        return false;
+    }
+
+    function clear() {
+        __ranges = []
+        __dirty = true
+        count = 0
+        selectionChanged()
+    }
+
+    function selectAll() { select(0, rowCount - 1) }
+    function select(first, last) { __select(true, first, last) }
+    function deselect(first, last) { __select(false, first, last) }
+
+    // --- private section ---
+
+    function __printRanges() {
+        var out = ""
+        for (var i = 0 ; i < __ranges.length ; ++ i)
+            out += ("{" + __ranges[i][0] + "," + __ranges[i][1] + "} ")
+        print(out)
+    }
+
+    function __count() {
+        var sum = 0
+        for (var i = 0 ; i < __ranges.length ; ++i) {
+            sum += (1 + __ranges[i][1] - __ranges[i][0])
+        }
+        return sum
+    }
+
+    function __forEach (callback, startIndex) {
+        __dirty = false
+        var i, j
+
+        for (i = 0 ; i < __ranges.length && !__dirty ; ++i) {
+            for (j = __ranges[i][0] ; !__dirty && j <= __ranges[i][1] ; ++j) {
+                if (j >= startIndex)
+                    callback.call(this, j)
+            }
+        }
+
+        // Restart iteration at last index if selection changed
+        if (__dirty)
+            return __forEach(callback, j)
+    }
+
+    function __selectOne(index) {
+        __ranges = [[index, index]]
+        __dirty = true
+        count = 1
+        selectionChanged();
+    }
+
+    function __select(select, first, last) {
+
+        var i, range
+        var start = first
+        var stop = first
+        var startRangeIndex = -1
+        var stopRangeIndex = -1
+        var newRangePos = 0
+
+        if (first < 0 || last < 0 || first >= rowCount || last >=rowCount) {
+            console.warn("TableViewSelection: index out of range")
+            return
+        }
+
+        if (last !== undefined) {
+            start = first <= last ? first : last
+            stop = first <= last ? last : first
+        }
+
+        if (select) {
+
+            // Find beginning and end ranges
+            for (i = 0 ; i < __ranges.length; ++ i) {
+                range = __ranges[i]
+                if (range[0] > stop + 1) continue;  // above range
+                if (range[1] < start - 1) { // below range
+                    newRangePos = i + 1
+                    continue;
+                }
+                if (startRangeIndex === -1)
+                    startRangeIndex = i
+                stopRangeIndex = i
+            }
+
+            if (startRangeIndex !== -1)
+                start = Math.min(__ranges[startRangeIndex][0], start)
+            if (stopRangeIndex !== -1)
+                stop = Math.max(__ranges[stopRangeIndex][1], stop)
+
+            if (startRangeIndex  === -1)
+                startRangeIndex = newRangePos
+
+            __ranges.splice(Math.max(0, startRangeIndex),
+                            1 + stopRangeIndex - startRangeIndex, [start, stop])
+
+        } else {
+
+            // Find beginning and end ranges
+            for (i = 0 ; i < __ranges.length; ++ i) {
+                range = __ranges[i]
+                if (range[1] < start) continue; // below range
+                if (range[0] > stop) continue;  // above range
+                if (startRangeIndex === -1)
+                    startRangeIndex = i
+                stopRangeIndex = i
+            }
+
+            // Slice ranges accordingly
+            if (startRangeIndex >= 0 && stopRangeIndex >= 0) {
+                var startRange = __ranges[startRangeIndex]
+                var stopRange = __ranges[stopRangeIndex]
+                var length = 1 + stopRangeIndex - startRangeIndex
+                if (start <= startRange[0] && stop >= stopRange[1]) { //remove
+                    __ranges.splice(startRangeIndex, length)
+                } else if (start - 1 < startRange[0] && stop <= stopRange[1]) { //cut front
+                    __ranges.splice(startRangeIndex, length, [stop + 1, stopRange[1]])
+                } else if (start - 1 < startRange[1] && stop >= stopRange[1]) { // cut back
+                    __ranges.splice(startRangeIndex, length, [startRange[0], start - 1])
+                } else { //split
+                    __ranges.splice(startRangeIndex, length, [startRange[0], start - 1], [stop + 1, stopRange[1]])
+                }
+            }
+        }
+        __dirty = true
+        count = __count()  // forces a re-evaluation of indexes in the delegates
+        selectionChanged()
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Private/TableViewSelection.qmlc b/deployment_test/QtQuick/Controls/Private/TableViewSelection.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..7421daae0f09e00ce4c0b7caad2b8dda80bac55b
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Private/TableViewSelection.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Private/TextHandle.qml b/deployment_test/QtQuick/Controls/Private/TextHandle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..45e97f71a358348c96429a3a3ff2ccd9fe238ba6
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Private/TextHandle.qml
@@ -0,0 +1,126 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+Loader {
+    id: handle
+
+    property Item editor
+    property int minimum: -1
+    property int maximum: -1
+    property int position: -1
+    property alias delegate: handle.sourceComponent
+
+    readonly property alias pressed: mouse.pressed
+
+    readonly property real handleX: x + (item ? item.x : 0)
+    readonly property real handleY: y + (item ? item.y : 0)
+    readonly property real handleWidth: item ? item.width : 0
+    readonly property real handleHeight: item ? item.height : 0
+
+    property Item control
+    property QtObject styleData: QtObject {
+        id: styleData
+        signal activated()
+        readonly property alias pressed: mouse.pressed
+        readonly property alias position: handle.position
+        readonly property bool hasSelection: editor.selectionStart !== editor.selectionEnd
+        readonly property real lineHeight: position !== -1 ? editor.positionToRectangle(position).height
+                                                           : editor.cursorRectangle.height
+    }
+
+    function activate() {
+        styleData.activated()
+    }
+
+    MouseArea {
+        id: mouse
+        anchors.fill: item
+        enabled: item && item.visible
+        preventStealing: true
+        property real pressX
+        property point offset
+        property bool handleDragged: false
+
+        onPressed: {
+            Qt.inputMethod.commit()
+            handleDragged = false
+            pressX = mouse.x
+            var handleRect = editor.positionToRectangle(handle.position)
+            var centerX = handleRect.x + (handleRect.width / 2)
+            var centerY = handleRect.y + (handleRect.height / 2)
+            var center = mapFromItem(editor, centerX, centerY)
+            offset = Qt.point(mouseX - center.x, mouseY - center.y)
+        }
+        onReleased: {
+            if (!handleDragged) {
+                // The user just clicked on the handle. In that
+                // case clear the selection.
+                var mousePos = editor.mapFromItem(item, mouse.x, mouse.y)
+                var editorPos = editor.positionAt(mousePos.x, mousePos.y)
+                editor.select(editorPos, editorPos)
+            }
+        }
+        onPositionChanged: {
+            handleDragged = true
+            var pt = mapToItem(editor, mouse.x - offset.x, mouse.y - offset.y)
+
+            // limit vertically within mix/max coordinates or content bounds
+            var min = (minimum !== -1) ? minimum : 0
+            var max = (maximum !== -1) ? maximum : editor.length
+            pt.y = Math.max(pt.y, editor.positionToRectangle(min).y)
+            pt.y = Math.min(pt.y, editor.positionToRectangle(max).y)
+
+            var pos = editor.positionAt(pt.x, pt.y)
+
+            // limit horizontally within min/max character positions
+            if (minimum !== -1)
+                pos = Math.max(pos, minimum)
+            pos = Math.max(pos, 0)
+            if (maximum !== -1)
+                pos = Math.min(pos, maximum)
+            pos = Math.min(pos, editor.length)
+
+            handle.position = pos
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Private/TextHandle.qmlc b/deployment_test/QtQuick/Controls/Private/TextHandle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..f1ad2f30146793f2c24fa4ce6dda5cb91fe6708e
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Private/TextHandle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Private/TextInputWithHandles.qml b/deployment_test/QtQuick/Controls/Private/TextInputWithHandles.qml
new file mode 100644
index 0000000000000000000000000000000000000000..ac78c2692f166bec3961117268ca62c3b75ff5dd
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Private/TextInputWithHandles.qml
@@ -0,0 +1,201 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Window 2.2
+import QtQuick.Controls.Private 1.0
+
+TextInput {
+    id: input
+
+    property Item control
+    property alias cursorHandle: cursorHandle.delegate
+    property alias selectionHandle: selectionHandle.delegate
+
+    property bool blockRecursion: false
+    property bool hasSelection: selectionStart !== selectionEnd
+    readonly property int selectionPosition: selectionStart !== cursorPosition ? selectionStart : selectionEnd
+    readonly property alias containsMouse: mouseArea.containsMouse
+    property alias editMenu: editMenu
+    cursorDelegate: __style && __style.__cursorDelegate ? __style.__cursorDelegate : null
+
+    selectByMouse: control.selectByMouse && (!Settings.isMobile || !cursorHandle.delegate || !selectionHandle.delegate)
+
+    // force re-evaluation when selection moves:
+    // - cursorRectangle changes => content scrolled
+    // - contentWidth changes => text layout changed
+    property rect selectionRectangle: cursorRectangle.x && contentWidth ? positionToRectangle(selectionPosition)
+                                                                        : positionToRectangle(selectionPosition)
+
+    onSelectionStartChanged: syncHandlesWithSelection()
+    onCursorPositionChanged: syncHandlesWithSelection()
+
+    function syncHandlesWithSelection()
+    {
+        if (!blockRecursion && selectionHandle.delegate) {
+            blockRecursion = true
+            // We cannot use property selectionPosition since it gets updated after onSelectionStartChanged
+            cursorHandle.position = cursorPosition
+            selectionHandle.position = (selectionStart !== cursorPosition) ? selectionStart : selectionEnd
+            blockRecursion = false
+        }
+    }
+
+    function activate() {
+        if (activeFocusOnPress) {
+            forceActiveFocus()
+            if (!readOnly)
+                Qt.inputMethod.show()
+        }
+        cursorHandle.activate()
+        selectionHandle.activate()
+    }
+
+    function moveHandles(cursor, selection) {
+        blockRecursion = true
+        cursorPosition = cursor
+        if (selection === -1) {
+            selectWord()
+            selection = selectionStart
+        }
+        selectionHandle.position = selection
+        cursorHandle.position = cursorPosition
+        blockRecursion = false
+    }
+
+    MouseArea {
+        id: mouseArea
+        anchors.fill: parent
+        hoverEnabled: Settings.hoverEnabled
+        cursorShape: Qt.IBeamCursor
+        acceptedButtons: (input.selectByMouse ? Qt.NoButton : Qt.LeftButton) | (control.menu ? Qt.RightButton : Qt.NoButton)
+        onClicked: {
+            if (editMenu.item)
+                return;
+            var pos = input.positionAt(mouse.x, mouse.y)
+            input.moveHandles(pos, pos)
+            input.activate()
+        }
+        onPressAndHold: {
+            if (editMenu.item)
+                return;
+            var pos = input.positionAt(mouse.x, mouse.y)
+            input.moveHandles(pos, control.selectByMouse ? -1 : pos)
+            input.activate()
+        }
+    }
+
+    EditMenu {
+        id: editMenu
+        input: parent
+        mouseArea: mouseArea
+        control: parent.control
+        cursorHandle: cursorHandle
+        selectionHandle: selectionHandle
+        anchors.fill: parent
+    }
+
+    ScenePosListener {
+        id: listener
+        item: input
+        enabled: input.activeFocus && Qt.platform.os !== "ios" && Settings.isMobile
+    }
+
+    TextHandle {
+        id: selectionHandle
+
+        editor: input
+        z: 1000001 // DefaultWindowDecoration+1
+        parent: !input.activeFocus || Qt.platform.os === "ios" ? control : Window.contentItem // float (QTBUG-42538)
+        control: input.control
+        active: control.selectByMouse && Settings.isMobile
+        maximum: cursorHandle.position - 1
+
+        readonly property var mappedOrigin: editor.mapToItem(parent, 0,0)
+
+        // Mention scenePos in the mappedPos binding to force re-evaluation if it changes
+        readonly property var mappedPos: listener.scenePos.x !== listener.scenePos.y !== Number.MAX_VALUE ?
+                                    editor.mapToItem(parent, editor.selectionRectangle.x, editor.selectionRectangle.y) : -1
+        x: mappedPos.x
+        y: mappedPos.y
+
+        visible: pressed || (input.hasSelection && handleX + handleWidth >= -1 && handleX - mappedOrigin.x <= control.width + 1)
+
+        onPositionChanged: {
+            if (!input.blockRecursion) {
+                input.blockRecursion = true
+                input.select(selectionHandle.position, cursorHandle.position)
+                if (pressed)
+                    input.ensureVisible(position)
+                input.blockRecursion = false
+            }
+        }
+    }
+
+    TextHandle {
+        id: cursorHandle
+
+        editor: input
+        z: 1000001 // DefaultWindowDecoration+1
+        parent: !input.activeFocus || Qt.platform.os === "ios" ? control : Window.contentItem // float (QTBUG-42538)
+        control: input.control
+        active: control.selectByMouse && Settings.isMobile
+        minimum: input.hasSelection ? selectionHandle.position + 1 : -1
+
+        readonly property var mappedOrigin: editor.mapToItem(parent, 0,0)
+
+        // Mention scenePos in the mappedPos binding to force re-evaluation if it changes
+        readonly property var mappedPos: listener.scenePos.x !== listener.scenePos.y !== Number.MAX_VALUE ?
+                                    editor.mapToItem(parent, editor.cursorRectangle.x, editor.cursorRectangle.y) : -1
+        x: mappedPos.x
+        y: mappedPos.y
+
+        visible: pressed || ((input.cursorVisible || input.hasSelection) && handleX + handleWidth >= -1 && handleX - mappedOrigin.x <= control.width + 1)
+
+        onPositionChanged: {
+            if (!input.blockRecursion) {
+                input.blockRecursion = true
+                if (!input.hasSelection)
+                    selectionHandle.position = cursorHandle.position
+                input.select(selectionHandle.position, cursorHandle.position)
+                input.blockRecursion = false
+            }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Private/TextInputWithHandles.qmlc b/deployment_test/QtQuick/Controls/Private/TextInputWithHandles.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..86fce2f54c966007eb039bb9c55289019d32d285
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Private/TextInputWithHandles.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Private/TextSingleton.qml b/deployment_test/QtQuick/Controls/Private/TextSingleton.qml
new file mode 100644
index 0000000000000000000000000000000000000000..83254698f17951969fd2e985dfb548faf6b8613f
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Private/TextSingleton.qml
@@ -0,0 +1,43 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+pragma Singleton
+import QtQuick 2.2
+Text {
+}
diff --git a/deployment_test/QtQuick/Controls/Private/TextSingleton.qmlc b/deployment_test/QtQuick/Controls/Private/TextSingleton.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..d0e3c5591c80550442de962b0ed806a85ad14d1d
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Private/TextSingleton.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Private/ToolMenuButton.qml b/deployment_test/QtQuick/Controls/Private/ToolMenuButton.qml
new file mode 100644
index 0000000000000000000000000000000000000000..e6fba40c5709159f4a79af4c459373ecfd7df908
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Private/ToolMenuButton.qml
@@ -0,0 +1,127 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQml 2.14 as Qml
+import QtQuick 2.4
+import QtQuick.Controls 1.3
+import QtQuick.Controls.Private 1.0
+
+FocusScope {
+    id: button
+
+    property Menu menu
+    readonly property bool pressed: behavior.containsPress || behavior.keyPressed
+    readonly property alias hovered: behavior.containsMouse
+
+    property alias panel: loader.sourceComponent
+    property alias __panel: loader.item
+
+    activeFocusOnTab: true
+    Accessible.role: Accessible.Button
+    implicitWidth: __panel ? __panel.implicitWidth : 0
+    implicitHeight: __panel ? __panel.implicitHeight : 0
+
+    Loader {
+        id: loader
+        anchors.fill: parent
+        property QtObject styleData: QtObject {
+            readonly property alias pressed: button.pressed
+            readonly property alias hovered: button.hovered
+            readonly property alias activeFocus: button.activeFocus
+        }
+        onStatusChanged: if (status === Loader.Error) console.error("Failed to load Style for", button)
+    }
+
+    Keys.onPressed: {
+        if (event.key === Qt.Key_Space && !event.isAutoRepeat && !behavior.keyPressed)
+            behavior.keyPressed = true
+    }
+    Keys.onReleased: {
+        if (event.key === Qt.Key_Space && !event.isAutoRepeat && behavior.keyPressed)
+            behavior.keyPressed = false
+    }
+    onFocusChanged: {
+        if (!focus)
+            behavior.keyPressed = false
+    }
+    onPressedChanged: {
+        if (!Settings.hasTouchScreen && !pressed && menu)
+            popupMenuTimer.start()
+    }
+
+    MouseArea {
+        id: behavior
+        property bool keyPressed: false
+
+        anchors.fill: parent
+        enabled: !keyPressed
+        hoverEnabled: Settings.hoverEnabled
+
+        onReleased: {
+            if (Settings.hasTouchScreen && containsMouse && menu)
+                popupMenuTimer.start()
+        }
+
+        Timer {
+            id: popupMenuTimer
+            interval: 10
+            onTriggered: {
+                behavior.keyPressed = false
+                if (Qt.application.layoutDirection === Qt.RightToLeft)
+                    menu.__popup(Qt.rect(button.width, button.height, 0, 0), 0)
+                else
+                    menu.__popup(Qt.rect(0, 0, button.width, button.height), 0)
+            }
+        }
+    }
+
+    Qml.Binding {
+        target: menu
+        property: "__minimumWidth"
+        value: button.width
+        restoreMode: Binding.RestoreBinding
+    }
+
+    Qml.Binding {
+        target: menu
+        property: "__visualItem"
+        value: button
+        restoreMode: Binding.RestoreBinding
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Private/ToolMenuButton.qmlc b/deployment_test/QtQuick/Controls/Private/ToolMenuButton.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..e7d0bce4ab1da538bfb49afd3c6363f91243fa23
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Private/ToolMenuButton.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Private/TreeViewItemDelegateLoader.qml b/deployment_test/QtQuick/Controls/Private/TreeViewItemDelegateLoader.qml
new file mode 100644
index 0000000000000000000000000000000000000000..ed9566afae1e70953bb94dd134823a525013d40a
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Private/TreeViewItemDelegateLoader.qml
@@ -0,0 +1,109 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+import QtQuick 2.5
+import QtQuick.Controls 1.4
+import QtQuick.Controls.Styles 1.4
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype TreeViewItemDelegateLoader
+    \internal
+    \qmlabstract
+    \inqmlmodule QtQuick.Controls.Private
+*/
+
+TableViewItemDelegateLoader {
+    id: itemDelegateLoader
+
+    /* \internal */
+    readonly property int __itemIndentation: __style && __index === 0
+                                             ? __style.__indentation * (styleData.depth + 1) : 0
+    /* \internal */
+    property TreeModelAdaptor __treeModel: null
+
+    // Exposed to the item delegate
+    styleData: QtObject {
+        readonly property int row: __rowItem ? __rowItem.rowIndex : -1
+        readonly property int column: __index
+        readonly property int elideMode: __column ? __column.elideMode : Text.ElideLeft
+        readonly property int textAlignment: __column ? __column.horizontalAlignment : Text.AlignLeft
+        readonly property bool selected: __rowItem ? __rowItem.itemSelected : false
+        readonly property bool hasActiveFocus: __rowItem ? __rowItem.activeFocus : false
+        readonly property bool pressed: __mouseArea && row === __mouseArea.pressedRow && column === __mouseArea.pressedColumn
+        readonly property color textColor: __rowItem ? __rowItem.itemTextColor : "black"
+        readonly property string role: __column ? __column.role : ""
+        readonly property var value: model && model.hasOwnProperty(role) ? model[role] : ""
+        readonly property var index: model ? model["_q_TreeView_ModelIndex"] : __treeModel.index(-1,-1)
+        readonly property int depth: model && column === 0 ? model["_q_TreeView_ItemDepth"] : 0
+        readonly property bool hasChildren: model ? model["_q_TreeView_HasChildren"] : false
+        readonly property bool hasSibling: model ? model["_q_TreeView_HasSibling"] : false
+        readonly property bool isExpanded: model ? model["_q_TreeView_ItemExpanded"] : false
+    }
+
+    onLoaded: {
+        item.x = Qt.binding(function() { return __itemIndentation})
+        item.width = Qt.binding(function() { return width - __itemIndentation })
+    }
+
+    Loader {
+        id: branchDelegateLoader
+        active: __model !== undefined
+                && __index === 0
+                && styleData.hasChildren
+        visible: itemDelegateLoader.width > __itemIndentation
+        sourceComponent: __style && __style.__branchDelegate || null
+        anchors.right: parent.item ? parent.item.left : undefined
+        anchors.rightMargin: __style.__indentation > width ? (__style.__indentation - width) / 2 : 0
+        anchors.verticalCenter: parent.verticalCenter
+        property QtObject styleData: itemDelegateLoader.styleData
+        onLoaded: if (__rowItem) __rowItem.branchDecoration = item
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Private/TreeViewItemDelegateLoader.qmlc b/deployment_test/QtQuick/Controls/Private/TreeViewItemDelegateLoader.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..cf9108805b426fd215540e1bd55a55a41b55385e
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Private/TreeViewItemDelegateLoader.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Private/qmldir b/deployment_test/QtQuick/Controls/Private/qmldir
new file mode 100644
index 0000000000000000000000000000000000000000..9fe84203b5bbd7e00a89a1c40aeae9f79793af68
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Private/qmldir
@@ -0,0 +1,37 @@
+module QtQuick.Controls.Private
+AbstractCheckable 1.0 AbstractCheckable.qml
+CalendarHeaderModel 1.0 CalendarHeaderModel.qml
+Control 1.0 Control.qml
+CalendarUtils 1.0 CalendarUtils.js
+FocusFrame 1.0 FocusFrame.qml
+Margins 1.0 Margins.qml
+BasicButton 1.0 BasicButton.qml
+ScrollBar 1.0 ScrollBar.qml
+ScrollViewHelper 1.0 ScrollViewHelper.qml
+Style 1.0 Style.qml
+MenuItemSubControls 1.0 MenuItemSubControls.qml
+TabBar 1.0 TabBar.qml
+StackViewSlideDelegate 1.0 StackViewSlideDelegate.qml
+StyleHelpers 1.0 style.js
+JSArray 1.0 StackView.js
+TableViewSelection 1.0 TableViewSelection.qml
+FastGlow 1.0 FastGlow.qml
+SourceProxy 1.0 SourceProxy.qml
+GroupBoxStyle 1.0 ../Styles/Base/GroupBoxStyle.qml
+FocusFrameStyle 1.0 ../Styles/Base/FocusFrameStyle.qml
+ToolButtonStyle 1.0 ../Styles/Base/ToolButtonStyle.qml
+MenuContentItem 1.0 MenuContentItem.qml
+MenuContentScroller 1.0 MenuContentScroller.qml
+ColumnMenuContent 1.0 ColumnMenuContent.qml
+ContentItem 1.0 ContentItem.qml
+HoverButton 1.0 HoverButton.qml
+singleton SystemPaletteSingleton 1.0 SystemPaletteSingleton.qml
+singleton TextSingleton 1.0 TextSingleton.qml
+TextHandle 1.0 TextHandle.qml
+TextInputWithHandles 1.0 TextInputWithHandles.qml
+EditMenu 1.0 EditMenu.qml
+EditMenu_base 1.0 EditMenu_base.qml
+ToolMenuButton 1.0 ToolMenuButton.qml
+BasicTableView 1.0 BasicTableView.qml
+TableViewItemDelegateLoader 1.0 TableViewItemDelegateLoader.qml
+TreeViewItemDelegateLoader 1.0 TreeViewItemDelegateLoader.qml
diff --git a/deployment_test/QtQuick/Controls/Private/style.js b/deployment_test/QtQuick/Controls/Private/style.js
new file mode 100644
index 0000000000000000000000000000000000000000..844fdbda6cd40be32e51373b14c9152e936077f9
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Private/style.js
@@ -0,0 +1,62 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+.pragma library
+
+function underlineAmpersands(match, p1, p2, p3) {
+    if (p2 === "&")
+        return p1.concat(p2, p3)
+    return p1.concat("<u>", p2, "</u>", p3)
+}
+
+function removeAmpersands(match, p1, p2, p3) {
+    return p1.concat(p2, p3)
+}
+
+function replaceAmpersands(text, replaceFunction) {
+    return text.replace(/([^&]*)&(.)([^&]*)/g, replaceFunction)
+}
+
+function stylizeMnemonics(text) {
+    return replaceAmpersands(text, underlineAmpersands)
+}
+
+function removeMnemonics(text) {
+    return replaceAmpersands(text, removeAmpersands)
+}
diff --git a/deployment_test/QtQuick/Controls/Private/style.jsc b/deployment_test/QtQuick/Controls/Private/style.jsc
new file mode 100644
index 0000000000000000000000000000000000000000..f079143e5432726c431415c054a60817344ffcac
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Private/style.jsc differ
diff --git a/deployment_test/QtQuick/Controls/ProgressBar.qml b/deployment_test/QtQuick/Controls/ProgressBar.qml
new file mode 100644
index 0000000000000000000000000000000000000000..9171f7d7763356197ff9c2281fc45a6698dea7b7
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/ProgressBar.qml
@@ -0,0 +1,167 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype ProgressBar
+    \inqmlmodule QtQuick.Controls
+    \since 5.1
+    \ingroup controls
+    \brief A progress indicator.
+
+    \image progressbar.png
+
+    The ProgressBar is used to give an indication of the progress of an operation.
+    \l value is updated regularly and must be between \l minimumValue and \l maximumValue.
+
+    \code
+    Column {
+        ProgressBar {
+            value: 0.5
+        }
+        ProgressBar {
+            indeterminate: true
+        }
+    }
+    \endcode
+
+    You can create a custom appearance for a ProgressBar by
+    assigning a \l {ProgressBarStyle}.
+*/
+
+Control {
+    id: progressbar
+
+    /*! This property holds the progress bar's current value.
+        Attempting to change the current value to one outside the minimum-maximum
+        range has no effect on the current value.
+
+        The default value is \c{0}.
+    */
+    property real value: 0
+
+    /*! This property is the progress bar's minimum value.
+        The \l value is clamped to this value.
+        The default value is \c{0}.
+    */
+    property real minimumValue: 0
+
+    /*! This property is the progress bar's maximum value.
+        The \l value is clamped to this value.
+        If maximumValue is smaller than \l minimumValue, \l minimumValue will be enforced.
+        The default value is \c{1}.
+    */
+    property real maximumValue: 1
+
+    /*! This property toggles indeterminate mode.
+        When the actual progress is unknown, use this option.
+        The progress bar will be animated as a busy indicator instead.
+        The default value is \c false.
+    */
+    property bool indeterminate: false
+
+    /*! \qmlproperty enumeration orientation
+
+        This property holds the orientation of the progress bar.
+
+        \list
+        \li Qt.Horizontal - Horizontal orientation. (Default)
+        \li Qt.Vertical - Vertical orientation.
+        \endlist
+    */
+    property int orientation: Qt.Horizontal
+
+    /*! \qmlproperty bool ProgressBar::hovered
+
+        This property indicates whether the control is being hovered.
+    */
+    readonly property alias hovered: hoverArea.containsMouse
+
+    /*! \internal */
+    style: Settings.styleComponent(Settings.style, "ProgressBarStyle.qml", progressbar)
+
+    /*! \internal */
+    property bool __initialized: false
+    /*! \internal */
+    onMaximumValueChanged: setValue(value)
+    /*! \internal */
+    onMinimumValueChanged: setValue(value)
+    /*! \internal */
+    onValueChanged: if (__initialized) setValue(value)
+    /*! \internal */
+    Component.onCompleted: {
+        __initialized = true;
+        setValue(value)
+    }
+
+    activeFocusOnTab: false
+
+    Accessible.role: Accessible.ProgressBar
+    Accessible.name: value
+
+    implicitWidth:(__panel ? __panel.implicitWidth : 0)
+    implicitHeight: (__panel ? __panel.implicitHeight: 0)
+
+    MouseArea {
+        id: hoverArea
+        anchors.fill: parent
+        hoverEnabled: Settings.hoverEnabled
+    }
+
+    /*! \internal */
+    function setValue(v) {
+        var newval = parseFloat(v)
+        if (!isNaN(newval)) {
+            // we give minimumValue priority over maximum if they are inconsistent
+            if (newval > maximumValue) {
+                if (maximumValue >= minimumValue)
+                    newval = maximumValue;
+                else
+                    newval = minimumValue
+            } else if (v < minimumValue) {
+                newval = minimumValue
+            }
+            if (value !== newval)
+                value = newval
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/ProgressBar.qmlc b/deployment_test/QtQuick/Controls/ProgressBar.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..aac176b72859a7766d011c10a7bd090b666a7c6d
Binary files /dev/null and b/deployment_test/QtQuick/Controls/ProgressBar.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/RadioButton.qml b/deployment_test/QtQuick/Controls/RadioButton.qml
new file mode 100644
index 0000000000000000000000000000000000000000..cc191f5b8df0ef979d13c09997e4dc2617e64540
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/RadioButton.qml
@@ -0,0 +1,99 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype RadioButton
+    \inqmlmodule QtQuick.Controls
+    \since 5.1
+    \ingroup controls
+    \brief A radio button with a text label.
+
+    \image radiobutton.png
+
+    A RadioButton is an option button that can be switched on (checked) or off
+    (unchecked). Radio buttons typically present the user with a "one of many"
+    choices. In a group of radio buttons, only one radio button can be
+    checked at a time; if the user selects another button, the previously
+    selected button is switched off.
+
+    \qml
+    GroupBox {
+        title: "Tab Position"
+
+        RowLayout {
+            ExclusiveGroup { id: tabPositionGroup }
+            RadioButton {
+                text: "Top"
+                checked: true
+                exclusiveGroup: tabPositionGroup
+            }
+            RadioButton {
+                text: "Bottom"
+                exclusiveGroup: tabPositionGroup
+            }
+        }
+    }
+    \endqml
+
+    You can create a custom appearance for a RadioButton by
+    assigning a \l {RadioButtonStyle}.
+*/
+
+AbstractCheckable {
+    id: radioButton
+
+    activeFocusOnTab: true
+
+    Accessible.name: text
+    Accessible.role: Accessible.RadioButton
+
+    /*!
+        The style that should be applied to the radio button. Custom style
+        components can be created with:
+
+        \codeline Qt.createComponent("path/to/style.qml", radioButtonId);
+    */
+    style: Settings.styleComponent(Settings.style, "RadioButtonStyle.qml", radioButton)
+
+    __cycleStatesHandler: function() { checked = !checked; }
+}
diff --git a/deployment_test/QtQuick/Controls/RadioButton.qmlc b/deployment_test/QtQuick/Controls/RadioButton.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..8969b581a245371252499201f65f55c4f544815e
Binary files /dev/null and b/deployment_test/QtQuick/Controls/RadioButton.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/ScrollView.qml b/deployment_test/QtQuick/Controls/ScrollView.qml
new file mode 100644
index 0000000000000000000000000000000000000000..f79cfc8e7ebc2b32388337731399ae4343272444
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/ScrollView.qml
@@ -0,0 +1,374 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQml 2.14 as Qml
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+import QtQuick.Controls.Styles 1.1
+
+/*!
+    \qmltype ScrollView
+    \inqmlmodule QtQuick.Controls
+    \since  5.1
+    \ingroup views
+    \ingroup controls
+    \brief Provides a scrolling view within another Item.
+
+    \image scrollview.png
+
+    A ScrollView can be used either to replace a \l Flickable or decorate an
+    existing \l Flickable. Depending on the platform, it will add scroll bars and
+    a content frame.
+
+    Only one Item can be a direct child of the ScrollView and the child is implicitly anchored
+    to fill the scroll view.
+
+    Example:
+    \code
+    ScrollView {
+        Image { source: "largeImage.png" }
+    }
+    \endcode
+
+    In the previous example the Image item will implicitly get scroll behavior as if it was
+    used within a \l Flickable. The width and height of the child item will be used to
+    define the size of the content area.
+
+    Example:
+    \code
+    ScrollView {
+        ListView {
+            ...
+        }
+    }
+    \endcode
+
+    In this case the content size of the ScrollView will simply mirror that of its contained
+    \l flickableItem.
+
+    You can create a custom appearance for a ScrollView by
+    assigning a \l {ScrollViewStyle}.
+*/
+
+FocusScope {
+    id: root
+
+    implicitWidth: 240
+    implicitHeight: 150
+
+    /*!
+        This property tells the ScrollView if it should render
+        a frame around its content.
+
+        The default value is \c false.
+    */
+    property bool frameVisible: false
+
+    /*! \qmlproperty enumeration ScrollView::horizontalScrollBarPolicy
+        \since QtQuick.Controls 1.3
+
+        This property holds the policy for showing the horizontal scrollbar.
+        It can be any of the following values:
+        \list
+        \li Qt.ScrollBarAsNeeded
+        \li Qt.ScrollBarAlwaysOff
+        \li Qt.ScrollBarAlwaysOn
+        \endlist
+
+        The default policy is \c Qt.ScrollBarAsNeeded.
+     */
+    property alias horizontalScrollBarPolicy: scroller.horizontalScrollBarPolicy
+
+    /*! \qmlproperty enumeration ScrollView::verticalScrollBarPolicy
+        \since QtQuick.Controls 1.3
+
+        This property holds the policy for showing the vertical scrollbar.
+        It can be any of the following values:
+        \list
+        \li Qt.ScrollBarAsNeeded
+        \li Qt.ScrollBarAlwaysOff
+        \li Qt.ScrollBarAlwaysOn
+        \endlist
+
+        The default policy is \c Qt.ScrollBarAsNeeded.
+     */
+    property alias verticalScrollBarPolicy: scroller.verticalScrollBarPolicy
+
+    /*!
+        This property controls if there should be a highlight
+        around the frame when the ScrollView has input focus.
+
+        The default value is \c false.
+
+        \note This property is only applicable on some platforms, such
+        as Mac OS.
+    */
+    property bool highlightOnFocus: false
+
+    /*!
+        \qmlproperty Item ScrollView::viewport
+
+        The viewport determines the current "window" on the contentItem.
+        In other words, it clips it and the size of the viewport tells you
+        how much of the content area is visible.
+    */
+    property alias viewport: viewportItem
+
+    /*!
+        \qmlproperty Item ScrollView::flickableItem
+
+        The flickableItem of the ScrollView. If the contentItem provided
+        to the ScrollView is a Flickable, it will be the \l contentItem.
+    */
+    readonly property alias flickableItem: internal.flickableItem
+
+    /*!
+        The contentItem of the ScrollView. This is set by the user.
+
+        Note that the definition of contentItem is somewhat different to that
+        of a Flickable, where the contentItem is implicitly created.
+    */
+    default property Item contentItem
+
+    /*! \internal */
+    property alias __scroller: scroller
+    /*! \internal */
+    property alias __verticalScrollbarOffset: scroller.verticalScrollbarOffset
+    /*! \internal */
+    property alias __wheelAreaScrollSpeed: wheelArea.scrollSpeed
+    /*! \internal */
+    property int __scrollBarTopMargin: 0
+    /*! \internal */
+    property int __viewTopMargin: 0
+    /*! \internal */
+    property alias __horizontalScrollBar: scroller.horizontalScrollBar
+    /*! \internal */
+    property alias __verticalScrollBar: scroller.verticalScrollBar
+    /*! \qmlproperty Component ScrollView::style
+
+        The style Component for this control.
+        \sa {Qt Quick Controls 1 Styles QML Types}
+
+    */
+    property Component style: Settings.styleComponent(Settings.style, "ScrollViewStyle.qml", root)
+
+    /*! \internal */
+    property Style __style: styleLoader.item
+
+    activeFocusOnTab: false
+
+    onContentItemChanged: {
+
+        if (contentItem.hasOwnProperty("contentY") && // Check if flickable
+                contentItem.hasOwnProperty("contentHeight")) {
+            internal.flickableItem = contentItem // "Use content if it is a flickable
+            internal.flickableItem.parent = viewportItem
+        } else {
+            internal.flickableItem = flickableComponent.createObject(viewportItem)
+            contentItem.parent = internal.flickableItem.contentItem
+        }
+        internal.flickableItem.anchors.fill = viewportItem
+        if (!Settings.hasTouchScreen)
+            internal.flickableItem.interactive = false
+    }
+
+
+    children: Item {
+        id: internal
+
+        property Flickable flickableItem
+
+        Loader {
+            id: styleLoader
+            sourceComponent: style
+            onStatusChanged: {
+                if (status === Loader.Error)
+                    console.error("Failed to load Style for", root)
+            }
+            property alias __control: root
+        }
+
+        Qml.Binding {
+            target: flickableItem
+            property: "contentHeight"
+            when: contentItem !== flickableItem
+            value: contentItem ? contentItem.height : 0
+            restoreMode: Binding.RestoreBinding
+        }
+
+        Qml.Binding {
+            target: flickableItem
+            when: contentItem !== flickableItem
+            property: "contentWidth"
+            value: contentItem ? contentItem.width : 0
+            restoreMode: Binding.RestoreBinding
+        }
+
+        Connections {
+            target: flickableItem
+
+            function onContentYChanged() {
+                scroller.blockUpdates = true
+                scroller.verticalScrollBar.value = flickableItem.contentY - flickableItem.originY
+                scroller.blockUpdates = false
+            }
+
+            function onContentXChanged() {
+                scroller.blockUpdates = true
+                scroller.horizontalScrollBar.value = flickableItem.contentX - flickableItem.originX
+                scroller.blockUpdates = false
+            }
+
+        }
+
+        anchors.fill: parent
+
+        Component {
+            id: flickableComponent
+            Flickable {}
+        }
+
+        WheelArea {
+            id: wheelArea
+            parent: flickableItem
+            z: -1
+            // ### Note this is needed due to broken mousewheel behavior in Flickable.
+
+            anchors.fill: parent
+
+            property int acceleration: 40
+            property int flickThreshold: Settings.dragThreshold
+            property real speedThreshold: 3
+            property real ignored: 0.001 // ## flick() does not work with 0 yVelocity
+            property int maxFlick: 400
+
+            property bool horizontalRecursionGuard: false
+            property bool verticalRecursionGuard: false
+
+            horizontalMinimumValue: 0
+            horizontalMaximumValue: flickableItem ? flickableItem.contentWidth - viewport.width : 0
+            onHorizontalMaximumValueChanged: {
+                wheelArea.horizontalRecursionGuard = true
+                //if horizontalMaximumValue changed, horizontalValue may be actually synced with
+                wheelArea.horizontalValue = flickableItem.contentX - flickableItem.originX;
+                wheelArea.horizontalRecursionGuard = false
+            }
+
+            verticalMinimumValue: 0
+            verticalMaximumValue: flickableItem ? flickableItem.contentHeight - viewport.height + __viewTopMargin : 0
+            onVerticalMaximumValueChanged: {
+                wheelArea.verticalRecursionGuard = true
+                //if verticalMaximumValue changed, verticalValue may be actually synced with
+                wheelArea.verticalValue = flickableItem.contentY - flickableItem.originY;
+                wheelArea.verticalRecursionGuard = false
+            }
+
+            // The default scroll speed for typical angle-based mouse wheels. The value
+            // comes originally from QTextEdit, which sets 20px steps by default, as well as
+            // QQuickWheelArea.
+            // TODO: centralize somewhere, QPlatformTheme?
+            scrollSpeed: 20 * (__style && __style.__wheelScrollLines || 1)
+
+            Connections {
+                target: flickableItem
+
+                function onContentYChanged() {
+                    wheelArea.verticalRecursionGuard = true
+                    wheelArea.verticalValue = flickableItem.contentY - flickableItem.originY
+                    wheelArea.verticalRecursionGuard = false
+                }
+                function onContentXChanged() {
+                    wheelArea.horizontalRecursionGuard = true
+                    wheelArea.horizontalValue = flickableItem.contentX - flickableItem.originX
+                    wheelArea.horizontalRecursionGuard = false
+                }
+            }
+
+            onVerticalValueChanged: {
+                if (!verticalRecursionGuard) {
+                    var effectiveContentY = flickableItem.contentY - flickableItem.originY
+                    if (effectiveContentY < flickThreshold && verticalDelta > speedThreshold) {
+                        flickableItem.flick(ignored, Math.min(maxFlick, acceleration * verticalDelta))
+                    } else if (effectiveContentY > flickableItem.contentHeight - flickThreshold - viewport.height
+                               && verticalDelta < -speedThreshold) {
+                        flickableItem.flick(ignored, Math.max(-maxFlick, acceleration * verticalDelta))
+                    } else {
+                        flickableItem.contentY = verticalValue + flickableItem.originY
+                    }
+                }
+            }
+
+            onHorizontalValueChanged: {
+                if (!horizontalRecursionGuard)
+                    flickableItem.contentX = horizontalValue + flickableItem.originX
+            }
+        }
+
+        ScrollViewHelper {
+            id: scroller
+            anchors.fill: parent
+            active: wheelArea.active
+            property bool outerFrame: !frameVisible || !(__style ? __style.__externalScrollBars : 0)
+            property int scrollBarSpacing: outerFrame ? 0 : (__style ? __style.__scrollBarSpacing : 0)
+            property int verticalScrollbarOffset: verticalScrollBar.visible && !verticalScrollBar.isTransient ?
+                                                  verticalScrollBar.width + scrollBarSpacing : 0
+            property int horizontalScrollbarOffset: horizontalScrollBar.visible && !horizontalScrollBar.isTransient ?
+                                                    horizontalScrollBar.height + scrollBarSpacing : 0
+            Loader {
+                id: frameLoader
+                sourceComponent: __style ? __style.frame : null
+                anchors.fill: parent
+                anchors.rightMargin: scroller.outerFrame ? 0 : scroller.verticalScrollbarOffset
+                anchors.bottomMargin: scroller.outerFrame ? 0 : scroller.horizontalScrollbarOffset
+            }
+
+            Item {
+                id: viewportItem
+                anchors.fill: frameLoader
+                anchors.topMargin: frameVisible ? __style.padding.top : 0
+                anchors.leftMargin: frameVisible ? __style.padding.left : 0
+                anchors.rightMargin:  (frameVisible ? __style.padding.right : 0) +  (scroller.outerFrame ? scroller.verticalScrollbarOffset : 0)
+                anchors.bottomMargin: (frameVisible ? __style.padding.bottom : 0) + (scroller.outerFrame ? scroller.horizontalScrollbarOffset : 0)
+                clip: true
+            }
+        }
+        FocusFrame { visible: highlightOnFocus && root.activeFocus }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/ScrollView.qmlc b/deployment_test/QtQuick/Controls/ScrollView.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..e454b14f09c9ebeca2c4a806e3b89c46ebc4fd63
Binary files /dev/null and b/deployment_test/QtQuick/Controls/ScrollView.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Slider.qml b/deployment_test/QtQuick/Controls/Slider.qml
new file mode 100644
index 0000000000000000000000000000000000000000..ff2f0c234d5546c7b886e4ba44b13d69be33f596
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Slider.qml
@@ -0,0 +1,347 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQml 2.14 as Qml
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype Slider
+    \inqmlmodule QtQuick.Controls
+    \since 5.1
+    \ingroup controls
+    \brief Provides a vertical or horizontal slider control.
+
+    \image slider.png
+
+    The slider is the classic control for providing a bounded value. It lets
+    the user move a slider handle along a horizontal or vertical groove
+    and translates the handle's position into a value within the legal range.
+
+    \code
+    Slider {
+        value: 0.5
+    }
+    \endcode
+
+    The slider value is by default in the range [0, 1]. If integer values are
+    needed, you can set the \l stepSize.
+
+    You can create a custom appearance for a Slider by
+    assigning a \l {SliderStyle}.
+*/
+
+Control {
+    id: slider
+
+    /*!
+        \qmlproperty enumeration Slider::orientation
+
+        This property holds the layout orientation of the slider.
+        The default value is \c Qt.Horizontal.
+    */
+    property int orientation: Qt.Horizontal
+
+    /*!
+        \qmlproperty real Slider::minimumValue
+
+        This property holds the minimum value of the slider.
+        The default value is \c{0.0}.
+    */
+    property alias minimumValue: range.minimumValue
+
+    /*!
+        \qmlproperty real Slider::maximumValue
+
+        This property holds the maximum value of the slider.
+        The default value is \c{1.0}.
+    */
+    property alias maximumValue: range.maximumValue
+
+    /*!
+        \qmlproperty bool Slider::updateValueWhileDragging
+
+        This property indicates whether the current \l value should be updated while
+        the user is moving the slider handle, or only when the button has been released.
+        This property could for instance be modified if changing the slider value would turn
+        out to be too time consuming.
+
+        The default value is \c true.
+    */
+    property bool updateValueWhileDragging: true
+
+    /*!
+        \qmlproperty bool Slider::pressed
+
+        This property indicates whether the slider handle is being pressed.
+    */
+    readonly property alias pressed: mouseArea.pressed
+
+    /*!
+        \qmlproperty bool Slider::hovered
+
+        This property indicates whether the slider handle is being hovered.
+    */
+    readonly property alias hovered: mouseArea.handleHovered
+
+    /*!
+        \qmlproperty real Slider::stepSize
+
+        This property indicates the slider step size.
+
+        A value of 0 indicates that the value of the slider operates in a
+        continuous range between \l minimumValue and \l maximumValue.
+
+        Any non 0 value indicates a discrete stepSize. The following example
+        will generate a slider with integer values in the range [0-5].
+
+        \qml
+        Slider {
+            maximumValue: 5.0
+            stepSize: 1.0
+        }
+        \endqml
+
+        The default value is \c{0.0}.
+    */
+    property alias stepSize: range.stepSize
+
+    /*!
+        \qmlproperty real Slider::value
+
+        This property holds the current value of the slider.
+        The default value is \c{0.0}.
+    */
+    property alias value: range.value
+
+    /*!
+        \qmlproperty bool Slider::activeFocusOnPress
+
+        This property indicates whether the slider should receive active focus when
+        pressed.
+    */
+    property bool activeFocusOnPress: false
+
+    /*!
+        \qmlproperty bool Slider::tickmarksEnabled
+
+        This property indicates whether the slider should display tickmarks
+        at step intervals. Tick mark spacing is calculated based on the
+        \l stepSize property.
+
+        The default value is \c false.
+
+        \note This property may be ignored on some platforms when using the native style (e.g. Android).
+    */
+    property bool tickmarksEnabled: false
+
+    /*!
+        \qmlproperty bool Slider::wheelEnabled
+
+        This property determines whether the control handles wheel events.
+        The default value is \c true.
+
+        \since QtQuick.Controls 1.6
+    */
+    property alias wheelEnabled: wheelarea.enabled
+
+    /*! \internal */
+    property bool __horizontal: orientation === Qt.Horizontal
+
+    /*! \internal
+        The extra arguments positionAtMinimum and positionAtMaximum are there to force
+        re-evaluation of the handle position when the constraints change (QTBUG-41255),
+        and the same for range.minimumValue (QTBUG-51765) and range.maximumValue (QTBUG-63354).
+    */
+    property real __handlePos: range.valueForPosition(__horizontal ? fakeHandle.x : fakeHandle.y,
+        range.positionAtMinimum, range.positionAtMaximum, range.minimumValue, range.maximumValue)
+
+    activeFocusOnTab: true
+
+    Accessible.role: Accessible.Slider
+    /*! \internal */
+    function accessibleIncreaseAction() {
+        range.increaseSingleStep()
+    }
+    /*! \internal */
+    function accessibleDecreaseAction() {
+        range.decreaseSingleStep()
+    }
+
+    style: Settings.styleComponent(Settings.style, "SliderStyle.qml", slider)
+
+    Keys.onRightPressed: if (__horizontal) range.increaseSingleStep()
+    Keys.onLeftPressed: if (__horizontal) range.decreaseSingleStep()
+    Keys.onUpPressed: if (!__horizontal) range.increaseSingleStep()
+    Keys.onDownPressed: if (!__horizontal) range.decreaseSingleStep()
+
+    RangeModel {
+        id: range
+        minimumValue: 0.0
+        maximumValue: 1.0
+        value: 0
+        stepSize: 0.0
+        inverted: __horizontal ? false : true
+
+        positionAtMinimum: 0
+        positionAtMaximum: __horizontal ? slider.width - fakeHandle.width : slider.height - fakeHandle.height
+    }
+
+    Item {
+        id: fakeHandle
+        anchors.verticalCenter: __horizontal ? parent.verticalCenter : undefined
+        anchors.horizontalCenter: !__horizontal ? parent.horizontalCenter : undefined
+        width: __panel.handleWidth
+        height: __panel.handleHeight
+
+        function updatePos() {
+            if (updateValueWhileDragging && !mouseArea.drag.active)
+                            range.position = __horizontal ? x : y
+        }
+
+        onXChanged: updatePos();
+        onYChanged: updatePos();
+    }
+
+    MouseArea {
+        id: mouseArea
+
+        anchors.fill: parent
+        hoverEnabled: Settings.hoverEnabled
+        property int clickOffset: 0
+        property real pressX: 0
+        property real pressY: 0
+        property bool handleHovered: false
+
+        function clamp ( val ) {
+            return Math.max(range.positionAtMinimum, Math.min(range.positionAtMaximum, val))
+        }
+
+        function updateHandlePosition(mouse, force) {
+            var pos, overThreshold
+            if (__horizontal) {
+                pos = clamp (mouse.x + clickOffset - fakeHandle.width/2)
+                overThreshold = Math.abs(mouse.x - pressX) >= Settings.dragThreshold
+                if (overThreshold)
+                    preventStealing = true
+                if (overThreshold || force)
+                    fakeHandle.x = pos
+            } else if (!__horizontal) {
+                pos = clamp (mouse.y + clickOffset- fakeHandle.height/2)
+                overThreshold = Math.abs(mouse.y - pressY) >= Settings.dragThreshold
+                if (overThreshold)
+                    preventStealing = true
+                if (overThreshold || force)
+                    fakeHandle.y = pos
+            }
+        }
+
+        onPositionChanged: {
+            if (pressed)
+                updateHandlePosition(mouse, !Settings.hasTouchScreen || preventStealing)
+
+            var point = mouseArea.mapToItem(fakeHandle, mouse.x, mouse.y)
+            handleHovered = fakeHandle.contains(Qt.point(point.x, point.y))
+        }
+
+        onPressed: {
+            if (slider.activeFocusOnPress)
+                slider.forceActiveFocus();
+
+            if (handleHovered) {
+                var point = mouseArea.mapToItem(fakeHandle, mouse.x, mouse.y)
+                clickOffset = __horizontal ? fakeHandle.width/2 - point.x : fakeHandle.height/2 - point.y
+            }
+            pressX = mouse.x
+            pressY = mouse.y
+            updateHandlePosition(mouse, !Settings.hasTouchScreen)
+        }
+
+        onReleased: {
+            updateHandlePosition(mouse, Settings.hasTouchScreen)
+            // If we don't update while dragging, this is the only
+            // moment that the range is updated.
+            if (!slider.updateValueWhileDragging)
+                range.position = __horizontal ? fakeHandle.x : fakeHandle.y;
+            clickOffset = 0
+            preventStealing = false
+        }
+
+        onExited: handleHovered = false
+    }
+
+
+    // During the drag, we simply ignore the position set from the range, this
+    // means that setting a value while dragging will not "interrupt" the
+    // dragging activity.
+    Qml.Binding {
+        when: !mouseArea.drag.active
+        target: fakeHandle
+        property: __horizontal ? "x" : "y"
+        value: range.position
+        restoreMode: Binding.RestoreBinding
+    }
+
+    WheelArea {
+        id: wheelarea
+        anchors.fill: parent
+        verticalValue: slider.value
+        horizontalValue: slider.value
+        horizontalMinimumValue: slider.minimumValue
+        horizontalMaximumValue: slider.maximumValue
+        verticalMinimumValue: slider.minimumValue
+        verticalMaximumValue: slider.maximumValue
+        property real step: (slider.maximumValue - slider.minimumValue)/(range.positionAtMaximum - range.positionAtMinimum)
+
+        onVerticalWheelMoved: {
+            if (verticalDelta !== 0) {
+                var delta = Math.abs(verticalDelta)*step > stepSize ? verticalDelta*step : verticalDelta/Math.abs(verticalDelta)*stepSize
+                range.position = range.positionForValue(value - delta * (inverted ? 1 : -1))
+            }
+        }
+
+        onHorizontalWheelMoved: {
+            if (horizontalDelta !== 0) {
+                var delta = Math.abs(horizontalDelta)*step > stepSize ? horizontalDelta*step : horizontalDelta/Math.abs(horizontalDelta)*stepSize
+                range.position = range.positionForValue(value + delta * (inverted ? 1 : -1))
+            }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Slider.qmlc b/deployment_test/QtQuick/Controls/Slider.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..3aaa4e2c84e36377c10279014ca79786753dad12
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Slider.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/SpinBox.qml b/deployment_test/QtQuick/Controls/SpinBox.qml
new file mode 100644
index 0000000000000000000000000000000000000000..b7ec6a8f82484911a2f1553ef1afe43aed0ecbde
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/SpinBox.qml
@@ -0,0 +1,397 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype SpinBox
+    \inqmlmodule QtQuick.Controls
+    \since 5.1
+    \ingroup controls
+    \brief Provides a spin box control.
+
+    \image spinbox.png
+
+    SpinBox allows the user to choose a value by clicking the up or down buttons, or by
+    pressing up or down on the keyboard. The user can also type the value in manually.
+
+    By default the SpinBox provides discrete values in the range [0-99] with a \l stepSize of 1 and 0 \l decimals.
+
+    \code
+    SpinBox {
+        id: spinbox
+    }
+    \endcode
+
+    Note that if you require decimal values you will need to set the \l decimals to a non 0 value.
+
+    \code
+    SpinBox {
+        id: spinbox
+        decimals: 2
+    }
+    \endcode
+
+*/
+
+Control {
+    id: spinbox
+
+    /*!
+        \qmlproperty real SpinBox::value
+
+        The value of this SpinBox, clamped to \l minimumValue and \l maximumValue.
+
+        The default value is \c{0.0}.
+    */
+    property alias value: validator.value
+
+    /*!
+        \qmlproperty real SpinBox::minimumValue
+
+        The minimum value of the SpinBox range.
+        The \l value is clamped to this value.
+
+        The default value is \c{0.0}.
+    */
+    property alias minimumValue: validator.minimumValue
+
+    /*!
+        \qmlproperty real SpinBox::maximumValue
+
+        The maximum value of the SpinBox range.
+        The \l value is clamped to this value. If maximumValue is smaller than
+        \l minimumValue, \l minimumValue will be enforced.
+
+        The default value is \c{99}.
+    */
+    property alias maximumValue: validator.maximumValue
+
+    /*! \qmlproperty real SpinBox::stepSize
+        The amount by which the \l value is incremented/decremented when a
+        spin button is pressed.
+
+        The default value is \c{1.0}.
+    */
+    property alias stepSize: validator.stepSize
+
+    /*! \qmlproperty string SpinBox::suffix
+        The suffix for the value. I.e "cm" */
+    property alias suffix: validator.suffix
+
+    /*! \qmlproperty string SpinBox::prefix
+        The prefix for the value. I.e "$" */
+    property alias prefix: validator.prefix
+
+    /*! \qmlproperty int SpinBox::decimals
+      This property indicates the amount of decimals.
+      Note that if you enter more decimals than specified, they will
+      be truncated to the specified amount of decimal places.
+      The default value is \c{0}.
+    */
+    property alias decimals: validator.decimals
+
+    /*! \qmlproperty font SpinBox::font
+
+        This property indicates the current font used by the SpinBox.
+    */
+    property alias font: input.font
+
+    /*!
+        \qmlproperty int SpinBox::cursorPosition
+        \since QtQuick.Controls 1.5
+
+        This property holds the position of the cursor in the SpinBox.
+    */
+    property alias cursorPosition: input.cursorPosition
+
+
+    /*! This property indicates whether the Spinbox should get active
+      focus when pressed.
+      The default value is \c true.
+    */
+    property bool activeFocusOnPress: true
+
+    /*! \qmlproperty enumeration horizontalAlignment
+        \since QtQuick.Controls 1.1
+
+        This property indicates how the content is horizontally aligned
+        within the text field.
+
+        The supported values are:
+        \list
+        \li Qt.AlignLeft
+        \li Qt.AlignHCenter
+        \li Qt.AlignRight
+        \endlist
+
+      The default value is style dependent.
+    */
+    property int horizontalAlignment: __panel ? __panel.horizontalAlignment : Qt.AlignLeft
+
+    /*!
+        \qmlproperty bool SpinBox::hovered
+
+        This property indicates whether the control is being hovered.
+    */
+    readonly property bool hovered: mouseArea.containsMouse || input.containsMouse
+                                    || mouseUp.containsMouse || mouseDown.containsMouse
+
+    /*!
+        \qmlsignal SpinBox::editingFinished()
+        \since QtQuick.Controls 1.1
+
+        This signal is emitted when the Return or Enter key is pressed or
+        the control loses focus.
+
+        The corresponding handler is \c onEditingFinished.
+    */
+    signal editingFinished()
+
+    /*!
+        \qmlproperty bool SpinBox::selectByMouse
+        \since QtQuick.Controls 1.3
+
+        This property determines if the user can select the text with the
+        mouse.
+
+        The default value is \c true.
+    */
+    property bool selectByMouse: true
+
+    /*!
+        \qmlproperty bool SpinBox::inputMethodComposing
+        \since QtQuick.Controls 1.3
+
+        This property holds whether the SpinBox has partial text input from an input method.
+
+        While it is composing an input method may rely on mouse or key events from the SpinBox
+        to edit or commit the partial text. This property can be used to determine when to disable
+        events handlers that may interfere with the correct operation of an input method.
+    */
+    readonly property bool inputMethodComposing: !!input.inputMethodComposing
+
+    /*!
+        \since QtQuick.Controls 1.3
+
+        This property contains the edit \l Menu for working
+        with text selection. Set it to \c null if no menu
+        is wanted.
+    */
+    property Component menu: input.editMenu.defaultMenu
+
+    style: Settings.styleComponent(Settings.style, "SpinBoxStyle.qml", spinbox)
+
+    /*! \internal */
+    function __increment() {
+        validator.increment()
+        if (activeFocus)
+            input.selectValue()
+    }
+
+    /*! \internal */
+    function __decrement() {
+        validator.decrement()
+        if (activeFocus)
+            input.selectValue()
+    }
+
+    /*! \internal */
+    property alias __text: input.text
+
+    /*! \internal */
+    property alias __baselineOffset: input.baselineOffset
+
+    __styleData: QtObject {
+        readonly property bool upEnabled: value != maximumValue;
+        readonly property alias upHovered: mouseUp.containsMouse
+        readonly property alias upPressed: mouseUp.pressed
+
+        readonly property bool downEnabled: value != minimumValue;
+        readonly property alias downPressed: mouseDown.pressed
+        readonly property alias downHovered: mouseDown.containsMouse
+
+        readonly property int contentHeight: Math.max(input.implicitHeight, 16)
+        readonly property int contentWidth: Math.max(maxSizeHint.implicitWidth, minSizeHint.implicitWidth)
+    }
+
+    Text {
+        id: maxSizeHint
+        text: prefix + maximumValue.toFixed(decimals) + suffix
+        font: input.font
+        visible: false
+    }
+
+    Text {
+        id: minSizeHint
+        text: prefix + minimumValue.toFixed(decimals) + suffix
+        font: input.font
+        visible: false
+    }
+
+    activeFocusOnTab: true
+
+    onActiveFocusChanged: if (activeFocus) input.selectValue()
+
+    Accessible.name: input.text
+    Accessible.role: Accessible.SpinBox
+    Accessible.editable: true
+
+    MouseArea {
+        id: mouseArea
+        anchors.fill: parent
+        hoverEnabled: Settings.hoverEnabled
+        onPressed: if (activeFocusOnPress) input.forceActiveFocus()
+        onWheel: {
+            if (wheel.angleDelta.y > 0)
+                __increment();
+            else
+                __decrement();
+        }
+    }
+
+    TextInputWithHandles {
+        id: input
+        clip: contentWidth > width
+        anchors.fill: parent
+        anchors.leftMargin: __style ? __style.padding.left : 0
+        anchors.topMargin: __style ? __style.padding.top : 0
+        anchors.rightMargin: __style ? __style.padding.right: 0
+        anchors.bottomMargin: __style ? __style.padding.bottom: 0
+
+        control: spinbox
+        cursorHandle: __style ? __style.__cursorHandle : undefined
+        selectionHandle: __style ? __style.__selectionHandle : undefined
+
+        focus: true
+        activeFocusOnPress: spinbox.activeFocusOnPress
+
+        horizontalAlignment: spinbox.horizontalAlignment
+        verticalAlignment: __panel ? __panel.verticalAlignment : Qt.AlignVCenter
+        inputMethodHints: Qt.ImhFormattedNumbersOnly
+
+        validator: SpinBoxValidator {
+            id: validator
+            property bool ready: false // Delay validation until all properties are ready
+            onTextChanged: if (ready) input.text = validator.text
+            Component.onCompleted: {input.text = validator.text ; ready = true}
+        }
+        onAccepted: {
+            input.text = validator.text
+            selectValue()
+        }
+
+        Keys.forwardTo: spinbox
+
+        onEditingFinished: spinbox.editingFinished()
+
+        font: __panel ? __panel.font : TextSingleton.font
+        color: __panel ? __panel.foregroundColor : "black"
+        selectionColor: __panel ? __panel.selectionColor : "black"
+        selectedTextColor: __panel ? __panel.selectedTextColor : "black"
+
+        opacity: parent.enabled ? 1 : 0.5
+        renderType: __style ? __style.renderType : Text.NativeRendering
+
+        function selectValue() {
+            select(prefix.length, text.length - suffix.length)
+        }
+    }
+
+    // Spinbox increment button
+
+    MouseArea {
+        id: mouseUp
+        objectName: "mouseUp"
+        hoverEnabled: Settings.hoverEnabled
+
+        property var upRect: __panel  ?  __panel.upRect : null
+
+        anchors.left: parent.left
+        anchors.top: parent.top
+
+        anchors.leftMargin: upRect ? upRect.x : 0
+        anchors.topMargin: upRect ? upRect.y : 0
+
+        width: upRect ? upRect.width : 0
+        height: upRect ? upRect.height : 0
+
+        onClicked: __increment()
+        onPressed: if (!Settings.hasTouchScreen && activeFocusOnPress) input.forceActiveFocus()
+
+        property bool autoincrement: false;
+        onReleased: autoincrement = false
+        onExited: autoincrement = false
+        Timer { running: mouseUp.pressed; interval: 350 ; onTriggered: mouseUp.autoincrement = true }
+        Timer { running: mouseUp.autoincrement && mouseUp.containsMouse; interval: 60 ; repeat: true ; onTriggered: __increment() }
+    }
+
+    // Spinbox decrement button
+
+    MouseArea {
+        id: mouseDown
+        objectName: "mouseDown"
+        hoverEnabled: Settings.hoverEnabled
+
+        onClicked: __decrement()
+        onPressed: if (!Settings.hasTouchScreen && activeFocusOnPress) input.forceActiveFocus()
+
+        property var downRect: __panel ? __panel.downRect : null
+
+        anchors.left: parent.left
+        anchors.top: parent.top
+
+        anchors.leftMargin: downRect ? downRect.x : 0
+        anchors.topMargin: downRect ? downRect.y : 0
+
+        width: downRect ? downRect.width : 0
+        height: downRect ? downRect.height : 0
+
+        property bool autoincrement: false;
+        onReleased: autoincrement = false
+        onExited: autoincrement = false
+        Timer { running: mouseDown.pressed; interval: 350 ; onTriggered: mouseDown.autoincrement = true }
+        Timer { running: mouseDown.autoincrement && mouseDown.containsMouse; interval: 60 ; repeat: true ; onTriggered: __decrement() }
+    }
+
+    Keys.onUpPressed: __increment()
+    Keys.onDownPressed: __decrement()
+}
diff --git a/deployment_test/QtQuick/Controls/SpinBox.qmlc b/deployment_test/QtQuick/Controls/SpinBox.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..b6947e4f26c38675ac0b758f197fd8fefdcbc87f
Binary files /dev/null and b/deployment_test/QtQuick/Controls/SpinBox.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/SplitView.qml b/deployment_test/QtQuick/Controls/SplitView.qml
new file mode 100644
index 0000000000000000000000000000000000000000..471e70a07a0e5c2269bbd71c2e22e243f18b32f4
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/SplitView.qml
@@ -0,0 +1,633 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Layouts 1.0
+import QtQuick.Controls.Private 1.0 as Private
+import QtQuick.Window 2.1
+
+/*!
+    \qmltype SplitView
+    \inqmlmodule QtQuick.Controls
+    \since 5.1
+    \ingroup views
+    \ingroup controls
+    \brief Lays out items with a draggable splitter between each item.
+
+    \image splitview.png
+
+    SplitView is a control that lays out items horizontally or
+    vertically with a draggable splitter between each item.
+
+    There will always be one (and only one) item in the SplitView that has \l{Layout::fillWidth}{Layout.fillWidth}
+    set to \c true (or \l{Layout::fillHeight}{Layout.fillHeight}, if orientation is Qt.Vertical). This means that the
+    item will get all leftover space when other items have been laid out.
+    By default, the last visible child of the SplitView will have this set, but
+    it can be changed by explicitly setting fillWidth to \c true on another item.
+
+    As the fillWidth item will automatically be resized to fit the extra space, explicit assignments
+    to its width and height properties will be ignored (but \l{Layout::minimumWidth}{Layout.minimumWidth} and
+    \l{Layout::maximumWidth}{Layout.maximumWidth} will still be respected).
+    The initial sizes of other items should be set via their width and height properties.
+    Any binding assignment to an item's width or height will be broken as soon as the user
+    drags that item's splitter handle.
+
+    A handle can belong to the item either on the left or top side, or on the right or bottom side:
+    \list
+    \li If the fillWidth item is to the right: the handle belongs to the left item.
+    \li if the fillWidth item is on the left: the handle belongs to the right item.
+    \endlist
+
+    This will again control which item gets resized when the user drags a handle,
+    and which handle gets hidden when an item is told to hide.
+
+    SplitView supports setting attached Layout properties on child items, which
+    means that you can set the following attached properties for each child:
+    \list
+        \li \l{Layout::minimumWidth}{Layout.minimumWidth}
+        \li \l{Layout::minimumHeight}{Layout.minimumHeight}
+        \li \l{Layout::maximumWidth}{Layout.maximumWidth}
+        \li \l{Layout::maximumHeight}{Layout.maximumHeight}
+        \li \l{Layout::fillWidth}{Layout.fillWidth} (\c true for only one child)
+        \li \l{Layout::fillHeight}{Layout.fillHeight} (\c true for only one child)
+    \endlist
+
+    \note import QtQuick.Layouts 1.0 in your QML file in order to use the Layout
+    attached properties inside SplitView.
+
+    Example:
+
+    To create a SplitView with three items, and let the center item get superfluous space, one
+    could do the following:
+
+    \qml
+    SplitView {
+        anchors.fill: parent
+        orientation: Qt.Horizontal
+
+        Rectangle {
+            width: 200
+            Layout.maximumWidth: 400
+            color: "lightblue"
+            Text {
+                text: "View 1"
+                anchors.centerIn: parent
+            }
+        }
+        Rectangle {
+            id: centerItem
+            Layout.minimumWidth: 50
+            Layout.fillWidth: true
+            color: "lightgray"
+            Text {
+                text: "View 2"
+                anchors.centerIn: parent
+            }
+        }
+        Rectangle {
+            width: 200
+            color: "lightgreen"
+            Text {
+                text: "View 3"
+                anchors.centerIn: parent
+            }
+        }
+    }
+
+   \endqml
+*/
+
+Item {
+    id: root
+
+    /*!
+        \qmlproperty enumeration SplitView::orientation
+
+        This property holds the orientation of the SplitView.
+        The value can be either \c Qt.Horizontal or \c Qt.Vertical.
+        The default value is \c Qt.Horizontal.
+    */
+    property int orientation: Qt.Horizontal
+
+    /*!
+        This property holds the delegate that will be instantiated between each
+        child item. Inside the delegate the following properties are available:
+
+        \table
+            \row \li readonly property bool styleData.index \li Specifies the index of the splitter handle. The handle
+                                                         between the first and the second item will get index 0,
+                                                         the next handle index 1 etc.
+            \row \li readonly property bool styleData.hovered \li The handle is being hovered.
+            \row \li readonly property bool styleData.pressed \li The handle is being pressed.
+            \row \li readonly property bool styleData.resizing \li The handle is being dragged.
+        \endtable
+
+*/
+    property Component handleDelegate: Rectangle {
+        width: 1
+        height: 1
+        color: Qt.darker(pal.window, 1.5)
+    }
+
+    /*!
+        This propery is \c true when the user is resizing any of the items by
+        dragging on the splitter handles.
+    */
+    property bool resizing: false
+
+    /*! \internal */
+    default property alias __contents: contents.data
+    /*! \internal */
+    property alias __items: splitterItems.children
+    /*! \internal */
+    property alias __handles: splitterHandles.children
+
+    clip: true
+    Component.onCompleted: d.init()
+    onWidthChanged: d.updateLayout()
+    onHeightChanged: d.updateLayout()
+    onOrientationChanged: d.changeOrientation()
+
+    /*! \qmlmethod void SplitView::addItem(Item item)
+        Add an \a item to the end of the view.
+        \since QtQuick.Controls 1.3 */
+    function addItem(item) {
+        d.updateLayoutGuard = true
+        d.addItem_impl(item)
+        d.calculateImplicitSize()
+        d.updateLayoutGuard = false
+        d.updateFillIndex()
+    }
+
+    /*! \qmlmethod void SplitView::removeItem(Item item)
+        Remove \a item from the view.
+        \since QtQuick.Controls 1.4 */
+    function removeItem(item) {
+        d.updateLayoutGuard = true
+        var result = d.removeItem_impl(item)
+        if (result !== null) {
+            d.calculateImplicitSize()
+            d.updateLayoutGuard = false
+            d.updateFillIndex()
+        }
+        else {
+            d.updateLayoutGuard = false
+        }
+    }
+
+    SystemPalette { id: pal }
+
+    QtObject {
+        id: d
+
+        readonly property string leftMargin: horizontal ? "leftMargin" : "topMargin"
+        readonly property string topMargin: horizontal ? "topMargin" : "leftMargin"
+        readonly property string rightMargin: horizontal ? "rightMargin" : "bottomMargin"
+
+        property bool horizontal: orientation == Qt.Horizontal
+        readonly property string minimum: horizontal ? "minimumWidth" : "minimumHeight"
+        readonly property string maximum: horizontal ? "maximumWidth" : "maximumHeight"
+        readonly property string otherMinimum: horizontal ? "minimumHeight" : "minimumWidth"
+        readonly property string otherMaximum: horizontal ? "maximumHeight" : "maximumWidth"
+        readonly property string offset: horizontal ? "x" : "y"
+        readonly property string otherOffset: horizontal ? "y" : "x"
+        readonly property string size: horizontal ? "width" : "height"
+        readonly property string otherSize: horizontal ? "height" : "width"
+        readonly property string implicitSize: horizontal ? "implicitWidth" : "implicitHeight"
+        readonly property string implicitOtherSize: horizontal ? "implicitHeight" : "implicitWidth"
+
+        property int fillIndex: -1
+        property bool updateLayoutGuard: true
+
+        function extraMarginSize(item, other) {
+            if (typeof(other) === 'undefined')
+                other = false;
+            if (other === horizontal)
+                // vertical
+                return item.Layout.topMargin + item.Layout.bottomMargin
+            return item.Layout.leftMargin + item.Layout.rightMargin
+        }
+
+        function addItem_impl(item)
+        {
+            // temporarily set fillIndex to new item
+            fillIndex = __items.length
+            if (splitterItems.children.length > 0)
+                handleLoader.createObject(splitterHandles, {"__handleIndex":splitterItems.children.length - 1})
+
+            item.parent = splitterItems
+            d.initItemConnections(item)
+        }
+
+        function initItemConnections(item)
+        {
+            // should match disconnections in terminateItemConnections
+            item.widthChanged.connect(d.updateLayout)
+            item.heightChanged.connect(d.updateLayout)
+            item.Layout.maximumWidthChanged.connect(d.updateLayout)
+            item.Layout.minimumWidthChanged.connect(d.updateLayout)
+            item.Layout.maximumHeightChanged.connect(d.updateLayout)
+            item.Layout.minimumHeightChanged.connect(d.updateLayout)
+            item.Layout.leftMarginChanged.connect(d.updateLayout)
+            item.Layout.topMarginChanged.connect(d.updateLayout)
+            item.Layout.rightMarginChanged.connect(d.updateLayout)
+            item.Layout.bottomMarginChanged.connect(d.updateLayout)
+            item.visibleChanged.connect(d.updateFillIndex)
+            item.Layout.fillWidthChanged.connect(d.updateFillIndex)
+            item.Layout.fillHeightChanged.connect(d.updateFillIndex)
+        }
+
+        function terminateItemConnections(item)
+        {
+            // should match connections in initItemConnections
+            item.widthChanged.disconnect(d.updateLayout)
+            item.heightChanged.disconnect(d.updateLayout)
+            item.Layout.maximumWidthChanged.disconnect(d.updateLayout)
+            item.Layout.minimumWidthChanged.disconnect(d.updateLayout)
+            item.Layout.maximumHeightChanged.disconnect(d.updateLayout)
+            item.Layout.minimumHeightChanged.disconnect(d.updateLayout)
+            item.visibleChanged.disconnect(d.updateFillIndex)
+            item.Layout.fillWidthChanged.disconnect(d.updateFillIndex)
+            item.Layout.fillHeightChanged.disconnect(d.updateFillIndex)
+        }
+
+        function removeItem_impl(item)
+        {
+            var pos = itemPos(item)
+
+            // Check pos range
+            if (pos < 0 || pos >= __items.length)
+                return null
+
+            // Temporary unset the fillIndex
+            fillIndex = __items.length - 1
+
+            // Remove the handle at the left/right of the item that
+            // is going to be removed
+            var handlePos = -1
+            var hasPrevious = pos > 0
+            var hasNext = (pos + 1) < __items.length
+
+            if (hasPrevious)
+                handlePos = pos-1
+            else if (hasNext)
+                handlePos = pos
+            if (handlePos >= 0) {
+                var handle = __handles[handlePos]
+                handle.visible = false
+                handle.parent = null
+                handle.destroy()
+                for (var i = handlePos; i < __handles.length; ++i)
+                    __handles[i].__handleIndex = i
+            }
+
+            // Remove the item.
+            // Disconnect the item to be removed
+            terminateItemConnections(item)
+            item.parent = null
+
+            return item
+        }
+
+        function itemPos(item)
+        {
+            for (var i = 0; i < __items.length; ++i)
+                if (item === __items[i])
+                    return i
+            return -1
+        }
+
+        function init()
+        {
+            for (var i=0; i<__contents.length; ++i) {
+                var item = __contents[i];
+                if (!item.hasOwnProperty("x"))
+                    continue
+                addItem_impl(item)
+                i-- // item was removed from list
+            }
+
+            d.calculateImplicitSize()
+            d.updateLayoutGuard = false
+            d.updateFillIndex()
+        }
+
+        function updateFillIndex()
+        {
+            if (lastItem.visible !== root.visible)
+                return
+            var policy = (root.orientation === Qt.Horizontal) ? "fillWidth" : "fillHeight"
+            for (var i=0; i<__items.length-1; ++i) {
+                if (__items[i].Layout[policy] === true)
+                    break;
+            }
+
+            d.fillIndex = i
+            d.updateLayout()
+        }
+
+        function changeOrientation()
+        {
+            if (__items.length == 0)
+                return;
+            d.updateLayoutGuard = true
+
+            // Swap width/height for items and handles:
+            for (var i=0; i<__items.length; ++i) {
+                var item = __items[i]
+                var tmp = item.x
+                item.x = item.y
+                item.y = tmp
+                tmp = item.width
+                item.width = item.height
+                item.height = tmp
+
+                var handle = __handles[i]
+                if (handle) {
+                    tmp = handle.x
+                    handle.x = handle.y
+                    handle.y = handle.x
+                    tmp = handle.width
+                    handle.width = handle.height
+                    handle.height = tmp
+                }
+            }
+
+            // Change d.horizontal explicit, since the binding will change too late:
+            d.horizontal = orientation == Qt.Horizontal
+            d.updateLayoutGuard = false
+            d.updateFillIndex()
+        }
+
+        function calculateImplicitSize()
+        {
+            var implicitSize = 0
+            var implicitOtherSize = 0
+
+            for (var i=0; i<__items.length; ++i) {
+                var item = __items[i];
+                implicitSize += clampedMinMax(item[d.size], item.Layout[minimum], item.Layout[maximum]) + extraMarginSize(item)
+                var os = clampedMinMax(item[otherSize], item.Layout[otherMinimum], item.Layout[otherMaximum]) + extraMarginSize(item, true)
+                implicitOtherSize = Math.max(implicitOtherSize, os)
+
+                var handle = __handles[i]
+                if (handle)
+                    implicitSize += handle[d.size]  //### Can handles have margins??
+            }
+
+            root[d.implicitSize] = implicitSize
+            root[d.implicitOtherSize] = implicitOtherSize
+        }
+
+        function clampedMinMax(value, minimum, maximum)
+        {
+            if (value < minimum)
+                value = minimum
+            if (value > maximum)
+                value = maximum
+            return value
+        }
+
+        function accumulatedSize(firstIndex, lastIndex, includeFillItemMinimum)
+        {
+            // Go through items and handles, and
+            // calculate their accummulated width.
+            var w = 0
+            for (var i=firstIndex; i<lastIndex; ++i) {
+
+                var item = __items[i]
+                if (item.visible || i == d.fillIndex) {
+                    if (i !== d.fillIndex)
+                        w += item[d.size] + extraMarginSize(item)
+                    else if (includeFillItemMinimum && item.Layout[minimum] !== undefined)
+                        w += item.Layout[minimum] + extraMarginSize(item)
+                }
+
+                var handle = __handles[i]
+                if (handle && handle.visible)
+                    w += handle[d.size]
+            }
+            return w
+        }
+
+        function updateLayout()
+        {
+            // This function will reposition both handles and
+            // items according to the their width/height:
+            if (__items.length === 0)
+                return;
+            if (!lastItem.visible)
+                return;
+            if (d.updateLayoutGuard === true)
+                return
+            d.updateLayoutGuard = true
+
+            // Ensure all items within their min/max:
+            for (var i=0; i<__items.length; ++i) {
+                if (i !== d.fillIndex) {
+                    var item = __items[i];
+                    var clampedSize = clampedMinMax(item[d.size], item.Layout[d.minimum], item.Layout[d.maximum])
+                    if (clampedSize != item[d.size])
+                        item[d.size] = clampedSize
+                }
+            }
+
+            // Set size of fillItem to remaining available space.
+            // Special case: If SplitView size is zero, we leave fillItem with the size
+            // it already got, and assume that SplitView ends up with implicit size as size:
+            if (root[d.size] != 0) {
+                var fillItem = __items[fillIndex]
+                var superfluous = root[d.size] - d.accumulatedSize(0, __items.length, false)
+                fillItem[d.size] = clampedMinMax(superfluous - extraMarginSize(fillItem), fillItem.Layout[minimum], fillItem.Layout[maximum]);
+            }
+
+            // Position items and handles according to their width:
+            var lastVisibleItem, lastVisibleHandle, handle
+            var pos = 0;
+            for (i=0; i<__items.length; ++i) {
+                // Position item to the right of the previous visible handle:
+                item = __items[i];
+                if (item.visible || i == d.fillIndex) {
+                    pos += item.Layout[leftMargin]
+                    item[d.offset] = pos
+                    item[d.otherOffset] = item.Layout[topMargin]
+                    item[d.otherSize] = clampedMinMax(root[otherSize], item.Layout[otherMinimum], item.Layout[otherMaximum]) - extraMarginSize(item, true)
+                    lastVisibleItem = item
+                    pos += Math.max(0, item[d.size]) + item.Layout[rightMargin]
+                }
+
+                handle = __handles[i]
+                if (handle && handle.visible) {
+                    handle[d.offset] = pos
+                    handle[d.otherOffset] = 0   //### can handles have margins?
+                    handle[d.otherSize] = root[d.otherSize]
+                    lastVisibleHandle = handle
+                    pos += handle[d.size]
+                }
+            }
+
+            d.updateLayoutGuard = false
+        }
+    }
+
+    Component {
+        id: handleLoader
+        Loader {
+            id: itemHandle
+
+            property int __handleIndex: -1
+            property QtObject styleData: QtObject {
+                readonly property int index: __handleIndex
+                readonly property alias hovered: mouseArea.containsMouse
+                readonly property alias pressed: mouseArea.pressed
+                readonly property bool resizing: mouseArea.drag.active
+                onResizingChanged: root.resizing = resizing
+            }
+            property bool resizeLeftItem: (d.fillIndex > __handleIndex)
+            visible: __items[__handleIndex + (resizeLeftItem ? 0 : 1)].visible
+            sourceComponent: handleDelegate
+            onWidthChanged: d.updateLayout()
+            onHeightChanged: d.updateLayout()
+            onXChanged: moveHandle()
+            onYChanged: moveHandle()
+
+            MouseArea {
+                id: mouseArea
+                anchors.fill: parent
+                property real defaultMargin: Private.Settings.hasTouchScreen ? Screen.pixelDensity * 3.5 : 2
+                anchors.leftMargin: (parent.width <= 1) ? -defaultMargin : 0
+                anchors.rightMargin: (parent.width <= 1) ? -defaultMargin : 0
+                anchors.topMargin: (parent.height <= 1) ? -defaultMargin : 0
+                anchors.bottomMargin: (parent.height <= 1) ? -defaultMargin : 0
+                hoverEnabled: Private.Settings.hoverEnabled
+                drag.threshold: 0
+                drag.target: parent
+                drag.axis: root.orientation === Qt.Horizontal ? Drag.XAxis : Drag.YAxis
+                cursorShape: root.orientation === Qt.Horizontal ? Qt.SplitHCursor : Qt.SplitVCursor
+            }
+
+            function moveHandle() {
+                // Moving the handle means resizing an item. Which one,
+                // left or right, depends on where the fillItem is.
+                // 'updateLayout' will be overridden in case new width violates max/min.
+                // 'updateLayout' will be triggered when an item changes width.
+                if (d.updateLayoutGuard)
+                    return
+
+                var leftHandle, leftItem, rightItem, rightHandle
+                var leftEdge, rightEdge, newWidth, leftStopX, rightStopX
+                var i
+
+                if (resizeLeftItem) {
+                    // Ensure that the handle is not crossing other handles. So
+                    // find the first visible handle to the left to determine the left edge:
+                    leftEdge = 0
+                    for (i=__handleIndex-1; i>=0; --i) {
+                        leftHandle = __handles[i]
+                        if (leftHandle.visible) {
+                            leftEdge = leftHandle[d.offset] + leftHandle[d.size]
+                            break;
+                        }
+                    }
+
+                    // Ensure: leftStopX >= itemHandle[d.offset] >= rightStopX
+                    var min = d.accumulatedSize(__handleIndex+1, __items.length, true)
+                    rightStopX = root[d.size] - min - itemHandle[d.size]
+                    leftStopX = Math.max(leftEdge, itemHandle[d.offset])
+                    itemHandle[d.offset] = Math.min(rightStopX, Math.max(leftStopX, itemHandle[d.offset]))
+
+                    newWidth = itemHandle[d.offset] - leftEdge
+                    leftItem = __items[__handleIndex]
+                    // The next line will trigger 'updateLayout':
+                    leftItem[d.size] = newWidth
+                } else {
+                    // Resize item to the right.
+                    // Ensure that the handle is not crossing other handles. So
+                    // find the first visible handle to the right to determine the right edge:
+                    rightEdge = root[d.size]
+                    for (i=__handleIndex+1; i<__handles.length; ++i) {
+                        rightHandle = __handles[i]
+                        if (rightHandle.visible) {
+                            rightEdge = rightHandle[d.offset]
+                            break;
+                        }
+                    }
+
+                    // Ensure: leftStopX <= itemHandle[d.offset] <= rightStopX
+                    min = d.accumulatedSize(0, __handleIndex+1, true)
+                    leftStopX = min - itemHandle[d.size]
+                    rightStopX = Math.min((rightEdge - itemHandle[d.size]), itemHandle[d.offset])
+                    itemHandle[d.offset] = Math.max(leftStopX, Math.min(itemHandle[d.offset], rightStopX))
+
+                    newWidth = rightEdge - (itemHandle[d.offset] + itemHandle[d.size])
+                    rightItem = __items[__handleIndex+1]
+                    // The next line will trigger 'updateLayout':
+                    rightItem[d.size] = newWidth
+                }
+            }
+        }
+    }
+
+    Item {
+        id: contents
+        visible: false
+        anchors.fill: parent
+    }
+    Item {
+        id: splitterItems
+        anchors.fill: parent
+    }
+    Item {
+        id: splitterHandles
+        anchors.fill: parent
+    }
+
+    Item {
+        id: lastItem
+        onVisibleChanged: d.updateFillIndex()
+    }
+
+    Component.onDestruction: {
+        for (var i=0; i<splitterItems.children.length; ++i) {
+            var item = splitterItems.children[i];
+            d.terminateItemConnections(item)
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/SplitView.qmlc b/deployment_test/QtQuick/Controls/SplitView.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..6e0d43ed5b1e3895685346b8bdd5933777d4222e
Binary files /dev/null and b/deployment_test/QtQuick/Controls/SplitView.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/StackView.qml b/deployment_test/QtQuick/Controls/StackView.qml
new file mode 100644
index 0000000000000000000000000000000000000000..290d24c23038f96d487bb1a6c51cc29ee9ea744b
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/StackView.qml
@@ -0,0 +1,996 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype StackView
+    \inherits Item
+    \ingroup views
+    \ingroup controls
+    \inqmlmodule QtQuick.Controls
+    \since 5.1
+
+    \brief Provides a stack-based navigation model.
+
+    \image stackview.png
+
+    StackView implements a stack-based navigation model, which can be used
+    with a set of interlinked information pages. Items are pushed onto the stack
+    as the user navigates deeper into the material, and popped off again when he
+    chooses to go back.
+
+    The \l{Qt Quick Controls 1 - Touch Gallery}{touch gallery} example is a good
+    starting point to understand how StackView works. The following snippet
+    from the example shows how it can be used:
+
+    \qml
+    StackView {
+        id: stack
+        initialItem: view
+
+        Component {
+            id: view
+
+            MouseArea {
+                Text {
+                    text: stack.depth
+                    anchors.centerIn: parent
+                }
+                onClicked: stack.push(view)
+            }
+        }
+    }
+    \endqml
+
+    \section1 Using StackView in an Application
+    Using StackView in an application is typically a simple matter of adding
+    the StackView as a child of a Window. The stack is usually anchored to the
+    edges of the window, except at the top or bottom where it might be anchored
+    to a status bar, or some other similar UI component. The stack can then be
+    used by invoking its navigation methods. The first item to show in the StackView
+    is the one that was assigned to \l initialItem.
+
+    \note Items pushed onto the stack view have \l{Supported Attached Properties}{Stack attached properties}.
+
+    \section1 Basic Navigation
+    There are three primary navigation operations in StackView: push(), pop(), and
+    replace (replace by specifying argument \c replace to push()).
+    These correspond to classic stack operations where "push" adds an item to the
+    top of a stack, "pop" removes the top item from the stack, and "replace" is like a
+    pop followed by a push, in that it replaces the topmost item on the stack with
+    a new item (but the applied transtition might be different). The topmost item
+    in the stack corresponds to the one that is \l{StackView::currentItem} {currently}
+    visible on the screen. That means that "push" is the logical equivalent of navigating
+    forward or deeper into the application, "pop" is the equivalent of navigating back,
+    and "replace" is the equivalent of replacing the current item.
+
+    Sometimes it is necessary to go back more than a single step in the stack, for
+    example, to return to a "main" item or some kind of section item in the application.
+    For this use case, it is possible to specify an item as a parameter for pop().
+    This is called an "unwind" operation as the stack gets unwound to the specified item.
+    If the item is not found, then the stack unwinds until there is only a single item in
+    the stack, which then becomes the current item. To explicitly unwind to the bottom
+    of the stack, it is recommended to use \l{pop()} {pop(null)}, though technically any
+    non-existent item will do.
+
+    Given the stack [A, B, C]:
+
+    \list
+    \li \l{push()}{push(D)} => [A, B, C, D] - "push" transition animation between C and D
+    \li pop() => [A, B] - "pop" transition animation between C and B
+    \li \l{push()}{push(D, replace)} => [A, B, D] - "replace" transition between C and D
+    \li \l{pop()}{pop(A)} => [A] - "pop" transition between C and A
+    \endlist
+
+    \note When the stack is empty, a push() will not perform a
+    transition animation because there is nothing to transition from (typically during
+    application start-up). A pop() on a stack with depth 1 or 0 is a no-operation.
+    If all items need to be removed from the stack, a separate function clear() is
+    available.
+
+    Calling push() returns the item that was pushed onto the stack.
+    Calling pop() returns the item that was popped off the stack. When pop() is
+    called in an unwind operation, the top-most item (the first item that was
+    popped, which will also be the one transitioning out) is returned.
+
+    \section1 Deep Linking
+    \e{Deep linking} means launching an application into a particular state. For example,
+    a newspaper application could be launched into showing a particular article,
+    bypassing the front item (and possibly a section item) that would normally have
+    to be navigated through to get to the article concerned. In terms of StackView, deep
+    linking means the ability to modify the state of the stack, so much so that it is
+    possible to push a set of items to the top of the stack, or to completely reset
+    the stack to a given state.
+
+    The API for deep linking in StackView is the same as for basic navigation. Pushing
+    an array instead of a single item, will involve that all the items in that array will
+    be pushed onto the stack. The transition animation, however, will be conducted as
+    if only the last item in the array was pushed onto the stack. The normal semantics
+    of push() apply for deep linking, meaning that push() adds whatever is pushed onto
+    the stack. Note also that only the last item of the array will be loaded.
+    The rest will be lazy-loaded as needed when entering the screen upon subsequent
+    calls to pop (or when requesting the item by using \a get).
+
+    This gives us the following result, given the stack [A, B, C]:
+
+    \list
+    \li \l{push()}{push([D, E, F])} => [A, B, C, D, E, F] - "push" transition animation between C and F
+    \li \l{push()}{push([D, E, F], replace)} => [A, B, D, E, F] - "replace" transition animation between C and F
+    \li clear(); \l{push()}{push([D, E, F])} => [D, E, F] - no transition animation (since the stack was empty)
+    \endlist
+
+    \section1 Pushing items
+
+    An item pushed onto the StackView can be either an Item, a URL, a string
+    containing a URL, or a Component. To push it, assign it to a property "item"
+    inside a property list, and pass it as an argument to \l{StackView::push}{push}:
+
+    \code
+    stackView.push({item: yourItem})
+    \endcode
+
+    The list can contain several properties that control how the item should be pushed:
+    \list
+    \li \c item: this property is required, and holds the item to be pushed.
+    \li \c properties: a list of QML properties to be assigned to the item upon push. These
+        properties will be copied into the item at load time, or when the item will become
+        the current item (normally upon push).
+    \li \c immediate: set this property to \c true to skip transition effects. When pushing
+        an array, this property only needs to be set on the first element to make the
+        whole operation immediate.
+    \li \c replace: set this property to replace the current item on the stack. When pushing
+        an array, you only need to set this property on the first element to replace
+        as many elements on the stack as inside the array.
+    \li \c destroyOnPop: set this boolean to \c true if StackView needs to destroy the item when
+        it is popped off the stack. By default (if \a destroyOnPop is not specified), StackView
+        will destroy items pushed as components or URLs. Items not destroyed will be re-parented
+        back to the original parents they had before being pushed onto the stack and hidden.
+        If you need to set this property, do it with care, so that items are not leaked.
+    \endlist
+
+    If the only argument needed is "item", the following short-hand notation can be applied:
+
+    \code
+    stackView.push(yourItem)
+    \endcode
+
+    You can push several items in one go by using an array of property lists. This is
+    more efficient than pushing items one by one, as StackView can then load only the
+    last item in the list. The rest will be loaded as they are about to become
+    the current item (which happens when the stack is popped). The following example shows how
+    to push an array of items:
+
+    \code
+    stackView.push([{item: yourItem1}, {item: yourItem2}])
+    \endcode
+
+    If an inline item is pushed, the item is temporarily re-parented into the StackView. When the item
+    is later popped off, it gets re-parented back to its original owner again.
+    If, however, an item is pushed as a component or a URL, the actual item will be created as an
+    item from that component. This happens automatically when the item is about to become the current
+    item in the stack. Ownership of the item will then normally be taken by the StackView, which will
+    automatically destroy the item when it is later popped off. The component that declared the item, by
+    contrast, remains in the ownership of the application and is not destroyed by the stack.
+    This can be overridden by explicitly setting \c{destroyOnPop} in the list of arguments given to push.
+
+    If the \c properties to be pushed are specified, they will be copied into the item at loading time
+    (in case of a component or URL), or when the item becomes the current item (in case of an inline
+    item). The following example shows how this can be done:
+
+    \code
+    stackView.push({item: someItem, properties: {fgcolor: "red", bgcolor: "blue"}})
+    \endcode
+
+
+    \note If an item is declared inside another item, and that parent gets destroyed,
+    (even if a component was used), that child item will also be destroyed.
+    This follows normal Qt parent-child destruction rules, but sometimes comes as a surprise
+    for developers.
+
+    \section1 Lifecycle
+    An item's lifecycle in the StackView can have the following transitions:
+    \list 1
+    \li instantiation
+    \li inactive
+    \li activating
+    \li active
+    \li deactivating
+    \li inactive
+    \li destruction
+    \endlist
+
+    It can move any number of times between inactive and active. When an item is activated,
+    it's visible on the screen and is considered to be the current item. An item
+    in a StackView that is not visible is not activated, even if the item is currently the
+    top-most item in the stack. When the stack becomes visible, the item that is top-most gets
+    activated. Likewise if the stack is then hidden, the topmost item would be deactivated.
+    Popping the item off the top of the stack at this point would not result in further
+    deactivation since the item is not active.
+
+    There is an attached \l{Stack::status}{Stack.status} property that tracks the lifecycle. This
+    property is an enumeration with the following values: \c Stack.Inactive, \c Stack.Activating,
+    \c Stack.Active and \c Stack.Deactivating. Combined with the normal \c Component.onComplete and
+    \c Component.onDestruction signals, the entire lifecycle is thus:
+
+    \list
+    \li Created: Component.onCompleted()
+    \li Activating: Stack.onStatusChanged (Stack.status is Stack.Activating)
+    \li Acivated: Stack.onStatusChanged (Stack.status is Stack.Active)
+    \li Deactivating: Stack.onStatusChanged (Stack.status is Stack.Deactivating)
+    \li Deactivated: Stack.onStatusChanged (Stack.status is Stack.Inactive)
+    \li Destruction: Component.onDestruction()
+    \endlist
+
+    \section1 Finding items
+    Sometimes it is necessary to search for an item, for example, in order to unwind the stack to
+    an item to which the application does not have a reference. This is facilitated using a
+    function find() in StackView. The find() function takes a callback function as its
+    only argument. The callback gets invoked for each item in the stack (starting at the top).
+    If the callback returns true, then it signals that a match has been found and the find()
+    function returns that item. If the callback fails to return true (no match is found),
+    then find() returns \c null.
+
+    The code below searches for an item in the stack that has a name "order_id" and then unwinds to
+    that item. Note that since find() returns \c {null} if no item is found, and since pop unwinds to
+    the bottom of the stack if null is given as the target item, the code works well even in
+    case no matching item is found.
+
+    \code
+    stackView.pop(stackView.find(function(item) {
+        return item.name == "order_id";
+    }));
+    \endcode
+
+    You can also get to an item in the stack using \l {get()}{get(index)}. You should use
+    this function if your item depends on another item in the stack, as the function will
+    ensure that the item at the given index gets loaded before it is returned.
+
+    \code
+    previousItem = stackView.get(myItem.Stack.index - 1));
+    \endcode
+
+    \section1 Transitions
+
+    A transition is performed whenever a item is pushed or popped, and consists of
+    two items: enterItem and exitItem. The StackView itself will never move items
+    around, but instead delegates the job to an external animation set provided
+    by the style or the application developer. How items should visually enter and leave the stack
+    (and the geometry they should end up with) is therefore completely controlled from the outside.
+
+    When the transition starts, the StackView will search for a transition that
+    matches the operation executed. There are three transitions to choose
+    from: \l {StackViewDelegate::}{pushTransition}, \l {StackViewDelegate::}{popTransition},
+    and \l {StackViewDelegate::}{replaceTransition}. Each implements how
+    \c enterItem should animate in, and \c exitItem out. The transitions are
+    collected inside a StackViewDelegate object assigned to
+    \l {StackView::delegate}{delegate}. By default, popTransition and
+    replaceTransition will be the same as pushTransition, unless you set them
+    to something else.
+
+    A simple fade transition could be implemented as:
+
+    \qml
+    StackView {
+        delegate: StackViewDelegate {
+            function transitionFinished(properties)
+            {
+                properties.exitItem.opacity = 1
+            }
+
+            pushTransition: StackViewTransition {
+                PropertyAnimation {
+                    target: enterItem
+                    property: "opacity"
+                    from: 0
+                    to: 1
+                }
+                PropertyAnimation {
+                    target: exitItem
+                    property: "opacity"
+                    from: 1
+                    to: 0
+                }
+            }
+        }
+    }
+    \endqml
+
+    PushTransition needs to inherit from StackViewTransition, which is a ParallelAnimation that
+    contains the properties \c enterItem and \c exitItem. These items should be assigned to the
+    \c target property of animations within the transition. Since the same items instance can
+    be pushed several times to a StackView, you should always override
+    \l {StackViewDelegate::transitionFinished()}{StackViewDelegate.transitionFinished()}.
+    Implement this function to reset any properties animated on the exitItem so that later
+    transitions can expect the items to be in a default state.
+
+    A more complex example could look like the following. Here, the items are lying on the side before
+    being rotated to an upright position:
+
+    \qml
+    StackView {
+        delegate: StackViewDelegate {
+            function transitionFinished(properties)
+            {
+                properties.exitItem.x = 0
+                properties.exitItem.rotation = 0
+            }
+
+            pushTransition: StackViewTransition {
+                SequentialAnimation {
+                    ScriptAction {
+                        script: enterItem.rotation = 90
+                    }
+                    PropertyAnimation {
+                        target: enterItem
+                        property: "x"
+                        from: enterItem.width
+                        to: 0
+                    }
+                    PropertyAnimation {
+                        target: enterItem
+                        property: "rotation"
+                        from: 90
+                        to: 0
+                    }
+                }
+                PropertyAnimation {
+                    target: exitItem
+                    property: "x"
+                    from: 0
+                    to: -exitItem.width
+                }
+            }
+        }
+    }
+    \endqml
+
+    \section2 Advanced usage
+
+    When the StackView needs a new transition, it first calls
+    \l {StackViewDelegate::getTransition()}{StackViewDelegate.getTransition()}.
+    The base implementation of this function just looks for a property named \c properties.name inside
+    itself (root), which is how it finds \c {property Component pushTransition} in the examples above.
+
+    \code
+    function getTransition(properties)
+    {
+        return root[properties.name]
+    }
+    \endcode
+
+    You can override this function for your delegate if you need extra logic to decide which
+    transition to return. You could for example introspect the items, and return different animations
+    depending on the their internal state. StackView will expect you to return a Component that
+    contains a StackViewTransition, or a StackViewTransition directly. The former is easier, as StackView will
+    then create the transition and later destroy it when it's done, while avoiding any side effects
+    caused by the transition being alive long after it has run. Returning a StackViewTransition directly
+    can be useful if you need to write some sort of transition caching for performance reasons.
+    As an optimization, you can also return \c null to signal that you just want to show/hide the items
+    immediately without creating or running any transitions. You can also override this function if
+    you need to alter the items in any way before the transition starts.
+
+    \c properties contains the properties that will be assigned to the StackViewTransition before
+    it runs. In fact, you can add more properties to this object during the call
+    if you need to initialize additional properties of your custom StackViewTransition when the returned
+    component is instantiated.
+
+    The following example shows how you can decide which animation to use at runtime:
+
+    \qml
+    StackViewDelegate {
+        function getTransition(properties)
+        {
+            return (properties.enterItem.Stack.index % 2) ? horizontalTransition : verticalTransition
+        }
+
+        function transitionFinished(properties)
+        {
+            properties.exitItem.x = 0
+            properties.exitItem.y = 0
+        }
+
+        property Component horizontalTransition: StackViewTransition {
+            PropertyAnimation {
+                target: enterItem
+                property: "x"
+                from: target.width
+                to: 0
+                duration: 300
+            }
+            PropertyAnimation {
+                target: exitItem
+                property: "x"
+                from: 0
+                to: target.width
+                duration: 300
+            }
+        }
+
+        property Component verticalTransition: StackViewTransition {
+            PropertyAnimation {
+                target: enterItem
+                property: "y"
+                from: target.height
+                to: 0
+                duration: 300
+            }
+            PropertyAnimation {
+                target: exitItem
+                property: "y"
+                from: 0
+                to: target.height
+                duration: 300
+            }
+        }
+    }
+    \endqml
+
+    \section1 Supported Attached Properties
+
+    Items in a StackView support these attached properties:
+    \list
+        \li \l{Stack::index}{Stack.index} - Contains the index of the item inside the StackView
+        \li \l{Stack::view}{Stack.view} - Contains the StackView the item is in
+        \li \l{Stack::status}{Stack.status} - Contains the status of the item
+    \endlist
+*/
+
+FocusScope {
+    id: root
+
+    /*! \qmlproperty int StackView::depth
+        \readonly
+        The number of items currently pushed onto the stack.
+    */
+    readonly property alias depth: root.__depth
+
+    /*! \qmlproperty Item StackView::currentItem
+        \readonly
+        The currently top-most item in the stack.
+    */
+    readonly property alias currentItem: root.__currentItem
+
+    /*! The first item that should be shown when the StackView is created.
+        \a initialItem can take same value as the first argument to \l{StackView::push()}
+        {StackView.push()}. Note that this is just a convenience for writing
+        \c{Component.onCompleted: stackView.push(myInitialItem)}
+
+        Examples:
+
+        \list
+        \li initialItem: Qt.resolvedUrl("MyItem.qml")
+        \li initialItem: myItem
+        \li initialItem: {"item" : Qt.resolvedUrl("MyRectangle.qml"), "properties" : {"color" : "red"}}
+        \endlist
+        \sa push
+    */
+    property var initialItem: null
+
+    /*! \readonly
+        \a busy is \c true if a transition is running, and \c false otherwise. */
+    readonly property bool busy: __currentTransition !== null
+
+    /*! The transitions to use when pushing or popping items.
+        For better understanding on how to apply custom transitions, read \l{Transitions}.
+        \sa {Transitions} */
+    property StackViewDelegate delegate: StackViewSlideDelegate {}
+
+    /*! \qmlmethod Item StackView::push(Item item)
+        Pushes an \a item onto the stack.
+
+        The function can also take a property list as argument - \c {Item StackView::push(jsobject dict)}, which
+        should contain one or more of the following properties:
+        \list
+        \li \a item: this property is required, and holds the item you want to push.
+        \li \e properties: a list of QML properties that should be assigned
+            to the item upon push. These properties will be copied into the item when it is
+            loaded (in case of a component or URL), or when it becomes the current item for the
+            first time (normally upon push).
+        \li \e immediate: set this property to \c true to skip transition effects. When pushing
+            an array, you only need to set this property on the first element to make the
+            whole operation immediate.
+        \li \e replace: set this property to replace the current item on the stack. When pushing
+            an array, you only need to set this property on the first element to replace
+            as many elements on the stack as inside the array.
+        \li \e destroyOnPop: set this property to specify if the item needs to be destroyed
+            when its popped off the stack. By default (if \e destroyOnPop is not specified),
+            StackView will destroy items pushed as components or URLs. Items
+            not destroyed will be re-parented to the original parents they had before being
+            pushed onto the stack, and hidden. If you need to set this property, do it with
+            care, so that items are not leaked.
+        \endlist
+
+        You can also push an array of items (property lists) if you need to push several items
+        in one go. A transition will then only occur between the current item and the last
+        item in the list. Loading the other items will be deferred until needed.
+
+        Examples:
+        \list
+        \li stackView.push({item:anItem})
+        \li stackView.push({item:aURL, immediate: true, replace: true})
+        \li stackView.push({item:aRectangle, properties:{color:"red"}})
+        \li stackView.push({item:aComponent, properties:{color:"red"}})
+        \li stackView.push({item:aComponent.createObject(), destroyOnPop:true})
+        \li stackView.push([{item:anitem, immediate:true}, {item:aURL}])
+        \endlist
+
+        \note If the only argument needed is "item", you can apply the following short-
+        hand notation: \c{stackView.push(anItem)}.
+
+        Returns the item that became current.
+
+        \sa initialItem
+        \sa {Pushing items}
+    */
+    function push(item) {
+        // Note: we support two different APIs in this function; The old meego API, and
+        // the new "property list" API. Hence the reason for hiding the fact that you
+        // can pass more arguments than shown in the signature:
+        if (__recursionGuard(true))
+            return
+        var properties = arguments[1]
+        var immediate = arguments[2]
+        var replace = arguments[3]
+        var arrayPushed = (item instanceof Array)
+        var firstItem = arrayPushed ? item[0] : item
+        immediate = (immediate || JSArray.stackView.length === 0)
+
+        if (firstItem && firstItem.item && firstItem.hasOwnProperty("x") === false) {
+            // Property list API used:
+            immediate = immediate || firstItem.immediate
+            replace = replace || firstItem.replace
+        }
+
+        // Create, and push, a new javascript object, called "element", onto the stack.
+        // This element contains all the information necessary to construct the item, and
+        // will, after loaded, also contain the loaded item:
+        if (arrayPushed) {
+            if (item.length === 0)
+                return
+            var outElement = replace ? JSArray.pop() : JSArray.current()
+            for (var i=0; i<item.length; ++i)
+                JSArray.push({itemComponent:item[i], loaded: false, index: __depth, properties: properties});
+        } else {
+            outElement = replace ? JSArray.pop() : JSArray.current()
+            JSArray.push({itemComponent:item, loaded: false, index: __depth, properties: properties})
+        }
+
+        var currentElement = JSArray.current()
+        var transition = {
+            inElement: currentElement,
+            outElement: outElement,
+            immediate: immediate,
+            replace: replace,
+            push: true
+        }
+        __performTransition(transition)
+        __recursionGuard(false)
+        return __currentItem
+    }
+
+    /*! \qmlmethod Item StackView::pop(Item item = undefined)
+        Pops one or more items off the stack.
+
+        The function can also take a property list as argument - \c {Item StackView::pop(jsobject dict)},
+        which can contain one or more of the following properties:
+        \list
+        \li \c item: if specified, all items down to (but not including) \a item will be
+            popped off. If \a item is \c null, all items down to (but not including) the
+            first item will be popped. If not specified, only the current item will be
+            popped.
+        \li \c immediate: set this property to \c true to skip transition effects.
+        \endlist
+
+        Examples:
+        \list
+        \li stackView.pop()
+        \li stackView.pop({item:someItem, immediate: true})
+        \li stackView.pop({immediate: true})
+        \li stackView.pop(null)
+        \endlist
+
+        \note If the only argument needed is "item", you can apply the following short-
+        hand notation: \c{stackView.pop(anItem)}.
+
+        Returns the item that was popped off
+        \sa clear()
+    */
+    function pop(item) {
+        if (__depth <= 1)
+            return null
+        if (item && item.hasOwnProperty("x") === false) {
+            // Property list API used:
+            var immediate = (item.immediate === true)
+            item = item.item
+        } else {
+            immediate = (arguments[1] === true)
+        }
+
+        if (item === __currentItem)
+            return
+
+        if (__recursionGuard(true))
+            return
+
+        var outElement = JSArray.pop()
+        var inElement = JSArray.current()
+
+        if (__depth > 1 && item !== undefined && item !== inElement.item) {
+            // Pop from the top until we find 'item', and return the corresponding
+            // element. Skip all non-loaded items (except the first), since no one
+            // has any references to such items anyway:
+            while (__depth > 1 && !JSArray.current().loaded)
+                JSArray.pop()
+            inElement = JSArray.current()
+            while (__depth > 1 && item !== inElement.item) {
+                JSArray.pop()
+                __cleanup(inElement)
+                while (__depth > 1 && !JSArray.current().loaded)
+                    JSArray.pop()
+                inElement = JSArray.current()
+            }
+        }
+
+        var transition = {
+            inElement: inElement,
+            outElement: outElement,
+            immediate: immediate,
+            replace: false,
+            push: false
+        }
+        __performTransition(transition)
+        __recursionGuard(false)
+        return outElement.item;
+    }
+
+    /*! \qmlmethod void StackView::clear()
+        Remove all items from the stack. No animations will be applied. */
+    function clear() {
+        if (__recursionGuard(true))
+            return
+        if (__currentTransition)
+            __currentTransition.animation.complete()
+        __currentItem = null
+        var count = __depth
+        for (var i=0; i<count; ++i) {
+            var element = JSArray.pop()
+            if (element.item)
+                __cleanup(element);
+        }
+        __recursionGuard(false)
+    }
+
+    /*! \qmlmethod Item StackView::find(function, bool onlySearchLoadedItems = false)
+        Search for a specific item inside the stack. \a function will
+        be called for each item in the stack (with the item as argument)
+        until the function returns true. Return value will be the item found. For
+        example:
+        find(function(item, index) { return item.isTheOne })
+        Set \a onlySearchLoadedItems to \c true to not load items that are
+        not loaded into memory */
+    function find(func, onlySearchLoadedItems) {
+        for (var i=__depth-1; i>=0; --i) {
+            var element = JSArray.stackView[i];
+            if (onlySearchLoadedItems !== true)
+                __loadElement(element)
+            else if (!element.item)
+                continue
+            if (func(element.item))
+                return element.item
+        }
+        return null;
+    }
+
+    /*! \qmlmethod Item StackView::get(int index, bool dontLoad = false)
+        Returns the item at position \a index in
+        the stack. If \a dontLoad is true, the
+        item will not be forced to load (and \c null
+        will be returned if not yet loaded) */
+    function get(index, dontLoad)
+    {
+        if (index < 0 || index >= JSArray.stackView.length)
+            return null
+        var element = JSArray.stackView[index]
+        if (dontLoad !== true) {
+            __loadElement(element)
+            return element.item
+        } else if (element.item) {
+            return element.item
+        } else {
+            return null
+        }
+    }
+
+    /*! \qmlmethod void StackView::completeTransition()
+        Immediately completes any ongoing transition.
+        /sa Animation.complete
+      */
+    function completeTransition()
+    {
+        if (__recursionGuard(true))
+            return
+        if (__currentTransition)
+            __currentTransition.animation.complete()
+        __recursionGuard(false)
+    }
+
+    /********* DEPRECATED API *********/
+
+    /*! \internal
+        \deprecated Use Push() instead */
+    function replace(item, properties, immediate) {
+        push(item, properties, immediate, true)
+    }
+
+    /********* PRIVATE API *********/
+
+    /*! \internal The currently top-most item on the stack. */
+    property Item __currentItem: null
+    /*! \internal The number of items currently pushed onto the stack. */
+    property int __depth: 0
+    /*! \internal Stores the transition info while a transition is ongoing */
+    property var __currentTransition: null
+    /*! \internal Stops the user from pushing items while preparing a transition */
+    property bool __guard: false
+
+    Component.onCompleted: {
+        if (initialItem)
+            push(initialItem)
+    }
+
+    Component.onDestruction: {
+        if (__currentTransition)
+            __currentTransition.animation.complete()
+        __currentItem = null
+    }
+
+    /*! \internal */
+    function __recursionGuard(use)
+    {
+        if (use && __guard) {
+            console.warn("Warning: StackView: You cannot push/pop recursively!")
+            console.trace()
+            return true
+        }
+        __guard = use
+    }
+
+    /*! \internal */
+    function __loadElement(element)
+    {
+        if (element.loaded) {
+            if (!element.item) {
+                element.item = invalidItemReplacement.createObject(root)
+                element.item.text = "\nError: The item has been deleted outside StackView!"
+            }
+            return
+        }
+        if (!element.itemComponent) {
+            element.item = invalidItemReplacement.createObject(root)
+            element.item.text = "\nError: Invalid item (item was 'null'). "
+                    + "This might indicate that the item was deleted outside StackView!"
+            return
+        }
+
+        var comp = __resolveComponent(element.itemComponent, element)
+
+        // Assign properties to item:
+        if (!element.properties)
+            element.properties = {}
+
+        if (comp.hasOwnProperty("createObject")) {
+            if (comp.status === Component.Error) {
+                element.item = invalidItemReplacement.createObject(root)
+                element.item.text = "\nError: Could not load: " + comp.errorString()
+            } else {
+                element.item = comp.createObject(root, element.properties)
+                // Destroy items we create unless the user specified something else:
+                if (!element.hasOwnProperty("destroyOnPop"))
+                    element.destroyOnPop = true
+            }
+        } else {
+            // comp is already an Item, so just re-parent it into the StackView:
+            element.item = comp
+            element.originalParent = parent
+            element.item.parent = root
+            for (var prop in element.properties) {
+                if (element.item.hasOwnProperty(prop))
+                    element.item[prop] = element.properties[prop];
+            }
+            // Do not destroy items we didn't create, unless the user specified something else:
+            if (!element.hasOwnProperty("destroyOnPop"))
+                element.destroyOnPop = false
+        }
+
+        element.item.Stack.__index = element.index
+        element.item.Stack.__view = root
+        // Let item fill all available space by default:
+        element.item.width = Qt.binding(function() { return root.width })
+        element.item.height = Qt.binding(function() { return root.height })
+        element.loaded = true
+    }
+
+    /*! \internal */
+    function __resolveComponent(unknownObjectType, element)
+    {
+        // We need this extra resolve function since we don't really
+        // know what kind of object the user pushed. So we try to
+        // figure it out by inspecting the object:
+        if (unknownObjectType.hasOwnProperty("createObject")) {
+            return unknownObjectType
+        } else if (typeof unknownObjectType == "string") {
+            return Qt.createComponent(unknownObjectType)
+        } else if (unknownObjectType.hasOwnProperty("x")) {
+            return unknownObjectType
+        } else if (unknownObjectType.hasOwnProperty("item")) {
+            // INVARIANT: user pushed a JS-object
+            element.properties = unknownObjectType.properties
+            if (!unknownObjectType.item)
+                unknownObjectType.item = invalidItemReplacement
+            if (unknownObjectType.hasOwnProperty("destroyOnPop"))
+                element.destroyOnPop = unknownObjectType.destroyOnPop
+            return __resolveComponent(unknownObjectType.item, element)
+        } else {
+            // We cannot determine the type, so assume its a URL:
+            return Qt.createComponent(unknownObjectType)
+        }
+    }
+
+    /*! \internal */
+    function __cleanup(element) {
+        // INVARIANT: element has been removed from JSArray. Destroy its
+        // item, or re-parent it back to the parent it had before it was pushed:
+        var item = element.item
+        if (element.destroyOnPop) {
+            item.destroy()
+        } else {
+            // Mark the item as no longer part of the StackView. It
+            // might reenter on pop if pushed several times:
+            item.visible = false
+            __setStatus(item, Stack.Inactive)
+            item.Stack.__view = null
+            item.Stack.__index = -1
+            if (element.originalParent)
+                item.parent = element.originalParent
+        }
+    }
+
+    /*! \internal */
+    function __setStatus(item, status) {
+        item.Stack.__status = status
+    }
+
+    /*! \internal */
+    function __performTransition(transition)
+    {
+        // Animate item in "outElement" out, and item in "inElement" in. Set a guard to protect
+        // the user from pushing new items on signals that will fire while preparing for the transition
+        // (e.g Stack.onCompleted, Stack.onStatusChanged, Stack.onIndexChanged etc). Otherwise, we will enter
+        // this function several times, which causes the items to be updated half-way.
+        if (__currentTransition)
+            __currentTransition.animation.complete()
+        __loadElement(transition.inElement)
+
+        transition.name = transition.replace ? "replaceTransition" : (transition.push ? "pushTransition" : "popTransition")
+        var enterItem = transition.inElement.item
+        transition.enterItem = enterItem
+
+        // Since an item can be pushed several times, we need to update its properties:
+        enterItem.parent = root
+        enterItem.Stack.__view = root
+        enterItem.Stack.__index = transition.inElement.index
+        __currentItem = enterItem
+
+        if (!transition.outElement) {
+            // A transition consists of two items, but we got just one. So just show the item:
+            enterItem.visible = true
+            __setStatus(enterItem, Stack.Activating)
+            __setStatus(enterItem, Stack.Active)
+            return
+        }
+
+        var exitItem = transition.outElement.item
+        transition.exitItem = exitItem
+        if (enterItem === exitItem)
+             return
+
+        if (root.delegate) {
+            transition.properties = {
+                "name":transition.name,
+                "enterItem":transition.enterItem,
+                "exitItem":transition.exitItem,
+                "immediate":transition.immediate }
+            var anim = root.delegate.getTransition(transition.properties)
+            if (anim.createObject) {
+                anim = anim.createObject(null, transition.properties)
+                anim.runningChanged.connect(function(){ if (anim.running === false) anim.destroy() })
+            }
+            transition.animation = anim
+        }
+
+        if (!transition.animation) {
+            console.warn("Warning: StackView: no", transition.name, "found!")
+            return
+        }
+        if (enterItem.anchors.fill || exitItem.anchors.fill)
+            console.warn("Warning: StackView: cannot transition an item that is anchored!")
+
+        __currentTransition = transition
+        __setStatus(exitItem, Stack.Deactivating)
+        enterItem.visible = true
+        __setStatus(enterItem, Stack.Activating)
+        transition.animation.runningChanged.connect(animationFinished)
+        transition.animation.start()
+        // NB! For empty animations, "animationFinished" is already
+        // executed at this point, leaving __animation === null:
+        if (transition.immediate === true && transition.animation)
+            transition.animation.complete()
+    }
+
+    /*! \internal */
+    function animationFinished()
+    {
+        if (!__currentTransition || __currentTransition.animation.running)
+            return
+
+        __currentTransition.animation.runningChanged.disconnect(animationFinished)
+        __currentTransition.exitItem.visible = false
+        __setStatus(__currentTransition.exitItem, Stack.Inactive);
+        __setStatus(__currentTransition.enterItem, Stack.Active);
+        __currentTransition.properties.animation = __currentTransition.animation
+        root.delegate.transitionFinished(__currentTransition.properties)
+
+        if (!__currentTransition.push || __currentTransition.replace)
+            __cleanup(__currentTransition.outElement)
+
+        __currentTransition = null
+    }
+
+    /*! \internal */
+    property Component invalidItemReplacement: Component {
+        Text {
+            width: parent.width
+            height: parent.height
+            wrapMode: Text.WrapAtWordBoundaryOrAnywhere
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/StackView.qmlc b/deployment_test/QtQuick/Controls/StackView.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..24e5c23112b32bd0cf62b10703a44cd5ad0ee158
Binary files /dev/null and b/deployment_test/QtQuick/Controls/StackView.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/StackViewDelegate.qml b/deployment_test/QtQuick/Controls/StackViewDelegate.qml
new file mode 100644
index 0000000000000000000000000000000000000000..f85eb0ae050967d75ba51504c305dea7c9df9372
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/StackViewDelegate.qml
@@ -0,0 +1,100 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+
+/*!
+        \qmltype StackViewDelegate
+        \inqmlmodule QtQuick.Controls
+        \ingroup controls
+        \since 5.1
+
+        \brief A delegate used by StackView for loading transitions.
+
+        See the documentation for the \l {StackView} component.
+
+*/
+QtObject {
+    id: root
+
+    /*!
+        \qmlmethod Transition StackViewDelegate::getTransition(properties)
+
+        The base implementation of this function just looks for a property named
+        \a {properties}.name inside itself and returns it.
+        \sa {Transitions}
+    */
+    function getTransition(properties)
+    {
+        return root[properties.name]
+    }
+
+    /*!
+        \qmlmethod void StackViewDelegate::transitionFinished(properties)
+
+        Handles the completion of a transition for \a properties. The base
+        implementation of this function is empty.
+
+        \sa {Transitions}
+    */
+    function transitionFinished(properties)
+    {
+    }
+
+    /*!
+        \qmlproperty Component StackViewDelegate::pushTransition
+
+        The transition used on push operation.
+    */
+    property Component pushTransition: StackViewTransition {}
+    /*!
+        \qmlproperty Component StackViewDelegate::popTransition
+
+        The transition used on pop operation.
+        Unless set, the popTransition is the same as pushTransition
+    */
+    property Component popTransition: root["pushTransition"]
+    /*!
+        \qmlproperty Component StackViewDelegate::replaceTransition
+
+        The transition used on replace operation.
+        Unless set, the replaceTransition is the same as pushTransition
+    */
+    property Component replaceTransition: root["pushTransition"]
+}
diff --git a/deployment_test/QtQuick/Controls/StackViewDelegate.qmlc b/deployment_test/QtQuick/Controls/StackViewDelegate.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..23e3c2bb268437b0fe757f7de3b11a4efec2bf0b
Binary files /dev/null and b/deployment_test/QtQuick/Controls/StackViewDelegate.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/StackViewTransition.qml b/deployment_test/QtQuick/Controls/StackViewTransition.qml
new file mode 100644
index 0000000000000000000000000000000000000000..9f4719e37ed14e3ac38cd70b12f7ea51c5327c02
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/StackViewTransition.qml
@@ -0,0 +1,59 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+
+ParallelAnimation {
+    id: root
+    /*! The name of the animation that is running. Can be one of the following:
+    \list
+    \li 'PushTransition'
+    \li 'PopTransition'
+    \li 'ReplaceTransition'
+    \endlist
+    */
+    property string name
+    /*! The page that is transitioning in. */
+    property Item enterItem
+    /*! The page that is transitioning out */
+    property Item exitItem
+    /*! Set to \c true if the transition is told to
+        fast-forward directly to its end-state */
+    property bool immediate
+}
diff --git a/deployment_test/QtQuick/Controls/StackViewTransition.qmlc b/deployment_test/QtQuick/Controls/StackViewTransition.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..b2f97001a295bb83d0938f2c9add7aee0c19a7da
Binary files /dev/null and b/deployment_test/QtQuick/Controls/StackViewTransition.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/StatusBar.qml b/deployment_test/QtQuick/Controls/StatusBar.qml
new file mode 100644
index 0000000000000000000000000000000000000000..c1168d5406709cfa0d5211f83c2c32afb8748563
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/StatusBar.qml
@@ -0,0 +1,154 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype StatusBar
+    \inqmlmodule QtQuick.Controls
+    \since 5.1
+    \ingroup applicationwindow
+    \ingroup controls
+    \brief Contains status information in your app.
+
+    The common way of using StatusBar is in relation to \l ApplicationWindow.
+
+    Note that the StatusBar does not provide a layout of its own, but requires
+    you to position its contents, for instance by creating a \l RowLayout.
+
+    If only a single item is used within the StatusBar, it will resize to fit the implicitHeight
+    of its contained item. This makes it particularly suitable for use together with layouts.
+    Otherwise the height is platform dependent.
+
+    \code
+    import QtQuick.Controls 1.2
+    import QtQuick.Layouts 1.0
+
+    ApplicationWindow {
+        statusBar: StatusBar {
+            RowLayout {
+                anchors.fill: parent
+                Label { text: "Read Only" }
+            }
+        }
+    }
+    \endcode
+*/
+
+FocusScope {
+    id: statusbar
+
+    activeFocusOnTab: false
+    Accessible.role: Accessible.StatusBar
+
+    width: parent ? parent.width : implicitWidth
+    implicitWidth: container.leftMargin + container.rightMargin
+                   + Math.max(container.layoutWidth, __panel ? __panel.implicitWidth : 0)
+    implicitHeight: container.topMargin + container.bottomMargin
+                    + Math.max(container.layoutHeight, __panel ? __panel.implicitHeight : 0)
+
+    /*! \qmlproperty Component StatusBar::style
+
+        The style Component for this control.
+        \sa {StatusBarStyle}
+
+    */
+    property Component style: Settings.styleComponent(Settings.style, "StatusBarStyle.qml", statusbar)
+
+    /*! \internal */
+    property alias __style: styleLoader.item
+
+    /*! \internal */
+    property Item __panel: panelLoader.item
+
+    /*! \internal */
+    default property alias __content: container.data
+
+    /*!
+        \qmlproperty Item StatusBar::contentItem
+
+        This property holds the content Item of the status bar.
+
+        Items declared as children of a StatusBar are automatically parented to the StatusBar's contentItem.
+        Items created dynamically need to be explicitly parented to the contentItem:
+
+        \note The implicit size of the StatusBar is calculated based on the size of its content. If you want to anchor
+        items inside the status bar, you must specify an explicit width and height on the StatusBar itself.
+    */
+    readonly property alias contentItem: container
+
+    data: [
+        Loader {
+            id: panelLoader
+            anchors.fill: parent
+            sourceComponent: styleLoader.item ? styleLoader.item.panel : null
+            onLoaded: item.z = -1
+            Loader {
+                id: styleLoader
+                property alias __control: statusbar
+                sourceComponent: style
+            }
+        },
+        Item {
+            id: container
+            z: 1
+            focus: true
+            anchors.fill: parent
+
+            anchors.topMargin: topMargin
+            anchors.leftMargin: leftMargin
+            anchors.rightMargin: rightMargin
+            anchors.bottomMargin: bottomMargin
+
+            property int topMargin: __style ? __style.padding.top : 0
+            property int bottomMargin: __style ? __style.padding.bottom : 0
+            property int leftMargin: __style ? __style.padding.left : 0
+            property int rightMargin: __style ? __style.padding.right : 0
+
+            property Item layoutItem: container.children.length === 1 ? container.children[0] : null
+            property real layoutWidth: layoutItem ? (layoutItem.implicitWidth || layoutItem.width) +
+                                                    (layoutItem.anchors.fill ? layoutItem.anchors.leftMargin +
+                                                                               layoutItem.anchors.rightMargin : 0) : 0
+            property real layoutHeight: layoutItem ? (layoutItem.implicitHeight || layoutItem.height) +
+                                                     (layoutItem.anchors.fill ? layoutItem.anchors.topMargin +
+                                                                                layoutItem.anchors.bottomMargin : 0) : 0
+        }]
+}
diff --git a/deployment_test/QtQuick/Controls/StatusBar.qmlc b/deployment_test/QtQuick/Controls/StatusBar.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..b4a6f20d9e3b44ce5da5a5a64c76056077f3af23
Binary files /dev/null and b/deployment_test/QtQuick/Controls/StatusBar.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/ApplicationWindowStyle.qml b/deployment_test/QtQuick/Controls/Styles/Base/ApplicationWindowStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..398567bbd9ba416ea09497405b83f7a4de2e713d
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Base/ApplicationWindowStyle.qml
@@ -0,0 +1,136 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype ApplicationWindowStyle
+    \inqmlmodule QtQuick.Controls.Styles
+    \since 5.4
+    \ingroup controlsstyling
+    \brief Provides custom styling for ApplicationWindow.
+
+    You can create a custom window background by replacing the "background"
+    delegate of ApplicationWindowStyle with a custom design.
+
+    Example:
+    \qml
+    ApplicationWindow {
+        style: ApplicationWindowStyle {
+            background: BorderImage {
+                source: "background.png"
+                border { left: 20; top: 20; right: 20; bottom: 20 }
+            }
+        }
+    }
+    \endqml
+*/
+QtObject {
+    /*! The window attached to this style. */
+    readonly property ApplicationWindow control: __control
+
+    /*! A custom background for the window.
+
+        \note The window might have a custom background color set. The custom
+              background color is automatically filled by the window. The background
+              delegate should respect the custom background color by either hiding
+              itself altogether when a custom background color is set, or by letting
+              the custom background color shine through.
+
+        The following read-only property is available within the scope
+        of the background delegate:
+        \table
+            \row \li \b {styleData.hasColor} : bool \li Whether the window has a custom background color set.
+        \endtable
+    */
+    property Component background: Rectangle {
+        visible: !styleData.hasColor
+        color: SystemPaletteSingleton.window(true)
+    }
+
+    /*! \internal */
+    property Component panel: Item {
+        readonly property alias contentArea: contentArea
+        readonly property alias menuBarArea: menuBarArea
+        readonly property alias toolBarArea: toolBarArea
+        readonly property alias statusBarArea: statusBarArea
+
+        Loader {
+            anchors.fill: parent
+            sourceComponent: background
+        }
+
+        Item {
+            id: contentArea
+            anchors.top: toolBarArea.bottom
+            anchors.left: parent.left
+            anchors.right: parent.right
+            anchors.bottom: statusBarArea.top
+        }
+
+        Item {
+            id: toolBarArea
+            anchors.top: parent.menuBarArea.bottom
+            anchors.left: parent.left
+            anchors.right: parent.right
+            implicitHeight: childrenRect.height
+            height: visibleChildren.length > 0 ? implicitHeight: 0
+        }
+
+        Item {
+            id: menuBarArea
+            anchors.top: parent.top
+            anchors.left: parent.left
+            anchors.right: parent.right
+            implicitHeight: childrenRect.height
+            height: visibleChildren.length > 0 ? implicitHeight: 0
+        }
+
+        Item {
+            id: statusBarArea
+            anchors.bottom: parent.bottom
+            anchors.left: parent.left
+            anchors.right: parent.right
+            implicitHeight: childrenRect.height
+            height: visibleChildren.length > 0 ? implicitHeight: 0
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/ApplicationWindowStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Base/ApplicationWindowStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..36455522fe9a731b236f722a95e30ed9471b73a2
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/ApplicationWindowStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/BasicTableViewStyle.qml b/deployment_test/QtQuick/Controls/Styles/Base/BasicTableViewStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..334ee665239a7f70232f048bcbb35ec7d7b0e708
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Base/BasicTableViewStyle.qml
@@ -0,0 +1,164 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.4
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype BasicTableViewStyle
+    \internal
+    \inqmlmodule QtQuick.Controls.Styles
+    \inherits ScrollViewStyle
+    \qmlabstract
+*/
+
+ScrollViewStyle {
+    id: root
+
+    /*! \qmlproperty BasicTableView BasicTableViewStyle::control
+        \internal */
+    readonly property BasicTableView control: __control
+
+    /*! \qmlproperty color BasicTableViewStyle::textColor
+        The text color. */
+    property color textColor: SystemPaletteSingleton.text(control.enabled)
+
+    /*! \qmlproperty color BasicTableViewStyle::backgroundColor
+        The background color. */
+    property color backgroundColor: control.backgroundVisible ? SystemPaletteSingleton.base(control.enabled) : "transparent"
+
+    /*! \qmlproperty color BasicTableViewStyle::alternateBackgroundColor
+        The alternate background color. */
+    property color alternateBackgroundColor: "#f5f5f5"
+
+    /*! \qmlproperty color BasicTableViewStyle::highlightedTextColor
+        The text highlight color, used within selections. */
+    property color highlightedTextColor: "white"
+
+    /*! \qmlproperty bool BasicTableViewStyle::activateItemOnSingleClick
+        Activates items on single click.
+
+        Its default value is \c false.
+    */
+    property bool activateItemOnSingleClick: false
+
+    padding.top: control.headerVisible ? 0 : 1
+
+    /*! \qmlproperty Component BasicTableViewStyle::headerDelegate
+        \internal
+
+        Different documentation for TableViewStyle and TreeViewStyle.
+        See qtquickcontrolsstyles-tableviewstyle.qdoc and qtquickcontrolsstyles-treeviewstyle.qdoc
+    */
+    property Component headerDelegate: BorderImage {
+        height: Math.round(textItem.implicitHeight * 1.2)
+        source: "images/header.png"
+        border.left: 4
+        border.bottom: 2
+        border.top: 2
+        Text {
+            id: textItem
+            anchors.fill: parent
+            verticalAlignment: Text.AlignVCenter
+            horizontalAlignment: styleData.textAlignment
+            anchors.leftMargin: horizontalAlignment === Text.AlignLeft ? 12 : 1
+            anchors.rightMargin: horizontalAlignment === Text.AlignRight ? 8 : 1
+            text: styleData.value
+            elide: Text.ElideRight
+            color: textColor
+            renderType: Settings.isMobile ? Text.QtRendering : Text.NativeRendering
+        }
+        Rectangle {
+            width: 1
+            height: parent.height - 2
+            y: 1
+            color: "#ccc"
+        }
+    }
+
+    /*! \qmlproperty Component BasicTableViewStyle::rowDelegate
+        \internal
+
+        Different documentation for TableViewStyle and TreeViewStyle.
+        See qtquickcontrolsstyles-tableviewstyle.qdoc and qtquickcontrolsstyles-treeviewstyle.qdoc
+    */
+    property Component rowDelegate: Rectangle {
+        height: Math.round(TextSingleton.implicitHeight * 1.2)
+        property color selectedColor: control.activeFocus ? "#07c" : "#999"
+        color: styleData.selected ? selectedColor :
+                                    !styleData.alternate ? alternateBackgroundColor : backgroundColor
+    }
+
+    /*! \qmlproperty Component BasicTableViewStyle::itemDelegate
+        \internal
+
+        Different documentation for TableViewStyle and TreeViewStyle.
+        See qtquickcontrolsstyles-tableviewstyle.qdoc and qtquickcontrolsstyles-treeviewstyle.qdoc
+    */
+    property Component itemDelegate: Item {
+        height: Math.max(16, label.implicitHeight)
+        property int implicitWidth: label.implicitWidth + 20
+
+        Text {
+            id: label
+            objectName: "label"
+            width: parent.width - x - (horizontalAlignment === Text.AlignRight ? 8 : 1)
+            x: (styleData.hasOwnProperty("depth") && styleData.column === 0) ? 0 :
+               horizontalAlignment === Text.AlignRight ? 1 : 8
+            horizontalAlignment: styleData.textAlignment
+            anchors.verticalCenter: parent.verticalCenter
+            anchors.verticalCenterOffset: 1
+            elide: styleData.elideMode
+            text: styleData.value !== undefined ? styleData.value.toString() : ""
+            color: styleData.textColor
+            renderType: Settings.isMobile ? Text.QtRendering : Text.NativeRendering
+        }
+    }
+
+    /*! \internal
+        Part of TreeViewStyle
+    */
+    property Component __branchDelegate: null
+
+    /*! \internal
+        Part of TreeViewStyle
+    */
+    property int __indentation: 12
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/BasicTableViewStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Base/BasicTableViewStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..9942a0fd8b24344d6387027f717de3baf565b4b0
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/BasicTableViewStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/BusyIndicatorStyle.qml b/deployment_test/QtQuick/Controls/Styles/Base/BusyIndicatorStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..da2a2aa5d04ac091e6e5195ec751fd4c444e46d7
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Base/BusyIndicatorStyle.qml
@@ -0,0 +1,120 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype BusyIndicatorStyle
+    \inqmlmodule QtQuick.Controls.Styles
+    \since 5.2
+    \ingroup controlsstyling
+    \brief Provides custom styling for BusyIndicatorStyle.
+
+    You can create a busy indicator by replacing the "indicator" delegate
+    of the BusyIndicatorStyle with a custom design.
+
+    Example:
+    \qml
+    BusyIndicator {
+        style: BusyIndicatorStyle {
+            indicator: Image {
+                visible: control.running
+                source: "spinner.png"
+                RotationAnimator on rotation {
+                    running: control.running
+                    loops: Animation.Infinite
+                    duration: 2000
+                    from: 0 ; to: 360
+                }
+            }
+        }
+    }
+    \endqml
+*/
+Style {
+    id: indicatorstyle
+
+    /*! The \l BusyIndicator this style is attached to. */
+    readonly property BusyIndicator control: __control
+
+    /*! This defines the appearance of the busy indicator. */
+    property Component indicator: Item {
+        id: indicatorItem
+
+        implicitWidth: 48
+        implicitHeight: 48
+
+        opacity: control.running ? 1 : 0
+        Behavior on opacity { OpacityAnimator { duration: 250 } }
+
+        Image {
+            anchors.centerIn: parent
+            anchors.alignWhenCentered: true
+            width: Math.min(parent.width, parent.height)
+            height: width
+            source: width <= 32 ? "images/spinner_small.png" :
+                                  width >= 48 ? "images/spinner_large.png" :
+                                                "images/spinner_medium.png"
+            RotationAnimator on rotation {
+                duration: 800
+                loops: Animation.Infinite
+                from: 0
+                to: 360
+                running: indicatorItem.visible && (control.running || indicatorItem.opacity > 0);
+            }
+        }
+    }
+
+    /*! \internal */
+    property Component panel: Item {
+        anchors.fill: parent
+        implicitWidth: indicatorLoader.implicitWidth
+        implicitHeight: indicatorLoader.implicitHeight
+
+        Loader {
+            id: indicatorLoader
+            sourceComponent: indicator
+            anchors.centerIn: parent
+            width: Math.min(parent.width, parent.height)
+            height: width
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/BusyIndicatorStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Base/BusyIndicatorStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..5ca5f86bdbece0d41f709ab3e093c6b49d01c11b
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/BusyIndicatorStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/ButtonStyle.qml b/deployment_test/QtQuick/Controls/Styles/Base/ButtonStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..5a3fa5511421c4598f9ce492ed7484e1acc87c28
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Base/ButtonStyle.qml
@@ -0,0 +1,175 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype ButtonStyle
+    \inqmlmodule QtQuick.Controls.Styles
+    \since 5.1
+    \ingroup controlsstyling
+    \brief Provides custom styling for Button.
+
+    You can create a custom button by replacing the "background" delegate
+    of the ButtonStyle with a custom design.
+
+    Example:
+    \qml
+    Button {
+        text: "A button"
+        style: ButtonStyle {
+            background: Rectangle {
+                implicitWidth: 100
+                implicitHeight: 25
+                border.width: control.activeFocus ? 2 : 1
+                border.color: "#888"
+                radius: 4
+                gradient: Gradient {
+                    GradientStop { position: 0 ; color: control.pressed ? "#ccc" : "#eee" }
+                    GradientStop { position: 1 ; color: control.pressed ? "#aaa" : "#ccc" }
+                }
+            }
+        }
+    }
+    \endqml
+    If you need a custom label, you can replace the label item.
+*/
+
+Style {
+    id: buttonstyle
+
+    /*! The \l {QtQuick.Controls::}{Button} this style is attached to. */
+    readonly property Button control: __control
+
+    /*! The padding between the background and the label components. */
+    padding {
+        top: 4
+        left: 4
+        right: 4 + (control.menu !== null ? Math.round(TextSingleton.implicitHeight * 0.5) : 0)
+        bottom: 4
+    }
+
+    /*! This defines the background of the button. */
+    property Component background: Item {
+        property bool down: control.pressed || (control.checkable && control.checked)
+        implicitWidth: Math.round(TextSingleton.implicitHeight * 4.5)
+        implicitHeight: Math.max(25, Math.round(TextSingleton.implicitHeight * 1.2))
+        Rectangle {
+            anchors.fill: parent
+            anchors.bottomMargin: down ? 0 : -1
+            color: "#10000000"
+            radius: baserect.radius
+        }
+        Rectangle {
+            id: baserect
+            gradient: Gradient {
+                GradientStop {color: down ? "#aaa" : "#fefefe" ; position: 0}
+                GradientStop {color: down ? "#ccc" : "#e3e3e3" ; position: down ? 0.1: 1}
+            }
+            radius: TextSingleton.implicitHeight * 0.16
+            anchors.fill: parent
+            border.color: control.activeFocus ? "#47b" : "#999"
+            Rectangle {
+                anchors.fill: parent
+                radius: parent.radius
+                color: control.activeFocus ? "#47b" : "white"
+                opacity: control.hovered || control.activeFocus ? 0.1 : 0
+                Behavior on opacity {NumberAnimation{ duration: 100 }}
+            }
+        }
+        Image {
+            id: imageItem
+            visible: control.menu !== null
+            source: "images/arrow-down.png"
+            anchors.verticalCenter: parent.verticalCenter
+            anchors.right: parent.right
+            anchors.rightMargin: 4
+            opacity: control.enabled ? 0.6 : 0.5
+        }
+    }
+
+    /*! This defines the label of the button.  */
+    property Component label: Item {
+        implicitWidth: row.implicitWidth
+        implicitHeight: row.implicitHeight
+        baselineOffset: row.y + text.y + text.baselineOffset
+        Row {
+            id: row
+            anchors.centerIn: parent
+            spacing: 2
+            Image {
+                source: control.iconSource
+                anchors.verticalCenter: parent.verticalCenter
+            }
+            Text {
+                id: text
+                renderType: Settings.isMobile ? Text.QtRendering : Text.NativeRendering
+                anchors.verticalCenter: parent.verticalCenter
+                text: StyleHelpers.stylizeMnemonics(control.text)
+                color: SystemPaletteSingleton.buttonText(control.enabled)
+            }
+        }
+    }
+
+    /*! \internal */
+    property Component panel: Item {
+        anchors.fill: parent
+        implicitWidth: Math.max(labelLoader.implicitWidth + padding.left + padding.right, backgroundLoader.implicitWidth)
+        implicitHeight: Math.max(labelLoader.implicitHeight + padding.top + padding.bottom, backgroundLoader.implicitHeight)
+        baselineOffset: labelLoader.item ? padding.top + labelLoader.item.baselineOffset : 0
+
+        Loader {
+            id: backgroundLoader
+            anchors.fill: parent
+            sourceComponent: background
+        }
+
+        Loader {
+            id: labelLoader
+            sourceComponent: label
+            anchors.fill: parent
+            anchors.leftMargin: padding.left
+            anchors.topMargin: padding.top
+            anchors.rightMargin: padding.right
+            anchors.bottomMargin: padding.bottom
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/ButtonStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Base/ButtonStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..132f55c9bdeb8e15727dce4e73c679fffa0f47e2
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/ButtonStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/CalendarStyle.qml b/deployment_test/QtQuick/Controls/Styles/Base/CalendarStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..bde2f2cce0c5327c116d1e15e44886cbd2dc2025
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Base/CalendarStyle.qml
@@ -0,0 +1,703 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype CalendarStyle
+    \inqmlmodule QtQuick.Controls.Styles
+    \since 5.3
+    \ingroup controlsstyling
+    \brief Provides custom styling for \l Calendar.
+
+    \section2 Component Map
+
+    \image calendarstyle-components-week-numbers.png
+
+    The calendar has the following styleable components:
+
+    \table
+        \row \li \image square-white.png
+            \li \l background
+            \li Fills the entire control.
+        \row \li \image square-yellow.png
+            \li \l navigationBar
+            \li
+        \row \li \image square-green.png
+            \li \l dayOfWeekDelegate
+            \li One instance per day of week.
+        \row \li \image square-red.png
+            \li \l weekNumberDelegate
+            \li One instance per week.
+        \row \li \image square-blue.png
+            \li \l dayDelegate
+            \li One instance per day of month.
+    \endtable
+
+    \section2 Custom Style Example
+    \qml
+    Calendar {
+        anchors.centerIn: parent
+
+        style: CalendarStyle {
+            gridVisible: false
+            dayDelegate: Rectangle {
+                gradient: Gradient {
+                    GradientStop {
+                        position: 0.00
+                        color: styleData.selected ? "#111" : (styleData.visibleMonth && styleData.valid ? "#444" : "#666");
+                    }
+                    GradientStop {
+                        position: 1.00
+                        color: styleData.selected ? "#444" : (styleData.visibleMonth && styleData.valid ? "#111" : "#666");
+                    }
+                    GradientStop {
+                        position: 1.00
+                        color: styleData.selected ? "#777" : (styleData.visibleMonth && styleData.valid ? "#111" : "#666");
+                    }
+                }
+
+                Label {
+                    text: styleData.date.getDate()
+                    anchors.centerIn: parent
+                    color: styleData.valid ? "white" : "grey"
+                }
+
+                Rectangle {
+                    width: parent.width
+                    height: 1
+                    color: "#555"
+                    anchors.bottom: parent.bottom
+                }
+
+                Rectangle {
+                    width: 1
+                    height: parent.height
+                    color: "#555"
+                    anchors.right: parent.right
+                }
+            }
+        }
+    }
+    \endqml
+*/
+
+Style {
+    id: calendarStyle
+
+    /*!
+        The Calendar this style is attached to.
+    */
+    readonly property Calendar control: __control
+
+    /*!
+        The color of the grid lines.
+    */
+    property color gridColor: "#d3d3d3"
+
+    /*!
+        This property determines the visibility of the grid.
+
+        The default value is \c true.
+    */
+    property bool gridVisible: true
+
+    /*!
+        \internal
+
+        The width of each grid line.
+    */
+    property real __gridLineWidth: 1
+
+    /*! \internal */
+    property color __horizontalSeparatorColor: gridColor
+
+    /*! \internal */
+    property color __verticalSeparatorColor: gridColor
+
+    function __cellRectAt(index) {
+        return CalendarUtils.cellRectAt(index, control.__panel.columns, control.__panel.rows,
+            control.__panel.availableWidth, control.__panel.availableHeight, gridVisible ? __gridLineWidth : 0);
+    }
+
+    function __isValidDate(date) {
+        return date !== undefined
+            && date.getTime() >= control.minimumDate.getTime()
+            && date.getTime() <= control.maximumDate.getTime();
+    }
+
+    /*!
+        The background of the calendar.
+
+        The implicit size of the calendar is calculated based on the implicit size of the background delegate.
+    */
+    property Component background: Rectangle {
+        color: "#fff"
+        implicitWidth: Math.max(250, Math.round(TextSingleton.implicitHeight * 14))
+        implicitHeight: Math.max(250, Math.round(TextSingleton.implicitHeight * 14))
+    }
+
+    /*!
+        The navigation bar of the calendar.
+
+        Styles the bar at the top of the calendar that contains the
+        next month/previous month buttons and the selected date label.
+
+        The properties provided to the delegate are:
+        \table
+            \row \li readonly property string \b styleData.title
+                 \li The title of the calendar.
+        \endtable
+    */
+    property Component navigationBar: Rectangle {
+        height: Math.round(TextSingleton.implicitHeight * 2.73)
+        color: "#f9f9f9"
+
+        Rectangle {
+            color: Qt.rgba(1,1,1,0.6)
+            height: 1
+            width: parent.width
+        }
+
+        Rectangle {
+            anchors.bottom: parent.bottom
+            height: 1
+            width: parent.width
+            color: "#ddd"
+        }
+        HoverButton {
+            id: previousMonth
+            width: parent.height
+            height: width
+            anchors.verticalCenter: parent.verticalCenter
+            anchors.left: parent.left
+            source: "images/leftanglearrow.png"
+            onClicked: control.showPreviousMonth()
+        }
+        Label {
+            id: dateText
+            text: styleData.title
+            elide: Text.ElideRight
+            horizontalAlignment: Text.AlignHCenter
+            font.pixelSize: TextSingleton.implicitHeight * 1.25
+            anchors.verticalCenter: parent.verticalCenter
+            anchors.left: previousMonth.right
+            anchors.leftMargin: 2
+            anchors.right: nextMonth.left
+            anchors.rightMargin: 2
+        }
+        HoverButton {
+            id: nextMonth
+            width: parent.height
+            height: width
+            anchors.verticalCenter: parent.verticalCenter
+            anchors.right: parent.right
+            source: "images/rightanglearrow.png"
+            onClicked: control.showNextMonth()
+        }
+    }
+
+    /*!
+        The delegate that styles each date in the calendar.
+
+        The properties provided to each delegate are:
+        \table
+            \row \li readonly property date \b styleData.date
+                \li The date this delegate represents.
+            \row \li readonly property bool \b styleData.selected
+                \li \c true if this is the selected date.
+            \row \li readonly property int \b styleData.index
+                \li The index of this delegate.
+            \row \li readonly property bool \b styleData.valid
+                \li \c true if this date is greater than or equal to than \l {Calendar::minimumDate}{minimumDate} and
+                    less than or equal to \l {Calendar::maximumDate}{maximumDate}.
+            \row \li readonly property bool \b styleData.today
+                \li \c true if this date is equal to today's date.
+            \row \li readonly property bool \b styleData.visibleMonth
+                \li \c true if the month in this date is the visible month.
+            \row \li readonly property bool \b styleData.hovered
+                \li \c true if the mouse is over this cell.
+                    \note This property is \c true even when the mouse is hovered over an invalid date.
+            \row \li readonly property bool \b styleData.pressed
+                \li \c true if the mouse is pressed on this cell.
+                    \note This property is \c true even when the mouse is pressed on an invalid date.
+        \endtable
+    */
+    property Component dayDelegate: Rectangle {
+        anchors.fill: parent
+        anchors.leftMargin: (!addExtraMargin || control.weekNumbersVisible) && styleData.index % CalendarUtils.daysInAWeek === 0 ? 0 : -1
+        anchors.rightMargin: !addExtraMargin && styleData.index % CalendarUtils.daysInAWeek === CalendarUtils.daysInAWeek - 1 ? 0 : -1
+        anchors.bottomMargin: !addExtraMargin && styleData.index >= CalendarUtils.daysInAWeek * (CalendarUtils.weeksOnACalendarMonth - 1) ? 0 : -1
+        anchors.topMargin: styleData.selected ? -1 : 0
+        color: styleData.date !== undefined && styleData.selected ? selectedDateColor : "transparent"
+
+        readonly property bool addExtraMargin: control.frameVisible && styleData.selected
+        readonly property color sameMonthDateTextColor: "#444"
+        readonly property color selectedDateColor: Qt.platform.os === "osx" ? "#3778d0" : SystemPaletteSingleton.highlight(control.enabled)
+        readonly property color selectedDateTextColor: "white"
+        readonly property color differentMonthDateTextColor: "#bbb"
+        readonly property color invalidDateColor: "#dddddd"
+        Label {
+            id: dayDelegateText
+            text: styleData.date.getDate()
+            anchors.centerIn: parent
+            horizontalAlignment: Text.AlignRight
+            font.pixelSize: Math.min(parent.height/3, parent.width/3)
+            color: {
+                var theColor = invalidDateColor;
+                if (styleData.valid) {
+                    // Date is within the valid range.
+                    theColor = styleData.visibleMonth ? sameMonthDateTextColor : differentMonthDateTextColor;
+                    if (styleData.selected)
+                        theColor = selectedDateTextColor;
+                }
+                theColor;
+            }
+        }
+    }
+
+    /*!
+        The delegate that styles each weekday.
+
+        The height of the weekday row is calculated based on the maximum implicit height of the delegates.
+
+        The properties provided to each delegate are:
+        \table
+            \row \li readonly property int \b styleData.index
+                 \li The index (0-6) of the delegate.
+            \row \li readonly property int \b styleData.dayOfWeek
+                 \li The day of the week this delegate represents. Possible values:
+                     \list
+                     \li \c Locale.Sunday
+                     \li \c Locale.Monday
+                     \li \c Locale.Tuesday
+                     \li \c Locale.Wednesday
+                     \li \c Locale.Thursday
+                     \li \c Locale.Friday
+                     \li \c Locale.Saturday
+                     \endlist
+        \endtable
+    */
+    property Component dayOfWeekDelegate: Rectangle {
+        color: gridVisible ? "#fcfcfc" : "transparent"
+        implicitHeight: Math.round(TextSingleton.implicitHeight * 2.25)
+        Label {
+            text: control.locale.dayName(styleData.dayOfWeek, control.dayOfWeekFormat)
+            anchors.centerIn: parent
+        }
+    }
+
+    /*!
+        The delegate that styles each week number.
+
+        The width of the week number column is calculated based on the maximum implicit width of the delegates.
+
+        The properties provided to each delegate are:
+        \table
+            \row \li readonly property int \b styleData.index
+                 \li The index (0-5) of the delegate.
+            \row \li readonly property int \b styleData.weekNumber
+                 \li The number of the week this delegate represents.
+        \endtable
+    */
+    property Component weekNumberDelegate: Rectangle {
+        implicitWidth: Math.round(TextSingleton.implicitHeight * 2)
+        Label {
+            text: styleData.weekNumber
+            anchors.centerIn: parent
+            color: "#444"
+        }
+    }
+
+    /*! \internal */
+    property Component panel: Item {
+        id: panelItem
+
+        implicitWidth: backgroundLoader.implicitWidth
+        implicitHeight: backgroundLoader.implicitHeight
+
+        property alias navigationBarItem: navigationBarLoader.item
+
+        property alias dayOfWeekHeaderRow: dayOfWeekHeaderRow
+
+        readonly property int weeksToShow: 6
+        readonly property int rows: weeksToShow
+        readonly property int columns: CalendarUtils.daysInAWeek
+
+        // The combined available width and height to be shared amongst each cell.
+        readonly property real availableWidth: viewContainer.width
+        readonly property real availableHeight: viewContainer.height
+
+        property int hoveredCellIndex: -1
+        property int pressedCellIndex: -1
+        property int pressCellIndex: -1
+        property var pressDate: null
+
+        Rectangle {
+            anchors.fill: parent
+            color: "transparent"
+            border.color: gridColor
+            visible: control.frameVisible
+        }
+
+        Item {
+            id: container
+            anchors.fill: parent
+            anchors.margins: control.frameVisible ? 1 : 0
+
+            Loader {
+                id: backgroundLoader
+                anchors.fill: parent
+                sourceComponent: background
+            }
+
+            Loader {
+                id: navigationBarLoader
+                anchors.left: parent.left
+                anchors.right: parent.right
+                anchors.top: parent.top
+                sourceComponent: navigationBar
+                active: control.navigationBarVisible
+
+                property QtObject styleData: QtObject {
+                    readonly property string title: control.locale.standaloneMonthName(control.visibleMonth)
+                        + new Date(control.visibleYear, control.visibleMonth, 1).toLocaleDateString(control.locale, " yyyy")
+                }
+            }
+
+            Row {
+                id: dayOfWeekHeaderRow
+                anchors.top: navigationBarLoader.bottom
+                anchors.left: parent.left
+                anchors.leftMargin: (control.weekNumbersVisible ? weekNumbersItem.width : 0)
+                anchors.right: parent.right
+                spacing: gridVisible ? __gridLineWidth : 0
+                property alias __repeater: repeater
+
+                Repeater {
+                    id: repeater
+                    model: CalendarHeaderModel {
+                        locale: control.locale
+                    }
+                    Loader {
+                        id: dayOfWeekDelegateLoader
+                        sourceComponent: dayOfWeekDelegate
+                        width: __cellRectAt(index).width
+
+                        readonly property int __index: index
+                        readonly property var __dayOfWeek: dayOfWeek
+
+                        property QtObject styleData: QtObject {
+                            readonly property alias index: dayOfWeekDelegateLoader.__index
+                            readonly property alias dayOfWeek: dayOfWeekDelegateLoader.__dayOfWeek
+                        }
+                    }
+                }
+            }
+
+            Rectangle {
+                id: topGridLine
+                color: __horizontalSeparatorColor
+                width: parent.width
+                height: __gridLineWidth
+                visible: gridVisible
+                anchors.top: dayOfWeekHeaderRow.bottom
+            }
+
+            Row {
+                id: gridRow
+                width: weekNumbersItem.width + viewContainer.width
+                height: viewContainer.height
+                anchors.top: topGridLine.bottom
+
+                Column {
+                    id: weekNumbersItem
+                    visible: control.weekNumbersVisible
+                    height: viewContainer.height
+                    spacing: gridVisible ? __gridLineWidth : 0
+                    Repeater {
+                        id: weekNumberRepeater
+                        model: panelItem.weeksToShow
+
+                        Loader {
+                            id: weekNumberDelegateLoader
+                            height: __cellRectAt(index * panelItem.columns).height
+                            sourceComponent: weekNumberDelegate
+
+                            readonly property int __index: index
+                            property int __weekNumber: control.__model.weekNumberAt(index)
+
+                            Connections {
+                                target: control
+
+                                function onVisibleMonthChanged() {
+                                    __weekNumber = control.__model.weekNumberAt(index)
+                                }
+
+                                function onVisibleYearChanged() {
+                                    __weekNumber = control.__model.weekNumberAt(index)
+                                }
+                            }
+
+                            Connections {
+                                target: control.__model
+                                function onCountChanged() {
+                                    __weekNumber = control.__model.weekNumberAt(index)
+                                }
+                            }
+
+                            property QtObject styleData: QtObject {
+                                readonly property alias index: weekNumberDelegateLoader.__index
+                                readonly property int weekNumber: weekNumberDelegateLoader.__weekNumber
+                            }
+                        }
+                    }
+                }
+
+                Rectangle {
+                    id: separator
+                    anchors.topMargin: - dayOfWeekHeaderRow.height - 1
+                    anchors.top: weekNumbersItem.top
+                    anchors.bottom: weekNumbersItem.bottom
+
+                    width: __gridLineWidth
+                    color: __verticalSeparatorColor
+                    visible: control.weekNumbersVisible
+                }
+
+                // Contains the grid lines and the grid itself.
+                Item {
+                    id: viewContainer
+                    width: container.width - (control.weekNumbersVisible ? weekNumbersItem.width + separator.width : 0)
+                    height: container.height - navigationBarLoader.height - dayOfWeekHeaderRow.height - topGridLine.height
+
+                    Repeater {
+                        id: verticalGridLineRepeater
+                        model: panelItem.columns - 1
+                        delegate: Rectangle {
+                            x: __cellRectAt(index + 1).x - __gridLineWidth
+                            y: 0
+                            width: __gridLineWidth
+                            height: viewContainer.height
+                            color: gridColor
+                            visible: gridVisible
+                        }
+                    }
+
+                    Repeater {
+                        id: horizontalGridLineRepeater
+                        model: panelItem.rows - 1
+                        delegate: Rectangle {
+                            x: 0
+                            y: __cellRectAt((index + 1) * panelItem.columns).y - __gridLineWidth
+                            width: viewContainer.width
+                            height: __gridLineWidth
+                            color: gridColor
+                            visible: gridVisible
+                        }
+                    }
+
+                    MouseArea {
+                        id: mouseArea
+                        anchors.fill: parent
+
+                        hoverEnabled: Settings.hoverEnabled
+
+                        function cellIndexAt(mouseX, mouseY) {
+                            var viewContainerPos = viewContainer.mapFromItem(mouseArea, mouseX, mouseY);
+                            var child = viewContainer.childAt(viewContainerPos.x, viewContainerPos.y);
+                            // In the tests, the mouseArea sometimes gets picked instead of the cells,
+                            // probably because stuff is still loading. To be safe, we check for that here.
+                            return child && child !== mouseArea ? child.__index : -1;
+                        }
+
+                        onEntered: {
+                            hoveredCellIndex = cellIndexAt(mouseX, mouseY);
+                            if (hoveredCellIndex === undefined) {
+                                hoveredCellIndex = cellIndexAt(mouseX, mouseY);
+                            }
+
+                            var date = view.model.dateAt(hoveredCellIndex);
+                            if (__isValidDate(date)) {
+                                control.hovered(date);
+                            }
+                        }
+
+                        onExited: {
+                            hoveredCellIndex = -1;
+                        }
+
+                        onPositionChanged: {
+                            var indexOfCell = cellIndexAt(mouse.x, mouse.y);
+                            var previousHoveredCellIndex = hoveredCellIndex;
+                            hoveredCellIndex = indexOfCell;
+                            if (indexOfCell !== -1) {
+                                var date = view.model.dateAt(indexOfCell);
+                                if (__isValidDate(date)) {
+                                    if (hoveredCellIndex !== previousHoveredCellIndex)
+                                        control.hovered(date);
+
+                                    // The date must be different for the pressed signal to be emitted.
+                                    if (pressed && date.getTime() !== control.selectedDate.getTime()) {
+                                        control.pressed(date);
+
+                                        // You can't select dates in a different month while dragging.
+                                        if (date.getMonth() === control.selectedDate.getMonth()) {
+                                            control.selectedDate = date;
+                                            pressedCellIndex = indexOfCell;
+                                        }
+                                    }
+                                }
+                            }
+                        }
+
+                        onPressed: {
+                            pressCellIndex = cellIndexAt(mouse.x, mouse.y);
+                            pressDate = null;
+                            if (pressCellIndex !== -1) {
+                                var date = view.model.dateAt(pressCellIndex);
+                                pressedCellIndex = pressCellIndex;
+                                pressDate = date;
+                                if (__isValidDate(date)) {
+                                    control.selectedDate = date;
+                                    control.pressed(date);
+                                }
+                            }
+                        }
+
+                        onReleased: {
+                            var indexOfCell = cellIndexAt(mouse.x, mouse.y);
+                            if (indexOfCell !== -1) {
+                                // The cell index might be valid, but the date has to be too. We could let the
+                                // selected date validation take care of this, but then the selected date would
+                                // change to the earliest day if a day before the minimum date is clicked, for example.
+                                var date = view.model.dateAt(indexOfCell);
+                                if (__isValidDate(date)) {
+                                    control.released(date);
+                                }
+                            }
+                            pressedCellIndex = -1;
+                        }
+
+                        onClicked: {
+                            var indexOfCell = cellIndexAt(mouse.x, mouse.y);
+                            if (indexOfCell !== -1 && indexOfCell === pressCellIndex) {
+                                if (__isValidDate(pressDate))
+                                    control.clicked(pressDate);
+                            }
+                        }
+
+                        onDoubleClicked: {
+                            var indexOfCell = cellIndexAt(mouse.x, mouse.y);
+                            if (indexOfCell !== -1) {
+                                var date = view.model.dateAt(indexOfCell);
+                                if (__isValidDate(date))
+                                    control.doubleClicked(date);
+                            }
+                        }
+
+                        onPressAndHold: {
+                            var indexOfCell = cellIndexAt(mouse.x, mouse.y);
+                            if (indexOfCell !== -1 && indexOfCell === pressCellIndex) {
+                                var date = view.model.dateAt(indexOfCell);
+                                if (__isValidDate(date))
+                                    control.pressAndHold(date);
+                            }
+                        }
+                    }
+
+                    Connections {
+                        target: control
+                        function onSelectedDateChanged() { view.selectedDateChanged() }
+                    }
+
+                    Repeater {
+                        id: view
+
+                        property int currentIndex: -1
+
+                        model: control.__model
+
+                        Component.onCompleted: selectedDateChanged()
+
+                        function selectedDateChanged() {
+                            if (model !== undefined && model.locale !== undefined) {
+                                currentIndex = model.indexAt(control.selectedDate);
+                            }
+                        }
+
+                        delegate: Loader {
+                            id: delegateLoader
+
+                            x: __cellRectAt(index).x
+                            y: __cellRectAt(index).y
+                            width: __cellRectAt(index).width
+                            height: __cellRectAt(index).height
+                            sourceComponent: dayDelegate
+
+                            readonly property int __index: index
+                            readonly property date __date: date
+                            // We rely on the fact that an invalid QDate will be converted to a Date
+                            // whose year is -4713, which is always an invalid date since our
+                            // earliest minimum date is the year 1.
+                            readonly property bool valid: __isValidDate(date)
+
+                            property QtObject styleData: QtObject {
+                                readonly property alias index: delegateLoader.__index
+                                readonly property bool selected: control.selectedDate.getFullYear() === date.getFullYear() &&
+                                                                 control.selectedDate.getMonth() === date.getMonth() &&
+                                                                 control.selectedDate.getDate() === date.getDate()
+                                readonly property alias date: delegateLoader.__date
+                                readonly property bool valid: delegateLoader.valid
+                                // TODO: this will not be correct if the app is running when a new day begins.
+                                readonly property bool today: date.getTime() === new Date().setHours(0, 0, 0, 0)
+                                readonly property bool visibleMonth: date.getMonth() === control.visibleMonth
+                                readonly property bool hovered: panelItem.hoveredCellIndex == index
+                                readonly property bool pressed: panelItem.pressedCellIndex == index
+                                // todo: pressed property here, clicked and doubleClicked in the control itself
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/CalendarStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Base/CalendarStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..f47d9789c5f878969addceda526382debcc75ef1
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/CalendarStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/CheckBoxStyle.qml b/deployment_test/QtQuick/Controls/Styles/Base/CheckBoxStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..a476a953a045a399eb38b9ed6b47ea7e284c6378
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Base/CheckBoxStyle.qml
@@ -0,0 +1,193 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Layouts 1.1
+import QtQuick.Window 2.1
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype CheckBoxStyle
+    \inqmlmodule QtQuick.Controls.Styles
+    \since 5.1
+    \ingroup controlsstyling
+    \brief Provides custom styling for CheckBox.
+
+    Example:
+    \qml
+    CheckBox {
+        text: "Check Box"
+        style: CheckBoxStyle {
+            indicator: Rectangle {
+                    implicitWidth: 16
+                    implicitHeight: 16
+                    radius: 3
+                    border.color: control.activeFocus ? "darkblue" : "gray"
+                    border.width: 1
+                    Rectangle {
+                        visible: control.checked
+                        color: "#555"
+                        border.color: "#333"
+                        radius: 1
+                        anchors.margins: 4
+                        anchors.fill: parent
+                    }
+            }
+        }
+    }
+    \endqml
+*/
+Style {
+    id: checkboxStyle
+
+    /*! The \l CheckBox this style is attached to. */
+    readonly property CheckBox control: __control
+
+    /*! This defines the text label. */
+    property Component label: Item {
+        implicitWidth: text.implicitWidth + 2
+        implicitHeight: text.implicitHeight
+        baselineOffset: text.baselineOffset
+        Rectangle {
+            anchors.fill: text
+            anchors.margins: -1
+            anchors.leftMargin: -3
+            anchors.rightMargin: -3
+            visible: control.activeFocus
+            height: 6
+            radius: 3
+            color: "#224f9fef"
+            border.color: "#47b"
+            opacity: 0.6
+        }
+        Text {
+            id: text
+            text: StyleHelpers.stylizeMnemonics(control.text)
+            anchors.centerIn: parent
+            color: SystemPaletteSingleton.text(control.enabled)
+            renderType: Settings.isMobile ? Text.QtRendering : Text.NativeRendering
+        }
+    }
+    /*! The background under indicator and label. */
+    property Component background
+
+    /*! The spacing between indicator and label. */
+    property int spacing: Math.round(TextSingleton.implicitHeight/4)
+
+    /*! This defines the indicator button. */
+    property Component indicator:  Item {
+        implicitWidth: Math.round(TextSingleton.implicitHeight)
+        implicitHeight: implicitWidth
+        Rectangle {
+            anchors.fill: parent
+            anchors.bottomMargin: -1
+            color: "#44ffffff"
+            radius: baserect.radius
+        }
+        Rectangle {
+            id: baserect
+            gradient: Gradient {
+                GradientStop {color: "#eee" ; position: 0}
+                GradientStop {color: control.pressed ? "#eee" : "#fff" ; position: 0.1}
+                GradientStop {color: "#fff" ; position: 1}
+            }
+            radius: TextSingleton.implicitHeight * 0.16
+            anchors.fill: parent
+            border.color: control.activeFocus ? "#47b" : "#999"
+        }
+
+        Image {
+            source: "images/check.png"
+            opacity: control.checkedState === Qt.Checked ? control.enabled ? 1 : 0.5 : 0
+            anchors.centerIn: parent
+            anchors.verticalCenterOffset: 1
+            Behavior on opacity {NumberAnimation {duration: 80}}
+        }
+
+        Rectangle {
+            anchors.fill: parent
+            anchors.margins: Math.round(baserect.radius)
+            antialiasing: true
+            gradient: Gradient {
+                GradientStop {color: control.pressed ? "#555" : "#999" ; position: 0}
+                GradientStop {color: "#555" ; position: 1}
+            }
+            radius: baserect.radius - 1
+            anchors.centerIn: parent
+            anchors.alignWhenCentered: true
+            border.color: "#222"
+            Behavior on opacity {NumberAnimation {duration: 80}}
+            opacity: control.checkedState === Qt.PartiallyChecked ? control.enabled ? 1 : 0.5 : 0
+        }
+    }
+
+    /*! \internal */
+    property Component panel: Item {
+        implicitWidth: Math.max(backgroundLoader.implicitWidth, row.implicitWidth + padding.left + padding.right)
+        implicitHeight: Math.max(backgroundLoader.implicitHeight, labelLoader.implicitHeight + padding.top + padding.bottom,indicatorLoader.implicitHeight + padding.top + padding.bottom)
+        baselineOffset: labelLoader.item ? padding.top + labelLoader.item.baselineOffset : 0
+
+        Loader {
+            id: backgroundLoader
+            sourceComponent: background
+            anchors.fill: parent
+        }
+        RowLayout {
+            id: row
+            anchors.fill: parent
+
+            anchors.leftMargin: padding.left
+            anchors.rightMargin: padding.right
+            anchors.topMargin: padding.top
+            anchors.bottomMargin: padding.bottom
+
+            spacing: checkboxStyle.spacing
+            Loader {
+                id: indicatorLoader
+                sourceComponent: indicator
+            }
+            Loader {
+                id: labelLoader
+                Layout.fillWidth: true
+                sourceComponent: label
+            }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/CheckBoxStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Base/CheckBoxStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..26a5a290b0d469cf0c7bdf70bb387cf5a67fd244
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/CheckBoxStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/CircularButtonStyle.qml b/deployment_test/QtQuick/Controls/Styles/Base/CircularButtonStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..b2324e0e1bffebbd1f14a086b556b8f49cabe910
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Base/CircularButtonStyle.qml
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Extras module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls.Styles 1.4
+import QtQuick.Extras.Private 1.0
+
+ButtonStyle {
+    id: buttonStyle
+
+    label: Text {
+        anchors.fill: parent
+        horizontalAlignment: Text.AlignHCenter
+        verticalAlignment: Text.AlignVCenter
+        text: control.text
+        font.pixelSize: TextSingleton.font.pixelSize * 1.25
+        color: control.pressed || control.checked ? __buttonHelper.textColorDown : __buttonHelper.textColorUp
+        styleColor: control.pressed || control.checked ? __buttonHelper.textRaisedColorDown : __buttonHelper.textRaisedColorUp
+        style: Text.Raised
+        wrapMode: Text.Wrap
+        fontSizeMode: Text.Fit
+    }
+
+    /*! \internal */
+    property alias __buttonHelper: buttonHelper
+
+    CircularButtonStyleHelper {
+        id: buttonHelper
+        control: buttonStyle.control
+    }
+
+    background: Item {
+        implicitWidth: __buttonHelper.implicitWidth
+        implicitHeight: __buttonHelper.implicitHeight
+
+        Canvas {
+            id: backgroundCanvas
+            anchors.fill: parent
+
+            Connections {
+                target: control
+                function onPressedChanged() { backgroundCanvas.requestPaint() }
+            }
+
+            onPaint: {
+                var ctx = getContext("2d");
+                __buttonHelper.paintBackground(ctx);
+            }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/CircularButtonStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Base/CircularButtonStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..60a11ef1b32898b4d0baaaf0fa3b914df1de748a
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/CircularButtonStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/CircularGaugeStyle.qml b/deployment_test/QtQuick/Controls/Styles/Base/CircularGaugeStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..e40b8bb463bab3345bcde8ecbe01f02e6e73e73e
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Base/CircularGaugeStyle.qml
@@ -0,0 +1,497 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Extras module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtGraphicalEffects 1.0
+import QtQuick.Controls 1.4
+import QtQuick.Controls.Styles 1.4
+import QtQuick.Controls.Private 1.0
+import QtQuick.Extras 1.4
+import QtQuick.Extras.Private 1.0
+
+/*!
+    \qmltype CircularGaugeStyle
+    \inqmlmodule QtQuick.Controls.Styles
+    \since 5.5
+    \ingroup controlsstyling
+    \brief Provides custom styling for CircularGauge.
+
+    You can create a custom circular gauge by replacing the following delegates:
+    \list
+        \li \l background
+        \li \l tickmark
+        \li \l minorTickmark
+        \li \l tickmarkLabel
+        \li \l needle
+        \li \l foreground
+    \endlist
+
+    Below is an example that changes the needle to a basic orange \l Rectangle:
+    \code
+    CircularGauge {
+        style: CircularGaugeStyle {
+            needle: Rectangle {
+                y: outerRadius * 0.15
+                implicitWidth: outerRadius * 0.03
+                implicitHeight: outerRadius * 0.9
+                antialiasing: true
+                color: Qt.rgba(0.66, 0.3, 0, 1)
+            }
+        }
+    }
+    \endcode
+
+    The result:
+    \image circulargauge-needle-example-2.png CircularGaugeStyle example
+
+    \section2 Direction
+
+    \l minimumValueAngle and \l maximumValueAngle determine not only the
+    position of the tickmarks, labels and needle, but the direction in which
+    they are displayed around the gauge. For example, if \l minimumValueAngle
+    is greater than \l maximumValueAngle, the gauge will be anti-clockwise.
+    Below, there are two gauges: the top gauge has a \l minimumValueAngle of
+    \c -90 degrees and a \l maximumValueAngle of \c 90 degrees, and the bottom
+    gauge has the opposite.
+
+    \image circulargauge-reversed.png Reversed CircularGauge
+
+    \sa {Styling CircularGauge}
+*/
+
+Style {
+    id: circularGaugeStyle
+
+    /*!
+        The \l CircularGauge that this style is attached to.
+    */
+    readonly property CircularGauge control: __control
+
+    /*!
+        The distance from the center of the gauge to the outer edge of the
+        gauge.
+
+        This property is useful for determining the size of the various
+        components of the style, in order to ensure that they are scaled
+        proportionately when the gauge is resized.
+    */
+    readonly property real outerRadius: Math.min(control.width, control.height) * 0.5
+
+    /*!
+        This property determines the angle at which the minimum value is
+        displayed on the gauge.
+
+        The angle set affects the following components of the gauge:
+        \list
+            \li The angle of the needle
+            \li The position of the tickmarks and labels
+        \endlist
+
+        The angle origin points north:
+
+        \image circulargauge-angles.png
+
+        There is no minimum or maximum angle for this property, but the default
+        style only supports angles whose absolute range is less than or equal
+        to \c 360 degrees. This is because ranges higher than \c 360 degrees
+        will cause the tickmarks and labels to overlap each other.
+
+        The default value is \c -145.
+    */
+    property real minimumValueAngle: -145
+
+    /*!
+        This property determines the angle at which the maximum value is
+        displayed on the gauge.
+
+        The angle set affects the following components of the gauge:
+        \list
+            \li The angle of the needle
+            \li The position of the tickmarks and labels
+        \endlist
+
+        The angle origin points north:
+
+        \image circulargauge-angles.png
+
+        There is no minimum or maximum angle for this property, but the default
+        style only supports angles whose absolute range is less than or equal
+        to \c 360 degrees. This is because ranges higher than \c 360 degrees
+        will cause the tickmarks and labels to overlap each other.
+
+        The default value is \c 145.
+    */
+    property real maximumValueAngle: 145
+
+    /*!
+        The range between \l minimumValueAngle and \l maximumValueAngle, in
+        degrees. This value will always be positive.
+    */
+    readonly property real angleRange: control.__panel.circularTickmarkLabel.angleRange
+
+    /*!
+        This property holds the rotation of the needle in degrees.
+    */
+    property real needleRotation: {
+        var percentage = (control.value - control.minimumValue) / (control.maximumValue - control.minimumValue);
+        minimumValueAngle + percentage * angleRange;
+    }
+
+    /*!
+        The interval at which tickmarks are displayed.
+
+        For example, if this property is set to \c 10 (the default),
+        control.minimumValue to \c 0, and control.maximumValue to \c 100,
+        the tickmarks displayed will be 0, 10, 20, etc., to 100,
+        around the gauge.
+    */
+    property real tickmarkStepSize: 10
+
+    /*!
+        The distance in pixels from the outside of the gauge (outerRadius) at
+        which the outermost point of the tickmark line is drawn.
+    */
+    property real tickmarkInset: 0
+
+
+    /*!
+        The amount of tickmarks displayed by the gauge, calculated from
+        \l tickmarkStepSize and the control's
+        \l {CircularGauge::minimumValue}{minimumValue} and
+        \l {CircularGauge::maximumValue}{maximumValue}.
+
+        \sa minorTickmarkCount
+    */
+    readonly property int tickmarkCount: control.__panel.circularTickmarkLabel.tickmarkCount
+
+    /*!
+        The amount of minor tickmarks between each tickmark.
+
+        The default value is \c 4.
+
+        \sa tickmarkCount
+    */
+    property int minorTickmarkCount: 4
+
+    /*!
+        The distance in pixels from the outside of the gauge (outerRadius) at
+        which the outermost point of the minor tickmark line is drawn.
+    */
+    property real minorTickmarkInset: 0
+
+    /*!
+        The distance in pixels from the outside of the gauge (outerRadius) at
+        which the center of the value marker text is drawn.
+    */
+    property real labelInset: __protectedScope.toPixels(0.19)
+
+    /*!
+        The interval at which tickmark labels are displayed.
+
+        For example, if this property is set to \c 10 (the default),
+        control.minimumValue to \c 0, and control.maximumValue to \c 100, the
+        tickmark labels displayed will be 0, 10, 20, etc., to 100,
+        around the gauge.
+    */
+    property real labelStepSize: tickmarkStepSize
+
+    /*!
+        The amount of tickmark labels displayed by the gauge, calculated from
+        \l labelStepSize and the control's
+        \l {CircularGauge::minimumValue}{minimumValue} and
+        \l {CircularGauge::maximumValue}{maximumValue}.
+
+        \sa tickmarkCount, minorTickmarkCount
+    */
+    readonly property int labelCount: control.__panel.circularTickmarkLabel.labelCount
+
+    /*! \qmlmethod real CircularGaugeStyle::valueToAngle(real value)
+        Returns \a value as an angle in degrees.
+
+        This function is useful for custom drawing or positioning of items in
+        the style's components. For example, it can be used to calculate the
+        angles at which to draw an arc around the gauge indicating the safe
+        area for the needle to be within.
+
+        For example, if minimumValueAngle is set to \c 270 and
+        maximumValueAngle is set to \c 90, this function will return \c 270
+        when passed minimumValue and \c 90 when passed maximumValue.
+
+        \sa {Styling CircularGauge#styling-circulargauge-background}{
+            Styling CircularGauge's background}
+    */
+    function valueToAngle(value) {
+        return control.__panel.circularTickmarkLabel.valueToAngle(value);
+    }
+
+    property QtObject __protectedScope: QtObject {
+        /*!
+            Converts a value expressed as a percentage of \l outerRadius to
+            a pixel value.
+        */
+        function toPixels(percentageOfOuterRadius) {
+            return percentageOfOuterRadius * outerRadius;
+        }
+    }
+
+    /*!
+        The background of the gauge.
+
+        If set, the background determines the implicit size of the gauge.
+
+        By default, there is no background defined.
+
+        \sa {Styling CircularGauge#styling-circulargauge-background}{
+            Styling CircularGauge's background}
+    */
+    property Component background
+
+    /*!
+        This component defines each individual tickmark. The position of each
+        tickmark is already set; only the
+        \l {Item::implicitWidth}{implicitWidth} and
+        \l {Item::implicitHeight}{implicitHeight} need to be specified.
+
+        Each instance of this component has access to the following properties:
+
+        \table
+            \row \li \c {readonly property int} \b styleData.index
+                \li The index of this tickmark.
+            \row \li \c {readonly property real} \b styleData.value
+                \li The value that this tickmark represents.
+        \endtable
+
+        To illustrate what these properties refer to, we can use the following
+        example:
+
+        \snippet circulargauge-tickmark-indices-values.qml tickmarks
+
+        We've replaced the conventional \e line tickmarks with \l Text items
+        and have hidden the tickmarkLabel component in order to make the
+        association clearer:
+
+        \image circulargauge-tickmark-indices-values.png Tickmarks
+
+        The index property can be useful if you have another model that
+        contains images to display for each index, for example.
+
+        The value property is useful for drawing lower and upper limits around
+        the gauge to indicate the recommended value ranges. For example, speeds
+        above 200 kilometers an hour in a car's speedometer could be indicated
+        as dangerous using this property.
+
+        \sa {Styling CircularGauge#styling-circulargauge-tickmark}{
+            Styling CircularGauge's tickmark}
+    */
+    property Component tickmark: Rectangle {
+        implicitWidth: outerRadius * 0.02
+        antialiasing: true
+        implicitHeight: outerRadius * 0.06
+        color: "#c8c8c8"
+    }
+
+    /*!
+        This component defines each individual minor tickmark. The position of
+        each minor tickmark is already set; only the
+        \l {Item::implicitWidth}{implicitWidth} and
+        \l {Item::implicitHeight}{implicitHeight} need to be specified.
+
+        Each instance of this component has access to the following properties:
+
+        \table
+            \row \li \c {readonly property int} \b styleData.index
+                \li The index of this tickmark.
+            \row \li \c {readonly property real} \b styleData.value
+                \li The value that this tickmark represents.
+        \endtable
+
+        \sa {Styling CircularGauge#styling-circulargauge-minorTickmark}{
+            Styling CircularGauge's minorTickmark}
+    */
+    property Component minorTickmark: Rectangle {
+        implicitWidth: outerRadius * 0.01
+        antialiasing: true
+        implicitHeight: outerRadius * 0.03
+        color: "#c8c8c8"
+    }
+
+    /*!
+        This defines the text of each tickmark label on the gauge.
+
+        Each instance of this component has access to the following properties:
+
+        \table
+            \row \li \c {readonly property int} \b styleData.index
+                \li The index of this label.
+            \row \li \c {readonly property real} \b styleData.value
+                \li The value that this label represents.
+        \endtable
+
+        \sa {Styling CircularGauge#styling-circulargauge-tickmarkLabel}{
+            Styling CircularGauge's tickmarkLabel}
+    */
+    property Component tickmarkLabel: Text {
+        font.pixelSize: Math.max(6, __protectedScope.toPixels(0.12))
+        text: styleData.value
+        color: "#c8c8c8"
+        antialiasing: true
+        horizontalAlignment: Text.AlignHCenter
+        verticalAlignment: Text.AlignVCenter
+    }
+
+    /*!
+        The needle that points to the gauge's current value.
+
+        This component is drawn below the \l foreground component.
+
+        The style expects the needle to be pointing up at a rotation of \c 0,
+        in order for the rotation to be correct. For example:
+
+        \image circulargauge-needle.png CircularGauge's needle
+
+        When defining your own needle component, the only properties that the
+        style requires you to set are the
+        \l {Item::implicitWidth}{implicitWidth} and
+        \l {Item::implicitHeight}{implicitHeight}.
+
+        Optionally, you can set \l {Item::x}{x} and \l {Item::y}{y} to change
+        the needle's transform origin. Setting the \c x position can be useful
+        for needle images where the needle is not centered exactly
+        horizontally. Setting the \c y position allows you to make the base of
+        the needle hang over the center of the gauge.
+
+        \sa {Styling CircularGauge#styling-circulargauge-needle}{
+            Styling CircularGauge's needle}
+    */
+    property Component needle: Item {
+        implicitWidth: __protectedScope.toPixels(0.08)
+        implicitHeight: 0.9 * outerRadius
+
+        Image {
+            anchors.fill: parent
+            source: "images/needle.png"
+        }
+    }
+
+    /*!
+        The foreground of the gauge. This component is drawn above all others.
+
+        Like \l background, the foreground component fills the entire gauge.
+
+        By default, the knob of the gauge is defined here.
+
+        \sa {Styling CircularGauge#styling-circulargauge-foreground}{
+            Styling CircularGauge's foreground}
+    */
+    property Component foreground: Item {
+        Image {
+            source: "images/knob.png"
+            anchors.centerIn: parent
+            scale: {
+                var idealHeight = __protectedScope.toPixels(0.2);
+                var originalImageHeight = sourceSize.height;
+                idealHeight / originalImageHeight;
+            }
+        }
+    }
+
+    /*! \internal */
+    property Component panel: Item {
+        id: panelItem
+        implicitWidth: backgroundLoader.item ? backgroundLoader.implicitWidth : TextSingleton.implicitHeight * 16
+        implicitHeight: backgroundLoader.item ? backgroundLoader.implicitHeight : TextSingleton.implicitHeight * 16
+
+        property alias background: backgroundLoader.item
+        property alias circularTickmarkLabel: circularTickmarkLabel_
+
+        Loader {
+            id: backgroundLoader
+            sourceComponent: circularGaugeStyle.background
+            width: outerRadius * 2
+            height: outerRadius * 2
+            anchors.centerIn: parent
+        }
+
+        CircularTickmarkLabel {
+            id: circularTickmarkLabel_
+            anchors.fill: backgroundLoader
+
+            minimumValue: control.minimumValue
+            maximumValue: control.maximumValue
+            stepSize: control.stepSize
+            tickmarksVisible: control.tickmarksVisible
+            minimumValueAngle: circularGaugeStyle.minimumValueAngle
+            maximumValueAngle: circularGaugeStyle.maximumValueAngle
+            tickmarkStepSize: circularGaugeStyle.tickmarkStepSize
+            tickmarkInset: circularGaugeStyle.tickmarkInset
+            minorTickmarkCount: circularGaugeStyle.minorTickmarkCount
+            minorTickmarkInset: circularGaugeStyle.minorTickmarkInset
+            labelInset: circularGaugeStyle.labelInset
+            labelStepSize: circularGaugeStyle.labelStepSize
+
+            style: CircularTickmarkLabelStyle {
+                tickmark: circularGaugeStyle.tickmark
+                minorTickmark: circularGaugeStyle.minorTickmark
+                tickmarkLabel: circularGaugeStyle.tickmarkLabel
+            }
+        }
+
+        Loader {
+            id: needleLoader
+            sourceComponent: circularGaugeStyle.needle
+            transform: [
+                Rotation {
+                    angle: needleRotation
+                    origin.x: needleLoader.width / 2
+                    origin.y: needleLoader.height
+                },
+                Translate {
+                    x: panelItem.width / 2 - needleLoader.width / 2
+                    y: panelItem.height / 2 - needleLoader.height
+                }
+            ]
+        }
+
+        Loader {
+            id: foreground
+            sourceComponent: circularGaugeStyle.foreground
+            anchors.fill: backgroundLoader
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/CircularGaugeStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Base/CircularGaugeStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..4afb71df2414499b9314693ae2183aef5c08077c
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/CircularGaugeStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/CircularTickmarkLabelStyle.qml b/deployment_test/QtQuick/Controls/Styles/Base/CircularTickmarkLabelStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..494a7f28ca36a7ada819d29ecedc939b0b6d8b91
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Base/CircularTickmarkLabelStyle.qml
@@ -0,0 +1,309 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Extras module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls.Private 1.0
+import QtQuick.Extras.Private 1.0
+import QtQuick.Extras.Private.CppUtils 1.0
+
+Style {
+    id: circularTickmarkLabelStyle
+
+    /*!
+        The distance from the center of the control to the outer edge.
+    */
+    readonly property real outerRadius: Math.min(control.width, control.height) * 0.5
+
+    property QtObject __protectedScope: QtObject {
+        /*!
+            Converts a value expressed as a percentage of \l outerRadius to
+            a pixel value.
+        */
+        function toPixels(percentageOfOuterRadius) {
+            return percentageOfOuterRadius * outerRadius;
+        }
+    }
+
+    /*!
+        This component defines each individual tickmark. The position of each
+        tickmark is already set; only the size needs to be specified.
+    */
+    property Component tickmark: Rectangle {
+        width: outerRadius * 0.02
+        antialiasing: true
+        height: outerRadius * 0.06
+        color: "#c8c8c8"
+    }
+
+    /*!
+        This component defines each individual minor tickmark. The position of
+        each minor tickmark is already set; only the size needs to be specified.
+    */
+    property Component minorTickmark: Rectangle {
+        width: outerRadius * 0.01
+        antialiasing: true
+        height: outerRadius * 0.03
+        color: "#c8c8c8"
+    }
+
+    /*!
+        This defines the text of each tickmark label on the gauge.
+    */
+    property Component tickmarkLabel: Text {
+        font.pixelSize: Math.max(6, __protectedScope.toPixels(0.12))
+        text: styleData.value
+        color: "#c8c8c8"
+        antialiasing: true
+        horizontalAlignment: Text.AlignHCenter
+        verticalAlignment: Text.AlignVCenter
+    }
+
+    /*! \internal */
+    property Component panel: Item {
+        id: panelItem
+        implicitWidth: 250
+        implicitHeight: 250
+
+        function rangeUsed(count, stepSize) {
+            return (((count - 1) * stepSize) / (control.maximumValue - control.minimumValue)) * control.angleRange;
+        }
+
+        readonly property real tickmarkSectionSize: rangeUsed(control.tickmarkCount, control.tickmarkStepSize) / (control.tickmarkCount - 1)
+        readonly property real tickmarkSectionValue: (control.maximumValue - control.minimumValue) / (control.tickmarkCount - 1)
+        readonly property real minorTickmarkSectionSize: tickmarkSectionSize / (control.minorTickmarkCount + 1)
+        readonly property real minorTickmarkSectionValue: tickmarkSectionValue / (control.minorTickmarkCount + 1)
+        readonly property int totalMinorTickmarkCount: {
+            // The size of each section within two major tickmarks, expressed as a percentage.
+            var minorSectionPercentage = 1 / (control.minorTickmarkCount + 1);
+            // The amount of major tickmarks not able to be displayed; will be 0 if they all fit.
+            var tickmarksNotDisplayed = control.__tickmarkCount - control.tickmarkCount;
+            var count = control.minorTickmarkCount * (control.tickmarkCount - 1);
+            // We'll try to display as many minor tickmarks as we can to fill up the space.
+            count + tickmarksNotDisplayed / minorSectionPercentage;
+        }
+        readonly property real labelSectionSize: rangeUsed(control.labelCount, control.labelStepSize) / (control.labelCount - 1)
+
+        function toPixels(percentageOfOuterRadius) {
+            return percentageOfOuterRadius * outerRadius;
+        }
+
+        /*!
+            Returns the angle of \a marker (in the range 0 ... n - 1, where n
+            is the amount of markers) on the gauge where sections are of size
+            tickmarkSectionSize.
+        */
+        function tickmarkAngleFromIndex(tickmarkIndex) {
+            return tickmarkIndex * tickmarkSectionSize + control.minimumValueAngle;
+        }
+
+        function labelAngleFromIndex(labelIndex) {
+            return labelIndex * labelSectionSize + control.minimumValueAngle;
+        }
+
+        function labelPosFromIndex(index, labelWidth, labelHeight) {
+            return MathUtils.centerAlongCircle(outerRadius, outerRadius, labelWidth, labelHeight,
+                MathUtils.degToRadOffset(labelAngleFromIndex(index)),
+                outerRadius - control.labelInset)
+        }
+
+        function minorTickmarkAngleFromIndex(minorTickmarkIndex) {
+            var baseAngle = tickmarkAngleFromIndex(Math.floor(minorTickmarkIndex / control.minorTickmarkCount));
+            // + minorTickmarkSectionSize because we don't want the first minor tickmark to start on top of its "parent" tickmark.
+            var relativeMinorAngle = (minorTickmarkIndex % control.minorTickmarkCount * minorTickmarkSectionSize) + minorTickmarkSectionSize;
+            return baseAngle + relativeMinorAngle;
+        }
+
+        function tickmarkValueFromIndex(majorIndex) {
+            return (majorIndex * tickmarkSectionValue) + control.minimumValue;
+        }
+
+        function tickmarkValueFromMinorIndex(minorIndex) {
+            var majorIndex = Math.floor(minorIndex / control.minorTickmarkCount);
+            var relativeMinorIndex = minorIndex % control.minorTickmarkCount;
+            return tickmarkValueFromIndex(majorIndex) + ((relativeMinorIndex * minorTickmarkSectionValue) + minorTickmarkSectionValue);
+        }
+
+        Loader {
+            active: control.tickmarksVisible && tickmark != null
+            width: outerRadius * 2
+            height: outerRadius * 2
+            anchors.centerIn: parent
+
+            sourceComponent: Repeater {
+                id: tickmarkRepeater
+                model: control.tickmarkCount
+                delegate: Loader {
+                    id: tickmarkLoader
+                    objectName: "tickmark" + styleData.index
+                    x: tickmarkRepeater.width / 2
+                    y: tickmarkRepeater.height / 2
+
+                    transform: [
+                        Translate {
+                            y: -outerRadius + control.tickmarkInset
+                        },
+                        Rotation {
+                            angle: panelItem.tickmarkAngleFromIndex(styleData.index) - __tickmarkWidthAsAngle / 2
+                        }
+                    ]
+
+                    sourceComponent: tickmark
+
+                    property int __index: index
+                    property QtObject styleData: QtObject {
+                        readonly property alias index: tickmarkLoader.__index
+                        readonly property real value: tickmarkValueFromIndex(index)
+                    }
+
+                    readonly property real __tickmarkWidthAsAngle: MathUtils.radToDeg((width / (MathUtils.pi2 * outerRadius)) * MathUtils.pi2)
+                }
+            }
+        }
+        Loader {
+            active: control.tickmarksVisible && minorTickmark != null
+            width: outerRadius * 2
+            height: outerRadius * 2
+            anchors.centerIn: parent
+
+            sourceComponent: Repeater {
+                id: minorRepeater
+                anchors.fill: parent
+                model: totalMinorTickmarkCount
+                delegate: Loader {
+                    id: minorTickmarkLoader
+                    objectName: "minorTickmark" + styleData.index
+                    x: minorRepeater.width / 2
+                    y: minorRepeater.height / 2
+                    transform: [
+                        Translate {
+                            y: -outerRadius + control.minorTickmarkInset
+                        },
+                        Rotation {
+                            angle: panelItem.minorTickmarkAngleFromIndex(styleData.index) - __minorTickmarkWidthAsAngle / 2
+                        }
+                    ]
+
+                    sourceComponent: minorTickmark
+
+                    property int __index: index
+                    property QtObject styleData: QtObject {
+                        readonly property alias index: minorTickmarkLoader.__index
+                        readonly property real value: tickmarkValueFromMinorIndex(index)
+                    }
+
+                    readonly property real __minorTickmarkWidthAsAngle: MathUtils.radToDeg((width / (MathUtils.pi2 * outerRadius)) * MathUtils.pi2)
+                }
+            }
+        }
+        Loader {
+            id: labelLoader
+            active: control.tickmarksVisible && tickmarkLabel != null
+            width: outerRadius * 2
+            height: outerRadius * 2
+            anchors.centerIn: parent
+
+            sourceComponent: Item {
+                id: labelItem
+                width: outerRadius * 2
+                height: outerRadius * 2
+                anchors.centerIn: parent
+
+                Connections {
+                    target: control
+                    function onMinimumValueChanged() { valueTextModel.update() }
+                    function onMaximumValueChanged() { valueTextModel.update() }
+                    function onTickmarkStepSizeChanged() { valueTextModel.update() }
+                    function onLabelStepSizeChanged() { valueTextModel.update() }
+                }
+
+                Repeater {
+                    id: labelItemRepeater
+
+                    Component.onCompleted: valueTextModel.update();
+
+                    model: ListModel {
+                        id: valueTextModel
+
+                        function update() {
+                            if (control.labelStepSize === 0) {
+                                return;
+                            }
+
+                            // Make bigger if it's too small and vice versa.
+                            // +1 because we want to show 11 values, with, for example: 0, 10, 20... 100.
+                            var difference = control.labelCount - count;
+                            if (difference > 0) {
+                                for (; difference > 0; --difference) {
+                                    append({ value: 0 });
+                                }
+                            } else if (difference < 0) {
+                                for (; difference < 0; ++difference) {
+                                    remove(count - 1);
+                                }
+                            }
+
+                            var index = 0;
+                            for (var value = control.minimumValue;
+                                 value <= control.maximumValue && index < count;
+                                 value += control.labelStepSize, ++index) {
+                                setProperty(index, "value", value);
+                            }
+                        }
+                    }
+                    delegate: Loader {
+                        id: tickmarkLabelDelegateLoader
+                        objectName: "labelDelegateLoader" + index
+                        sourceComponent: tickmarkLabel
+                        x: pos.x
+                        y: pos.y
+
+                        readonly property point pos: panelItem.labelPosFromIndex(index, width, height);
+
+                        readonly property int __index: index
+                        readonly property real __value: value
+                        property QtObject styleData: QtObject {
+                            readonly property var value: index != -1 ? tickmarkLabelDelegateLoader.__value : 0
+                            readonly property alias index: tickmarkLabelDelegateLoader.__index
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/CircularTickmarkLabelStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Base/CircularTickmarkLabelStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..ba7fd8553324948274e2778152f1086ce33163f5
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/CircularTickmarkLabelStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/ComboBoxStyle.qml b/deployment_test/QtQuick/Controls/Styles/Base/ComboBoxStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..ea13696c0ac83874f5e1f45b1e15de98a08afbee
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Base/ComboBoxStyle.qml
@@ -0,0 +1,328 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Window 2.1
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Styles 1.1
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype ComboBoxStyle
+    \inqmlmodule QtQuick.Controls.Styles
+    \since 5.1
+    \ingroup controlsstyling
+    \brief Provides custom styling for ComboBox.
+*/
+
+Style {
+    id: cbStyle
+
+    /*!
+        \qmlproperty enumeration renderType
+        \since QtQuick.Controls.Styles 1.2
+
+        Override the default rendering type for the control.
+
+        Supported render types are:
+        \list
+        \li Text.QtRendering
+        \li Text.NativeRendering
+        \endlist
+
+        The default value is platform dependent.
+
+        \sa Text::renderType
+    */
+    property int renderType: Settings.isMobile ? Text.QtRendering : Text.NativeRendering
+
+    /*!
+        \since QtQuick.Controls.Styles 1.3
+        The font of the control.
+    */
+    property font font
+
+    /*!
+        \since QtQuick.Controls.Styles 1.3
+        The text color.
+    */
+    property color textColor: SystemPaletteSingleton.text(control.enabled)
+
+    /*!
+        \since QtQuick.Controls.Styles 1.3
+        The text highlight color, used behind selections.
+    */
+    property color selectionColor: SystemPaletteSingleton.highlight(control.enabled)
+
+    /*!
+        \since QtQuick.Controls.Styles 1.3
+        The highlighted text color, used in selections.
+    */
+    property color selectedTextColor: SystemPaletteSingleton.highlightedText(control.enabled)
+
+    /*! The \l ComboBox this style is attached to. */
+    readonly property ComboBox control: __control
+
+    /*! The padding between the background and the label components. */
+    padding { top: 4 ; left: 6 ; right: 6 ; bottom:4 }
+
+    /*! The size of the drop down button when the combobox is editable. */
+    property int dropDownButtonWidth: Math.round(TextSingleton.implicitHeight)
+
+    /*! \internal Alias kept for backwards compatibility with a spelling mistake in 5.2.0) */
+    property alias drowDownButtonWidth: cbStyle.dropDownButtonWidth
+
+    /*! This defines the background of the button. */
+    property Component background: Item {
+        implicitWidth: Math.round(TextSingleton.implicitHeight * 4.5)
+        implicitHeight: Math.max(25, Math.round(TextSingleton.implicitHeight * 1.2))
+        Rectangle {
+            anchors.fill: parent
+            anchors.bottomMargin: control.pressed ? 0 : -1
+            color: "#10000000"
+            radius: baserect.radius
+        }
+        Rectangle {
+            id: baserect
+            gradient: Gradient {
+                GradientStop {color: control.pressed ? "#bababa" : "#fefefe" ; position: 0}
+                GradientStop {color: control.pressed ? "#ccc" : "#e3e3e3" ; position: 1}
+            }
+            radius: TextSingleton.implicitHeight * 0.16
+            anchors.fill: parent
+            border.color: control.activeFocus ? "#47b" : "#999"
+            Rectangle {
+                anchors.fill: parent
+                radius: parent.radius
+                color: control.activeFocus ? "#47b" : "white"
+                opacity: control.hovered || control.activeFocus ? 0.1 : 0
+                Behavior on opacity {NumberAnimation{ duration: 100 }}
+            }
+        }
+        Image {
+            id: imageItem
+            visible: control.menu !== null
+            source: "images/arrow-down.png"
+            anchors.verticalCenter: parent.verticalCenter
+            anchors.right: parent.right
+            anchors.rightMargin: dropDownButtonWidth / 2
+            opacity: control.enabled ? 0.6 : 0.3
+        }
+    }
+
+    /*! \internal */
+    property Component __editor: Item {
+        implicitWidth: 100
+        implicitHeight: Math.max(25, Math.round(TextSingleton.implicitHeight * 1.2))
+        clip: true
+        Rectangle {
+            anchors.fill: parent
+            anchors.bottomMargin: 0
+            color: "#44ffffff"
+            radius: baserect.radius
+        }
+        Rectangle {
+            id: baserect
+            anchors.rightMargin: -radius
+            anchors.bottomMargin: 1
+            gradient: Gradient {
+                GradientStop {color: "#e0e0e0" ; position: 0}
+                GradientStop {color: "#fff" ; position: 0.1}
+                GradientStop {color: "#fff" ; position: 1}
+            }
+            radius: TextSingleton.implicitHeight * 0.16
+            anchors.fill: parent
+            border.color: control.activeFocus ? "#47b" : "#999"
+        }
+        Rectangle {
+            color: "#aaa"
+            anchors.bottomMargin: 2
+            anchors.topMargin: 1
+            anchors.right: parent.right
+            anchors.top: parent.top
+            anchors.bottom: parent.bottom
+            width: 1
+        }
+    }
+
+    /*! This defines the label of the button. */
+    property Component label: Item {
+        implicitWidth: textitem.implicitWidth + 20
+        baselineOffset: textitem.y + textitem.baselineOffset
+        Text {
+            id: textitem
+            anchors.left: parent.left
+            anchors.right: parent.right
+            anchors.leftMargin: 4
+            anchors.rightMargin: 10
+            anchors.verticalCenter: parent.verticalCenter
+            text: control.currentText
+            renderType: cbStyle.renderType
+            font: cbStyle.font
+            color: cbStyle.textColor
+            elide: Text.ElideRight
+        }
+    }
+
+    /*! \internal */
+    property Component panel: Item {
+        property bool popup: false
+        property font font: cbStyle.font
+        property color textColor: cbStyle.textColor
+        property color selectionColor: cbStyle.selectionColor
+        property color selectedTextColor: cbStyle.selectedTextColor
+        property int dropDownButtonWidth: cbStyle.dropDownButtonWidth
+        anchors.centerIn: parent
+        anchors.fill: parent
+        implicitWidth: backgroundLoader.implicitWidth
+        implicitHeight: Math.max(labelLoader.implicitHeight + padding.top + padding.bottom, backgroundLoader.implicitHeight)
+        baselineOffset: labelLoader.item ? padding.top + labelLoader.item.baselineOffset: 0
+
+        Loader {
+            id: backgroundLoader
+            anchors.fill: parent
+            sourceComponent: background
+
+        }
+
+        Loader {
+            id: editorLoader
+            anchors.fill: parent
+            anchors.rightMargin: dropDownButtonWidth + padding.right
+            anchors.bottomMargin: -1
+            sourceComponent: control.editable ? __editor : null
+        }
+
+        Loader {
+            id: labelLoader
+            sourceComponent: label
+            visible: !control.editable
+            anchors.fill: parent
+            anchors.leftMargin: padding.left
+            anchors.topMargin: padding.top
+            anchors.rightMargin: padding.right
+            anchors.bottomMargin: padding.bottom
+        }
+    }
+
+    /*! \internal */
+    property Component __dropDownStyle: MenuStyle {
+        font: cbStyle.font
+        __labelColor: cbStyle.textColor
+        __selectedLabelColor: cbStyle.selectedTextColor
+        __selectedBackgroundColor: cbStyle.selectionColor
+        __maxPopupHeight: 600
+        __menuItemType: "comboboxitem"
+        __scrollerStyle: ScrollViewStyle { }
+    }
+
+    /*! \internal */
+    property Component __popupStyle: Style {
+        property int __maxPopupHeight: 400
+        property int submenuOverlap: 0
+        property int submenuPopupDelay: 100
+
+        property Component frame: Rectangle {
+            id: popupFrame
+            border.color: "white"
+            Text {
+                text: "NOT IMPLEMENTED"
+                color: "red"
+                font {
+                    pixelSize: 10
+                    bold: true
+                }
+                anchors.centerIn: parent
+                rotation: -Math.atan2(popupFrame.height, popupFrame.width) * 180 / Math.PI
+            }
+        }
+
+        property Component menuItemPanel: Text {
+            text: styleData.text
+        }
+
+        property Component __scrollerStyle: null
+    }
+
+    /*! \internal
+        The cursor handle.
+        \since QtQuick.Controls.Styles 1.3
+
+        The parent of the handle is positioned to the top left corner of
+        the cursor position. The interactive area is determined by the
+        geometry of the handle delegate.
+
+        The following signals and read-only properties are available within the scope
+        of the handle delegate:
+        \table
+            \row \li \b {styleData.activated()} [signal] \li Emitted when the handle is activated ie. the editor is clicked.
+            \row \li \b {styleData.pressed} : bool \li Whether the handle is pressed.
+            \row \li \b {styleData.position} : int \li The character position of the handle.
+            \row \li \b {styleData.lineHeight} : real \li The height of the line the handle is on.
+            \row \li \b {styleData.hasSelection} : bool \li Whether the editor has selected text.
+        \endtable
+    */
+    property Component __cursorHandle
+
+    /*! \internal
+        The selection handle.
+        \since QtQuick.Controls.Styles 1.3
+
+        The parent of the handle is positioned to the top left corner of
+        the first selected character. The interactive area is determined
+        by the geometry of the handle delegate.
+
+        The following signals and read-only properties are available within the scope
+        of the handle delegate:
+        \table
+            \row \li \b {styleData.activated()} [signal] \li Emitted when the handle is activated ie. the editor is clicked.
+            \row \li \b {styleData.pressed} : bool \li Whether the handle is pressed.
+            \row \li \b {styleData.position} : int \li The character position of the handle.
+            \row \li \b {styleData.lineHeight} : real \li The height of the line the handle is on.
+            \row \li \b {styleData.hasSelection} : bool \li Whether the editor has selected text.
+        \endtable
+    */
+    property Component __selectionHandle
+
+    /*! \internal
+        The cursor delegate.
+        \since QtQuick.Controls.Styles 1.3
+    */
+    property Component __cursorDelegate
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/ComboBoxStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Base/ComboBoxStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..f0ea9645615a5c2964cd575c14d5b250967b0147
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/ComboBoxStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/CommonStyleHelper.qml b/deployment_test/QtQuick/Controls/Styles/Base/CommonStyleHelper.qml
new file mode 100644
index 0000000000000000000000000000000000000000..5deeb3519943635d78dc2b32659034834a577d42
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Base/CommonStyleHelper.qml
@@ -0,0 +1,59 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Extras module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+
+QtObject {
+    property Item control
+
+    property color buttonColorUpTop: "#e3e3e3"
+    property color buttonColorUpBottom: "#b3b3b3"
+    property color buttonColorDownTop: "#d3d3d3"
+    property color buttonColorDownBottom: "#939393"
+    property color textColorUp: "#4e4e4e"
+    property color textColorDown: "#303030"
+    property color textRaisedColorUp: "#ffffff"
+    property color textRaisedColorDown: "#e3e3e3"
+    property color offColor: "#ff0000"
+    property color offColorShine: "#ff6666"
+    property color onColor: "#00cc00"
+    property color onColorShine: "#66ff66"
+    property color inactiveColor: "#1f1f1f"
+    property color inactiveColorShine: "#666666"
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/CommonStyleHelper.qmlc b/deployment_test/QtQuick/Controls/Styles/Base/CommonStyleHelper.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..c0ce2efcbce5a1983accb78ed2846dc02950ad1d
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/CommonStyleHelper.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/DelayButtonStyle.qml b/deployment_test/QtQuick/Controls/Styles/Base/DelayButtonStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..00a1716a57fb94689fbe3d4a6624577b93844cac
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Base/DelayButtonStyle.qml
@@ -0,0 +1,230 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Extras module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtGraphicalEffects 1.0
+import QtQuick.Controls.Styles 1.4
+import QtQuick.Extras 1.4
+import QtQuick.Extras.Private.CppUtils 1.1
+
+/*!
+    \qmltype DelayButtonStyle
+    \inqmlmodule QtQuick.Controls.Styles
+    \since 5.5
+    \ingroup controlsstyling
+    \brief Provides custom styling for DelayButton.
+
+    You can create a custom DelayButton by replacing the following delegates:
+    \list
+        \li \l foreground
+        \li \l {ButtonStyle::}{label}
+    \endlist
+*/
+
+CircularButtonStyle {
+    id: delayButtonStyle
+
+    /*!
+        The \l DelayButton that this style is attached to.
+    */
+    readonly property DelayButton control: __control
+
+    /*!
+        The gradient of the progress bar around the button.
+    */
+    property Gradient progressBarGradient: Gradient {
+        GradientStop {
+            position: 0
+            color: "#ff6666"
+        }
+        GradientStop {
+            position: 1
+            color: "#ff0000"
+        }
+    }
+
+    /*!
+        The color of the drop shadow under the progress bar.
+    */
+    property color progressBarDropShadowColor: "#ff6666"
+
+    background: Item {
+        implicitWidth: __buttonHelper.implicitWidth
+        implicitHeight: __buttonHelper.implicitHeight
+
+        Canvas {
+            id: backgroundCanvas
+            anchors.fill: parent
+
+            Connections {
+                target: control
+                function onPressedChanged() { backgroundCanvas.requestPaint() }
+                function onCheckedChanged() { backgroundCanvas.requestPaint() }
+            }
+
+            onPaint: {
+                var ctx = getContext("2d");
+                __buttonHelper.paintBackground(ctx);
+            }
+        }
+    }
+
+    /*!
+        The foreground of the button.
+
+        The progress bar is drawn here.
+    */
+    property Component foreground: Item {
+        id: foregroundItem
+
+        state: "normal"
+        states: [
+            State {
+                name: "normal"
+
+                PropertyChanges {
+                    target: foregroundItem
+                    opacity: 1
+                }
+            },
+            State {
+                name: "activated"
+            }
+        ]
+
+        transitions: [
+            Transition {
+                from: "normal"
+                to: "activated"
+                SequentialAnimation {
+                    loops: Animation.Infinite
+
+                    NumberAnimation {
+                        target: foregroundItem
+                        property: "opacity"
+                        from: 0.8
+                        to: 0
+                        duration: 500
+                        easing.type: Easing.InOutSine
+                    }
+                    NumberAnimation {
+                        target: foregroundItem
+                        property: "opacity"
+                        from: 0
+                        to: 0.8
+                        duration: 500
+                        easing.type: Easing.InOutSine
+                    }
+                }
+            }
+        ]
+
+        Connections {
+            target: control
+            function onActivated() { state = "activated" }
+            function onCheckedChanged() { if (!control.checked) state = "normal" }
+        }
+
+        CircularProgressBar {
+            id: progressBar
+            visible: false
+            width: Math.min(parent.width, parent.height) + progressBarDropShadow.radius * 3 * 2
+            height: width
+            anchors.centerIn: parent
+            antialiasing: true
+            barWidth: __buttonHelper.outerArcLineWidth
+            inset: progressBarDropShadow.radius * 3
+            minimumValueAngle: -180
+            maximumValueAngle: 180
+
+            progress: control.progress
+
+            // TODO: Add gradient property if/when we drop support for building with 5.1.
+            function updateGradient() {
+                clearStops();
+                for (var i = 0; i < progressBarGradient.stops.length; ++i) {
+                    addStop(progressBarGradient.stops[i].position, progressBarGradient.stops[i].color);
+                }
+            }
+
+            Component.onCompleted: updateGradient()
+
+            Connections {
+                target: delayButtonStyle
+                function onProgressBarGradientChanged() { progressBar.updateGradient() }
+            }
+        }
+
+        DropShadow {
+            id: progressBarDropShadow
+            anchors.fill: progressBar
+            // QTBUG-33747
+//            cached: !control.pressed
+            color: progressBarDropShadowColor
+            source: progressBar
+        }
+    }
+
+    panel: Item {
+        implicitWidth: backgroundLoader.implicitWidth
+        implicitHeight: backgroundLoader.implicitHeight
+
+        Loader {
+            id: backgroundLoader
+            anchors.fill: parent
+            sourceComponent: background
+        }
+
+        Loader {
+            id: foregroundLoader
+            anchors.fill: parent
+            sourceComponent: foreground
+        }
+
+        Loader {
+            id: labelLoader
+            sourceComponent: label
+            anchors.fill: parent
+            anchors.leftMargin: padding.left
+            anchors.topMargin: padding.top
+            anchors.rightMargin: padding.right
+            anchors.bottomMargin: padding.bottom
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/DelayButtonStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Base/DelayButtonStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..164586348259133117043f65e9da1aa5f5911de3
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/DelayButtonStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/DialStyle.qml b/deployment_test/QtQuick/Controls/Styles/Base/DialStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..95172455ec5c9d72891bbddbd2a85fc05718049f
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Base/DialStyle.qml
@@ -0,0 +1,359 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Extras module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.4
+import QtQuick.Controls.Styles 1.4
+import QtQuick.Controls.Private 1.0
+import QtQuick.Extras 1.4
+import QtQuick.Extras.Private 1.0
+import QtQuick.Extras.Private.CppUtils 1.0
+
+/*!
+    \qmltype DialStyle
+    \inqmlmodule QtQuick.Controls.Styles
+    \since 5.5
+    \ingroup controlsstyling
+    \brief Provides custom styling for Dial.
+
+    You can create a custom dial by replacing the following delegates:
+    \list
+        \li \l background
+    \endlist
+*/
+
+Style {
+    id: dialStyle
+
+    /*!
+        The \l Dial that this style is attached to.
+    */
+    readonly property Dial control: __control
+
+    /*!
+        The distance from the center of the dial to the outer edge of the dial.
+
+        This property is useful for determining the size of the various
+        components of the style, in order to ensure that they are scaled
+        proportionately when the dial is resized.
+    */
+    readonly property real outerRadius: Math.min(control.height, control.width) / 2
+
+    /*!
+        The distance in pixels from the outside of the dial (outerRadius)
+        to the center of the handle.
+    */
+    property real handleInset: (__tickmarkRadius * 4) + ((__handleRadius * 2) * 0.55)
+
+    /*!
+        The interval at which tickmarks are displayed.
+
+        For example, if this property is set to \c 10,
+        control.minimumValue to \c 0, and control.maximumValue to \c 100,
+        the tickmarks displayed will be 0, 10, 20, etc., to 100, along
+        the circumference of the dial.
+    */
+    property real tickmarkStepSize: 1
+
+    /*!
+        The distance in pixels from the outside of the dial (outerRadius) at
+        which the outermost point of the tickmark line is drawn.
+    */
+    property real tickmarkInset: 0
+
+
+    /*!
+        The amount of tickmarks displayed by the dial, calculated from
+        \l tickmarkStepSize and the control's
+        \l {Dial::minimumValue}{minimumValue} and
+        \l {Dial::maximumValue}{maximumValue}.
+
+        \sa minorTickmarkCount
+    */
+    readonly property int tickmarkCount: control.__panel.circularTickmarkLabel.tickmarkCount
+
+    /*!
+        The amount of minor tickmarks between each tickmark.
+
+        \sa tickmarkCount
+    */
+    property int minorTickmarkCount: 0
+
+    /*!
+        The distance in pixels from the outside of the dial (outerRadius) at
+        which the outermost point of the minor tickmark line is drawn.
+    */
+    property real minorTickmarkInset: 0
+
+    /*!
+        The distance in pixels from the outside of the dial (outerRadius) at
+        which the center of the value marker text is drawn.
+    */
+    property real labelInset: 0
+
+    /*!
+        The interval at which tickmark labels are displayed.
+
+        For example, if this property is set to \c 10 (the default),
+        control.minimumValue to \c 0, and control.maximumValue to \c 100, the
+        tickmark labels displayed will be 0, 10, 20, etc., to 100,
+        along the circumference of the dial.
+    */
+    property real labelStepSize: tickmarkStepSize
+
+    /*!
+        The amount of tickmark labels displayed by the dial, calculated from
+        \l labelStepSize and the control's
+        \l {Dial::minimumValue}{minimumValue} and
+        \l {Dial::maximumValue}{maximumValue}.
+
+        \sa tickmarkCount, minorTickmarkCount
+    */
+    readonly property int labelCount: control.__panel.circularTickmarkLabel.labelCount
+
+    /*! \qmlmethod real DialStyle::valueToAngle(real value)
+        Returns \a value as an angle in degrees.
+
+        This function is useful for custom drawing or positioning of items in
+        the style's components. For example, it can be used to calculate the
+        angles at which to draw an arc around the dial indicating the safe
+        range of values.
+    */
+    function valueToAngle(value) {
+        return control.__panel.circularTickmarkLabel.valueToAngle(value);
+    }
+
+    /*! \internal */
+    readonly property real __tickmarkRadius: outerRadius * 0.06
+
+    /*! \internal */
+    readonly property real __handleRadius: outerRadius * 0.15
+
+    /*!
+        \internal
+
+        This property determines whether it is possible to change the value of
+        the dial simply by pressing/tapping.
+
+        If \c false, the user must drag to rotate the dial and hence change the
+        value.
+
+        This property is useful for touch devices, where it is easy to
+        accidentally tap while flicking, for example.
+    */
+    property bool __dragToSet: Settings.hasTouchScreen && Settings.isMobile
+
+    /*!
+        The background of the dial.
+
+        The implicit size of the dial is taken from this component.
+    */
+    property Component background: Item {
+        id: backgroundItem
+        implicitWidth: backgroundHelper.implicitWidth
+        implicitHeight: backgroundHelper.implicitHeight
+
+        CircularButtonStyleHelper {
+            id: backgroundHelper
+            control: dialStyle.control
+            property color zeroMarkerColor: "#a8a8a8"
+            property color zeroMarkerColorTransparent: "transparent"
+            property real zeroMarkerLength: outerArcLineWidth * 1.25
+            property real zeroMarkerWidth: outerArcLineWidth * 0.3
+
+            smallestAxis: Math.min(backgroundItem.width, backgroundItem.height) - __tickmarkRadius * 4
+        }
+
+        Canvas {
+            id: backgroundCanvas
+            anchors.fill: parent
+
+            readonly property real xCenter: width / 2
+            readonly property real yCenter: height / 2
+
+            onPaint: {
+                var ctx = getContext("2d");
+                backgroundHelper.paintBackground(ctx);
+            }
+        }
+    }
+
+    /*!
+        The handle of the dial.
+
+        The handle is automatically positioned within the dial, based on the
+        \l handleInset and the implicit width and height of the handle itself.
+    */
+    property Component handle: Canvas {
+        implicitWidth: __handleRadius * 2
+        implicitHeight: __handleRadius * 2
+
+        HandleStyleHelper {
+            id: handleHelper
+        }
+
+        onPaint: {
+            var ctx = getContext("2d");
+            handleHelper.paintHandle(ctx, 1, 1, width - 2, height - 2);
+        }
+    }
+
+    /*!
+        This component defines each individual tickmark. The position of each
+        tickmark is already set; only the
+        \l {Item::implicitWidth}{implicitWidth} and
+        \l {Item::implicitHeight}{implicitHeight} need to be specified.
+
+        Each instance of this component has access to the following properties:
+
+        \table
+            \row \li \c {readonly property int} \b styleData.index
+                \li The index of this tickmark.
+            \row \li \c {readonly property real} \b styleData.value
+                \li The value that this tickmark represents.
+        \endtable
+    */
+    property Component tickmark: Rectangle {
+        implicitWidth: outerRadius * 0.015 + (styleData.index === 0 || styleData.index === tickmarkCount ? 1 : (styleData.index) / tickmarkCount) * __tickmarkRadius * 0.75
+        implicitHeight: implicitWidth
+        radius: height / 2
+        color: styleData.index === 0 ? "transparent" : Qt.rgba(0, 0, 0, 0.266)
+        antialiasing: true
+        border.width: styleData.index === 0 ? Math.max(1, outerRadius * 0.0075) : 0
+        border.color: Qt.rgba(0, 0, 0, 0.266)
+    }
+
+    /*!
+        This component defines each individual minor tickmark. The position of each
+        minor tickmark is already set; only the
+        \l {Item::implicitWidth}{implicitWidth} and
+        \l {Item::implicitHeight}{implicitHeight} need to be specified.
+
+        Each instance of this component has access to the following properties:
+
+        \table
+            \row \li \c {readonly property int} \b styleData.index
+                \li The index of this tickmark.
+            \row \li \c {readonly property real} \b styleData.value
+                \li The value that this tickmark represents.
+        \endtable
+
+        By default, no minor tickmark is defined.
+    */
+    property Component minorTickmark
+
+    /*!
+        This defines the text of each tickmark label on the dial.
+
+        Each instance of this component has access to the following properties:
+
+        \table
+            \row \li \c {readonly property int} \b styleData.index
+                \li The index of this label.
+            \row \li \c {readonly property real} \b styleData.value
+                \li The value that this label represents.
+        \endtable
+
+        By default, no label is defined.
+    */
+    property Component tickmarkLabel
+
+    /*! \internal */
+    property Component panel: Item {
+        implicitWidth: backgroundLoader.implicitWidth
+        implicitHeight: backgroundLoader.implicitHeight
+
+        property alias background: backgroundLoader.item
+        property alias circularTickmarkLabel: circularTickmarkLabel_
+
+        Loader {
+            id: backgroundLoader
+            sourceComponent: dialStyle.background
+            width: outerRadius * 2
+            height: width
+            anchors.centerIn: parent
+        }
+
+        Loader {
+            id: handleLoader
+            sourceComponent: dialStyle.handle
+            x: backgroundLoader.x + __pos.x - width / 2
+            y: backgroundLoader.y + __pos.y - height / 2
+
+            readonly property point __pos: {
+                var radians = 0;
+                if (control.__wrap) {
+                    radians = (control.value - control.minimumValue) /
+                            (control.maximumValue - control.minimumValue) *
+                            (MathUtils.pi2) + backgroundHelper.zeroAngle;
+                } else {
+                    radians = -(Math.PI * 8 - (control.value - control.minimumValue) * 10 *
+                                Math.PI / (control.maximumValue - control.minimumValue)) / 6;
+                }
+
+                return MathUtils.centerAlongCircle(backgroundLoader.width / 2, backgroundLoader.height / 2,
+                                               0, 0, radians, outerRadius - handleInset)
+            }
+        }
+
+        CircularTickmarkLabel {
+            id: circularTickmarkLabel_
+            anchors.fill: backgroundLoader
+
+            minimumValue: control.minimumValue
+            maximumValue: control.maximumValue
+            stepSize: control.stepSize
+            tickmarksVisible: control.tickmarksVisible
+            minimumValueAngle: -150
+            maximumValueAngle: 150
+            tickmarkStepSize: dialStyle.tickmarkStepSize
+            tickmarkInset: dialStyle.tickmarkInset
+            minorTickmarkCount: dialStyle.minorTickmarkCount
+            minorTickmarkInset: dialStyle.minorTickmarkInset
+            labelInset: dialStyle.labelInset
+            labelStepSize: dialStyle.labelStepSize
+
+            style: CircularTickmarkLabelStyle {
+                tickmark: dialStyle.tickmark
+                minorTickmark: dialStyle.minorTickmark
+                tickmarkLabel: dialStyle.tickmarkLabel
+            }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/DialStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Base/DialStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..4999b68919aa47ac12abc203ca964a54aac962c8
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/DialStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/FocusFrameStyle.qml b/deployment_test/QtQuick/Controls/Styles/Base/FocusFrameStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..3db24796c837daf40ef3583adc030684ac777126
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Base/FocusFrameStyle.qml
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype FocusFrameStyle
+    \internal
+    \inqmlmodule QtQuick.Controls.Styles
+*/
+Item {
+    property int margin: -3
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/FocusFrameStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Base/FocusFrameStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..a8804c55acbcce4a9d44004aa11fe3c138d0b71c
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/FocusFrameStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/GaugeStyle.qml b/deployment_test/QtQuick/Controls/Styles/Base/GaugeStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..4ad1f7efc2a541f8229a36ec79673ff40143c010
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Base/GaugeStyle.qml
@@ -0,0 +1,544 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Extras module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.4
+import QtQuick.Controls.Styles 1.4
+import QtQuick.Controls.Private 1.0
+import QtQuick.Extras 1.4
+import QtQuick.Extras.Private 1.0
+
+/*!
+    \qmltype GaugeStyle
+    \inqmlmodule QtQuick.Controls.Styles
+    \since 5.5
+    \ingroup controlsstyling
+    \brief Provides custom styling for Gauge.
+
+    You can create a custom gauge by replacing the following delegates:
+    \list
+    \li \l background
+    \li valueBar
+    \li tickmarkLabel
+    \endlist
+
+    Below, you'll find an example of how to create a temperature gauge that
+    changes color as its value increases:
+
+    \code
+    import QtQuick 2.2
+    import QtQuick.Controls 1.4
+    import QtQuick.Controls.Styles 1.4
+    import QtQuick.Extras 1.4
+
+    Rectangle {
+        width: 80
+        height: 200
+
+        Timer {
+            running: true
+            repeat: true
+            interval: 2000
+            onTriggered: gauge.value = gauge.value == gauge.maximumValue ? 5 : gauge.maximumValue
+        }
+
+        Gauge {
+            id: gauge
+            anchors.fill: parent
+            anchors.margins: 10
+
+            value: 5
+            Behavior on value {
+                NumberAnimation {
+                    duration: 1000
+                }
+            }
+
+            style: GaugeStyle {
+                valueBar: Rectangle {
+                    implicitWidth: 16
+                    color: Qt.rgba(gauge.value / gauge.maximumValue, 0, 1 - gauge.value / gauge.maximumValue, 1)
+                }
+            }
+        }
+    }
+    \endcode
+
+    \image gauge-temperature.png
+    The gauge displaying values at various points during the animation.
+
+    \sa {Styling Gauge}
+*/
+
+Style {
+    id: gaugeStyle
+
+    /*!
+        The \l Gauge that this style is attached to.
+    */
+    readonly property Gauge control: __control
+
+    /*!
+        This property holds the value displayed by the gauge as a position in
+        pixels.
+
+        It is useful for custom styling.
+    */
+    readonly property real valuePosition: control.__panel.valuePosition
+
+    /*!
+        The background of the gauge, displayed behind the \l valueBar.
+
+        By default, no background is defined.
+    */
+    property Component background
+
+    /*!
+        Each tickmark displayed by the gauge.
+
+        To set the size of the tickmarks, specify an
+        \l {Item::implicitWidth}{implicitWidth} and
+        \l {Item::implicitHeight}{implicitHeight}.
+
+        The widest tickmark will determine the space set aside for all
+        tickmarks. For this reason, the \c implicitWidth of each tickmark
+        should be greater than or equal to that of each minor tickmark. If you
+        need minor tickmarks to have greater widths than the major tickmarks,
+        set the larger width in a child item of the \l minorTickmark component.
+
+        For layouting reasons, each tickmark should have the same
+        \c implicitHeight. If different heights are needed for individual
+        tickmarks, specify those heights in a child item of the component.
+
+        In the example below, we decrease the height of the tickmarks:
+
+        \code
+        tickmark: Item {
+            implicitWidth: 18
+            implicitHeight: 1
+
+            Rectangle {
+                color: "#c8c8c8"
+                anchors.fill: parent
+                anchors.leftMargin: 3
+                anchors.rightMargin: 3
+            }
+        }
+        \endcode
+
+        \image gauge-tickmark-example.png Gauge tickmark example
+
+        Each instance of this component has access to the following properties:
+
+        \table
+            \row \li \c {readonly property int} \b styleData.index
+                \li The index of this tickmark.
+            \row \li \c {readonly property real} \b styleData.value
+                \li The value that this tickmark represents.
+            \row \li \c {readonly property real} \b styleData.valuePosition
+                \li The value that this tickmark represents as a position in
+                    pixels, with 0 being at the bottom of the gauge.
+        \endtable
+
+        \sa minorTickmark
+    */
+    property Component tickmark: Item {
+        implicitWidth: Math.round(TextSingleton.height * 1.1)
+        implicitHeight: Math.max(2, Math.round(TextSingleton.height * 0.1))
+
+        Rectangle {
+            color: "#c8c8c8"
+            anchors.fill: parent
+            anchors.leftMargin: Math.round(TextSingleton.implicitHeight * 0.2)
+            anchors.rightMargin: Math.round(TextSingleton.implicitHeight * 0.2)
+        }
+    }
+
+    /*!
+        Each minor tickmark displayed by the gauge.
+
+        To set the size of the minor tickmarks, specify an
+        \l {Item::implicitWidth}{implicitWidth} and
+        \l {Item::implicitHeight}{implicitHeight}.
+
+        For layouting reasons, each minor tickmark should have the same
+        \c implicitHeight. If different heights are needed for individual
+        tickmarks, specify those heights in a child item of the component.
+
+        In the example below, we decrease the width of the minor tickmarks:
+
+        \code
+        minorTickmark: Item {
+            implicitWidth: 8
+            implicitHeight: 1
+
+            Rectangle {
+                color: "#cccccc"
+                anchors.fill: parent
+                anchors.leftMargin: 2
+                anchors.rightMargin: 4
+            }
+        }
+        \endcode
+
+        \image gauge-minorTickmark-example.png Gauge minorTickmark example
+
+        Each instance of this component has access to the following property:
+
+        \table
+            \row \li \c {readonly property int} \b styleData.index
+                \li The index of this minor tickmark.
+            \row \li \c {readonly property real} \b styleData.value
+                \li The value that this minor tickmark represents.
+            \row \li \c {readonly property real} \b styleData.valuePosition
+                \li The value that this minor tickmark represents as a
+                    position in pixels, with 0 being at the bottom of the
+                    gauge.
+        \endtable
+
+        \sa tickmark
+    */
+    property Component minorTickmark: Item {
+        implicitWidth: Math.round(TextSingleton.implicitHeight * 0.65)
+        implicitHeight: Math.max(1, Math.round(TextSingleton.implicitHeight * 0.05))
+
+        Rectangle {
+            color: "#c8c8c8"
+            anchors.fill: parent
+            anchors.leftMargin: control.__tickmarkAlignment === Qt.AlignBottom || control.__tickmarkAlignment === Qt.AlignRight
+                ? Math.max(3, Math.round(TextSingleton.implicitHeight * 0.2))
+                : 0
+            anchors.rightMargin: control.__tickmarkAlignment === Qt.AlignBottom || control.__tickmarkAlignment === Qt.AlignRight
+                ? 0
+                : Math.max(3, Math.round(TextSingleton.implicitHeight * 0.2))
+        }
+    }
+
+    /*!
+        This defines the text of each tickmark label on the gauge.
+
+        Each instance of this component has access to the following properties:
+
+        \table
+            \row \li \c {readonly property int} \b styleData.index
+                \li The index of this label.
+            \row \li \c {readonly property real} \b styleData.value
+                \li The value that this label represents.
+        \endtable
+    */
+    property Component tickmarkLabel: Text {
+        text: control.formatValue(styleData.value)
+        font: control.font
+        color: "#c8c8c8"
+        antialiasing: true
+    }
+
+    /*!
+        The bar that represents the value of the gauge.
+
+        To height of the value bar is automatically resized according to
+        \l {Gauge::value}{value}, and does not need to be specified.
+
+        When a custom valueBar is defined, its
+        \l {Item::implicitWidth}{implicitWidth} property must be set.
+    */
+    property Component valueBar: Rectangle {
+        color: "#00bbff"
+        implicitWidth: TextSingleton.implicitHeight
+    }
+
+    /*!
+        The bar that represents the foreground of the gauge.
+
+        This component is drawn above every other component.
+    */
+    property Component foreground: Canvas {
+        readonly property real xCenter: width / 2
+        readonly property real yCenter: height / 2
+        property real shineLength: height * 0.95
+
+        onPaint: {
+            var ctx = getContext("2d");
+            ctx.reset();
+
+            ctx.beginPath();
+            ctx.rect(0, 0, width, height);
+
+            var gradient = ctx.createLinearGradient(0, yCenter, width, yCenter);
+
+            gradient.addColorStop(0, Qt.rgba(1, 1, 1, 0.08));
+            gradient.addColorStop(1, Qt.rgba(1, 1, 1, 0.20));
+            ctx.fillStyle = gradient;
+            ctx.fill();
+        }
+    }
+
+    /*! \internal */
+    property Component panel: Item {
+        id: panelComponent
+        implicitWidth: control.orientation === Qt.Vertical ? tickmarkLabelBoundsWidth + rawBarWidth : TextSingleton.height * 14
+        implicitHeight: control.orientation === Qt.Vertical ? TextSingleton.height * 14 : tickmarkLabelBoundsWidth + rawBarWidth
+
+        readonly property int tickmarkCount: (control.maximumValue - control.minimumValue) / control.tickmarkStepSize + 1
+        readonly property real tickmarkSpacing: (tickmarkLabelBounds.height - tickmarkWidth * tickmarkCount) / (tickmarkCount - 1)
+
+        property real tickmarkLength: tickmarkColumn.width
+        // Can't deduce this from the column, so we set it from within the first tickmark delegate loader.
+        property real tickmarkWidth: 2
+
+        readonly property real tickmarkOffset: control.orientation === Qt.Vertical ? control.__hiddenText.height / 2 : control.__hiddenText.width / 2
+
+        readonly property real minorTickmarkStep: control.tickmarkStepSize / (control.minorTickmarkCount + 1);
+
+        /*!
+            Returns the marker text that should be displayed based on
+            \a markerPos (\c 0 to \c 1.0).
+        */
+        function markerTextFromPos(markerPos) {
+            return markerPos * (control.maximumValue - control.minimumValue) + control.minimumValue;
+        }
+
+        readonly property real rawBarWidth: valueBarLoader.item.implicitWidth
+        readonly property real barLength: (control.orientation === Qt.Vertical ? control.height : control.width) - (tickmarkOffset * 2 - 2)
+
+        readonly property real tickmarkLabelBoundsWidth: tickmarkLength + (control.orientation === Qt.Vertical ? control.__hiddenText.width : control.__hiddenText.height)
+        readonly property int valuePosition: valueBarLoader.height
+
+        Item {
+            id: container
+
+            width: control.orientation === Qt.Vertical ? parent.width : parent.height
+            height: control.orientation === Qt.Vertical ? parent.height : parent.width
+            rotation: control.orientation === Qt.Horizontal ? 90 : 0
+            transformOrigin: Item.Center
+            anchors.centerIn: parent
+
+            Item {
+                id: valueBarItem
+
+                x: control.__tickmarkAlignment === Qt.AlignLeft || control.__tickmarkAlignment === Qt.AlignTop ? tickmarkLabelBounds.x + tickmarkLabelBounds.width : 0
+                width: rawBarWidth
+                height: barLength
+                anchors.verticalCenter: parent.verticalCenter
+
+                Loader {
+                    id: backgroundLoader
+                    sourceComponent: background
+                    anchors.fill: parent
+                }
+
+                Loader {
+                    id: valueBarLoader
+                    sourceComponent: valueBar
+
+                    readonly property real valueAsPercentage: (control.value - control.minimumValue) / (control.maximumValue - control.minimumValue)
+
+                    y: Math.round(parent.height - height)
+                    height: Math.round(valueAsPercentage * parent.height)
+                }
+            }
+            Item {
+                id: tickmarkLabelBounds
+
+                x: control.__tickmarkAlignment === Qt.AlignLeft || control.__tickmarkAlignment === Qt.AlignTop ? 0 : valueBarItem.width
+                width: tickmarkLabelBoundsWidth
+                height: barLength
+                anchors.verticalCenter: parent.verticalCenter
+                // We want our items to be laid out from bottom to top, but Column can't do that, so we flip
+                // the whole item containing the tickmarks and labels vertically. Then, we flip each tickmark
+                // and label back again.
+                transform: Rotation {
+                    axis.x: 1
+                    axis.y: 0
+                    axis.z: 0
+                    origin.x: tickmarkLabelBounds.width / 2
+                    origin.y: tickmarkLabelBounds.height / 2
+                    angle: 180
+                }
+
+                Column {
+                    id: tickmarkColumn
+                    x: control.__tickmarkAlignment === Qt.AlignRight || control.__tickmarkAlignment === Qt.AlignBottom ? 0 : tickmarkLabelBounds.width - width
+                    spacing: tickmarkSpacing
+                    anchors.verticalCenter: parent.verticalCenter
+
+                    Repeater {
+                        id: tickmarkRepeater
+                        model: tickmarkCount
+                        delegate: Loader {
+                            id: tickmarkDelegateLoader
+
+                            sourceComponent: gaugeStyle.tickmark
+                            transform: Rotation {
+                                axis.x: 1
+                                axis.y: 0
+                                axis.z: 0
+                                origin.x: tickmarkDelegateLoader.width / 2
+                                origin.y: tickmarkDelegateLoader.height / 2
+                                angle: 180
+                            }
+
+                            onHeightChanged: {
+                                if (index == 0)
+                                    tickmarkWidth = height;
+                            }
+
+                            readonly property int __index: index
+                            property QtObject styleData: QtObject {
+                                readonly property alias index: tickmarkDelegateLoader.__index
+                                readonly property real value: (index / (tickmarkCount - 1)) * (control.maximumValue - control.minimumValue) + control.minimumValue
+                                readonly property int valuePosition: Math.round(tickmarkDelegateLoader.y)
+                            }
+                        }
+                    }
+                }
+
+                // Doesn't need to be in a column, since we assume that the major tickmarks will always be longer than us.
+                Repeater {
+                    id: minorTickmarkRepeater
+                    model: (tickmarkCount - 1) * control.minorTickmarkCount
+                    delegate: Loader {
+                        id: minorTickmarkDelegateLoader
+
+                        x: control.__tickmarkAlignment === Qt.AlignRight || control.__tickmarkAlignment === Qt.AlignBottom ? 0 : tickmarkLabelBounds.width - width
+                        y: {
+                            var tickmarkWidthOffset = Math.floor(index / control.minorTickmarkCount) * tickmarkWidth + tickmarkWidth;
+                            var relativePosition = (index % control.minorTickmarkCount + 1) * (tickmarkSpacing / (control.minorTickmarkCount + 1));
+                            var clusterOffset = Math.floor(index / control.minorTickmarkCount) * tickmarkSpacing;
+                            // We assume that each minorTickmark's height is the same.
+                            return clusterOffset + tickmarkWidthOffset + relativePosition - height / 2;
+                        }
+
+                        transform: Rotation {
+                            axis.x: 1
+                            axis.y: 0
+                            axis.z: 0
+                            origin.x: minorTickmarkDelegateLoader.width / 2
+                            origin.y: minorTickmarkDelegateLoader.height / 2
+                            angle: 180
+                        }
+
+                        sourceComponent: gaugeStyle.minorTickmark
+
+                        readonly property int __index: index
+                        property QtObject styleData: QtObject {
+                            readonly property alias index: minorTickmarkDelegateLoader.__index
+                            readonly property real value: {
+                                var tickmarkIndex = Math.floor(index / control.minorTickmarkCount);
+                                return index * minorTickmarkStep + minorTickmarkStep * tickmarkIndex + minorTickmarkStep + control.minimumValue;
+                            }
+                            readonly property int valuePosition: Math.round(minorTickmarkDelegateLoader.y)
+                        }
+                    }
+                }
+
+                Item {
+                    id: tickmarkLabelItem
+                    x: control.__tickmarkAlignment === Qt.AlignRight || control.__tickmarkAlignment === Qt.AlignBottom
+                       ? tickmarkLength
+                       : tickmarkLabelBounds.width - tickmarkLength - width
+                    width: control.__hiddenText.width
+                    // Use the bar height instead of the container's, as the labels seem to be translated by 1 when we
+                    // flip the control vertically, and this fixes that.
+                    height: parent.height
+                    anchors.verticalCenter: parent.verticalCenter
+
+                    Repeater {
+                        id: tickmarkTextRepeater
+                        model: tickmarkCount
+                        delegate: Item {
+                            x: {
+                                if (control.orientation === Qt.Vertical)
+                                    return 0;
+
+                                // Align the text to the edge of the tickmarks.
+                                return ((width - height) / 2) * (control.__tickmarkAlignment === Qt.AlignBottom ? -1 : 1);
+                            }
+                            y: index * labelDistance - height / 2
+
+                            width: control.__hiddenText.width
+                            height: control.__hiddenText.height
+
+                            transformOrigin: Item.Center
+                            rotation: control.orientation === Qt.Vertical ? 0 : 90
+
+                            readonly property real labelDistance: tickmarkLabelBounds.height / (tickmarkCount - 1)
+
+                            Loader {
+                                id: tickmarkTextRepeaterDelegate
+
+                                x: {
+                                    if (control.orientation === Qt.Horizontal) {
+                                        return parent.width / 2 - width / 2;
+                                    }
+
+                                    return control.__tickmarkAlignment === Qt.AlignRight || control.__tickmarkAlignment === Qt.AlignBottom
+                                        ? 0
+                                        : parent.width - width;
+                                }
+
+                                transform: Rotation {
+                                    axis.x: 1
+                                    axis.y: 0
+                                    axis.z: 0
+                                    origin.x: tickmarkTextRepeaterDelegate.width / 2
+                                    origin.y: tickmarkTextRepeaterDelegate.height / 2
+                                    angle: 180
+                                }
+
+                                sourceComponent: tickmarkLabel
+
+                                readonly property int __index: index
+                                property QtObject styleData: QtObject {
+                                    readonly property alias index: tickmarkTextRepeaterDelegate.__index
+                                    readonly property real value: markerTextFromPos(index / (tickmarkTextRepeater.count - 1))
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+            Loader {
+                id: foregroundLoader
+                sourceComponent: foreground
+                anchors.fill: valueBarItem
+            }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/GaugeStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Base/GaugeStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..d2fc21d966ca5ce8ddbd9ca1ccb86d38b4655538
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/GaugeStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/GroupBoxStyle.qml b/deployment_test/QtQuick/Controls/Styles/Base/GroupBoxStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..061a8069b5f11d2064ea9c79303c9f8fc7e750cd
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Base/GroupBoxStyle.qml
@@ -0,0 +1,143 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype GroupBoxStyle
+    \internal
+    \inqmlmodule QtQuick.Controls.Styles
+    \ingroup controlsstyling
+    \since 5.1
+*/
+Style {
+
+    /*! The \l GroupBox this style is attached to. */
+    readonly property GroupBox control: __control
+
+    /*! The margin from the content item to the groupbox. */
+    padding {
+        top: (control.title.length > 0 || control.checkable ? TextSingleton.implicitHeight : 0) + 10
+        left: 8
+        right: 8
+        bottom: 6
+    }
+
+    /*! The title text color. */
+    property color textColor: SystemPaletteSingleton.text(control.enabled)
+
+    /*! The check box. */
+    property Component checkbox:  Item {
+        implicitWidth: 18
+        implicitHeight: 18
+        BorderImage {
+            anchors.fill: parent
+            source: "images/editbox.png"
+            border.top: 6
+            border.bottom: 6
+            border.left: 6
+            border.right: 6
+        }
+        Rectangle {
+            height: 16
+            width: 16
+            antialiasing: true
+            visible: control.checked
+            color: "#666"
+            radius: 1
+            anchors.margins: 4
+            anchors.fill: parent
+            anchors.topMargin: 3
+            anchors.bottomMargin: 5
+            border.color: "#222"
+            opacity: control.enabled ? 1 : 0.5
+            Rectangle {
+                anchors.fill: parent
+                anchors.margins: 1
+                color: "transparent"
+                border.color: "#33ffffff"
+            }
+        }
+        BorderImage {
+            anchors.fill: parent
+            anchors.margins: -1
+            source: "images/focusframe.png"
+            visible: control.activeFocus
+            border.left: 4
+            border.right: 4
+            border.top: 4
+            border.bottom: 4
+        }
+    }
+
+    /*! The groupbox frame. */
+    property Component panel: Item {
+        anchors.fill: parent
+        Loader {
+            id: checkboxloader
+            anchors.left: parent.left
+            sourceComponent: control.checkable ? checkbox : null
+            anchors.verticalCenter: label.verticalCenter
+            width: item ? item.implicitWidth : 0
+        }
+
+        Text {
+            id: label
+            anchors.top: parent.top
+            anchors.left: checkboxloader.right
+            anchors.margins: 4
+            text: control.title
+            color: textColor
+            renderType: Settings.isMobile ? Text.QtRendering : Text.NativeRendering
+        }
+
+        BorderImage {
+            anchors.fill: parent
+            anchors.topMargin: padding.top - 7
+            source: "images/groupbox.png"
+            border.left: 4
+            border.right: 4
+            border.top: 4
+            border.bottom: 4
+            visible: !control.flat
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/GroupBoxStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Base/GroupBoxStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..a92fe66de7ef72e7484b407051129e8f17b0cc2a
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/GroupBoxStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/HandleStyle.qml b/deployment_test/QtQuick/Controls/Styles/Base/HandleStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..0713c9ff66d44cd32ec37760a6553c7817bfa5d9
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Base/HandleStyle.qml
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Extras module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls.Private 1.0
+import QtQuick.Extras 1.4
+
+Style {
+    id: handleStyle
+    property alias handleColorTop: __helper.handleColorTop
+    property alias handleColorBottom: __helper.handleColorBottom
+    property alias handleColorBottomStop: __helper.handleColorBottomStop
+
+    HandleStyleHelper {
+        id: __helper
+    }
+
+    property Component handle: Item {
+        implicitWidth: 50
+        implicitHeight: 50
+
+        Canvas {
+            id: handleCanvas
+            anchors.fill: parent
+
+            onPaint: {
+                var ctx = getContext("2d");
+                __helper.paintHandle(ctx);
+            }
+        }
+    }
+
+    property Component panel: Item {
+        Loader {
+            id: handleLoader
+            sourceComponent: handle
+            anchors.fill: parent
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/HandleStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Base/HandleStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..2dff175070a4ddc19354ff772e0b31f77f3db005
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/HandleStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/HandleStyleHelper.qml b/deployment_test/QtQuick/Controls/Styles/Base/HandleStyleHelper.qml
new file mode 100644
index 0000000000000000000000000000000000000000..78059bfe8787f14ecc801ab67244aae5e95beecf
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Base/HandleStyleHelper.qml
@@ -0,0 +1,94 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Extras module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+
+QtObject {
+    id: handleStyleHelper
+
+    property color handleColorTop: "#969696"
+    property color handleColorBottom: Qt.rgba(0.9, 0.9, 0.9, 0.298)
+    property real handleColorBottomStop: 0.7
+
+    property color handleRingColorTop: "#b0b0b0"
+    property color handleRingColorBottom: "transparent"
+
+    /*!
+        If \a ctx is the only argument, this is equivalent to calling
+        paintHandle(\c ctx, \c 0, \c 0, \c ctx.canvas.width, \c ctx.canvas.height).
+    */
+    function paintHandle(ctx, handleX, handleY, handleWidth, handleHeight) {
+        ctx.reset();
+
+        if (handleWidth < 0)
+            return;
+
+        if (arguments.length == 1) {
+            handleX = 0;
+            handleY = 0;
+            handleWidth = ctx.canvas.width;
+            handleHeight = ctx.canvas.height;
+        }
+
+        ctx.beginPath();
+        var gradient = ctx.createRadialGradient(handleX, handleY, 0,
+            handleX, handleY, handleWidth * 1.5);
+        gradient.addColorStop(0, handleColorTop);
+        gradient.addColorStop(handleColorBottomStop, handleColorBottom);
+        ctx.ellipse(handleX, handleY, handleWidth, handleHeight);
+        ctx.fillStyle = gradient;
+        ctx.fill();
+
+        /* Draw the ring gradient around the handle. */
+        // Clip first, so we only draw inside the ring.
+        ctx.beginPath();
+        ctx.ellipse(handleX, handleY, handleWidth, handleHeight);
+        ctx.ellipse(handleX + 2, handleY + 2, handleWidth - 4, handleHeight - 4);
+        ctx.clip();
+
+        ctx.beginPath();
+        gradient = ctx.createLinearGradient(handleX + handleWidth / 2, handleY,
+            handleX + handleWidth / 2, handleY + handleHeight);
+        gradient.addColorStop(0, handleRingColorTop);
+        gradient.addColorStop(1, handleRingColorBottom);
+        ctx.ellipse(handleX, handleY, handleWidth, handleHeight);
+        ctx.fillStyle = gradient;
+        ctx.fill();
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/HandleStyleHelper.qmlc b/deployment_test/QtQuick/Controls/Styles/Base/HandleStyleHelper.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..3a116ee3819d3dd996913ba3a99381e8a8b1fe41
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/HandleStyleHelper.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/MenuBarStyle.qml b/deployment_test/QtQuick/Controls/Styles/Base/MenuBarStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..ade34b0a0366f3719f6e43046e3a73f06f0ad9b9
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Base/MenuBarStyle.qml
@@ -0,0 +1,131 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype MenuBarStyle
+    \inqmlmodule QtQuick.Controls.Styles
+    \since 5.3
+    \ingroup controlsstyling
+    \brief Provides custom styling for MenuBar.
+
+    \note Styling menu bars may not be supported on platforms using native menu bars
+    through their QPA plugin.
+*/
+
+Style {
+    id: root
+
+    /*!
+        \qmlmethod string MenuBarStyle::formatMnemonic(string text, bool underline = false)
+        Returns a formatted string to render mnemonics for a given menu item \a text.
+
+        The mnemonic character is prefixed by an ampersand in the original string.
+
+        Passing \c true for \e underline will underline the mnemonic character (e.g.,
+        \c formatMnemonic("&File", true) will return \c "<u>F</u>ile"). Passing \c false
+        for \a underline will return the plain text form (e.g., \c formatMnemonic("&File", false)
+        will return \c "File").
+
+        \sa Label
+    */
+    function formatMnemonic(text, underline) {
+        return underline ? StyleHelpers.stylizeMnemonics(text) : StyleHelpers.removeMnemonics(text)
+    }
+
+    /*! The background for the full menu bar.
+
+        The background will be extended to the full containing window width.
+        Its height will always fit all of the menu bar items. The final size
+        will include the paddings.
+    */
+    property Component background: Rectangle {
+        color: "#dcdcdc"
+        implicitHeight: 20
+    }
+
+    /*! The menu bar item.
+
+        \target styleData properties
+        This item has to be configured using the \b styleData object which is in scope,
+        and contains the following read-only properties:
+        \table
+            \row \li \b {styleData.index} : int \li The index of the menu item in its menu.
+            \row \li \b {styleData.selected} : bool \li \c true if the menu item is selected.
+            \row \li \b {styleData.open} : bool \li \c true when the pull down menu is open.
+            \row \li \b {styleData.text} : string \li The menu bar item's text.
+            \row \li \b {styleData.underlineMnemonic} : bool \li When \c true, the style should underline the menu item's label mnemonic.
+        \endtable
+
+    */
+    property Component itemDelegate: Rectangle {
+        implicitWidth: text.width + 12
+        implicitHeight: text.height + 4
+        color: styleData.enabled && styleData.open ? "#49d" : "transparent"
+
+        Text {
+            id: text
+            font: root.font
+            text: formatMnemonic(styleData.text, styleData.underlineMnemonic)
+            anchors.centerIn: parent
+            renderType: Settings.isMobile ? Text.QtRendering : Text.NativeRendering
+            color: styleData.open ? "white" : SystemPaletteSingleton.windowText(control.enabled && styleData.enabled)
+        }
+    }
+
+    /*! The style component for the menubar's own menus and their submenus.
+
+        \sa {MenuStyle}
+    */
+    property Component menuStyle: MenuStyle {
+        font: root.font
+    }
+
+    /*!
+        \since QtQuick.Controls.Styles 1.3
+        The font of the control.
+    */
+    property font font
+
+    /*! \internal */
+    property bool __isNative: true
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/MenuBarStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Base/MenuBarStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..d193fe0c3c4d6eaf884d6071f3589d4d620a89be
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/MenuBarStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/MenuStyle.qml b/deployment_test/QtQuick/Controls/Styles/Base/MenuStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..f40e0af7c583ad9443a2e52809a0a405bd3b098a
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Base/MenuStyle.qml
@@ -0,0 +1,477 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Window 2.1
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype MenuStyle
+    \inqmlmodule QtQuick.Controls.Styles
+    \since 5.3
+    \ingroup controlsstyling
+    \brief Provides custom styling for Menu.
+
+    \target styleData properties
+    The \b styleData object contains the following read-only properties:
+    \table
+        \row \li \b {styleData.index} : int \li The index of the menu item in its menu.
+        \row \li \b {styleData.type} : enumeration \li The type of menu item. See below for possible values.
+        \row \li \b {styleData.selected} : bool \li \c true if the menu item is selected.
+        \row \li \b {styleData.pressed} : bool \li \c true if the menu item is pressed. Available since 5.4.
+        \row \li \b {styleData.text} : string \li The menu item's text, or title if it's a submenu.
+        \row \li \b {styleData.underlineMnemonic} : bool \li Whether the style should underline the menu item's label mnemonic.
+        \row \li \b {styleData.shortcut} : string \li The text for the menu item's shortcut.
+        \row \li \b {styleData.iconSource} : url \li The source URL to the menu item's icon. Undefined if it has no icon.
+        \row \li \b {styleData.enabled} : bool \li \c true if the menu item is enabled.
+        \row \li \b {styleData.checkable} : bool \li \c true if the menu  item is checkable.
+        \row \li \b {styleData.exclusive} : bool \li \c true if the menu item is checkable, and it's part of an \l ExclusiveGroup.
+        \row \li \b {styleData.checked} : bool \li \c true if the menu item is checkable and currently checked.
+        \row \li \b {styleData.scrollerDirection} : enumeration \li If the menu item is a scroller, its pointing direction.
+                                                                     Valid values are \c Qt.UpArrow, \c Qt.DownArrow, and \c Qt.NoArrow.
+    \endtable
+
+    The valid values for \b {styleData.type} are:
+    \list
+    \li MenuItemType.Item
+    \li MenuItemType.Menu
+    \li MenuItemType.Separator
+    \li MenuItemType.ScrollIndicator
+    \endlist
+
+    \note Styling menus may not be supported on platforms using native menus
+    through their QPA plugin.
+*/
+
+Style {
+    id: styleRoot
+
+    padding {
+        top: 1
+        bottom: 1
+        left: 1
+        right: 1
+    }
+
+    /*! The amount of pixels by which a submenu popup overlaps horizontally its parent menu. */
+    property int submenuOverlap: 1
+
+    /*! The number of milliseconds to wait before opening a submenu. */
+    property int submenuPopupDelay: 200
+
+    /*!
+        \qmlmethod string MenuStyle::formatMnemonic(string text, bool underline = false)
+        Returns a rich-text string to render mnemonics for a given menu item \a text.
+
+        The mnemonic character is prefixed by an ampersand in the original string.
+
+        Passing \c true for \a underline will underline the mnemonic character (e.g.,
+        \c formatMnemonic("&Open...", true) will return \c "<u>O</u>pen..."). Passing \c false
+        for \a underline will return the plain text form (e.g., \c formatMnemonic("&Open...", false)
+        will return \c "Open...").
+
+        \sa Label
+    */
+    function formatMnemonic(text, underline) {
+        return underline ? StyleHelpers.stylizeMnemonics(text) : StyleHelpers.removeMnemonics(text)
+    }
+
+    /*! The background frame for the menu popup.
+
+        The \l Menu will resize the frame to its contents plus the padding.
+    */
+    property Component frame: Rectangle {
+        color: styleRoot.__backgroundColor
+        border { width: 1; color: styleRoot.__borderColor }
+    }
+
+    /*! \qmlproperty Object MenuStyle::itemDelegate
+
+        The object containing the menu item subcontrol components. These subcontrols are used
+        for normal menu items only, i.e. not for separators or scroll indicators.
+
+        The subcontrols are:
+
+        \list
+        \li \b {itemDelegate.background} : Component
+
+        The menu item background component.
+
+        Its appearance generally changes with \l {styleData properties} {styleData.selected}
+        and \l {styleData properties} {styleData.enabled}.
+
+        The default implementation shows only when the item is enabled and selected. It remains
+        invisible otherwise.
+
+        \li \b {itemDelegate.label} : Component
+
+        Component for the actual text label.
+
+        The text itself is fetched from \l {styleData properties} {styleData.text}, and its appearance should depend
+        on \l {styleData properties} {styleData.enabled} and \l {styleData properties} {styleData.selected}.
+
+        If \l {styleData properties} {styleData.underlineMnemonic} is true, the label should underline its mnemonic
+        character. \l formatMnemonic provides the default formatting.
+
+        \li \b {itemDelegate.submenuIndicator} : Component
+
+        It indicates that the current menu item is a submenu.
+
+        Only used when \l {styleData properties} {styleData.type} equals \c MenuItemType.Menu.
+
+        \li \b {itemDelegate.shortcut} : Component
+
+        Displays the shortcut attached to the menu item.
+
+        Only used when \l {styleData properties} {styleData.shortcut} is not empty.
+
+        \li \b {itemDelegate.checkmarkIndicator} : Component
+
+        Will be used when \l {styleData properties} {styleData.checkable} is \c true and its appearance
+        may depend on \l {styleData properties} {styleData.exclusive}, i.e., whether it will behave like a
+        checkbox or a radio button. Use \l {styleData properties} {styleData.checked} for the checked state.
+        \endlist
+
+        \note This property cannot be overwritten although all of the subcontrol properties can.
+    */
+    property alias itemDelegate: internalMenuItem
+
+    MenuItemSubControls {
+        id: internalMenuItem
+
+        background: Rectangle {
+            visible: styleData.selected && styleData.enabled
+            gradient: Gradient {
+                id: selectedGradient
+                GradientStop { color: Qt.lighter(__selectedBackgroundColor, 1.3); position: -0.2 }
+                GradientStop { color: __selectedBackgroundColor; position: 1.4 }
+            }
+
+            border.width: 1
+            border.color: Qt.darker(__selectedBackgroundColor, 1)
+            antialiasing: true
+        }
+
+        label: Text {
+            text: formatMnemonic(styleData.text, styleData.underlineMnemonic)
+            color: __currentTextColor
+            font: styleRoot.font
+            renderType: Settings.isMobile ? Text.QtRendering : Text.NativeRendering
+        }
+
+        submenuIndicator: Text {
+            text: __mirrored ? "\u25c2" : "\u25b8" // BLACK LEFT/RIGHT-POINTING SMALL TRIANGLE
+            font: styleRoot.font
+            color: __currentTextColor
+            style: styleData.selected ? Text.Normal : Text.Raised
+            styleColor: Qt.lighter(color, 4)
+            renderType: Settings.isMobile ? Text.QtRendering : Text.NativeRendering
+        }
+
+        shortcut: Text {
+            text: styleData.shortcut
+            font {
+                bold: styleRoot.font.bold
+                capitalization: styleRoot.font.capitalization
+                family: styleRoot.font.family
+                italic: styleRoot.font.italic
+                letterSpacing: styleRoot.font.letterSpacing
+                pixelSize: styleRoot.font.pixelSize * 0.9
+                strikeout: styleRoot.font.strikeout
+                underline: styleRoot.font.underline
+                weight: styleRoot.font.weight
+                wordSpacing: styleRoot.font.wordSpacing
+            }
+            color: __currentTextColor
+            renderType: Settings.isMobile ? Text.QtRendering : Text.NativeRendering
+        }
+
+        checkmarkIndicator: Loader {
+            sourceComponent: styleData.exclusive ? exclusiveCheckMark : nonExclusiveCheckMark
+            Component {
+                id: exclusiveCheckMark
+                Rectangle {
+                    x: 1
+                    width: 10
+                    height: 10
+                    color: "white"
+                    border.color: "gray"
+                    antialiasing: true
+                    radius: height/2
+
+                    Rectangle {
+                        anchors.centerIn: parent
+                        visible: styleData.checked
+                        width: 4
+                        height: 4
+                        color: "#666"
+                        border.color: "#222"
+                        antialiasing: true
+                        radius: height/2
+                    }
+                }
+            }
+
+            Component {
+                id: nonExclusiveCheckMark
+                BorderImage {
+                    width: 12
+                    height: 12
+                    source: "images/editbox.png"
+                    border.top: 6
+                    border.bottom: 6
+                    border.left: 6
+                    border.right: 6
+
+                    Rectangle {
+                        antialiasing: true
+                        visible: styleData.checked
+                        color: "#666"
+                        radius: 1
+                        anchors.margins: 4
+                        anchors.fill: parent
+                        border.color: "#222"
+                        Rectangle {
+                            anchors.fill: parent
+                            anchors.margins: 1
+                            color: "transparent"
+                            border.color: "#33ffffff"
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    /*! Component for the separator menu item.
+
+        Will be used when \l {styleData properties} {styleData.type} equals \c MenuItemType.Separator.
+    */
+    property Component separator: Item {
+        implicitHeight: styleRoot.font.pixelSize / 2
+        Rectangle {
+            width: parent.width - 2
+            height: 1
+            x: 1
+            anchors.verticalCenter: parent.verticalCenter
+            color: "darkgray"
+        }
+    }
+
+    /*! Component for the scroll indicator menu item.
+
+        Will be used when \l {styleData properties} {styleData.type} equals \c MenuItemType.ScrollIndicator.
+        Its appearance should follow \l {styleData properties} {styleData.scrollerDirection}.
+
+        This is the item added at the top and bottom of the menu popup when its contents won't fit the screen
+        to indicate more content is available in the direction of the arrow.
+    */
+    property Component scrollIndicator: Image {
+        anchors.centerIn: parent
+        source: styleData.scrollerDirection === Qt.UpArrow ? "images/arrow-up.png" : "images/arrow-down.png"
+    }
+
+    /*!
+        \since QtQuick.Controls.Styles 1.3
+        The font of the control.
+    */
+    property font font
+
+    /*! \internal */
+    property string __menuItemType: "menuitem"
+
+    /*! \internal
+        The menu popup frame background color.
+
+        This is set to be a uniform background. If you want a gradient or a pixmap,
+        you should override \l frame.
+
+        \sa frame, borderColor
+    */
+    property color __backgroundColor: "#dcdcdc"
+
+    /*! \internal
+        The menu popup frame border color.
+
+        The border width is set to 1 pixel. Override \l frame if you want a larger border.
+
+        \sa frame, backgroundColor
+    */
+    property color __borderColor: "darkgray"
+
+    /*! \internal
+        The maximum height for a popup before it will show scrollers.
+    */
+    property int __maxPopupHeight: 600
+
+    /*! \internal
+        The menu item background color when selected.
+
+        This property is provided for convenience and only sets the color.
+        It does not change the style in any other way.
+    */
+    property color __selectedBackgroundColor: "#49d"
+
+    /*! \internal
+        The menu item label color.
+
+        When set, keyboard shorcuts get the same color as the item's text.
+
+        \sa selectedLabelColor, disabledLabelColor
+    */
+    property color __labelColor: "#444"
+
+    /*! \internal
+        The menu item label color when selected.
+
+        \sa labelColor, selectedLabelColor
+    */
+    property color __selectedLabelColor: "white"
+
+    /*! \internal
+        The menu item label color when disabled.
+
+        \sa labelColor, disabledLabelColor
+    */
+    property color __disabledLabelColor: "gray"
+
+
+    /*! \internal */
+    readonly property bool __mirrored: Qt.application.layoutDirection === Qt.RightToLeft
+
+    /*! \internal
+        The margin between the frame and the menu item label's left side.
+
+        Generally, this should be large enough to fit optional checkmarks on
+        the label's left side.
+    */
+    property int __leftLabelMargin: 18
+
+    /*! \internal
+        The margin between the menu item label's right side and the frame. */
+    property int __rightLabelMargin: 12
+
+    /*! \internal
+        The minimum spacing between the menu item label's text right side and any
+        element located on its right (submenu indicator or shortcut).
+    */
+    property int __minRightLabelSpacing: 28
+
+    /*! \internal */
+    property Component __scrollerStyle: null
+
+    /*! \internal
+        The menu item contents itself.
+
+        The default implementation uses \l MenuItemStyle.
+    */
+    property Component menuItemPanel: Item {
+        id: panel
+
+        property QtObject __styleData: styleData
+        /*! \internal
+            The current color of the text label.
+
+            Use this if you're overriding e.g. \l shortcutIndicator to keep the color matched
+            with \l label, or to derive new colors from it.
+        */
+        property color currentTextColor: !styleData.enabled ? __disabledLabelColor :
+                                         styleData.selected ? __selectedLabelColor : __labelColor
+
+        implicitWidth: Math.max((parent ? parent.width : 0),
+                                Math.round(__leftLabelMargin + labelLoader.width + __rightLabelMargin +
+                                           (rightIndicatorLoader.active ? __minRightLabelSpacing + rightIndicatorLoader.width : 0)))
+        implicitHeight: Math.round(styleData.type === MenuItemType.Separator ? separatorLoader.implicitHeight :
+                                   !!styleData.scrollerDirection ? styleRoot.font.pixelSize * 0.75 : labelLoader.height + 4)
+
+        Loader {
+            property alias styleData: panel.__styleData
+            property alias __currentTextColor: panel.currentTextColor
+            anchors.fill: parent
+            sourceComponent: itemDelegate.background
+        }
+
+        Loader {
+            id: separatorLoader
+            property alias styleData: panel.__styleData
+            property alias __currentTextColor: panel.currentTextColor
+            anchors.fill: parent
+            sourceComponent: separator
+            active: styleData.type === MenuItemType.Separator
+        }
+
+        Loader {
+            property alias styleData: panel.__styleData
+            property alias __currentTextColor: panel.currentTextColor
+            x: __mirrored ? parent.width - width - 4 : 4
+            anchors.verticalCenterOffset: -1
+            anchors.verticalCenter: parent.verticalCenter
+            active: __menuItemType === "menuitem" && styleData.checkable
+            sourceComponent: itemDelegate.checkmarkIndicator
+        }
+
+        Loader {
+            id: labelLoader
+            readonly property real offset: __menuItemType === "menuitem" ? __leftLabelMargin : 6
+            property alias styleData: panel.__styleData
+            property alias __currentTextColor: panel.currentTextColor
+            x: __mirrored ? parent.width - width - offset : offset
+            y: 1
+            active: styleData.type !== MenuItemType.Separator
+            sourceComponent: itemDelegate.label
+            baselineOffset: item ? item.baselineOffset : 0.0
+        }
+
+        Loader {
+            id: rightIndicatorLoader
+            property alias styleData: panel.__styleData
+            property alias __currentTextColor: panel.currentTextColor
+            active: styleData.type === MenuItemType.Menu || styleData.shortcut !== ""
+            sourceComponent: styleData.type === MenuItemType.Menu ? itemDelegate.submenuIndicator : itemDelegate.shortcut
+            LayoutMirroring.enabled: __mirrored
+            baselineOffset: item ? item.baselineOffset : 0.0
+            anchors {
+                right: parent.right
+                rightMargin: 6
+                baseline: !styleData.isSubmenu ? labelLoader.baseline : undefined
+            }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/MenuStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Base/MenuStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..b06fba7a19104f58c7ce740036b7a453e762218c
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/MenuStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/PieMenuStyle.qml b/deployment_test/QtQuick/Controls/Styles/Base/PieMenuStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..ddeb4eddeed265248ba532761f801a53b0173680
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Base/PieMenuStyle.qml
@@ -0,0 +1,404 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Extras module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtGraphicalEffects 1.0
+import QtQuick.Controls 1.4
+import QtQuick.Controls.Styles 1.4
+import QtQuick.Controls.Private 1.0
+import QtQuick.Extras 1.4
+import QtQuick.Extras.Private 1.0
+import QtQuick.Extras.Private.CppUtils 1.0
+
+/*!
+    \qmltype PieMenuStyle
+    \inqmlmodule QtQuick.Controls.Styles
+    \since 5.5
+    \ingroup controlsstyling
+    \brief Provides custom styling for PieMenu.
+
+    PieMenuStyle is a style for PieMenu that draws each section of the menu as a
+    filled "slice".
+
+    You can create a custom pie menu by replacing the following delegates:
+    \list
+        \li \l background
+        \li \l cancel
+        \li \l menuItem
+        \li \l title
+    \endlist
+
+    To customize the appearance of each menuItem without having to define your
+    own, you can use the \l backgroundColor and \l selectionColor properties.
+    To customize the drop shadow, use the \l shadowColor, \l shadowRadius and
+    \l shadowSpread properties.
+
+    Icons that are too large for the section that they are in will be scaled
+    down appropriately.
+
+    To style individual sections of the menu, use the menuItem component:
+    \code
+    PieMenuStyle {
+        shadowRadius: 0
+
+        menuItem: Item {
+            id: item
+            rotation: -90 + sectionCenterAngle(styleData.index)
+
+            Rectangle {
+                width: parent.height * 0.2
+                height: width
+                color: "darkorange"
+                radius: width / 2
+                anchors.right: parent.right
+                anchors.verticalCenter: parent.verticalCenter
+
+                Text {
+                    id: textItem
+                    text: control.menuItems[styleData.index].text
+                    anchors.centerIn: parent
+                    color: control.currentIndex === styleData.index ? "red" : "white"
+                    rotation: -item.rotation
+                }
+            }
+        }
+    }
+    \endcode
+
+    \image piemenu-menuitem-example.png A custom PieMenu
+*/
+
+Style {
+    id: pieMenuStyle
+
+    /*!
+        The \l PieMenu that this style is attached to.
+    */
+    readonly property PieMenu control: __control
+
+    /*! The background color. */
+    property color backgroundColor: Qt.rgba(0.6, 0.6, 0.6, 0.66)
+
+    /*! The selection color. */
+    property color selectionColor: "#eee"
+
+    /*!
+        The shadow color.
+
+        \sa DropShadow
+    */
+    property color shadowColor: Qt.rgba(0, 0, 0, 0.26)
+
+    /*!
+        The shadow radius.
+
+        \sa DropShadow
+    */
+    property real shadowRadius: 10
+
+    /*!
+        The shadow spread.
+
+        \sa DropShadow
+    */
+    property real shadowSpread: 0.3
+
+    /*!
+        The distance from the center of the menu to the outer edge of the menu.
+
+        \sa cancelRadius
+    */
+    readonly property real radius: Math.min(control.width, control.height) * 0.5
+
+    /*!
+        The radius of the area that is used to cancel the menu.
+
+        \sa radius
+    */
+    property real cancelRadius: radius * 0.4
+
+    /*!
+        The angle (in degrees) at which the first menu item will be drawn.
+
+        The absolute range formed by \a startAngle and \l endAngle must be
+        less than or equal to \c 360 degrees.
+
+        Menu items are displayed clockwise when \a startAngle is less than
+        \l endAngle, otherwise they are displayed anti-clockwise.
+
+        \sa endAngle
+    */
+    property real startAngle: -90
+
+    /*!
+        The angle (in degrees) at which the last menu item will be drawn.
+
+        The absolute range formed by \l startAngle and \a endAngle must be
+        less than or equal to \c 360 degrees.
+
+        Menu items are displayed clockwise when \l startAngle is less than
+        \a endAngle, otherwise they are displayed anti-clockwise.
+
+        \sa startAngle
+    */
+    property real endAngle: 90
+
+    /*!
+        \qmlmethod real PieMenuStyle::sectionStartAngle(int itemIndex)
+        Returns the start of the section at \a itemIndex as an angle in degrees.
+    */
+    function sectionStartAngle(itemIndex) {
+        return MathUtils.radToDegOffset(control.__protectedScope.sectionStartAngle(itemIndex));
+    }
+
+    /*!
+        \qmlmethod real PieMenuStyle::sectionCenterAngle(int itemIndex)
+        Returns the center of the section at \a itemIndex as an angle in
+        degrees.
+    */
+    function sectionCenterAngle(itemIndex) {
+        return MathUtils.radToDegOffset(control.__protectedScope.sectionCenterAngle(itemIndex));
+    }
+
+    /*!
+        \qmlmethod real PieMenuStyle::sectionEndAngle(int itemIndex)
+        Returns the end of the section at \a itemIndex as an angle in degrees.
+    */
+    function sectionEndAngle(itemIndex) {
+        return MathUtils.radToDegOffset(control.__protectedScope.sectionEndAngle(itemIndex));
+    }
+
+    /*!
+        \internal
+
+        The distance in pixels from the center of each menu item's icon to the
+        center of the menu. A higher value means that the icons will be further
+        from the center of the menu.
+    */
+    readonly property real __iconOffset: cancelRadius + ((radius - cancelRadius) / 2)
+
+    /*! \internal */
+    readonly property real __selectableRadius: radius - cancelRadius
+
+    /*! \internal */
+    property int __implicitWidth: Math.round(TextSingleton.implicitHeight * 12.5)
+
+    /*! \internal */
+    property int __implicitHeight: __implicitWidth
+
+    /*!
+        The background of the menu.
+
+        By default, there is no background defined.
+    */
+    property Component background
+
+    /*!
+        The cancel component of the menu.
+
+        This is an area in the center of the menu that closes the menu when
+        clicked.
+
+        By default, it is not visible.
+    */
+    property Component cancel: null
+
+    /*!
+        The component that displays the text of the currently selected menu
+        item, or the title if there is no current item.
+
+        The current item's text is available via the \c styleData.text
+        property.
+    */
+    property Component title: Text {
+        font.pointSize: 20
+        text: styleData.text
+        horizontalAlignment: Text.AlignHCenter
+        verticalAlignment: Text.AlignVCenter
+        color: "#ccc"
+        antialiasing: true
+    }
+
+    /*!
+        This component defines each section of the pie menu.
+
+        This component covers the width and height of the control.
+
+        No mouse events are propagated to this component, which means that
+        controls like Button will not function when used within it. You can
+        check if the mouse is over this section by comparing
+        \c control.currentIndex to \c styleData.index.
+
+        Each instance of this component has access to the following properties:
+
+        \table
+            \row \li \c {readonly property int} \b styleData.index
+                \li The index of this menu item.
+            \row \li \c {readonly property bool} \b styleData.hovered
+                \li \c true if this menu item is under the mouse.
+            \row \li \c {readonly property bool} \b styleData.pressed
+                \li \c true if the mouse is pressed down on this menu item.
+        \endtable
+    */
+    property Component menuItem: Item {
+        id: actionRootDelegateItem
+
+        function drawRingSection(ctx, x, y, section, r, ringWidth, ringColor) {
+            ctx.fillStyle = ringColor;
+
+            // Draw one section.
+            ctx.beginPath();
+            ctx.moveTo(x,y);
+
+            // Canvas draws 0 degrees at 3 o'clock, whereas we want it to draw it at 12.
+            var start = control.__protectedScope.sectionStartAngle(section);
+            var end = control.__protectedScope.sectionEndAngle(section);
+            ctx.arc(x, y, r, start, end, start > end);
+            ctx.fill();
+
+            // Either change this to the background color, or use the global composition.
+            ctx.fillStyle = "black";
+            ctx.globalCompositeOperation = "destination-out";
+            ctx.beginPath();
+            ctx.moveTo(x, y);
+            ctx.arc(x, y, ringWidth, 0, Math.PI * 2);
+            ctx.closePath();
+            ctx.fill();
+
+            // If using the global composition method, make sure to change it back to default.
+            ctx.globalCompositeOperation = "source-over";
+        }
+
+        Canvas {
+            id: actionCanvas
+            anchors.fill: parent
+            property color currentColor: control.currentIndex === styleData.index ? selectionColor : backgroundColor
+
+            Connections {
+                target: pieMenuStyle
+                function onStartAngleChanged() { actionCanvas.requestPaint() }
+                function onEndAngleChanged() { actionCanvas.requestPaint() }
+            }
+
+            Connections {
+                target: control
+                function onCurrentIndexChanged() { actionCanvas.requestPaint() }
+            }
+
+            onPaint: {
+                var ctx = getContext("2d");
+                ctx.reset();
+                drawRingSection(ctx, width / 2, height / 2, styleData.index, radius, cancelRadius, currentColor);
+            }
+        }
+
+        readonly property var __styleData: styleData
+
+        PieMenuIcon {
+            control: pieMenuStyle.control
+            styleData: __styleData
+        }
+    }
+
+    /*! \internal */
+    property Component panel: Item {
+        implicitWidth: __implicitWidth
+        implicitHeight: __implicitHeight
+
+        property alias titleItem: titleLoader.item
+
+        Item {
+            id: itemgroup
+            anchors.fill: parent
+            visible: false
+
+            Loader {
+                id: backgroundLoader
+                sourceComponent: background
+                anchors.fill: parent
+            }
+
+            Loader {
+                id: cancelLoader
+                sourceComponent: cancel
+                anchors.centerIn: parent
+            }
+
+            Repeater {
+                id: menuItemRepeater
+                model: control.__protectedScope.visibleItems
+
+                delegate: Loader {
+                    id: menuItemLoader
+                    anchors.fill: parent
+                    sourceComponent: menuItem
+
+                    readonly property int __index: index
+                    property QtObject styleData: QtObject {
+                        readonly property alias index: menuItemLoader.__index
+                        readonly property bool hovered: control.currentIndex === index
+                        readonly property bool pressed: control.__protectedScope.pressedIndex === index
+                    }
+                }
+            }
+        }
+        DropShadow {
+            id: dropShadow
+            anchors.fill: itemgroup
+            spread: shadowSpread
+            samples: shadowRadius * 2 + 1
+            transparentBorder: true
+            color: shadowColor
+            source: itemgroup
+        }
+
+        Loader {
+            id: titleLoader
+            sourceComponent: title
+            x: parent.x + parent.width / 2 - width / 2
+            y: -height - 10
+
+            property QtObject styleData: QtObject {
+                property string text: control.currentIndex !== -1
+                    ? control.__protectedScope.visibleItems[control.currentIndex].text
+                    : control.title
+            }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/PieMenuStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Base/PieMenuStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..6e1036dc890b0ff5e34bf02b33b53309818c1e44
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/PieMenuStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/ProgressBarStyle.qml b/deployment_test/QtQuick/Controls/Styles/Base/ProgressBarStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..d51e056dc669e80ecb71d233d081b856f10d6f79
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Base/ProgressBarStyle.qml
@@ -0,0 +1,261 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype ProgressBarStyle
+
+    \inqmlmodule QtQuick.Controls.Styles
+    \since 5.1
+    \ingroup controlsstyling
+    \brief Provides custom styling for ProgressBar.
+
+    Example:
+    \qml
+    ProgressBar {
+        value: slider.value
+        style: ProgressBarStyle {
+            background: Rectangle {
+                radius: 2
+                color: "lightgray"
+                border.color: "gray"
+                border.width: 1
+                implicitWidth: 200
+                implicitHeight: 24
+            }
+            progress: Rectangle {
+                color: "lightsteelblue"
+                border.color: "steelblue"
+            }
+        }
+    }
+    \endqml
+
+    Note that the example above is somewhat simplified and will not animate
+    an indeterminate progress bar. The following snippet demonstrates
+    how you can incorporate a custom animation for the indeterminate
+    state as well.
+
+    \code
+    progress: Rectangle {
+        border.color: "steelblue"
+        color: "lightsteelblue"
+
+        // Indeterminate animation by animating alternating stripes:
+        Item {
+            anchors.fill: parent
+            anchors.margins: 1
+            visible: control.indeterminate
+            clip: true
+            Row {
+                Repeater {
+                    Rectangle {
+                        color: index % 2 ? "steelblue" : "lightsteelblue"
+                        width: 20 ; height: control.height
+                    }
+                    model: control.width / 20 + 2
+                }
+                XAnimator on x {
+                    from: 0 ; to: -40
+                    loops: Animation.Infinite
+                    running: control.indeterminate
+                }
+            }
+        }
+    }
+    \endcode
+
+
+*/
+
+Style {
+    id: progressBarStyle
+
+    /*! The \l ProgressBar this style is attached to. */
+    readonly property ProgressBar control: __control
+
+    /*! A value in the range [0-1] indicating the current progress. */
+    readonly property real currentProgress: control.indeterminate ? 1.0 :
+                                                                    control.value / control.maximumValue
+
+    /*! This property holds the visible contents of the progress bar
+        You can access the Slider through the \c control property.
+
+        For convenience, you can also access the readonly property \c styleData.progress
+        which provides the current progress as a \c real in the range [0-1]
+    */
+    padding { top: 0 ; left: 0 ; right: 0 ; bottom: 0 }
+
+    /*! \qmlproperty Component ProgressBarStyle::progress
+        The progress component for this style.
+    */
+    property Component progress: Item {
+        property color progressColor: "#49d"
+        anchors.fill: parent
+        clip: true
+        Rectangle {
+            id: base
+            anchors.fill: parent
+            radius: TextSingleton.implicitHeight * 0.16
+            antialiasing: true
+            gradient: Gradient {
+                GradientStop {color: Qt.lighter(progressColor, 1.3)  ; position: 0}
+                GradientStop {color: progressColor ; position: 1.4}
+            }
+            border.width: 1
+            border.color: Qt.darker(progressColor, 1.2)
+            Rectangle {
+                color: "transparent"
+                radius: 1.5
+                clip: true
+                antialiasing: true
+                anchors.fill: parent
+                anchors.margins: 1
+                border.color: Qt.rgba(1,1,1,0.1)
+                Image {
+                    visible: control.indeterminate
+                    height: parent.height
+                    NumberAnimation on x {
+                        from: -39
+                        to: 0
+                        running: control.indeterminate
+                        duration: 800
+                        loops: Animation.Infinite
+                    }
+                    fillMode: Image.Tile
+                    width: parent.width + 25
+                    source: "images/progress-indeterminate.png"
+                }
+            }
+        }
+        Rectangle {
+            height: parent.height - 2
+            width: 1
+            y: 1
+            anchors.right: parent.right
+            anchors.rightMargin: 1
+            color:  Qt.rgba(1,1,1,0.1)
+            visible: splitter.visible
+        }
+        Rectangle {
+            id: splitter
+            height: parent.height - 2
+            width: 1
+            y: 1
+            anchors.right: parent.right
+            color: Qt.darker(progressColor, 1.2)
+            property int offset: currentProgress * control.width
+            visible: offset > base.radius && offset < control.width - base.radius + 1
+        }
+    }
+
+    /*! \qmlproperty Component ProgressBarStyle::background
+        The background component for this style.
+
+        \note The implicitWidth and implicitHeight of the background component
+        must be set.
+    */
+    property Component background: Item {
+        implicitWidth: 200
+        implicitHeight: Math.max(17, Math.round(TextSingleton.implicitHeight * 0.7))
+        Rectangle {
+            anchors.fill: parent
+            anchors.bottomMargin: control.pressed ? 0 : -1
+            color: "#44ffffff"
+            radius: baserect.radius
+        }
+        Rectangle {
+            id: baserect
+            gradient: Gradient {
+                GradientStop {color: "#eee" ; position: 0}
+                GradientStop {color: "#fff" ; position: 0.1}
+                GradientStop {color: "#fff" ; position: 1}
+            }
+            radius: TextSingleton.implicitHeight * 0.16
+            anchors.fill: parent
+            border.color: control.activeFocus ? "#47b" : "#999"
+            Rectangle {
+                anchors.fill: parent
+                radius: parent.radius
+                color: control.activeFocus ? "#47b" : "white"
+                opacity: control.hovered || control.activeFocus ? 0.1 : 0
+                Behavior on opacity {NumberAnimation{ duration: 100 }}
+            }
+        }
+    }
+
+    /*! \qmlproperty Component ProgressBarStyle::panel
+        The panel component for this style.
+    */
+    property Component panel: Item{
+        property bool horizontal: control.orientation == Qt.Horizontal
+        implicitWidth: horizontal ? backgroundLoader.implicitWidth : backgroundLoader.implicitHeight
+        implicitHeight: horizontal ? backgroundLoader.implicitHeight : backgroundLoader.implicitWidth
+
+        Item {
+            width: horizontal ? parent.width : parent.height
+            height: !horizontal ? parent.width : parent.height
+            y: horizontal ? 0 : width
+            rotation: horizontal ? 0 : -90
+            transformOrigin: Item.TopLeft
+
+            Loader {
+                id: backgroundLoader
+                anchors.fill: parent
+                sourceComponent: background
+            }
+
+            Loader {
+                sourceComponent: progressBarStyle.progress
+                anchors.topMargin: padding.top
+                anchors.leftMargin: padding.left
+                anchors.rightMargin: padding.right
+                anchors.bottomMargin: padding.bottom
+
+                anchors.top: parent.top
+                anchors.left: parent.left
+                anchors.bottom: parent.bottom
+                width: currentProgress * (parent.width - padding.left - padding.right)
+            }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/ProgressBarStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Base/ProgressBarStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..cff41523e1ff6a4d9865e760903d3d21ace43e62
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/ProgressBarStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/RadioButtonStyle.qml b/deployment_test/QtQuick/Controls/Styles/Base/RadioButtonStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..6e3a2dc47f8a37b2d47029371dddfca7f36393b3
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Base/RadioButtonStyle.qml
@@ -0,0 +1,172 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype RadioButtonStyle
+    \inqmlmodule QtQuick.Controls.Styles
+    \since 5.1
+    \ingroup controlsstyling
+    \brief Provides custom styling for RadioButton.
+
+    Example:
+    \qml
+    RadioButton {
+        text: "Radio Button"
+        style: RadioButtonStyle {
+            indicator: Rectangle {
+                    implicitWidth: 16
+                    implicitHeight: 16
+                    radius: 9
+                    border.color: control.activeFocus ? "darkblue" : "gray"
+                    border.width: 1
+                    Rectangle {
+                        anchors.fill: parent
+                        visible: control.checked
+                        color: "#555"
+                        radius: 9
+                        anchors.margins: 4
+                    }
+            }
+        }
+     }
+    \endqml
+*/
+
+Style {
+    id: radiobuttonStyle
+
+    /*! The \l RadioButton this style is attached to. */
+    readonly property RadioButton control: __control
+
+    /*! This defines the text label. */
+    property Component label: Item {
+        implicitWidth: text.implicitWidth + 2
+        implicitHeight: text.implicitHeight
+        baselineOffset: text.y + text.baselineOffset
+        Rectangle {
+            anchors.fill: text
+            anchors.margins: -1
+            anchors.leftMargin: -3
+            anchors.rightMargin: -3
+            visible: control.activeFocus
+            height: 6
+            radius: 3
+            color: "#224f9fef"
+            border.color: "#47b"
+            opacity: 0.6
+        }
+        Text {
+            id: text
+            text: StyleHelpers.stylizeMnemonics(control.text)
+            anchors.centerIn: parent
+            color: SystemPaletteSingleton.text(control.enabled)
+            renderType: Settings.isMobile ? Text.QtRendering : Text.NativeRendering
+        }
+    }
+
+    /*! The background under indicator and label. */
+    property Component background
+
+    /*! The spacing between indicator and label. */
+    property int spacing: Math.round(TextSingleton.implicitHeight/4)
+
+    /*! This defines the indicator button.  */
+    property Component indicator: Rectangle {
+        width:  Math.round(TextSingleton.implicitHeight)
+        height: width
+        gradient: Gradient {
+            GradientStop {color: "#eee" ; position: 0}
+            GradientStop {color: control.pressed ? "#eee" : "#fff" ; position: 0.4}
+            GradientStop {color: "#fff" ; position: 1}
+        }
+        border.color: control.activeFocus ? "#16c" : "gray"
+        antialiasing: true
+        radius: height/2
+        Rectangle {
+            anchors.centerIn: parent
+            width: Math.round(parent.width * 0.5)
+            height: width
+            gradient: Gradient {
+                GradientStop {color: "#999" ; position: 0}
+                GradientStop {color: "#555" ; position: 1}
+            }
+            border.color: "#222"
+            antialiasing: true
+            radius: height/2
+            Behavior on opacity {NumberAnimation {duration: 80}}
+            opacity: control.checked ? control.enabled ? 1 : 0.5 : 0
+        }
+    }
+
+    /*! \internal */
+    property Component panel: Item {
+        implicitWidth: Math.max(backgroundLoader.implicitWidth, row.implicitWidth + padding.left + padding.right)
+        implicitHeight: Math.max(backgroundLoader.implicitHeight, labelLoader.implicitHeight + padding.top + padding.bottom,indicatorLoader.implicitHeight + padding.top + padding.bottom)
+        baselineOffset: labelLoader.item ? padding.top + labelLoader.item.baselineOffset : 0
+
+        Loader {
+            id:backgroundLoader
+            sourceComponent: background
+            anchors.fill: parent
+        }
+        Row {
+            id: row
+            anchors.fill: parent
+
+            anchors.leftMargin: padding.left
+            anchors.rightMargin: padding.right
+            anchors.topMargin: padding.top
+            anchors.bottomMargin: padding.bottom
+
+            spacing: radiobuttonStyle.spacing
+            Loader {
+                id: indicatorLoader
+                sourceComponent: indicator
+            }
+            Loader {
+                id: labelLoader
+                sourceComponent: label
+            }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/RadioButtonStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Base/RadioButtonStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..9d8c6f9ab823769d81e7c98724b29356c6741303
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/RadioButtonStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/ScrollViewStyle.qml b/deployment_test/QtQuick/Controls/Styles/Base/ScrollViewStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..36b518d39332fca2a88a913124558d38dcd48ef7
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Base/ScrollViewStyle.qml
@@ -0,0 +1,406 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype ScrollViewStyle
+    \inqmlmodule QtQuick.Controls.Styles
+    \since 5.1
+    \ingroup viewsstyling
+    \ingroup controlsstyling
+    \brief Provides custom styling for ScrollView.
+*/
+Style {
+    id: root
+
+    /*! The \l ScrollView this style is attached to. */
+    readonly property ScrollView control: __control
+
+    /*! This property controls the frame border padding of the scrollView. */
+    padding {left: 1; top: 1; right: 1; bottom: 1}
+
+    /*! This Component paints the corner area between scroll bars */
+    property Component corner: Rectangle { color: "#ccc" }
+
+    /*! This component determines if the flickable should reposition itself at the
+    mouse location when clicked. */
+    property bool scrollToClickedPosition: true
+
+    /*! This property holds whether the scroll bars are transient. Transient scroll bars
+        appear when the content is scrolled and disappear when they are no longer needed.
+
+        The default value is platform dependent. */
+    property bool transientScrollBars: Settings.isMobile && Settings.hasTouchScreen
+
+    /*! This Component paints the frame around scroll bars. */
+    property Component frame: Rectangle {
+        color: control["backgroundVisible"] ? "white": "transparent"
+        border.color: "#999"
+        border.width: 1
+        radius: 1
+        visible: control.frameVisible
+    }
+
+    /*! This is the minimum extent of the scroll bar handle.
+
+        The default value is \c 30.
+    */
+
+    property int minimumHandleLength: 30
+
+    /*! This property controls the edge overlap
+        between the handle and the increment/decrement buttons.
+
+        The default value is \c 30.
+    */
+
+    property int handleOverlap: 1
+
+    /*! This component controls the appearance of the
+        scroll bar background.
+
+        You can access the following state properties:
+
+        \table
+            \row \li property bool \b styleData.hovered
+            \row \li property bool \b styleData.horizontal
+        \endtable
+    */
+
+    property Component scrollBarBackground: Item {
+        property bool sticky: false
+        property bool hovered: styleData.hovered
+        implicitWidth: Math.round(TextSingleton.implicitHeight)
+        implicitHeight: Math.round(TextSingleton.implicitHeight)
+        clip: true
+        opacity: transientScrollBars ? 0.5 : 1.0
+        visible: !Settings.hasTouchScreen && (!transientScrollBars || sticky)
+        Rectangle {
+            anchors.fill: parent
+            color: "#ddd"
+            border.color: "#aaa"
+            anchors.rightMargin: styleData.horizontal ? -2 : -1
+            anchors.leftMargin: styleData.horizontal ? -2 : 0
+            anchors.topMargin: styleData.horizontal ? 0 : -2
+            anchors.bottomMargin: styleData.horizontal ? -1 : -2
+        }
+        onHoveredChanged: if (hovered) sticky = true
+        onVisibleChanged: if (!visible) sticky = false
+    }
+
+    /*! This component controls the appearance of the
+        scroll bar handle.
+
+        You can access the following state properties:
+
+        \table
+            \row \li property bool \b styleData.hovered
+            \row \li property bool \b styleData.pressed
+            \row \li property bool \b styleData.horizontal
+        \endtable
+    */
+
+    property Component handle: Item {
+        property bool sticky: false
+        property bool hovered: __activeControl !== "none"
+        implicitWidth: Math.round(TextSingleton.implicitHeight) + 1
+        implicitHeight: Math.round(TextSingleton.implicitHeight) + 1
+        BorderImage {
+            id: img
+            opacity: styleData.pressed && !transientScrollBars ? 0.5 : styleData.hovered ? 1 : 0.8
+            source: "images/scrollbar-handle-" + (transientScrollBars ? "transient" : styleData.horizontal ? "horizontal" : "vertical") + ".png"
+            border.left: transientScrollBars ? 5 : 2
+            border.top: transientScrollBars ? 5 : 2
+            border.right: transientScrollBars ? 5 : 2
+            border.bottom: transientScrollBars ? 5 : 2
+            anchors.top: !styleData.horizontal ? parent.top : undefined
+            anchors.margins: transientScrollBars ? 2 : 0
+            anchors.bottom: parent.bottom
+            anchors.right: parent.right
+            anchors.left: styleData.horizontal ? parent.left : undefined
+            width: !styleData.horizontal && transientScrollBars ? sticky ? 13 : 10 : parent.width
+            height: styleData.horizontal && transientScrollBars ? sticky ? 13 : 10 : parent.height
+            Behavior on width { enabled: !styleData.horizontal && transientScrollBars; NumberAnimation { duration: 100 } }
+            Behavior on height { enabled: styleData.horizontal && transientScrollBars; NumberAnimation { duration: 100 } }
+        }
+        onHoveredChanged: if (hovered) sticky = true
+        onVisibleChanged: if (!visible) sticky = false
+    }
+
+    /*! This component controls the appearance of the
+        scroll bar increment button.
+
+        You can access the following state properties:
+
+        \table
+            \row \li property bool \b styleData.hovered
+            \row \li property bool \b styleData.pressed
+            \row \li property bool \b styleData.horizontal
+        \endtable
+    */
+    property Component incrementControl: Rectangle {
+        visible: !transientScrollBars
+        implicitWidth: transientScrollBars ? 0 : Math.round(TextSingleton.implicitHeight)
+        implicitHeight: transientScrollBars ? 0 : Math.round(TextSingleton.implicitHeight)
+        Rectangle {
+            anchors.fill: parent
+            anchors.bottomMargin: -1
+            anchors.rightMargin: -1
+            border.color: "#aaa"
+            Rectangle {
+                anchors.fill: parent
+                anchors.margins: 1
+                color: "transparent"
+                border.color: "#44ffffff"
+            }
+            Image {
+                source: styleData.horizontal ? "images/arrow-right.png" : "images/arrow-down.png"
+                anchors.centerIn: parent
+                opacity: control.enabled ? 0.6 : 0.5
+            }
+            gradient: Gradient {
+                GradientStop {color: styleData.pressed ? "lightgray" : "white" ; position: 0}
+                GradientStop {color: styleData.pressed ? "lightgray" : "lightgray" ; position: 1}
+            }
+        }
+    }
+
+    /*! This component controls the appearance of the
+        scroll bar decrement button.
+
+        You can access the following state properties:
+
+        \table
+            \row \li property bool \b styleData.hovered
+            \row \li property bool \b styleData.pressed
+            \row \li property bool \b styleData.horizontal
+        \endtable
+    */
+    property Component decrementControl: Rectangle {
+        visible: !transientScrollBars
+        implicitWidth: transientScrollBars ? 0 : Math.round(TextSingleton.implicitHeight)
+        implicitHeight: transientScrollBars ? 0 : Math.round(TextSingleton.implicitHeight)
+        Rectangle {
+            anchors.fill: parent
+            anchors.topMargin: styleData.horizontal ? 0 : -1
+            anchors.leftMargin:  styleData.horizontal ? -1 : 0
+            anchors.bottomMargin: styleData.horizontal ? -1 : 0
+            anchors.rightMargin: styleData.horizontal ? 0 : -1
+            color: "lightgray"
+            Rectangle {
+                anchors.fill: parent
+                anchors.margins: 1
+                color: "transparent"
+                border.color: "#44ffffff"
+            }
+            Image {
+                source: styleData.horizontal ? "images/arrow-left.png" : "images/arrow-up.png"
+                anchors.centerIn: parent
+                anchors.verticalCenterOffset: styleData.horizontal ? 0 : -1
+                anchors.horizontalCenterOffset: styleData.horizontal ? -1 : 0
+                opacity: control.enabled ? 0.6 : 0.5
+            }
+            gradient: Gradient {
+                GradientStop {color: styleData.pressed ? "lightgray" : "white" ; position: 0}
+                GradientStop {color: styleData.pressed ? "lightgray" : "lightgray" ; position: 1}
+            }
+            border.color: "#aaa"
+        }
+    }
+
+    /*! \internal */
+    property Component __scrollbar: Item {
+        id: panel
+        property string activeControl: "none"
+        property bool scrollToClickPosition: true
+        property bool isTransient: transientScrollBars
+
+        property bool on: false
+        property bool raised: false
+        property bool sunken: __styleData.upPressed | __styleData.downPressed | __styleData.handlePressed
+
+        states: State {
+            name: "out"
+            when: isTransient
+                  && (!__stickyScrollbars || !flickableItem.moving)
+                  && panel.activeControl === "none"
+                  && !panel.on
+                  && !panel.raised
+            PropertyChanges { target: panel; opacity: 0 }
+        }
+
+        transitions: Transition {
+            to: "out"
+            SequentialAnimation {
+                PauseAnimation { duration: root.__scrollBarFadeDelay }
+                NumberAnimation { properties: "opacity"; duration: root.__scrollBarFadeDuration }
+                PropertyAction { target: panel; property: "visible"; value: false }
+            }
+        }
+
+        implicitWidth: __styleData.horizontal ? 200 : bg.implicitWidth
+        implicitHeight: __styleData.horizontal ? bg.implicitHeight : 200
+
+        function pixelMetric(arg) {
+            if (arg === "scrollbarExtent")
+                return (__styleData.horizontal ? bg.height : bg.width);
+            return 0;
+        }
+
+        function styleHint(arg) {
+            return false;
+        }
+
+        function hitTest(argX, argY) {
+            if (itemIsHit(handleControl, argX, argY))
+                return "handle"
+            else if (itemIsHit(incrementLoader, argX, argY))
+                return "up";
+            else if (itemIsHit(decrementLoader, argX, argY))
+                return "down";
+            else if (itemIsHit(bg, argX, argY)) {
+                if (__styleData.horizontal && argX < handleControl.x || !__styleData.horizontal && argY < handleControl.y)
+                    return "upPage"
+                else
+                    return "downPage"
+            }
+
+            return "none";
+        }
+
+        function subControlRect(arg) {
+            if (arg === "handle") {
+                return Qt.rect(handleControl.x, handleControl.y, handleControl.width, handleControl.height);
+            } else if (arg === "groove") {
+                if (__styleData.horizontal) {
+                    return Qt.rect(incrementLoader.width - handleOverlap,
+                                   0,
+                                   __control.width - (incrementLoader.width + decrementLoader.width - handleOverlap * 2),
+                                   __control.height);
+                } else {
+                    return Qt.rect(0,
+                                   incrementLoader.height - handleOverlap,
+                                   __control.width,
+                                   __control.height - (incrementLoader.height + decrementLoader.height - handleOverlap * 2));
+                }
+            }
+            return Qt.rect(0,0,0,0);
+        }
+
+        function itemIsHit(argItem, argX, argY) {
+            var pos = argItem.mapFromItem(__control, argX, argY);
+            return (pos.x >= 0 && pos.x <= argItem.width && pos.y >= 0 && pos.y <= argItem.height);
+        }
+
+        Loader {
+            id: incrementLoader
+            anchors.top: parent.top
+            anchors.left: parent.left
+            sourceComponent: decrementControl
+            property QtObject styleData: QtObject {
+                readonly property bool hovered: activeControl === "up"
+                readonly property bool pressed: __styleData.upPressed
+                readonly property bool horizontal: __styleData.horizontal
+            }
+        }
+
+        Loader {
+            id: bg
+            anchors.top: __styleData.horizontal ? undefined : incrementLoader.bottom
+            anchors.bottom: __styleData.horizontal ? undefined : decrementLoader.top
+            anchors.left:  __styleData.horizontal ? incrementLoader.right : undefined
+            anchors.right: __styleData.horizontal ? decrementLoader.left : undefined
+            sourceComponent: scrollBarBackground
+            property QtObject styleData: QtObject {
+                readonly property bool horizontal: __styleData.horizontal
+                readonly property bool hovered: activeControl !== "none"
+            }
+        }
+
+        Loader {
+            id: decrementLoader
+            anchors.bottom: __styleData.horizontal ? undefined : parent.bottom
+            anchors.right: __styleData.horizontal ? parent.right : undefined
+            sourceComponent: incrementControl
+            property QtObject styleData: QtObject {
+                readonly property bool hovered: activeControl === "down"
+                readonly property bool pressed: __styleData.downPressed
+                readonly property bool horizontal: __styleData.horizontal
+            }
+        }
+
+        property var flickableItem: control.flickableItem
+        property int extent: Math.max(minimumHandleLength, __styleData.horizontal ?
+                                          Math.min(1, ((flickableItem && flickableItem.contentWidth > 0.0) ? flickableItem.width/flickableItem.contentWidth : 1)) * bg.width :
+                                          Math.min(1, ((flickableItem && flickableItem.contentHeight > 0.0) ? flickableItem.height/flickableItem.contentHeight : 1)) * bg.height)
+        readonly property real range: __control.maximumValue - __control.minimumValue
+        readonly property real begin: __control.value - __control.minimumValue
+
+        Loader {
+            id: handleControl
+            height: __styleData.horizontal ? implicitHeight : extent
+            width: __styleData.horizontal ? extent : implicitWidth
+            anchors.top: bg.top
+            anchors.left: bg.left
+            anchors.topMargin: __styleData.horizontal || range === 0 ? 0 : -handleOverlap + (2 * begin * (bg.height + (2 * handleOverlap) - extent) + range) / (2 * range)
+            anchors.leftMargin: __styleData.horizontal && range !== 0 ? -handleOverlap + (2 * begin * (bg.width + (2 * handleOverlap) - extent) + range) / (2 * range) : 0
+            sourceComponent: handle
+            property QtObject styleData: QtObject {
+                readonly property bool hovered: activeControl === "handle"
+                readonly property bool pressed: __styleData.handlePressed
+                readonly property bool horizontal: __styleData.horizontal
+            }
+            readonly property alias __activeControl: panel.activeControl
+        }
+    }
+
+    /*! \internal */
+    property bool __externalScrollBars: false
+    /*! \internal */
+    property int __scrollBarSpacing: 4
+    /*! \internal */
+    property int __scrollBarFadeDelay: 450
+    /*! \internal */
+    property int __scrollBarFadeDuration: 200
+    /*! \internal */
+    property bool __stickyScrollbars: false
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/ScrollViewStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Base/ScrollViewStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..8cb9221c76164986570a3b97cf96ac521697a33a
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/ScrollViewStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/SliderStyle.qml b/deployment_test/QtQuick/Controls/Styles/Base/SliderStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..ca50306422f94a2c44d2b227c0b186a0491a0b4e
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Base/SliderStyle.qml
@@ -0,0 +1,232 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype SliderStyle
+    \inqmlmodule QtQuick.Controls.Styles
+    \since 5.1
+    \ingroup controlsstyling
+    \brief Provides custom styling for Slider.
+
+    The slider style allows you to create a custom appearance for
+    a \l Slider control.
+
+    The implicit size of the slider is calculated based on the
+    maximum implicit size of the \c background and \c handle
+    delegates combined.
+
+    Example:
+    \qml
+    Slider {
+        anchors.centerIn: parent
+        style: SliderStyle {
+            groove: Rectangle {
+                implicitWidth: 200
+                implicitHeight: 8
+                color: "gray"
+                radius: 8
+            }
+            handle: Rectangle {
+                anchors.centerIn: parent
+                color: control.pressed ? "white" : "lightgray"
+                border.color: "gray"
+                border.width: 2
+                implicitWidth: 34
+                implicitHeight: 34
+                radius: 12
+            }
+        }
+    }
+    \endqml
+*/
+Style {
+    id: styleitem
+
+    /*! The \l Slider this style is attached to. */
+    readonly property Slider control: __control
+
+    padding { top: 0 ; left: 0 ; right: 0 ; bottom: 0 }
+
+    /*! This property holds the item for the slider handle.
+        You can access the slider through the \c control property
+    */
+    property Component handle: Item{
+            implicitWidth:  implicitHeight
+            implicitHeight: TextSingleton.implicitHeight * 1.2
+
+            FastGlow {
+                source: handle
+                anchors.fill: parent
+                anchors.bottomMargin: -1
+                anchors.topMargin: 1
+                smooth: true
+                color: "#11000000"
+                spread: 0.8
+                transparentBorder: true
+                blur: 0.1
+
+            }
+            Rectangle {
+                id: handle
+                anchors.fill: parent
+
+                radius: width/2
+                gradient: Gradient {
+                    GradientStop { color: control.pressed ? "#e0e0e0" : "#fff" ; position: 1 }
+                    GradientStop { color: "#eee" ; position: 0 }
+                }
+                Rectangle {
+                    anchors.fill: parent
+                    anchors.margins: 1
+                    radius: width/2
+                    border.color: "#99ffffff"
+                    color: control.activeFocus ? "#224f7fbf" : "transparent"
+                }
+                border.color: control.activeFocus ? "#47b" : "#777"
+            }
+
+    }
+    /*! This property holds the background groove of the slider.
+
+        You can access the handle position through the \c styleData.handlePosition property.
+    */
+    property Component groove: Item {
+        property color fillColor: "#49d"
+        anchors.verticalCenter: parent.verticalCenter
+        implicitWidth: Math.round(TextSingleton.implicitHeight * 4.5)
+        implicitHeight: Math.max(6, Math.round(TextSingleton.implicitHeight * 0.3))
+        Rectangle {
+            radius: height/2
+            anchors.fill: parent
+            border.width: 1
+            border.color: "#888"
+            gradient: Gradient {
+                GradientStop { color: "#bbb" ; position: 0 }
+                GradientStop { color: "#ccc" ; position: 0.6 }
+                GradientStop { color: "#ccc" ; position: 1 }
+            }
+        }
+        Item {
+            clip: true
+            width: styleData.handlePosition
+            height: parent.height
+            Rectangle {
+                anchors.fill: parent
+                border.color: Qt.darker(fillColor, 1.2)
+                radius: height/2
+                gradient: Gradient {
+                    GradientStop {color: Qt.lighter(fillColor, 1.3)  ; position: 0}
+                    GradientStop {color: fillColor ; position: 1.4}
+                }
+            }
+        }
+    }
+
+    /*! This property holds the tick mark labels.
+        \since QtQuick.Controls.Styles 1.1
+
+        Every tickmark that should be drawn must be defined within this
+        component, so it is common to use a \l Repeater, for example.
+
+        You can access the handle width through the \c styleData.handleWidth property.
+    */
+    property Component tickmarks: Repeater {
+        id: repeater
+        model: control.stepSize > 0 ? 1 + (control.maximumValue - control.minimumValue) / control.stepSize : 0
+        Rectangle {
+            color: "#777"
+            width: 1 ; height: 3
+            y: repeater.height
+            x: styleData.handleWidth / 2 + index * ((repeater.width - styleData.handleWidth) / (repeater.count-1))
+        }
+    }
+
+    /*! This property holds the slider style panel.
+
+        Note that it is generally not recommended to override this.
+    */
+    property Component panel: Item {
+        id: root
+        property int handleWidth: handleLoader.width
+        property int handleHeight: handleLoader.height
+
+        property bool horizontal : control.orientation === Qt.Horizontal
+        property int horizontalSize: grooveLoader.implicitWidth + padding.left + padding.right
+        property int verticalSize: Math.max(handleLoader.implicitHeight, grooveLoader.implicitHeight) + padding.top + padding.bottom
+
+        implicitWidth: horizontal ? horizontalSize : verticalSize
+        implicitHeight: horizontal ? verticalSize : horizontalSize
+
+        y: horizontal ? 0 : height
+        rotation: horizontal ? 0 : -90
+        transformOrigin: Item.TopLeft
+
+        Item {
+
+            anchors.fill: parent
+
+            Loader {
+                id: grooveLoader
+                property QtObject styleData: QtObject {
+                    readonly property int handlePosition: handleLoader.x + handleLoader.width/2
+                }
+                x: padding.left
+                sourceComponent: groove
+                width: (horizontal ? parent.width : parent.height) - padding.left - padding.right
+                y:  Math.round(padding.top + (Math.round(horizontal ? parent.height : parent.width - padding.top - padding.bottom) - grooveLoader.item.height)/2)
+            }
+            Loader {
+                id: tickMarkLoader
+                anchors.fill: parent
+                sourceComponent: control.tickmarksEnabled ? tickmarks : null
+                property QtObject styleData: QtObject { readonly property int handleWidth: control.__panel.handleWidth }
+            }
+            Loader {
+                id: handleLoader
+                sourceComponent: handle
+                anchors.verticalCenter: grooveLoader.verticalCenter
+                x: Math.round((control.__handlePos - control.minimumValue) / (control.maximumValue - control.minimumValue) * ((horizontal ? root.width : root.height) - item.width))
+            }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/SliderStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Base/SliderStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..b70a77bde1bcb4de5a036c2f6eeedbb77b6abe3c
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/SliderStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/SpinBoxStyle.qml b/deployment_test/QtQuick/Controls/Styles/Base/SpinBoxStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..bc57ef6e25182820f816d92683a988fe51c53c16
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Base/SpinBoxStyle.qml
@@ -0,0 +1,258 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype SpinBoxStyle
+    \inqmlmodule QtQuick.Controls.Styles
+    \since 5.2
+    \ingroup controlsstyling
+    \brief Provides custom styling for SpinBox.
+
+    Example:
+    \qml
+    SpinBox {
+        style: SpinBoxStyle{
+            background: Rectangle {
+                implicitWidth: 100
+                implicitHeight: 20
+                border.color: "gray"
+                radius: 2
+            }
+        }
+    }
+    \endqml
+*/
+
+Style {
+    id: spinboxStyle
+
+    /*! The \l SpinBox this style is attached to. */
+    readonly property SpinBox control: __control
+
+    /*! The content margins of the text field. */
+    padding { top: 1 ; left: Math.round(styleData.contentHeight/2) ; right: Math.max(22, Math.round(styleData.contentHeight)) ; bottom: 0 }
+    /*! \qmlproperty enumeration horizontalAlignment
+
+        This property defines the default text aligment.
+
+        The supported values are:
+        \list
+        \li Qt.AlignLeft
+        \li Qt.AlignHCenter
+        \li Qt.AlignRight
+        \endlist
+
+        The default value is Qt.AlignRight
+    */
+    property int horizontalAlignment: Qt.AlignRight
+
+    /*! The text color. */
+    property color textColor: SystemPaletteSingleton.text(control.enabled)
+
+    /*! The text highlight color, used behind selections. */
+    property color selectionColor: SystemPaletteSingleton.highlight(control.enabled)
+
+    /*! The highlighted text color, used in selections. */
+    property color selectedTextColor: SystemPaletteSingleton.highlightedText(control.enabled)
+
+    /*!
+        \qmlproperty enumeration renderType
+
+        Override the default rendering type for the control.
+
+        Supported render types are:
+        \list
+        \li Text.QtRendering
+        \li Text.NativeRendering
+        \endlist
+
+        The default value is platform dependent.
+
+        \sa Text::renderType
+    */
+    property int renderType: Settings.isMobile ? Text.QtRendering : Text.NativeRendering
+
+    /*!
+        \since QtQuick.Controls.Styles 1.3
+        The font of the control.
+    */
+    property font font
+
+    /*! The button used to increment the value. */
+    property Component incrementControl: Item {
+        implicitWidth: padding.right
+        Image {
+            source: "images/arrow-up.png"
+            anchors.centerIn: parent
+            anchors.verticalCenterOffset: 1
+            opacity: control.enabled ? (styleData.upPressed ? 1 : 0.6) : 0.5
+        }
+    }
+
+    /*! The button used to decrement the value. */
+    property Component decrementControl: Item {
+        implicitWidth: padding.right
+        Image {
+            source: "images/arrow-down.png"
+            anchors.centerIn: parent
+            anchors.verticalCenterOffset: -2
+            opacity: control.enabled ? (styleData.downPressed ? 1 : 0.6) : 0.5
+        }
+    }
+
+    /*! The background of the SpinBox. */
+    property Component background: Item {
+        implicitHeight: Math.max(25, Math.round(styleData.contentHeight * 1.2))
+        implicitWidth: styleData.contentWidth + padding.left + padding.right
+        baselineOffset: control.__baselineOffset
+        Rectangle {
+            anchors.fill: parent
+            anchors.bottomMargin: -1
+            color: "#44ffffff"
+            radius: baserect.radius
+        }
+        Rectangle {
+            id: baserect
+            gradient: Gradient {
+                GradientStop {color: "#eee" ; position: 0}
+                GradientStop {color: "#fff" ; position: 0.1}
+                GradientStop {color: "#fff" ; position: 1}
+            }
+            radius: control.font.pixelSize * 0.16
+            anchors.fill: parent
+            border.color: control.activeFocus ? "#47b" : "#999"
+        }
+    }
+
+    /*! \internal */
+    property Component panel: Item {
+        id: styleitem
+        implicitWidth: backgroundLoader.implicitWidth
+        implicitHeight: backgroundLoader.implicitHeight
+        baselineOffset: backgroundLoader.item ? backgroundLoader.item.baselineOffset : 0
+
+        property font font: spinboxStyle.font
+
+        property color foregroundColor: spinboxStyle.textColor
+        property color selectionColor: spinboxStyle.selectionColor
+        property color selectedTextColor: spinboxStyle.selectedTextColor
+
+        property var margins: spinboxStyle.padding
+
+        property rect upRect: Qt.rect(width - incrementControlLoader.implicitWidth, 0, incrementControlLoader.implicitWidth, height / 2 + 1)
+        property rect downRect: Qt.rect(width - decrementControlLoader.implicitWidth, height / 2, decrementControlLoader.implicitWidth, height / 2)
+
+        property int horizontalAlignment: spinboxStyle.horizontalAlignment
+        property int verticalAlignment: Qt.AlignVCenter
+
+        Loader {
+            id: backgroundLoader
+            anchors.fill: parent
+            sourceComponent: background
+        }
+
+        Loader {
+            id: incrementControlLoader
+            x: upRect.x
+            y: upRect.y
+            width: upRect.width
+            height: upRect.height
+            sourceComponent: incrementControl
+        }
+
+        Loader {
+            id: decrementControlLoader
+            x: downRect.x
+            y: downRect.y
+            width: downRect.width
+            height: downRect.height
+            sourceComponent: decrementControl
+        }
+    }
+
+    /*! \internal
+        The cursor handle.
+        \since QtQuick.Controls.Styles 1.3
+
+        The parent of the handle is positioned to the top left corner of
+        the cursor position. The interactive area is determined by the
+        geometry of the handle delegate.
+
+        The following signals and read-only properties are available within the scope
+        of the handle delegate:
+        \table
+            \row \li \b {styleData.activated()} [signal] \li Emitted when the handle is activated ie. the editor is clicked.
+            \row \li \b {styleData.pressed} : bool \li Whether the handle is pressed.
+            \row \li \b {styleData.position} : int \li The character position of the handle.
+            \row \li \b {styleData.lineHeight} : real \li The height of the line the handle is on.
+            \row \li \b {styleData.hasSelection} : bool \li Whether the editor has selected text.
+        \endtable
+    */
+    property Component __cursorHandle
+
+    /*! \internal
+        The selection handle.
+        \since QtQuick.Controls.Styles 1.3
+
+        The parent of the handle is positioned to the top left corner of
+        the first selected character. The interactive area is determined
+        by the geometry of the handle delegate.
+
+        The following signals and read-only properties are available within the scope
+        of the handle delegate:
+        \table
+            \row \li \b {styleData.activated()} [signal] \li Emitted when the handle is activated ie. the editor is clicked.
+            \row \li \b {styleData.pressed} : bool \li Whether the handle is pressed.
+            \row \li \b {styleData.position} : int \li The character position of the handle.
+            \row \li \b {styleData.lineHeight} : real \li The height of the line the handle is on.
+            \row \li \b {styleData.hasSelection} : bool \li Whether the editor has selected text.
+        \endtable
+    */
+    property Component __selectionHandle
+
+    /*! \internal
+        The cursor delegate.
+        \since QtQuick.Controls.Styles 1.3
+    */
+    property Component __cursorDelegate
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/SpinBoxStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Base/SpinBoxStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..c4a6cf34d7731c4d960fcf4d3f3d77bcd1ac93f3
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/SpinBoxStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/StatusBarStyle.qml b/deployment_test/QtQuick/Controls/Styles/Base/StatusBarStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..8b620424f624df2eec606dff4ce6a58242339b7f
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Base/StatusBarStyle.qml
@@ -0,0 +1,115 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype StatusBarStyle
+    \inqmlmodule QtQuick.Controls.Styles
+    \ingroup controlsstyling
+    \since 5.2
+    \brief Provides custom styling for StatusBar.
+
+    The status bar can be defined by overriding the background component and
+    setting the content padding.
+
+    Example:
+    \qml
+    StatusBar {
+        style: StatusBarStyle {
+            padding {
+                left: 8
+                right: 8
+                top: 3
+                bottom: 3
+            }
+            background: Rectangle {
+                implicitHeight: 16
+                implicitWidth: 200
+                gradient: Gradient{
+                    GradientStop{color: "#eee" ; position: 0}
+                    GradientStop{color: "#ccc" ; position: 1}
+                }
+                Rectangle {
+                    anchors.top: parent.top
+                    width: parent.width
+                    height: 1
+                    color: "#999"
+                }
+            }
+        }
+    }
+    \endqml
+*/
+
+Style {
+
+    /*! The content padding inside the status bar. */
+    padding {
+        left: 3
+        right: 3
+        top: 3
+        bottom: 2
+    }
+
+    /*! This defines the background of the status bar. */
+    property Component background: Rectangle {
+        implicitHeight: 16
+        implicitWidth: 200
+
+        gradient: Gradient{
+            GradientStop{color: "#eee" ; position: 0}
+            GradientStop{color: "#ccc" ; position: 1}
+        }
+
+        Rectangle {
+            anchors.top: parent.top
+            width: parent.width
+            height: 1
+            color: "#999"
+        }
+    }
+
+    /*! This defines the panel of the status bar. */
+    property Component panel: Loader {
+        sourceComponent: background
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/StatusBarStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Base/StatusBarStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..731d9c956aeb751a39ed47e4bb32d9bb4f1e0a0c
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/StatusBarStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/StatusIndicatorStyle.qml b/deployment_test/QtQuick/Controls/Styles/Base/StatusIndicatorStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..ae9f2110d94d4c81a0a321dd20fd8c5ec65610bc
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Base/StatusIndicatorStyle.qml
@@ -0,0 +1,232 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Extras module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtGraphicalEffects 1.0
+import QtQuick.Controls.Private 1.0
+import QtQuick.Extras 1.4
+
+/*!
+    \qmltype StatusIndicatorStyle
+    \inqmlmodule QtQuick.Controls.Styles
+    \since 5.5
+    \ingroup controlsstyling
+    \brief Provides custom styling for StatusIndicatorStyle.
+
+    You can create a custom status indicator by defining the \l indicator
+    component.
+*/
+
+Style {
+    id: pieMenuStyle
+
+    /*!
+        The \l StatusIndicator that this style is attached to.
+    */
+    readonly property StatusIndicator control: __control
+
+    /*!
+        The color that instances of
+        \l [QtQuickExtras]{StatusIndicator} will have.
+        The \l [QtQuickExtras]{StatusIndicator::}{color}
+        property in \l [QtQuickExtras]{StatusIndicator}
+        will override this property when set.
+    */
+    property color color: "red"
+
+    /*!
+        This defines the indicator in both its on and off status.
+    */
+    property Component indicator: Item {
+        readonly property real shineStep: 0.05
+        readonly property real smallestAxis: Math.min(control.width, control.height)
+        readonly property real outerRecessPercentage: 0.11
+        readonly property color offColor: Qt.rgba(0.13, 0.13, 0.13)
+        readonly property color baseColor: control.active ? control.color : offColor
+
+        implicitWidth: TextSingleton.implicitHeight * 2
+        implicitHeight: implicitWidth
+
+        Canvas {
+            id: backgroundCanvas
+            width: Math.min(parent.width, parent.height)
+            // height: width --- QTBUG-42878
+            height: Math.min(parent.width, parent.height)
+            anchors.centerIn: parent
+
+            Connections {
+                target: control
+                function onActiveChanged() { backgroundCanvas.requestPaint() }
+                function onColorChanged() { backgroundCanvas.requestPaint() }
+            }
+
+            onPaint: {
+                var ctx = getContext("2d");
+                ctx.reset();
+
+                // Draw the semi-transparent background.
+                ctx.beginPath();
+                var gradient = ctx.createLinearGradient(width / 2, 0, width / 2, height * 0.75);
+                gradient.addColorStop(0.0, Qt.rgba(0, 0, 0, control.active ? 0.1 : 0.25));
+                gradient.addColorStop(1.0, control.active ? Qt.rgba(0, 0, 0, 0.1) : Qt.rgba(0.74, 0.74, 0.74, 0.25));
+
+                ctx.fillStyle = gradient;
+                ctx.ellipse(0, 0, width, height);
+                ctx.fill();
+            }
+        }
+
+        Item {
+            id: shadowGuard
+            anchors.fill: backgroundCanvas
+            anchors.margins: -shadow.radius
+
+            Canvas {
+                id: colorCanvas
+                anchors.fill: parent
+                anchors.margins: shadow.radius
+
+                Connections {
+                    target: control
+                    function onActiveChanged() { colorCanvas.requestPaint() }
+                    function onColorChanged() { colorCanvas.requestPaint() }
+                }
+
+                onPaint: {
+                    var ctx = getContext("2d");
+                    ctx.reset();
+
+                    // Draw the actual color within the circle.
+                    ctx.beginPath();
+                    ctx.fillStyle = baseColor;
+                    var recess = smallestAxis * outerRecessPercentage;
+                    ctx.ellipse(recess, recess, width - recess * 2, height - recess * 2);
+                    ctx.fill();
+                }
+            }
+        }
+
+        DropShadow {
+            id: shadow
+            source: shadowGuard
+            color: control.color
+            cached: true
+            anchors.fill: shadowGuard
+            visible: control.active
+        }
+
+        Canvas {
+            id: foregroundCanvas
+            anchors.fill: backgroundCanvas
+
+            Connections {
+                target: control
+                function onActiveChanged() { foregroundCanvas.requestPaint() }
+                function onColorChanged() { foregroundCanvas.requestPaint() }
+            }
+
+            onPaint: {
+                var ctx = getContext("2d");
+                ctx.reset();
+
+                // Draw the first shine.
+                ctx.beginPath();
+                ctx.fillStyle = Qt.rgba(1, 1, 1, 0.03);
+                var recessPercentage = outerRecessPercentage + shineStep * 0.65;
+                var recess = smallestAxis * recessPercentage;
+                ctx.ellipse(recess, recess, width - recess * 2, height - recess * 2);
+                ctx.fill();
+
+                // Draw the second, inner shine.
+                ctx.beginPath();
+                ctx.fillStyle = Qt.rgba(1, 1, 1, 0.06);
+                recessPercentage += shineStep;
+                recess = smallestAxis * recessPercentage;
+                ctx.ellipse(recess, recess, width - recess * 2, height - recess * 2);
+                ctx.fill();
+
+                // Now draw the final arced shine that goes over the first and second shines.
+                // First, clip the entire shine area.
+                ctx.beginPath();
+                recessPercentage -= shineStep;
+                recess = smallestAxis * recessPercentage;
+                ctx.ellipse(recess, recess, width - recess * 2, height - recess * 2);
+                ctx.clip();
+
+                if (!control.active) {
+                    // Then, clip the bottom area out of the shine.
+                    ctx.ellipse(recess, height * 0.425, width - recess * 2, height - recess * 2);
+                    ctx.clip();
+                }
+
+                ctx.beginPath();
+                var gradient;
+                if (!control.active) {
+                    // Draw the shine arc.
+                    gradient = ctx.createLinearGradient(width / 2, height * 0.2, width / 2, height * 0.65);
+                    gradient.addColorStop(0.0, Qt.rgba(1, 1, 1, 0.05));
+                    gradient.addColorStop(1.0, "transparent");
+                } else {
+                    // Draw the radial shine.
+                    gradient = ctx.createRadialGradient(width / 2, height / 2, 0, width / 2, height / 2, width * 0.5 /* (same as height) */);
+                    gradient.addColorStop(0.0, Qt.lighter(baseColor, 1.4));
+                    gradient.addColorStop(1.0, "transparent");
+                }
+
+                ctx.fillStyle = gradient;
+                ctx.ellipse(recess, recess, width - recess * 2, height - recess * 2);
+                ctx.fill();
+            }
+        }
+    }
+
+    /*! \internal */
+    property Component panel: Item {
+        implicitWidth: indicatorLoader.implicitWidth
+        implicitHeight: indicatorLoader.implicitHeight
+
+        Loader {
+            id: indicatorLoader
+            width: Math.max(1, parent.width)
+            height: Math.max(1, parent.height)
+            anchors.centerIn: parent
+            sourceComponent: indicator
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/StatusIndicatorStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Base/StatusIndicatorStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..f416a34a3f1c86fc42859a440ae298312b4abeb9
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/StatusIndicatorStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/SwitchStyle.qml b/deployment_test/QtQuick/Controls/Styles/Base/SwitchStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..39db036b61d49488ef6b3f9cff0f0dc2210b159a
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Base/SwitchStyle.qml
@@ -0,0 +1,169 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype SwitchStyle
+    \inqmlmodule QtQuick.Controls.Styles
+    \since 5.2
+    \ingroup controlsstyling
+    \brief Provides custom styling for Switch.
+
+    Example:
+    \qml
+    Switch {
+        style: SwitchStyle {
+            groove: Rectangle {
+                    implicitWidth: 100
+                    implicitHeight: 20
+                    radius: 9
+                    border.color: control.activeFocus ? "darkblue" : "gray"
+                    border.width: 1
+            }
+        }
+     }
+    \endqml
+*/
+Style {
+    id: switchstyle
+
+    /*! The content padding. */
+    padding {
+        top: 0
+        left: 0
+        right: 0
+        bottom: 0
+    }
+
+    /*! This defines the switch handle.  */
+    property Component handle: Rectangle {
+        opacity: control.enabled ? 1.0 : 0.5
+        implicitWidth: Math.round((parent.parent.width - padding.left - padding.right)/2)
+        implicitHeight: control.height - padding.top - padding.bottom
+
+        border.color: control.activeFocus ? Qt.darker(highlight, 2) : Qt.darker(button, 2)
+        property color bg: control.activeFocus ? Qt.darker(highlight, 1.2) : button
+        property color highlight: SystemPaletteSingleton.highlight(control.enabled)
+        property color button: SystemPaletteSingleton.button(control.enabled)
+        gradient: Gradient {
+            GradientStop {color: Qt.lighter(bg, 1.4) ; position: 0}
+            GradientStop {color: bg ; position: 1}
+        }
+
+        radius: 2
+    }
+
+    /*! This property holds the background groove of the switch. */
+    property Component groove: Rectangle {
+        property color shadow: control.checked ? Qt.darker(highlight, 1.2): "#999"
+        property color bg: control.checked ? highlight:"#bbb"
+        property color highlight: SystemPaletteSingleton.highlight(control.enabled)
+
+        implicitWidth: Math.round(implicitHeight * 3)
+        implicitHeight: Math.max(16, Math.round(TextSingleton.implicitHeight))
+
+        border.color: "gray"
+        color: "red"
+
+        radius: 2
+        Behavior on shadow {ColorAnimation{ duration: 80 }}
+        Behavior on bg {ColorAnimation{ duration: 80 }}
+        gradient: Gradient {
+            GradientStop {color: shadow; position: 0}
+            GradientStop {color: bg ; position: 0.2}
+            GradientStop {color: bg ; position: 1}
+        }
+        Rectangle {
+            color: "#44ffffff"
+            height: 1
+            anchors.bottom: parent.bottom
+            anchors.bottomMargin: -1
+            width: parent.width - 2
+            x: 1
+        }
+    }
+
+    /*! \internal */
+    property Component panel: Item {
+
+        implicitWidth: Math.round(grooveLoader.width + padding.left + padding.right)
+        implicitHeight: grooveLoader.implicitHeight + padding.top + padding.bottom
+
+        property var __handle: handleLoader
+        property int min: padding.left
+        property int max: grooveLoader.width - handleLoader.width - padding.right
+
+        Loader {
+            id: grooveLoader
+            y: padding.top
+            x: padding.left
+
+            sourceComponent: groove
+            anchors.verticalCenter: parent.verticalCenter
+
+
+            Loader {
+                id: handleLoader
+
+                z:1
+
+                x: control.checked ? max : min
+
+                anchors.top: grooveLoader.top
+                anchors.bottom: grooveLoader.bottom
+                anchors.topMargin: padding.top
+                anchors.bottomMargin: padding.bottom
+
+                Behavior on x {
+                    id: behavior
+                    enabled: handleLoader.status === Loader.Ready
+                    NumberAnimation {
+                        duration: 150
+                        easing.type: Easing.OutCubic
+                    }
+                }
+
+                sourceComponent: handle
+            }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/SwitchStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Base/SwitchStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..a3c105a4409c7bc7130eb2186379991823aea84d
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/SwitchStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/TabViewStyle.qml b/deployment_test/QtQuick/Controls/Styles/Base/TabViewStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..2d7d2d913726cf2445ce6a623401f04544ccc60c
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Base/TabViewStyle.qml
@@ -0,0 +1,194 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype TabViewStyle
+    \inqmlmodule QtQuick.Controls.Styles
+    \since 5.1
+    \ingroup viewsstyling
+    \ingroup controlsstyling
+    \brief Provides custom styling for TabView.
+
+\qml
+    TabView {
+        id: frame
+        anchors.fill: parent
+        anchors.margins: 4
+        Tab { title: "Tab 1" }
+        Tab { title: "Tab 2" }
+        Tab { title: "Tab 3" }
+
+        style: TabViewStyle {
+            frameOverlap: 1
+            tab: Rectangle {
+                color: styleData.selected ? "steelblue" :"lightsteelblue"
+                border.color:  "steelblue"
+                implicitWidth: Math.max(text.width + 4, 80)
+                implicitHeight: 20
+                radius: 2
+                Text {
+                    id: text
+                    anchors.centerIn: parent
+                    text: styleData.title
+                    color: styleData.selected ? "white" : "black"
+                }
+            }
+            frame: Rectangle { color: "steelblue" }
+        }
+    }
+\endqml
+
+*/
+
+Style {
+
+    /*! The \l ScrollView this style is attached to. */
+    readonly property TabView control: __control
+
+    /*! This property holds whether the user can move the tabs.
+        Tabs are not movable by default. */
+    property bool tabsMovable: false
+
+    /*! This property holds the horizontal alignment of
+        the tab buttons. Supported values are:
+        \list
+        \li Qt.AlignLeft (default)
+        \li Qt.AlignHCenter
+        \li Qt.AlignRight
+        \endlist
+    */
+    property int tabsAlignment: Qt.AlignLeft
+
+    /*! This property holds the amount of overlap there are between
+      individual tab buttons. */
+    property int tabOverlap: 1
+
+    /*! This property holds the amount of overlap there are between
+      individual tab buttons and the frame. */
+    property int frameOverlap: 2
+
+    /*! This defines the tab frame. */
+    property Component frame: Rectangle {
+        color: "#dcdcdc"
+        border.color: "#aaa"
+
+        Rectangle {
+            anchors.fill: parent
+            color: "transparent"
+            border.color: "#66ffffff"
+            anchors.margins: 1
+        }
+    }
+
+    /*! This defines the tab. You can access the tab state through the
+        \c styleData property, with the following properties:
+
+        \table
+            \row \li readonly property int \b styleData.index \li This is the current tab index.
+            \row \li readonly property bool \b styleData.selected \li This is the active tab.
+            \row \li readonly property string \b styleData.title \li Tab title text.
+            \row \li readonly property bool \b styleData.nextSelected \li The next tab is selected.
+            \row \li readonly property bool \b styleData.previousSelected \li The previous tab is selected.
+            \row \li readonly property bool \b styleData.pressed \li The tab is being pressed. (since QtQuick.Controls.Styles 1.3)
+            \row \li readonly property bool \b styleData.hovered \li The tab is being hovered.
+            \row \li readonly property bool \b styleData.enabled \li The tab is enabled. (since QtQuick.Controls.Styles 1.2)
+            \row \li readonly property bool \b styleData.activeFocus \li The tab button has keyboard focus.
+            \row \li readonly property bool \b styleData.availableWidth \li The available width for the tabs.
+            \row \li readonly property bool \b styleData.totalWidth \li The total width of the tabs. (since QtQuick.Controls.Styles 1.2)
+        \endtable
+    */
+    property Component tab: Item {
+        scale: control.tabPosition === Qt.TopEdge ? 1 : -1
+
+        property int totalOverlap: tabOverlap * (control.count - 1)
+        property real maxTabWidth: control.count > 0 ? (styleData.availableWidth + totalOverlap) / control.count : 0
+
+        implicitWidth: Math.round(Math.min(maxTabWidth, textitem.implicitWidth + 20))
+        implicitHeight: Math.round(textitem.implicitHeight + 10)
+
+        Item {
+            anchors.fill: parent
+            anchors.bottomMargin: styleData.selected ? 0 : 2
+            BorderImage {
+                anchors.fill: parent
+                source: styleData.selected ? "images/tab_selected.png" : "images/tab.png"
+                border.top: 6
+                border.bottom: 6
+                border.left: 6
+                border.right: 6
+                anchors.topMargin: styleData.selected ? 0 : 1
+            }
+        }
+        Text {
+            id: textitem
+            anchors.fill: parent
+            anchors.leftMargin: 4
+            anchors.rightMargin: 4
+            verticalAlignment: Text.AlignVCenter
+            horizontalAlignment: Text.AlignHCenter
+            text: styleData.title
+            elide: Text.ElideMiddle
+            renderType: Settings.isMobile ? Text.QtRendering : Text.NativeRendering
+            scale: control.tabPosition === Qt.TopEdge ? 1 : -1
+            color: SystemPaletteSingleton.text(styleData.enabled)
+            Rectangle {
+                anchors.centerIn: parent
+                width: textitem.paintedWidth + 6
+                height: textitem.paintedHeight + 4
+                visible: (styleData.activeFocus && styleData.selected)
+                radius: 3
+                color: "#224f9fef"
+                border.color: "#47b"
+            }
+        }
+    }
+
+    /*! This defines the left corner. */
+    property Component leftCorner: null
+
+    /*! This defines the right corner. */
+    property Component rightCorner: null
+
+    /*! This defines the tab bar background. */
+    property Component tabBar: null
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/TabViewStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Base/TabViewStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..cea0d59dc781d4aca174eb429529d80f24d3331c
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/TabViewStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/TableViewStyle.qml b/deployment_test/QtQuick/Controls/Styles/Base/TableViewStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..f7a6bfa1aa56a79fe69216a4a550ad987efa88e5
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Base/TableViewStyle.qml
@@ -0,0 +1,47 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.5
+import QtQuick.Controls 1.4
+
+BasicTableViewStyle {
+    id: root
+
+    readonly property TableView control: __control
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/TableViewStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Base/TableViewStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..2ad2120ae30124601ec21ff483d580db513e9679
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/TableViewStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/TextAreaStyle.qml b/deployment_test/QtQuick/Controls/Styles/Base/TextAreaStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..8c08e211d14d6b9b262897d5ec40d54a609f9b7e
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Base/TextAreaStyle.qml
@@ -0,0 +1,158 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype TextAreaStyle
+    \inqmlmodule QtQuick.Controls.Styles
+    \since 5.2
+    \ingroup controlsstyling
+    \brief Provides custom styling for TextArea.
+
+    Example:
+    \qml
+    TextArea {
+        style: TextAreaStyle {
+            textColor: "#333"
+            selectionColor: "steelblue"
+            selectedTextColor: "#eee"
+            backgroundColor: "#eee"
+        }
+    }
+    \endqml
+*/
+
+ScrollViewStyle {
+    id: style
+
+    /*! The \l TextArea this style is attached to. */
+    readonly property TextArea control: __control
+
+    /*! The current font. */
+    property font font
+
+    /*! The text color. */
+    property color textColor: SystemPaletteSingleton.text(control.enabled)
+
+    /*! The text highlight color, used behind selections. */
+    property color selectionColor: SystemPaletteSingleton.highlight(control.enabled)
+
+    /*! The highlighted text color, used in selections. */
+    property color selectedTextColor: SystemPaletteSingleton.highlightedText(control.enabled)
+
+    /*! The background color. */
+    property color backgroundColor: control.backgroundVisible ? SystemPaletteSingleton.base(control.enabled) : "transparent"
+
+    /*!
+        \qmlproperty enumeration renderType
+
+        Override the default rendering type for the control.
+
+        Supported render types are:
+        \list
+        \li Text.QtRendering
+        \li Text.NativeRendering
+        \endlist
+
+        The default value is platform dependent.
+
+        \sa Text::renderType
+    */
+    property int renderType: Settings.isMobile ? Text.QtRendering : Text.NativeRendering
+
+    /*! The default margin, in pixels, around the text in the TextArea.
+      \since QtQuick.Controls.Styles 1.3
+      \sa TextArea::textMargin */
+    property real textMargin: 4
+
+    /*! \internal
+        The cursor handle.
+        \since QtQuick.Controls.Styles 1.3
+
+        The parent of the handle is positioned to the top left corner of
+        the cursor position. The interactive area is determined by the
+        geometry of the handle delegate.
+
+        The following signals and read-only properties are available within the scope
+        of the handle delegate:
+        \table
+            \row \li \b {styleData.activated()} [signal] \li Emitted when the handle is activated ie. the editor is clicked.
+            \row \li \b {styleData.pressed} : bool \li Whether the handle is pressed.
+            \row \li \b {styleData.position} : int \li The character position of the handle.
+            \row \li \b {styleData.lineHeight} : real \li The height of the line the handle is on.
+            \row \li \b {styleData.hasSelection} : bool \li Whether the editor has selected text.
+        \endtable
+    */
+    property Component __cursorHandle
+
+    /*! \internal
+        The selection handle.
+        \since QtQuick.Controls.Styles 1.3
+
+        The parent of the handle is positioned to the top left corner of
+        the first selected character. The interactive area is determined
+        by the geometry of the handle delegate.
+
+        The following signals and read-only properties are available within the scope
+        of the handle delegate:
+        \table
+            \row \li \b {styleData.activated()} [signal] \li Emitted when the handle is activated ie. the editor is clicked.
+            \row \li \b {styleData.pressed} : bool \li Whether the handle is pressed.
+            \row \li \b {styleData.position} : int \li The character position of the handle.
+            \row \li \b {styleData.lineHeight} : real \li The height of the line the handle is on.
+            \row \li \b {styleData.hasSelection} : bool \li Whether the editor has selected text.
+        \endtable
+    */
+    property Component __selectionHandle
+
+    /*! \internal
+        The cursor delegate.
+        \since QtQuick.Controls.Styles 1.3
+    */
+    property Component __cursorDelegate
+
+    /*! \internal
+        The delegate for the cut/copy/paste menu.
+        \since QtQuick.Controls.Styles 1.4
+    */
+    property Component __editMenu
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/TextAreaStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Base/TextAreaStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..4c8f422bc76ea87f3a112dcb59d292d84654126e
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/TextAreaStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/TextFieldStyle.qml b/deployment_test/QtQuick/Controls/Styles/Base/TextFieldStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..338b7af09447c119fe4a87f552f7d181497ef278
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Base/TextFieldStyle.qml
@@ -0,0 +1,221 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype TextFieldStyle
+    \inqmlmodule QtQuick.Controls.Styles
+    \since 5.1
+    \ingroup controlsstyling
+    \brief Provides custom styling for TextField.
+
+    Example:
+    \qml
+    TextField {
+        style: TextFieldStyle {
+            textColor: "black"
+            background: Rectangle {
+                radius: 2
+                implicitWidth: 100
+                implicitHeight: 24
+                border.color: "#333"
+                border.width: 1
+            }
+        }
+    }
+    \endqml
+*/
+
+Style {
+    id: style
+
+    /*! The \l TextField this style is attached to. */
+    readonly property TextField control: __control
+
+    /*! The content margins of the text field. */
+    padding { top: 4 ; left: Math.round(control.__contentHeight/3) ; right: control.__contentHeight/3 ; bottom: 4 }
+
+    /*! The current font. */
+    property font font
+
+    /*! The text color. */
+    property color textColor: SystemPaletteSingleton.text(control.enabled)
+
+    /*! The text highlight color, used behind selections. */
+    property color selectionColor: SystemPaletteSingleton.highlight(control.enabled)
+
+    /*! The highlighted text color, used in selections. */
+    property color selectedTextColor: SystemPaletteSingleton.highlightedText(control.enabled)
+
+    /*!
+        \qmlproperty string passwordCharacter
+        \since QtQuick.Controls.Styles 1.4
+
+        The password character that is displayed when echoMode
+        on the TextField is set to TextInput.Password or
+        TextInput.PasswordEchoOnEdit.
+    */
+    property string passwordCharacter: Qt.styleHints.passwordMaskCharacter
+
+    /*!
+        \qmlproperty enumeration renderType
+        \since QtQuick.Controls.Styles 1.1
+
+        Override the default rendering type for the control.
+
+        Supported render types are:
+        \list
+        \li Text.QtRendering
+        \li Text.NativeRendering
+        \endlist
+
+        The default value is platform dependent.
+
+        \sa Text::renderType
+    */
+    property int renderType: Settings.isMobile ? Text.QtRendering : Text.NativeRendering
+
+    /*! The placeholder text color, used when the text field is empty.
+        \since QtQuick.Controls.Styles 1.1
+    */
+    property color placeholderTextColor: Qt.rgba(0, 0, 0, 0.5)
+
+    /*! The background of the text field. */
+    property Component background: Item {
+        Rectangle {
+            anchors.fill: parent
+            anchors.bottomMargin: -1
+            color: "#44ffffff"
+            radius: baserect.radius
+        }
+        Rectangle {
+            id: baserect
+            gradient: Gradient {
+                GradientStop {color: "#e0e0e0" ; position: 0}
+                GradientStop {color: "#fff" ; position: 0.1}
+                GradientStop {color: "#fff" ; position: 1}
+            }
+            radius: control.__contentHeight * 0.16
+            anchors.fill: parent
+            border.color: control.activeFocus ? "#47b" : "#999"
+        }
+    }
+
+    /*! \internal */
+    property Component panel: Item {
+        anchors.fill: parent
+
+        property int topMargin: padding.top
+        property int leftMargin: padding.left
+        property int rightMargin: padding.right
+        property int bottomMargin: padding.bottom
+
+        property color textColor: style.textColor
+        property color selectionColor: style.selectionColor
+        property color selectedTextColor: style.selectedTextColor
+
+        implicitWidth: backgroundLoader.implicitWidth || Math.round(control.__contentHeight * 8)
+        implicitHeight: backgroundLoader.implicitHeight || Math.max(25, Math.round(control.__contentHeight * 1.2))
+        baselineOffset: padding.top + control.__baselineOffset
+
+        property color placeholderTextColor: style.placeholderTextColor
+        property font font: style.font
+
+        Loader {
+            id: backgroundLoader
+            sourceComponent: background
+            anchors.fill: parent
+        }
+    }
+
+    /*! \internal
+        The cursor handle.
+        \since QtQuick.Controls.Styles 1.3
+
+        The parent of the handle is positioned to the top left corner of
+        the cursor position. The interactive area is determined by the
+        geometry of the handle delegate.
+
+        The following signals and read-only properties are available within the scope
+        of the handle delegate:
+        \table
+            \row \li \b {styleData.activated()} [signal] \li Emitted when the handle is activated ie. the editor is clicked.
+            \row \li \b {styleData.pressed} : bool \li Whether the handle is pressed.
+            \row \li \b {styleData.position} : int \li The character position of the handle.
+            \row \li \b {styleData.lineHeight} : real \li The height of the line the handle is on.
+            \row \li \b {styleData.hasSelection} : bool \li Whether the editor has selected text.
+        \endtable
+    */
+    property Component __cursorHandle
+
+    /*! \internal
+        The selection handle.
+        \since QtQuick.Controls.Styles 1.3
+
+        The parent of the handle is positioned to the top left corner of
+        the first selected character. The interactive area is determined
+        by the geometry of the handle delegate.
+
+        The following signals and read-only properties are available within the scope
+        of the handle delegate:
+        \table
+            \row \li \b {styleData.activated()} [signal] \li Emitted when the handle is activated ie. the editor is clicked.
+            \row \li \b {styleData.pressed} : bool \li Whether the handle is pressed.
+            \row \li \b {styleData.position} : int \li The character position of the handle.
+            \row \li \b {styleData.lineHeight} : real \li The height of the line the handle is on.
+            \row \li \b {styleData.hasSelection} : bool \li Whether the editor has selected text.
+        \endtable
+    */
+    property Component __selectionHandle
+
+    /*! \internal
+        The cursor delegate.
+        \since QtQuick.Controls.Styles 1.3
+    */
+    property Component __cursorDelegate
+
+    /*! \internal
+        The delegate for the cut/copy/paste menu.
+        \since QtQuick.Controls.Styles 1.4
+    */
+    property Component __editMenu
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/TextFieldStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Base/TextFieldStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..fb5607a63e2129f5a6391fdf13239f2438888142
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/TextFieldStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/ToggleButtonStyle.qml b/deployment_test/QtQuick/Controls/Styles/Base/ToggleButtonStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..2c47b4bf680f3d9b4c9da8c3fe86f8ba5aed4885
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Base/ToggleButtonStyle.qml
@@ -0,0 +1,290 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Extras module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtGraphicalEffects 1.0
+import QtQuick.Controls.Styles 1.4
+import QtQuick.Extras 1.4
+import QtQuick.Extras.Private 1.0
+import QtQuick.Extras.Private.CppUtils 1.0
+
+/*!
+    \qmltype ToggleButtonStyle
+    \inqmlmodule QtQuick.Controls.Styles
+    \since 5.5
+    \ingroup controlsstyling
+    \brief Provides custom styling for ToggleButton.
+
+    You can create a custom toggle button by replacing the same delegates that
+    \l {ButtonStyle} provides.
+*/
+
+CircularButtonStyle {
+    id: circularButtonStyle
+
+    /*!
+        The \l ToggleButton that this style is attached to.
+    */
+    readonly property ToggleButton control: __control
+
+    /*!
+        The gradient that is displayed on the inactive state indicator. The
+        inactive state indicator will be the checked gradient when the button
+        is unchecked, and the unchecked gradient when the button is checked.
+
+        \sa checkedGradient, uncheckedGradient
+    */
+    property Gradient inactiveGradient: Gradient {
+        GradientStop {
+            position: 0
+            color: commonStyleHelper.inactiveColor
+        }
+        GradientStop {
+            position: 1
+            color: commonStyleHelper.inactiveColorShine
+        }
+    }
+
+    /*!
+        The gradient that is displayed on the checked state indicator.
+
+        \sa uncheckedGradient, inactiveGradient
+    */
+    property Gradient checkedGradient: Gradient {
+        GradientStop {
+            position: 0
+            color: commonStyleHelper.onColor
+        }
+        GradientStop {
+            position: 1
+            color: commonStyleHelper.onColorShine
+        }
+    }
+
+    /*!
+        The gradient that is displayed on the unchecked state indicator.
+
+        \sa checkedGradient, inactiveGradient
+    */
+    property Gradient uncheckedGradient: Gradient {
+        GradientStop {
+            position: 0
+            color: commonStyleHelper.offColor
+        }
+        GradientStop {
+            position: 1
+            color: commonStyleHelper.offColorShine
+        }
+    }
+
+    /*!
+        The color that is used for the drop shadow below the checked state
+        indicator.
+
+        \sa uncheckedDropShadowColor
+    */
+    property color checkedDropShadowColor: commonStyleHelper.onColor
+
+    /*!
+        The color that is used for the drop shadow below the checked state
+        indicator.
+
+        \sa checkedDropShadowColor
+    */
+    property color uncheckedDropShadowColor: commonStyleHelper.offColor
+
+    CommonStyleHelper {
+        id: commonStyleHelper
+    }
+
+    background: Item {
+        implicitWidth: __buttonHelper.implicitWidth
+        implicitHeight: __buttonHelper.implicitHeight
+
+        Connections {
+            target: control
+            function onPressedChanged() {
+                backgroundCanvas.requestPaint();
+            }
+
+            function onCheckedChanged() {
+                uncheckedCanvas.requestPaint();
+                checkedCanvas.requestPaint();
+            }
+        }
+
+        Connections {
+            target: circularButtonStyle
+
+            function onCheckedGradientChanged() { checkedCanvas.requestPaint() }
+            function onCheckedDropShadowColorChanged() { checkedCanvas.requestPaint() }
+            function onUncheckedGradientChanged() { uncheckedCanvas.requestPaint() }
+            function onUncheckedDropShadowColorChanged() { uncheckedCanvas.requestPaint() }
+            function onInactiveGradientChanged() {
+                checkedCanvas.requestPaint();
+                uncheckedCanvas.requestPaint();
+            }
+        }
+
+        Connections {
+            target: circularButtonStyle.checkedGradient
+            function onUpdated() { checkedCanvas.requestPaint() }
+        }
+
+        Connections {
+            target: circularButtonStyle.uncheckedGradient
+            function onUpdated() { uncheckedCanvas.requestPaint() }
+        }
+
+        Connections {
+            target: circularButtonStyle.inactiveGradient
+            function onUpdated() {
+                uncheckedCanvas.requestPaint();
+                checkedCanvas.requestPaint();
+            }
+        }
+
+        Canvas {
+            id: backgroundCanvas
+            anchors.fill: parent
+
+            onPaint: {
+                var ctx = getContext("2d");
+                __buttonHelper.paintBackground(ctx);
+            }
+        }
+
+        Canvas {
+            id: uncheckedCanvas
+            anchors.fill: parent
+            anchors.margins: -(__buttonHelper.radius * 3)
+            visible: control.checked
+
+            readonly property real xCenter: width / 2
+            readonly property real yCenter: height / 2
+
+            onPaint: {
+                var ctx = getContext("2d");
+                ctx.reset();
+
+                /* Draw unchecked indicator */
+                ctx.beginPath();
+                ctx.lineWidth = __buttonHelper.outerArcLineWidth - __buttonHelper.innerArcLineWidth;
+                ctx.arc(xCenter, yCenter, __buttonHelper.outerArcRadius + __buttonHelper.innerArcLineWidth / 2,
+                    MathUtils.degToRad(180), MathUtils.degToRad(270), false);
+                var gradient = ctx.createLinearGradient(xCenter, yCenter + __buttonHelper.radius,
+                    xCenter, yCenter - __buttonHelper.radius);
+                var relevantGradient = control.checked ? inactiveGradient : uncheckedGradient;
+                for (var i = 0; i < relevantGradient.stops.length; ++i) {
+                    gradient.addColorStop(relevantGradient.stops[i].position, relevantGradient.stops[i].color);
+                }
+                ctx.strokeStyle = gradient;
+                ctx.stroke();
+            }
+        }
+
+        Canvas {
+            id: checkedCanvas
+            anchors.fill: parent
+            anchors.margins: -(__buttonHelper.radius * 3)
+            visible: !control.checked
+
+            readonly property real xCenter: width / 2
+            readonly property real yCenter: height / 2
+
+            onPaint: {
+                var ctx = getContext("2d");
+                ctx.reset();
+
+                /* Draw checked indicator */
+                ctx.beginPath();
+                ctx.lineWidth = __buttonHelper.outerArcLineWidth - __buttonHelper.innerArcLineWidth;
+                ctx.arc(xCenter, yCenter, __buttonHelper.outerArcRadius + __buttonHelper.innerArcLineWidth / 2,
+                    MathUtils.degToRad(270), MathUtils.degToRad(0), false);
+                var gradient = ctx.createLinearGradient(xCenter, yCenter + __buttonHelper.radius,
+                    xCenter, yCenter - __buttonHelper.radius);
+                var relevantGradient = control.checked ? checkedGradient : inactiveGradient;
+                for (var i = 0; i < relevantGradient.stops.length; ++i) {
+                    gradient.addColorStop(relevantGradient.stops[i].position, relevantGradient.stops[i].color);
+                }
+                ctx.strokeStyle = gradient;
+                ctx.stroke();
+            }
+        }
+
+        DropShadow {
+            id: uncheckedDropShadow
+            anchors.fill: uncheckedCanvas
+            cached: true
+            color: uncheckedDropShadowColor
+            source: uncheckedCanvas
+            visible: !control.checked
+        }
+
+        DropShadow {
+            id: checkedDropShadow
+            anchors.fill: checkedCanvas
+            cached: true
+            color: checkedDropShadowColor
+            source: checkedCanvas
+            visible: control.checked
+        }
+    }
+
+    panel: Item {
+        implicitWidth: backgroundLoader.implicitWidth
+        implicitHeight: backgroundLoader.implicitHeight
+
+        Loader {
+            id: backgroundLoader
+            anchors.fill: parent
+            sourceComponent: background
+        }
+
+        Loader {
+            id: labelLoader
+            sourceComponent: label
+            anchors.fill: parent
+            anchors.leftMargin: padding.left
+            anchors.topMargin: padding.top
+            anchors.rightMargin: padding.right
+            anchors.bottomMargin: padding.bottom
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/ToggleButtonStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Base/ToggleButtonStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..26514fc9f44674683614f89ad7fd9a1a9197fd78
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/ToggleButtonStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/ToolBarStyle.qml b/deployment_test/QtQuick/Controls/Styles/Base/ToolBarStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..8c34efa91391db143ef7a648d10c987aadd76de1
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Base/ToolBarStyle.qml
@@ -0,0 +1,126 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype ToolBarStyle
+    \inqmlmodule QtQuick.Controls.Styles
+    \ingroup controlsstyling
+    \since 5.2
+    \brief Provides custom styling for ToolBar.
+
+    The tool bar can be defined by overriding the background component and
+    setting the content padding.
+
+    Example:
+    \qml
+    ToolBar {
+        style: ToolBarStyle {
+            padding {
+                left: 8
+                right: 8
+                top: 3
+                bottom: 3
+            }
+            background: Rectangle {
+                implicitWidth: 100
+                implicitHeight: 40
+                border.color: "#999"
+                gradient: Gradient {
+                    GradientStop { position: 0 ; color: "#fff" }
+                    GradientStop { position: 1 ; color: "#eee" }
+                }
+            }
+        }
+    }
+    \endqml
+*/
+
+Style {
+
+    /*! The content padding inside the tool bar. */
+    padding {
+        left: 6
+        right: 6
+        top: 3
+        bottom: 3
+    }
+
+    /*! This defines the background of the tool bar. */
+    property Component background: Item {
+        implicitHeight: 40
+        implicitWidth: 200
+        Rectangle {
+            anchors.fill: parent
+            gradient: Gradient{
+                GradientStop{color: "#eee" ; position: 0}
+                GradientStop{color: "#ccc" ; position: 1}
+            }
+            Rectangle {
+                anchors.bottom: parent.bottom
+                width: parent.width
+                height: 1
+                color: "#999"
+            }
+        }
+    }
+
+    /*! This defines the menu button appearance on platforms
+        that have a unified tool bar and menu bar.
+
+        \since QtQuick.Controls.Styles 1.3
+
+        The following read-only properties are available within the scope
+        of the menu button delegate:
+        \table
+            \row \li \b {styleData.pressed} : bool \li Whether the button is pressed.
+            \row \li \b {styleData.hovered} : bool \li Whether the button is hovered.
+            \row \li \b {styleData.activeFocus} : bool \li Whether the button has active focus.
+        \endtable
+    */
+    property Component menuButton: null
+
+    /*! This defines the panel of the tool bar. */
+    property Component panel: Loader {
+        sourceComponent: background
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/ToolBarStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Base/ToolBarStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..5c5bc3f9da042e1b0fd5728ab5706dae714f14c5
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/ToolBarStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/ToolButtonStyle.qml b/deployment_test/QtQuick/Controls/Styles/Base/ToolButtonStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..9387188c967392f8b6b20dda93681414ca803e81
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Base/ToolButtonStyle.qml
@@ -0,0 +1,111 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype ToolButtonStyle
+    \internal
+    \ingroup controlsstyling
+    \inqmlmodule QtQuick.Controls.Styles
+*/
+Style {
+    readonly property ToolButton control: __control
+    property Component panel: Item {
+        id: styleitem
+        implicitWidth: (hasIcon ? icon.width : Math.max(label.implicitWidth + frame.border.left + frame.border.right, 36))
+                                 + (arrow.visible ? 10 : 0)
+        implicitHeight: hasIcon ? icon.height : Math.max(label.implicitHeight, 36)
+
+        readonly property bool hasIcon: icon.status === Image.Ready || icon.status === Image.Loading
+
+        Rectangle {
+            anchors.fill: parent
+            visible: control.pressed || (control.checkable && control.checked)
+            color: "lightgray"
+            radius:4
+            border.color: "#aaa"
+        }
+        Item {
+            anchors.left: parent.left
+            anchors.right: arrow.left
+            anchors.top: parent.top
+            anchors.bottom: parent.bottom
+            clip: true
+            Text {
+                id: label
+                visible: !hasIcon
+                anchors.centerIn: parent
+                text: StyleHelpers.stylizeMnemonics(control.text)
+                renderType: Settings.isMobile ? Text.QtRendering : Text.NativeRendering
+            }
+            Image {
+                id: icon
+                anchors.centerIn: parent
+                source: control.iconSource
+            }
+        }
+
+        BorderImage {
+            id: frame
+            anchors.fill: parent
+            anchors.margins: -1
+            anchors.topMargin: -2
+            anchors.rightMargin: 0
+            source: "images/focusframe.png"
+            visible: control.activeFocus
+            border.left: 4
+            border.right: 4
+            border.top: 4
+            border.bottom: 4
+        }
+
+        Image {
+            id: arrow
+            visible: control.menu !== null
+            source: visible ? "images/arrow-down.png" : ""
+            anchors.verticalCenter: parent.verticalCenter
+            anchors.right: parent.right
+            anchors.rightMargin: visible ? 3 : 0
+            opacity: control.enabled ? 0.7 : 0.5
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/ToolButtonStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Base/ToolButtonStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..1daee201b163faff7866cc20faeceea777e08240
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/ToolButtonStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/TreeViewStyle.qml b/deployment_test/QtQuick/Controls/Styles/Base/TreeViewStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..72825ccc1c0a0b0117f73d7cabe71e33f7903596
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Base/TreeViewStyle.qml
@@ -0,0 +1,68 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.5
+import QtQuick.Controls 1.4
+import QtQuick.Controls.Private 1.0
+
+BasicTableViewStyle {
+    id: root
+
+    readonly property TreeView control: __control
+
+    property int indentation: 16
+
+    property Component branchDelegate: Item {
+        width: indentation
+        height: 16
+        Text {
+            visible: styleData.column === 0 && styleData.hasChildren
+            text: styleData.isExpanded ? "\u25bc" : "\u25b6"
+            color: !control.activeFocus || styleData.selected ? styleData.textColor : "#666"
+            font.pointSize: 10
+            renderType: Text.NativeRendering
+            style: Text.PlainText
+            anchors.centerIn: parent
+            anchors.verticalCenterOffset: 2
+        }
+    }
+
+    __branchDelegate: branchDelegate
+    __indentation: indentation
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/TreeViewStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Base/TreeViewStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..cc409ffe328dc1f001c9023d956e4f9f436b3bb2
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/TreeViewStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/TumblerStyle.qml b/deployment_test/QtQuick/Controls/Styles/Base/TumblerStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..c70aea6c8dffc03b8ff4dfba773a71a2053b29fd
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Base/TumblerStyle.qml
@@ -0,0 +1,334 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Extras module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtGraphicalEffects 1.0
+import QtQuick.Controls 1.4
+import QtQuick.Controls.Styles 1.4
+import QtQuick.Controls.Private 1.0
+import QtQuick.Extras 1.4
+import QtQuick.Extras.Private 1.0
+
+/*!
+    \qmltype TumblerStyle
+    \inqmlmodule QtQuick.Controls.Styles
+    \since 5.5
+    \ingroup controlsstyling
+    \brief Provides custom styling for Tumbler.
+
+    You can create a custom tumbler by replacing the following delegates:
+    \list
+        \li \l background
+        \li \l foreground
+        \li \l separator
+        \li \l delegate
+        \li \l highlight
+        \li \l frame
+    \endlist
+*/
+
+Style {
+    id: tumblerStyle
+
+    padding.left: __padding
+    padding.right: __padding
+    padding.top: __padding
+    padding.bottom: __padding
+
+    /*!
+        The \l Tumbler that this style is attached to.
+    */
+    readonly property Tumbler control: __control
+
+    /*!
+        \obsolete
+
+        This property holds the spacing between each delegate.
+
+        This property has no effect.
+    */
+    property real spacing: 0
+
+    /*!
+        This property holds the amount of items visible in each column.
+
+        This value should be an odd number.
+    */
+    property int visibleItemCount: 3
+
+    /*!
+        \internal
+
+        TODO: how do we handle differing padding values?
+    */
+    readonly property real __padding: Math.max(6, Math.round(TextSingleton.implicitHeight * 0.4))
+    /*! \internal */
+    property real __delegateHeight: 0
+    /*! \internal */
+    property real __separatorWidth: 0
+
+    /*!
+        The background of the tumbler.
+    */
+    property Component background: Rectangle {
+        gradient: Gradient {
+            GradientStop { position: 0.00; color: "#acacac" }
+            GradientStop { position: 0.12; color: "#d5d5d5" }
+            GradientStop { position: 0.24; color: "#e8e8e8" }
+            GradientStop { position: 0.39; color: "#ffffff" }
+            GradientStop { position: 0.61; color: "#ffffff" }
+            GradientStop { position: 0.76; color: "#e8e8e8" }
+            GradientStop { position: 0.88; color: "#d5d5d5" }
+            GradientStop { position: 1.00; color: "#acacac" }
+        }
+    }
+
+    /*!
+        The foreground of the tumbler.
+    */
+    property Component foreground: Item {
+        clip: true
+
+        Rectangle {
+            id: rect
+            anchors.fill: parent
+            // Go one pixel larger than our parent so that we can hide our one pixel frame
+            // that the shadow is created from.
+            anchors.margins: -1
+            color: "transparent"
+            border.color: "black"
+            visible: false
+        }
+
+        DropShadow {
+            anchors.fill: rect
+            source: rect
+            samples: 15
+            spread: 0.45
+            cached: true
+        }
+    }
+
+    /*!
+        The separator between each column.
+
+        The \l {Item::}{implicitWidth} property must be set, and should be the
+        same value for each separator.
+    */
+    property Component separator: Canvas {
+        implicitWidth: Math.max(10, Math.round(TextSingleton.implicitHeight * 0.4))
+
+        onPaint: {
+            var ctx = getContext("2d");
+            ctx.reset();
+
+            ctx.fillStyle = "#11000000";
+            ctx.fillRect(0, 0, width, height);
+            ctx.fillStyle = "#11000000";
+            ctx.fillRect(width * 0.2, 0, width * 0.6, height);
+            ctx.fillStyle = "#66000000";
+            ctx.fillRect(width * 0.4, 0, width * 0.2, height);
+        }
+    }
+
+    /*!
+        The foreground of each column.
+
+        In terms of stacking order, this component is displayed above the
+        delegate and highlight components, but below the foreground component.
+
+        \table
+            \row \li \c {readonly property int} \b styleData.column
+                \li The index of the column that contains this item.
+            \row \li \c {readonly property bool} \b styleData.activeFocus
+                \li \c true if the column that contains this item has active focus.
+
+        \endtable
+
+        Delegates for items in specific columns can be defined using
+        TumblerColumn's \l {TumblerColumn::columnForeground}{columnForeground}
+        property, which will be used instead of this component.
+    */
+    property Component columnForeground
+
+    /*!
+        The frame around the tumbler.
+
+        The \l {Item::}{implicitWidth} property must be set, and should be the
+        same value for each separator.
+    */
+    property Component frame: Canvas {
+        onPaint: {
+            // workaround for QTBUG-40792
+            var ctx = getContext("2d");
+            ctx.reset();
+
+            var cornerRadius = Math.max(2, Math.round(TextSingleton.implicitHeight * 0.2));
+            var outerLineWidth = Math.max(1, Math.round(TextSingleton.implicitHeight * 0.05));
+            var innerLineWidth = __padding - outerLineWidth;
+
+            ctx.save();
+            ctx.lineWidth = outerLineWidth;
+            ctx.beginPath();
+            ctx.roundedRect(0, 0, width, height, cornerRadius, cornerRadius);
+            ctx.roundedRect(outerLineWidth, outerLineWidth, width - outerLineWidth * 2, height - outerLineWidth * 2,
+                cornerRadius - outerLineWidth, cornerRadius - outerLineWidth);
+            ctx.clip();
+
+            ctx.beginPath();
+            ctx.rect(0, 0, width, height);
+            var gradient = ctx.createLinearGradient(width / 2, 0, width / 2, height);
+            gradient.addColorStop(0, "#33b3b3b3");
+            gradient.addColorStop(1, "#4ce6e6e6");
+            ctx.fillStyle = gradient;
+            ctx.fill();
+            ctx.restore();
+
+            // The inner stroke must account for its corner radius.
+            cornerRadius -= outerLineWidth;
+
+            ctx.save();
+            ctx.lineWidth = innerLineWidth;
+            ctx.beginPath();
+            ctx.roundedRect(outerLineWidth, outerLineWidth, width - outerLineWidth * 2, height - outerLineWidth * 2,
+                cornerRadius, cornerRadius);
+            ctx.roundedRect(outerLineWidth + innerLineWidth, outerLineWidth + innerLineWidth,
+                width - outerLineWidth * 2 - innerLineWidth * 2, height - outerLineWidth * 2 - innerLineWidth * 2,
+                cornerRadius - innerLineWidth, cornerRadius - innerLineWidth);
+            ctx.clip();
+
+            ctx.beginPath();
+            ctx.rect(0, 0, width, height);
+            gradient = ctx.createLinearGradient(width / 2, 0, width / 2, height);
+            gradient.addColorStop(0, "#4c666666");
+            gradient.addColorStop(1, "#40cccccc");
+            ctx.fillStyle = gradient;
+            ctx.fill();
+            ctx.restore();
+        }
+    }
+
+    /*!
+        The delegate provides a template defining each item instantiated in the
+        column. Each instance of this component has access to the following properties:
+
+        \table
+            \row \li \c {readonly property int} \b styleData.index
+                \li The index of this delegate in the model.
+            \row \li \c {readonly property int} \b styleData.column
+                \li The index of the column that contains this item.
+            \row \li \c {readonly property real} \b styleData.value
+                \li The value for this delegate from the model.
+            \row \li \c {readonly property bool} \b styleData.current
+                \li \c true if this delegate is the current item.
+            \row \li \c {readonly property real} \b styleData.displacement
+                \li \c A value from \c {-visibleItemCount / 2} to
+                    \c {visibleItemCount / 2} which represents how far away
+                    this item is from being the current item, with \c 0 being
+                    completely current.
+
+                    For example, the item below will be 40% opaque when
+                    it is not the current item, and transition to 100%
+                    opacity when it becomes the current item:
+
+                    \code
+                    delegate: Text {
+                        text: styleData.value
+                        opacity: 0.4 + Math.max(0, 1 - Math.abs(styleData.displacement)) * 0.6
+                    }
+                    \endcode
+            \row \li \c {readonly property bool} \b styleData.activeFocus
+                \li \c true if the column that contains this item has active focus.
+
+        \endtable
+
+        Properties of the model are also available depending upon the type of
+        \l {qml-data-models}{Data Model}.
+
+        Delegates for items in specific columns can be defined using
+        TumblerColumn's \l {TumblerColumn::delegate}{delegate} property, which
+        will be used instead of this delegate.
+
+        The \l {Item::}{implicitHeight} property must be set, and it must be
+        the same for each delegate.
+    */
+    property Component delegate: Item {
+        implicitHeight: (control.height - padding.top - padding.bottom) / tumblerStyle.visibleItemCount
+
+        Text {
+            id: label
+            text: styleData.value
+            color: "#666666"
+            opacity: 0.4 + Math.max(0, 1 - Math.abs(styleData.displacement)) * 0.6
+            font.pixelSize: Math.round(TextSingleton.font.pixelSize * 1.25)
+            anchors.centerIn: parent
+        }
+    }
+
+    /*!
+        The delegate for the highlight of each column.
+
+        Delegates for the highlight of specific columns can be defined using
+        TumblerColumn's \l {TumblerColumn::highlight}{highlight} property,
+        which will be used instead of this delegate.
+
+        Each instance of this component has access to the following properties:
+
+        \table
+            \row \li \c {readonly property int} \b styleData.index
+                \li The index of this column in the tumbler.
+            \row \li \c {readonly property int} \b styleData.columnIndex
+                \li The index of the column that contains this highlight.
+            \row \li \c {readonly property bool} \b styleData.activeFocus
+                \li \c true if the column that contains this highlight has active focus.
+        \endtable
+    */
+    property Component highlight
+
+    /*! \internal */
+    property Component panel: Item {
+        implicitWidth: {
+            var w = (__separatorWidth * (control.columnCount - 1)) + tumblerStyle.padding.left + tumblerStyle.padding.right;
+            for (var i = 0; i < control.columnCount; ++i)
+                w += control.getColumn(i).width;
+            return w;
+        }
+        implicitHeight: TextSingleton.implicitHeight * 10 + tumblerStyle.padding.top + tumblerStyle.padding.bottom
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/TumblerStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Base/TumblerStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..a3a073a5669bf9c948e32c8d5368fa8952af5840
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/TumblerStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/images/arrow-down.png b/deployment_test/QtQuick/Controls/Styles/Base/images/arrow-down.png
new file mode 100644
index 0000000000000000000000000000000000000000..dadd4f817d351422ee65859a721a26a1d4bf2607
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/images/arrow-down.png differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/images/arrow-down@2x.png b/deployment_test/QtQuick/Controls/Styles/Base/images/arrow-down@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..2829fd19670ddc8a3920e9026acf5db82af06c69
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/images/arrow-down@2x.png differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/images/arrow-left.png b/deployment_test/QtQuick/Controls/Styles/Base/images/arrow-left.png
new file mode 100644
index 0000000000000000000000000000000000000000..7693fc72f6b9e872177520959898ef99103b80cc
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/images/arrow-left.png differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/images/arrow-left@2x.png b/deployment_test/QtQuick/Controls/Styles/Base/images/arrow-left@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..0005b3e70c4c90c585338db9f6cf6b94cfb1a59d
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/images/arrow-left@2x.png differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/images/arrow-right.png b/deployment_test/QtQuick/Controls/Styles/Base/images/arrow-right.png
new file mode 100644
index 0000000000000000000000000000000000000000..b5cb2b270e447748235a40d86cdc54c250b4c470
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/images/arrow-right.png differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/images/arrow-right@2x.png b/deployment_test/QtQuick/Controls/Styles/Base/images/arrow-right@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..21b36f7bbc945ea6c3bbd589c65d3dea3e065872
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/images/arrow-right@2x.png differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/images/arrow-up.png b/deployment_test/QtQuick/Controls/Styles/Base/images/arrow-up.png
new file mode 100644
index 0000000000000000000000000000000000000000..d8a8247c7d3d456960eaf411c3c2102981fc0cef
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/images/arrow-up.png differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/images/arrow-up@2x.png b/deployment_test/QtQuick/Controls/Styles/Base/images/arrow-up@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..1bd44d52ffd234cfe013564d8e23442c96255b1a
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/images/arrow-up@2x.png differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/images/button.png b/deployment_test/QtQuick/Controls/Styles/Base/images/button.png
new file mode 100644
index 0000000000000000000000000000000000000000..3793f3ef4beafa273b41ea18f09c60616558104c
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/images/button.png differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/images/button_down.png b/deployment_test/QtQuick/Controls/Styles/Base/images/button_down.png
new file mode 100644
index 0000000000000000000000000000000000000000..7b016fa9f8f70e2f3eccbadfa83e4c0f19f4dbb3
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/images/button_down.png differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/images/check.png b/deployment_test/QtQuick/Controls/Styles/Base/images/check.png
new file mode 100644
index 0000000000000000000000000000000000000000..ad1df9572e99cebd676eaa8db86a66593b2f5345
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/images/check.png differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/images/check@2x.png b/deployment_test/QtQuick/Controls/Styles/Base/images/check@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..3eb4ae77dbe1eebf443419828964a2706d8b820b
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/images/check@2x.png differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/images/editbox.png b/deployment_test/QtQuick/Controls/Styles/Base/images/editbox.png
new file mode 100644
index 0000000000000000000000000000000000000000..f0e6ee4365a3a2f8de552aa372db16b302636a53
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/images/editbox.png differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/images/focusframe.png b/deployment_test/QtQuick/Controls/Styles/Base/images/focusframe.png
new file mode 100644
index 0000000000000000000000000000000000000000..aad56612deff244ba00cdd5347d27948f95c7776
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/images/focusframe.png differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/images/groupbox.png b/deployment_test/QtQuick/Controls/Styles/Base/images/groupbox.png
new file mode 100644
index 0000000000000000000000000000000000000000..680e926a18afa3b2120eb1025a4ddf002cac2686
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/images/groupbox.png differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/images/header.png b/deployment_test/QtQuick/Controls/Styles/Base/images/header.png
new file mode 100644
index 0000000000000000000000000000000000000000..aaf8f99ed55df7a219bca9654b550316fa5426f3
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/images/header.png differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/images/knob.png b/deployment_test/QtQuick/Controls/Styles/Base/images/knob.png
new file mode 100644
index 0000000000000000000000000000000000000000..9a948fd8cbf667e802d7eae231464cfcba3c1a16
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/images/knob.png differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/images/leftanglearrow.png b/deployment_test/QtQuick/Controls/Styles/Base/images/leftanglearrow.png
new file mode 100644
index 0000000000000000000000000000000000000000..1e479a3d8cdcb5725c7bd19ebda0407de6b56b55
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/images/leftanglearrow.png differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/images/needle.png b/deployment_test/QtQuick/Controls/Styles/Base/images/needle.png
new file mode 100644
index 0000000000000000000000000000000000000000..316dad71bc4e5d5bbf6eec0ba7d9ef1ab5d3a092
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/images/needle.png differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/images/progress-indeterminate.png b/deployment_test/QtQuick/Controls/Styles/Base/images/progress-indeterminate.png
new file mode 100644
index 0000000000000000000000000000000000000000..2ff41b451b36182dd668db3ff1041e98371da835
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/images/progress-indeterminate.png differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/images/rightanglearrow.png b/deployment_test/QtQuick/Controls/Styles/Base/images/rightanglearrow.png
new file mode 100644
index 0000000000000000000000000000000000000000..52f1a2414ee47cdedc58dba3e868bdcfcbc6c4a5
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/images/rightanglearrow.png differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/images/scrollbar-handle-horizontal.png b/deployment_test/QtQuick/Controls/Styles/Base/images/scrollbar-handle-horizontal.png
new file mode 100644
index 0000000000000000000000000000000000000000..67f582d8fa1058d287090dfbde47efbc081cc746
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/images/scrollbar-handle-horizontal.png differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/images/scrollbar-handle-transient.png b/deployment_test/QtQuick/Controls/Styles/Base/images/scrollbar-handle-transient.png
new file mode 100644
index 0000000000000000000000000000000000000000..34e7dd6a8cf20d92a2fcc2d47928365140e326c3
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/images/scrollbar-handle-transient.png differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/images/scrollbar-handle-vertical.png b/deployment_test/QtQuick/Controls/Styles/Base/images/scrollbar-handle-vertical.png
new file mode 100644
index 0000000000000000000000000000000000000000..280dac50777d6e32e4e436bacfd0ed487cceaea2
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/images/scrollbar-handle-vertical.png differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/images/slider-groove.png b/deployment_test/QtQuick/Controls/Styles/Base/images/slider-groove.png
new file mode 100644
index 0000000000000000000000000000000000000000..a9d059b7c8c6fec10477c44f40523259277e7fa6
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/images/slider-groove.png differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/images/slider-handle.png b/deployment_test/QtQuick/Controls/Styles/Base/images/slider-handle.png
new file mode 100644
index 0000000000000000000000000000000000000000..0d4ee9c5131e3f07f9905214a228a45dc4997a35
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/images/slider-handle.png differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/images/spinner_large.png b/deployment_test/QtQuick/Controls/Styles/Base/images/spinner_large.png
new file mode 100644
index 0000000000000000000000000000000000000000..8e6a773850065a880b9d2530e22b9b266c23212f
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/images/spinner_large.png differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/images/spinner_medium.png b/deployment_test/QtQuick/Controls/Styles/Base/images/spinner_medium.png
new file mode 100644
index 0000000000000000000000000000000000000000..48a24d58823b4bdee4eb6418fe5f789dac698da7
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/images/spinner_medium.png differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/images/spinner_small.png b/deployment_test/QtQuick/Controls/Styles/Base/images/spinner_small.png
new file mode 100644
index 0000000000000000000000000000000000000000..c3e86dc6bfed1985fb4ba3e1d8b5d5bd1ad51beb
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/images/spinner_small.png differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/images/tab.png b/deployment_test/QtQuick/Controls/Styles/Base/images/tab.png
new file mode 100644
index 0000000000000000000000000000000000000000..ce116cc6a10fe00104a217fc293e2bab37ca1605
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/images/tab.png differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Base/images/tab_selected.png b/deployment_test/QtQuick/Controls/Styles/Base/images/tab_selected.png
new file mode 100644
index 0000000000000000000000000000000000000000..e0cb16a6acbaa6a591a360b4a6a40196b2d87a70
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Base/images/tab_selected.png differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/ApplicationWindowStyle.qml b/deployment_test/QtQuick/Controls/Styles/Desktop/ApplicationWindowStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..455cafb9882e66d7a5107a8ffae83661fdaa6e3d
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Desktop/ApplicationWindowStyle.qml
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick.Controls.Styles 1.3
+
+ApplicationWindowStyle { }
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/ApplicationWindowStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Desktop/ApplicationWindowStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..2c56326f519713bedc36492bfa1cc658926c4979
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Desktop/ApplicationWindowStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/BusyIndicatorStyle.qml b/deployment_test/QtQuick/Controls/Styles/Desktop/BusyIndicatorStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..b73729d76dadc62a040d412fac217559836549c5
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Desktop/BusyIndicatorStyle.qml
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick.Controls.Styles 1.1
+
+BusyIndicatorStyle { }
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/BusyIndicatorStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Desktop/BusyIndicatorStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..373da7a38964c3cc5232d5515fec96179f90602e
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Desktop/BusyIndicatorStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/ButtonStyle.qml b/deployment_test/QtQuick/Controls/Styles/Desktop/ButtonStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..21fc28b35d64be258481ba626a40ce6584bfff6e
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Desktop/ButtonStyle.qml
@@ -0,0 +1,62 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+Style {
+    property Component panel: StyleItem {
+        id: styleitem
+        elementType: "button"
+        sunken: control.pressed || (control.checkable && control.checked)
+        raised: !(control.pressed || (control.checkable && control.checked))
+        hover: control.hovered
+        text: control.iconSource === "" ? "" : control.text
+        hasFocus: control.activeFocus
+        hints: control.styleHints
+        // If no icon, let the style do the drawing
+        activeControl: control.isDefault ? "default" : "f"
+
+        properties: {
+            "icon": control.__iconAction.__icon,
+            "menu": control.menu
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/ButtonStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Desktop/ButtonStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..84f2cea0d0038ea50aa296af50fc431934399ac4
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Desktop/ButtonStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/CalendarStyle.qml b/deployment_test/QtQuick/Controls/Styles/Desktop/CalendarStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..ec22f7755bf246b6554826376d63180f10d2f042
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Desktop/CalendarStyle.qml
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick.Controls.Styles 1.1
+
+CalendarStyle {}
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/CalendarStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Desktop/CalendarStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..fc74dcd92dd27ee3d7ecd2caf853a2e8105bc03a
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Desktop/CalendarStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/CheckBoxStyle.qml b/deployment_test/QtQuick/Controls/Styles/Desktop/CheckBoxStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..7ed6869950e03c46cc53eb3da7c837628bfb0274
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Desktop/CheckBoxStyle.qml
@@ -0,0 +1,91 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+Style {
+    property Component panel: Item {
+        anchors.fill: parent
+
+        implicitWidth: styleitem.implicitWidth
+        implicitHeight: styleitem.implicitHeight
+        baselineOffset: styleitem.baselineOffset
+        StyleItem {
+            id: styleitem
+            elementType: "checkbox"
+            sunken: control.pressed
+            on: control.checked || control.pressed
+            hover: control.hovered
+            enabled: control.enabled
+            hasFocus: control.activeFocus && styleitem.style == "mac"
+            hints: control.styleHints
+            properties: {"partiallyChecked": (control.checkedState === Qt.PartiallyChecked) }
+            contentHeight: textitem.implicitHeight
+            contentWidth: Math.ceil(textitem.implicitWidth) + 4
+            property int indicatorWidth: pixelMetric("indicatorwidth") + (macStyle ? 2 : 4)
+            property bool macStyle: (style === "mac")
+
+            Text {
+                id: textitem
+                text: control.text
+                anchors.left: parent.left
+                anchors.leftMargin: parent.indicatorWidth
+                anchors.verticalCenter: parent.verticalCenter
+                anchors.verticalCenterOffset: parent.macStyle ? 1 : 0
+                anchors.right: parent.right
+                renderType: Text.NativeRendering
+                elide: Text.ElideRight
+                enabled: control.enabled
+                color: SystemPaletteSingleton.windowText(control.enabled)
+                StyleItem {
+                    elementType: "focusrect"
+                    anchors.margins: -1
+                    anchors.leftMargin: -2
+                    anchors.top: parent.top
+                    anchors.left: parent.left
+                    anchors.bottom: parent.bottom
+                    width: textitem.implicitWidth + 3
+                    visible: control.activeFocus
+                }
+            }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/CheckBoxStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Desktop/CheckBoxStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..51973ebfc698265408cade0de06a4abbdf0e937f
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Desktop/CheckBoxStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/ComboBoxStyle.qml b/deployment_test/QtQuick/Controls/Styles/Desktop/ComboBoxStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..cd5ce47db555510cd3199ea24b4650f18648cd27
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Desktop/ComboBoxStyle.qml
@@ -0,0 +1,127 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Window 2.1
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+import "." as Desktop
+
+Style {
+    readonly property ComboBox control: __control
+    property int renderType: Text.NativeRendering
+    padding { top: 4 ; left: 6 ; right: 6 ; bottom:4 }
+    property Component panel: Item {
+        property bool popup: !!styleItem.styleHint("comboboxpopup")
+        property color textColor: SystemPaletteSingleton.text(control.enabled)
+        property color selectionColor: SystemPaletteSingleton.highlight(control.enabled)
+        property color selectedTextColor: SystemPaletteSingleton.highlightedText(control.enabled)
+        property int dropDownButtonWidth: 24
+
+        implicitWidth: 125
+        implicitHeight: styleItem.implicitHeight
+        baselineOffset: styleItem.baselineOffset
+        anchors.fill: parent
+        StyleItem {
+            id: styleItem
+
+            height: parent.height
+            width: parent.width
+            elementType: "combobox"
+            sunken: control.pressed
+            raised: !sunken
+            hover: control.hovered
+            enabled: control.enabled
+            // The style makes sure the text rendering won't overlap the decoration.
+            // In that case, 35 pixels margin in this case looks good enough. Worst
+            // case, the ellipsis will be truncated (2nd worst, not visible at all).
+            text: elidedText(control.currentText, Text.ElideRight, parent.width - 35)
+            hasFocus: control.activeFocus
+            // contentHeight as in QComboBox
+            contentHeight: Math.max(Math.ceil(textHeight("")), 14) + 2
+
+            hints: control.styleHints
+            properties: {
+                "popup": control.__popup,
+                "editable" : control.editable
+            }
+        }
+    }
+
+    property Component __popupStyle: MenuStyle {
+        __menuItemType: "comboboxitem"
+    }
+
+    property Component __dropDownStyle: Style {
+        id: dropDownStyleRoot
+        property int __maxPopupHeight: 600
+        property int submenuOverlap: 0
+        property int submenuPopupDelay: 0
+
+        property Component frame: StyleItem {
+            elementType: "frame"
+            Component.onCompleted: {
+                var defaultFrameWidth = pixelMetric("defaultframewidth")
+                dropDownStyleRoot.padding.left = defaultFrameWidth
+                dropDownStyleRoot.padding.right = defaultFrameWidth
+                dropDownStyleRoot.padding.top = defaultFrameWidth
+                dropDownStyleRoot.padding.bottom = defaultFrameWidth
+            }
+        }
+
+        property Component menuItemPanel: StyleItem {
+            elementType: "itemrow"
+            selected: styleData.selected
+
+            implicitWidth: textItem.implicitWidth
+            implicitHeight: textItem.implicitHeight
+
+            StyleItem {
+                id: textItem
+                elementType: "item"
+                contentWidth: textWidth(text)
+                contentHeight: textHeight(text)
+                text: styleData.text
+                selected: parent ? parent.selected : false
+            }
+        }
+
+        property Component __scrollerStyle: Desktop.ScrollViewStyle { }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/ComboBoxStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Desktop/ComboBoxStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..2d6ed8a29721cae9dad2d376ae9b37959139cdce
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Desktop/ComboBoxStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/FocusFrameStyle.qml b/deployment_test/QtQuick/Controls/Styles/Desktop/FocusFrameStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..59f52e604948ad6599c697826914472e8fe57b50
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Desktop/FocusFrameStyle.qml
@@ -0,0 +1,55 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype FocusFrameStyle
+    \internal
+    \inqmlmodule QtQuick.Controls.Styles
+*/
+StyleItem {
+    property int margin: -3
+    anchors.fill: parent
+    elementType: "focusframe"
+}
+
+
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/FocusFrameStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Desktop/FocusFrameStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..8fd3f9f96829f5832728e2969932fc503aaba248
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Desktop/FocusFrameStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/GroupBoxStyle.qml b/deployment_test/QtQuick/Controls/Styles/Desktop/GroupBoxStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..b3128933618272a7ed162929a72951ddce7a2e74
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Desktop/GroupBoxStyle.qml
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+
+Style {
+    readonly property GroupBox control: __control
+
+    property var __style: StyleItem { id: style }
+    property int titleHeight: 18
+
+    Component.onCompleted: {
+        var stylename = __style.style
+        if (stylename.indexOf("windows") > -1)
+            titleHeight = 9
+    }
+
+    padding {
+        top: Math.round(Settings.dpiScaleFactor * (control.title.length > 0 || control.checkable ? titleHeight : 0) + (style.style == "mac" ? 9 : 6))
+        left: Math.round(Settings.dpiScaleFactor * 8)
+        right: Math.round(Settings.dpiScaleFactor * 8)
+        bottom: Math.round(Settings.dpiScaleFactor * 7 + (style.style.indexOf("windows") > -1 ? 2 : 0))
+    }
+
+    property Component panel: StyleItem {
+        anchors.fill: parent
+        id: styleitem
+        elementType: "groupbox"
+        text: control.title
+        on: control.checked
+        hasFocus: control.__checkbox.activeFocus
+        activeControl: control.checkable ? "checkbox" : ""
+        properties: { "checkable" : control.checkable , "sunken" : !control.flat}
+        border {top: 32 ; bottom: 8}
+        Accessible.role: Accessible.Grouping
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/GroupBoxStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Desktop/GroupBoxStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..04b579908b7525cd894e8ba15bbea4cabe8dfebc
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Desktop/GroupBoxStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/MenuBarStyle.qml b/deployment_test/QtQuick/Controls/Styles/Desktop/MenuBarStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..8e517c8abe9343f2d36a47c230833ad8e4d65a42
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Desktop/MenuBarStyle.qml
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+import "." as Desktop
+
+Style {
+    id: styleRoot
+
+    property Component background: StyleItem {
+        elementType: "menubar"
+
+        Component.onCompleted: {
+            styleRoot.padding.left = pixelMetric("menubarhmargin") + pixelMetric("menubarpanelwidth")
+            styleRoot.padding.right = pixelMetric("menubarhmargin") + pixelMetric("menubarpanelwidth")
+            styleRoot.padding.top = pixelMetric("menubarvmargin") + pixelMetric("menubarpanelwidth")
+            styleRoot.padding.bottom = pixelMetric("menubarvmargin") + pixelMetric("menubarpanelwidth")
+        }
+    }
+
+    property Component itemDelegate: StyleItem {
+        elementType: "menubaritem"
+
+        text: styleData.text
+        property string plainText: StyleHelpers.removeMnemonics(text)
+        contentWidth: textWidth(plainText)
+        contentHeight: textHeight(plainText)
+        width: implicitWidth
+
+        enabled: styleData.enabled
+        sunken: styleData.open
+        selected: (parent && styleData.selected) || sunken
+
+        hints: { "showUnderlined": styleData.underlineMnemonic }
+    }
+
+    property Component menuStyle: Desktop.MenuStyle { }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/MenuBarStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Desktop/MenuBarStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..c2d86be348dfcca349ad7c3b1af874546eff6a6f
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Desktop/MenuBarStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/MenuStyle.qml b/deployment_test/QtQuick/Controls/Styles/Desktop/MenuStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..282860ae91c88a9935f0694915f620738bf98c31
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Desktop/MenuStyle.qml
@@ -0,0 +1,117 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQml 2.14 as Qml
+import QtQuick 2.2
+import QtQuick.Window 2.1
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+Style {
+    id: styleRoot
+
+    property string __menuItemType: "menuitem"
+
+    property int submenuOverlap: 0
+    property int submenuPopupDelay: 0
+    property int __maxPopupHeight: 0
+
+    property Component frame: StyleItem {
+        elementType: "menu"
+
+        Rectangle {
+            visible: anchors.margins > 0
+            anchors {
+                fill: parent
+                margins: pixelMetric("menupanelwidth")
+            }
+            color: SystemPaletteSingleton.window(control.enabled)
+        }
+
+        Component.onCompleted: {
+            var menuHMargin = pixelMetric("menuhmargin")
+            var menuVMargin = pixelMetric("menuvmargin")
+            var menuPanelWidth = pixelMetric("menupanelwidth")
+            styleRoot.padding.left = menuHMargin + menuPanelWidth
+            styleRoot.padding.right = menuHMargin + menuPanelWidth
+            styleRoot.padding.top = menuVMargin + menuPanelWidth
+            styleRoot.padding.bottom = menuVMargin + menuPanelWidth
+            styleRoot.submenuOverlap = 2 * menuPanelWidth
+            styleRoot.submenuPopupDelay = styleHint("submenupopupdelay")
+        }
+
+        // ### The Screen attached property can only be set on an Item,
+        // ### and will get its values only when put on a Window.
+        readonly property int desktopAvailableHeight: Screen.desktopAvailableHeight
+        Qml.Binding {
+            target: styleRoot
+            property: "__maxPopupHeight"
+            value: desktopAvailableHeight * 0.99
+            restoreMode: Binding.RestoreBinding
+        }
+    }
+
+    property Component menuItemPanel: StyleItem {
+        elementType: __menuItemType
+
+        text: styleData.text
+        property string textAndShorcut: text + (styleData.shortcut ? "\t" + styleData.shortcut : "")
+        contentWidth: textWidth(textAndShorcut)
+        contentHeight: textHeight(textAndShorcut)
+
+        enabled: styleData.enabled
+        selected: styleData.selected
+        on: styleData.checkable && styleData.checked
+
+        hints: { "showUnderlined": styleData.underlineMnemonic }
+
+        properties: {
+            "checkable": styleData.checkable,
+            "exclusive": styleData.exclusive,
+            "shortcut": styleData.shortcut,
+            "type": styleData.type,
+            "scrollerDirection": styleData.scrollerDirection,
+            "icon": !!__menuItem && __menuItem.__icon
+        }
+    }
+
+    property Component scrollIndicator: menuItemPanel
+
+    property Component __scrollerStyle: null
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/MenuStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Desktop/MenuStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..e1c94ea4d22d2d42091a2549ca359107d52abd2b
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Desktop/MenuStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/ProgressBarStyle.qml b/deployment_test/QtQuick/Controls/Styles/Desktop/ProgressBarStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..aa44b1ae0b35b7c7abbfc30d1f97898a89af12f6
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Desktop/ProgressBarStyle.qml
@@ -0,0 +1,61 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+Style {
+    property Component panel: StyleItem {
+        anchors.fill: parent
+        elementType: "progressbar"
+        // XXX: since desktop uses int instead of real, the progressbar
+        // range [0..1] must be stretched to a good precision
+        property int factor : 1000
+        property int decimals: 3
+        value:   indeterminate ? 0 : control.value.toFixed(decimals) * factor // does indeterminate value need to be 1 on windows?
+        minimum: indeterminate ? 0 : control.minimumValue.toFixed(decimals) * factor
+        maximum: indeterminate ? 0 : control.maximumValue.toFixed(decimals) * factor
+        enabled: control.enabled
+        horizontal: control.orientation === Qt.Horizontal
+        hints: control.styleHints
+        contentWidth: horizontal ? 200 : 23
+        contentHeight: horizontal ? 23 : 200
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/ProgressBarStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Desktop/ProgressBarStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..239933b1ecb91b7dc2b768cffbbe6a2a4c3591af
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Desktop/ProgressBarStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/RadioButtonStyle.qml b/deployment_test/QtQuick/Controls/Styles/Desktop/RadioButtonStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..c2173878e74ad7696981deb87f16751b5858ba4c
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Desktop/RadioButtonStyle.qml
@@ -0,0 +1,94 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+Style {
+    readonly property RadioButton control: __control
+    property Component panel: Item {
+        anchors.fill: parent
+
+        implicitWidth:  styleitem.implicitWidth
+        implicitHeight: styleitem.implicitHeight
+        baselineOffset: styleitem.baselineOffset
+
+        StyleItem {
+            id: styleitem
+            elementType: "radiobutton"
+            anchors.verticalCenter: parent.verticalCenter
+            anchors.verticalCenterOffset: macStyle ? -1 : 0
+            sunken: control.pressed
+            on: control.checked || control.pressed
+            hover: control.hovered
+            enabled: control.enabled
+            hasFocus: control.activeFocus && styleitem.style == "mac"
+            hints: control.styleHints
+            contentHeight: textitem.implicitHeight
+            contentWidth: Math.ceil(textitem.implicitWidth) + 4
+            property int indicatorWidth: pixelMetric("indicatorwidth") + (macStyle ? 2 : 4)
+            property bool macStyle: (style === "mac")
+
+            Text {
+                id: textitem
+                text: control.text
+                anchors.left: parent.left
+                anchors.leftMargin: parent.indicatorWidth
+                anchors.verticalCenter: parent.verticalCenter
+                anchors.verticalCenterOffset: parent.macStyle ? 2 : 0
+                anchors.right: parent.right
+                renderType: Text.NativeRendering
+                elide: Text.ElideRight
+                enabled: control.enabled
+                color: SystemPaletteSingleton.windowText(control.enabled)
+                StyleItem {
+                    elementType: "focusrect"
+                    anchors.margins: -1
+                    anchors.leftMargin: -2
+                    anchors.top: parent.top
+                    anchors.left: parent.left
+                    anchors.bottom: parent.bottom
+                    width: textitem.implicitWidth + 3
+                    visible: control.activeFocus
+                }
+            }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/RadioButtonStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Desktop/RadioButtonStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..dfcf472284d86921714bd1fc4a04430d808ccafa
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Desktop/RadioButtonStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/RowItemSingleton.qml b/deployment_test/QtQuick/Controls/Styles/Desktop/RowItemSingleton.qml
new file mode 100644
index 0000000000000000000000000000000000000000..5fd6e3222c64e389f9e372bc28c598f6fd9fd4d1
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Desktop/RowItemSingleton.qml
@@ -0,0 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+pragma Singleton
+import QtQuick.Controls.Private 1.0
+StyleItem {
+    elementType: "itemrow"
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/RowItemSingleton.qmlc b/deployment_test/QtQuick/Controls/Styles/Desktop/RowItemSingleton.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..abc54eba926b20b6078da5b1f2d92924699cd19a
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Desktop/RowItemSingleton.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/ScrollViewStyle.qml b/deployment_test/QtQuick/Controls/Styles/Desktop/ScrollViewStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..d8677384a45ddf029787d75d2841ad83989056ab
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Desktop/ScrollViewStyle.qml
@@ -0,0 +1,99 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+Style {
+    id: root
+
+    padding {
+        property int frameWidth: __styleitem.pixelMetric("defaultframewidth")
+        left: frameWidth
+        top: frameWidth
+        bottom: frameWidth
+        right: frameWidth
+    }
+
+    property StyleItem __styleitem: StyleItem { elementType: "frame" }
+
+    property Component frame: StyleItem {
+        id: styleitem
+        elementType: "frame"
+        sunken: true
+        visible: control.frameVisible
+        textureHeight: 64
+        textureWidth: 64
+        border {
+            top: 16
+            left: 16
+            right: 16
+            bottom: 16
+        }
+    }
+
+    property Component corner: StyleItem { elementType: "scrollareacorner" }
+
+    readonly property bool __externalScrollBars: __styleitem.styleHint("externalScrollBars")
+    readonly property int __scrollBarSpacing: __styleitem.pixelMetric("scrollbarspacing")
+    readonly property bool scrollToClickedPosition: __styleitem.styleHint("scrollToClickPosition") !== 0
+    property bool transientScrollBars: false
+
+    readonly property int __wheelScrollLines: __styleitem.styleHint("wheelScrollLines")
+
+    property Component __scrollbar: StyleItem {
+        anchors.fill:parent
+        elementType: "scrollbar"
+        hover: activeControl != "none"
+        activeControl: "none"
+        sunken: __styleData.upPressed | __styleData.downPressed | __styleData.handlePressed
+        minimum: __control.minimumValue
+        maximum: __control.maximumValue
+        value: __control.value
+        horizontal: __styleData.horizontal
+        enabled: __control.enabled
+
+        implicitWidth: horizontal ? 200 : pixelMetric("scrollbarExtent")
+        implicitHeight: horizontal ? pixelMetric("scrollbarExtent") : 200
+
+        onIsTransientChanged: root.transientScrollBars = isTransient
+    }
+
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/ScrollViewStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Desktop/ScrollViewStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..f122c1fe9fc38eef13c83e90fbbf50eff7310be6
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Desktop/ScrollViewStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/SliderStyle.qml b/deployment_test/QtQuick/Controls/Styles/Desktop/SliderStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..bba9d54d939aefe63e91b1671f06845eec895b1a
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Desktop/SliderStyle.qml
@@ -0,0 +1,67 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+Style {
+    readonly property Item control: __control
+    property Component panel: StyleItem {
+        elementType: "slider"
+        sunken: control.pressed
+        implicitWidth: 200
+        contentHeight: horizontal ? 22 : 200
+        contentWidth: horizontal ? 200 : 22
+
+        maximum: control.maximumValue*100
+        minimum: control.minimumValue*100
+        step: control.stepSize*100
+        value: control.__handlePos*100
+        horizontal: control.orientation === Qt.Horizontal
+        enabled: control.enabled
+        hasFocus: control.activeFocus
+        hover: control.hovered
+        hints: control.styleHints
+        activeControl: control.tickmarksEnabled ? "ticks" : ""
+        property int handleWidth: 15
+        property int handleHeight: 15
+    }
+    padding { top: 0 ; left: 0 ; right: 0 ; bottom: 0 }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/SliderStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Desktop/SliderStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..22ed785756d169bfb3ad70361d843f7bae4b9460
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Desktop/SliderStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/SpinBoxStyle.qml b/deployment_test/QtQuick/Controls/Styles/Desktop/SpinBoxStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..50e13ab44b4c87181ea964571831faedf2eb08b6
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Desktop/SpinBoxStyle.qml
@@ -0,0 +1,128 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+Style {
+    readonly property SpinBox control: __control
+
+    padding {
+       top: control.__panel ? control.__panel.topPadding + (styleitem.style === "mac" ? 2 : 0) : 0
+       left: control.__panel ? control.__panel.leftPadding : 0
+       right: control.__panel ? control.__panel.rightPadding : 0
+       bottom: control.__panel ? control.__panel.bottomPadding : 0
+   }
+    StyleItem {id: styleitem ; visible: false}
+
+    property int renderType: Text.NativeRendering
+
+    property Component panel: Item {
+        id: style
+
+        property rect upRect
+        property rect downRect
+
+        property int horizontalAlignment: Qt.platform.os === "osx" ? Qt.AlignRight : Qt.AlignLeft
+        property int verticalAlignment: Qt.AlignVCenter
+
+        property alias font: styleitem.font
+
+        property color foregroundColor: SystemPaletteSingleton.text(control.enabled)
+        property color backgroundColor: SystemPaletteSingleton.base(control.enabled)
+        property color selectionColor: SystemPaletteSingleton.highlight(control.enabled)
+        property color selectedTextColor: SystemPaletteSingleton.highlightedText(control.enabled)
+
+        property int topPadding: edit.anchors.topMargin
+        property int leftPadding: 3 + edit.anchors.leftMargin
+        property int rightPadding: 3 + edit.anchors.rightMargin
+        property int bottomPadding: edit.anchors.bottomMargin
+
+        width: 100
+        height: styleitem.implicitHeight
+
+        implicitWidth: 2 + styleitem.implicitWidth
+        implicitHeight: styleitem.implicitHeight
+        baselineOffset: styleitem.baselineOffset
+
+        Item {
+            id: edit
+            anchors.fill: parent
+            FocusFrame {
+                anchors.fill: parent
+                focusMargin:-6
+                visible: spinbox.activeFocus && styleitem.styleHint("focuswidget")
+            }
+        }
+
+        function updateRect() {
+            style.upRect = styleitem.subControlRect("up");
+            style.downRect = styleitem.subControlRect("down");
+            var inputRect = styleitem.subControlRect("edit");
+            edit.anchors.topMargin = inputRect.y
+            edit.anchors.leftMargin = inputRect.x
+            edit.anchors.rightMargin = style.width - inputRect.width - edit.anchors.leftMargin
+            edit.anchors.bottomMargin = style.height - inputRect.height - edit.anchors.topMargin
+        }
+
+        Component.onCompleted: updateRect()
+        onWidthChanged: updateRect()
+        onHeightChanged: updateRect()
+
+        StyleItem {
+            id: styleitem
+            elementType: "spinbox"
+            anchors.fill: parent
+            sunken: (styleData.downEnabled && styleData.downPressed) || (styleData.upEnabled && styleData.upPressed)
+            hover: control.hovered
+            hints: control.styleHints
+            hasFocus: control.activeFocus
+            enabled: control.enabled
+            value: (styleData.upPressed ? 1 : 0)           |
+                   (styleData.downPressed ? 1<<1 : 0) |
+                   (styleData.upEnabled ? (1<<2) : 0)      |
+                   (styleData.downEnabled ? (1<<3) : 0)
+            contentWidth: styleData.contentWidth
+            contentHeight: styleData.contentHeight
+            textureHeight: implicitHeight
+            border {top: 6 ; bottom: 6}
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/SpinBoxStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Desktop/SpinBoxStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..5168139fcaf14ad64dd01f9d9276daeaa1afcd73
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Desktop/SpinBoxStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/StatusBarStyle.qml b/deployment_test/QtQuick/Controls/Styles/Desktop/StatusBarStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..744cff35416ce134bb379001857a94a818d1cbb0
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Desktop/StatusBarStyle.qml
@@ -0,0 +1,64 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype StatusBarStyle
+    \internal
+    \inqmlmodule QtQuick.Controls.Styles
+*/
+Style {
+
+    padding.left: 4
+    padding.right: 4
+    padding.top: 3
+    padding.bottom: 2
+
+    property Component panel: StyleItem {
+        implicitHeight: 16
+        implicitWidth: 200
+        anchors.fill: parent
+        elementType: "statusbar"
+        textureWidth: 64
+        border {left: 16 ; right: 16}
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/StatusBarStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Desktop/StatusBarStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..fc7ebc9466ed13d62b8d51f3553d631bab12b797
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Desktop/StatusBarStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/SwitchStyle.qml b/deployment_test/QtQuick/Controls/Styles/Desktop/SwitchStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..719b633169edfd6bb98d3b6412457632a57632ec
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Desktop/SwitchStyle.qml
@@ -0,0 +1,46 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+import QtQuick.Controls.Styles 1.1
+
+SwitchStyle {
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/SwitchStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Desktop/SwitchStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..6cb34cfc6ccff4b880bc3e4e542f66ccfe01e748
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Desktop/SwitchStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/TabViewStyle.qml b/deployment_test/QtQuick/Controls/Styles/Desktop/TabViewStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..c571e2207554743070d181e1f8a677628e0e4118
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Desktop/TabViewStyle.qml
@@ -0,0 +1,116 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+import QtQuick.Controls.Styles 1.1
+Style {
+    id: root
+
+    property bool tabsMovable: false
+    property int tabsAlignment: __barstyle.styleHint("tabbaralignment") === "center" ? Qt.AlignHCenter : Qt.AlignLeft;
+    property int tabOverlap: __barstyle.pixelMetric("taboverlap");
+    property int frameOverlap: __barstyle.pixelMetric("tabbaseoverlap");
+
+    property StyleItem __barstyle: StyleItem {
+        elementType: "tab"
+        properties: { "tabposition" : (control.tabPosition === Qt.TopEdge ? "Top" : "Bottom") }
+        visible: false
+    }
+
+    property Component frame: StyleItem {
+        id: styleitem
+        anchors.fill: parent
+        anchors.topMargin: 1//stack.baseOverlap
+        z: style == "oxygen" ? 1 : 0
+        elementType: "tabframe"
+        value: tabbarItem && tabsVisible && tabbarItem.tab(currentIndex) ? tabbarItem.tab(currentIndex).x : 0
+        minimum: tabbarItem && tabsVisible && tabbarItem.tab(currentIndex) ? tabbarItem.tab(currentIndex).width : 0
+        maximum: tabbarItem && tabsVisible ? tabbarItem.width : width
+        properties: { "selectedTabRect" : tabbarItem.__selectedTabRect, "orientation" : control.tabPosition }
+        hints: control.styleHints
+        Component.onCompleted: {
+            stack.frameWidth = styleitem.pixelMetric("defaultframewidth");
+            stack.style = style;
+        }
+        border{
+            top: 16
+            bottom: 16
+        }
+        textureHeight: 64
+    }
+
+    property Component tab: Item {
+        id: item
+        property string tabpos: control.count === 1 ? "only" : index === 0 ? "beginning" : index === control.count - 1 ? "end" : "middle"
+        property string selectedpos: styleData.nextSelected ? "next" : styleData.previousSelected ? "previous" : ""
+        property string orientation: control.tabPosition === Qt.TopEdge ? "Top" : "Bottom"
+        property int tabHSpace: __barstyle.pixelMetric("tabhspace");
+        property int tabVSpace: __barstyle.pixelMetric("tabvspace");
+        property int totalOverlap: tabOverlap * (control.count - 1)
+        property real maxTabWidth: control.count > 0 ? (control.width + totalOverlap) / control.count : 0
+        implicitWidth: Math.min(maxTabWidth, Math.max(50, styleitem.textWidth(styleData.title)) + tabHSpace + 2)
+        implicitHeight: Math.max(styleitem.font.pixelSize + tabVSpace + 6, 0)
+
+        StyleItem {
+            id: styleitem
+
+            elementType: "tab"
+            paintMargins: style === "mac" ? 0 : 2
+
+            anchors.fill: parent
+            anchors.topMargin: style === "mac" ? 2 : 0
+            anchors.rightMargin: -paintMargins
+            anchors.bottomMargin: -1
+            anchors.leftMargin: -paintMargins + (style === "mac" && selected ? -1 : 0)
+            properties: { "hasFrame" : true, "orientation": orientation, "tabpos": tabpos, "selectedpos": selectedpos }
+            hints: control.styleHints
+
+            enabled: styleData.enabled
+            selected: styleData.selected
+            text: elidedText(styleData.title, tabbarItem.elide, item.width - item.tabHSpace)
+            hover: styleData.hovered
+            hasFocus: tabbarItem.activeFocus && selected
+        }
+    }
+
+    property Component leftCorner: null
+    property Component rightCorner: null
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/TabViewStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Desktop/TabViewStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..fd82b88903b832c996f7fbe3c3c496d583c406c8
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Desktop/TabViewStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/TableViewStyle.qml b/deployment_test/QtQuick/Controls/Styles/Desktop/TableViewStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..6c008b30bf5f6229c3cdff30760fea5bc391f565
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Desktop/TableViewStyle.qml
@@ -0,0 +1,116 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+import "."
+
+ScrollViewStyle {
+    id: root
+
+    readonly property BasicTableView control: __control
+    property int __indentation: 8
+    property bool activateItemOnSingleClick: __styleitem.styleHint("activateItemOnSingleClick")
+    property color textColor: __styleitem.textColor
+    property color backgroundColor: SystemPaletteSingleton.base(control.enabled)
+    property color highlightedTextColor: __styleitem.highlightedTextColor
+
+    property StyleItem __styleitem: StyleItem{
+        property color textColor: styleHint("textColor")
+        property color highlightedTextColor: styleHint("highlightedTextColor")
+        elementType: "item"
+        visible: false
+        active: control.activeFocus
+        onActiveChanged: {
+            highlightedTextColor = styleHint("highlightedTextColor")
+            textColor = styleHint("textColor")
+        }
+    }
+
+    property Component headerDelegate: StyleItem {
+        elementType: "header"
+        activeControl: itemSort
+        raised: true
+        sunken: styleData.pressed
+        text: styleData.value
+        hover: styleData.containsMouse
+        hints: control.styleHints
+        properties: {"headerpos": headerPosition, "textalignment": styleData.textAlignment}
+        property string itemSort:  (control.sortIndicatorVisible && styleData.column === control.sortIndicatorColumn) ? (control.sortIndicatorOrder == Qt.AscendingOrder ? "up" : "down") : "";
+        property string headerPosition: !styleData.resizable && control.columnCount === 1 ? "only" :
+                                        !styleData.resizable && styleData.column === control.columnCount-1 ? "end" :
+                                        styleData.column === 0 ? "beginning" : ""
+    }
+
+    property Component rowDelegate: BorderImage {
+        visible: styleData.selected || styleData.alternate
+        source: "image://__tablerow/" + (styleData.alternate ? "alternate_" : "")
+                + (styleData.selected ? "selected_" : "")
+                + (control.activeFocus ? "active" : "")
+        height: Math.max(16, RowItemSingleton.implicitHeight)
+        border.left: 4 ; border.right: 4
+    }
+
+    property Component itemDelegate: Item {
+        height: Math.max(16, label.implicitHeight)
+        property int implicitWidth: label.implicitWidth + 16
+
+        Text {
+            id: label
+            objectName: "label"
+            width: parent.width
+            font: __styleitem.font
+            anchors.left: parent.left
+            anchors.right: parent.right
+            anchors.leftMargin: styleData.hasOwnProperty("depth") && styleData.column === 0 ? 0 :
+                                horizontalAlignment === Text.AlignRight ? 1 : 8
+            anchors.rightMargin: (styleData.hasOwnProperty("depth") && styleData.column === 0)
+                                 || horizontalAlignment !== Text.AlignRight ? 1 : 8
+            horizontalAlignment: styleData.textAlignment
+            anchors.verticalCenter: parent.verticalCenter
+            elide: styleData.elideMode
+            text: styleData.value !== undefined ? styleData.value : ""
+            color: styleData.textColor
+            renderType: Text.NativeRendering
+        }
+    }
+
+    property Component __branchDelegate: null
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/TableViewStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Desktop/TableViewStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..ef696ee9c1e85a13220493a5eac9fdf9c3247878
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Desktop/TableViewStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/TextAreaStyle.qml b/deployment_test/QtQuick/Controls/Styles/Desktop/TextAreaStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..8a39f8ab42caeb507cd457aadd2c278a64acd84d
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Desktop/TextAreaStyle.qml
@@ -0,0 +1,59 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+ScrollViewStyle {
+    property font font: __styleitem.font
+    property color textColor: SystemPaletteSingleton.text(control.enabled)
+    property color selectionColor: SystemPaletteSingleton.highlight(control.enabled)
+    property color selectedTextColor: SystemPaletteSingleton.highlightedText(control.enabled)
+    property color backgroundColor: control.backgroundVisible ? SystemPaletteSingleton.base(control.enabled) : "transparent"
+
+    property StyleItem __styleitem: StyleItem{
+        elementType: "edit"
+        visible: false
+        active: control.activeFocus
+    }
+
+    property int renderType: Text.NativeRendering
+    property real textMargin: 4
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/TextAreaStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Desktop/TextAreaStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..9d9ae51e58e0f38cb4f99d9fe77d46faa2307a58
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Desktop/TextAreaStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/TextFieldStyle.qml b/deployment_test/QtQuick/Controls/Styles/Desktop/TextFieldStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..fd58d3446d5a6837d899dd1ab7f4446ed5f82919
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Desktop/TextFieldStyle.qml
@@ -0,0 +1,81 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+Style {
+    property int renderType: Text.NativeRendering
+
+    property Component panel: StyleItem {
+        id: textfieldstyle
+        elementType: "edit"
+        anchors.fill: parent
+
+        sunken: true
+        hasFocus: control.activeFocus
+        hover: hovered
+        hints: control.styleHints
+
+        property color textColor: SystemPaletteSingleton.text(control.enabled)
+        property color placeholderTextColor: "darkGray"
+        property color selectionColor: SystemPaletteSingleton.highlight(control.enabled)
+        property color selectedTextColor: SystemPaletteSingleton.highlightedText(control.enabled)
+
+
+        property bool rounded: !!hints["rounded"]
+        property int topMargin: style === "mac" ? 3 : 2
+        property int leftMargin: rounded ? 12 : 4
+        property int rightMargin: leftMargin
+        property int bottomMargin: 2
+
+        contentWidth: 100
+        // Form QLineEdit::sizeHint
+        contentHeight: Math.max(control.__contentHeight, 16)
+
+        FocusFrame {
+            anchors.fill: parent
+            visible: textfield.activeFocus && textfieldstyle.styleHint("focuswidget") && !rounded
+        }
+        textureHeight: implicitHeight
+        textureWidth: 32
+        border {top: 8 ; bottom: 8 ; left: 8 ; right: 8}
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/TextFieldStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Desktop/TextFieldStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..798a64c76a6601125426738b0fbd10ee756fa51e
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Desktop/TextFieldStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/ToolBarStyle.qml b/deployment_test/QtQuick/Controls/Styles/Desktop/ToolBarStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..fe1840ab80f1a2f1248bdfb4f13a3ffe29b8c1d3
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Desktop/ToolBarStyle.qml
@@ -0,0 +1,65 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype StatusBarStyle
+    \internal
+    \inqmlmodule QtQuick.Controls.Styles
+*/
+Style {
+
+    padding.left: 6
+    padding.right: 6
+    padding.top: 1
+    padding.bottom: style.style === "mac" ? 1 : style.style === "fusion" ? 3 : 2
+
+    StyleItem { id: style ; visible: false}
+
+    property Component panel: StyleItem {
+        id: toolbar
+        anchors.fill: parent
+        elementType: "toolbar"
+        textureWidth: 64
+        border {left: 16 ; right: 16}
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/ToolBarStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Desktop/ToolBarStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..904f9fe6436e1fe19b431aa3471d73c4848b9db8
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Desktop/ToolBarStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/ToolButtonStyle.qml b/deployment_test/QtQuick/Controls/Styles/Desktop/ToolButtonStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..a4e15465a6d5e436b32e8e5e8cabfce7bbe46bee
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Desktop/ToolButtonStyle.qml
@@ -0,0 +1,64 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+Style {
+    property Component panel: StyleItem {
+        id: styleitem
+
+        anchors.fill: parent
+        elementType: "toolbutton"
+        on: control.checkable && control.checked
+        sunken: control.pressed
+        raised: !(control.checkable && control.checked) && control.hovered
+        hover: control.hovered
+        hasFocus: control.activeFocus
+        hints: control.styleHints
+        text: control.text
+
+        properties: {
+            "icon": control.__iconAction.__icon,
+            "position": control.__position,
+            "menu" : control.menu !== null
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/ToolButtonStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Desktop/ToolButtonStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..81644110c8ec303bd8bb70fe70b48b720fd6bd75
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Desktop/ToolButtonStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/TreeViewStyle.qml b/deployment_test/QtQuick/Controls/Styles/Desktop/TreeViewStyle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..3ec6073af87903a942ea5760692b1b775c97b4f0
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Desktop/TreeViewStyle.qml
@@ -0,0 +1,70 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.4
+import QtQuick.Controls.Private 1.0
+import "." as Desktop
+
+Desktop.TableViewStyle {
+    id: root
+
+    __indentation: 12
+
+    __branchDelegate: StyleItem {
+        id: si
+        elementType: "itembranchindicator"
+        properties: {
+            "hasChildren": styleData.hasChildren,
+            "hasSibling": styleData.hasSibling && !styleData.isExpanded
+        }
+        on: styleData.isExpanded
+        selected: styleData.selected
+        hasFocus: __styleitem.active
+
+        Component.onCompleted: {
+            root.__indentation = si.pixelMetric("treeviewindentation")
+            implicitWidth = root.__indentation
+            implicitHeight = implicitWidth
+            var rect = si.subControlRect("dummy");
+            width = rect.width
+            height = rect.height
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/TreeViewStyle.qmlc b/deployment_test/QtQuick/Controls/Styles/Desktop/TreeViewStyle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..ca18c85259c62992d17655273226548ab4e77c52
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Desktop/TreeViewStyle.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Styles/Desktop/qmldir b/deployment_test/QtQuick/Controls/Styles/Desktop/qmldir
new file mode 100644
index 0000000000000000000000000000000000000000..1b6918713ccc5363436b346fdff84d7389647541
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Desktop/qmldir
@@ -0,0 +1,2 @@
+singleton RowItemSingleton 1.0 RowItemSingleton.qml
+designersupported
diff --git a/deployment_test/QtQuick/Controls/Styles/Flat/plugins.qmltypes b/deployment_test/QtQuick/Controls/Styles/Flat/plugins.qmltypes
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/deployment_test/QtQuick/Controls/Styles/Flat/qmldir b/deployment_test/QtQuick/Controls/Styles/Flat/qmldir
new file mode 100644
index 0000000000000000000000000000000000000000..2fe49220e17f67e54e3531a548ca6d535789444a
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/Flat/qmldir
@@ -0,0 +1,4 @@
+module QtQuick.Controls.Styles.Flat
+plugin qtquickextrasflatplugin
+classname QtQuickExtrasStylesPlugin
+depends QtQml 2.14
diff --git a/deployment_test/QtQuick/Controls/Styles/Flat/qtquickextrasflatplugin.dll b/deployment_test/QtQuick/Controls/Styles/Flat/qtquickextrasflatplugin.dll
new file mode 100644
index 0000000000000000000000000000000000000000..c617d962fc263fd54ec4b5b653f2602a0415adea
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Styles/Flat/qtquickextrasflatplugin.dll differ
diff --git a/deployment_test/QtQuick/Controls/Styles/qmldir b/deployment_test/QtQuick/Controls/Styles/qmldir
new file mode 100644
index 0000000000000000000000000000000000000000..4b2f9844d131854cd30277b9c69475c8ecd61723
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Styles/qmldir
@@ -0,0 +1,38 @@
+module QtQuick.Controls.Styles
+ApplicationWindowStyle 1.3 Base/ApplicationWindowStyle.qml
+ButtonStyle 1.0 Base/ButtonStyle.qml
+BusyIndicatorStyle 1.1 Base/BusyIndicatorStyle.qml
+CalendarStyle 1.1 Base/CalendarStyle.qml
+CheckBoxStyle 1.0 Base/CheckBoxStyle.qml
+ComboBoxStyle 1.0 Base/ComboBoxStyle.qml
+MenuStyle 1.2 Base/MenuStyle.qml
+MenuBarStyle 1.2 Base/MenuBarStyle.qml
+ProgressBarStyle 1.0 Base/ProgressBarStyle.qml
+RadioButtonStyle 1.0 Base/RadioButtonStyle.qml
+ScrollViewStyle 1.0 Base/ScrollViewStyle.qml
+SliderStyle 1.0 Base/SliderStyle.qml
+SpinBoxStyle 1.1 Base/SpinBoxStyle.qml
+SwitchStyle 1.1 Base/SwitchStyle.qml
+TabViewStyle 1.0 Base/TabViewStyle.qml
+TableViewStyle 1.0 Base/TableViewStyle.qml
+TreeViewStyle 1.4 Base/TreeViewStyle.qml
+TextAreaStyle 1.1 Base/TextAreaStyle.qml
+TextFieldStyle 1.0 Base/TextFieldStyle.qml
+ToolBarStyle 1.0 Base/ToolBarStyle.qml
+StatusBarStyle 1.0 Base/StatusBarStyle.qml
+
+CircularGaugeStyle 1.0 Base/CircularGaugeStyle.qml
+CircularButtonStyle 1.0 Base/CircularButtonStyle.qml
+CircularTickmarkLabelStyle 1.0 Base/CircularTickmarkLabelStyle.qml
+CommonStyleHelper 1.0 Base/CommonStyleHelper.qml
+DelayButtonStyle 1.0 Base/DelayButtonStyle.qml
+DialStyle 1.1 Base/DialStyle.qml
+GaugeStyle 1.0 Base/GaugeStyle.qml
+HandleStyle 1.0 Base/HandleStyle.qml
+HandleStyleHelper 1.0 Base/HandleStyleHelper.qml
+PieMenuStyle 1.3 Base/PieMenuStyle.qml
+StatusIndicatorStyle 1.1 Base/StatusIndicatorStyle.qml
+ToggleButtonStyle 1.0 Base/ToggleButtonStyle.qml
+TumblerStyle 1.2 Base/TumblerStyle.qml
+
+designersupported
diff --git a/deployment_test/QtQuick/Controls/Switch.qml b/deployment_test/QtQuick/Controls/Switch.qml
new file mode 100644
index 0000000000000000000000000000000000000000..b33f7d00b30ff033eeb9e0b6371d8378ec550803
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Switch.qml
@@ -0,0 +1,166 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype Switch
+    \inqmlmodule QtQuick.Controls
+    \since 5.2
+    \ingroup controls
+    \brief A switch.
+
+    \image switch.png
+    \caption On and Off states of a Switch.
+
+    A Switch is a toggle button that can be switched on (checked) or off
+    (unchecked). Switches are typically used to represent features in an
+    application that can be enabled or disabled without affecting others.
+
+    On mobile platforms, switches are commonly used to enable or disable
+    features.
+
+    \qml
+    Column {
+        Switch { checked: true }
+        Switch { checked: false }
+    }
+    \endqml
+
+    You can create a custom appearance for a Switch by
+    assigning a \l {SwitchStyle}.
+*/
+
+Control {
+    id: root
+
+    /*!
+        This property is \c true if the control is checked.
+        The default value is \c false.
+    */
+    property bool checked: false
+
+    /*!
+        \qmlproperty bool Switch::pressed
+        \since QtQuick.Controls 1.3
+
+        This property is \c true when the control is pressed.
+    */
+    readonly property alias pressed: internal.pressed
+
+    /*!
+        This property is \c true if the control takes the focus when it is
+        pressed; \l{QQuickItem::forceActiveFocus()}{forceActiveFocus()} will be
+        called on the control.
+    */
+    property bool activeFocusOnPress: false
+
+    /*!
+        This property stores the ExclusiveGroup that the control belongs to.
+    */
+    property ExclusiveGroup exclusiveGroup: null
+
+    /*!
+        \since QtQuick.Controls 1.3
+
+        This signal is emitted when the control is clicked.
+    */
+    signal clicked
+
+    Keys.onPressed: {
+        if (event.key === Qt.Key_Space && !event.isAutoRepeat)
+            checked = !checked;
+    }
+
+    /*! \internal */
+    onExclusiveGroupChanged: {
+        if (exclusiveGroup)
+            exclusiveGroup.bindCheckable(root)
+    }
+
+    MouseArea {
+        id: internal
+
+        property Item handle: __panel.__handle
+        property int min: __panel.min
+        property int max: __panel.max
+        focus: true
+        anchors.fill: parent
+        drag.threshold: 0
+        drag.target: handle
+        drag.axis: Drag.XAxis
+        drag.minimumX: min
+        drag.maximumX: max
+
+        onPressed: {
+            if (activeFocusOnPress)
+                root.forceActiveFocus()
+        }
+
+        onReleased: {
+            if (drag.active) {
+                checked = (handle.x < max/2) ? false : true;
+                internal.handle.x = checked ? internal.max : internal.min
+            } else {
+                checked = (handle.x === max) ? false : true
+            }
+        }
+
+        onClicked: root.clicked()
+    }
+
+    onCheckedChanged:  {
+        if (internal.handle)
+            internal.handle.x = checked ? internal.max : internal.min
+    }
+
+    activeFocusOnTab: true
+    Accessible.role: Accessible.CheckBox
+    Accessible.name: "switch"
+
+    /*!
+        The style that should be applied to the switch. Custom style
+        components can be created with:
+
+        \codeline Qt.createComponent("path/to/style.qml", switchId);
+    */
+    style: Settings.styleComponent(Settings.style, "SwitchStyle.qml", root)
+}
diff --git a/deployment_test/QtQuick/Controls/Switch.qmlc b/deployment_test/QtQuick/Controls/Switch.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..feb134de3eee4a05dc2f9204131bc892a2fe9485
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Switch.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/Tab.qml b/deployment_test/QtQuick/Controls/Tab.qml
new file mode 100644
index 0000000000000000000000000000000000000000..657d389c1c6380e7635bd479bdc084c987eafeb5
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/Tab.qml
@@ -0,0 +1,86 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+
+/*!
+    \qmltype Tab
+    \inqmlmodule QtQuick.Controls
+    \since 5.1
+    \ingroup viewaddons
+    \ingroup controls
+    \brief Tab represents the content of a tab in a TabView.
+
+    A Tab item inherits from Loader and provides a similar
+    API.
+
+    Tabs are lazily loaded; only tabs that have been made current (for example,
+    by clicking on them) will have valid content. You can force loading of tabs
+    by setting the active property to \c true:
+
+    \code
+    Tab {
+        active: true
+    }
+    \endcode
+
+    \sa TabView
+*/
+
+Loader {
+    id: tab
+    anchors.fill: parent
+
+    /*! This property holds the title of the tab. */
+    property string title
+
+    /*! \internal */
+    property bool __inserted: false
+
+    Accessible.role: Accessible.LayeredPane
+    active: false
+    visible: false
+
+    activeFocusOnTab: false
+
+    onVisibleChanged: if (visible) active = true
+
+    /*! \internal */
+    default property alias component: tab.sourceComponent
+}
diff --git a/deployment_test/QtQuick/Controls/Tab.qmlc b/deployment_test/QtQuick/Controls/Tab.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..f820b75ee42bd77bd5bdf6728b04b303a29ea72c
Binary files /dev/null and b/deployment_test/QtQuick/Controls/Tab.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/TabView.qml b/deployment_test/QtQuick/Controls/TabView.qml
new file mode 100644
index 0000000000000000000000000000000000000000..2579636fb1d560deaefd7d72a125eb082d0b6a46
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/TabView.qml
@@ -0,0 +1,329 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype TabView
+    \inqmlmodule QtQuick.Controls
+    \since 5.1
+    \ingroup views
+    \ingroup controls
+    \brief A control that allows the user to select one of multiple stacked items.
+
+    \image tabview.png
+
+    TabView provides tab-based navigation model for your application.
+    For example, the following snippet uses tabs to present rectangles of
+    different color on each tab page:
+
+    \qml
+    TabView {
+        Tab {
+            title: "Red"
+            Rectangle { color: "red" }
+        }
+        Tab {
+            title: "Blue"
+            Rectangle { color: "blue" }
+        }
+        Tab {
+            title: "Green"
+            Rectangle { color: "green" }
+        }
+    }
+    \endqml
+
+    \note You can create a custom appearance for a TabView by
+    assigning a \l {TabViewStyle}.
+
+    \l Tab represents the content of a tab in a TabView.
+*/
+
+FocusScope {
+    id: root
+
+    implicitWidth: 240
+    implicitHeight: 150
+
+    /*! The current tab index */
+    property int currentIndex: 0
+
+    /*! The current tab count */
+    readonly property int count: __tabs.count
+
+    /*! The visibility of the tab frame around contents */
+    property bool frameVisible: true
+
+    /*! The visibility of the tab bar */
+    property bool tabsVisible: true
+
+    /*!
+        \qmlproperty enumeration TabView::tabPosition
+
+        \list
+        \li Qt.TopEdge (default)
+        \li Qt.BottomEdge
+        \endlist
+    */
+    property int tabPosition: Qt.TopEdge
+
+    /*!
+        \qmlproperty Item TabView::contentItem
+        \since QtQuick.Controls 1.3
+
+        This property holds the content item of the tab view.
+
+        Tabs declared as children of a TabView are automatically parented to the TabView's contentItem.
+     */
+    readonly property alias contentItem: stack
+
+    /*! \internal */
+    default property alias data: stack.data
+
+    /*!
+        \qmlmethod Tab TabView::addTab(string title, Component component)
+
+        Adds a new tab with the given \a title and an optional \a component.
+
+        Returns the newly added tab.
+    */
+    function addTab(title, component) {
+        return insertTab(__tabs.count, title, component)
+    }
+
+    /*!
+        \qmlmethod Tab TabView::insertTab(int index, string title, Component component)
+
+        Inserts a new tab at \a index, with the given \a title and
+        an optional \a component.
+
+        Returns the newly added tab.
+    */
+    function insertTab(index, title, component) {
+        var tab = tabcomp.createObject()
+        tab.sourceComponent = component
+        tab.title = title
+        // insert at appropriate index first, then set the parent to
+        // avoid onChildrenChanged appending it to the end of the list
+        __tabs.insert(index, {tab: tab})
+        tab.__inserted = true
+        tab.parent = stack
+        __didInsertIndex(index)
+        __setOpacities()
+        return tab
+    }
+
+    /*! \qmlmethod void TabView::removeTab(int index)
+        Removes and destroys a tab at the given \a index. */
+    function removeTab(index) {
+        var tab = __tabs.get(index).tab
+        __willRemoveIndex(index)
+        __tabs.remove(index, 1)
+        tab.destroy()
+        __setOpacities()
+    }
+
+    /*! \qmlmethod void TabView::moveTab(int from, int to)
+        Moves a tab \a from index \a to another. */
+    function moveTab(from, to) {
+        __tabs.move(from, to, 1)
+
+        if (currentIndex == from) {
+            currentIndex = to
+        } else {
+            var start = Math.min(from, to)
+            var end = Math.max(from, to)
+            if (currentIndex >= start && currentIndex <= end) {
+                if (from < to)
+                    --currentIndex
+                else
+                    ++currentIndex
+            }
+        }
+    }
+
+    /*! \qmlmethod Tab TabView::getTab(int index)
+        Returns the \l Tab item at \a index. */
+    function getTab(index) {
+        var data = __tabs.get(index)
+        return data && data.tab
+    }
+
+    /*! \internal */
+    property ListModel __tabs: ListModel { }
+
+    /*! \internal */
+    property Component style: Settings.styleComponent(Settings.style, "TabViewStyle.qml", root)
+
+    /*! \internal */
+    property var __styleItem: loader.item
+
+    onCurrentIndexChanged: __setOpacities()
+
+    /*! \internal */
+    function __willRemoveIndex(index) {
+        // Make sure currentIndex will points to the same tab after the removal.
+        // Also activate the next index if the current index is being removed,
+        // except when it's both the current and last index.
+        if (count > 1 && (currentIndex > index || currentIndex == count -1))
+            --currentIndex
+    }
+    function __didInsertIndex(index) {
+        // Make sure currentIndex points to the same tab as before the insertion.
+        if (count > 1 && currentIndex >= index)
+            currentIndex++
+    }
+
+    function __setOpacities() {
+        for (var i = 0; i < __tabs.count; ++i) {
+            var child = __tabs.get(i).tab
+            child.visible = (i == currentIndex ? true : false)
+        }
+    }
+
+    activeFocusOnTab: false
+
+    Component {
+        id: tabcomp
+        Tab {}
+    }
+
+    TabBar {
+        id: tabbarItem
+        objectName: "tabbar"
+        tabView: root
+        style: loader.item
+        anchors.top: parent.top
+        anchors.left: root.left
+        anchors.right: root.right
+    }
+
+    Loader {
+        id: loader
+        z: tabbarItem.z - 1
+        sourceComponent: style
+        property var __control: root
+    }
+
+    Loader {
+        id: frameLoader
+        z: tabbarItem.z - 1
+
+        anchors.fill: parent
+        anchors.topMargin: tabPosition === Qt.TopEdge && tabbarItem && tabsVisible  ? Math.max(0, tabbarItem.height - baseOverlap) : 0
+        anchors.bottomMargin: tabPosition === Qt.BottomEdge && tabbarItem && tabsVisible ? Math.max(0, tabbarItem.height -baseOverlap) : 0
+        sourceComponent: frameVisible && loader.item ? loader.item.frame : null
+
+        property int baseOverlap: __styleItem ? __styleItem.frameOverlap : 0
+
+        Item {
+            id: stack
+
+            anchors.fill: parent
+            anchors.margins: (frameVisible ? frameWidth : 0)
+            anchors.topMargin: anchors.margins + (style =="mac" ? 6 : 0)
+            anchors.bottomMargin: anchors.margins
+
+            property int frameWidth
+            property string style
+            property bool completed: false
+
+            Component.onCompleted: {
+                addTabs(stack.children)
+                completed = true
+            }
+
+            onChildrenChanged: {
+                if (completed)
+                    stack.addTabs(stack.children)
+            }
+
+            function addTabs(tabs) {
+                var tabAdded = false
+                for (var i = 0 ; i < tabs.length ; ++i) {
+                    var tab = tabs[i]
+                    if (!tab.__inserted && tab.Accessible.role === Accessible.LayeredPane) {
+                        tab.__inserted = true
+                        // reparent tabs created dynamically by createObject(tabView)
+                        tab.parent = stack
+                        // a dynamically added tab should also get automatically removed when destructed
+                        if (completed)
+                            tab.Component.onDestruction.connect(stack.onDynamicTabDestroyed.bind(tab))
+                        __tabs.append({tab: tab})
+                        tabAdded = true
+                    }
+                }
+                if (tabAdded)
+                    __setOpacities()
+            }
+
+            function onDynamicTabDestroyed() {
+                for (var i = 0; i < __tabs.count; ++i) {
+                    if (__tabs.get(i).tab === this) {
+                        __willRemoveIndex(i)
+                        __tabs.remove(i, 1)
+                        __setOpacities()
+                        break
+                    }
+                }
+            }
+        }
+        onLoaded: { item.z = -1 }
+    }
+
+    onChildrenChanged: stack.addTabs(root.children)
+
+    states: [
+        State {
+            name: "Bottom"
+            when: tabPosition === Qt.BottomEdge && tabbarItem != undefined
+            PropertyChanges {
+                target: tabbarItem
+                anchors.topMargin: -frameLoader.baseOverlap
+            }
+            AnchorChanges {
+                target: tabbarItem
+                anchors.top: frameLoader.bottom
+            }
+        }
+    ]
+}
diff --git a/deployment_test/QtQuick/Controls/TabView.qmlc b/deployment_test/QtQuick/Controls/TabView.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..d74d7b65c4ddd7c526998b435fe71d0c13f05b88
Binary files /dev/null and b/deployment_test/QtQuick/Controls/TabView.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/TableView.qml b/deployment_test/QtQuick/Controls/TableView.qml
new file mode 100644
index 0000000000000000000000000000000000000000..1dbdafd7947243eb8c91b721bf229c612b0c9fc6
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/TableView.qml
@@ -0,0 +1,319 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.3
+import QtQuick.Controls.Private 1.0
+import QtQuick.Controls.Styles 1.1
+import QtQuick.Window 2.1
+
+BasicTableView {
+    id: root
+
+    property var model
+
+    readonly property int rowCount: __listView.count
+    property alias currentRow: root.__currentRow
+
+    signal activated(int row)
+    signal clicked(int row)
+    signal doubleClicked(int row)
+    signal pressAndHold(int row)
+
+    function positionViewAtRow(row, mode) {
+        __listView.positionViewAtIndex(row, mode)
+    }
+
+    function rowAt(x, y) {
+        var obj = root.mapToItem(__listView.contentItem, x, y)
+        return __listView.indexAt(obj.x, obj.y)
+    }
+
+    readonly property alias selection: selectionObject
+
+    style: Settings.styleComponent(Settings.style, "TableViewStyle.qml", root)
+
+    Accessible.role: Accessible.Table
+
+    // Internal stuff. Do not look
+
+    onModelChanged: selection.clear()
+
+    __viewTypeName: "TableView"
+    __model: model
+
+    __itemDelegateLoader: TableViewItemDelegateLoader {
+        __style: root.__style
+        __itemDelegate: root.itemDelegate
+        __mouseArea: mousearea
+    }
+
+    __mouseArea: MouseArea {
+        id: mousearea
+
+        parent: __listView
+        width: __listView.width
+        height: __listView.height
+        z: -1
+        propagateComposedEvents: true
+        focus: true
+
+        property bool autoincrement: false
+        property bool autodecrement: false
+        property int previousRow: 0
+        property int clickedRow: -1
+        property int dragRow: -1
+        property int firstKeyRow: -1
+        property int pressedRow: -1
+        property int pressedColumn: -1
+
+        TableViewSelection {
+            id: selectionObject
+        }
+
+        function selected(rowIndex) {
+            if (dragRow > -1 && (rowIndex >= clickedRow && rowIndex <= dragRow
+                                 || rowIndex <= clickedRow && rowIndex >= dragRow))
+                return selection.contains(clickedRow)
+
+            return selection.count && selection.contains(rowIndex)
+        }
+
+        onReleased: {
+            pressedRow = -1
+            pressedColumn = -1
+            autoincrement = false
+            autodecrement = false
+            var clickIndex = __listView.indexAt(0, mouseY + __listView.contentY)
+            if (clickIndex > -1) {
+                if (Settings.hasTouchScreen) {
+                    __listView.currentIndex = clickIndex
+                    mouseSelect(clickIndex, mouse.modifiers)
+                }
+                previousRow = clickIndex
+            }
+
+            if (mousearea.dragRow >= 0) {
+                selection.__select(selection.contains(mousearea.clickedRow), mousearea.clickedRow, mousearea.dragRow)
+                mousearea.dragRow = -1
+            }
+        }
+
+        function decrementCurrentIndex() {
+            __listView.decrementCurrentIndexBlocking();
+
+            var newIndex = __listView.indexAt(0, __listView.contentY)
+            if (newIndex !== -1) {
+                if (selectionMode > SelectionMode.SingleSelection)
+                    mousearea.dragRow = newIndex
+                else if (selectionMode === SelectionMode.SingleSelection)
+                    selection.__selectOne(newIndex)
+            }
+        }
+
+        function incrementCurrentIndex() {
+            __listView.incrementCurrentIndexBlocking();
+
+            var newIndex = Math.max(0, __listView.indexAt(0, __listView.height + __listView.contentY))
+            if (newIndex !== -1) {
+                if (selectionMode > SelectionMode.SingleSelection)
+                    mousearea.dragRow = newIndex
+                else if (selectionMode === SelectionMode.SingleSelection)
+                    selection.__selectOne(newIndex)
+            }
+        }
+
+        // Handle vertical scrolling whem dragging mouse outside boundraries
+        Timer {
+            running: mousearea.autoincrement && __verticalScrollBar.visible
+            repeat: true
+            interval: 20
+            onTriggered: mousearea.incrementCurrentIndex()
+        }
+
+        Timer {
+            running: mousearea.autodecrement && __verticalScrollBar.visible
+            repeat: true
+            interval: 20
+            onTriggered: mousearea.decrementCurrentIndex()
+        }
+
+        onPositionChanged: {
+            if (mouseY > __listView.height && pressed) {
+                if (autoincrement) return;
+                autodecrement = false;
+                autoincrement = true;
+            } else if (mouseY < 0 && pressed) {
+                if (autodecrement) return;
+                autoincrement = false;
+                autodecrement = true;
+            } else  {
+                autoincrement = false;
+                autodecrement = false;
+            }
+
+            if (pressed && containsMouse) {
+                pressedRow = Math.max(0, __listView.indexAt(0, mouseY + __listView.contentY))
+                pressedColumn = __listView.columnAt(mouseX)
+                if (!Settings.hasTouchScreen) {
+                    if (pressedRow >= 0 && pressedRow !== currentRow) {
+                        __listView.currentIndex = pressedRow;
+                        if (selectionMode === SelectionMode.SingleSelection) {
+                            selection.__selectOne(pressedRow)
+                        } else if (selectionMode > 1) {
+                            dragRow = pressedRow
+                        }
+                    }
+                }
+            }
+        }
+
+        onClicked: {
+            var clickIndex = __listView.indexAt(0, mouseY + __listView.contentY)
+            if (clickIndex > -1) {
+                if (root.__activateItemOnSingleClick)
+                    root.activated(clickIndex)
+                root.clicked(clickIndex)
+            }
+        }
+
+        onPressed: {
+            pressedRow = __listView.indexAt(0, mouseY + __listView.contentY)
+            pressedColumn = __listView.columnAt(mouseX)
+            __listView.forceActiveFocus()
+            if (pressedRow > -1 && !Settings.hasTouchScreen) {
+                __listView.currentIndex = pressedRow
+                mouseSelect(pressedRow, mouse.modifiers)
+                mousearea.clickedRow = pressedRow
+            }
+        }
+
+        onExited: {
+            mousearea.pressedRow = -1
+            mousearea.pressedColumn = -1
+        }
+
+        onCanceled: {
+            mousearea.pressedRow = -1
+            mousearea.pressedColumn = -1
+        }
+
+        function mouseSelect(index, modifiers) {
+            if (selectionMode) {
+                if (modifiers & Qt.ShiftModifier && (selectionMode === SelectionMode.ExtendedSelection)) {
+                    selection.select(previousRow, index)
+                } else if (selectionMode === SelectionMode.MultiSelection ||
+                           (selectionMode === SelectionMode.ExtendedSelection && modifiers & Qt.ControlModifier)) {
+                    selection.__select(!selection.contains(index) , index)
+                } else {
+                    selection.__selectOne(index)
+                }
+            }
+        }
+
+        onDoubleClicked: {
+            var clickIndex = __listView.indexAt(0, mouseY + __listView.contentY)
+            if (clickIndex > -1) {
+                if (!root.__activateItemOnSingleClick)
+                    root.activated(clickIndex)
+                root.doubleClicked(clickIndex)
+            }
+        }
+
+        onPressAndHold: {
+            var pressIndex = __listView.indexAt(0, mouseY + __listView.contentY)
+            if (pressIndex > -1)
+                root.pressAndHold(pressIndex)
+        }
+
+        // Note:  with boolean preventStealing we are keeping the flickable from
+        // eating our mouse press events
+        preventStealing: !Settings.hasTouchScreen
+
+        function keySelect(shiftPressed, row) {
+            if (row < 0 || row > rowCount - 1)
+                return
+            if (shiftPressed && (selectionMode >= SelectionMode.ExtendedSelection)) {
+                selection.__ranges = new Array()
+                selection.select(mousearea.firstKeyRow, row)
+            } else {
+                selection.__selectOne(row)
+            }
+        }
+
+        Keys.forwardTo: [root]
+
+        Keys.onUpPressed: {
+            event.accepted = __listView.decrementCurrentIndexBlocking()
+            if (selectionMode)
+                keySelect(event.modifiers & Qt.ShiftModifier, currentRow)
+        }
+
+        Keys.onDownPressed: {
+            event.accepted = __listView.incrementCurrentIndexBlocking()
+            if (selectionMode)
+                keySelect(event.modifiers & Qt.ShiftModifier, currentRow)
+        }
+
+        Keys.onPressed: {
+            __listView.scrollIfNeeded(event.key)
+
+            if (event.key === Qt.Key_Shift) {
+                firstKeyRow = currentRow
+            }
+
+            if (event.key === Qt.Key_A && event.modifiers & Qt.ControlModifier) {
+                if (selectionMode > 1)
+                    selection.selectAll()
+            }
+        }
+
+        Keys.onReleased: {
+            if (event.key === Qt.Key_Shift)
+                firstKeyRow = -1
+        }
+
+        Keys.onReturnPressed: {
+            if (currentRow > -1)
+                root.activated(currentRow);
+            else
+                event.accepted = false
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/TableView.qmlc b/deployment_test/QtQuick/Controls/TableView.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..2d88a64ecda8430bd30ac0a551ba9448c3c955b5
Binary files /dev/null and b/deployment_test/QtQuick/Controls/TableView.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/TableViewColumn.qml b/deployment_test/QtQuick/Controls/TableViewColumn.qml
new file mode 100644
index 0000000000000000000000000000000000000000..9fa05b3d938250b1884d02f6112f3180521122d3
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/TableViewColumn.qml
@@ -0,0 +1,173 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+
+/*!
+    \qmltype TableViewColumn
+    \inqmlmodule QtQuick.Controls
+    \since 5.1
+    \ingroup viewitems
+    \ingroup controls
+    \brief Used to define columns in a \l TableView or in a \l TreeView.
+
+    \image tableview.png
+
+    TableViewColumn represents a column within a TableView or a TreeView. It provides
+    properties to decide how the data in that column is presented.
+
+    \qml
+    TableView {
+        TableViewColumn { role: "title"; title: "Title"; width: 100 }
+        TableViewColumn { role: "author"; title: "Author"; width: 200 }
+        model: libraryModel
+    }
+    \endqml
+
+    \sa TableView, TreeView
+*/
+
+QtObject {
+
+    /*! \internal */
+    property Item __view: null
+
+    /*! \internal */
+    property int __index: -1
+
+    /*! The title text of the column. */
+    property string title
+
+    /*! The model \c role of the column. */
+    property string role
+
+    /*! The current width of the column.
+    The default value depends on platform. If only one
+    column is defined, the width expands to the viewport.
+    */
+    property int width: (__view && __view.columnCount === 1) ? __view.viewport.width : 160
+
+    /*! The visible status of the column. */
+    property bool visible: true
+
+    /*! Determines if the column should be resizable.
+    \since QtQuick.Controls 1.1 */
+    property bool resizable: true
+
+    /*! Determines if the column should be movable.
+    The default value is \c true.
+    \note A non-movable column may get indirectly moved if adjacent columns are movable.
+    \since QtQuick.Controls 1.1 */
+    property bool movable: true
+
+    /*! \qmlproperty enumeration TableViewColumn::elideMode
+    The text elide mode of the column.
+    Allowed values are:
+    \list
+        \li Text.ElideNone
+        \li Text.ElideLeft
+        \li Text.ElideMiddle
+        \li Text.ElideRight - the default
+    \endlist
+    \sa {Text::elide}{elide} */
+    property int elideMode: Text.ElideRight
+
+    /*! \qmlproperty enumeration TableViewColumn::horizontalAlignment
+    The horizontal text alignment of the column.
+    Allowed values are:
+    \list
+        \li Text.AlignLeft - the default
+        \li Text.AlignRight
+        \li Text.AlignHCenter
+        \li Text.AlignJustify
+    \endlist
+    \sa {Text::horizontalAlignment}{horizontalAlignment} */
+    property int horizontalAlignment: Text.AlignLeft
+
+    /*! The delegate of the column. This can be used to set the itemDelagate
+    of a \l TableView or \l TreeView for a specific column.
+
+    In the delegate you have access to the following special properties:
+    \list
+    \li  styleData.selected - if the item is currently selected
+    \li  styleData.value - the value or text for this item
+    \li  styleData.textColor - the default text color for an item
+    \li  styleData.row - the index of the row
+    \li  styleData.column - the index of the column
+    \li  styleData.elideMode - the elide mode of the column
+    \li  styleData.textAlignment - the horizontal text alignment of the column
+    \endlist
+    */
+    property Component delegate
+
+    property int accessibleRole: Accessible.ColumnHeader
+
+    /*! \qmlmethod void TableViewColumn::resizeToContents()
+        Resizes the column so that the implicitWidth of the contents on every row will fit.
+        \since QtQuick.Controls 1.2 */
+    function resizeToContents() {
+        var minWidth = 0
+        var listdata = __view.__listView.children[0]
+        for (var i = 0; __index === -1 && i < __view.__columns.length; ++i) {
+            if (__view.__columns[i] === this)
+                __index = i
+        }
+        // ### HACK We don't have direct access to the instantiated item,
+        // so we go spelunking. Each 'item' variable check is annotated
+        // with the expected object it should point to in BasicTableView.
+        for (var row = 0 ; row < listdata.children.length ; ++row) {
+            var item = listdata.children[row] ? listdata.children[row].rowItem : undefined
+            if (item) { // FocusScope { id: rowitem }
+                item = item.children[1]
+                if (item) { // Row { id: itemrow }
+                    item = item.children[__index]
+                    if (item) { // Repeater.delegate a.k.a. __view.__itemDelegateLoader
+                        var indent = __view.__isTreeView && __index === 0 ? item.__itemIndentation : 0
+                        item  = item.item
+                        if (item && item.hasOwnProperty("implicitWidth")) {
+                            minWidth = Math.max(minWidth, item.implicitWidth + indent)
+                        }
+                    }
+                }
+            }
+        }
+        if (minWidth)
+            width = minWidth
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/TableViewColumn.qmlc b/deployment_test/QtQuick/Controls/TableViewColumn.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..3f5bb3bfa39092ad545aac28c9a70a52cf7a0392
Binary files /dev/null and b/deployment_test/QtQuick/Controls/TableViewColumn.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/TextArea.qml b/deployment_test/QtQuick/Controls/TextArea.qml
new file mode 100644
index 0000000000000000000000000000000000000000..d289780e963a8e68125e578559edc16261f615d2
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/TextArea.qml
@@ -0,0 +1,978 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.6
+import QtQuick.Window 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+/*!
+    \qmltype TextArea
+    \inqmlmodule QtQuick.Controls
+    \since 5.1
+    \ingroup controls
+    \brief Displays multiple lines of editable formatted text.
+
+    \image textarea.png
+
+    It can display both plain and rich text. For example:
+
+    \qml
+    TextArea {
+        width: 240
+        text:
+            "Lorem ipsum dolor sit amet, consectetur adipisicing elit, " +
+            "sed do eiusmod tempor incididunt ut labore et dolore magna " +
+            "aliqua. Ut enim ad minim veniam, quis nostrud exercitation " +
+            "ullamco laboris nisi ut aliquip ex ea commodo cosnsequat. ";
+    }
+    \endqml
+
+    Clipboard support is provided by the cut(), copy(), and paste() functions, and the selection can
+    be handled in a traditional "mouse" mechanism by setting selectByMouse, or handled completely
+    from QML by manipulating selectionStart and selectionEnd, or using selectAll() or selectWord().
+
+    You can translate between cursor positions (characters from the start of the document) and pixel
+    points using positionAt() and positionToRectangle().
+
+    You can create a custom appearance for a TextArea by
+    assigning a \l {TextAreaStyle}.
+
+    \sa TextField, TextEdit
+*/
+
+ScrollView {
+    id: area
+
+    /*!
+        \qmlproperty bool TextArea::activeFocusOnPress
+
+        Whether the TextEdit should gain active focus on a mouse press. By default this is
+        set to true.
+    */
+    property alias activeFocusOnPress: edit.activeFocusOnPress
+
+    /*!
+        \qmlproperty url TextArea::baseUrl
+
+        This property specifies a base URL which is used to resolve relative URLs
+        within the text.
+
+        The default value is the url of the QML file instantiating the TextArea item.
+    */
+    property alias baseUrl: edit.baseUrl
+
+    /*!
+        \qmlproperty bool TextArea::canPaste
+
+        Returns true if the TextArea is writable and the content of the clipboard is
+        suitable for pasting into the TextArea.
+    */
+    readonly property alias canPaste: edit.canPaste
+
+    /*!
+        \qmlproperty bool TextArea::canRedo
+
+        Returns true if the TextArea is writable and there are \l {undo}{undone}
+        operations that can be redone.
+    */
+    readonly property alias canRedo: edit.canRedo
+
+    /*!
+        \qmlproperty bool TextArea::canUndo
+
+        Returns true if the TextArea is writable and there are previous operations
+        that can be undone.
+    */
+    readonly property alias canUndo: edit.canUndo
+
+    /*!
+        \qmlproperty color TextArea::textColor
+
+        The text color.
+
+        \qml
+         TextArea { textColor: "orange" }
+        \endqml
+    */
+    property alias textColor: edit.color
+
+    /*!
+        \qmlproperty int TextArea::cursorPosition
+        The position of the cursor in the TextArea.
+    */
+    property alias cursorPosition: edit.cursorPosition
+
+    /*!
+        \qmlproperty rect TextArea::cursorRectangle
+        \since QtQuick.Controls 1.3
+
+        The rectangle where the text cursor is rendered within the text area.
+    */
+    readonly property alias cursorRectangle: edit.cursorRectangle
+
+    /*! \qmlproperty font TextArea::font
+
+        The font of the TextArea.
+    */
+    property alias font: edit.font
+
+    /*!
+        \qmlproperty enumeration TextArea::horizontalAlignment
+
+        Sets the alignment of the text within the TextArea item's width.
+
+        By default, the horizontal text alignment follows the natural alignment of the text,
+        for example, text that is read from left to right will be aligned to the left.
+
+        The valid values for \c horizontalAlignment are:
+        \list
+        \li TextEdit.AlignLeft (Default)
+        \li TextEdit.AlignRight
+        \li TextEdit.AlignHCenter
+        \endlist
+
+        When using the attached property LayoutMirroring::enabled to mirror application
+        layouts, the horizontal alignment of text will also be mirrored. However, the property
+        \c horizontalAlignment will remain unchanged. To query the effective horizontal alignment
+        of TextArea, use the read-only property \c effectiveHorizontalAlignment.
+    */
+    property alias horizontalAlignment: edit.horizontalAlignment
+
+    /*!
+        \qmlproperty enumeration TextArea::effectiveHorizontalAlignment
+
+        Gets the effective horizontal alignment of the text within the TextArea item's width.
+
+        To set/get the default horizontal alignment of TextArea, use the property \c horizontalAlignment.
+
+    */
+    readonly property alias effectiveHorizontalAlignment: edit.effectiveHorizontalAlignment
+
+    /*!
+        \qmlproperty enumeration TextArea::verticalAlignment
+
+        Sets the alignment of the text within the TextArea item's height.
+
+        The valid values for \c verticalAlignment are:
+        \list
+        \li TextEdit.AlignTop
+        \li TextEdit.AlignBottom
+        \li TextEdit.AlignVCenter (Default)
+        \endlist
+    */
+    property alias verticalAlignment: edit.verticalAlignment
+
+    /*!
+        \qmlproperty bool TextArea::inputMethodComposing
+        \since QtQuick.Controls 1.3
+
+        This property holds whether the TextArea has partial text input from an input method.
+
+        While it is composing an input method may rely on mouse or key events from the TextArea
+        to edit or commit the partial text. This property can be used to determine when to disable
+        events handlers that may interfere with the correct operation of an input method.
+    */
+    readonly property bool inputMethodComposing: !!edit.inputMethodComposing
+
+    /*!
+        \qmlproperty enumeration TextArea::inputMethodHints
+
+        Provides hints to the input method about the expected content of the text edit, and how it
+        should operate.
+
+        The value is a bit-wise combination of flags or Qt.ImhNone if no hints are set.
+
+        The default value is \c Qt.ImhNone.
+
+        Flags that alter behavior are:
+
+        \list
+        \li Qt.ImhHiddenText - Characters should be hidden, as is typically used when entering passwords.
+        \li Qt.ImhSensitiveData - Typed text should not be stored by the active input method
+                in any persistent storage like predictive user dictionary.
+        \li Qt.ImhNoAutoUppercase - The input method should not try to automatically switch to upper case
+                when a sentence ends.
+        \li Qt.ImhPreferNumbers - Numbers are preferred (but not required).
+        \li Qt.ImhPreferUppercase - Upper case letters are preferred (but not required).
+        \li Qt.ImhPreferLowercase - Lower case letters are preferred (but not required).
+        \li Qt.ImhNoPredictiveText - Do not use predictive text (i.e. dictionary lookup) while typing.
+
+        \li Qt.ImhDate - The text editor functions as a date field.
+        \li Qt.ImhTime - The text editor functions as a time field.
+        \endlist
+
+        Flags that restrict input (exclusive flags) are:
+
+        \list
+        \li Qt.ImhDigitsOnly - Only digits are allowed.
+        \li Qt.ImhFormattedNumbersOnly - Only number input is allowed. This includes decimal point and minus sign.
+        \li Qt.ImhUppercaseOnly - Only upper case letter input is allowed.
+        \li Qt.ImhLowercaseOnly - Only lower case letter input is allowed.
+        \li Qt.ImhDialableCharactersOnly - Only characters suitable for phone dialing are allowed.
+        \li Qt.ImhEmailCharactersOnly - Only characters suitable for email addresses are allowed.
+        \li Qt.ImhUrlCharactersOnly - Only characters suitable for URLs are allowed.
+        \endlist
+
+        Masks:
+
+        \list
+        \li Qt.ImhExclusiveInputMask - This mask yields nonzero if any of the exclusive flags are used.
+        \endlist
+    */
+    property alias inputMethodHints: edit.inputMethodHints
+
+    /*!
+        \qmlproperty int TextArea::length
+
+        Returns the total number of plain text characters in the TextArea item.
+
+        As this number doesn't include any formatting markup, it may not be the same as the
+        length of the string returned by the \l text property.
+
+        This property can be faster than querying the length the \l text property as it doesn't
+        require any copying or conversion of the TextArea's internal string data.
+    */
+    readonly property alias length: edit.length
+
+    /*!
+        \qmlproperty int TextArea::lineCount
+
+        Returns the total number of lines in the TextArea item.
+    */
+    readonly property alias lineCount: edit.lineCount
+
+    /*!
+        \qmlproperty bool TextArea::readOnly
+
+        Whether the user can interact with the TextArea item.
+
+        The difference from a disabled text field is that it will appear
+        to be active, and text can be selected and copied.
+
+        If this property is set to \c true, the text cannot be edited by user interaction.
+
+        By default this property is \c false.
+    */
+    property alias readOnly: edit.readOnly
+    Accessible.readOnly: readOnly
+
+    /*!
+        \qmlproperty string TextArea::selectedText
+
+        This read-only property provides the text currently selected in the
+        text edit.
+    */
+    readonly property alias selectedText: edit.selectedText
+
+    /*!
+        \qmlproperty int TextArea::selectionEnd
+
+        The cursor position after the last character in the current selection.
+
+        This property is read-only. To change the selection, use select(start,end),
+        selectAll(), or selectWord().
+
+        \sa selectionStart, cursorPosition, selectedText
+    */
+    readonly property alias selectionEnd: edit.selectionEnd
+
+    /*!
+        \qmlproperty int TextArea::selectionStart
+
+        The cursor position before the first character in the current selection.
+
+        This property is read-only. To change the selection, use select(start,end),
+        selectAll(), or selectWord().
+
+        \sa selectionEnd, cursorPosition, selectedText
+    */
+    readonly property alias selectionStart: edit.selectionStart
+
+    /*!
+        \qmlproperty bool TextArea::tabChangesFocus
+
+        This property holds whether Tab changes focus, or is accepted as input.
+
+        Defaults to \c false.
+    */
+    property bool tabChangesFocus: false
+
+    /*!
+        \qmlproperty string TextArea::text
+
+        The text to display. If the text format is AutoText the text edit will
+        automatically determine whether the text should be treated as
+        rich text. This determination is made using Qt::mightBeRichText().
+    */
+    property alias text: edit.text
+
+    /*!
+        \qmlproperty enumeration TextArea::textFormat
+
+        The way the text property should be displayed.
+
+        \list
+        \li TextEdit.AutoText
+        \li TextEdit.PlainText
+        \li TextEdit.RichText
+        \endlist
+
+        The default is TextEdit.PlainText.  If the text format is TextEdit.AutoText the text edit
+        will automatically determine whether the text should be treated as
+        rich text. This determination is made using Qt::mightBeRichText().
+    */
+    property alias textFormat: edit.textFormat
+
+    /*!
+        \qmlproperty enumeration TextArea::wrapMode
+
+        Set this property to wrap the text to the TextArea item's width.
+
+        \list
+        \li TextEdit.NoWrap (default) - no wrapping will be performed.
+        \li TextEdit.WordWrap - wrapping is done on word boundaries only.
+        \li TextEdit.WrapAnywhere - wrapping is done at any point on a line, even if it occurs in the middle of a word.
+        \li TextEdit.Wrap - if possible, wrapping occurs at a word boundary; otherwise it will occur at the appropriate point on the line, even in the middle of a word.
+        \endlist
+    */
+    property alias wrapMode: edit.wrapMode
+
+    /*!
+        \qmlproperty bool TextArea::selectByMouse
+
+        This property determines if the user can select the text with the
+        mouse.
+
+        The default value is \c true.
+    */
+    property bool selectByMouse: true
+
+    /*!
+        \qmlproperty bool TextArea::selectByKeyboard
+
+        This property determines if the user can select the text with the
+        keyboard.
+
+        If set to \c true, the user can use the keyboard to select the text
+        even if the editor is read-only. If set to \c false, the user cannot
+        use the keyboard to select the text even if the editor is editable.
+
+        The default value is \c true when the editor is editable,
+        and \c false when read-only.
+
+        \sa readOnly
+    */
+    property alias selectByKeyboard: edit.selectByKeyboard
+
+    /*!
+        \qmlsignal TextArea::linkActivated(string link)
+
+        This signal is emitted when the user clicks on a link embedded in the text.
+        The link must be in rich text or HTML format and the
+        \e link string provides access to the particular link.
+
+        The corresponding handler is \c onLinkActivated.
+    */
+    signal linkActivated(string link)
+
+    /*!
+        \qmlsignal TextArea::linkHovered(string link)
+        \since QtQuick.Controls 1.1
+
+        This signal is emitted when the user hovers a link embedded in the text.
+        The link must be in rich text or HTML format and the
+        \e link string provides access to the particular link.
+
+        \sa hoveredLink
+
+        The corresponding handler is \c onLinkHovered.
+    */
+    signal linkHovered(string link)
+
+    /*!
+        \qmlsignal TextArea::editingFinished()
+        \since QtQuick.Controls 1.5
+
+        This signal is emitted when the text area loses focus.
+
+        The corresponding handler is \c onEditingFinished.
+    */
+    signal editingFinished()
+
+    /*!
+        \qmlproperty string TextArea::hoveredLink
+        \since QtQuick.Controls 1.1
+
+        This property contains the link string when user hovers a link
+        embedded in the text. The link must be in rich text or HTML format
+        and the link string provides access to the particular link.
+    */
+    readonly property alias hoveredLink: edit.hoveredLink
+
+    /*!
+        \since QtQuick.Controls 1.3
+
+        This property contains the edit \l Menu for working
+        with text selection. Set it to \c null if no menu
+        is wanted.
+
+        \sa Menu
+    */
+    property Component menu: editMenu.defaultMenu
+
+    /*!
+        \qmlmethod void TextArea::append(string text)
+
+        Appends a string \a text as a new line to the end of the text area.
+    */
+    function append (string) {
+        edit.append(string)
+        __verticalScrollBar.value = __verticalScrollBar.maximumValue
+    }
+
+    /*!
+        \qmlmethod void TextArea::copy()
+
+        Copies the currently selected text to the system clipboard.
+    */
+    function copy() {
+        edit.copy();
+    }
+
+    /*!
+        \qmlmethod void TextArea::cut()
+
+        Moves the currently selected text to the system clipboard.
+    */
+    function cut() {
+        edit.cut();
+    }
+
+    /*!
+        \qmlmethod void TextArea::deselect()
+
+        Removes active text selection.
+    */
+    function deselect() {
+        edit.deselect();
+    }
+
+    /*!
+        \qmlmethod string TextArea::getFormattedText(int start, int end)
+
+        Returns the section of text that is between the \a start and \a end positions.
+
+        The returned text will be formatted according to the \l textFormat property.
+    */
+    function getFormattedText(start, end) {
+        return edit.getFormattedText(start, end);
+    }
+
+    /*!
+        \qmlmethod string TextArea::getText(int start, int end)
+
+        Returns the section of text that is between the \a start and \a end positions.
+
+        The returned text does not include any rich text formatting.
+    */
+    function getText(start, end) {
+        return edit.getText(start, end);
+    }
+
+    /*!
+        \qmlmethod void TextArea::insert(int position, string text)
+
+        Inserts \a text into the TextArea at \a position.
+    */
+    function insert(position, text) {
+        edit.insert(position, text);
+    }
+
+    /*!
+        \qmlmethod bool TextArea::isRightToLeft(int start, int end)
+
+        Returns true if the natural reading direction of the editor text
+        found between positions \a start and \a end is right to left.
+    */
+    function isRightToLeft(start, end) {
+        return edit.isRightToLeft(start, end);
+    }
+
+    /*!
+        \qmlmethod void TextArea::moveCursorSelection(int position, SelectionMode mode = TextEdit.SelectCharacters)
+
+        Moves the cursor to \a position and updates the selection according to the optional \a mode
+        parameter. (To only move the cursor, set the \l cursorPosition property.)
+
+        When this method is called it additionally sets either the
+        selectionStart or the selectionEnd (whichever was at the previous cursor position)
+        to the specified position. This allows you to easily extend and contract the selected
+        text range.
+
+        The selection mode specifies whether the selection is updated on a per character or a per word
+        basis.  If not specified the selection mode will default to TextEdit.SelectCharacters.
+
+        \list
+        \li TextEdit.SelectCharacters - Sets either the selectionStart or selectionEnd (whichever was at
+        the previous cursor position) to the specified position.
+        \li TextEdit.SelectWords - Sets the selectionStart and selectionEnd to include all
+        words between the specified position and the previous cursor position.  Words partially in the
+        range are included.
+        \endlist
+
+        For example, take this sequence of calls:
+
+        \code
+            cursorPosition = 5
+            moveCursorSelection(9, TextEdit.SelectCharacters)
+            moveCursorSelection(7, TextEdit.SelectCharacters)
+        \endcode
+
+        This moves the cursor to the 5th position, extends the selection end from 5 to 9,
+        and then retracts the selection end from 9 to 7, leaving the text from the 5th
+        position to the 7th position selected (the 6th and 7th characters).
+
+        The same sequence with TextEdit.SelectWords will extend the selection start to a word boundary
+        before or on the 5th position, and extend the selection end to a word boundary on or past the 9th position.
+    */
+    function moveCursorSelection(position, mode) {
+        edit.moveCursorSelection(position, mode);
+    }
+
+    /*!
+        \qmlmethod void TextArea::paste()
+
+        Replaces the currently selected text by the contents of the system clipboard.
+    */
+    function paste() {
+        edit.paste();
+    }
+
+    /*!
+        \qmlmethod int TextArea::positionAt(int x, int y)
+
+        Returns the text position closest to pixel position (\a x, \a y).
+
+        Position 0 is before the first character, position 1 is after the first character
+        but before the second, and so on until position \l {text}.length, which is after all characters.
+    */
+    function positionAt(x, y) {
+        return edit.positionAt(x, y);
+    }
+
+    /*!
+        \qmlmethod rectangle TextArea::positionToRectangle(position)
+
+        Returns the rectangle at the given \a position in the text. The x, y,
+        and height properties correspond to the cursor that would describe
+        that position.
+    */
+    function positionToRectangle(position) {
+        return edit.positionToRectangle(position);
+    }
+
+    /*!
+        \qmlmethod void TextArea::redo()
+
+        Redoes the last operation if redo is \l {canRedo}{available}.
+    */
+    function redo() {
+        edit.redo();
+    }
+
+    /*!
+        \qmlmethod string TextArea::remove(int start, int end)
+
+        Removes the section of text that is between the \a start and \a end positions from the TextArea.
+    */
+    function remove(start, end) {
+        return edit.remove(start, end);
+    }
+
+    /*!
+        \qmlmethod void TextArea::select(int start, int end)
+
+        Causes the text from \a start to \a end to be selected.
+
+        If either start or end is out of range, the selection is not changed.
+
+        After calling this, selectionStart will become the lesser
+        and selectionEnd will become the greater (regardless of the order passed
+        to this method).
+
+        \sa selectionStart, selectionEnd
+    */
+    function select(start, end) {
+        edit.select(start, end);
+    }
+
+    /*!
+        \qmlmethod void TextArea::selectAll()
+
+        Causes all text to be selected.
+    */
+    function selectAll() {
+        edit.selectAll();
+    }
+
+    /*!
+        \qmlmethod void TextArea::selectWord()
+
+        Causes the word closest to the current cursor position to be selected.
+    */
+    function selectWord() {
+        edit.selectWord();
+    }
+
+    /*!
+        \qmlmethod void TextArea::undo()
+
+        Undoes the last operation if undo is \l {canUndo}{available}. Deselects any
+        current selection, and updates the selection start to the current cursor
+        position.
+    */
+    function undo() {
+        edit.undo();
+    }
+
+    /*! \qmlproperty bool TextArea::backgroundVisible
+
+        This property determines if the background should be filled or not.
+
+        The default value is \c true.
+    */
+    property alias backgroundVisible: colorRect.visible
+
+    /*! \internal */
+    default property alias data: area.data
+
+    /*! \qmlproperty real TextArea::textMargin
+        \since QtQuick.Controls 1.1
+
+        The margin, in pixels, around the text in the TextArea.
+    */
+    property alias textMargin: edit.textMargin
+
+    /*! \qmlproperty real TextArea::contentWidth
+        \since QtQuick.Controls 1.3
+
+        The width of the text content.
+    */
+    readonly property alias contentWidth: edit.contentWidth
+
+    /*! \qmlproperty real TextArea::contentHeight
+        \since QtQuick.Controls 1.3
+
+        The height of the text content.
+    */
+    readonly property alias contentHeight: edit.contentHeight
+
+    frameVisible: true
+
+    activeFocusOnTab: true
+
+    Accessible.role: Accessible.EditableText
+
+    style: Settings.styleComponent(Settings.style, "TextAreaStyle.qml", area)
+
+    /*!
+        \qmlproperty TextDocument TextArea::textDocument
+
+        This property exposes the \l QQuickTextDocument of this TextArea.
+        \sa TextEdit::textDocument
+    */
+    property alias textDocument: edit.textDocument
+
+    Flickable {
+        id: flickable
+
+        interactive: !edit.selectByMouse
+        anchors.fill: parent
+
+        TextEdit {
+            id: edit
+            focus: true
+            cursorDelegate: __style && __style.__cursorDelegate ? __style.__cursorDelegate : null
+            persistentSelection: true
+
+            Rectangle {
+                id: colorRect
+                parent: viewport
+                anchors.fill: parent
+                color: __style ? __style.backgroundColor : "white"
+                z: -1
+            }
+
+            property int layoutRecursionDepth: 0
+
+            function doLayout() {
+                // scrollbars affect the document/viewport size and vice versa, so we
+                // must allow the layout loop to recurse twice until the sizes stabilize
+                if (layoutRecursionDepth <= 2) {
+                    layoutRecursionDepth++
+
+                    if (wrapMode == TextEdit.NoWrap) {
+                        __horizontalScrollBar.visible = edit.contentWidth > viewport.width
+                        edit.width = Math.max(viewport.width, edit.contentWidth)
+                    } else {
+                        __horizontalScrollBar.visible = false
+                        edit.width = viewport.width
+                    }
+                    edit.height = Math.max(viewport.height, edit.contentHeight)
+
+                    flickable.contentWidth = edit.contentWidth
+                    flickable.contentHeight = edit.contentHeight
+
+                    layoutRecursionDepth--
+                }
+            }
+
+            Connections {
+                target: area.viewport
+                function onWidthChanged() { edit.doLayout() }
+                function onHeightChanged() { edit.doLayout() }
+            }
+            onContentWidthChanged: edit.doLayout()
+            onContentHeightChanged: edit.doLayout()
+            onWrapModeChanged: edit.doLayout()
+
+            renderType: __style ? __style.renderType : Text.NativeRendering
+            font: __style ? __style.font : TextSingleton.font
+            color: __style ? __style.textColor : "darkgray"
+            selectionColor: __style ? __style.selectionColor : "darkred"
+            selectedTextColor: __style ? __style.selectedTextColor : "white"
+            wrapMode: TextEdit.WordWrap
+            textMargin: __style && __style.textMargin !== undefined ? __style.textMargin : 4
+
+            selectByMouse: area.selectByMouse && Qt.platform.os != "ios" && (!Settings.isMobile || !cursorHandle.delegate || !selectionHandle.delegate)
+            readOnly: false
+
+            Keys.forwardTo: area
+
+            KeyNavigation.priority: KeyNavigation.BeforeItem
+            KeyNavigation.tab: area.tabChangesFocus ? area.KeyNavigation.tab : null
+            KeyNavigation.backtab: area.tabChangesFocus ? area.KeyNavigation.backtab : null
+
+            property bool blockRecursion: false
+            property bool hasSelection: selectionStart !== selectionEnd
+            readonly property int selectionPosition: selectionStart !== cursorPosition ? selectionStart : selectionEnd
+
+            // force re-evaluation when contentWidth changes => text layout changes => selection moves
+            property rect selectionRectangle: contentWidth ? positionToRectangle(selectionPosition)
+                                                           : positionToRectangle(selectionPosition)
+
+            onSelectionStartChanged: syncHandlesWithSelection()
+            onCursorPositionChanged: syncHandlesWithSelection()
+
+            function syncHandlesWithSelection()
+            {
+                if (!blockRecursion && selectionHandle.delegate) {
+                    blockRecursion = true
+                    // We cannot use property selectionPosition since it gets updated after onSelectionStartChanged
+                    cursorHandle.position = cursorPosition
+                    selectionHandle.position = (selectionStart !== cursorPosition) ? selectionStart : selectionEnd
+                    blockRecursion = false
+                }
+                ensureVisible(cursorRectangle)
+            }
+
+            function ensureVisible(rect) {
+                if (rect.y >= flickableItem.contentY + viewport.height - rect.height - textMargin) {
+                    // moving down
+                    flickableItem.contentY = rect.y - viewport.height +  rect.height + textMargin
+                } else if (rect.y < flickableItem.contentY) {
+                    // moving up
+                    flickableItem.contentY = rect.y - textMargin
+                }
+
+                if (rect.x >= flickableItem.contentX + viewport.width - textMargin) {
+                    // moving right
+                    flickableItem.contentX = rect.x - viewport.width + textMargin
+                } else if (rect.x < flickableItem.contentX) {
+                    // moving left
+                    flickableItem.contentX = rect.x - textMargin
+                }
+            }
+
+            onLinkActivated: area.linkActivated(link)
+            onLinkHovered: area.linkHovered(link)
+            onEditingFinished: area.editingFinished()
+
+            function activate() {
+                if (activeFocusOnPress) {
+                    forceActiveFocus()
+                    if (!readOnly)
+                        Qt.inputMethod.show()
+                }
+                cursorHandle.activate()
+                selectionHandle.activate()
+            }
+
+            function moveHandles(cursor, selection) {
+                blockRecursion = true
+                cursorPosition = cursor
+                if (selection === -1) {
+                    selectWord()
+                    selection = selectionStart
+                }
+                selectionHandle.position = selection
+                cursorHandle.position = cursorPosition
+                blockRecursion = false
+            }
+
+            MouseArea {
+                id: mouseArea
+                anchors.fill: parent
+                cursorShape: edit.hoveredLink ? Qt.PointingHandCursor : Qt.IBeamCursor
+                acceptedButtons: (edit.selectByMouse ? Qt.NoButton : Qt.LeftButton) | (area.menu ? Qt.RightButton : Qt.NoButton)
+                onClicked: {
+                    if (editMenu.item)
+                        return;
+                    var pos = edit.positionAt(mouse.x, mouse.y)
+                    edit.moveHandles(pos, pos)
+                    edit.activate()
+                }
+                onPressAndHold: {
+                    if (editMenu.item)
+                        return;
+                    var pos = edit.positionAt(mouse.x, mouse.y)
+                    edit.moveHandles(pos, area.selectByMouse ? -1 : pos)
+                    edit.activate()
+                }
+            }
+
+            EditMenu {
+                id: editMenu
+                control: area
+                input: edit
+                mouseArea: mouseArea
+                cursorHandle: cursorHandle
+                selectionHandle: selectionHandle
+                flickable: flickable
+                anchors.fill: parent
+            }
+
+            ScenePosListener {
+                id: listener
+                item: edit
+                enabled: edit.activeFocus && Qt.platform.os !== "ios" && Settings.isMobile
+            }
+
+            TextHandle {
+                id: selectionHandle
+
+                editor: edit
+                control: area
+                z: 1000001 // DefaultWindowDecoration+1
+                parent: !edit.activeFocus || Qt.platform.os === "ios" ? editor : Window.contentItem // float (QTBUG-42538)
+                active: area.selectByMouse && Settings.isMobile
+                delegate: __style.__selectionHandle
+                maximum: cursorHandle.position - 1
+
+                // Mention scenePos, contentX and contentY in the mappedPos binding to force re-evaluation if they change
+                property var mappedPos: listener.scenePos.x !== listener.scenePos.y !== flickableItem.contentX !== flickableItem.contentY !== Number.MAX_VALUE ?
+                                            editor.mapToItem(parent, editor.selectionRectangle.x, editor.selectionRectangle.y) : -1
+                x: mappedPos.x
+                y: mappedPos.y
+
+                property var posInViewport: flickableItem.contentX !== flickableItem.contentY !== Number.MAX_VALUE ?
+                                                viewport.mapFromItem(parent, handleX, handleY) : -1
+                visible: pressed || (edit.hasSelection
+                                     && posInViewport.y + handleHeight >= -1
+                                     && posInViewport.y <= viewport.height + 1
+                                     && posInViewport.x + handleWidth >= -1
+                                     && posInViewport.x <= viewport.width + 1)
+
+                onPositionChanged: {
+                    if (!edit.blockRecursion) {
+                        edit.blockRecursion = true
+                        edit.select(selectionHandle.position, cursorHandle.position)
+                        if (pressed)
+                            edit.ensureVisible(edit.selectionRectangle)
+                        edit.blockRecursion = false
+                    }
+                }
+            }
+
+            TextHandle {
+                id: cursorHandle
+
+                editor: edit
+                control: area
+                z: 1000001 // DefaultWindowDecoration+1
+                parent: !edit.activeFocus || Qt.platform.os === "ios" ? editor : Window.contentItem // float (QTBUG-42538)
+                active: area.selectByMouse && Settings.isMobile
+                delegate: __style.__cursorHandle
+                minimum: edit.hasSelection ? selectionHandle.position + 1 : -1
+
+                // Mention scenePos, contentX and contentY in the mappedPos binding to force re-evaluation if they change
+                property var mappedPos: listener.scenePos.x !== listener.scenePos.y !== flickableItem.contentX !== flickableItem.contentY !== Number.MAX_VALUE ?
+                                            editor.mapToItem(parent, editor.cursorRectangle.x, editor.cursorRectangle.y) : -1
+                x: mappedPos.x
+                y: mappedPos.y
+
+                property var posInViewport: flickableItem.contentX !== flickableItem.contentY !== Number.MAX_VALUE ?
+                                                viewport.mapFromItem(parent, handleX, handleY) : -1
+                visible: pressed || ((edit.cursorVisible || edit.hasSelection)
+                                     && posInViewport.y + handleHeight >= -1
+                                     && posInViewport.y <= viewport.height + 1
+                                     && posInViewport.x + handleWidth >= -1
+                                     && posInViewport.x <= viewport.width + 1)
+
+                onPositionChanged: {
+                    if (!edit.blockRecursion) {
+                        edit.blockRecursion = true
+                        if (!edit.hasSelection)
+                            selectionHandle.position = cursorHandle.position
+                        edit.select(selectionHandle.position, cursorHandle.position)
+                        edit.blockRecursion = false
+                    }
+                }
+            }
+        }
+    }
+
+    Keys.onPressed: {
+        if (event.key == Qt.Key_PageUp) {
+            __verticalScrollBar.value -= area.height
+        } else if (event.key == Qt.Key_PageDown)
+            __verticalScrollBar.value += area.height
+    }
+
+}
diff --git a/deployment_test/QtQuick/Controls/TextArea.qmlc b/deployment_test/QtQuick/Controls/TextArea.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..75903e28c6c8b7d0b16738d9eef72ff9ab44eea0
Binary files /dev/null and b/deployment_test/QtQuick/Controls/TextArea.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/TextField.qml b/deployment_test/QtQuick/Controls/TextField.qml
new file mode 100644
index 0000000000000000000000000000000000000000..d0d1d5cc1716fae18ced31e95fdb048bb61f903e
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/TextField.qml
@@ -0,0 +1,672 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.6
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype TextField
+    \inqmlmodule QtQuick.Controls
+    \since 5.1
+    \ingroup controls
+    \brief Displays a single line of editable plain text.
+
+    \image textfield.png
+
+    TextField is used to accept a line of text input. Input constraints can be
+    placed on a TextField item (for example, through a \l validator or \l
+    inputMask). Setting \l echoMode to an appropriate value enables
+    TextField to be used for a password input field.
+
+    \qml
+      TextField {
+          placeholderText: qsTr("Enter name")
+      }
+    \endqml
+
+    You can create a custom appearance for a TextField by
+    assigning a \l {TextFieldStyle}.
+
+    \sa TextArea, TextInput
+*/
+
+Control {
+    id: textfield
+
+    /*!
+        \qmlproperty bool TextField::acceptableInput
+
+        Returns \c true if the text field contains acceptable
+        text.
+
+        If a validator or input mask was set, this property will return \c
+        true if the current text satisfies the validator or mask as
+        a final string (not as an intermediate string).
+
+        The default value is \c true.
+
+        \sa validator, inputMask, accepted
+
+    */
+    readonly property alias acceptableInput: textInput.acceptableInput // read only
+
+    /*!
+        \qmlproperty bool TextField::activeFocusOnPress
+
+        This property is set to \c true if the TextField should gain active
+        focus on a mouse press.
+
+        The default value is \c true.
+    */
+    property alias activeFocusOnPress: textInput.activeFocusOnPress
+
+    /*!
+        \qmlproperty bool TextField::canPaste
+
+        Returns \c true if the TextField is writable and the content of the
+        clipboard is suitable for pasting into the TextField.
+    */
+    readonly property alias canPaste: textInput.canPaste
+
+    /*!
+        \qmlproperty bool TextField::canRedo
+
+        Returns \c true if the TextField is writable and there are \l
+        {undo}{undone} operations that can be redone.
+    */
+    readonly property alias canRedo: textInput.canRedo
+
+    /*!
+        \qmlproperty bool TextField::canUndo
+
+        Returns \c true if the TextField is writable and there are previous
+        operations that can be undone.
+    */
+    readonly property alias canUndo: textInput.canUndo
+
+    /*!
+        \qmlproperty color TextField::textColor
+
+        This property holds the text color.
+    */
+    property alias textColor: textInput.color
+
+    /*!
+        \qmlproperty int TextField::cursorPosition
+
+        This property holds the position of the cursor in the TextField.
+    */
+    property alias cursorPosition: textInput.cursorPosition
+
+    /*!
+        \qmlproperty rect TextField::cursorRectangle
+        \since QtQuick.Controls 1.3
+
+        The rectangle where the text cursor is rendered within the text field.
+    */
+    readonly property alias cursorRectangle: textInput.cursorRectangle
+
+    /*!
+       \qmlproperty string TextField::displayText
+
+       This property holds the text displayed in the TextField.
+
+       If \l echoMode is set to TextInput::Normal, this holds the
+       same value as the TextField::text property. Otherwise,
+       this property holds the text visible to the user, while
+       the \l text property holds the actual entered text.
+    */
+    readonly property alias displayText: textInput.displayText
+
+    /*!
+        \qmlproperty enumeration TextField::echoMode
+
+        Specifies how the text should be displayed in the
+        TextField.
+
+        The possible modes are:
+        \list
+        \li TextInput.Normal - Displays the text as it is. (Default)
+        \li TextInput.Password - Displays asterisks instead of characters.
+        \li TextInput.NoEcho - Displays nothing.
+        \li TextInput.PasswordEchoOnEdit - Displays characters as they are
+        entered while editing, otherwise displays asterisks.
+        \endlist
+    */
+    property alias echoMode: textInput.echoMode
+    Accessible.passwordEdit: echoMode == TextInput.Password || echoMode === TextInput.PasswordEchoOnEdit
+
+    /*!
+        \qmlproperty font TextField::font
+
+        Sets the font of the TextField.
+    */
+    property alias font: textInput.font
+
+    /*!
+        \qmlproperty enumeration TextField::horizontalAlignment
+
+        Sets the alignment of the text within the TextField item's width.
+
+        By default, the horizontal text alignment follows the natural alignment
+        of the text, for example text that is read from left to right will be
+        aligned to the left.
+
+        The possible alignment values are:
+        \list
+        \li TextInput.AlignLeft
+        \li TextInput.AlignRight
+        \li TextInput.AlignHCenter
+        \endlist
+
+        When using the attached property, LayoutMirroring::enabled, to mirror
+        application layouts, the horizontal alignment of text will also be
+        mirrored. However, the property \c horizontalAlignment will remain
+        unchanged. To query the effective horizontal alignment of TextField, use
+        the read-only property \c effectiveHorizontalAlignment.
+    */
+    property alias horizontalAlignment: textInput.horizontalAlignment
+
+    /*!
+        \qmlproperty enumeration TextField::effectiveHorizontalAlignment
+
+        Gets the effective horizontal alignment of the text within the TextField
+        item's width.
+
+        \l horizontalAlignment contains the default horizontal alignment.
+
+        \sa horizontalAlignment
+
+    */
+    readonly property alias effectiveHorizontalAlignment: textInput.effectiveHorizontalAlignment
+
+    /*!
+        \qmlproperty enumeration TextField::verticalAlignment
+
+        Sets the alignment of the text within the TextField item's height.
+
+        The possible alignment values are:
+        \list
+        \li TextInput.AlignTop
+        \li TextInput.AlignBottom
+        \li TextInput.AlignVCenter (default).
+        \endlist
+    */
+    property alias verticalAlignment: textInput.verticalAlignment
+
+    /*!
+        \qmlproperty string TextField::inputMask
+
+        Sets an input mask on the TextField, restricting the allowable text
+        inputs. See QLineEdit::inputMask for further details, as the exact same
+        mask strings are used by TextField.
+
+        \sa acceptableInput, validator
+    */
+    property alias inputMask: textInput.inputMask
+
+    /*!
+        \qmlproperty bool TextField::inputMethodComposing
+        \since QtQuick.Controls 1.3
+
+        This property holds whether the TextField has partial text input from an input method.
+
+        While it is composing an input method may rely on mouse or key events from the TextField
+        to edit or commit the partial text. This property can be used to determine when to disable
+        events handlers that may interfere with the correct operation of an input method.
+    */
+    readonly property bool inputMethodComposing: !!textInput.inputMethodComposing
+
+    /*!
+        \qmlproperty enumeration TextField::inputMethodHints
+
+        Provides hints to the input method about the expected content of the
+        text field and how it should operate.
+
+        The value is a bit-wise combination of flags, or \c Qt.ImhNone if no
+        hints are set.
+
+        The default value is \c Qt.ImhNone.
+
+        Flags that alter behavior are:
+
+        \list
+        \li Qt.ImhHiddenText - Characters should be hidden, as is typically used when entering passwords.
+                This is automatically set when setting echoMode to \c TextInput.Password.
+        \li Qt.ImhSensitiveData - Typed text should not be stored by the active input method
+                in any persistent storage like predictive user dictionary.
+        \li Qt.ImhNoAutoUppercase - The input method should not try to automatically switch to upper case
+                when a sentence ends.
+        \li Qt.ImhPreferNumbers - Numbers are preferred (but not required).
+        \li Qt.ImhPreferUppercase - Uppercase letters are preferred (but not required).
+        \li Qt.ImhPreferLowercase - Lowercase letters are preferred (but not required).
+        \li Qt.ImhNoPredictiveText - Do not use predictive text (for example, dictionary lookup) while typing.
+
+        \li Qt.ImhDate - The text editor functions as a date field.
+        \li Qt.ImhTime - The text editor functions as a time field.
+        \li Qt.ImhMultiLine - The text editor doesn't close software input keyboard when Return or Enter key is pressed (since QtQuick.Controls 1.3).
+        \endlist
+
+        Flags that restrict input (exclusive flags) are:
+
+        \list
+        \li Qt.ImhDigitsOnly - Only digits are allowed.
+        \li Qt.ImhFormattedNumbersOnly - Only number input is allowed. This includes decimal point and minus sign.
+        \li Qt.ImhUppercaseOnly - Only uppercase letter input is allowed.
+        \li Qt.ImhLowercaseOnly - Only lowercase letter input is allowed.
+        \li Qt.ImhDialableCharactersOnly - Only characters suitable for phone dialing are allowed.
+        \li Qt.ImhEmailCharactersOnly - Only characters suitable for email addresses are allowed.
+        \li Qt.ImhUrlCharactersOnly - Only characters suitable for URLs are allowed.
+        \endlist
+
+        Masks:
+        \list
+        \li Qt.ImhExclusiveInputMask - This mask yields nonzero if any of the exclusive flags are used.
+        \endlist
+    */
+    property alias inputMethodHints: textInput.inputMethodHints
+
+    /*!
+        \qmlproperty int TextField::length
+
+        Returns the total number of characters in the TextField item.
+
+        If the TextField has an input mask, the length will include mask
+        characters and may differ from the length of the string returned by the
+        \l text property.
+
+        This property can be faster than querying the length of the \l text
+        property as it doesn't require any copying or conversion of the
+        TextField's internal string data.
+    */
+    readonly property alias length: textInput.length
+
+    /*!
+        \qmlproperty int TextField::maximumLength
+
+        This property holds the maximum permitted length of the text in the
+        TextField.
+
+        If the text is too long, it is truncated at the limit.
+    */
+    property alias maximumLength: textInput.maximumLength
+
+    /*!
+        \qmlproperty string TextField::placeholderText
+
+        This property contains the text that is shown in the text field when the
+        text field is empty.
+    */
+    property alias placeholderText: placeholderTextComponent.text
+
+    /*!
+        \qmlproperty bool TextField::readOnly
+
+        Sets whether user input can modify the contents of the TextField. Read-
+        only is different from a disabled text field in that the text field will
+        appear to be active and text can still be selected and copied.
+
+        If readOnly is set to \c true, then user input will not affect the text.
+        Any bindings or attempts to set the text property will still
+        work, however.
+    */
+    property alias readOnly: textInput.readOnly
+    Accessible.readOnly: readOnly
+
+    /*!
+        \qmlproperty bool TextField::selectByMouse
+        \since QtQuick.Controls 1.3
+
+        This property determines if the user can select the text with the
+        mouse.
+
+        The default value is \c true.
+    */
+    property bool selectByMouse: true
+
+    /*!
+        \qmlproperty string TextField::selectedText
+
+        Provides the text currently selected in the text input.
+
+        It is equivalent to the following snippet, but is faster and easier
+        to use.
+
+        \code
+        myTextField.text.toString().substring(myTextField.selectionStart, myTextField.selectionEnd);
+        \endcode
+    */
+    readonly property alias selectedText: textInput.selectedText
+
+    /*!
+        \qmlproperty int TextField::selectionEnd
+
+        The cursor position after the last character in the current selection.
+
+        This property is read-only. To change the selection, use
+        select(start,end), selectAll(), or selectWord().
+
+        \sa selectionStart, cursorPosition, selectedText
+    */
+    readonly property alias selectionEnd: textInput.selectionEnd
+
+    /*!
+        \qmlproperty int TextField::selectionStart
+
+        The cursor position before the first character in the current selection.
+
+        This property is read-only. To change the selection, use select(start,end),
+        selectAll(), or selectWord().
+
+        \sa selectionEnd, cursorPosition, selectedText
+    */
+    readonly property alias selectionStart: textInput.selectionStart
+
+    /*!
+        \qmlproperty string TextField::text
+
+        This property contains the text in the TextField.
+    */
+    property alias text: textInput.text
+
+    /*!
+        \qmlproperty Validator TextField::validator
+
+        Allows you to set a validator on the TextField. When a validator is set,
+        the TextField will only accept input which leaves the text property in
+        an intermediate state. The accepted signal will only be sent
+        if the text is in an acceptable state when enter is pressed.
+
+        Currently supported validators are \l[QtQuick]{IntValidator},
+        \l[QtQuick]{DoubleValidator}, and \l[QtQuick]{RegExpValidator}. An
+        example of using validators is shown below, which allows input of
+        integers between 11 and 31 into the text input:
+
+        \code
+        import QtQuick 2.2
+        import QtQuick.Controls 1.2
+
+        TextField {
+            validator: IntValidator {bottom: 11; top: 31;}
+            focus: true
+        }
+        \endcode
+
+        \sa acceptableInput, inputMask, accepted
+    */
+    property alias validator: textInput.validator
+
+    /*!
+        \since QtQuick.Controls 1.3
+
+        This property contains the edit \l Menu for working
+        with text selection. Set it to \c null if no menu
+        is wanted.
+    */
+    property Component menu: textInput.editMenu.defaultMenu
+
+    /*!
+        \qmlsignal TextField::accepted()
+
+        This signal is emitted when the Return or Enter key is pressed.
+        Note that if there is a \l validator or \l inputMask set on the text
+        field, the signal will only be emitted if the input is in an acceptable
+        state.
+
+        The corresponding handler is \c onAccepted.
+    */
+    signal accepted()
+
+    /*!
+        \qmlsignal TextField::editingFinished()
+        \since QtQuick.Controls 1.1
+
+        This signal is emitted when the Return or Enter key is pressed or
+        the text field loses focus. Note that if there is a validator or
+        inputMask set on the text field and enter/return is pressed, this
+        signal will only be emitted if the input follows
+        the inputMask and the validator returns an acceptable state.
+
+        The corresponding handler is \c onEditingFinished.
+    */
+    signal editingFinished()
+
+    /*!
+        \qmlmethod void TextField::copy()
+
+        Copies the currently selected text to the system clipboard.
+    */
+    function copy() {
+        textInput.copy()
+    }
+
+    /*!
+        \qmlmethod void TextField::cut()
+
+        Moves the currently selected text to the system clipboard.
+    */
+    function cut() {
+        textInput.cut()
+    }
+
+    /*!
+        \qmlmethod void TextField::deselect()
+
+        Removes active text selection.
+    */
+    function deselect() {
+        textInput.deselect();
+    }
+
+    /*!
+        \qmlmethod string TextField::getText(int start, int end)
+
+        Removes the section of text that is between the \a start and \a end
+        positions from the TextField.
+    */
+    function getText(start, end) {
+        return textInput.getText(start, end);
+    }
+
+    /*!
+        \qmlmethod void TextField::insert(int position, string text)
+
+        Inserts \a text into the TextField at \a position.
+    */
+    function insert(position, text) {
+        textInput.insert(position, text);
+    }
+
+    /*!
+        \qmlmethod bool TextField::isRightToLeft(int start, int end)
+
+        Returns \c true if the natural reading direction of the editor text
+        found between positions \a start and \a end is right to left.
+    */
+    function isRightToLeft(start, end) {
+        return textInput.isRightToLeft(start, end);
+    }
+
+    /*!
+        \qmlmethod void TextField::paste()
+
+        Replaces the currently selected text by the contents of the system
+        clipboard.
+    */
+    function paste() {
+        textInput.paste()
+    }
+
+    /*!
+        \qmlmethod void TextField::redo()
+
+        Performs the last operation if redo is \l {canRedo}{available}.
+    */
+    function redo() {
+        textInput.redo();
+    }
+
+    /*!
+        \qmlmethod void TextField::remove(int start, int end)
+        \since QtQuick.Controls 1.4
+
+        Removes the section of text that is between the \a start and \a end positions.
+    */
+    function remove(start, end) {
+        textInput.remove(start, end)
+    }
+
+    /*!
+        \qmlmethod void TextField::select(int start, int end)
+
+        Causes the text from \a start to \a end to be selected.
+
+        If either start or end is out of range, the selection is not changed.
+
+        After calling select, selectionStart will become the lesser
+        and selectionEnd will become the greater (regardless of the order passed
+        to this method).
+
+        \sa selectionStart, selectionEnd
+    */
+    function select(start, end) {
+        textInput.select(start, end)
+    }
+
+    /*!
+        \qmlmethod void TextField::selectAll()
+
+        Causes all text to be selected.
+    */
+    function selectAll() {
+        textInput.selectAll()
+    }
+
+    /*!
+        \qmlmethod void TextField::selectWord()
+
+        Causes the word closest to the current cursor position to be selected.
+    */
+    function selectWord() {
+        textInput.selectWord()
+    }
+
+    /*!
+        \qmlmethod void TextField::undo()
+
+        Reverts the last operation if undo is \l {canUndo}{available}. undo()
+        deselects any current selection and updates the selection start to the
+        current cursor position.
+    */
+    function undo() {
+        textInput.undo();
+    }
+
+    /*! \qmlproperty bool TextField::hovered
+
+        This property holds whether the control is being hovered.
+    */
+    readonly property alias hovered: textInput.containsMouse
+
+    /*! \internal */
+    property alias __contentHeight: textInput.contentHeight
+
+    /*! \internal */
+    property alias __contentWidth: textInput.contentWidth
+
+    /*! \internal */
+    property alias __baselineOffset: textInput.baselineOffset
+
+    style: Settings.styleComponent(Settings.style, "TextFieldStyle.qml", textInput)
+
+    activeFocusOnTab: true
+
+    Accessible.name: text
+    Accessible.role: Accessible.EditableText
+    Accessible.description: placeholderText
+
+    Text {
+        id: placeholderTextComponent
+        anchors.fill: textInput
+        font: textInput.font
+        horizontalAlignment: textInput.horizontalAlignment
+        verticalAlignment: textInput.verticalAlignment
+        opacity: !textInput.displayText && (!textInput.activeFocus || textInput.horizontalAlignment !== Qt.AlignHCenter) ? 1.0 : 0.0
+        color: __panel ? __panel.placeholderTextColor : "darkgray"
+        clip: contentWidth > width;
+        elide: Text.ElideRight
+        renderType: __style ? __style.renderType : Text.NativeRendering
+    }
+
+    TextInputWithHandles {
+        id: textInput
+        focus: true
+        passwordCharacter: __style && __style.passwordCharacter !== undefined ? __style.passwordCharacter
+                                                                              : Qt.styleHints.passwordMaskCharacter
+        selectionColor: __panel ? __panel.selectionColor : "darkred"
+        selectedTextColor: __panel ? __panel.selectedTextColor : "white"
+
+        control: textfield
+        cursorHandle: __style ? __style.__cursorHandle : undefined
+        selectionHandle: __style ? __style.__selectionHandle : undefined
+
+        font: __panel ? __panel.font : TextSingleton.font
+        anchors.leftMargin: __panel ? __panel.leftMargin : 0
+        anchors.topMargin: __panel ? __panel.topMargin : 0
+        anchors.rightMargin: __panel ? __panel.rightMargin : 0
+        anchors.bottomMargin: __panel ? __panel.bottomMargin : 0
+
+        anchors.fill: parent
+        verticalAlignment: Text.AlignVCenter
+
+        color: __panel ? __panel.textColor : "darkgray"
+        clip: contentWidth > width
+
+        renderType: __style ? __style.renderType : Text.NativeRendering
+
+        Keys.forwardTo: textfield
+
+        EnterKey.type: control.EnterKey.type
+
+        onAccepted: textfield.accepted()
+
+        onEditingFinished: textfield.editingFinished()
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/TextField.qmlc b/deployment_test/QtQuick/Controls/TextField.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..26e12cf351e96054956dd7000f8e10881b505bbc
Binary files /dev/null and b/deployment_test/QtQuick/Controls/TextField.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/ToolBar.qml b/deployment_test/QtQuick/Controls/ToolBar.qml
new file mode 100644
index 0000000000000000000000000000000000000000..2e8a8fa31be9e6c6bf1df24d6fd09e44c1d2b5eb
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/ToolBar.qml
@@ -0,0 +1,182 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype ToolBar
+    \inqmlmodule QtQuick.Controls
+    \since 5.1
+    \ingroup applicationwindow
+    \ingroup controls
+    \brief Contains ToolButton and related controls.
+
+    \image toolbar.png
+
+    The common way of using ToolBar is in relation to \l ApplicationWindow. It
+    provides styling and is generally designed to work well with ToolButton as
+    well as other controls.
+
+    Note that the ToolBar does not provide a layout of its own, but requires
+    you to position its contents, for instance by creating a \l RowLayout.
+
+    If only a single item is used within the ToolBar, it will resize to fit the implicitHeight
+    of its contained item. This makes it particularly suitable for use together with layouts.
+    Otherwise the height is platform dependent.
+
+    \code
+    ApplicationWindow {
+        ...
+        toolBar:ToolBar {
+            RowLayout {
+                anchors.fill: parent
+                ToolButton {
+                    iconSource: "new.png"
+                }
+                ToolButton {
+                    iconSource: "open.png"
+                }
+                ToolButton {
+                    iconSource: "save-as.png"
+                }
+                Item { Layout.fillWidth: true }
+                CheckBox {
+                    text: "Enabled"
+                    checked: true
+                    Layout.alignment: Qt.AlignRight
+                }
+            }
+        }
+    }
+    \endcode
+*/
+
+FocusScope {
+    id: toolbar
+
+    activeFocusOnTab: false
+    Accessible.role: Accessible.ToolBar
+    LayoutMirroring.enabled: Qt.application.layoutDirection === Qt.RightToLeft
+    LayoutMirroring.childrenInherit: true
+
+    width: parent ? parent.width : implicitWidth
+    implicitWidth: container.leftMargin + container.rightMargin
+                   + Math.max(container.layoutWidth, __panel ? __panel.implicitWidth : 0)
+    implicitHeight: container.topMargin + container.bottomMargin
+                    + Math.max(container.layoutHeight, __panel ? __panel.implicitHeight : 0)
+
+    /*! \internal */
+    property Component style: Settings.styleComponent(Settings.style, "ToolBarStyle.qml", toolbar)
+
+    /*! \internal */
+    property alias __style: styleLoader.item
+
+    /*! \internal */
+    property Item __panel: panelLoader.item
+
+    /*! \internal */
+    default property alias __content: container.data
+
+    /*! \internal */
+    property var __menu
+
+    /*!
+        \qmlproperty Item ToolBar::contentItem
+
+        This property holds the content Item of the tool bar.
+
+        Items declared as children of a ToolBar are automatically parented to the ToolBar's contentItem.
+        Items created dynamically need to be explicitly parented to the contentItem:
+
+        \note The implicit size of the ToolBar is calculated based on the size of its content. If you want to anchor
+        items inside the tool bar, you must specify an explicit width and height on the ToolBar itself.
+    */
+    readonly property alias contentItem: container
+
+    data: [
+        Loader {
+            id: panelLoader
+            anchors.fill: parent
+            sourceComponent: styleLoader.item ? styleLoader.item.panel : null
+            onLoaded: item.z = -1
+            Loader {
+                id: styleLoader
+                property alias __control: toolbar
+                sourceComponent: style
+            }
+        },
+        Item {
+            id: container
+            z: 1
+            focus: true
+            anchors.fill: parent
+
+            anchors.topMargin: topMargin
+            anchors.leftMargin: leftMargin
+            anchors.rightMargin: rightMargin + (buttonLoader.active ? buttonLoader.width + rightMargin : 0)
+            anchors.bottomMargin: bottomMargin
+
+            property int topMargin: __style ? __style.padding.top : 0
+            property int bottomMargin: __style ? __style.padding.bottom : 0
+            property int leftMargin: __style ? __style.padding.left : 0
+            property int rightMargin: __style ? __style.padding.right : 0
+
+            property Item layoutItem: container.children.length === 1 ? container.children[0] : null
+            property real layoutWidth: layoutItem ? (layoutItem.implicitWidth || layoutItem.width) +
+                                                    (layoutItem.anchors.fill ? layoutItem.anchors.leftMargin +
+                                                                               layoutItem.anchors.rightMargin : 0) : 0
+            property real layoutHeight: layoutItem ? (layoutItem.implicitHeight || layoutItem.height) +
+                                                     (layoutItem.anchors.fill ? layoutItem.anchors.topMargin +
+                                                                                layoutItem.anchors.bottomMargin : 0) : 0
+        },
+        Loader {
+            id: buttonLoader
+            anchors.right: parent.right
+            anchors.rightMargin: container.rightMargin
+            anchors.verticalCenter: parent.verticalCenter
+            sourceComponent: ToolMenuButton {
+                menu: toolbar.__menu
+                panel: toolbar.__style.menuButton || null
+            }
+            active: !!__menu && __menu.items.length > 0 && !!__style.menuButton
+        }
+    ]
+}
diff --git a/deployment_test/QtQuick/Controls/ToolBar.qmlc b/deployment_test/QtQuick/Controls/ToolBar.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..d9defd0becc24559ee463778af71925a5d5310d2
Binary files /dev/null and b/deployment_test/QtQuick/Controls/ToolBar.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/ToolButton.qml b/deployment_test/QtQuick/Controls/ToolButton.qml
new file mode 100644
index 0000000000000000000000000000000000000000..1d5e474f25ec042de1090bdac400dee1cdf45a2b
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/ToolButton.qml
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype ToolButton
+    \inqmlmodule QtQuick.Controls
+    \since 5.1
+    \ingroup controls
+    \brief Provides a button type that is typically used within a ToolBar.
+
+    \image toolbar.png
+
+    ToolButton is functionally similar to \l {QtQuick.Controls::}{Button}, but
+    can provide a look that is more suitable within a \l ToolBar.
+
+    \code
+    ApplicationWindow {
+        ...
+        toolBar: ToolBar {
+            RowLayout {
+                ToolButton {
+                    iconSource: "new.png"
+                }
+                ToolButton {
+                    iconSource: "open.png"
+                }
+                ToolButton {
+                    iconSource: "save-as.png"
+                }
+                Item { Layout.fillWidth: true }
+                CheckBox {
+                    text: "Enabled"
+                    checked: true
+                }
+            }
+        }
+    }
+    \endcode
+
+    You can create a custom appearance for a ToolButton by
+    assigning a \l {ButtonStyle}.
+*/
+
+Button {
+    id: button
+    style: Settings.styleComponent(Settings.style, "ToolButtonStyle.qml", button)
+}
diff --git a/deployment_test/QtQuick/Controls/ToolButton.qmlc b/deployment_test/QtQuick/Controls/ToolButton.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..ff4224406108fb2dcdafd37e864566df44339b55
Binary files /dev/null and b/deployment_test/QtQuick/Controls/ToolButton.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/TreeView.qml b/deployment_test/QtQuick/Controls/TreeView.qml
new file mode 100644
index 0000000000000000000000000000000000000000..2bedb9e64df36a86c9fb15eafcd8e22498b4802f
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/TreeView.qml
@@ -0,0 +1,421 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.4
+import QtQuick.Controls 1.4
+import QtQuick.Controls.Private 1.0
+import QtQuick.Controls.Styles 1.2
+import QtQml.Models 2.2
+
+BasicTableView {
+    id: root
+
+    property var model: null
+    property alias rootIndex: modelAdaptor.rootIndex
+
+    readonly property var currentIndex: modelAdaptor.updateCount, modelAdaptor.mapRowToModelIndex(__currentRow)
+    property ItemSelectionModel selection: null
+
+    signal activated(var index)
+    signal clicked(var index)
+    signal doubleClicked(var index)
+    signal pressAndHold(var index)
+    signal expanded(var index)
+    signal collapsed(var index)
+
+    function isExpanded(index) {
+        if (index.valid && index.model !== model) {
+            console.warn("TreeView.isExpanded: model and index mismatch")
+            return false
+        }
+        return modelAdaptor.isExpanded(index)
+    }
+
+    function collapse(index) {
+        if (index.valid && index.model !== model)
+            console.warn("TreeView.collapse: model and index mismatch")
+        else
+            modelAdaptor.collapse(index)
+    }
+
+    function expand(index) {
+        if (index.valid && index.model !== model)
+            console.warn("TreeView.expand: model and index mismatch")
+        else
+            modelAdaptor.expand(index)
+    }
+
+    function indexAt(x, y) {
+        var obj = root.mapToItem(__listView.contentItem, x, y)
+        return modelAdaptor.mapRowToModelIndex(__listView.indexAt(obj.x, obj.y))
+    }
+
+    style: Settings.styleComponent(Settings.style, "TreeViewStyle.qml", root)
+
+    // Internal stuff. Do not look
+
+    __viewTypeName: "TreeView"
+
+    __model: TreeModelAdaptor {
+        id: modelAdaptor
+        model: root.model
+
+        // Hack to force re-evaluation of the currentIndex binding
+        property int updateCount: 0
+        onModelReset: updateCount++
+        onRowsInserted: updateCount++
+        onRowsRemoved: updateCount++
+
+        onExpanded: root.expanded(index)
+        onCollapsed: root.collapsed(index)
+    }
+
+    __itemDelegateLoader: TreeViewItemDelegateLoader {
+        __style: root.__style
+        __itemDelegate: root.itemDelegate
+        __mouseArea: mouseArea
+        __treeModel: modelAdaptor
+    }
+
+    onSelectionModeChanged: if (!!selection) selection.clear()
+
+    __mouseArea: MouseArea {
+        id: mouseArea
+
+        parent: __listView
+        width: __listView.width
+        height: __listView.height
+        z: -1
+        propagateComposedEvents: true
+        focus: true
+        // If there is not a touchscreen, keep the flickable from eating our mouse drags.
+        // If there is a touchscreen, flicking is possible, but selection can be done only by tapping, not by dragging.
+        preventStealing: !Settings.hasTouchScreen
+
+        property var clickedIndex: undefined
+        property var pressedIndex: undefined
+        property bool selectOnRelease: false
+        property int pressedColumn: -1
+        readonly property alias currentRow: root.__currentRow
+        readonly property alias currentIndex: root.currentIndex
+
+        // Handle vertical scrolling whem dragging mouse outside boundaries
+        property int autoScroll: 0 // 0 -> do nothing; 1 -> increment; 2 -> decrement
+        property bool shiftPressed: false // forward shift key state to the autoscroll timer
+
+        Timer {
+            running: mouseArea.autoScroll !== 0 && __verticalScrollBar.visible
+            interval: 20
+            repeat: true
+            onTriggered: {
+                var oldPressedIndex = mouseArea.pressedIndex
+                var row
+                if (mouseArea.autoScroll === 1) {
+                    __listView.incrementCurrentIndexBlocking();
+                    row = __listView.indexAt(0, __listView.height + __listView.contentY)
+                    if (row === -1)
+                        row = __listView.count - 1
+                } else {
+                    __listView.decrementCurrentIndexBlocking();
+                    row = __listView.indexAt(0, __listView.contentY)
+                }
+
+                var index = modelAdaptor.mapRowToModelIndex(row)
+                if (index !== oldPressedIndex) {
+                    mouseArea.pressedIndex = index
+                    var modifiers = mouseArea.shiftPressed ? Qt.ShiftModifier : Qt.NoModifier
+                    mouseArea.mouseSelect(index, modifiers, true /* drag */)
+                }
+            }
+        }
+
+        function mouseSelect(modelIndex, modifiers, drag) {
+            if (!selection) {
+                maybeWarnAboutSelectionMode()
+                return
+            }
+
+            if (selectionMode) {
+                selection.setCurrentIndex(modelIndex, ItemSelectionModel.NoUpdate)
+                if (selectionMode === SelectionMode.SingleSelection) {
+                    selection.select(modelIndex, ItemSelectionModel.ClearAndSelect)
+                } else {
+                    var selectRowRange = (drag && (selectionMode === SelectionMode.MultiSelection
+                                                   || (selectionMode === SelectionMode.ExtendedSelection
+                                                       && modifiers & Qt.ControlModifier)))
+                                         || modifiers & Qt.ShiftModifier
+                    var itemSelection = !selectRowRange || clickedIndex === modelIndex ? modelIndex
+                                        : modelAdaptor.selectionForRowRange(clickedIndex, modelIndex)
+
+                    if (selectionMode === SelectionMode.MultiSelection
+                        || selectionMode === SelectionMode.ExtendedSelection && modifiers & Qt.ControlModifier) {
+                        if (drag)
+                            selection.select(itemSelection, ItemSelectionModel.ToggleCurrent)
+                        else
+                            selection.select(modelIndex, ItemSelectionModel.Toggle)
+                    } else if (modifiers & Qt.ShiftModifier) {
+                        selection.select(itemSelection, ItemSelectionModel.SelectCurrent)
+                    } else {
+                        clickedIndex = modelIndex // Needed only when drag is true
+                        selection.select(modelIndex, ItemSelectionModel.ClearAndSelect)
+                    }
+                }
+            }
+        }
+
+        function keySelect(keyModifiers) {
+            if (selectionMode) {
+                if (!keyModifiers)
+                    clickedIndex = currentIndex
+                if (!(keyModifiers & Qt.ControlModifier))
+                    mouseSelect(currentIndex, keyModifiers, keyModifiers & Qt.ShiftModifier)
+            }
+        }
+
+        function selected(row) {
+            if (selectionMode === SelectionMode.NoSelection)
+                return false
+
+            var modelIndex = null
+            if (!!selection) {
+                modelIndex = modelAdaptor.mapRowToModelIndex(row)
+                if (modelIndex.valid) {
+                    if (selectionMode === SelectionMode.SingleSelection)
+                        return selection.currentIndex === modelIndex
+                    return selection.hasSelection && selection.isSelected(modelIndex)
+                } else {
+                    return false
+                }
+            }
+
+            return row === currentRow
+                   && (selectionMode === SelectionMode.SingleSelection
+                       || (selectionMode > SelectionMode.SingleSelection && !selection))
+        }
+
+        function branchDecorationContains(x, y) {
+            var clickedItem = __listView.itemAt(0, y + __listView.contentY)
+            if (!(clickedItem && clickedItem.rowItem))
+                return false
+            var branchDecoration = clickedItem.rowItem.branchDecoration
+            if (!branchDecoration)
+                return false
+            var pos = mapToItem(branchDecoration, x, y)
+            return branchDecoration.contains(Qt.point(pos.x, pos.y))
+        }
+
+        function maybeWarnAboutSelectionMode() {
+            if (selectionMode > SelectionMode.SingleSelection)
+                console.warn("TreeView: Non-single selection is not supported without an ItemSelectionModel.")
+        }
+
+        onPressed: {
+            var pressedRow = __listView.indexAt(0, mouseY + __listView.contentY)
+            pressedIndex = modelAdaptor.mapRowToModelIndex(pressedRow)
+            pressedColumn = __listView.columnAt(mouseX)
+            selectOnRelease = false
+            __listView.forceActiveFocus()
+            if (pressedRow === -1
+                || Settings.hasTouchScreen
+                || branchDecorationContains(mouse.x, mouse.y)) {
+                return
+            }
+            if (selectionMode === SelectionMode.ExtendedSelection
+                && selection.isSelected(pressedIndex)) {
+                selectOnRelease = true
+                return
+            }
+            __listView.currentIndex = pressedRow
+            if (!clickedIndex)
+                clickedIndex = pressedIndex
+            mouseSelect(pressedIndex, mouse.modifiers, false)
+            if (!mouse.modifiers)
+                clickedIndex = pressedIndex
+        }
+
+        onReleased: {
+            if (selectOnRelease) {
+                var releasedRow = __listView.indexAt(0, mouseY + __listView.contentY)
+                var releasedIndex = modelAdaptor.mapRowToModelIndex(releasedRow)
+                if (releasedRow >= 0 && releasedIndex === pressedIndex)
+                    mouseSelect(pressedIndex, mouse.modifiers, false)
+            }
+            pressedIndex = undefined
+            pressedColumn = -1
+            autoScroll = 0
+            selectOnRelease = false
+        }
+
+        onPositionChanged: {
+            // NOTE: Testing for pressed is not technically needed, at least
+            // until we decide to support tooltips or some other hover feature
+            if (mouseY > __listView.height && pressed) {
+                if (autoScroll === 1) return;
+                autoScroll = 1
+            } else if (mouseY < 0 && pressed) {
+                if (autoScroll === 2) return;
+                autoScroll = 2
+            } else  {
+                autoScroll = 0
+            }
+
+            if (pressed && containsMouse) {
+                var oldPressedIndex = pressedIndex
+                var pressedRow = __listView.indexAt(0, mouseY + __listView.contentY)
+                pressedIndex = modelAdaptor.mapRowToModelIndex(pressedRow)
+                pressedColumn = __listView.columnAt(mouseX)
+                if (pressedRow > -1 && oldPressedIndex !== pressedIndex) {
+                    __listView.currentIndex = pressedRow
+                    mouseSelect(pressedIndex, mouse.modifiers, true /* drag */)
+                }
+            }
+        }
+
+        onExited: {
+            pressedIndex = undefined
+            pressedColumn = -1
+            selectOnRelease = false
+        }
+
+        onCanceled: {
+            pressedIndex = undefined
+            pressedColumn = -1
+            autoScroll = 0
+            selectOnRelease = false
+        }
+
+        onClicked: {
+            var clickIndex = __listView.indexAt(0, mouseY + __listView.contentY)
+            if (clickIndex > -1) {
+                var modelIndex = modelAdaptor.mapRowToModelIndex(clickIndex)
+                if (branchDecorationContains(mouse.x, mouse.y)) {
+                    if (modelAdaptor.isExpanded(modelIndex))
+                        modelAdaptor.collapse(modelIndex)
+                    else
+                        modelAdaptor.expand(modelIndex)
+                } else {
+                    if (Settings.hasTouchScreen) {
+                        // compensate for the fact that onPressed didn't select on press: do it here instead
+                        pressedIndex = modelAdaptor.mapRowToModelIndex(clickIndex)
+                        pressedColumn = __listView.columnAt(mouseX)
+                        selectOnRelease = false
+                        __listView.forceActiveFocus()
+                        __listView.currentIndex = clickIndex
+                        if (!clickedIndex)
+                            clickedIndex = pressedIndex
+                        mouseSelect(pressedIndex, mouse.modifiers, false)
+                        if (!mouse.modifiers)
+                            clickedIndex = pressedIndex
+                    }
+                    if (root.__activateItemOnSingleClick && !mouse.modifiers)
+                        root.activated(modelIndex)
+                }
+                root.clicked(modelIndex)
+            }
+        }
+
+        onDoubleClicked: {
+            var clickIndex = __listView.indexAt(0, mouseY + __listView.contentY)
+            if (clickIndex > -1) {
+                var modelIndex = modelAdaptor.mapRowToModelIndex(clickIndex)
+                if (!root.__activateItemOnSingleClick)
+                    root.activated(modelIndex)
+                root.doubleClicked(modelIndex)
+            }
+        }
+
+        onPressAndHold: {
+            var pressIndex = __listView.indexAt(0, mouseY + __listView.contentY)
+            if (pressIndex > -1) {
+                var modelIndex = modelAdaptor.mapRowToModelIndex(pressIndex)
+                root.pressAndHold(modelIndex)
+            }
+        }
+
+        Keys.forwardTo: [root]
+
+        Keys.onUpPressed: {
+            event.accepted = __listView.decrementCurrentIndexBlocking()
+            keySelect(event.modifiers)
+        }
+
+        Keys.onDownPressed: {
+            event.accepted = __listView.incrementCurrentIndexBlocking()
+            keySelect(event.modifiers)
+        }
+
+        Keys.onRightPressed: {
+            if (root.currentIndex.valid)
+                root.expand(currentIndex)
+            else
+                event.accepted = false
+        }
+
+        Keys.onLeftPressed: {
+            if (root.currentIndex.valid)
+                root.collapse(currentIndex)
+            else
+                event.accepted = false
+        }
+
+        Keys.onReturnPressed: {
+            if (root.currentIndex.valid)
+                root.activated(currentIndex)
+            else
+                event.accepted = false
+        }
+
+        Keys.onPressed: {
+            __listView.scrollIfNeeded(event.key)
+
+            if (event.key === Qt.Key_A && event.modifiers & Qt.ControlModifier
+                && !!selection && selectionMode > SelectionMode.SingleSelection) {
+                var sel = modelAdaptor.selectionForRowRange(0, __listView.count - 1)
+                selection.select(sel, ItemSelectionModel.SelectCurrent)
+            } else if (event.key === Qt.Key_Shift) {
+                shiftPressed = true
+            }
+        }
+
+        Keys.onReleased: {
+            if (event.key === Qt.Key_Shift)
+                shiftPressed = false
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/TreeView.qmlc b/deployment_test/QtQuick/Controls/TreeView.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..fb2b8c6c834da35a590b54897ea905a053a240bb
Binary files /dev/null and b/deployment_test/QtQuick/Controls/TreeView.qmlc differ
diff --git a/deployment_test/QtQuick/Controls/plugins.qmltypes b/deployment_test/QtQuick/Controls/plugins.qmltypes
new file mode 100644
index 0000000000000000000000000000000000000000..0242497c1e1914f5bcdb5ac7ee6eab0b6c68893e
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/plugins.qmltypes
@@ -0,0 +1,3439 @@
+import QtQuick.tooling 1.2
+
+// This file describes the plugin-supplied types contained in the library.
+// It is used for QML tooling purposes only.
+//
+// This file was auto-generated by:
+// 'qmlplugindump -nonrelocatable QtQuick.Controls 1.5'
+
+Module {
+    dependencies: [
+        "QtGraphicalEffects 1.12",
+        "QtQml 2.14",
+        "QtQml.Models 2.2",
+        "QtQuick 2.9",
+        "QtQuick.Controls.Styles 1.4",
+        "QtQuick.Extras 1.4",
+        "QtQuick.Layouts 1.1",
+        "QtQuick.Window 2.2"
+    ]
+    Component {
+        name: "QAbstractItemModel"
+        prototype: "QObject"
+        exports: ["QtQuick.Controls.Private/AbstractItemModel 1.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        Enum {
+            name: "LayoutChangeHint"
+            values: {
+                "NoLayoutChangeHint": 0,
+                "VerticalSortHint": 1,
+                "HorizontalSortHint": 2
+            }
+        }
+        Enum {
+            name: "CheckIndexOption"
+            values: {
+                "NoOption": 0,
+                "IndexIsValid": 1,
+                "DoNotUseParent": 2,
+                "ParentIsInvalid": 4
+            }
+        }
+        Signal {
+            name: "dataChanged"
+            Parameter { name: "topLeft"; type: "QModelIndex" }
+            Parameter { name: "bottomRight"; type: "QModelIndex" }
+            Parameter { name: "roles"; type: "QVector<int>" }
+        }
+        Signal {
+            name: "dataChanged"
+            Parameter { name: "topLeft"; type: "QModelIndex" }
+            Parameter { name: "bottomRight"; type: "QModelIndex" }
+        }
+        Signal {
+            name: "headerDataChanged"
+            Parameter { name: "orientation"; type: "Qt::Orientation" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "layoutChanged"
+            Parameter { name: "parents"; type: "QList<QPersistentModelIndex>" }
+            Parameter { name: "hint"; type: "QAbstractItemModel::LayoutChangeHint" }
+        }
+        Signal {
+            name: "layoutChanged"
+            Parameter { name: "parents"; type: "QList<QPersistentModelIndex>" }
+        }
+        Signal { name: "layoutChanged" }
+        Signal {
+            name: "layoutAboutToBeChanged"
+            Parameter { name: "parents"; type: "QList<QPersistentModelIndex>" }
+            Parameter { name: "hint"; type: "QAbstractItemModel::LayoutChangeHint" }
+        }
+        Signal {
+            name: "layoutAboutToBeChanged"
+            Parameter { name: "parents"; type: "QList<QPersistentModelIndex>" }
+        }
+        Signal { name: "layoutAboutToBeChanged" }
+        Signal {
+            name: "rowsAboutToBeInserted"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "rowsInserted"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "rowsAboutToBeRemoved"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "rowsRemoved"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "columnsAboutToBeInserted"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "columnsInserted"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "columnsAboutToBeRemoved"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal {
+            name: "columnsRemoved"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "first"; type: "int" }
+            Parameter { name: "last"; type: "int" }
+        }
+        Signal { name: "modelAboutToBeReset" }
+        Signal { name: "modelReset" }
+        Signal {
+            name: "rowsAboutToBeMoved"
+            Parameter { name: "sourceParent"; type: "QModelIndex" }
+            Parameter { name: "sourceStart"; type: "int" }
+            Parameter { name: "sourceEnd"; type: "int" }
+            Parameter { name: "destinationParent"; type: "QModelIndex" }
+            Parameter { name: "destinationRow"; type: "int" }
+        }
+        Signal {
+            name: "rowsMoved"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "start"; type: "int" }
+            Parameter { name: "end"; type: "int" }
+            Parameter { name: "destination"; type: "QModelIndex" }
+            Parameter { name: "row"; type: "int" }
+        }
+        Signal {
+            name: "columnsAboutToBeMoved"
+            Parameter { name: "sourceParent"; type: "QModelIndex" }
+            Parameter { name: "sourceStart"; type: "int" }
+            Parameter { name: "sourceEnd"; type: "int" }
+            Parameter { name: "destinationParent"; type: "QModelIndex" }
+            Parameter { name: "destinationColumn"; type: "int" }
+        }
+        Signal {
+            name: "columnsMoved"
+            Parameter { name: "parent"; type: "QModelIndex" }
+            Parameter { name: "start"; type: "int" }
+            Parameter { name: "end"; type: "int" }
+            Parameter { name: "destination"; type: "QModelIndex" }
+            Parameter { name: "column"; type: "int" }
+        }
+        Method { name: "submit"; type: "bool" }
+        Method { name: "revert" }
+        Method {
+            name: "hasIndex"
+            type: "bool"
+            Parameter { name: "row"; type: "int" }
+            Parameter { name: "column"; type: "int" }
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method {
+            name: "hasIndex"
+            type: "bool"
+            Parameter { name: "row"; type: "int" }
+            Parameter { name: "column"; type: "int" }
+        }
+        Method {
+            name: "index"
+            type: "QModelIndex"
+            Parameter { name: "row"; type: "int" }
+            Parameter { name: "column"; type: "int" }
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method {
+            name: "index"
+            type: "QModelIndex"
+            Parameter { name: "row"; type: "int" }
+            Parameter { name: "column"; type: "int" }
+        }
+        Method {
+            name: "parent"
+            type: "QModelIndex"
+            Parameter { name: "child"; type: "QModelIndex" }
+        }
+        Method {
+            name: "sibling"
+            type: "QModelIndex"
+            Parameter { name: "row"; type: "int" }
+            Parameter { name: "column"; type: "int" }
+            Parameter { name: "idx"; type: "QModelIndex" }
+        }
+        Method {
+            name: "rowCount"
+            type: "int"
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method { name: "rowCount"; type: "int" }
+        Method {
+            name: "columnCount"
+            type: "int"
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method { name: "columnCount"; type: "int" }
+        Method {
+            name: "hasChildren"
+            type: "bool"
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method { name: "hasChildren"; type: "bool" }
+        Method {
+            name: "data"
+            type: "QVariant"
+            Parameter { name: "index"; type: "QModelIndex" }
+            Parameter { name: "role"; type: "int" }
+        }
+        Method {
+            name: "data"
+            type: "QVariant"
+            Parameter { name: "index"; type: "QModelIndex" }
+        }
+        Method {
+            name: "setData"
+            type: "bool"
+            Parameter { name: "index"; type: "QModelIndex" }
+            Parameter { name: "value"; type: "QVariant" }
+            Parameter { name: "role"; type: "int" }
+        }
+        Method {
+            name: "setData"
+            type: "bool"
+            Parameter { name: "index"; type: "QModelIndex" }
+            Parameter { name: "value"; type: "QVariant" }
+        }
+        Method {
+            name: "headerData"
+            type: "QVariant"
+            Parameter { name: "section"; type: "int" }
+            Parameter { name: "orientation"; type: "Qt::Orientation" }
+            Parameter { name: "role"; type: "int" }
+        }
+        Method {
+            name: "headerData"
+            type: "QVariant"
+            Parameter { name: "section"; type: "int" }
+            Parameter { name: "orientation"; type: "Qt::Orientation" }
+        }
+        Method {
+            name: "fetchMore"
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method {
+            name: "canFetchMore"
+            type: "bool"
+            Parameter { name: "parent"; type: "QModelIndex" }
+        }
+        Method {
+            name: "flags"
+            type: "Qt::ItemFlags"
+            Parameter { name: "index"; type: "QModelIndex" }
+        }
+        Method {
+            name: "match"
+            type: "QModelIndexList"
+            Parameter { name: "start"; type: "QModelIndex" }
+            Parameter { name: "role"; type: "int" }
+            Parameter { name: "value"; type: "QVariant" }
+            Parameter { name: "hits"; type: "int" }
+            Parameter { name: "flags"; type: "Qt::MatchFlags" }
+        }
+        Method {
+            name: "match"
+            type: "QModelIndexList"
+            Parameter { name: "start"; type: "QModelIndex" }
+            Parameter { name: "role"; type: "int" }
+            Parameter { name: "value"; type: "QVariant" }
+            Parameter { name: "hits"; type: "int" }
+        }
+        Method {
+            name: "match"
+            type: "QModelIndexList"
+            Parameter { name: "start"; type: "QModelIndex" }
+            Parameter { name: "role"; type: "int" }
+            Parameter { name: "value"; type: "QVariant" }
+        }
+    }
+    Component { name: "QAbstractListModel"; prototype: "QAbstractItemModel" }
+    Component {
+        name: "QQuickAbstractStyle1"
+        defaultProperty: "data"
+        prototype: "QObject"
+        exports: ["QtQuick.Controls.Private/AbstractStyle 1.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "padding"; type: "QQuickPadding1"; isReadonly: true; isPointer: true }
+        Property { name: "data"; type: "QObject"; isList: true; isReadonly: true }
+    }
+    Component {
+        name: "QQuickAction1"
+        prototype: "QObject"
+        exports: ["QtQuick.Controls/Action 1.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "text"; type: "string" }
+        Property { name: "iconSource"; type: "QUrl" }
+        Property { name: "iconName"; type: "string" }
+        Property { name: "__icon"; type: "QVariant"; isReadonly: true }
+        Property { name: "tooltip"; type: "string" }
+        Property { name: "enabled"; type: "bool" }
+        Property { name: "checkable"; type: "bool" }
+        Property { name: "checked"; type: "bool" }
+        Property { name: "exclusiveGroup"; type: "QQuickExclusiveGroup1"; isPointer: true }
+        Property { name: "shortcut"; type: "QVariant" }
+        Signal {
+            name: "triggered"
+            Parameter { name: "source"; type: "QObject"; isPointer: true }
+        }
+        Signal { name: "triggered" }
+        Signal {
+            name: "toggled"
+            Parameter { name: "checked"; type: "bool" }
+        }
+        Signal {
+            name: "shortcutChanged"
+            Parameter { name: "shortcut"; type: "QVariant" }
+        }
+        Signal { name: "iconChanged" }
+        Signal {
+            name: "tooltipChanged"
+            Parameter { name: "arg"; type: "string" }
+        }
+        Method {
+            name: "trigger"
+            Parameter { name: "source"; type: "QObject"; isPointer: true }
+        }
+        Method { name: "trigger" }
+    }
+    Component {
+        name: "QQuickCalendarModel1"
+        prototype: "QAbstractListModel"
+        exports: ["QtQuick.Controls.Private/CalendarModel 1.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "visibleDate"; type: "QDate" }
+        Property { name: "locale"; type: "QLocale" }
+        Property { name: "count"; type: "int"; isReadonly: true }
+        Signal {
+            name: "visibleDateChanged"
+            Parameter { name: "visibleDate"; type: "QDate" }
+        }
+        Signal {
+            name: "localeChanged"
+            Parameter { name: "locale"; type: "QLocale" }
+        }
+        Signal {
+            name: "countChanged"
+            Parameter { name: "count"; type: "int" }
+        }
+        Method {
+            name: "dateAt"
+            type: "QDateTime"
+            Parameter { name: "index"; type: "int" }
+        }
+        Method {
+            name: "indexAt"
+            type: "int"
+            Parameter { name: "visibleDate"; type: "QDate" }
+        }
+        Method {
+            name: "weekNumberAt"
+            type: "int"
+            Parameter { name: "row"; type: "int" }
+        }
+    }
+    Component {
+        name: "QQuickControlSettings1"
+        prototype: "QObject"
+        exports: ["QtQuick.Controls.Private/Settings 1.0"]
+        isCreatable: false
+        isSingleton: true
+        exportMetaObjectRevisions: [0]
+        Property { name: "style"; type: "QUrl"; isReadonly: true }
+        Property { name: "styleName"; type: "string" }
+        Property { name: "stylePath"; type: "string" }
+        Property { name: "dpiScaleFactor"; type: "double"; isReadonly: true }
+        Property { name: "dragThreshold"; type: "double"; isReadonly: true }
+        Property { name: "hasTouchScreen"; type: "bool"; isReadonly: true }
+        Property { name: "isMobile"; type: "bool"; isReadonly: true }
+        Property { name: "hoverEnabled"; type: "bool"; isReadonly: true }
+        Method {
+            name: "styleComponent"
+            type: "QQmlComponent*"
+            Parameter { name: "styleDirUrl"; type: "QUrl" }
+            Parameter { name: "controlStyleName"; type: "string" }
+            Parameter { name: "control"; type: "QObject"; isPointer: true }
+        }
+    }
+    Component {
+        name: "QQuickControlsPrivate1"
+        prototype: "QObject"
+        exports: ["QtQuick.Controls.Private/Controls 1.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        attachedType: "QQuickControlsPrivate1Attached"
+    }
+    Component {
+        name: "QQuickControlsPrivate1Attached"
+        prototype: "QObject"
+        Property { name: "window"; type: "QQuickWindow"; isReadonly: true; isPointer: true }
+    }
+    Component {
+        name: "QQuickExclusiveGroup1"
+        defaultProperty: "__actions"
+        prototype: "QObject"
+        exports: ["QtQuick.Controls/ExclusiveGroup 1.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "current"; type: "QObject"; isPointer: true }
+        Property { name: "__actions"; type: "QQuickAction1"; isList: true; isReadonly: true }
+        Method {
+            name: "bindCheckable"
+            Parameter { name: "o"; type: "QObject"; isPointer: true }
+        }
+        Method {
+            name: "unbindCheckable"
+            Parameter { name: "o"; type: "QObject"; isPointer: true }
+        }
+    }
+    Component {
+        name: "QQuickMenu1"
+        defaultProperty: "items"
+        prototype: "QQuickMenuText1"
+        exports: ["QtQuick.Controls.Private/MenuPrivate 1.0"]
+        exportMetaObjectRevisions: [0]
+        Enum {
+            name: "MenuType"
+            values: {
+                "DefaultMenu": 0,
+                "EditMenu": 1
+            }
+        }
+        Property { name: "title"; type: "string" }
+        Property { name: "items"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "__selectedIndex"; type: "int" }
+        Property { name: "__popupVisible"; type: "bool"; isReadonly: true }
+        Property { name: "__contentItem"; type: "QQuickItem"; isPointer: true }
+        Property { name: "__minimumWidth"; type: "int" }
+        Property { name: "__font"; type: "QFont" }
+        Property { name: "__xOffset"; type: "double" }
+        Property { name: "__yOffset"; type: "double" }
+        Property { name: "__action"; type: "QQuickAction1"; isReadonly: true; isPointer: true }
+        Property { name: "__popupGeometry"; type: "QRect"; isReadonly: true }
+        Property { name: "__isProxy"; type: "bool" }
+        Signal { name: "aboutToShow" }
+        Signal { name: "aboutToHide" }
+        Signal { name: "popupVisibleChanged" }
+        Signal { name: "__menuPopupDestroyed" }
+        Signal { name: "menuContentItemChanged" }
+        Signal { name: "minimumWidthChanged" }
+        Signal { name: "__proxyChanged" }
+        Method { name: "__dismissMenu" }
+        Method { name: "__closeAndDestroy" }
+        Method { name: "__dismissAndDestroy" }
+        Method { name: "popup" }
+        Method {
+            name: "addItem"
+            type: "QQuickMenuItem1*"
+            Parameter { type: "string" }
+        }
+        Method {
+            name: "insertItem"
+            type: "QQuickMenuItem1*"
+            Parameter { type: "int" }
+            Parameter { type: "string" }
+        }
+        Method { name: "addSeparator" }
+        Method {
+            name: "insertSeparator"
+            Parameter { type: "int" }
+        }
+        Method {
+            name: "insertItem"
+            Parameter { type: "int" }
+            Parameter { type: "QQuickMenuBase1"; isPointer: true }
+        }
+        Method {
+            name: "removeItem"
+            Parameter { type: "QQuickMenuBase1"; isPointer: true }
+        }
+        Method { name: "clear" }
+        Method {
+            name: "__popup"
+            Parameter { name: "targetRect"; type: "QRectF" }
+            Parameter { name: "atItemIndex"; type: "int" }
+            Parameter { name: "menuType"; type: "MenuType" }
+        }
+        Method {
+            name: "__popup"
+            Parameter { name: "targetRect"; type: "QRectF" }
+            Parameter { name: "atItemIndex"; type: "int" }
+        }
+        Method {
+            name: "__popup"
+            Parameter { name: "targetRect"; type: "QRectF" }
+        }
+    }
+    Component {
+        name: "QQuickMenuBar1"
+        defaultProperty: "menus"
+        prototype: "QObject"
+        exports: ["QtQuick.Controls.Private/MenuBarPrivate 1.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "menus"; type: "QQuickMenu1"; isList: true; isReadonly: true }
+        Property { name: "__contentItem"; type: "QQuickItem"; isPointer: true }
+        Property { name: "__parentWindow"; type: "QQuickWindow"; isPointer: true }
+        Property { name: "__isNative"; type: "bool" }
+        Signal { name: "nativeChanged" }
+        Signal { name: "contentItemChanged" }
+    }
+    Component {
+        name: "QQuickMenuBase1"
+        prototype: "QObject"
+        exports: ["QtQuick.Controls/MenuBase 1.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        Property { name: "visible"; type: "bool" }
+        Property { name: "type"; type: "QQuickMenuItemType1::MenuItemType"; isReadonly: true }
+        Property { name: "__parentMenu"; type: "QObject"; isReadonly: true; isPointer: true }
+        Property { name: "__isNative"; type: "bool"; isReadonly: true }
+        Property { name: "__visualItem"; type: "QQuickItem"; isPointer: true }
+    }
+    Component {
+        name: "QQuickMenuItem1"
+        prototype: "QQuickMenuText1"
+        exports: ["QtQuick.Controls/MenuItem 1.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "text"; type: "string" }
+        Property { name: "checkable"; type: "bool" }
+        Property { name: "checked"; type: "bool" }
+        Property { name: "exclusiveGroup"; type: "QQuickExclusiveGroup1"; isPointer: true }
+        Property { name: "shortcut"; type: "QVariant" }
+        Property { name: "action"; type: "QQuickAction1"; isPointer: true }
+        Signal { name: "triggered" }
+        Signal {
+            name: "toggled"
+            Parameter { name: "checked"; type: "bool" }
+        }
+        Method { name: "trigger" }
+    }
+    Component {
+        name: "QQuickMenuItemType1"
+        exports: ["QtQuick.Controls/MenuItemType 1.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        Enum {
+            name: "MenuItemType"
+            values: {
+                "Separator": 0,
+                "Item": 1,
+                "Menu": 2,
+                "ScrollIndicator": 3
+            }
+        }
+    }
+    Component {
+        name: "QQuickMenuSeparator1"
+        prototype: "QQuickMenuBase1"
+        exports: ["QtQuick.Controls/MenuSeparator 1.0"]
+        exportMetaObjectRevisions: [0]
+    }
+    Component {
+        name: "QQuickMenuText1"
+        prototype: "QQuickMenuBase1"
+        Property { name: "enabled"; type: "bool" }
+        Property { name: "iconSource"; type: "QUrl" }
+        Property { name: "iconName"; type: "string" }
+        Property { name: "__icon"; type: "QVariant"; isReadonly: true }
+        Signal { name: "__textChanged" }
+    }
+    Component {
+        name: "QQuickPadding1"
+        prototype: "QObject"
+        exports: ["QtQuick.Controls.Private/Padding 1.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "left"; type: "int" }
+        Property { name: "top"; type: "int" }
+        Property { name: "right"; type: "int" }
+        Property { name: "bottom"; type: "int" }
+        Method {
+            name: "setLeft"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Method {
+            name: "setTop"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Method {
+            name: "setRight"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Method {
+            name: "setBottom"
+            Parameter { name: "arg"; type: "int" }
+        }
+    }
+    Component {
+        name: "QQuickPopupWindow1"
+        defaultProperty: "popupContentItem"
+        prototype: "QQuickWindow"
+        exports: ["QtQuick.Controls.Private/PopupWindow 1.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "popupContentItem"; type: "QQuickItem"; isPointer: true }
+        Property { name: "parentItem"; type: "QQuickItem"; isPointer: true }
+        Signal { name: "popupDismissed" }
+        Signal { name: "geometryChanged" }
+        Method { name: "show" }
+        Method { name: "dismissPopup" }
+    }
+    Component {
+        name: "QQuickRangeModel1"
+        prototype: "QObject"
+        exports: ["QtQuick.Controls.Private/RangeModel 1.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "value"; type: "double" }
+        Property { name: "minimumValue"; type: "double" }
+        Property { name: "maximumValue"; type: "double" }
+        Property { name: "stepSize"; type: "double" }
+        Property { name: "position"; type: "double" }
+        Property { name: "positionAtMinimum"; type: "double" }
+        Property { name: "positionAtMaximum"; type: "double" }
+        Property { name: "inverted"; type: "bool" }
+        Signal {
+            name: "valueChanged"
+            Parameter { name: "value"; type: "double" }
+        }
+        Signal {
+            name: "positionChanged"
+            Parameter { name: "position"; type: "double" }
+        }
+        Signal {
+            name: "stepSizeChanged"
+            Parameter { name: "stepSize"; type: "double" }
+        }
+        Signal {
+            name: "invertedChanged"
+            Parameter { name: "inverted"; type: "bool" }
+        }
+        Signal {
+            name: "minimumChanged"
+            Parameter { name: "min"; type: "double" }
+        }
+        Signal {
+            name: "maximumChanged"
+            Parameter { name: "max"; type: "double" }
+        }
+        Signal {
+            name: "positionAtMinimumChanged"
+            Parameter { name: "min"; type: "double" }
+        }
+        Signal {
+            name: "positionAtMaximumChanged"
+            Parameter { name: "max"; type: "double" }
+        }
+        Method { name: "toMinimum" }
+        Method { name: "toMaximum" }
+        Method {
+            name: "setValue"
+            Parameter { name: "value"; type: "double" }
+        }
+        Method {
+            name: "setPosition"
+            Parameter { name: "position"; type: "double" }
+        }
+        Method { name: "increaseSingleStep" }
+        Method { name: "decreaseSingleStep" }
+        Method {
+            name: "valueForPosition"
+            type: "double"
+            Parameter { name: "position"; type: "double" }
+        }
+        Method {
+            name: "positionForValue"
+            type: "double"
+            Parameter { name: "value"; type: "double" }
+        }
+    }
+    Component {
+        name: "QQuickRangedDate1"
+        prototype: "QObject"
+        exports: ["QtQuick.Controls.Private/RangedDate 1.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "date"; type: "QDateTime" }
+        Property { name: "minimumDate"; type: "QDateTime" }
+        Property { name: "maximumDate"; type: "QDateTime" }
+    }
+    Component {
+        name: "QQuickRootItem"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        Method {
+            name: "setWidth"
+            Parameter { name: "w"; type: "int" }
+        }
+        Method {
+            name: "setHeight"
+            Parameter { name: "h"; type: "int" }
+        }
+    }
+    Component {
+        name: "QQuickScenePosListener1"
+        prototype: "QObject"
+        exports: ["QtQuick.Controls.Private/ScenePosListener 1.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "item"; type: "QQuickItem"; isPointer: true }
+        Property { name: "scenePos"; type: "QPointF"; isReadonly: true }
+        Property { name: "enabled"; type: "bool" }
+    }
+    Component {
+        name: "QQuickSelectionMode1"
+        exports: ["QtQuick.Controls/SelectionMode 1.1"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        Enum {
+            name: "SelectionMode"
+            values: {
+                "NoSelection": 0,
+                "SingleSelection": 1,
+                "ExtendedSelection": 2,
+                "MultiSelection": 3,
+                "ContiguousSelection": 4
+            }
+        }
+    }
+    Component {
+        name: "QQuickSpinBoxValidator1"
+        prototype: "QValidator"
+        exports: ["QtQuick.Controls.Private/SpinBoxValidator 1.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "text"; type: "string"; isReadonly: true }
+        Property { name: "value"; type: "double" }
+        Property { name: "minimumValue"; type: "double" }
+        Property { name: "maximumValue"; type: "double" }
+        Property { name: "decimals"; type: "int" }
+        Property { name: "stepSize"; type: "double" }
+        Property { name: "prefix"; type: "string" }
+        Property { name: "suffix"; type: "string" }
+        Method { name: "increment" }
+        Method { name: "decrement" }
+    }
+    Component {
+        name: "QQuickStack1"
+        prototype: "QObject"
+        exports: ["QtQuick.Controls/Stack 1.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        Enum {
+            name: "Status"
+            values: {
+                "Inactive": 0,
+                "Deactivating": 1,
+                "Activating": 2,
+                "Active": 3
+            }
+        }
+        Property { name: "index"; type: "int"; isReadonly: true }
+        Property { name: "__index"; type: "int" }
+        Property { name: "status"; type: "Status"; isReadonly: true }
+        Property { name: "__status"; type: "Status" }
+        Property { name: "view"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property { name: "__view"; type: "QQuickItem"; isPointer: true }
+    }
+    Component {
+        name: "QQuickStyleItem1"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        exports: ["QtQuick.Controls.Private/StyleItem 1.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "border"; type: "QQuickPadding1"; isReadonly: true; isPointer: true }
+        Property { name: "sunken"; type: "bool" }
+        Property { name: "raised"; type: "bool" }
+        Property { name: "active"; type: "bool" }
+        Property { name: "selected"; type: "bool" }
+        Property { name: "hasFocus"; type: "bool" }
+        Property { name: "on"; type: "bool" }
+        Property { name: "hover"; type: "bool" }
+        Property { name: "horizontal"; type: "bool" }
+        Property { name: "isTransient"; type: "bool" }
+        Property { name: "elementType"; type: "string" }
+        Property { name: "text"; type: "string" }
+        Property { name: "activeControl"; type: "string" }
+        Property { name: "style"; type: "string"; isReadonly: true }
+        Property { name: "hints"; type: "QVariantMap" }
+        Property { name: "properties"; type: "QVariantMap" }
+        Property { name: "font"; type: "QFont"; isReadonly: true }
+        Property { name: "minimum"; type: "int" }
+        Property { name: "maximum"; type: "int" }
+        Property { name: "value"; type: "int" }
+        Property { name: "step"; type: "int" }
+        Property { name: "paintMargins"; type: "int" }
+        Property { name: "contentWidth"; type: "int" }
+        Property { name: "contentHeight"; type: "int" }
+        Property { name: "textureWidth"; type: "int" }
+        Property { name: "textureHeight"; type: "int" }
+        Signal { name: "transientChanged" }
+        Signal { name: "infoChanged" }
+        Signal { name: "hintChanged" }
+        Signal {
+            name: "contentWidthChanged"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Signal {
+            name: "contentHeightChanged"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Signal {
+            name: "textureWidthChanged"
+            Parameter { name: "w"; type: "int" }
+        }
+        Signal {
+            name: "textureHeightChanged"
+            Parameter { name: "h"; type: "int" }
+        }
+        Method {
+            name: "pixelMetric"
+            type: "int"
+            Parameter { type: "string" }
+        }
+        Method {
+            name: "styleHint"
+            type: "QVariant"
+            Parameter { type: "string" }
+        }
+        Method { name: "updateSizeHint" }
+        Method { name: "updateRect" }
+        Method { name: "updateBaselineOffset" }
+        Method { name: "updateItem" }
+        Method {
+            name: "hitTest"
+            type: "string"
+            Parameter { name: "x"; type: "int" }
+            Parameter { name: "y"; type: "int" }
+        }
+        Method {
+            name: "subControlRect"
+            type: "QRectF"
+            Parameter { name: "subcontrolString"; type: "string" }
+        }
+        Method {
+            name: "elidedText"
+            type: "string"
+            Parameter { name: "text"; type: "string" }
+            Parameter { name: "elideMode"; type: "int" }
+            Parameter { name: "width"; type: "int" }
+        }
+        Method {
+            name: "hasThemeIcon"
+            type: "bool"
+            Parameter { type: "string" }
+        }
+        Method {
+            name: "textWidth"
+            type: "double"
+            Parameter { type: "string" }
+        }
+        Method {
+            name: "textHeight"
+            type: "double"
+            Parameter { type: "string" }
+        }
+    }
+    Component {
+        name: "QQuickTooltip1"
+        prototype: "QObject"
+        exports: ["QtQuick.Controls.Private/Tooltip 1.0"]
+        isCreatable: false
+        isSingleton: true
+        exportMetaObjectRevisions: [0]
+        Method {
+            name: "showText"
+            Parameter { name: "item"; type: "QQuickItem"; isPointer: true }
+            Parameter { name: "pos"; type: "QPointF" }
+            Parameter { name: "text"; type: "string" }
+        }
+        Method { name: "hideText" }
+    }
+    Component {
+        name: "QQuickTreeModelAdaptor1"
+        prototype: "QAbstractListModel"
+        exports: ["QtQuick.Controls.Private/TreeModelAdaptor 1.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "model"; type: "QAbstractItemModel"; isPointer: true }
+        Property { name: "rootIndex"; type: "QModelIndex" }
+        Signal {
+            name: "modelChanged"
+            Parameter { name: "model"; type: "QAbstractItemModel"; isPointer: true }
+        }
+        Signal {
+            name: "expanded"
+            Parameter { name: "index"; type: "QModelIndex" }
+        }
+        Signal {
+            name: "collapsed"
+            Parameter { name: "index"; type: "QModelIndex" }
+        }
+        Method {
+            name: "expand"
+            Parameter { type: "QModelIndex" }
+        }
+        Method {
+            name: "collapse"
+            Parameter { type: "QModelIndex" }
+        }
+        Method {
+            name: "setModel"
+            Parameter { name: "model"; type: "QAbstractItemModel"; isPointer: true }
+        }
+        Method {
+            name: "mapRowToModelIndex"
+            type: "QModelIndex"
+            Parameter { name: "row"; type: "int" }
+        }
+        Method {
+            name: "selectionForRowRange"
+            type: "QItemSelection"
+            Parameter { name: "fromIndex"; type: "QModelIndex" }
+            Parameter { name: "toIndex"; type: "QModelIndex" }
+        }
+        Method {
+            name: "isExpanded"
+            type: "bool"
+            Parameter { type: "QModelIndex" }
+        }
+    }
+    Component {
+        name: "QQuickWheelArea1"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        exports: ["QtQuick.Controls.Private/WheelArea 1.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "verticalDelta"; type: "double" }
+        Property { name: "horizontalDelta"; type: "double" }
+        Property { name: "horizontalMinimumValue"; type: "double" }
+        Property { name: "horizontalMaximumValue"; type: "double" }
+        Property { name: "verticalMinimumValue"; type: "double" }
+        Property { name: "verticalMaximumValue"; type: "double" }
+        Property { name: "horizontalValue"; type: "double" }
+        Property { name: "verticalValue"; type: "double" }
+        Property { name: "scrollSpeed"; type: "double" }
+        Property { name: "active"; type: "bool" }
+        Property { name: "inverted"; type: "bool"; isReadonly: true }
+        Signal { name: "verticalWheelMoved" }
+        Signal { name: "horizontalWheelMoved" }
+    }
+    Component {
+        prototype: "QQuickWindowQmlImpl"
+        name: "QtQuick.Controls/ApplicationWindow 1.0"
+        exports: ["QtQuick.Controls/ApplicationWindow 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "menuBar"; type: "MenuBar_QMLTYPE_4"; isPointer: true }
+        Property { name: "toolBar"; type: "QQuickItem"; isPointer: true }
+        Property { name: "statusBar"; type: "QQuickItem"; isPointer: true }
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__topBottomMargins"; type: "double" }
+        Property { name: "__qwindowsize_max"; type: "double"; isReadonly: true }
+        Property { name: "__width"; type: "double" }
+        Property { name: "__height"; type: "double" }
+        Property { name: "contentItem"; type: "ContentItem_QMLTYPE_2"; isReadonly: true; isPointer: true }
+        Property { name: "__style"; type: "QObject"; isReadonly: true; isPointer: true }
+        Property { name: "__panel"; type: "QObject"; isReadonly: true; isPointer: true }
+        Property { name: "data"; type: "QObject"; isList: true; isReadonly: true }
+    }
+    Component {
+        prototype: "QObject"
+        name: "QtQuick.Controls.Styles/ApplicationWindowStyle 1.3"
+        exports: ["QtQuick.Controls.Styles/ApplicationWindowStyle 1.3"]
+        exportMetaObjectRevisions: [3]
+        isComposite: true
+        Property {
+            name: "control"
+            type: "ApplicationWindow_QMLTYPE_14"
+            isReadonly: true
+            isPointer: true
+        }
+        Property { name: "background"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "panel"; type: "QQmlComponent"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickFocusScope"
+        name: "QtQuick.Controls/BusyIndicator 1.1"
+        exports: ["QtQuick.Controls/BusyIndicator 1.1"]
+        exportMetaObjectRevisions: [1]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "running"; type: "bool" }
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__style"; type: "QObject"; isPointer: true }
+        Property { name: "__panel"; type: "QQuickItem"; isPointer: true }
+        Property { name: "styleHints"; type: "QVariant" }
+        Property { name: "__styleData"; type: "QObject"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickAbstractStyle1"
+        name: "QtQuick.Controls.Styles/BusyIndicatorStyle 1.1"
+        exports: ["QtQuick.Controls.Styles/BusyIndicatorStyle 1.1"]
+        exportMetaObjectRevisions: [1]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "control"; type: "BusyIndicator_QMLTYPE_21"; isReadonly: true; isPointer: true }
+        Property { name: "indicator"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "panel"; type: "QQmlComponent"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickFocusScope"
+        name: "QtQuick.Controls/Button 1.0"
+        exports: ["QtQuick.Controls/Button 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "isDefault"; type: "bool" }
+        Property { name: "menu"; type: "Menu_QMLTYPE_55"; isPointer: true }
+        Property { name: "checkable"; type: "bool" }
+        Property { name: "checked"; type: "bool" }
+        Property { name: "exclusiveGroup"; type: "QQuickExclusiveGroup1"; isPointer: true }
+        Property { name: "action"; type: "QQuickAction1"; isPointer: true }
+        Property { name: "activeFocusOnPress"; type: "bool" }
+        Property { name: "text"; type: "string" }
+        Property { name: "tooltip"; type: "string" }
+        Property { name: "iconSource"; type: "QUrl" }
+        Property { name: "iconName"; type: "string" }
+        Property { name: "__position"; type: "string" }
+        Property { name: "__iconOverriden"; type: "bool"; isReadonly: true }
+        Property { name: "__action"; type: "QQuickAction1"; isPointer: true }
+        Property { name: "__iconAction"; type: "QQuickAction1"; isReadonly: true; isPointer: true }
+        Property { name: "__behavior"; type: "QVariant" }
+        Property { name: "__effectivePressed"; type: "bool" }
+        Property { name: "pressed"; type: "bool"; isReadonly: true }
+        Property { name: "hovered"; type: "bool"; isReadonly: true }
+        Signal { name: "clicked" }
+        Method { name: "accessiblePressAction"; type: "QVariant" }
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__style"; type: "QObject"; isPointer: true }
+        Property { name: "__panel"; type: "QQuickItem"; isPointer: true }
+        Property { name: "styleHints"; type: "QVariant" }
+        Property { name: "__styleData"; type: "QObject"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickAbstractStyle1"
+        name: "QtQuick.Controls.Styles/ButtonStyle 1.0"
+        exports: ["QtQuick.Controls.Styles/ButtonStyle 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "control"; type: "Button_QMLTYPE_60"; isReadonly: true; isPointer: true }
+        Property { name: "background"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "label"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "panel"; type: "QQmlComponent"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickFocusScope"
+        name: "QtQuick.Controls/Calendar 1.2"
+        exports: ["QtQuick.Controls/Calendar 1.2"]
+        exportMetaObjectRevisions: [2]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "visibleMonth"; type: "int" }
+        Property { name: "visibleYear"; type: "int" }
+        Property { name: "frameVisible"; type: "bool" }
+        Property { name: "weekNumbersVisible"; type: "bool" }
+        Property { name: "navigationBarVisible"; type: "bool" }
+        Property { name: "dayOfWeekFormat"; type: "int" }
+        Property { name: "locale"; type: "QVariant" }
+        Property { name: "__model"; type: "QQuickCalendarModel1"; isPointer: true }
+        Property { name: "selectedDate"; type: "QDateTime" }
+        Property { name: "minimumDate"; type: "QDateTime" }
+        Property { name: "maximumDate"; type: "QDateTime" }
+        Property { name: "__locale"; type: "QVariant" }
+        Signal {
+            name: "hovered"
+            Parameter { name: "date"; type: "QDateTime" }
+        }
+        Signal {
+            name: "pressed"
+            Parameter { name: "date"; type: "QDateTime" }
+        }
+        Signal {
+            name: "released"
+            Parameter { name: "date"; type: "QDateTime" }
+        }
+        Signal {
+            name: "clicked"
+            Parameter { name: "date"; type: "QDateTime" }
+        }
+        Signal {
+            name: "doubleClicked"
+            Parameter { name: "date"; type: "QDateTime" }
+        }
+        Signal {
+            name: "pressAndHold"
+            Parameter { name: "date"; type: "QDateTime" }
+        }
+        Method { name: "showPreviousMonth"; type: "QVariant" }
+        Method { name: "showNextMonth"; type: "QVariant" }
+        Method { name: "showPreviousYear"; type: "QVariant" }
+        Method { name: "showNextYear"; type: "QVariant" }
+        Method { name: "__selectPreviousMonth"; type: "QVariant" }
+        Method { name: "__selectNextMonth"; type: "QVariant" }
+        Method { name: "__selectPreviousWeek"; type: "QVariant" }
+        Method { name: "__selectNextWeek"; type: "QVariant" }
+        Method { name: "__selectFirstDayOfMonth"; type: "QVariant" }
+        Method { name: "__selectLastDayOfMonth"; type: "QVariant" }
+        Method { name: "__selectPreviousDay"; type: "QVariant" }
+        Method { name: "__selectNextDay"; type: "QVariant" }
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__style"; type: "QObject"; isPointer: true }
+        Property { name: "__panel"; type: "QQuickItem"; isPointer: true }
+        Property { name: "styleHints"; type: "QVariant" }
+        Property { name: "__styleData"; type: "QObject"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickFocusScope"
+        name: "QtQuick.Controls/Calendar 1.6"
+        exports: ["QtQuick.Controls/Calendar 1.6"]
+        exportMetaObjectRevisions: [6]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "visibleMonth"; type: "int" }
+        Property { name: "visibleYear"; type: "int" }
+        Property { name: "frameVisible"; type: "bool" }
+        Property { name: "weekNumbersVisible"; type: "bool" }
+        Property { name: "navigationBarVisible"; type: "bool" }
+        Property { name: "dayOfWeekFormat"; type: "int" }
+        Property { name: "locale"; type: "QVariant" }
+        Property { name: "__model"; type: "QQuickCalendarModel1"; isPointer: true }
+        Property { name: "selectedDate"; type: "QDateTime" }
+        Property { name: "minimumDate"; type: "QDateTime" }
+        Property { name: "maximumDate"; type: "QDateTime" }
+        Property { name: "__locale"; type: "QVariant" }
+        Signal {
+            name: "hovered"
+            Parameter { name: "date"; type: "QDateTime" }
+        }
+        Signal {
+            name: "pressed"
+            Parameter { name: "date"; type: "QDateTime" }
+        }
+        Signal {
+            name: "released"
+            Parameter { name: "date"; type: "QDateTime" }
+        }
+        Signal {
+            name: "clicked"
+            Parameter { name: "date"; type: "QDateTime" }
+        }
+        Signal {
+            name: "doubleClicked"
+            Parameter { name: "date"; type: "QDateTime" }
+        }
+        Signal {
+            name: "pressAndHold"
+            Parameter { name: "date"; type: "QDateTime" }
+        }
+        Method { name: "showPreviousMonth"; type: "QVariant" }
+        Method { name: "showNextMonth"; type: "QVariant" }
+        Method { name: "showPreviousYear"; type: "QVariant" }
+        Method { name: "showNextYear"; type: "QVariant" }
+        Method { name: "__selectPreviousMonth"; type: "QVariant" }
+        Method { name: "__selectNextMonth"; type: "QVariant" }
+        Method { name: "__selectPreviousWeek"; type: "QVariant" }
+        Method { name: "__selectNextWeek"; type: "QVariant" }
+        Method { name: "__selectFirstDayOfMonth"; type: "QVariant" }
+        Method { name: "__selectLastDayOfMonth"; type: "QVariant" }
+        Method { name: "__selectPreviousDay"; type: "QVariant" }
+        Method { name: "__selectNextDay"; type: "QVariant" }
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__style"; type: "QObject"; isPointer: true }
+        Property { name: "__panel"; type: "QQuickItem"; isPointer: true }
+        Property { name: "styleHints"; type: "QVariant" }
+        Property { name: "__styleData"; type: "QObject"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickAbstractStyle1"
+        name: "QtQuick.Controls.Styles/CalendarStyle 1.1"
+        exports: ["QtQuick.Controls.Styles/CalendarStyle 1.1"]
+        exportMetaObjectRevisions: [1]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "control"; type: "Calendar_QMLTYPE_65"; isReadonly: true; isPointer: true }
+        Property { name: "gridColor"; type: "QColor" }
+        Property { name: "gridVisible"; type: "bool" }
+        Property { name: "__gridLineWidth"; type: "double" }
+        Property { name: "__horizontalSeparatorColor"; type: "QColor" }
+        Property { name: "__verticalSeparatorColor"; type: "QColor" }
+        Property { name: "background"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "navigationBar"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "dayDelegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "dayOfWeekDelegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "weekNumberDelegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "panel"; type: "QQmlComponent"; isPointer: true }
+        Method {
+            name: "__cellRectAt"
+            type: "QVariant"
+            Parameter { name: "index"; type: "QVariant" }
+        }
+        Method {
+            name: "__isValidDate"
+            type: "QVariant"
+            Parameter { name: "date"; type: "QVariant" }
+        }
+    }
+    Component {
+        prototype: "QQuickFocusScope"
+        name: "QtQuick.Controls/CheckBox 1.0"
+        exports: ["QtQuick.Controls/CheckBox 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "checkedState"; type: "int" }
+        Property { name: "partiallyCheckedEnabled"; type: "bool" }
+        Property { name: "__ignoreChecked"; type: "bool" }
+        Property { name: "__ignoreCheckedState"; type: "bool" }
+        Method { name: "__cycleCheckBoxStates"; type: "QVariant" }
+        Property { name: "checked"; type: "bool" }
+        Property { name: "activeFocusOnPress"; type: "bool" }
+        Property { name: "exclusiveGroup"; type: "QQuickExclusiveGroup1"; isPointer: true }
+        Property { name: "text"; type: "string" }
+        Property { name: "tooltip"; type: "string" }
+        Property { name: "__cycleStatesHandler"; type: "QVariant" }
+        Property { name: "pressed"; type: "bool" }
+        Property { name: "hovered"; type: "bool"; isReadonly: true }
+        Signal { name: "clicked" }
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__style"; type: "QObject"; isPointer: true }
+        Property { name: "__panel"; type: "QQuickItem"; isPointer: true }
+        Property { name: "styleHints"; type: "QVariant" }
+        Property { name: "__styleData"; type: "QObject"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickAbstractStyle1"
+        name: "QtQuick.Controls.Styles/CheckBoxStyle 1.0"
+        exports: ["QtQuick.Controls.Styles/CheckBoxStyle 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "control"; type: "CheckBox_QMLTYPE_88"; isReadonly: true; isPointer: true }
+        Property { name: "label"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "background"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "spacing"; type: "int" }
+        Property { name: "indicator"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "panel"; type: "QQmlComponent"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickAbstractStyle1"
+        name: "QtQuick.Controls.Styles/CircularButtonStyle 1.0"
+        exports: ["QtQuick.Controls.Styles/CircularButtonStyle 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property {
+            name: "__buttonHelper"
+            type: "CircularButtonStyleHelper_QMLTYPE_93"
+            isReadonly: true
+            isPointer: true
+        }
+        Property { name: "control"; type: "Button_QMLTYPE_60"; isReadonly: true; isPointer: true }
+        Property { name: "background"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "label"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "panel"; type: "QQmlComponent"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickAbstractStyle1"
+        name: "QtQuick.Controls.Styles/CircularGaugeStyle 1.0"
+        exports: ["QtQuick.Controls.Styles/CircularGaugeStyle 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "control"; type: "CircularGauge_QMLTYPE_97"; isReadonly: true; isPointer: true }
+        Property { name: "outerRadius"; type: "double"; isReadonly: true }
+        Property { name: "minimumValueAngle"; type: "double" }
+        Property { name: "maximumValueAngle"; type: "double" }
+        Property { name: "angleRange"; type: "double"; isReadonly: true }
+        Property { name: "needleRotation"; type: "double" }
+        Property { name: "tickmarkStepSize"; type: "double" }
+        Property { name: "tickmarkInset"; type: "double" }
+        Property { name: "tickmarkCount"; type: "int"; isReadonly: true }
+        Property { name: "minorTickmarkCount"; type: "int" }
+        Property { name: "minorTickmarkInset"; type: "double" }
+        Property { name: "labelInset"; type: "double" }
+        Property { name: "labelStepSize"; type: "double" }
+        Property { name: "labelCount"; type: "int"; isReadonly: true }
+        Property { name: "__protectedScope"; type: "QObject"; isPointer: true }
+        Property { name: "background"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "tickmark"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "minorTickmark"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "tickmarkLabel"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "needle"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "foreground"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "panel"; type: "QQmlComponent"; isPointer: true }
+        Method {
+            name: "valueToAngle"
+            type: "QVariant"
+            Parameter { name: "value"; type: "QVariant" }
+        }
+    }
+    Component {
+        prototype: "QQuickAbstractStyle1"
+        name: "QtQuick.Controls.Styles/CircularTickmarkLabelStyle 1.0"
+        exports: ["QtQuick.Controls.Styles/CircularTickmarkLabelStyle 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "outerRadius"; type: "double"; isReadonly: true }
+        Property { name: "__protectedScope"; type: "QObject"; isPointer: true }
+        Property { name: "tickmark"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "minorTickmark"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "tickmarkLabel"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "panel"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "control"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickFocusScope"
+        name: "QtQuick.Controls/ComboBox 1.0"
+        exports: ["QtQuick.Controls/ComboBox 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "textRole"; type: "string" }
+        Property { name: "editable"; type: "bool" }
+        Property { name: "activeFocusOnPress"; type: "bool" }
+        Property { name: "pressed"; type: "bool"; isReadonly: true }
+        Property { name: "hovered"; type: "bool"; isReadonly: true }
+        Property { name: "menu"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "selectByMouse"; type: "bool" }
+        Property { name: "inputMethodComposing"; type: "bool"; isReadonly: true }
+        Property { name: "__popup"; type: "QVariant" }
+        Property { name: "model"; type: "QVariant" }
+        Property { name: "currentIndex"; type: "int" }
+        Property { name: "currentText"; type: "string"; isReadonly: true }
+        Property { name: "editText"; type: "string" }
+        Property { name: "inputMethodHints"; type: "int" }
+        Property { name: "count"; type: "int"; isReadonly: true }
+        Property { name: "validator"; type: "QValidator"; isPointer: true }
+        Property { name: "acceptableInput"; type: "bool"; isReadonly: true }
+        Signal { name: "accepted" }
+        Signal {
+            name: "activated"
+            Parameter { name: "index"; type: "int" }
+        }
+        Method {
+            name: "textAt"
+            type: "QVariant"
+            Parameter { name: "index"; type: "QVariant" }
+        }
+        Method {
+            name: "find"
+            type: "QVariant"
+            Parameter { name: "text"; type: "QVariant" }
+        }
+        Method { name: "selectAll"; type: "QVariant" }
+        Method { name: "__selectPrevItem"; type: "QVariant" }
+        Method { name: "__selectNextItem"; type: "QVariant" }
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__style"; type: "QObject"; isPointer: true }
+        Property { name: "__panel"; type: "QQuickItem"; isPointer: true }
+        Property { name: "styleHints"; type: "QVariant" }
+        Property { name: "__styleData"; type: "QObject"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickAbstractStyle1"
+        name: "QtQuick.Controls.Styles/ComboBoxStyle 1.0"
+        exports: ["QtQuick.Controls.Styles/ComboBoxStyle 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "renderType"; type: "int" }
+        Property { name: "font"; type: "QFont" }
+        Property { name: "textColor"; type: "QColor" }
+        Property { name: "selectionColor"; type: "QColor" }
+        Property { name: "selectedTextColor"; type: "QColor" }
+        Property { name: "control"; type: "ComboBox_QMLTYPE_120"; isReadonly: true; isPointer: true }
+        Property { name: "dropDownButtonWidth"; type: "int" }
+        Property { name: "background"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__editor"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "label"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "panel"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__dropDownStyle"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__popupStyle"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__cursorHandle"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__selectionHandle"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__cursorDelegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "drowDownButtonWidth"; type: "int" }
+    }
+    Component {
+        prototype: "QObject"
+        name: "QtQuick.Controls.Styles/CommonStyleHelper 1.0"
+        exports: ["QtQuick.Controls.Styles/CommonStyleHelper 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        Property { name: "control"; type: "QQuickItem"; isPointer: true }
+        Property { name: "buttonColorUpTop"; type: "QColor" }
+        Property { name: "buttonColorUpBottom"; type: "QColor" }
+        Property { name: "buttonColorDownTop"; type: "QColor" }
+        Property { name: "buttonColorDownBottom"; type: "QColor" }
+        Property { name: "textColorUp"; type: "QColor" }
+        Property { name: "textColorDown"; type: "QColor" }
+        Property { name: "textRaisedColorUp"; type: "QColor" }
+        Property { name: "textRaisedColorDown"; type: "QColor" }
+        Property { name: "offColor"; type: "QColor" }
+        Property { name: "offColorShine"; type: "QColor" }
+        Property { name: "onColor"; type: "QColor" }
+        Property { name: "onColorShine"; type: "QColor" }
+        Property { name: "inactiveColor"; type: "QColor" }
+        Property { name: "inactiveColorShine"; type: "QColor" }
+    }
+    Component {
+        prototype: "QQuickAbstractStyle1"
+        name: "QtQuick.Controls.Styles/DelayButtonStyle 1.0"
+        exports: ["QtQuick.Controls.Styles/DelayButtonStyle 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "control"; type: "DelayButton_QMLTYPE_159"; isReadonly: true; isPointer: true }
+        Property { name: "progressBarGradient"; type: "QQuickGradient"; isPointer: true }
+        Property { name: "progressBarDropShadowColor"; type: "QColor" }
+        Property { name: "foreground"; type: "QQmlComponent"; isPointer: true }
+        Property {
+            name: "__buttonHelper"
+            type: "CircularButtonStyleHelper_QMLTYPE_93"
+            isReadonly: true
+            isPointer: true
+        }
+        Property { name: "background"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "label"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "panel"; type: "QQmlComponent"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickAbstractStyle1"
+        name: "QtQuick.Controls.Styles/DialStyle 1.1"
+        exports: ["QtQuick.Controls.Styles/DialStyle 1.1"]
+        exportMetaObjectRevisions: [1]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "control"; type: "Dial_QMLTYPE_165"; isReadonly: true; isPointer: true }
+        Property { name: "outerRadius"; type: "double"; isReadonly: true }
+        Property { name: "handleInset"; type: "double" }
+        Property { name: "tickmarkStepSize"; type: "double" }
+        Property { name: "tickmarkInset"; type: "double" }
+        Property { name: "tickmarkCount"; type: "int"; isReadonly: true }
+        Property { name: "minorTickmarkCount"; type: "int" }
+        Property { name: "minorTickmarkInset"; type: "double" }
+        Property { name: "labelInset"; type: "double" }
+        Property { name: "labelStepSize"; type: "double" }
+        Property { name: "labelCount"; type: "int"; isReadonly: true }
+        Property { name: "__tickmarkRadius"; type: "double"; isReadonly: true }
+        Property { name: "__handleRadius"; type: "double"; isReadonly: true }
+        Property { name: "__dragToSet"; type: "bool" }
+        Property { name: "background"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "handle"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "tickmark"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "minorTickmark"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "tickmarkLabel"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "panel"; type: "QQmlComponent"; isPointer: true }
+        Method {
+            name: "valueToAngle"
+            type: "QVariant"
+            Parameter { name: "value"; type: "QVariant" }
+        }
+    }
+    Component {
+        prototype: "QQuickAbstractStyle1"
+        name: "QtQuick.Controls.Styles/GaugeStyle 1.0"
+        exports: ["QtQuick.Controls.Styles/GaugeStyle 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "control"; type: "Gauge_QMLTYPE_173"; isReadonly: true; isPointer: true }
+        Property { name: "valuePosition"; type: "double"; isReadonly: true }
+        Property { name: "background"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "tickmark"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "minorTickmark"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "tickmarkLabel"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "valueBar"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "foreground"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "panel"; type: "QQmlComponent"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickFocusScope"
+        name: "QtQuick.Controls/GroupBox 1.0"
+        exports: ["QtQuick.Controls/GroupBox 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "__content"
+        Property { name: "title"; type: "string" }
+        Property { name: "flat"; type: "bool" }
+        Property { name: "checkable"; type: "bool" }
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "checked"; type: "bool" }
+        Property { name: "__content"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "contentItem"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property { name: "__checkbox"; type: "CheckBox_QMLTYPE_88"; isReadonly: true; isPointer: true }
+        Property { name: "__style"; type: "QObject"; isReadonly: true; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickAbstractStyle1"
+        name: "QtQuick.Controls.Styles/HandleStyle 1.0"
+        exports: ["QtQuick.Controls.Styles/HandleStyle 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "handle"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "panel"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "handleColorTop"; type: "QColor" }
+        Property { name: "handleColorBottom"; type: "QColor" }
+        Property { name: "handleColorBottomStop"; type: "double" }
+        Property { name: "control"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+    }
+    Component {
+        prototype: "QObject"
+        name: "QtQuick.Controls.Styles/HandleStyleHelper 1.0"
+        exports: ["QtQuick.Controls.Styles/HandleStyleHelper 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        Property { name: "handleColorTop"; type: "QColor" }
+        Property { name: "handleColorBottom"; type: "QColor" }
+        Property { name: "handleColorBottomStop"; type: "double" }
+        Property { name: "handleRingColorTop"; type: "QColor" }
+        Property { name: "handleRingColorBottom"; type: "QColor" }
+        Method {
+            name: "paintHandle"
+            type: "QVariant"
+            Parameter { name: "ctx"; type: "QVariant" }
+            Parameter { name: "handleX"; type: "QVariant" }
+            Parameter { name: "handleY"; type: "QVariant" }
+            Parameter { name: "handleWidth"; type: "QVariant" }
+            Parameter { name: "handleHeight"; type: "QVariant" }
+        }
+    }
+    Component {
+        prototype: "QQuickText"
+        name: "QtQuick.Controls/Label 1.0"
+        exports: ["QtQuick.Controls/Label 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+    }
+    Component {
+        prototype: "QQuickMenu1"
+        name: "QtQuick.Controls/Menu 1.0"
+        exports: ["QtQuick.Controls/Menu 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "items"
+        Property { name: "__selfComponent"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__usingDefaultStyle"; type: "bool" }
+        Property { name: "__parentContentItem"; type: "QVariant" }
+        Property { name: "__currentIndex"; type: "int" }
+        Method {
+            name: "addMenu"
+            type: "QVariant"
+            Parameter { name: "title"; type: "QVariant" }
+        }
+        Method {
+            name: "insertMenu"
+            type: "QVariant"
+            Parameter { name: "index"; type: "QVariant" }
+            Parameter { name: "title"; type: "QVariant" }
+        }
+    }
+    Component {
+        prototype: "QQuickMenuBar1"
+        name: "QtQuick.Controls/MenuBar 1.0"
+        exports: ["QtQuick.Controls/MenuBar 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "menus"
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__style"; type: "QObject"; isPointer: true }
+        Property { name: "__menuBarComponent"; type: "QQmlComponent"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickAbstractStyle1"
+        name: "QtQuick.Controls.Styles/MenuBarStyle 1.2"
+        exports: ["QtQuick.Controls.Styles/MenuBarStyle 1.2"]
+        exportMetaObjectRevisions: [2]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "background"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "itemDelegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "menuStyle"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "font"; type: "QFont" }
+        Property { name: "__isNative"; type: "bool" }
+        Method {
+            name: "formatMnemonic"
+            type: "QVariant"
+            Parameter { name: "text"; type: "QVariant" }
+            Parameter { name: "underline"; type: "QVariant" }
+        }
+        Property { name: "control"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickAbstractStyle1"
+        name: "QtQuick.Controls.Styles/MenuStyle 1.2"
+        exports: ["QtQuick.Controls.Styles/MenuStyle 1.2"]
+        exportMetaObjectRevisions: [2]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "submenuOverlap"; type: "int" }
+        Property { name: "submenuPopupDelay"; type: "int" }
+        Property { name: "frame"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "separator"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "scrollIndicator"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "font"; type: "QFont" }
+        Property { name: "__menuItemType"; type: "string" }
+        Property { name: "__backgroundColor"; type: "QColor" }
+        Property { name: "__borderColor"; type: "QColor" }
+        Property { name: "__maxPopupHeight"; type: "int" }
+        Property { name: "__selectedBackgroundColor"; type: "QColor" }
+        Property { name: "__labelColor"; type: "QColor" }
+        Property { name: "__selectedLabelColor"; type: "QColor" }
+        Property { name: "__disabledLabelColor"; type: "QColor" }
+        Property { name: "__mirrored"; type: "bool"; isReadonly: true }
+        Property { name: "__leftLabelMargin"; type: "int" }
+        Property { name: "__rightLabelMargin"; type: "int" }
+        Property { name: "__minRightLabelSpacing"; type: "int" }
+        Property { name: "__scrollerStyle"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "menuItemPanel"; type: "QQmlComponent"; isPointer: true }
+        Property {
+            name: "itemDelegate"
+            type: "MenuItemSubControls_QMLTYPE_125"
+            isReadonly: true
+            isPointer: true
+        }
+        Method {
+            name: "formatMnemonic"
+            type: "QVariant"
+            Parameter { name: "text"; type: "QVariant" }
+            Parameter { name: "underline"; type: "QVariant" }
+        }
+        Property { name: "control"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickAbstractStyle1"
+        name: "QtQuick.Controls.Styles/PieMenuStyle 1.3"
+        exports: ["QtQuick.Controls.Styles/PieMenuStyle 1.3"]
+        exportMetaObjectRevisions: [3]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "control"; type: "PieMenu_QMLTYPE_192"; isReadonly: true; isPointer: true }
+        Property { name: "backgroundColor"; type: "QColor" }
+        Property { name: "selectionColor"; type: "QColor" }
+        Property { name: "shadowColor"; type: "QColor" }
+        Property { name: "shadowRadius"; type: "double" }
+        Property { name: "shadowSpread"; type: "double" }
+        Property { name: "radius"; type: "double"; isReadonly: true }
+        Property { name: "cancelRadius"; type: "double" }
+        Property { name: "startAngle"; type: "double" }
+        Property { name: "endAngle"; type: "double" }
+        Property { name: "__iconOffset"; type: "double"; isReadonly: true }
+        Property { name: "__selectableRadius"; type: "double"; isReadonly: true }
+        Property { name: "__implicitWidth"; type: "int" }
+        Property { name: "__implicitHeight"; type: "int" }
+        Property { name: "background"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "cancel"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "title"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "menuItem"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "panel"; type: "QQmlComponent"; isPointer: true }
+        Method {
+            name: "sectionStartAngle"
+            type: "QVariant"
+            Parameter { name: "itemIndex"; type: "QVariant" }
+        }
+        Method {
+            name: "sectionCenterAngle"
+            type: "QVariant"
+            Parameter { name: "itemIndex"; type: "QVariant" }
+        }
+        Method {
+            name: "sectionEndAngle"
+            type: "QVariant"
+            Parameter { name: "itemIndex"; type: "QVariant" }
+        }
+    }
+    Component {
+        prototype: "QQuickFocusScope"
+        name: "QtQuick.Controls/ProgressBar 1.0"
+        exports: ["QtQuick.Controls/ProgressBar 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "value"; type: "double" }
+        Property { name: "minimumValue"; type: "double" }
+        Property { name: "maximumValue"; type: "double" }
+        Property { name: "indeterminate"; type: "bool" }
+        Property { name: "orientation"; type: "int" }
+        Property { name: "__initialized"; type: "bool" }
+        Property { name: "hovered"; type: "bool"; isReadonly: true }
+        Method {
+            name: "setValue"
+            type: "QVariant"
+            Parameter { name: "v"; type: "QVariant" }
+        }
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__style"; type: "QObject"; isPointer: true }
+        Property { name: "__panel"; type: "QQuickItem"; isPointer: true }
+        Property { name: "styleHints"; type: "QVariant" }
+        Property { name: "__styleData"; type: "QObject"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickAbstractStyle1"
+        name: "QtQuick.Controls.Styles/ProgressBarStyle 1.0"
+        exports: ["QtQuick.Controls.Styles/ProgressBarStyle 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "control"; type: "ProgressBar_QMLTYPE_207"; isReadonly: true; isPointer: true }
+        Property { name: "currentProgress"; type: "double"; isReadonly: true }
+        Property { name: "progress"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "background"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "panel"; type: "QQmlComponent"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickFocusScope"
+        name: "QtQuick.Controls/RadioButton 1.0"
+        exports: ["QtQuick.Controls/RadioButton 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "checked"; type: "bool" }
+        Property { name: "activeFocusOnPress"; type: "bool" }
+        Property { name: "exclusiveGroup"; type: "QQuickExclusiveGroup1"; isPointer: true }
+        Property { name: "text"; type: "string" }
+        Property { name: "tooltip"; type: "string" }
+        Property { name: "__cycleStatesHandler"; type: "QVariant" }
+        Property { name: "pressed"; type: "bool" }
+        Property { name: "hovered"; type: "bool"; isReadonly: true }
+        Signal { name: "clicked" }
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__style"; type: "QObject"; isPointer: true }
+        Property { name: "__panel"; type: "QQuickItem"; isPointer: true }
+        Property { name: "styleHints"; type: "QVariant" }
+        Property { name: "__styleData"; type: "QObject"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickAbstractStyle1"
+        name: "QtQuick.Controls.Styles/RadioButtonStyle 1.0"
+        exports: ["QtQuick.Controls.Styles/RadioButtonStyle 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "control"; type: "RadioButton_QMLTYPE_214"; isReadonly: true; isPointer: true }
+        Property { name: "label"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "background"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "spacing"; type: "int" }
+        Property { name: "indicator"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "panel"; type: "QQmlComponent"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickFocusScope"
+        name: "QtQuick.Controls/ScrollView 1.0"
+        exports: ["QtQuick.Controls/ScrollView 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "contentItem"
+        Property { name: "frameVisible"; type: "bool" }
+        Property { name: "highlightOnFocus"; type: "bool" }
+        Property { name: "contentItem"; type: "QQuickItem"; isPointer: true }
+        Property { name: "__scrollBarTopMargin"; type: "int" }
+        Property { name: "__viewTopMargin"; type: "int" }
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__style"; type: "Style_QMLTYPE_3"; isPointer: true }
+        Property { name: "horizontalScrollBarPolicy"; type: "int" }
+        Property { name: "verticalScrollBarPolicy"; type: "int" }
+        Property { name: "viewport"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property { name: "flickableItem"; type: "QQuickFlickable"; isReadonly: true; isPointer: true }
+        Property {
+            name: "__scroller"
+            type: "ScrollViewHelper_QMLTYPE_32"
+            isReadonly: true
+            isPointer: true
+        }
+        Property { name: "__verticalScrollbarOffset"; type: "int" }
+        Property { name: "__wheelAreaScrollSpeed"; type: "double" }
+        Property {
+            name: "__horizontalScrollBar"
+            type: "ScrollBar_QMLTYPE_28"
+            isReadonly: true
+            isPointer: true
+        }
+        Property {
+            name: "__verticalScrollBar"
+            type: "ScrollBar_QMLTYPE_28"
+            isReadonly: true
+            isPointer: true
+        }
+    }
+    Component {
+        prototype: "QQuickAbstractStyle1"
+        name: "QtQuick.Controls.Styles/ScrollViewStyle 1.0"
+        exports: ["QtQuick.Controls.Styles/ScrollViewStyle 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "control"; type: "ScrollView_QMLTYPE_37"; isReadonly: true; isPointer: true }
+        Property { name: "corner"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "scrollToClickedPosition"; type: "bool" }
+        Property { name: "transientScrollBars"; type: "bool" }
+        Property { name: "frame"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "minimumHandleLength"; type: "int" }
+        Property { name: "handleOverlap"; type: "int" }
+        Property { name: "scrollBarBackground"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "handle"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "incrementControl"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "decrementControl"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__scrollbar"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__externalScrollBars"; type: "bool" }
+        Property { name: "__scrollBarSpacing"; type: "int" }
+        Property { name: "__scrollBarFadeDelay"; type: "int" }
+        Property { name: "__scrollBarFadeDuration"; type: "int" }
+        Property { name: "__stickyScrollbars"; type: "bool" }
+    }
+    Component {
+        prototype: "QQuickFocusScope"
+        name: "QtQuick.Controls/Slider 1.0"
+        exports: ["QtQuick.Controls/Slider 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "orientation"; type: "int" }
+        Property { name: "updateValueWhileDragging"; type: "bool" }
+        Property { name: "activeFocusOnPress"; type: "bool" }
+        Property { name: "tickmarksEnabled"; type: "bool" }
+        Property { name: "__horizontal"; type: "bool" }
+        Property { name: "__handlePos"; type: "double" }
+        Property { name: "minimumValue"; type: "double" }
+        Property { name: "maximumValue"; type: "double" }
+        Property { name: "pressed"; type: "bool"; isReadonly: true }
+        Property { name: "hovered"; type: "bool"; isReadonly: true }
+        Property { name: "stepSize"; type: "double" }
+        Property { name: "value"; type: "double" }
+        Property { name: "wheelEnabled"; type: "bool" }
+        Method { name: "accessibleIncreaseAction"; type: "QVariant" }
+        Method { name: "accessibleDecreaseAction"; type: "QVariant" }
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__style"; type: "QObject"; isPointer: true }
+        Property { name: "__panel"; type: "QQuickItem"; isPointer: true }
+        Property { name: "styleHints"; type: "QVariant" }
+        Property { name: "__styleData"; type: "QObject"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickFocusScope"
+        name: "QtQuick.Controls/Slider 1.6"
+        exports: ["QtQuick.Controls/Slider 1.6"]
+        exportMetaObjectRevisions: [6]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "orientation"; type: "int" }
+        Property { name: "updateValueWhileDragging"; type: "bool" }
+        Property { name: "activeFocusOnPress"; type: "bool" }
+        Property { name: "tickmarksEnabled"; type: "bool" }
+        Property { name: "__horizontal"; type: "bool" }
+        Property { name: "__handlePos"; type: "double" }
+        Property { name: "minimumValue"; type: "double" }
+        Property { name: "maximumValue"; type: "double" }
+        Property { name: "pressed"; type: "bool"; isReadonly: true }
+        Property { name: "hovered"; type: "bool"; isReadonly: true }
+        Property { name: "stepSize"; type: "double" }
+        Property { name: "value"; type: "double" }
+        Property { name: "wheelEnabled"; type: "bool" }
+        Method { name: "accessibleIncreaseAction"; type: "QVariant" }
+        Method { name: "accessibleDecreaseAction"; type: "QVariant" }
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__style"; type: "QObject"; isPointer: true }
+        Property { name: "__panel"; type: "QQuickItem"; isPointer: true }
+        Property { name: "styleHints"; type: "QVariant" }
+        Property { name: "__styleData"; type: "QObject"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickAbstractStyle1"
+        name: "QtQuick.Controls.Styles/SliderStyle 1.0"
+        exports: ["QtQuick.Controls.Styles/SliderStyle 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "control"; type: "Slider_QMLTYPE_218"; isReadonly: true; isPointer: true }
+        Property { name: "handle"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "groove"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "tickmarks"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "panel"; type: "QQmlComponent"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickFocusScope"
+        name: "QtQuick.Controls/SpinBox 1.0"
+        exports: ["QtQuick.Controls/SpinBox 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "activeFocusOnPress"; type: "bool" }
+        Property { name: "horizontalAlignment"; type: "int" }
+        Property { name: "hovered"; type: "bool"; isReadonly: true }
+        Property { name: "selectByMouse"; type: "bool" }
+        Property { name: "inputMethodComposing"; type: "bool"; isReadonly: true }
+        Property { name: "menu"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "value"; type: "double" }
+        Property { name: "minimumValue"; type: "double" }
+        Property { name: "maximumValue"; type: "double" }
+        Property { name: "stepSize"; type: "double" }
+        Property { name: "suffix"; type: "string" }
+        Property { name: "prefix"; type: "string" }
+        Property { name: "decimals"; type: "int" }
+        Property { name: "font"; type: "QFont" }
+        Property { name: "cursorPosition"; type: "int" }
+        Property { name: "__text"; type: "string" }
+        Property { name: "__baselineOffset"; type: "double" }
+        Signal { name: "editingFinished" }
+        Method { name: "__increment"; type: "QVariant" }
+        Method { name: "__decrement"; type: "QVariant" }
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__style"; type: "QObject"; isPointer: true }
+        Property { name: "__panel"; type: "QQuickItem"; isPointer: true }
+        Property { name: "styleHints"; type: "QVariant" }
+        Property { name: "__styleData"; type: "QObject"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickAbstractStyle1"
+        name: "QtQuick.Controls.Styles/SpinBoxStyle 1.1"
+        exports: ["QtQuick.Controls.Styles/SpinBoxStyle 1.1"]
+        exportMetaObjectRevisions: [1]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "control"; type: "SpinBox_QMLTYPE_238"; isReadonly: true; isPointer: true }
+        Property { name: "horizontalAlignment"; type: "int" }
+        Property { name: "textColor"; type: "QColor" }
+        Property { name: "selectionColor"; type: "QColor" }
+        Property { name: "selectedTextColor"; type: "QColor" }
+        Property { name: "renderType"; type: "int" }
+        Property { name: "font"; type: "QFont" }
+        Property { name: "incrementControl"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "decrementControl"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "background"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "panel"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__cursorHandle"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__selectionHandle"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__cursorDelegate"; type: "QQmlComponent"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickItem"
+        name: "QtQuick.Controls/SplitView 1.0"
+        exports: ["QtQuick.Controls/SplitView 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "__contents"
+        Property { name: "orientation"; type: "int" }
+        Property { name: "handleDelegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "resizing"; type: "bool" }
+        Property { name: "__contents"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "__items"; type: "QQuickItem"; isList: true; isReadonly: true }
+        Property { name: "__handles"; type: "QQuickItem"; isList: true; isReadonly: true }
+        Method {
+            name: "addItem"
+            type: "QVariant"
+            Parameter { name: "item"; type: "QVariant" }
+        }
+        Method {
+            name: "removeItem"
+            type: "QVariant"
+            Parameter { name: "item"; type: "QVariant" }
+        }
+    }
+    Component {
+        prototype: "QQuickFocusScope"
+        name: "QtQuick.Controls/StackView 1.0"
+        exports: ["QtQuick.Controls/StackView 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "initialItem"; type: "QVariant" }
+        Property { name: "busy"; type: "bool"; isReadonly: true }
+        Property { name: "delegate"; type: "StackViewDelegate_QMLTYPE_252"; isPointer: true }
+        Property { name: "__currentItem"; type: "QQuickItem"; isPointer: true }
+        Property { name: "__depth"; type: "int" }
+        Property { name: "__currentTransition"; type: "QVariant" }
+        Property { name: "__guard"; type: "bool" }
+        Property { name: "invalidItemReplacement"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "depth"; type: "int"; isReadonly: true }
+        Property { name: "currentItem"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Method {
+            name: "push"
+            type: "QVariant"
+            Parameter { name: "item"; type: "QVariant" }
+        }
+        Method {
+            name: "pop"
+            type: "QVariant"
+            Parameter { name: "item"; type: "QVariant" }
+        }
+        Method { name: "clear"; type: "QVariant" }
+        Method {
+            name: "find"
+            type: "QVariant"
+            Parameter { name: "func"; type: "QVariant" }
+            Parameter { name: "onlySearchLoadedItems"; type: "QVariant" }
+        }
+        Method {
+            name: "get"
+            type: "QVariant"
+            Parameter { name: "index"; type: "QVariant" }
+            Parameter { name: "dontLoad"; type: "QVariant" }
+        }
+        Method { name: "completeTransition"; type: "QVariant" }
+        Method {
+            name: "replace"
+            type: "QVariant"
+            Parameter { name: "item"; type: "QVariant" }
+            Parameter { name: "properties"; type: "QVariant" }
+            Parameter { name: "immediate"; type: "QVariant" }
+        }
+        Method {
+            name: "__recursionGuard"
+            type: "QVariant"
+            Parameter { name: "use"; type: "QVariant" }
+        }
+        Method {
+            name: "__loadElement"
+            type: "QVariant"
+            Parameter { name: "element"; type: "QVariant" }
+        }
+        Method {
+            name: "__resolveComponent"
+            type: "QVariant"
+            Parameter { name: "unknownObjectType"; type: "QVariant" }
+            Parameter { name: "element"; type: "QVariant" }
+        }
+        Method {
+            name: "__cleanup"
+            type: "QVariant"
+            Parameter { name: "element"; type: "QVariant" }
+        }
+        Method {
+            name: "__setStatus"
+            type: "QVariant"
+            Parameter { name: "item"; type: "QVariant" }
+            Parameter { name: "status"; type: "QVariant" }
+        }
+        Method {
+            name: "__performTransition"
+            type: "QVariant"
+            Parameter { name: "transition"; type: "QVariant" }
+        }
+        Method { name: "animationFinished"; type: "QVariant" }
+    }
+    Component {
+        prototype: "QObject"
+        name: "QtQuick.Controls/StackViewDelegate 1.0"
+        exports: ["QtQuick.Controls/StackViewDelegate 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        Property { name: "pushTransition"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "popTransition"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "replaceTransition"; type: "QQmlComponent"; isPointer: true }
+        Method {
+            name: "getTransition"
+            type: "QVariant"
+            Parameter { name: "properties"; type: "QVariant" }
+        }
+        Method {
+            name: "transitionFinished"
+            type: "QVariant"
+            Parameter { name: "properties"; type: "QVariant" }
+        }
+    }
+    Component {
+        prototype: "QQuickParallelAnimation"
+        name: "QtQuick.Controls/StackViewTransition 1.0"
+        exports: ["QtQuick.Controls/StackViewTransition 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "animations"
+        Property { name: "name"; type: "string" }
+        Property { name: "enterItem"; type: "QQuickItem"; isPointer: true }
+        Property { name: "exitItem"; type: "QQuickItem"; isPointer: true }
+        Property { name: "immediate"; type: "bool" }
+    }
+    Component {
+        prototype: "QQuickFocusScope"
+        name: "QtQuick.Controls/StatusBar 1.0"
+        exports: ["QtQuick.Controls/StatusBar 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "__content"
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__panel"; type: "QQuickItem"; isPointer: true }
+        Property { name: "__style"; type: "QObject"; isReadonly: true; isPointer: true }
+        Property { name: "__content"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "contentItem"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickAbstractStyle1"
+        name: "QtQuick.Controls.Styles/StatusBarStyle 1.0"
+        exports: ["QtQuick.Controls.Styles/StatusBarStyle 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "background"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "panel"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "control"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickAbstractStyle1"
+        name: "QtQuick.Controls.Styles/StatusIndicatorStyle 1.1"
+        exports: ["QtQuick.Controls.Styles/StatusIndicatorStyle 1.1"]
+        exportMetaObjectRevisions: [1]
+        isComposite: true
+        defaultProperty: "data"
+        Property {
+            name: "control"
+            type: "StatusIndicator_QMLTYPE_261"
+            isReadonly: true
+            isPointer: true
+        }
+        Property { name: "color"; type: "QColor" }
+        Property { name: "indicator"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "panel"; type: "QQmlComponent"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickFocusScope"
+        name: "QtQuick.Controls/Switch 1.1"
+        exports: ["QtQuick.Controls/Switch 1.1"]
+        exportMetaObjectRevisions: [1]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "checked"; type: "bool" }
+        Property { name: "activeFocusOnPress"; type: "bool" }
+        Property { name: "exclusiveGroup"; type: "QQuickExclusiveGroup1"; isPointer: true }
+        Property { name: "pressed"; type: "bool"; isReadonly: true }
+        Signal { name: "clicked" }
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__style"; type: "QObject"; isPointer: true }
+        Property { name: "__panel"; type: "QQuickItem"; isPointer: true }
+        Property { name: "styleHints"; type: "QVariant" }
+        Property { name: "__styleData"; type: "QObject"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickAbstractStyle1"
+        name: "QtQuick.Controls.Styles/SwitchStyle 1.1"
+        exports: ["QtQuick.Controls.Styles/SwitchStyle 1.1"]
+        exportMetaObjectRevisions: [1]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "handle"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "groove"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "panel"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "control"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickLoader"
+        name: "QtQuick.Controls/Tab 1.0"
+        exports: ["QtQuick.Controls/Tab 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "component"
+        Property { name: "title"; type: "string" }
+        Property { name: "__inserted"; type: "bool" }
+        Property { name: "component"; type: "QQmlComponent"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickFocusScope"
+        name: "QtQuick.Controls/TabView 1.0"
+        exports: ["QtQuick.Controls/TabView 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "currentIndex"; type: "int" }
+        Property { name: "count"; type: "int"; isReadonly: true }
+        Property { name: "frameVisible"; type: "bool" }
+        Property { name: "tabsVisible"; type: "bool" }
+        Property { name: "tabPosition"; type: "int" }
+        Property { name: "__tabs"; type: "QQmlListModel"; isPointer: true }
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__styleItem"; type: "QVariant" }
+        Property { name: "contentItem"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property { name: "data"; type: "QObject"; isList: true; isReadonly: true }
+        Method {
+            name: "addTab"
+            type: "QVariant"
+            Parameter { name: "title"; type: "QVariant" }
+            Parameter { name: "component"; type: "QVariant" }
+        }
+        Method {
+            name: "insertTab"
+            type: "QVariant"
+            Parameter { name: "index"; type: "QVariant" }
+            Parameter { name: "title"; type: "QVariant" }
+            Parameter { name: "component"; type: "QVariant" }
+        }
+        Method {
+            name: "removeTab"
+            type: "QVariant"
+            Parameter { name: "index"; type: "QVariant" }
+        }
+        Method {
+            name: "moveTab"
+            type: "QVariant"
+            Parameter { name: "from"; type: "QVariant" }
+            Parameter { name: "to"; type: "QVariant" }
+        }
+        Method {
+            name: "getTab"
+            type: "QVariant"
+            Parameter { name: "index"; type: "QVariant" }
+        }
+        Method {
+            name: "__willRemoveIndex"
+            type: "QVariant"
+            Parameter { name: "index"; type: "QVariant" }
+        }
+        Method {
+            name: "__didInsertIndex"
+            type: "QVariant"
+            Parameter { name: "index"; type: "QVariant" }
+        }
+        Method { name: "__setOpacities"; type: "QVariant" }
+    }
+    Component {
+        prototype: "QQuickAbstractStyle1"
+        name: "QtQuick.Controls.Styles/TabViewStyle 1.0"
+        exports: ["QtQuick.Controls.Styles/TabViewStyle 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "control"; type: "TabView_QMLTYPE_280"; isReadonly: true; isPointer: true }
+        Property { name: "tabsMovable"; type: "bool" }
+        Property { name: "tabsAlignment"; type: "int" }
+        Property { name: "tabOverlap"; type: "int" }
+        Property { name: "frameOverlap"; type: "int" }
+        Property { name: "frame"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "tab"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "leftCorner"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "rightCorner"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "tabBar"; type: "QQmlComponent"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickFocusScope"
+        name: "QtQuick.Controls/TableView 1.0"
+        exports: ["QtQuick.Controls/TableView 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "__columns"
+        Property { name: "model"; type: "QVariant" }
+        Property { name: "rowCount"; type: "int"; isReadonly: true }
+        Property { name: "currentRow"; type: "int" }
+        Property {
+            name: "selection"
+            type: "TableViewSelection_QMLTYPE_308"
+            isReadonly: true
+            isPointer: true
+        }
+        Signal {
+            name: "activated"
+            Parameter { name: "row"; type: "int" }
+        }
+        Signal {
+            name: "clicked"
+            Parameter { name: "row"; type: "int" }
+        }
+        Signal {
+            name: "doubleClicked"
+            Parameter { name: "row"; type: "int" }
+        }
+        Signal {
+            name: "pressAndHold"
+            Parameter { name: "row"; type: "int" }
+        }
+        Method {
+            name: "positionViewAtRow"
+            type: "QVariant"
+            Parameter { name: "row"; type: "QVariant" }
+            Parameter { name: "mode"; type: "QVariant" }
+        }
+        Method {
+            name: "rowAt"
+            type: "QVariant"
+            Parameter { name: "x"; type: "QVariant" }
+            Parameter { name: "y"; type: "QVariant" }
+        }
+        Property { name: "alternatingRowColors"; type: "bool" }
+        Property { name: "headerVisible"; type: "bool" }
+        Property { name: "itemDelegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "rowDelegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "headerDelegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "sortIndicatorColumn"; type: "int" }
+        Property { name: "sortIndicatorVisible"; type: "bool" }
+        Property { name: "sortIndicatorOrder"; type: "int" }
+        Property { name: "selectionMode"; type: "int" }
+        Property { name: "__viewTypeName"; type: "string" }
+        Property { name: "__isTreeView"; type: "bool"; isReadonly: true }
+        Property { name: "__itemDelegateLoader"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__model"; type: "QVariant" }
+        Property { name: "__activateItemOnSingleClick"; type: "bool" }
+        Property { name: "__mouseArea"; type: "QQuickItem"; isPointer: true }
+        Property { name: "backgroundVisible"; type: "bool" }
+        Property { name: "contentHeader"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "contentFooter"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "columnCount"; type: "int"; isReadonly: true }
+        Property { name: "section"; type: "QQuickViewSection"; isReadonly: true; isPointer: true }
+        Property { name: "__columns"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "__currentRowItem"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property { name: "__currentRow"; type: "int" }
+        Property { name: "__listView"; type: "QQuickListView"; isReadonly: true; isPointer: true }
+        Method {
+            name: "addColumn"
+            type: "QVariant"
+            Parameter { name: "column"; type: "QVariant" }
+        }
+        Method {
+            name: "insertColumn"
+            type: "QVariant"
+            Parameter { name: "index"; type: "QVariant" }
+            Parameter { name: "column"; type: "QVariant" }
+        }
+        Method {
+            name: "removeColumn"
+            type: "QVariant"
+            Parameter { name: "index"; type: "QVariant" }
+        }
+        Method {
+            name: "moveColumn"
+            type: "QVariant"
+            Parameter { name: "from"; type: "QVariant" }
+            Parameter { name: "to"; type: "QVariant" }
+        }
+        Method {
+            name: "getColumn"
+            type: "QVariant"
+            Parameter { name: "index"; type: "QVariant" }
+        }
+        Method { name: "resizeColumnsToContents"; type: "QVariant" }
+        Property { name: "frameVisible"; type: "bool" }
+        Property { name: "highlightOnFocus"; type: "bool" }
+        Property { name: "contentItem"; type: "QQuickItem"; isPointer: true }
+        Property { name: "__scrollBarTopMargin"; type: "int" }
+        Property { name: "__viewTopMargin"; type: "int" }
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__style"; type: "Style_QMLTYPE_3"; isPointer: true }
+        Property { name: "horizontalScrollBarPolicy"; type: "int" }
+        Property { name: "verticalScrollBarPolicy"; type: "int" }
+        Property { name: "viewport"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property { name: "flickableItem"; type: "QQuickFlickable"; isReadonly: true; isPointer: true }
+        Property {
+            name: "__scroller"
+            type: "ScrollViewHelper_QMLTYPE_32"
+            isReadonly: true
+            isPointer: true
+        }
+        Property { name: "__verticalScrollbarOffset"; type: "int" }
+        Property { name: "__wheelAreaScrollSpeed"; type: "double" }
+        Property {
+            name: "__horizontalScrollBar"
+            type: "ScrollBar_QMLTYPE_28"
+            isReadonly: true
+            isPointer: true
+        }
+        Property {
+            name: "__verticalScrollBar"
+            type: "ScrollBar_QMLTYPE_28"
+            isReadonly: true
+            isPointer: true
+        }
+    }
+    Component {
+        prototype: "QObject"
+        name: "QtQuick.Controls/TableViewColumn 1.0"
+        exports: ["QtQuick.Controls/TableViewColumn 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        Property { name: "__view"; type: "QQuickItem"; isPointer: true }
+        Property { name: "__index"; type: "int" }
+        Property { name: "title"; type: "string" }
+        Property { name: "role"; type: "string" }
+        Property { name: "width"; type: "int" }
+        Property { name: "visible"; type: "bool" }
+        Property { name: "resizable"; type: "bool" }
+        Property { name: "movable"; type: "bool" }
+        Property { name: "elideMode"; type: "int" }
+        Property { name: "horizontalAlignment"; type: "int" }
+        Property { name: "delegate"; type: "QQmlComponent"; isPointer: true }
+        Method { name: "resizeToContents"; type: "QVariant" }
+    }
+    Component {
+        prototype: "QQuickAbstractStyle1"
+        name: "QtQuick.Controls.Styles/TableViewStyle 1.0"
+        exports: ["QtQuick.Controls.Styles/TableViewStyle 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "control"; type: "TableView_QMLTYPE_312"; isReadonly: true; isPointer: true }
+        Property { name: "textColor"; type: "QColor" }
+        Property { name: "backgroundColor"; type: "QColor" }
+        Property { name: "alternateBackgroundColor"; type: "QColor" }
+        Property { name: "highlightedTextColor"; type: "QColor" }
+        Property { name: "activateItemOnSingleClick"; type: "bool" }
+        Property { name: "headerDelegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "rowDelegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "itemDelegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__branchDelegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__indentation"; type: "int" }
+        Property { name: "corner"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "scrollToClickedPosition"; type: "bool" }
+        Property { name: "transientScrollBars"; type: "bool" }
+        Property { name: "frame"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "minimumHandleLength"; type: "int" }
+        Property { name: "handleOverlap"; type: "int" }
+        Property { name: "scrollBarBackground"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "handle"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "incrementControl"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "decrementControl"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__scrollbar"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__externalScrollBars"; type: "bool" }
+        Property { name: "__scrollBarSpacing"; type: "int" }
+        Property { name: "__scrollBarFadeDelay"; type: "int" }
+        Property { name: "__scrollBarFadeDuration"; type: "int" }
+        Property { name: "__stickyScrollbars"; type: "bool" }
+    }
+    Component {
+        prototype: "QQuickFocusScope"
+        name: "QtQuick.Controls/TextArea 1.0"
+        exports: ["QtQuick.Controls/TextArea 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "inputMethodComposing"; type: "bool"; isReadonly: true }
+        Property { name: "tabChangesFocus"; type: "bool" }
+        Property { name: "selectByMouse"; type: "bool" }
+        Property { name: "menu"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "activeFocusOnPress"; type: "bool" }
+        Property { name: "baseUrl"; type: "QUrl" }
+        Property { name: "canPaste"; type: "bool"; isReadonly: true }
+        Property { name: "canRedo"; type: "bool"; isReadonly: true }
+        Property { name: "canUndo"; type: "bool"; isReadonly: true }
+        Property { name: "textColor"; type: "QColor" }
+        Property { name: "cursorPosition"; type: "int" }
+        Property { name: "cursorRectangle"; type: "QRectF"; isReadonly: true }
+        Property { name: "font"; type: "QFont" }
+        Property { name: "horizontalAlignment"; type: "int" }
+        Property { name: "effectiveHorizontalAlignment"; type: "int"; isReadonly: true }
+        Property { name: "verticalAlignment"; type: "int" }
+        Property { name: "inputMethodHints"; type: "int" }
+        Property { name: "length"; type: "int"; isReadonly: true }
+        Property { name: "lineCount"; type: "int"; isReadonly: true }
+        Property { name: "readOnly"; type: "bool" }
+        Property { name: "selectedText"; type: "string"; isReadonly: true }
+        Property { name: "selectionEnd"; type: "int"; isReadonly: true }
+        Property { name: "selectionStart"; type: "int"; isReadonly: true }
+        Property { name: "text"; type: "string" }
+        Property { name: "textFormat"; type: "int" }
+        Property { name: "wrapMode"; type: "int" }
+        Property { name: "selectByKeyboard"; type: "bool" }
+        Property { name: "hoveredLink"; type: "string"; isReadonly: true }
+        Property { name: "backgroundVisible"; type: "bool" }
+        Property { name: "data"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "textMargin"; type: "double" }
+        Property { name: "contentWidth"; type: "double"; isReadonly: true }
+        Property { name: "contentHeight"; type: "double"; isReadonly: true }
+        Property { name: "textDocument"; type: "QQuickTextDocument"; isReadonly: true; isPointer: true }
+        Signal {
+            name: "linkActivated"
+            Parameter { name: "link"; type: "string" }
+        }
+        Signal {
+            name: "linkHovered"
+            Parameter { name: "link"; type: "string" }
+        }
+        Signal { name: "editingFinished" }
+        Method {
+            name: "append"
+            type: "QVariant"
+            Parameter { name: "string"; type: "QVariant" }
+        }
+        Method { name: "copy"; type: "QVariant" }
+        Method { name: "cut"; type: "QVariant" }
+        Method { name: "deselect"; type: "QVariant" }
+        Method {
+            name: "getFormattedText"
+            type: "QVariant"
+            Parameter { name: "start"; type: "QVariant" }
+            Parameter { name: "end"; type: "QVariant" }
+        }
+        Method {
+            name: "getText"
+            type: "QVariant"
+            Parameter { name: "start"; type: "QVariant" }
+            Parameter { name: "end"; type: "QVariant" }
+        }
+        Method {
+            name: "insert"
+            type: "QVariant"
+            Parameter { name: "position"; type: "QVariant" }
+            Parameter { name: "text"; type: "QVariant" }
+        }
+        Method {
+            name: "isRightToLeft"
+            type: "QVariant"
+            Parameter { name: "start"; type: "QVariant" }
+            Parameter { name: "end"; type: "QVariant" }
+        }
+        Method {
+            name: "moveCursorSelection"
+            type: "QVariant"
+            Parameter { name: "position"; type: "QVariant" }
+            Parameter { name: "mode"; type: "QVariant" }
+        }
+        Method { name: "paste"; type: "QVariant" }
+        Method {
+            name: "positionAt"
+            type: "QVariant"
+            Parameter { name: "x"; type: "QVariant" }
+            Parameter { name: "y"; type: "QVariant" }
+        }
+        Method {
+            name: "positionToRectangle"
+            type: "QVariant"
+            Parameter { name: "position"; type: "QVariant" }
+        }
+        Method { name: "redo"; type: "QVariant" }
+        Method {
+            name: "remove"
+            type: "QVariant"
+            Parameter { name: "start"; type: "QVariant" }
+            Parameter { name: "end"; type: "QVariant" }
+        }
+        Method {
+            name: "select"
+            type: "QVariant"
+            Parameter { name: "start"; type: "QVariant" }
+            Parameter { name: "end"; type: "QVariant" }
+        }
+        Method { name: "selectAll"; type: "QVariant" }
+        Method { name: "selectWord"; type: "QVariant" }
+        Method { name: "undo"; type: "QVariant" }
+        Property { name: "frameVisible"; type: "bool" }
+        Property { name: "highlightOnFocus"; type: "bool" }
+        Property { name: "contentItem"; type: "QQuickItem"; isPointer: true }
+        Property { name: "__scrollBarTopMargin"; type: "int" }
+        Property { name: "__viewTopMargin"; type: "int" }
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__style"; type: "Style_QMLTYPE_3"; isPointer: true }
+        Property { name: "horizontalScrollBarPolicy"; type: "int" }
+        Property { name: "verticalScrollBarPolicy"; type: "int" }
+        Property { name: "viewport"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property { name: "flickableItem"; type: "QQuickFlickable"; isReadonly: true; isPointer: true }
+        Property {
+            name: "__scroller"
+            type: "ScrollViewHelper_QMLTYPE_32"
+            isReadonly: true
+            isPointer: true
+        }
+        Property { name: "__verticalScrollbarOffset"; type: "int" }
+        Property { name: "__wheelAreaScrollSpeed"; type: "double" }
+        Property {
+            name: "__horizontalScrollBar"
+            type: "ScrollBar_QMLTYPE_28"
+            isReadonly: true
+            isPointer: true
+        }
+        Property {
+            name: "__verticalScrollBar"
+            type: "ScrollBar_QMLTYPE_28"
+            isReadonly: true
+            isPointer: true
+        }
+    }
+    Component {
+        prototype: "QQuickFocusScope"
+        name: "QtQuick.Controls/TextArea 1.3"
+        exports: ["QtQuick.Controls/TextArea 1.3"]
+        exportMetaObjectRevisions: [3]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "inputMethodComposing"; type: "bool"; isReadonly: true }
+        Property { name: "tabChangesFocus"; type: "bool" }
+        Property { name: "selectByMouse"; type: "bool" }
+        Property { name: "menu"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "activeFocusOnPress"; type: "bool" }
+        Property { name: "baseUrl"; type: "QUrl" }
+        Property { name: "canPaste"; type: "bool"; isReadonly: true }
+        Property { name: "canRedo"; type: "bool"; isReadonly: true }
+        Property { name: "canUndo"; type: "bool"; isReadonly: true }
+        Property { name: "textColor"; type: "QColor" }
+        Property { name: "cursorPosition"; type: "int" }
+        Property { name: "cursorRectangle"; type: "QRectF"; isReadonly: true }
+        Property { name: "font"; type: "QFont" }
+        Property { name: "horizontalAlignment"; type: "int" }
+        Property { name: "effectiveHorizontalAlignment"; type: "int"; isReadonly: true }
+        Property { name: "verticalAlignment"; type: "int" }
+        Property { name: "inputMethodHints"; type: "int" }
+        Property { name: "length"; type: "int"; isReadonly: true }
+        Property { name: "lineCount"; type: "int"; isReadonly: true }
+        Property { name: "readOnly"; type: "bool" }
+        Property { name: "selectedText"; type: "string"; isReadonly: true }
+        Property { name: "selectionEnd"; type: "int"; isReadonly: true }
+        Property { name: "selectionStart"; type: "int"; isReadonly: true }
+        Property { name: "text"; type: "string" }
+        Property { name: "textFormat"; type: "int" }
+        Property { name: "wrapMode"; type: "int" }
+        Property { name: "selectByKeyboard"; type: "bool" }
+        Property { name: "hoveredLink"; type: "string"; isReadonly: true }
+        Property { name: "backgroundVisible"; type: "bool" }
+        Property { name: "data"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "textMargin"; type: "double" }
+        Property { name: "contentWidth"; type: "double"; isReadonly: true }
+        Property { name: "contentHeight"; type: "double"; isReadonly: true }
+        Property { name: "textDocument"; type: "QQuickTextDocument"; isReadonly: true; isPointer: true }
+        Signal {
+            name: "linkActivated"
+            Parameter { name: "link"; type: "string" }
+        }
+        Signal {
+            name: "linkHovered"
+            Parameter { name: "link"; type: "string" }
+        }
+        Signal { name: "editingFinished" }
+        Method {
+            name: "append"
+            type: "QVariant"
+            Parameter { name: "string"; type: "QVariant" }
+        }
+        Method { name: "copy"; type: "QVariant" }
+        Method { name: "cut"; type: "QVariant" }
+        Method { name: "deselect"; type: "QVariant" }
+        Method {
+            name: "getFormattedText"
+            type: "QVariant"
+            Parameter { name: "start"; type: "QVariant" }
+            Parameter { name: "end"; type: "QVariant" }
+        }
+        Method {
+            name: "getText"
+            type: "QVariant"
+            Parameter { name: "start"; type: "QVariant" }
+            Parameter { name: "end"; type: "QVariant" }
+        }
+        Method {
+            name: "insert"
+            type: "QVariant"
+            Parameter { name: "position"; type: "QVariant" }
+            Parameter { name: "text"; type: "QVariant" }
+        }
+        Method {
+            name: "isRightToLeft"
+            type: "QVariant"
+            Parameter { name: "start"; type: "QVariant" }
+            Parameter { name: "end"; type: "QVariant" }
+        }
+        Method {
+            name: "moveCursorSelection"
+            type: "QVariant"
+            Parameter { name: "position"; type: "QVariant" }
+            Parameter { name: "mode"; type: "QVariant" }
+        }
+        Method { name: "paste"; type: "QVariant" }
+        Method {
+            name: "positionAt"
+            type: "QVariant"
+            Parameter { name: "x"; type: "QVariant" }
+            Parameter { name: "y"; type: "QVariant" }
+        }
+        Method {
+            name: "positionToRectangle"
+            type: "QVariant"
+            Parameter { name: "position"; type: "QVariant" }
+        }
+        Method { name: "redo"; type: "QVariant" }
+        Method {
+            name: "remove"
+            type: "QVariant"
+            Parameter { name: "start"; type: "QVariant" }
+            Parameter { name: "end"; type: "QVariant" }
+        }
+        Method {
+            name: "select"
+            type: "QVariant"
+            Parameter { name: "start"; type: "QVariant" }
+            Parameter { name: "end"; type: "QVariant" }
+        }
+        Method { name: "selectAll"; type: "QVariant" }
+        Method { name: "selectWord"; type: "QVariant" }
+        Method { name: "undo"; type: "QVariant" }
+        Property { name: "frameVisible"; type: "bool" }
+        Property { name: "highlightOnFocus"; type: "bool" }
+        Property { name: "contentItem"; type: "QQuickItem"; isPointer: true }
+        Property { name: "__scrollBarTopMargin"; type: "int" }
+        Property { name: "__viewTopMargin"; type: "int" }
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__style"; type: "Style_QMLTYPE_3"; isPointer: true }
+        Property { name: "horizontalScrollBarPolicy"; type: "int" }
+        Property { name: "verticalScrollBarPolicy"; type: "int" }
+        Property { name: "viewport"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property { name: "flickableItem"; type: "QQuickFlickable"; isReadonly: true; isPointer: true }
+        Property {
+            name: "__scroller"
+            type: "ScrollViewHelper_QMLTYPE_32"
+            isReadonly: true
+            isPointer: true
+        }
+        Property { name: "__verticalScrollbarOffset"; type: "int" }
+        Property { name: "__wheelAreaScrollSpeed"; type: "double" }
+        Property {
+            name: "__horizontalScrollBar"
+            type: "ScrollBar_QMLTYPE_28"
+            isReadonly: true
+            isPointer: true
+        }
+        Property {
+            name: "__verticalScrollBar"
+            type: "ScrollBar_QMLTYPE_28"
+            isReadonly: true
+            isPointer: true
+        }
+    }
+    Component {
+        prototype: "QQuickFocusScope"
+        name: "QtQuick.Controls/TextArea 1.5"
+        exports: ["QtQuick.Controls/TextArea 1.5"]
+        exportMetaObjectRevisions: [5]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "inputMethodComposing"; type: "bool"; isReadonly: true }
+        Property { name: "tabChangesFocus"; type: "bool" }
+        Property { name: "selectByMouse"; type: "bool" }
+        Property { name: "menu"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "activeFocusOnPress"; type: "bool" }
+        Property { name: "baseUrl"; type: "QUrl" }
+        Property { name: "canPaste"; type: "bool"; isReadonly: true }
+        Property { name: "canRedo"; type: "bool"; isReadonly: true }
+        Property { name: "canUndo"; type: "bool"; isReadonly: true }
+        Property { name: "textColor"; type: "QColor" }
+        Property { name: "cursorPosition"; type: "int" }
+        Property { name: "cursorRectangle"; type: "QRectF"; isReadonly: true }
+        Property { name: "font"; type: "QFont" }
+        Property { name: "horizontalAlignment"; type: "int" }
+        Property { name: "effectiveHorizontalAlignment"; type: "int"; isReadonly: true }
+        Property { name: "verticalAlignment"; type: "int" }
+        Property { name: "inputMethodHints"; type: "int" }
+        Property { name: "length"; type: "int"; isReadonly: true }
+        Property { name: "lineCount"; type: "int"; isReadonly: true }
+        Property { name: "readOnly"; type: "bool" }
+        Property { name: "selectedText"; type: "string"; isReadonly: true }
+        Property { name: "selectionEnd"; type: "int"; isReadonly: true }
+        Property { name: "selectionStart"; type: "int"; isReadonly: true }
+        Property { name: "text"; type: "string" }
+        Property { name: "textFormat"; type: "int" }
+        Property { name: "wrapMode"; type: "int" }
+        Property { name: "selectByKeyboard"; type: "bool" }
+        Property { name: "hoveredLink"; type: "string"; isReadonly: true }
+        Property { name: "backgroundVisible"; type: "bool" }
+        Property { name: "data"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "textMargin"; type: "double" }
+        Property { name: "contentWidth"; type: "double"; isReadonly: true }
+        Property { name: "contentHeight"; type: "double"; isReadonly: true }
+        Property { name: "textDocument"; type: "QQuickTextDocument"; isReadonly: true; isPointer: true }
+        Signal {
+            name: "linkActivated"
+            Parameter { name: "link"; type: "string" }
+        }
+        Signal {
+            name: "linkHovered"
+            Parameter { name: "link"; type: "string" }
+        }
+        Signal { name: "editingFinished" }
+        Method {
+            name: "append"
+            type: "QVariant"
+            Parameter { name: "string"; type: "QVariant" }
+        }
+        Method { name: "copy"; type: "QVariant" }
+        Method { name: "cut"; type: "QVariant" }
+        Method { name: "deselect"; type: "QVariant" }
+        Method {
+            name: "getFormattedText"
+            type: "QVariant"
+            Parameter { name: "start"; type: "QVariant" }
+            Parameter { name: "end"; type: "QVariant" }
+        }
+        Method {
+            name: "getText"
+            type: "QVariant"
+            Parameter { name: "start"; type: "QVariant" }
+            Parameter { name: "end"; type: "QVariant" }
+        }
+        Method {
+            name: "insert"
+            type: "QVariant"
+            Parameter { name: "position"; type: "QVariant" }
+            Parameter { name: "text"; type: "QVariant" }
+        }
+        Method {
+            name: "isRightToLeft"
+            type: "QVariant"
+            Parameter { name: "start"; type: "QVariant" }
+            Parameter { name: "end"; type: "QVariant" }
+        }
+        Method {
+            name: "moveCursorSelection"
+            type: "QVariant"
+            Parameter { name: "position"; type: "QVariant" }
+            Parameter { name: "mode"; type: "QVariant" }
+        }
+        Method { name: "paste"; type: "QVariant" }
+        Method {
+            name: "positionAt"
+            type: "QVariant"
+            Parameter { name: "x"; type: "QVariant" }
+            Parameter { name: "y"; type: "QVariant" }
+        }
+        Method {
+            name: "positionToRectangle"
+            type: "QVariant"
+            Parameter { name: "position"; type: "QVariant" }
+        }
+        Method { name: "redo"; type: "QVariant" }
+        Method {
+            name: "remove"
+            type: "QVariant"
+            Parameter { name: "start"; type: "QVariant" }
+            Parameter { name: "end"; type: "QVariant" }
+        }
+        Method {
+            name: "select"
+            type: "QVariant"
+            Parameter { name: "start"; type: "QVariant" }
+            Parameter { name: "end"; type: "QVariant" }
+        }
+        Method { name: "selectAll"; type: "QVariant" }
+        Method { name: "selectWord"; type: "QVariant" }
+        Method { name: "undo"; type: "QVariant" }
+        Property { name: "frameVisible"; type: "bool" }
+        Property { name: "highlightOnFocus"; type: "bool" }
+        Property { name: "contentItem"; type: "QQuickItem"; isPointer: true }
+        Property { name: "__scrollBarTopMargin"; type: "int" }
+        Property { name: "__viewTopMargin"; type: "int" }
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__style"; type: "Style_QMLTYPE_3"; isPointer: true }
+        Property { name: "horizontalScrollBarPolicy"; type: "int" }
+        Property { name: "verticalScrollBarPolicy"; type: "int" }
+        Property { name: "viewport"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property { name: "flickableItem"; type: "QQuickFlickable"; isReadonly: true; isPointer: true }
+        Property {
+            name: "__scroller"
+            type: "ScrollViewHelper_QMLTYPE_32"
+            isReadonly: true
+            isPointer: true
+        }
+        Property { name: "__verticalScrollbarOffset"; type: "int" }
+        Property { name: "__wheelAreaScrollSpeed"; type: "double" }
+        Property {
+            name: "__horizontalScrollBar"
+            type: "ScrollBar_QMLTYPE_28"
+            isReadonly: true
+            isPointer: true
+        }
+        Property {
+            name: "__verticalScrollBar"
+            type: "ScrollBar_QMLTYPE_28"
+            isReadonly: true
+            isPointer: true
+        }
+    }
+    Component {
+        prototype: "QQuickAbstractStyle1"
+        name: "QtQuick.Controls.Styles/TextAreaStyle 1.1"
+        exports: ["QtQuick.Controls.Styles/TextAreaStyle 1.1"]
+        exportMetaObjectRevisions: [1]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "control"; type: "TextArea_QMLTYPE_318"; isReadonly: true; isPointer: true }
+        Property { name: "font"; type: "QFont" }
+        Property { name: "textColor"; type: "QColor" }
+        Property { name: "selectionColor"; type: "QColor" }
+        Property { name: "selectedTextColor"; type: "QColor" }
+        Property { name: "backgroundColor"; type: "QColor" }
+        Property { name: "renderType"; type: "int" }
+        Property { name: "textMargin"; type: "double" }
+        Property { name: "__cursorHandle"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__selectionHandle"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__cursorDelegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__editMenu"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "corner"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "scrollToClickedPosition"; type: "bool" }
+        Property { name: "transientScrollBars"; type: "bool" }
+        Property { name: "frame"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "minimumHandleLength"; type: "int" }
+        Property { name: "handleOverlap"; type: "int" }
+        Property { name: "scrollBarBackground"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "handle"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "incrementControl"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "decrementControl"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__scrollbar"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__externalScrollBars"; type: "bool" }
+        Property { name: "__scrollBarSpacing"; type: "int" }
+        Property { name: "__scrollBarFadeDelay"; type: "int" }
+        Property { name: "__scrollBarFadeDuration"; type: "int" }
+        Property { name: "__stickyScrollbars"; type: "bool" }
+    }
+    Component {
+        prototype: "QQuickFocusScope"
+        name: "QtQuick.Controls/TextField 1.0"
+        exports: ["QtQuick.Controls/TextField 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "inputMethodComposing"; type: "bool"; isReadonly: true }
+        Property { name: "selectByMouse"; type: "bool" }
+        Property { name: "menu"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "acceptableInput"; type: "bool"; isReadonly: true }
+        Property { name: "activeFocusOnPress"; type: "bool" }
+        Property { name: "canPaste"; type: "bool"; isReadonly: true }
+        Property { name: "canRedo"; type: "bool"; isReadonly: true }
+        Property { name: "canUndo"; type: "bool"; isReadonly: true }
+        Property { name: "textColor"; type: "QColor" }
+        Property { name: "cursorPosition"; type: "int" }
+        Property { name: "cursorRectangle"; type: "QRectF"; isReadonly: true }
+        Property { name: "displayText"; type: "string"; isReadonly: true }
+        Property { name: "echoMode"; type: "int" }
+        Property { name: "font"; type: "QFont" }
+        Property { name: "horizontalAlignment"; type: "int" }
+        Property { name: "effectiveHorizontalAlignment"; type: "int"; isReadonly: true }
+        Property { name: "verticalAlignment"; type: "int" }
+        Property { name: "inputMask"; type: "string" }
+        Property { name: "inputMethodHints"; type: "int" }
+        Property { name: "length"; type: "int"; isReadonly: true }
+        Property { name: "maximumLength"; type: "int" }
+        Property { name: "placeholderText"; type: "string" }
+        Property { name: "readOnly"; type: "bool" }
+        Property { name: "selectedText"; type: "string"; isReadonly: true }
+        Property { name: "selectionEnd"; type: "int"; isReadonly: true }
+        Property { name: "selectionStart"; type: "int"; isReadonly: true }
+        Property { name: "text"; type: "string" }
+        Property { name: "validator"; type: "QValidator"; isPointer: true }
+        Property { name: "hovered"; type: "bool"; isReadonly: true }
+        Property { name: "__contentHeight"; type: "double"; isReadonly: true }
+        Property { name: "__contentWidth"; type: "double"; isReadonly: true }
+        Property { name: "__baselineOffset"; type: "double" }
+        Signal { name: "accepted" }
+        Signal { name: "editingFinished" }
+        Method { name: "copy"; type: "QVariant" }
+        Method { name: "cut"; type: "QVariant" }
+        Method { name: "deselect"; type: "QVariant" }
+        Method {
+            name: "getText"
+            type: "QVariant"
+            Parameter { name: "start"; type: "QVariant" }
+            Parameter { name: "end"; type: "QVariant" }
+        }
+        Method {
+            name: "insert"
+            type: "QVariant"
+            Parameter { name: "position"; type: "QVariant" }
+            Parameter { name: "text"; type: "QVariant" }
+        }
+        Method {
+            name: "isRightToLeft"
+            type: "QVariant"
+            Parameter { name: "start"; type: "QVariant" }
+            Parameter { name: "end"; type: "QVariant" }
+        }
+        Method { name: "paste"; type: "QVariant" }
+        Method { name: "redo"; type: "QVariant" }
+        Method {
+            name: "remove"
+            type: "QVariant"
+            Parameter { name: "start"; type: "QVariant" }
+            Parameter { name: "end"; type: "QVariant" }
+        }
+        Method {
+            name: "select"
+            type: "QVariant"
+            Parameter { name: "start"; type: "QVariant" }
+            Parameter { name: "end"; type: "QVariant" }
+        }
+        Method { name: "selectAll"; type: "QVariant" }
+        Method { name: "selectWord"; type: "QVariant" }
+        Method { name: "undo"; type: "QVariant" }
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__style"; type: "QObject"; isPointer: true }
+        Property { name: "__panel"; type: "QQuickItem"; isPointer: true }
+        Property { name: "styleHints"; type: "QVariant" }
+        Property { name: "__styleData"; type: "QObject"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickAbstractStyle1"
+        name: "QtQuick.Controls.Styles/TextFieldStyle 1.0"
+        exports: ["QtQuick.Controls.Styles/TextFieldStyle 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "control"; type: "TextField_QMLTYPE_324"; isReadonly: true; isPointer: true }
+        Property { name: "font"; type: "QFont" }
+        Property { name: "textColor"; type: "QColor" }
+        Property { name: "selectionColor"; type: "QColor" }
+        Property { name: "selectedTextColor"; type: "QColor" }
+        Property { name: "passwordCharacter"; type: "string" }
+        Property { name: "renderType"; type: "int" }
+        Property { name: "placeholderTextColor"; type: "QColor" }
+        Property { name: "background"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "panel"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__cursorHandle"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__selectionHandle"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__cursorDelegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__editMenu"; type: "QQmlComponent"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickAbstractStyle1"
+        name: "QtQuick.Controls.Styles/ToggleButtonStyle 1.0"
+        exports: ["QtQuick.Controls.Styles/ToggleButtonStyle 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "control"; type: "ToggleButton_QMLTYPE_327"; isReadonly: true; isPointer: true }
+        Property { name: "inactiveGradient"; type: "QQuickGradient"; isPointer: true }
+        Property { name: "checkedGradient"; type: "QQuickGradient"; isPointer: true }
+        Property { name: "uncheckedGradient"; type: "QQuickGradient"; isPointer: true }
+        Property { name: "checkedDropShadowColor"; type: "QColor" }
+        Property { name: "uncheckedDropShadowColor"; type: "QColor" }
+        Property {
+            name: "__buttonHelper"
+            type: "CircularButtonStyleHelper_QMLTYPE_93"
+            isReadonly: true
+            isPointer: true
+        }
+        Property { name: "background"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "label"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "panel"; type: "QQmlComponent"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickFocusScope"
+        name: "QtQuick.Controls/ToolBar 1.0"
+        exports: ["QtQuick.Controls/ToolBar 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "__content"
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__panel"; type: "QQuickItem"; isPointer: true }
+        Property { name: "__menu"; type: "QVariant" }
+        Property { name: "__style"; type: "QObject"; isReadonly: true; isPointer: true }
+        Property { name: "__content"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "contentItem"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickAbstractStyle1"
+        name: "QtQuick.Controls.Styles/ToolBarStyle 1.0"
+        exports: ["QtQuick.Controls.Styles/ToolBarStyle 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "background"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "menuButton"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "panel"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "control"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickFocusScope"
+        name: "QtQuick.Controls/ToolButton 1.0"
+        exports: ["QtQuick.Controls/ToolButton 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "isDefault"; type: "bool" }
+        Property { name: "menu"; type: "Menu_QMLTYPE_55"; isPointer: true }
+        Property { name: "checkable"; type: "bool" }
+        Property { name: "checked"; type: "bool" }
+        Property { name: "exclusiveGroup"; type: "QQuickExclusiveGroup1"; isPointer: true }
+        Property { name: "action"; type: "QQuickAction1"; isPointer: true }
+        Property { name: "activeFocusOnPress"; type: "bool" }
+        Property { name: "text"; type: "string" }
+        Property { name: "tooltip"; type: "string" }
+        Property { name: "iconSource"; type: "QUrl" }
+        Property { name: "iconName"; type: "string" }
+        Property { name: "__position"; type: "string" }
+        Property { name: "__iconOverriden"; type: "bool"; isReadonly: true }
+        Property { name: "__action"; type: "QQuickAction1"; isPointer: true }
+        Property { name: "__iconAction"; type: "QQuickAction1"; isReadonly: true; isPointer: true }
+        Property { name: "__behavior"; type: "QVariant" }
+        Property { name: "__effectivePressed"; type: "bool" }
+        Property { name: "pressed"; type: "bool"; isReadonly: true }
+        Property { name: "hovered"; type: "bool"; isReadonly: true }
+        Signal { name: "clicked" }
+        Method { name: "accessiblePressAction"; type: "QVariant" }
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__style"; type: "QObject"; isPointer: true }
+        Property { name: "__panel"; type: "QQuickItem"; isPointer: true }
+        Property { name: "styleHints"; type: "QVariant" }
+        Property { name: "__styleData"; type: "QObject"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickFocusScope"
+        name: "QtQuick.Controls/TreeView 1.4"
+        exports: ["QtQuick.Controls/TreeView 1.4"]
+        exportMetaObjectRevisions: [4]
+        isComposite: true
+        defaultProperty: "__columns"
+        Property { name: "model"; type: "QVariant" }
+        Property { name: "currentIndex"; type: "QVariant"; isReadonly: true }
+        Property { name: "selection"; type: "QItemSelectionModel"; isPointer: true }
+        Property { name: "rootIndex"; type: "QModelIndex" }
+        Signal {
+            name: "activated"
+            Parameter { name: "index"; type: "QVariant" }
+        }
+        Signal {
+            name: "clicked"
+            Parameter { name: "index"; type: "QVariant" }
+        }
+        Signal {
+            name: "doubleClicked"
+            Parameter { name: "index"; type: "QVariant" }
+        }
+        Signal {
+            name: "pressAndHold"
+            Parameter { name: "index"; type: "QVariant" }
+        }
+        Signal {
+            name: "expanded"
+            Parameter { name: "index"; type: "QVariant" }
+        }
+        Signal {
+            name: "collapsed"
+            Parameter { name: "index"; type: "QVariant" }
+        }
+        Method {
+            name: "isExpanded"
+            type: "QVariant"
+            Parameter { name: "index"; type: "QVariant" }
+        }
+        Method {
+            name: "collapse"
+            type: "QVariant"
+            Parameter { name: "index"; type: "QVariant" }
+        }
+        Method {
+            name: "expand"
+            type: "QVariant"
+            Parameter { name: "index"; type: "QVariant" }
+        }
+        Method {
+            name: "indexAt"
+            type: "QVariant"
+            Parameter { name: "x"; type: "QVariant" }
+            Parameter { name: "y"; type: "QVariant" }
+        }
+        Property { name: "alternatingRowColors"; type: "bool" }
+        Property { name: "headerVisible"; type: "bool" }
+        Property { name: "itemDelegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "rowDelegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "headerDelegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "sortIndicatorColumn"; type: "int" }
+        Property { name: "sortIndicatorVisible"; type: "bool" }
+        Property { name: "sortIndicatorOrder"; type: "int" }
+        Property { name: "selectionMode"; type: "int" }
+        Property { name: "__viewTypeName"; type: "string" }
+        Property { name: "__isTreeView"; type: "bool"; isReadonly: true }
+        Property { name: "__itemDelegateLoader"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__model"; type: "QVariant" }
+        Property { name: "__activateItemOnSingleClick"; type: "bool" }
+        Property { name: "__mouseArea"; type: "QQuickItem"; isPointer: true }
+        Property { name: "backgroundVisible"; type: "bool" }
+        Property { name: "contentHeader"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "contentFooter"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "columnCount"; type: "int"; isReadonly: true }
+        Property { name: "section"; type: "QQuickViewSection"; isReadonly: true; isPointer: true }
+        Property { name: "__columns"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "__currentRowItem"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property { name: "__currentRow"; type: "int" }
+        Property { name: "__listView"; type: "QQuickListView"; isReadonly: true; isPointer: true }
+        Method {
+            name: "addColumn"
+            type: "QVariant"
+            Parameter { name: "column"; type: "QVariant" }
+        }
+        Method {
+            name: "insertColumn"
+            type: "QVariant"
+            Parameter { name: "index"; type: "QVariant" }
+            Parameter { name: "column"; type: "QVariant" }
+        }
+        Method {
+            name: "removeColumn"
+            type: "QVariant"
+            Parameter { name: "index"; type: "QVariant" }
+        }
+        Method {
+            name: "moveColumn"
+            type: "QVariant"
+            Parameter { name: "from"; type: "QVariant" }
+            Parameter { name: "to"; type: "QVariant" }
+        }
+        Method {
+            name: "getColumn"
+            type: "QVariant"
+            Parameter { name: "index"; type: "QVariant" }
+        }
+        Method { name: "resizeColumnsToContents"; type: "QVariant" }
+        Property { name: "frameVisible"; type: "bool" }
+        Property { name: "highlightOnFocus"; type: "bool" }
+        Property { name: "contentItem"; type: "QQuickItem"; isPointer: true }
+        Property { name: "__scrollBarTopMargin"; type: "int" }
+        Property { name: "__viewTopMargin"; type: "int" }
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__style"; type: "Style_QMLTYPE_3"; isPointer: true }
+        Property { name: "horizontalScrollBarPolicy"; type: "int" }
+        Property { name: "verticalScrollBarPolicy"; type: "int" }
+        Property { name: "viewport"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property { name: "flickableItem"; type: "QQuickFlickable"; isReadonly: true; isPointer: true }
+        Property {
+            name: "__scroller"
+            type: "ScrollViewHelper_QMLTYPE_32"
+            isReadonly: true
+            isPointer: true
+        }
+        Property { name: "__verticalScrollbarOffset"; type: "int" }
+        Property { name: "__wheelAreaScrollSpeed"; type: "double" }
+        Property {
+            name: "__horizontalScrollBar"
+            type: "ScrollBar_QMLTYPE_28"
+            isReadonly: true
+            isPointer: true
+        }
+        Property {
+            name: "__verticalScrollBar"
+            type: "ScrollBar_QMLTYPE_28"
+            isReadonly: true
+            isPointer: true
+        }
+    }
+    Component {
+        prototype: "QQuickFocusScope"
+        name: "QtQuick.Controls/TreeView 1.5"
+        exports: ["QtQuick.Controls/TreeView 1.5"]
+        exportMetaObjectRevisions: [5]
+        isComposite: true
+        defaultProperty: "__columns"
+        Property { name: "model"; type: "QVariant" }
+        Property { name: "currentIndex"; type: "QVariant"; isReadonly: true }
+        Property { name: "selection"; type: "QItemSelectionModel"; isPointer: true }
+        Property { name: "rootIndex"; type: "QModelIndex" }
+        Signal {
+            name: "activated"
+            Parameter { name: "index"; type: "QVariant" }
+        }
+        Signal {
+            name: "clicked"
+            Parameter { name: "index"; type: "QVariant" }
+        }
+        Signal {
+            name: "doubleClicked"
+            Parameter { name: "index"; type: "QVariant" }
+        }
+        Signal {
+            name: "pressAndHold"
+            Parameter { name: "index"; type: "QVariant" }
+        }
+        Signal {
+            name: "expanded"
+            Parameter { name: "index"; type: "QVariant" }
+        }
+        Signal {
+            name: "collapsed"
+            Parameter { name: "index"; type: "QVariant" }
+        }
+        Method {
+            name: "isExpanded"
+            type: "QVariant"
+            Parameter { name: "index"; type: "QVariant" }
+        }
+        Method {
+            name: "collapse"
+            type: "QVariant"
+            Parameter { name: "index"; type: "QVariant" }
+        }
+        Method {
+            name: "expand"
+            type: "QVariant"
+            Parameter { name: "index"; type: "QVariant" }
+        }
+        Method {
+            name: "indexAt"
+            type: "QVariant"
+            Parameter { name: "x"; type: "QVariant" }
+            Parameter { name: "y"; type: "QVariant" }
+        }
+        Property { name: "alternatingRowColors"; type: "bool" }
+        Property { name: "headerVisible"; type: "bool" }
+        Property { name: "itemDelegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "rowDelegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "headerDelegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "sortIndicatorColumn"; type: "int" }
+        Property { name: "sortIndicatorVisible"; type: "bool" }
+        Property { name: "sortIndicatorOrder"; type: "int" }
+        Property { name: "selectionMode"; type: "int" }
+        Property { name: "__viewTypeName"; type: "string" }
+        Property { name: "__isTreeView"; type: "bool"; isReadonly: true }
+        Property { name: "__itemDelegateLoader"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__model"; type: "QVariant" }
+        Property { name: "__activateItemOnSingleClick"; type: "bool" }
+        Property { name: "__mouseArea"; type: "QQuickItem"; isPointer: true }
+        Property { name: "backgroundVisible"; type: "bool" }
+        Property { name: "contentHeader"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "contentFooter"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "columnCount"; type: "int"; isReadonly: true }
+        Property { name: "section"; type: "QQuickViewSection"; isReadonly: true; isPointer: true }
+        Property { name: "__columns"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "__currentRowItem"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property { name: "__currentRow"; type: "int" }
+        Property { name: "__listView"; type: "QQuickListView"; isReadonly: true; isPointer: true }
+        Method {
+            name: "addColumn"
+            type: "QVariant"
+            Parameter { name: "column"; type: "QVariant" }
+        }
+        Method {
+            name: "insertColumn"
+            type: "QVariant"
+            Parameter { name: "index"; type: "QVariant" }
+            Parameter { name: "column"; type: "QVariant" }
+        }
+        Method {
+            name: "removeColumn"
+            type: "QVariant"
+            Parameter { name: "index"; type: "QVariant" }
+        }
+        Method {
+            name: "moveColumn"
+            type: "QVariant"
+            Parameter { name: "from"; type: "QVariant" }
+            Parameter { name: "to"; type: "QVariant" }
+        }
+        Method {
+            name: "getColumn"
+            type: "QVariant"
+            Parameter { name: "index"; type: "QVariant" }
+        }
+        Method { name: "resizeColumnsToContents"; type: "QVariant" }
+        Property { name: "frameVisible"; type: "bool" }
+        Property { name: "highlightOnFocus"; type: "bool" }
+        Property { name: "contentItem"; type: "QQuickItem"; isPointer: true }
+        Property { name: "__scrollBarTopMargin"; type: "int" }
+        Property { name: "__viewTopMargin"; type: "int" }
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__style"; type: "Style_QMLTYPE_3"; isPointer: true }
+        Property { name: "horizontalScrollBarPolicy"; type: "int" }
+        Property { name: "verticalScrollBarPolicy"; type: "int" }
+        Property { name: "viewport"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property { name: "flickableItem"; type: "QQuickFlickable"; isReadonly: true; isPointer: true }
+        Property {
+            name: "__scroller"
+            type: "ScrollViewHelper_QMLTYPE_32"
+            isReadonly: true
+            isPointer: true
+        }
+        Property { name: "__verticalScrollbarOffset"; type: "int" }
+        Property { name: "__wheelAreaScrollSpeed"; type: "double" }
+        Property {
+            name: "__horizontalScrollBar"
+            type: "ScrollBar_QMLTYPE_28"
+            isReadonly: true
+            isPointer: true
+        }
+        Property {
+            name: "__verticalScrollBar"
+            type: "ScrollBar_QMLTYPE_28"
+            isReadonly: true
+            isPointer: true
+        }
+    }
+    Component {
+        prototype: "QQuickAbstractStyle1"
+        name: "QtQuick.Controls.Styles/TreeViewStyle 1.4"
+        exports: ["QtQuick.Controls.Styles/TreeViewStyle 1.4"]
+        exportMetaObjectRevisions: [4]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "control"; type: "TreeView_QMLTYPE_350"; isReadonly: true; isPointer: true }
+        Property { name: "indentation"; type: "int" }
+        Property { name: "branchDelegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "textColor"; type: "QColor" }
+        Property { name: "backgroundColor"; type: "QColor" }
+        Property { name: "alternateBackgroundColor"; type: "QColor" }
+        Property { name: "highlightedTextColor"; type: "QColor" }
+        Property { name: "activateItemOnSingleClick"; type: "bool" }
+        Property { name: "headerDelegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "rowDelegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "itemDelegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__branchDelegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__indentation"; type: "int" }
+        Property { name: "corner"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "scrollToClickedPosition"; type: "bool" }
+        Property { name: "transientScrollBars"; type: "bool" }
+        Property { name: "frame"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "minimumHandleLength"; type: "int" }
+        Property { name: "handleOverlap"; type: "int" }
+        Property { name: "scrollBarBackground"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "handle"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "incrementControl"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "decrementControl"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__scrollbar"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__externalScrollBars"; type: "bool" }
+        Property { name: "__scrollBarSpacing"; type: "int" }
+        Property { name: "__scrollBarFadeDelay"; type: "int" }
+        Property { name: "__scrollBarFadeDuration"; type: "int" }
+        Property { name: "__stickyScrollbars"; type: "bool" }
+    }
+    Component {
+        prototype: "QQuickAbstractStyle1"
+        name: "QtQuick.Controls.Styles/TumblerStyle 1.2"
+        exports: ["QtQuick.Controls.Styles/TumblerStyle 1.2"]
+        exportMetaObjectRevisions: [2]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "control"; type: "Tumbler_QMLTYPE_353"; isReadonly: true; isPointer: true }
+        Property { name: "spacing"; type: "double" }
+        Property { name: "visibleItemCount"; type: "int" }
+        Property { name: "__padding"; type: "double"; isReadonly: true }
+        Property { name: "__delegateHeight"; type: "double" }
+        Property { name: "__separatorWidth"; type: "double" }
+        Property { name: "background"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "foreground"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "separator"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "columnForeground"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "frame"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "delegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "highlight"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "panel"; type: "QQmlComponent"; isPointer: true }
+    }
+}
diff --git a/deployment_test/QtQuick/Controls/qmldir b/deployment_test/QtQuick/Controls/qmldir
new file mode 100644
index 0000000000000000000000000000000000000000..6641de8652f7c411041905c157f781961ead24ab
--- /dev/null
+++ b/deployment_test/QtQuick/Controls/qmldir
@@ -0,0 +1,8 @@
+module QtQuick.Controls
+plugin qtquickcontrolsplugin
+classname QtQuickControls1Plugin
+typeinfo plugins.qmltypes
+designersupported
+depends QtQuick.Window 2.2
+depends QtQuick.Layouts 1.0
+depends QtQml 2.14
diff --git a/deployment_test/QtQuick/Controls/qtquickcontrolsplugin.dll b/deployment_test/QtQuick/Controls/qtquickcontrolsplugin.dll
new file mode 100644
index 0000000000000000000000000000000000000000..5c70531449a61f0336f38ddc8b320b0b47c5df10
Binary files /dev/null and b/deployment_test/QtQuick/Controls/qtquickcontrolsplugin.dll differ
diff --git a/deployment_test/QtQuick/Extras/CircularGauge.qml b/deployment_test/QtQuick/Extras/CircularGauge.qml
new file mode 100644
index 0000000000000000000000000000000000000000..d42e17d5bb9bfd5abed5e791e78b2372204eefd8
--- /dev/null
+++ b/deployment_test/QtQuick/Extras/CircularGauge.qml
@@ -0,0 +1,160 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Extras module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+// Workaround for QTBUG-37751; we need this import for RangeModel, although we shouldn't.
+import QtQuick.Controls 1.4
+import QtQuick.Controls.Styles 1.4
+import QtQuick.Controls.Private 1.0
+import QtQuick.Extras.Private 1.0
+
+/*!
+    \qmltype CircularGauge
+    \inqmlmodule QtQuick.Extras
+    \since 5.5
+    \ingroup extras
+    \ingroup extras-non-interactive
+    \brief A gauge that displays a value within a range along an arc.
+
+    \image circulargauge.png CircularGauge
+
+    The CircularGauge is similar to traditional mechanical gauges that use a
+    needle to display a value from some input, such as the speed of a vehicle or
+    air pressure, for example.
+
+    The minimum and maximum values displayable by the gauge can be set with the
+    \l minimumValue and \l maximumValue properties. The angle at which these
+    values are displayed can be set with the
+    \l {CircularGaugeStyle::}{minimumValueAngle} and
+    \l {CircularGaugeStyle::}{maximumValueAngle} properties of
+    \l {CircularGaugeStyle}.
+
+    Example:
+    \code
+    CircularGauge {
+        value: accelerating ? maximumValue : 0
+        anchors.centerIn: parent
+
+        property bool accelerating: false
+
+        Keys.onSpacePressed: accelerating = true
+        Keys.onReleased: {
+            if (event.key === Qt.Key_Space) {
+                accelerating = false;
+                event.accepted = true;
+            }
+        }
+
+        Component.onCompleted: forceActiveFocus()
+
+        Behavior on value {
+            NumberAnimation {
+                duration: 1000
+            }
+        }
+    }
+    \endcode
+
+    You can create a custom appearance for a CircularGauge by assigning a
+    \l {CircularGaugeStyle}.
+*/
+
+Control {
+    id: circularGauge
+
+    style: Settings.styleComponent(Settings.style, "CircularGaugeStyle.qml", circularGauge)
+
+    /*!
+        \qmlproperty real CircularGauge::minimumValue
+
+        This property holds the smallest value displayed by the gauge.
+    */
+    property alias minimumValue: range.minimumValue
+
+    /*!
+        \qmlproperty real CircularGauge::maximumValue
+
+        This property holds the largest value displayed by the gauge.
+    */
+    property alias maximumValue: range.maximumValue
+
+    /*!
+        This property holds the current value displayed by the gauge, which will
+        always be between \l minimumValue and \l maximumValue, inclusive.
+    */
+    property alias value: range.value
+
+    /*!
+        \qmlproperty real CircularGauge::stepSize
+
+        This property holds the size of the value increments that the needle
+        displays.
+
+        For example, when stepSize is \c 10 and value is \c 0, adding \c 5 to
+        \l value will have no visible effect on the needle, although \l value
+        will still be incremented. Adding an extra \c 5 to \l value will then
+        cause the needle to point to \c 10.
+    */
+    property alias stepSize: range.stepSize
+
+    /*!
+        This property determines whether or not the gauge displays tickmarks,
+        minor tickmarks, and labels.
+
+        For more fine-grained control over what is displayed, the following
+        style components of
+        \l CircularGaugeStyle can be
+        used:
+
+        \list
+            \li \l {CircularGaugeStyle::}{tickmark}
+            \li \l {CircularGaugeStyle::}{minorTickmark}
+            \li \l {CircularGaugeStyle::}{tickmarkLabel}
+        \endlist
+    */
+    property bool tickmarksVisible: true
+
+    RangeModel {
+        id: range
+        minimumValue: 0
+        maximumValue: 100
+        stepSize: 0
+        value: minimumValue
+    }
+}
diff --git a/deployment_test/QtQuick/Extras/CircularGauge.qmlc b/deployment_test/QtQuick/Extras/CircularGauge.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..4879a7f3496304128fb21c4df82861aebd54e98d
Binary files /dev/null and b/deployment_test/QtQuick/Extras/CircularGauge.qmlc differ
diff --git a/deployment_test/QtQuick/Extras/DelayButton.qml b/deployment_test/QtQuick/Extras/DelayButton.qml
new file mode 100644
index 0000000000000000000000000000000000000000..9a0c3a25531b8acd597217b37bfec0e9051248a1
--- /dev/null
+++ b/deployment_test/QtQuick/Extras/DelayButton.qml
@@ -0,0 +1,161 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Extras module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQml 2.14 as Qml
+import QtQuick 2.2
+import QtQuick.Controls 1.4
+import QtQuick.Controls.Styles 1.4
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype DelayButton
+    \inherits QtQuickControls::Button
+    \inqmlmodule QtQuick.Extras
+    \since 5.5
+    \ingroup extras
+    \ingroup extras-interactive
+    \brief A checkable button that triggers an action when held in long enough.
+
+    \image delaybutton.png A DelayButton
+
+    The DelayButton is a checkable button that incorporates a delay before
+    the button becomes checked and the \l activated signal is emitted. This
+    delay prevents accidental presses.
+
+    The current progress is expressed as a decimal value between \c 0.0 and
+    \c 1.0. The time it takes for \l activated to be emitted is measured in
+    milliseconds, and can be set with the \l delay property.
+
+    The progress is indicated by a progress indicator around the button. When
+    the indicator reaches completion, it flashes.
+
+    \image delaybutton-progress.png A DelayButton being held down
+    A DelayButton being held down
+    \image delaybutton-activated.png A DelayButton after being activated
+    A DelayButton after being activated
+
+    You can create a custom appearance for a DelayButton by assigning a
+    \l {DelayButtonStyle}.
+*/
+
+Button {
+    id: root
+
+    style: Settings.styleComponent(Settings.style, "DelayButtonStyle.qml", root)
+
+    /*!
+        \qmlproperty real DelayButton::progress
+
+        This property holds the current progress as displayed by the progress
+        indicator, in the range \c 0.0 - \c 1.0.
+    */
+    readonly property alias progress: root.__progress
+
+    /*!
+        This property holds the time it takes (in milliseconds) for \l progress
+        to reach \c 1.0 and emit \l activated.
+
+        The default value is \c 3000 ms.
+    */
+    property int delay: 3000
+
+    /*!
+        This signal is emitted when \l progress reaches \c 1.0 and the button
+        becomes checked.
+    */
+    signal activated
+
+
+    /*! \internal */
+    property real __progress: 0.0
+
+    Behavior on __progress {
+        id: progressBehavior
+
+        NumberAnimation {
+            id: numberAnimation
+        }
+    }
+
+    Qml.Binding {
+        // Force checkable to false to get full control over the checked -property
+        target: root
+        property: "checkable"
+        value: false
+        restoreMode: Binding.RestoreBinding
+    }
+
+    onProgressChanged: {
+        if (__progress === 1.0) {
+            checked = true;
+            activated();
+        }
+    }
+
+    onCheckedChanged: {
+        if (checked) {
+            if (__progress < 1) {
+                // Programmatically activated the button; don't animate.
+                progressBehavior.enabled = false;
+                __progress = 1;
+                progressBehavior.enabled = true;
+            }
+        } else {
+            // Unchecked the button after it was flashing; it should instantly stop
+            // flashing (with no reversed progress bar).
+            progressBehavior.enabled = false;
+            __progress = 0;
+            progressBehavior.enabled = true;
+        }
+    }
+
+    onPressedChanged: {
+        if (checked) {
+            if (pressed) {
+                // Pressed the button to stop the activation.
+                checked = false;
+            }
+        } else {
+            var effectiveDelay = pressed ? delay : delay * 0.3;
+            // Not active. Either the button is being held down or let go.
+            numberAnimation.duration = Math.max(0, (pressed ? 1 - __progress : __progress) * effectiveDelay);
+            __progress = pressed ? 1 : 0;
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Extras/DelayButton.qmlc b/deployment_test/QtQuick/Extras/DelayButton.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..419644f8b1a30ccf85d753f6c3cd1eef47e6feda
Binary files /dev/null and b/deployment_test/QtQuick/Extras/DelayButton.qmlc differ
diff --git a/deployment_test/QtQuick/Extras/Dial.qml b/deployment_test/QtQuick/Extras/Dial.qml
new file mode 100644
index 0000000000000000000000000000000000000000..688f13d9d1d4861bb6cfd1061a49f0dcd4301502
--- /dev/null
+++ b/deployment_test/QtQuick/Extras/Dial.qml
@@ -0,0 +1,229 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Extras module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.4
+import QtQuick.Controls.Styles 1.4
+import QtQuick.Controls.Private 1.0
+import QtQuick.Extras 1.4
+import QtQuick.Extras.Private 1.0
+
+/*!
+    \qmltype Dial
+    \inqmlmodule QtQuick.Extras
+    \since 5.5
+    \ingroup extras
+    \ingroup extras-interactive
+    \brief A circular dial that is rotated to set a value.
+
+    \image dial.png A Dial
+
+    The Dial is similar to a traditional dial knob that is found on devices
+    such as stereos or industrial equipment. It allows the user to specify a
+    value within a range.
+
+    Like CircularGauge, Dial can display tickmarks to give an indication of
+    the current value. When a suitable stepSize is combined with
+    \l {DialStyle::}{tickmarkStepSize},
+    the dial "snaps" to each tickmark.
+
+    You can create a custom appearance for a Dial by assigning a
+    \l {DialStyle}.
+*/
+
+Control {
+    id: dial
+
+    activeFocusOnTab: true
+    style: Settings.styleComponent(Settings.style, "DialStyle.qml", dial)
+
+    /*!
+        \qmlproperty real Dial::value
+
+        The angle of the handle along the dial, in the range of
+        \c 0.0 to \c 1.0.
+
+        The default value is \c{0.0}.
+    */
+    property alias value: range.value
+
+    /*!
+        \qmlproperty real Dial::minimumValue
+
+        The smallest value allowed by the dial.
+
+        The default value is \c{0.0}.
+
+        \sa value, maximumValue
+    */
+    property alias minimumValue: range.minimumValue
+
+    /*!
+        \qmlproperty real Dial::maximumValue
+
+        The largest value allowed by the dial.
+
+        The default value is \c{1.0}.
+
+        \sa value, minimumValue
+    */
+    property alias maximumValue: range.maximumValue
+
+    /*!
+        \qmlproperty real Dial::hovered
+
+        This property holds whether the button is being hovered.
+    */
+    readonly property alias hovered: mouseArea.containsMouse
+
+    /*!
+        \qmlproperty real Dial::stepSize
+
+        The default value is \c{0.0}.
+    */
+    property alias stepSize: range.stepSize
+
+    /*!
+        \internal
+        Determines whether the dial can be freely rotated past the zero marker.
+
+        The default value is \c false.
+    */
+    property bool __wrap: false
+
+    /*!
+        This property specifies whether the dial should gain active focus when
+        pressed.
+
+        The default value is \c false.
+
+        \sa pressed
+    */
+    property bool activeFocusOnPress: false
+
+    /*!
+        \qmlproperty bool Dial::pressed
+
+        Returns \c true if the dial is pressed.
+
+        \sa activeFocusOnPress
+    */
+    readonly property alias pressed: mouseArea.pressed
+
+    /*!
+        This property determines whether or not the dial displays tickmarks,
+        minor tickmarks, and labels.
+
+        For more fine-grained control over what is displayed, the following
+        style components of
+        \l {DialStyle} can be used:
+
+        \list
+            \li \l {DialStyle::}{tickmark}
+            \li \l {DialStyle::}{minorTickmark}
+            \li \l {DialStyle::}{tickmarkLabel}
+        \endlist
+
+        The default value is \c true.
+    */
+    property bool tickmarksVisible: true
+
+    Keys.onLeftPressed: value -= stepSize
+    Keys.onDownPressed: value -= stepSize
+    Keys.onRightPressed: value += stepSize
+    Keys.onUpPressed: value += stepSize
+    Keys.onPressed: {
+        if (event.key === Qt.Key_Home) {
+            value = minimumValue;
+            event.accepted = true;
+        } else if (event.key === Qt.Key_End) {
+            value = maximumValue;
+            event.accepted = true;
+        }
+    }
+
+    RangeModel {
+        id: range
+        minimumValue: 0.0
+        maximumValue: 1.0
+        stepSize: 0
+        value: 0
+    }
+
+    MouseArea {
+        id: mouseArea
+        hoverEnabled: true
+        parent: __panel.background.parent
+        anchors.fill: parent
+
+        onPositionChanged: {
+            if (pressed) {
+                value = valueFromPoint(mouseX, mouseY);
+            }
+        }
+        onPressed: {
+            if (!__style.__dragToSet)
+                value = valueFromPoint(mouseX, mouseY);
+
+            if (activeFocusOnPress)
+                dial.forceActiveFocus();
+        }
+
+        function bound(val) { return Math.max(minimumValue, Math.min(maximumValue, val)); }
+
+        function valueFromPoint(x, y)
+        {
+            var yy = height / 2.0 - y;
+            var xx = x - width / 2.0;
+            var angle = (xx || yy) ? Math.atan2(yy, xx) : 0;
+
+            if (angle < Math.PI/ -2)
+                angle = angle + Math.PI * 2;
+
+            var range = maximumValue - minimumValue;
+            var value;
+            if (__wrap)
+                value = (minimumValue + range * (Math.PI * 3 / 2 - angle) / (2 * Math.PI));
+            else
+                value = (minimumValue + range * (Math.PI * 4 / 3 - angle) / (Math.PI * 10 / 6));
+
+            return bound(value)
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Extras/Dial.qmlc b/deployment_test/QtQuick/Extras/Dial.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..40778d4d04e72ac6ad4b0f980d546e442b9c45e2
Binary files /dev/null and b/deployment_test/QtQuick/Extras/Dial.qmlc differ
diff --git a/deployment_test/QtQuick/Extras/Gauge.qml b/deployment_test/QtQuick/Extras/Gauge.qml
new file mode 100644
index 0000000000000000000000000000000000000000..276cc1257c75de6161776e5864a4e93bc6abf569
--- /dev/null
+++ b/deployment_test/QtQuick/Extras/Gauge.qml
@@ -0,0 +1,210 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Extras module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.4
+import QtQuick.Controls.Styles 1.4
+import QtQuick.Controls.Private 1.0
+import QtQuick.Extras 1.4
+import QtQuick.Extras.Private 1.0
+
+/*!
+    \qmltype Gauge
+    \inqmlmodule QtQuick.Extras
+    \since 5.5
+    \ingroup extras
+    \ingroup extras-non-interactive
+    \brief A straight gauge that displays a value within a range.
+
+    \image gauge.png Gauge
+
+    The Gauge control displays a value within some range along a horizontal or
+    vertical axis. It can be thought of as an extension of ProgressBar,
+    providing tickmarks and labels to provide a visual measurement of the
+    progress.
+
+    The minimum and maximum values displayable by the gauge can be set with the
+    \l minimumValue and \l maximumValue properties.
+
+    Example:
+    \code
+    Gauge {
+        minimumValue: 0
+        value: 50
+        maximumValue: 100
+        anchors.centerIn: parent
+    }
+    \endcode
+
+    You can create a custom appearance for a Gauge by assigning a
+    \l {GaugeStyle}.
+*/
+
+Control {
+    id: gauge
+
+    style: Settings.styleComponent(Settings.style, "GaugeStyle.qml", gauge)
+
+    /*!
+        This property holds the smallest value displayed by the gauge.
+
+        The default value is \c 0.
+    */
+    property alias minimumValue: range.minimumValue
+
+    /*!
+        This property holds the value displayed by the gauge.
+
+        The default value is \c 0.
+    */
+    property alias value: range.value
+
+    /*!
+        This property holds the largest value displayed by the gauge.
+
+        The default value is \c 100.
+    */
+    property alias maximumValue: range.maximumValue
+
+    /*!
+        This property determines the orientation of the gauge.
+
+        The default value is \c Qt.Vertical.
+    */
+    property int orientation: Qt.Vertical
+
+    /*!
+        This property determines the alignment of each tickmark within the
+        gauge. When \l orientation is \c Qt.Vertical, the valid values are:
+
+        \list
+        \li Qt.AlignLeft
+        \li Qt.AlignRight
+        \endlist
+
+        Any other value will cause \c Qt.AlignLeft to be used, which is also the
+        default value for this orientation.
+
+        When \l orientation is \c Qt.Horizontal, the valid values are:
+
+        \list
+        \li Qt.AlignTop
+        \li Qt.AlignBottom
+        \endlist
+
+        Any other value will cause \c Qt.AlignBottom to be used, which is also
+        the default value for this orientation.
+    */
+    property int tickmarkAlignment: orientation == Qt.Vertical ? Qt.AlignLeft : Qt.AlignBottom
+    property int __tickmarkAlignment: {
+        if (orientation == Qt.Vertical) {
+            return (tickmarkAlignment == Qt.AlignLeft || tickmarkAlignment == Qt.AlignRight) ? tickmarkAlignment : Qt.AlignLeft;
+        }
+
+        return (tickmarkAlignment == Qt.AlignTop || tickmarkAlignment == Qt.AlignBottom) ? tickmarkAlignment : Qt.AlignBottom;
+    }
+
+    /*!
+        \internal
+
+        TODO: finish this
+
+        This property determines whether or not the tickmarks and their labels
+        are drawn inside (over) the gauge. The value of this property affects
+        \l tickmarkAlignment.
+    */
+    property bool __tickmarksInside: false
+
+    /*!
+        This property determines the rate at which tickmarks are drawn on the
+        gauge. The lower the value, the more often tickmarks are drawn.
+
+        The default value is \c 10.
+    */
+    property real tickmarkStepSize: 10
+
+    /*!
+        This property determines the amount of minor tickmarks drawn between
+        each regular tickmark.
+
+        The default value is \c 4.
+    */
+    property int minorTickmarkCount: 4
+
+    /*!
+        \qmlproperty font Gauge::font
+
+        The font to use for the tickmark text.
+    */
+    property alias font: hiddenText.font
+
+    /*!
+        This property accepts a function that formats the given \a value for
+        display in
+        \l {GaugeStyle::}{tickmarkLabel}.
+
+        For example, to provide a custom format that displays all values with 3
+        decimal places:
+
+        \code
+        formatValue: function(value) {
+            return value.toFixed(3);
+        }
+        \endcode
+
+        The default function does no formatting.
+    */
+    property var formatValue: function(value) {
+        return value;
+    }
+
+    property alias __hiddenText: hiddenText
+    Text {
+        id: hiddenText
+        text: formatValue(maximumValue)
+        visible: false
+    }
+
+    RangeModel {
+        id: range
+        minimumValue: 0
+        value: 0
+        maximumValue: 100
+    }
+}
diff --git a/deployment_test/QtQuick/Extras/Gauge.qmlc b/deployment_test/QtQuick/Extras/Gauge.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..ca7aa59ba837e48bc8fedabca9262cd3682a7d46
Binary files /dev/null and b/deployment_test/QtQuick/Extras/Gauge.qmlc differ
diff --git a/deployment_test/QtQuick/Extras/PieMenu.qml b/deployment_test/QtQuick/Extras/PieMenu.qml
new file mode 100644
index 0000000000000000000000000000000000000000..cfaaecbe7fc58e5d88d5d4a5d4c5db3b33d93106
--- /dev/null
+++ b/deployment_test/QtQuick/Extras/PieMenu.qml
@@ -0,0 +1,738 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Extras module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.4
+import QtQuick.Controls.Styles 1.4
+import QtQuick.Controls.Private 1.0
+import QtQuick.Extras 1.4
+import QtQuick.Extras.Private 1.0
+import QtQuick.Extras.Private.CppUtils 1.0 as CppUtils
+
+/*!
+    \qmltype PieMenu
+    \inqmlmodule QtQuick.Extras
+    \since 5.5
+    \ingroup extras
+    \ingroup extras-interactive
+    \brief A popup menu that displays several menu items along an arc.
+
+    \image piemenu.png A PieMenu
+
+    The PieMenu provides a radial context menu as an alternative to a
+    traditional menu. All of the items in a PieMenu are an equal distance
+    from the center of the control.
+
+    \section2 Populating the Menu
+
+    To create a menu, define at least one MenuItem as a child of it:
+    \code
+    PieMenu {
+        id: pieMenu
+
+        MenuItem {
+            text: "Action 1"
+            onTriggered: print("Action 1")
+        }
+        MenuItem {
+            text: "Action 2"
+            onTriggered: print("Action 2")
+        }
+        MenuItem {
+            text: "Action 3"
+            onTriggered: print("Action 3")
+        }
+    }
+    \endcode
+
+    By default, only the currently selected item's text is displayed above the
+    menu. To provide text that is always visible when there is no current item,
+    set the \l title property.
+
+    \section2 Displaying the Menu
+
+    The typical use case for a menu is to open at the point of the mouse
+    cursor after a right click occurs. To do that, define a MouseArea that
+    covers the region upon which clicks should open the menu. When the
+    MouseArea is right-clicked, call the popup() function:
+    \code
+    MouseArea {
+        anchors.fill: parent
+        acceptedButtons: Qt.RightButton
+
+        onClicked: pieMenu.popup(mouseX, mouseY)
+    }
+    \endcode
+
+    If the menu is opened in a position where some of its menu items would be
+    outside of \l boundingItem, it is automatically moved to a position where
+    they will not be hidden. By default, the boundingItem is set to the parent
+    of the menu. It can also be set to \c null to prevent this behavior.
+
+    PieMenu can be displayed at any position on the screen. With a traditional
+    context menu, the menu would be positioned with its top left corner at the
+    position of the right click, but since PieMenu is radial, we position it
+    centered over the position of the right click.
+
+    To create a PieMenu that opens after a long press and selects items upon
+    releasing, you can combine ActivationMode.ActivateOnRelease with a
+    MouseArea using a Timer:
+    \code
+    MouseArea {
+        id: touchArea
+        anchors.fill: parent
+
+        Timer {
+            id: pressAndHoldTimer
+            interval: 300
+            onTriggered: pieMenu.popup(touchArea.mouseX, touchArea.mouseY);
+        }
+
+        onPressed: pressAndHoldTimer.start()
+        onReleased: pressAndHoldTimer.stop();
+    }
+
+    PieMenu {
+        id: pieMenu
+
+        triggerMode: TriggerMode.TriggerOnRelease
+
+        MenuItem {
+            text: "Action 1"
+            onTriggered: print("Action 1")
+        }
+        MenuItem {
+            text: "Action 2"
+            onTriggered: print("Action 2")
+        }
+        MenuItem {
+            text: "Action 3"
+            onTriggered: print("Action 3")
+        }
+    }
+    \endcode
+
+    You can hide individual menu items by setting their visible property to
+    \c false. Hiding items does not affect the
+    \l {PieMenuStyle::}{startAngle} or
+    \l {PieMenuStyle::}{endAngle}; the
+    remaining items will grow to consume the available space.
+
+    You can create a custom appearance for a PieMenu by assigning a \l {PieMenuStyle}
+*/
+
+Control {
+    id: pieMenu
+    visible: false
+
+    style: Settings.styleComponent(Settings.style, "PieMenuStyle.qml", pieMenu)
+
+    /*!
+        This property reflects the angle (in radians) created by the imaginary
+        line from the center of the menu to the position of the cursor.
+
+        Its value is undefined when the menu is not visible.
+    */
+    readonly property real selectionAngle: {
+        var centerX = width / 2;
+        var centerY = height / 2;
+        var targetX = __protectedScope.selectionPos.x;
+        var targetY = __protectedScope.selectionPos.y;
+
+        var xDistance = centerX - targetX;
+        var yDistance = centerY - targetY;
+
+        var angleToTarget = Math.atan2(xDistance, yDistance) * -1;
+        angleToTarget;
+    }
+
+    /*!
+        \qmlproperty enumeration PieMenu::activationMode
+
+        This property determines the method for selecting items in the menu.
+
+        \list
+        \li An activationMode of \a ActivationMode.ActivateOnPress means that menu
+        items will only be selected when a mouse press event occurs over them.
+
+        \li An activationMode of \a ActivationMode.ActivateOnRelease means that menu
+        items will only be selected when a mouse release event occurs over them.
+        This means that the user must keep the mouse button down after opening
+        the menu and release the mouse over the item they wish to select.
+
+        \li An activationMode of \a ActivationMode.ActivateOnClick means that menu
+        items will only be selected when the user clicks once over them.
+        \endlist
+
+        \warning Changing the activationMode while the menu is visible will
+        result in undefined behavior.
+
+        \deprecated Use triggerMode instead.
+    */
+    property alias activationMode: pieMenu.triggerMode
+
+    /*!
+        \qmlproperty enumeration PieMenu::triggerMode
+
+        This property determines the method for selecting items in the menu.
+
+        \list
+        \li A triggerMode of \a TriggerMode.TriggerOnPress means that menu
+        items will only be selected when a mouse press event occurs over them.
+
+        \li A triggerMode of \a TriggerMode.TriggerOnRelease means that menu
+        items will only be selected when a mouse release event occurs over them.
+        This means that the user must keep the mouse button down after opening
+        the menu and release the mouse over the item they wish to select.
+
+        \li A triggerMode of \a TriggerMode.TriggerOnClick means that menu
+        items will only be selected when the user clicks once over them.
+        \endlist
+
+        \warning Changing the triggerMode while the menu is visible will
+        result in undefined behavior.
+    */
+    property int triggerMode: TriggerMode.TriggerOnClick
+
+    /*!
+        \qmlproperty list<MenuItem> menuItems
+
+        The list of menu items displayed by this menu.
+
+        You can assign menu items by declaring them as children of PieMenu:
+        \code
+        PieMenu {
+            MenuItem {
+                text: "Action 1"
+                onTriggered: function() { print("Action 1"); }
+            }
+            MenuItem {
+                text: "Action 2"
+                onTriggered: function() { print("Action 2"); }
+            }
+            MenuItem {
+                text: "Action 3"
+                onTriggered: function() { print("Action 3"); }
+            }
+        }
+        \endcode
+    */
+    default property alias menuItems: defaultPropertyHack.menuItems
+
+    QtObject {
+        // Can't specify a list as a default property (QTBUG-10822)
+        id: defaultPropertyHack
+        property list<MenuItem> menuItems
+    }
+
+    /*!
+        \qmlproperty int PieMenu::currentIndex
+
+        The index of the the menu item that is currently under the mouse,
+        or \c -1 if there is no such item.
+    */
+    readonly property alias currentIndex: protectedScope.currentIndex
+
+    /*!
+        \qmlproperty int PieMenu::currentItem
+
+        The menu item that is currently under the mouse, or \c null if there is
+        no such item.
+    */
+    readonly property alias currentItem: protectedScope.currentItem
+
+    /*!
+        This property defines the text that is shown above the menu when
+        there is no current menu item (currentIndex is \c -1).
+
+        The default value is \c "" (an empty string).
+    */
+    property string title: ""
+
+    /*!
+        The item which the menu must stay within.
+
+        A typical use case for PieMenu involves:
+
+        \list
+            \li A MouseArea that determines the clickable area within which the
+                menu can be opened.
+            \li The bounds that the menu must not go outside of.
+        \endlist
+
+        Although they sound similar, they have different purposes. Consider the
+        example below:
+
+        \image piemenu-boundingItem-example.png Canvas boundingItem example
+
+        The user can only open the menu within the inner rectangle. In this
+        case, they've opened the menu on the edge of the MouseArea, but there
+        would not be enough room to display the entire menu centered at the
+        cursor position, so it was moved to the left.
+
+        If for some reason we didn't want this restriction, we can set
+        boundingItem to \c null:
+
+        \image piemenu-boundingItem-null-example.png Canvas null boundingItem example
+
+        By default, the menu's \l {Item::}{parent} is the boundingItem.
+    */
+    property Item boundingItem: parent
+
+    /*!
+        \qmlmethod void popup(real x, real y)
+
+        Opens the menu at coordinates \a x, \a y.
+     */
+    function popup(x, y) {
+        if (x !== undefined)
+            pieMenu.x = x - pieMenu.width / 2;
+        if (y !== undefined)
+            pieMenu.y = y - pieMenu.height / 2;
+
+        pieMenu.visible = true;
+    }
+
+    /*!
+        \qmlmethod void addItem(string text)
+
+        Adds a \a text item to the end of the menu items.
+
+        Equivalent to passing calling \c insertItem(menuItems.length, text).
+
+        Returns the newly added item.
+    */
+    function addItem(text) {
+        return insertItem(menuItems.length, text);
+    }
+
+    /*!
+        \qmlmethod void insertItem(int before, string text)
+
+        Inserts a MenuItem with \a text before the index at \a before.
+
+        To insert an item at the end, pass \c menuItems.length.
+
+        Returns the newly inserted item, or \c null if \a before is invalid.
+    */
+    function insertItem(before, text) {
+        if (before < 0 || before > menuItems.length) {
+            return null;
+        }
+
+        var newItems = __protectedScope.copyItemsToJsArray();
+        var newItem = Qt.createQmlObject("import QtQuick.Controls 1.1; MenuItem {}", pieMenu, "");
+        newItem.text = text;
+        newItems.splice(before, 0, newItem);
+
+        menuItems = newItems;
+        return newItem;
+    }
+
+    /*!
+        \qmlmethod void removeItem(item)
+
+        Removes \a item from the menu.
+    */
+    function removeItem(item) {
+        for (var i = 0; i < menuItems.length; ++i) {
+            if (menuItems[i] === item) {
+                var newItems = __protectedScope.copyItemsToJsArray();
+
+                newItems.splice(i, 1);
+                menuItems = newItems;
+                break;
+            }
+        }
+    }
+
+    MouseArea {
+        id: mouseArea
+        anchors.fill: parent
+        hoverEnabled: !Settings.hasTouchScreen && triggerMode !== TriggerMode.TriggerOnRelease
+        acceptedButtons: Qt.LeftButton | Qt.RightButton
+        onContainsMouseChanged: if (!containsMouse) __protectedScope.currentIndex = -1
+        objectName: "PieMenu internal MouseArea"
+
+        // The mouse thief also updates the selectionPos, so we can't bind to
+        // this mouseArea's mouseX/mouseY.
+        onPositionChanged: {
+            __protectedScope.selectionPos = Qt.point(mouseX, mouseY)
+        }
+    }
+
+    /*! \internal */
+    property alias __mouseThief: mouseThief
+
+    CppUtils.MouseThief {
+        id: mouseThief
+
+        onPressed: {
+            __protectedScope.selectionPos = Qt.point(mouseX, mouseY);
+            if (__protectedScope.handleEvent(ActivationMode.ActivateOnPress)) {
+                mouseThief.acceptCurrentEvent();
+                // We handled the press event, so we can reset this now.
+                mouseThief.receivedPressEvent = false;
+            }
+        }
+        onReleased: {
+            __protectedScope.selectionPos = Qt.point(mouseX, mouseY);
+            if (__protectedScope.handleEvent(ActivationMode.ActivateOnRelease)) {
+                mouseThief.acceptCurrentEvent();
+                // We handled the press event, so we can reset this now.
+                mouseThief.receivedPressEvent = false;
+            }
+            __protectedScope.pressedIndex = -1;
+        }
+        onClicked: {
+            __protectedScope.selectionPos = Qt.point(mouseX, mouseY);
+            if (__protectedScope.handleEvent(ActivationMode.ActivateOnClick)) {
+                mouseThief.acceptCurrentEvent();
+            }
+
+            // Clicked is the last stage in a click event (press, release, click),
+            // so we can safely set this to false now.
+            mouseThief.receivedPressEvent = false;
+        }
+        onTouchUpdate: __protectedScope.selectionPos = Qt.point(mouseX, mouseY)
+    }
+
+    onVisibleChanged: {
+        // parent check is for when it's created without a parent,
+        // which we do in the tests, for example.
+        if (parent) {
+            if (visible) {
+                if (boundingItem)
+                    __protectedScope.moveWithinBounds();
+
+                // We need to grab the mouse so that we can detect released()
+                // (which is only emitted after pressed(), which our MouseArea can't
+                // emit as it didn't have focus until we were made visible).
+                mouseThief.grabMouse(mouseArea);
+            } else {
+                mouseThief.ungrabMouse();
+                __protectedScope.selectionPos = Qt.point(width / 2, height / 2);
+            }
+        }
+    }
+    onSelectionAngleChanged: __protectedScope.checkForCurrentItem()
+
+    /*! \internal */
+    property QtObject __protectedScope: QtObject {
+        id: protectedScope
+
+        property int currentIndex: -1
+        property MenuItem currentItem: currentIndex != -1 ? visibleItems[currentIndex] : null
+        property point selectionPos: Qt.point(width / 2, height / 2)
+        property int pressedIndex: -1
+        readonly property var localRect: mapFromItem(mouseArea, mouseArea.mouseX, mouseArea.mouseY)
+        readonly property var visibleItems: {
+            var items = [];
+            for (var i = 0; i < menuItems.length; ++i) {
+                if (menuItems[i].visible) {
+                    items.push(menuItems[i]);
+                }
+            }
+            return items;
+        }
+
+        onSelectionPosChanged: __protectedScope.checkForCurrentItem()
+
+        // Can't bind directly, because the menu sets this to (0, 0) on closing.
+        onLocalRectChanged: {
+            if (visible)
+                selectionPos = Qt.point(localRect.x, localRect.y);
+        }
+
+        function copyItemsToJsArray() {
+            var newItems = [];
+            for (var j = 0; j < menuItems.length; ++j) {
+                newItems.push(menuItems[j]);
+            }
+            return newItems;
+        }
+
+        /*!
+            Returns \c true if the mouse is over the section at \a itemIndex.
+        */
+        function isMouseOver(itemIndex) {
+            if (__style == null)
+                return false;
+
+            // Our mouse angle's origin is north naturally, but the section angles need to be
+            // altered to have their origin north, so we need to remove the alteration here in order to compare properly.
+            // For example, section 0 will start at -1.57, whereas we want it to start at 0.
+            var sectionStart = __protectedScope.sectionStartAngle(itemIndex) + Math.PI / 2;
+            var sectionEnd = __protectedScope.sectionEndAngle(itemIndex) + Math.PI / 2;
+
+            var selAngle = selectionAngle;
+            var isWithinOurAngle = false;
+
+            if (sectionStart > CppUtils.MathUtils.pi2) {
+                sectionStart %= CppUtils.MathUtils.pi2;
+            } else if (sectionStart < -CppUtils.MathUtils.pi2) {
+                sectionStart %= -CppUtils.MathUtils.pi2;
+            }
+
+            if (sectionEnd > CppUtils.MathUtils.pi2) {
+                sectionEnd %= CppUtils.MathUtils.pi2;
+            } else if (sectionEnd < -CppUtils.MathUtils.pi2) {
+                sectionEnd %= -CppUtils.MathUtils.pi2;
+            }
+
+            // If the section crosses the -180 => 180 wrap-around point (from atan2),
+            // temporarily rotate the section so it doesn't.
+            if (sectionStart > Math.PI) {
+                var difference = sectionStart - Math.PI;
+                selAngle -= difference;
+                sectionStart -= difference;
+                sectionEnd -= difference;
+            } else if (sectionStart < -Math.PI) {
+                difference = Math.abs(sectionStart - (-Math.PI));
+                selAngle += difference;
+                sectionStart += difference;
+                sectionEnd += difference;
+            }
+
+            if (sectionEnd > Math.PI) {
+                difference = sectionEnd - Math.PI;
+                selAngle -= difference;
+                sectionStart -= difference;
+                sectionEnd -= difference;
+            } else if (sectionEnd < -Math.PI) {
+                difference = Math.abs(sectionEnd - (-Math.PI));
+                selAngle += difference;
+                sectionStart += difference;
+                sectionEnd += difference;
+            }
+
+            // If we moved the mouse past -180 or 180, we need to move it back within,
+            // without changing its actual direction.
+            if (selAngle > Math.PI) {
+                selAngle = selAngle - CppUtils.MathUtils.pi2;
+            } else if (selAngle < -Math.PI) {
+                selAngle += CppUtils.MathUtils.pi2;
+            }
+
+            if (sectionStart > sectionEnd) {
+                isWithinOurAngle = selAngle >= sectionEnd && selAngle < sectionStart;
+            } else {
+                isWithinOurAngle = selAngle >= sectionStart && selAngle < sectionEnd;
+            }
+
+            var x1 = width / 2;
+            var y1 = height / 2;
+            var x2 = __protectedScope.selectionPos.x;
+            var y2 = __protectedScope.selectionPos.y;
+            var distanceFromCenter = Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2);
+            var cancelRadiusSquared = __style.cancelRadius * __style.cancelRadius;
+            var styleRadiusSquared = __style.radius * __style.radius;
+            var isWithinOurRadius = distanceFromCenter >= cancelRadiusSquared
+                && distanceFromCenter < styleRadiusSquared;
+            return isWithinOurAngle && isWithinOurRadius;
+        }
+
+        readonly property real arcRange: endAngleRadians - startAngleRadians
+
+        /*!
+            The size of one section in radians.
+        */
+        readonly property real sectionSize: arcRange / visibleItems.length
+        readonly property real startAngleRadians: CppUtils.MathUtils.degToRadOffset(__style.startAngle)
+        readonly property real endAngleRadians: CppUtils.MathUtils.degToRadOffset(__style.endAngle)
+
+        readonly property real circumferenceOfFullRange: 2 * Math.PI * __style.radius
+        readonly property real percentageOfFullRange: (arcRange / (Math.PI * 2))
+        readonly property real circumferenceOfSection: (sectionSize / arcRange) * (percentageOfFullRange * circumferenceOfFullRange)
+
+        function sectionStartAngle(section) {
+            var start = startAngleRadians + section * sectionSize;
+            return start;
+        }
+
+        function sectionCenterAngle(section) {
+            return (sectionStartAngle(section) + sectionEndAngle(section)) / 2;
+        }
+
+        function sectionEndAngle(section) {
+            var end = startAngleRadians + section * sectionSize + sectionSize;
+            return end;
+        }
+
+        function handleEvent(eventType) {
+            if (!visible)
+                return false;
+
+            checkForCurrentItem();
+
+            if (eventType === TriggerMode.TriggerOnPress)
+                pressedIndex = currentIndex;
+
+            if (eventType === TriggerMode.TriggerOnPress && triggerMode === TriggerMode.TriggerOnClick) {
+                // We *MUST* accept press events if we plan on also accepting the release
+                // (aka click, since we create that ourselves) event. If we don't, the
+                // external mouse area gets the press event but not the release event,
+                // and won't open until a release event is received, which means until the
+                // user taps twice on the external mouse area.
+                // Usually, we accept the current event in the onX MouseThief event handlers above,
+                // but there we set receivedPressEvent to false if this function says it handled
+                // the event, which we don't want, since TriggerOnClick is expecting to have
+                // received a press event. So, we ensure that receivedPressEvent stays true
+                // by saying we didn't handle the event, even though we actually do.
+                mouseThief.acceptCurrentEvent();
+                return false;
+            }
+
+            if (triggerMode === eventType) {
+                if (eventType === TriggerMode.TriggerOnClick && !mouseThief.receivedPressEvent) {
+                    // When the trigger mode is TriggerOnClick, we can't
+                    // act on a click event if we didn't receive the press.
+                    return false;
+                }
+
+                // Setting visible to false resets the selectionPos to the center
+                // of the menu, which in turn causes the currentItem check to be re-evaluated,
+                // which sees that there's no current item because the selectionPos is centered.
+                // To avoid all of that, we store these variables before setting visible to false.
+                var currentItemBeforeClosing = currentItem;
+                var selectionPosBeforeClosing = selectionPos;
+                var currentIndexBeforeClosing = currentIndex;
+
+                // If the cursor was over an item; trigger it. If it wasn't,
+                // close our menu regardless. We do this first so that it's
+                // possible to keep the menu open by setting visible to true in onTriggered.
+                visible = false;
+
+                if (currentItemBeforeClosing) {
+                    currentItemBeforeClosing.trigger();
+                }
+
+                if (visible && !Settings.hasTouchScreen && !Settings.isMobile) {
+                    // The user kept the menu open in onTriggered, so restore the hover stuff.
+                    selectionPos = selectionPosBeforeClosing;
+                    currentIndex = currentIndexBeforeClosing;
+                }
+
+                // If the trigger mode and event are Release, we should ensure
+                // that we received a press event beforehand. If we didn't, we shouldn't steal
+                // the event in MouseThief's event filter.
+                return mouseThief.receivedPressEvent;
+            }
+            return false;
+        }
+
+        function checkForCurrentItem() {
+            // Use a temporary varibable because setting currentIndex to -1 here
+            // will trigger onCurrentIndexChanged.
+            if (!!visibleItems) {
+                var hoveredIndex = -1;
+                for (var i = 0; i < visibleItems.length; ++i) {
+                    if (isMouseOver(i)) {
+                        hoveredIndex = i;
+                        break;
+                    }
+                }
+                currentIndex = hoveredIndex;
+            }
+        }
+
+        function simplifyAngle(angle) {
+            var simplified = angle % 360;
+            if (simplified < 0)
+                simplified += 360;
+            return simplified;
+        }
+
+        function isWithinBottomEdge() {
+            var start = simplifyAngle(pieMenu.__style.startAngle);
+            var end = simplifyAngle(pieMenu.__style.endAngle);
+            return start >= 270 && end <= 90 && ((start < 360 && end <= 360) || (start >= 0 && end > 0));
+        }
+
+        function isWithinTopEdge() {
+            var start = simplifyAngle(pieMenu.__style.startAngle);
+            var end = simplifyAngle(pieMenu.__style.endAngle);
+            return start >= 90 && start < 270 && end > 90 && end <= 270;
+        }
+
+        function isWithinLeftEdge() {
+            var start = simplifyAngle(pieMenu.__style.startAngle);
+            var end = simplifyAngle(pieMenu.__style.endAngle);
+            return (start === 360 || start >= 0) && start < 180 && end > 0 && end <= 180;
+        }
+
+        function isWithinRightEdge() {
+            var start = simplifyAngle(pieMenu.__style.startAngle);
+            var end = simplifyAngle(pieMenu.__style.endAngle);
+            return start >= 180 && start < 360 && end > 180 && (end === 360 || end === 0);
+        }
+
+        /*!
+            Moves the menu if it would open with parts outside of \a rootParent.
+        */
+        function moveWithinBounds() {
+            // Find the bounding rect of the bounding item in the parent's referential.
+            var topLeft = boundingItem.mapToItem(pieMenu.parent, 0, 0);
+            var topRight = boundingItem.mapToItem(pieMenu.parent, boundingItem.width, 0);
+            var bottomLeft = boundingItem.mapToItem(pieMenu.parent, 0, boundingItem.height);
+            var bottomRight = boundingItem.mapToItem(pieMenu.parent, boundingItem.width, boundingItem.height);
+
+            // If the boundingItem is rotated, normalize the bounding rect.
+            topLeft.x = Math.min(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x);
+            topLeft.y = Math.min(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y);
+            bottomRight.x = Math.max(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x);
+            bottomRight.y = Math.max(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y);
+
+            if (pieMenu.x < topLeft.x && !isWithinLeftEdge()) {
+                // The width and height of the menu is always that of a full circle,
+                // so the menu is not always outside an edge when it's outside the edge -
+                // it depends on the start and end angles.
+                pieMenu.x = topLeft.x;
+            } else if (pieMenu.x + pieMenu.width > bottomRight.x && !isWithinRightEdge()) {
+                pieMenu.x = bottomRight.x - pieMenu.width;
+            }
+
+            if (pieMenu.y < topLeft.y && !isWithinTopEdge()) {
+                pieMenu.y = topLeft.y;
+            } else if (pieMenu.y + pieMenu.height > bottomRight.y && !isWithinBottomEdge()) {
+                pieMenu.y = bottomRight.y - pieMenu.height;
+            }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Extras/PieMenu.qmlc b/deployment_test/QtQuick/Extras/PieMenu.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..ab5d09757c1d0eaf887531968ebeeeca7afaabf2
Binary files /dev/null and b/deployment_test/QtQuick/Extras/PieMenu.qmlc differ
diff --git a/deployment_test/QtQuick/Extras/Private/CircularButton.qml b/deployment_test/QtQuick/Extras/Private/CircularButton.qml
new file mode 100644
index 0000000000000000000000000000000000000000..6a147ebf070f794cb67c463f18251559b229576d
--- /dev/null
+++ b/deployment_test/QtQuick/Extras/Private/CircularButton.qml
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Extras module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.4
+import QtQuick.Controls.Styles 1.4
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \internal
+*/
+Button {
+    id: button
+    style: Settings.styleComponent(Settings.style, "CircularButtonStyle.qml", button)
+}
diff --git a/deployment_test/QtQuick/Extras/Private/CircularButton.qmlc b/deployment_test/QtQuick/Extras/Private/CircularButton.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..9d9185627114a26b3ce3762576cbc9f3140dba24
Binary files /dev/null and b/deployment_test/QtQuick/Extras/Private/CircularButton.qmlc differ
diff --git a/deployment_test/QtQuick/Extras/Private/CircularButtonStyleHelper.qml b/deployment_test/QtQuick/Extras/Private/CircularButtonStyleHelper.qml
new file mode 100644
index 0000000000000000000000000000000000000000..713d727fd9c92abfd489bb2490656a50c55d87c8
--- /dev/null
+++ b/deployment_test/QtQuick/Extras/Private/CircularButtonStyleHelper.qml
@@ -0,0 +1,136 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Extras module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Extras 1.4
+import QtQuick.Extras.Private 1.0
+
+QtObject {
+    id: circularButtonStyleHelper
+
+    property Item control
+
+    property color buttonColorUpTop: "#e3e3e3"
+    property color buttonColorUpBottom: "#b3b3b3"
+    property color buttonColorDownTop: "#d3d3d3"
+    property color buttonColorDownBottom: "#939393"
+    property color outerArcColorTop: "#9c9c9c"
+    property color outerArcColorBottom: Qt.rgba(0.941, 0.941, 0.941, 0.29)
+    property color innerArcColorTop: "#e3e3e3"
+    property color innerArcColorBottom: "#acacac"
+    property real innerArcColorBottomStop: 0.4
+    property color shineColor: Qt.rgba(1, 1, 1, 0.29)
+    property real smallestAxis: control ? Math.min(control.width, control.height) : 0
+    property real outerArcLineWidth: smallestAxis * 0.04
+    property real innerArcLineWidth: Math.max(1, outerArcLineWidth * 0.1)
+    property real shineArcLineWidth: Math.max(1, outerArcLineWidth * 0.1)
+    property real implicitWidth: Math.round(TextSingleton.implicitHeight * 8)
+    property real implicitHeight: Math.round(TextSingleton.implicitHeight * 8)
+
+    property color textColorUp: "#4e4e4e"
+    property color textColorDown: "#303030"
+    property color textRaisedColorUp: "#ffffff"
+    property color textRaisedColorDown: "#e3e3e3"
+
+    property real radius: (smallestAxis * 0.5) - outerArcLineWidth - innerArcLineWidth
+    property real halfRadius: radius / 2
+    property real outerArcRadius: innerArcRadius + outerArcLineWidth / 2
+    property real innerArcRadius: radius + innerArcLineWidth / 2
+    property real shineArcRadius: outerArcRadius + outerArcLineWidth / 2 - shineArcLineWidth / 2
+    property real zeroAngle: Math.PI * 0.5
+
+    property color buttonColorTop: control && control.pressed ? buttonColorDownTop : buttonColorUpTop
+    property color buttonColorBottom: control && control.pressed ? buttonColorDownBottom : buttonColorUpBottom
+
+    function toPixels(percentageOfSmallestAxis) {
+        return percentageOfSmallestAxis * smallestAxis;
+    }
+
+    function paintBackground(ctx) {
+        ctx.reset();
+
+        if (outerArcRadius < 0 || radius < 0)
+            return;
+
+        var xCenter = ctx.canvas.width / 2;
+        var yCenter = ctx.canvas.height / 2;
+
+        /* Draw outer arc */
+        ctx.beginPath();
+        ctx.lineWidth = outerArcLineWidth;
+        ctx.arc(xCenter, yCenter, outerArcRadius, 0, Math.PI * 2, false);
+        var gradient = ctx.createRadialGradient(xCenter, yCenter - halfRadius,
+            0, xCenter, yCenter - halfRadius, radius * 1.5);
+        gradient.addColorStop(0, outerArcColorTop);
+        gradient.addColorStop(1, outerArcColorBottom);
+        ctx.strokeStyle = gradient;
+        ctx.stroke();
+
+        /* Draw the shine along the bottom */
+        ctx.beginPath();
+        ctx.lineWidth = shineArcLineWidth;
+        ctx.arc(xCenter, yCenter, shineArcRadius, 0, Math.PI, false);
+        gradient = ctx.createLinearGradient(xCenter, yCenter + radius, xCenter, yCenter);
+        gradient.addColorStop(0, shineColor);
+        gradient.addColorStop(0.5, "rgba(255, 255, 255, 0)");
+        ctx.strokeStyle = gradient;
+        ctx.stroke();
+
+        /* Draw inner arc */
+        ctx.beginPath();
+        ctx.lineWidth = innerArcLineWidth + 1;
+        ctx.arc(xCenter, yCenter, innerArcRadius, 0, Math.PI * 2, false);
+        gradient = ctx.createLinearGradient(xCenter, yCenter - halfRadius,
+            xCenter, yCenter + halfRadius);
+        gradient.addColorStop(0, innerArcColorTop);
+        gradient.addColorStop(innerArcColorBottomStop, innerArcColorBottom);
+        ctx.strokeStyle = gradient;
+        ctx.stroke();
+
+        /* Draw the button's body */
+        ctx.beginPath();
+        ctx.ellipse(xCenter - radius, yCenter - radius, radius * 2, radius * 2);
+        gradient = ctx.createRadialGradient(xCenter, yCenter + radius * 0.85, 0,
+            xCenter, yCenter + radius * 0.85, radius * (0.85 * 2));
+        gradient.addColorStop(1, buttonColorTop);
+        gradient.addColorStop(0, buttonColorBottom);
+        ctx.fillStyle = gradient;
+        ctx.fill();
+    }
+}
diff --git a/deployment_test/QtQuick/Extras/Private/CircularButtonStyleHelper.qmlc b/deployment_test/QtQuick/Extras/Private/CircularButtonStyleHelper.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..c9d5a931584eb5eb5e0470ff9ed8e491655faddd
Binary files /dev/null and b/deployment_test/QtQuick/Extras/Private/CircularButtonStyleHelper.qmlc differ
diff --git a/deployment_test/QtQuick/Extras/Private/CircularTickmarkLabel.qml b/deployment_test/QtQuick/Extras/Private/CircularTickmarkLabel.qml
new file mode 100644
index 0000000000000000000000000000000000000000..997a784b8d4f0975d5b5431e9466e964a296c40e
--- /dev/null
+++ b/deployment_test/QtQuick/Extras/Private/CircularTickmarkLabel.qml
@@ -0,0 +1,145 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Extras module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+// Workaround for QTBUG-37751; we need this import for RangeModel, although we shouldn't.
+import QtQuick.Controls 1.1
+import QtQuick.Controls.Private 1.0
+import QtQuick.Extras 1.4
+import QtQuick.Extras.Private 1.0
+
+Control {
+    id: label
+    style: Settings.styleComponent(Settings.style, "CircularTickmarkLabelStyle.qml", label)
+
+    property alias minimumValue: range.minimumValue
+
+    property alias maximumValue: range.maximumValue
+
+    property alias stepSize: range.stepSize
+
+    RangeModel {
+        id: range
+        minimumValue: 0
+        maximumValue: 100
+        stepSize: 0
+        // Not used.
+        value: minimumValue
+    }
+
+    /*!
+        This property determines the angle at which the first tickmark is drawn.
+    */
+    property real minimumValueAngle: -145
+
+    /*!
+        This property determines the angle at which the last tickmark is drawn.
+    */
+    property real maximumValueAngle: 145
+
+    /*!
+        The range between \l minimumValueAngle and \l maximumValueAngle, in
+        degrees.
+    */
+    readonly property real angleRange: maximumValueAngle - minimumValueAngle
+
+    /*!
+        The interval at which tickmarks are displayed.
+    */
+    property real tickmarkStepSize: 10
+
+    /*!
+        The distance in pixels from the outside of the control (outerRadius) at
+        which the outermost point of the tickmark line is drawn.
+    */
+    property real tickmarkInset: 0.0
+
+    /*!
+        The amount of tickmarks displayed.
+    */
+    readonly property int tickmarkCount: __tickmarkCount
+
+    /*!
+        The amount of minor tickmarks between each tickmark.
+    */
+    property int minorTickmarkCount: 4
+
+    /*!
+        The distance in pixels from the outside of the control (outerRadius) at
+        which the outermost point of the minor tickmark line is drawn.
+    */
+    property real minorTickmarkInset: 0.0
+
+    /*!
+        The distance in pixels from the outside of the control (outerRadius) at
+        which the center of the value marker text is drawn.
+    */
+    property real labelInset: __style.__protectedScope.toPixels(0.19)
+
+    /*!
+        The interval at which tickmark labels are displayed.
+    */
+    property real labelStepSize: tickmarkStepSize
+
+    /*!
+        The amount of tickmark labels displayed.
+    */
+    readonly property int labelCount: (maximumValue - minimumValue) / labelStepSize + 1
+
+    /*! \internal */
+    readonly property real __tickmarkCount: tickmarkStepSize > 0 ? (maximumValue - minimumValue) / tickmarkStepSize + 1 : 0
+
+    /*!
+        This property determines whether or not the control displays tickmarks,
+        minor tickmarks, and labels.
+    */
+    property bool tickmarksVisible: true
+
+    /*!
+        Returns \a value as an angle in degrees.
+
+        For example, if minimumValueAngle is set to \c 270 and maximumValueAngle
+        is set to \c 90, this function will return \c 270 when passed
+        minimumValue and \c 90 when passed maximumValue.
+    */
+    function valueToAngle(value) {
+        var normalised = (value - minimumValue) / (maximumValue - minimumValue);
+        return (maximumValueAngle - minimumValueAngle) * normalised + minimumValueAngle;
+    }
+}
diff --git a/deployment_test/QtQuick/Extras/Private/CircularTickmarkLabel.qmlc b/deployment_test/QtQuick/Extras/Private/CircularTickmarkLabel.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..1df42fb73bdd7ea03773418b298c8e52f3f3bad1
Binary files /dev/null and b/deployment_test/QtQuick/Extras/Private/CircularTickmarkLabel.qmlc differ
diff --git a/deployment_test/QtQuick/Extras/Private/Handle.qml b/deployment_test/QtQuick/Extras/Private/Handle.qml
new file mode 100644
index 0000000000000000000000000000000000000000..6c3fdaa60913380318324b6eb4cc21e82710cdac
--- /dev/null
+++ b/deployment_test/QtQuick/Extras/Private/Handle.qml
@@ -0,0 +1,123 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Extras module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtGraphicalEffects 1.0
+import QtQuick.Controls.Styles 1.4
+import QtQuick.Controls.Private 1.0
+import QtQuick.Extras.Private 1.1
+import QtQuick.Extras.Private.CppUtils 1.0
+
+Control {
+    id: root
+    x: handleArea.centerOfHandle.x - width / 2
+    y: handleArea.centerOfHandle.y - height / 2
+
+    style: Settings.styleComponent(Settings.style, "HandleStyle.qml", root)
+
+    /*!
+        The angle of the handle along the circumference of \l rotationRadius in
+        radians, scaled to be in the range of 0.0 to 1.0.
+    */
+    property alias value: range.value
+
+    RangeModel {
+        id: range
+        minimumValue: 0.0
+        maximumValue: 1.0
+        stepSize: 0
+        value: minimumValue
+    }
+
+    /*!
+        The angle in radians where the dial starts.
+    */
+    property real zeroAngle: 0
+
+    /*!
+        The radius of the rotation of this handle.
+    */
+    property real rotationRadius: 50
+
+    /*!
+        The center of the dial. This is the origin point for the handle's
+        rotation.
+    */
+    property real dialXCenter: 0
+    property real dialYCenter: 0
+
+    /*!
+        This property holds the amount of extra room added to each side of
+        the handle to make it easier to drag on touch devices.
+    */
+    property real allowance: Math.max(width, height) * 1.5
+
+    /*
+        The function used to determine the handle's value from the position of
+        the mouse.
+
+        Can be set to provide custom value calculation. It expects these
+        parameters: \c mouseX, \c mouseY, \c xCenter, \c yCenter, \c zeroAngle
+    */
+    property var valueFromMouse: handleArea.valueFromMouse
+
+    property alias handleArea: handleArea
+
+    MouseArea {
+        id: handleArea
+        // Respond to value changes by calculating the new center of the handle.
+        property point centerOfHandle: MathUtils.centerAlongCircle(dialXCenter, dialYCenter,
+            0, 0, MathUtils.valueToAngle(value, 1, zeroAngle), rotationRadius);
+
+        anchors.fill: parent
+        anchors.margins: -allowance
+
+        onPositionChanged: {
+            // Whenever the handle is moved with the mouse, update the value.
+            value = root.valueFromMouse(mouse.x + centerOfHandle.x - allowance,
+                mouse.y + centerOfHandle.y - allowance, dialXCenter, dialYCenter, zeroAngle);
+        }
+
+        // A helper function for onPositionChanged.
+        function valueFromMouse(mouseX, mouseY, xCenter, yCenter, zeroAngle) {
+            return MathUtils.angleToValue(
+                MathUtils.halfPi - Math.atan2(mouseX - xCenter, mouseY - yCenter), 1, zeroAngle);
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Extras/Private/Handle.qmlc b/deployment_test/QtQuick/Extras/Private/Handle.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..1c10e4e44979e92b7a502ba08598e7dcaa6e4872
Binary files /dev/null and b/deployment_test/QtQuick/Extras/Private/Handle.qmlc differ
diff --git a/deployment_test/QtQuick/Extras/Private/PieMenuIcon.qml b/deployment_test/QtQuick/Extras/Private/PieMenuIcon.qml
new file mode 100644
index 0000000000000000000000000000000000000000..7cb57e0273e41139873f2d98cfe2ff2a8d573865
--- /dev/null
+++ b/deployment_test/QtQuick/Extras/Private/PieMenuIcon.qml
@@ -0,0 +1,102 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Extras module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.3
+import QtQuick.Extras 1.4
+import QtQuick.Extras.Private 1.0
+import QtQuick.Extras.Private.CppUtils 1.0
+
+Loader {
+    id: iconLoader
+    active: iconSource != ""
+
+    property PieMenu control: null
+    property QtObject styleData: null
+
+    readonly property string iconSource: styleData && styleData.index < control.__protectedScope.visibleItems.length
+        ? control.__protectedScope.visibleItems[styleData.index].iconSource
+        : ""
+
+    sourceComponent: Image {
+        id: iconImage
+        source: iconSource
+        x: pos.x
+        y: pos.y
+        scale: scaleFactor
+
+        readonly property point pos: MathUtils.centerAlongCircle(
+            iconLoader.parent.width / 2, iconLoader.parent.height / 2, width, height,
+            MathUtils.degToRadOffset(sectionCenterAngle(styleData.index)), control.__style.__iconOffset)
+
+        /*
+            The icons should scale with the menu at some point, so that they
+            stay within the bounds of each section. We down-scale the image by
+            whichever of the following amounts are larger:
+
+            a) The amount by which the largest dimension's diagonal size exceeds
+            the "selectable" radius. The selectable radius is the distance in pixels
+            between lines A and B in the incredibly visually appealing image below:
+
+                   __________
+                 -      B     -
+               /                \
+             /        ____        \
+            |        /  A \        |
+            --------|      |--------
+
+            b) The amount by which the diagonal exceeds the circumference of
+            one section.
+        */
+        readonly property real scaleFactor: {
+            var largestDimension = Math.max(iconImage.sourceSize.width, iconImage.sourceSize.height) * Math.sqrt(2);
+            // TODO: add padding
+            var radiusDifference = largestDimension - control.__style.__selectableRadius;
+            var circumferenceDifference = largestDimension - Math.abs(control.__protectedScope.circumferenceOfSection);
+            if (circumferenceDifference > 0 || radiusDifference > 0) {
+                // We need to down-scale.
+                if (radiusDifference > circumferenceDifference) {
+                    return control.__style.__selectableRadius / largestDimension;
+                } else {
+                    return Math.abs(control.__protectedScope.circumferenceOfSection) / largestDimension;
+                }
+            }
+            return 1;
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Extras/Private/PieMenuIcon.qmlc b/deployment_test/QtQuick/Extras/Private/PieMenuIcon.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..66415ac7e083afd3804608b84221b732af5c9241
Binary files /dev/null and b/deployment_test/QtQuick/Extras/Private/PieMenuIcon.qmlc differ
diff --git a/deployment_test/QtQuick/Extras/Private/TextSingleton.qml b/deployment_test/QtQuick/Extras/Private/TextSingleton.qml
new file mode 100644
index 0000000000000000000000000000000000000000..78e9003d246eab873587d3587a555d118d65f4b2
--- /dev/null
+++ b/deployment_test/QtQuick/Extras/Private/TextSingleton.qml
@@ -0,0 +1,44 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Extras module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+pragma Singleton
+import QtQuick 2.1
+
+Text {
+}
diff --git a/deployment_test/QtQuick/Extras/Private/TextSingleton.qmlc b/deployment_test/QtQuick/Extras/Private/TextSingleton.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..f5dc33de9ab3f191613477463515f45615928c43
Binary files /dev/null and b/deployment_test/QtQuick/Extras/Private/TextSingleton.qmlc differ
diff --git a/deployment_test/QtQuick/Extras/Private/qmldir b/deployment_test/QtQuick/Extras/Private/qmldir
new file mode 100644
index 0000000000000000000000000000000000000000..3b115bba6334d79d3658a26e5ec1e3cb3d5baf40
--- /dev/null
+++ b/deployment_test/QtQuick/Extras/Private/qmldir
@@ -0,0 +1 @@
+module QtQuick.Extras.Private
diff --git a/deployment_test/QtQuick/Extras/StatusIndicator.qml b/deployment_test/QtQuick/Extras/StatusIndicator.qml
new file mode 100644
index 0000000000000000000000000000000000000000..aee171c40ba2c4826429f6e6b24c555ccd2b816a
--- /dev/null
+++ b/deployment_test/QtQuick/Extras/StatusIndicator.qml
@@ -0,0 +1,119 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Extras module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.4
+import QtQuick.Controls.Styles 1.4
+import QtQuick.Controls.Private 1.0
+import QtQuick.Extras 1.4
+import QtQuick.Extras.Private 1.0
+
+/*!
+    \qmltype StatusIndicator
+    \inqmlmodule QtQuick.Extras
+    \since 5.5
+    \ingroup extras
+    \ingroup extras-non-interactive
+    \brief An indicator that displays active or inactive states.
+
+    \image statusindicator-active.png A StatusIndicator in the active state
+    A StatusIndicator in the active state.
+    \image statusindicator-inactive.png A StatusIndicator in the inactive state
+    A StatusIndicator in the inactive state.
+
+    The StatusIndicator displays active or inactive states. By using different
+    colors via the \l color property, StatusIndicator can provide extra
+    context to these states. For example:
+
+    \table
+    \row
+        \li QML
+        \li Result
+    \row
+        \li
+            \code
+                import QtQuick 2.2
+                import QtQuick.Extras 1.4
+
+                Rectangle {
+                    width: 100
+                    height: 100
+                    color: "#cccccc"
+
+                    StatusIndicator {
+                        anchors.centerIn: parent
+                        color: "green"
+                    }
+                }
+            \endcode
+        \li \image statusindicator-green.png "Green StatusIndicator"
+    \endtable
+
+    You can create a custom appearance for a StatusIndicator by assigning a
+    \l {StatusIndicatorStyle}.
+*/
+
+Control {
+    id: statusIndicator
+
+    style: Settings.styleComponent(Settings.style, "StatusIndicatorStyle.qml", statusIndicator)
+
+    /*!
+        This property specifies whether the indicator is active or inactive.
+
+        The default value is \c false (off).
+
+        \deprecated Use active instead.
+    */
+    property alias on: statusIndicator.active
+
+    /*!
+        This property specifies whether the indicator is active or inactive.
+
+        The default value is \c false (inactive).
+    */
+    property bool active: false
+
+    /*!
+        This property specifies the color of the indicator when it is active.
+
+        The default value is \c "red".
+    */
+    property color color: __style.color
+}
diff --git a/deployment_test/QtQuick/Extras/StatusIndicator.qmlc b/deployment_test/QtQuick/Extras/StatusIndicator.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..4469a0b7c08a92657785e832a934a601976a4bf1
Binary files /dev/null and b/deployment_test/QtQuick/Extras/StatusIndicator.qmlc differ
diff --git a/deployment_test/QtQuick/Extras/ToggleButton.qml b/deployment_test/QtQuick/Extras/ToggleButton.qml
new file mode 100644
index 0000000000000000000000000000000000000000..9a66741326838eca5cacce4e635276422293081b
--- /dev/null
+++ b/deployment_test/QtQuick/Extras/ToggleButton.qml
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Extras module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.4
+import QtQuick.Controls.Styles 1.4
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype ToggleButton
+    \inqmlmodule QtQuick.Extras
+    \since 5.5
+    \ingroup extras
+    \ingroup extras-interactive
+    \brief A push button that toggles between two states.
+
+    \image togglebutton-unchecked.png An unchecked ToggleButton
+    An unchecked ToggleButton.
+    \image togglebutton-checked.png A checked ToggleButton
+    A checked ToggleButton.
+
+    The ToggleButton is a simple extension of Qt Quick Controls' Button, using
+    the checked property to toggle between two states: \e checked and
+    \e unchecked. It enhances the visibility of a checkable button's state by
+    placing color-coded indicators around the button.
+
+    You can create a custom appearance for a ToggleButton by assigning a
+    \l {ToggleButtonStyle}.
+*/
+
+Button {
+    id: button
+    checkable: true
+    style: Settings.styleComponent(Settings.style, "ToggleButtonStyle.qml", button)
+}
diff --git a/deployment_test/QtQuick/Extras/ToggleButton.qmlc b/deployment_test/QtQuick/Extras/ToggleButton.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..4170602c12618a78ec3ca2b37383681cb42131d5
Binary files /dev/null and b/deployment_test/QtQuick/Extras/ToggleButton.qmlc differ
diff --git a/deployment_test/QtQuick/Extras/Tumbler.qml b/deployment_test/QtQuick/Extras/Tumbler.qml
new file mode 100644
index 0000000000000000000000000000000000000000..355d676b811c7de57bdeb94903215731c70376ad
--- /dev/null
+++ b/deployment_test/QtQuick/Extras/Tumbler.qml
@@ -0,0 +1,478 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Extras module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQml 2.14 as Qml
+import QtQuick 2.2
+import QtQuick.Controls 1.4
+import QtQuick.Controls.Styles 1.4
+import QtQuick.Controls.Private 1.0
+import QtQuick.Extras 1.4
+import QtQuick.Extras.Private 1.0
+import QtQuick.Layouts 1.0
+
+/*!
+    \qmltype Tumbler
+    \inqmlmodule QtQuick.Extras
+    \since 5.5
+    \ingroup extras
+    \ingroup extras-interactive
+    \brief A control that can have several spinnable wheels, each with items
+    that can be selected.
+
+    \image tumbler.png A Tumbler
+
+    \note Tumbler requires Qt 5.5.0 or later.
+
+    The Tumbler control is used with one or more TumblerColumn items, which
+    define the content of each column:
+
+    \code
+    Tumbler {
+        TumblerColumn {
+            model: 5
+        }
+        TumblerColumn {
+            model: [0, 1, 2, 3, 4]
+        }
+        TumblerColumn {
+            model: ["A", "B", "C", "D", "E"]
+        }
+    }
+    \endcode
+
+    You can also use a traditional model with roles:
+
+    \code
+    Rectangle {
+        width: 220
+        height: 350
+        color: "#494d53"
+
+        ListModel {
+            id: listModel
+
+            ListElement {
+                foo: "A"
+                bar: "B"
+                baz: "C"
+            }
+            ListElement {
+                foo: "A"
+                bar: "B"
+                baz: "C"
+            }
+            ListElement {
+                foo: "A"
+                bar: "B"
+                baz: "C"
+            }
+        }
+
+        Tumbler {
+            anchors.centerIn: parent
+
+            TumblerColumn {
+                model: listModel
+                role: "foo"
+            }
+            TumblerColumn {
+                model: listModel
+                role: "bar"
+            }
+            TumblerColumn {
+                model: listModel
+                role: "baz"
+            }
+        }
+    }
+    \endcode
+
+    \section1 Limitations
+
+    For technical reasons, the model count must be equal to or greater than
+    \l {TumblerStyle::}{visibleItemCount}
+    plus one. The
+    \l {TumblerStyle::}{visibleItemCount}
+    must also be an odd number.
+
+    You can create a custom appearance for a Tumbler by assigning a
+    \l {TumblerStyle}. To style
+    individual columns, use the \l {TumblerColumn::delegate}{delegate} and
+    \l {TumblerColumn::highlight}{highlight} properties of TumblerColumn.
+*/
+
+Control {
+    id: tumbler
+
+    /*
+        \qmlproperty Component Tumbler::style
+
+        The style Component for this control.
+    */
+    style: Settings.styleComponent(Settings.style, "TumblerStyle.qml", tumbler)
+
+    ListModel {
+        id: columnModel
+    }
+
+    /*!
+        \qmlproperty int Tumbler::columnCount
+
+        The number of columns in the Tumbler.
+    */
+    readonly property alias columnCount: columnModel.count
+
+    /*! \internal */
+    function __isValidColumnIndex(index) {
+        return index >= 0 && index < columnCount/* && columnRepeater.children.length === columnCount*/;
+    }
+
+    /*! \internal */
+    function __isValidColumnAndItemIndex(columnIndex, itemIndex) {
+        return __isValidColumnIndex(columnIndex) && itemIndex >= 0 && itemIndex < __viewAt(columnIndex).count;
+    }
+
+    /*!
+        \qmlmethod int Tumbler::currentIndexAt(int columnIndex)
+        Returns the current index of the column at \a columnIndex, or \c null
+        if \a columnIndex is invalid.
+    */
+    function currentIndexAt(columnIndex) {
+        if (!__isValidColumnIndex(columnIndex))
+            return -1;
+
+        return columnModel.get(columnIndex).columnObject.currentIndex;
+    }
+
+    /*!
+        \qmlmethod void Tumbler::setCurrentIndexAt(int columnIndex, int itemIndex, int interval)
+        Sets the current index of the column at \a columnIndex to \a itemIndex. The animation
+        length can be set with \a interval, which defaults to \c 0.
+
+        Does nothing if \a columnIndex or \a itemIndex are invalid.
+    */
+    function setCurrentIndexAt(columnIndex, itemIndex, interval) {
+        if (!__isValidColumnAndItemIndex(columnIndex, itemIndex))
+            return;
+
+        var view = columnRepeater.itemAt(columnIndex).view;
+        if (view.currentIndex !== itemIndex) {
+            view.highlightMoveDuration = typeof interval !== 'undefined' ? interval : 0;
+            view.currentIndex = itemIndex;
+            view.highlightMoveDuration = Qt.binding(function(){ return __highlightMoveDuration; });
+        }
+    }
+
+    /*!
+        \qmlmethod TumblerColumn Tumbler::getColumn(int columnIndex)
+        Returns the column at \a columnIndex or \c null if the index is
+        invalid.
+    */
+    function getColumn(columnIndex) {
+        if (!__isValidColumnIndex(columnIndex))
+            return null;
+
+        return columnModel.get(columnIndex).columnObject;
+    }
+
+    /*!
+        \qmlmethod TumblerColumn Tumbler::addColumn(TumblerColumn column)
+        Adds a \a column and returns the added column.
+
+        The \a column argument can be an instance of TumblerColumn,
+        or a \l Component. The component has to contain a TumblerColumn.
+        Otherwise  \c null is returned.
+    */
+    function addColumn(column) {
+        return insertColumn(columnCount, column);
+    }
+
+    /*!
+        \qmlmethod TumblerColumn Tumbler::insertColumn(int index, TumblerColumn column)
+        Inserts a \a column at the given \a index and returns the inserted column.
+
+        The \a column argument can be an instance of TumblerColumn,
+        or a \l Component. The component has to contain a TumblerColumn.
+        Otherwise, \c null is returned.
+    */
+    function insertColumn(index, column) {
+        var object = column;
+        if (typeof column["createObject"] === "function") {
+            object = column.createObject(root);
+        } else if (object.__tumbler) {
+            console.warn("Tumbler::insertColumn(): you cannot add a column to multiple Tumblers")
+            return null;
+        }
+        if (index >= 0 && index <= columnCount && object.accessibleRole === Accessible.ColumnHeader) {
+            object.__tumbler = tumbler;
+            object.__index = index;
+            columnModel.insert(index, { columnObject: object });
+            return object;
+        }
+
+        if (object !== column)
+            object.destroy();
+        console.warn("Tumbler::insertColumn(): invalid argument");
+        return null;
+    }
+
+    /*
+    Try making one selection bar by invisible highlight item hack, so that bars go across separators
+      */
+
+    Component.onCompleted: {
+        for (var i = 0; i < data.length; ++i) {
+            var column = data[i];
+            if (column.accessibleRole === Accessible.ColumnHeader)
+                addColumn(column);
+        }
+    }
+
+    /*! \internal */
+    readonly property alias __columnRow: columnRow
+    /*! \internal */
+    property int __highlightMoveDuration: 300
+
+    /*! \internal */
+    function __viewAt(index) {
+        if (!__isValidColumnIndex(index))
+            return null;
+
+        return columnRepeater.itemAt(index).view;
+    }
+
+    /*! \internal */
+    readonly property alias __movementDelayTimer: movementDelayTimer
+
+    // When the up/down arrow keys are held down on a PathView,
+    // the movement of the items is limited to the highlightMoveDuration,
+    // but there is no built-in guard against trying to move the items at
+    // the speed of the auto-repeat key presses. This results in sluggish
+    // movement, so we enforce a delay with a timer to avoid this.
+    Timer {
+        id: movementDelayTimer
+        interval: __highlightMoveDuration
+    }
+
+    Loader {
+        id: backgroundLoader
+        sourceComponent: __style.background
+        anchors.fill: columnRow
+    }
+
+    Loader {
+        id: frameLoader
+        sourceComponent: __style.frame
+        anchors.fill: columnRow
+        anchors.leftMargin: -__style.padding.left
+        anchors.rightMargin: -__style.padding.right
+        anchors.topMargin: -__style.padding.top
+        anchors.bottomMargin: -__style.padding.bottom
+    }
+
+    Row {
+        id: columnRow
+        x: __style.padding.left
+        y: __style.padding.top
+
+        Repeater {
+            id: columnRepeater
+            model: columnModel
+            delegate: Item {
+                id: columnItem
+                width: columnPathView.width + separatorDelegateLoader.width
+                height: columnPathView.height
+
+                readonly property int __columnIndex: index
+                // For index-related functions and tests.
+                readonly property alias view: columnPathView
+                readonly property alias separator: separatorDelegateLoader.item
+
+                PathView {
+                    id: columnPathView
+                    width: columnObject.width
+                    height: tumbler.height - tumbler.__style.padding.top - tumbler.__style.padding.bottom
+                    visible: columnObject.visible
+                    clip: true
+
+                    Qml.Binding {
+                        target: columnObject
+                        property: "__currentIndex"
+                        value: columnPathView.currentIndex
+                        restoreMode: Binding.RestoreBinding
+                    }
+
+                    // We add one here so that the delegate's don't just appear in the view instantly,
+                    // but rather come from the top/bottom. To account for this adjustment elsewhere,
+                    // we extend the path height by half an item's height at the top and bottom.
+                    pathItemCount: tumbler.__style.visibleItemCount + 1
+                    preferredHighlightBegin: 0.5
+                    preferredHighlightEnd: 0.5
+                    highlightMoveDuration: tumbler.__highlightMoveDuration
+                    highlight: Loader {
+                        id: highlightLoader
+                        objectName: "highlightLoader"
+                        sourceComponent: columnObject.highlight ? columnObject.highlight : __style.highlight
+                        width: columnPathView.width
+
+                        readonly property int __index: index
+
+                        property QtObject styleData: QtObject {
+                            readonly property alias index: highlightLoader.__index
+                            readonly property int column: columnItem.__columnIndex
+                            readonly property bool activeFocus: columnPathView.activeFocus
+                        }
+                    }
+                    dragMargin: width / 2
+
+                    activeFocusOnTab: true
+                    Keys.onDownPressed: {
+                        if (!movementDelayTimer.running) {
+                            columnPathView.incrementCurrentIndex();
+                            movementDelayTimer.start();
+                        }
+                    }
+                    Keys.onUpPressed: {
+                        if (!movementDelayTimer.running) {
+                            columnPathView.decrementCurrentIndex();
+                            movementDelayTimer.start();
+                        }
+                    }
+
+                    path: Path {
+                        startX: columnPathView.width / 2
+                        startY: -tumbler.__style.__delegateHeight / 2
+                        PathLine {
+                            x: columnPathView.width / 2
+                            y: columnPathView.pathItemCount * tumbler.__style.__delegateHeight - tumbler.__style.__delegateHeight / 2
+                        }
+                    }
+
+                    model: columnObject.model
+
+                    delegate: Item {
+                        id: delegateRootItem
+                        property var itemModel: model
+
+                        implicitWidth: itemDelegateLoader.width
+                        implicitHeight: itemDelegateLoader.height
+
+                        Loader {
+                            id: itemDelegateLoader
+                            sourceComponent: columnObject.delegate ? columnObject.delegate : __style.delegate
+                            width: columnObject.width
+
+                            onHeightChanged: tumbler.__style.__delegateHeight = height;
+
+                            property var model: itemModel
+
+                            readonly property var __modelData: modelData
+                            readonly property int __columnDelegateIndex: index
+                            property QtObject styleData: QtObject {
+                                readonly property var modelData: itemDelegateLoader.__modelData
+                                readonly property alias index: itemDelegateLoader.__columnDelegateIndex
+                                readonly property int column: columnItem.__columnIndex
+                                readonly property bool activeFocus: columnPathView.activeFocus
+                                readonly property real displacement: {
+                                    var count = delegateRootItem.PathView.view.count;
+                                    var offset = delegateRootItem.PathView.view.offset;
+
+                                    var d = count - index - offset;
+                                    var halfVisibleItems = Math.floor(tumbler.__style.visibleItemCount / 2) + 1;
+                                    if (d > halfVisibleItems)
+                                        d -= count;
+                                    else if (d < -halfVisibleItems)
+                                        d += count;
+                                    return d;
+                                }
+                                readonly property bool current: delegateRootItem.PathView.isCurrentItem
+                                readonly property string role: columnObject.role
+                                readonly property var value: (itemModel && itemModel.hasOwnProperty(role))
+                                    ? itemModel[role] // Qml ListModel and QAbstractItemModel
+                                    : modelData && modelData.hasOwnProperty(role)
+                                        ? modelData[role] // QObjectList/QObject
+                                        : modelData != undefined ? modelData : "" // Models without role
+                            }
+                        }
+                    }
+                }
+
+                Loader {
+                    anchors.fill: columnPathView
+                    sourceComponent: columnObject.columnForeground ? columnObject.columnForeground : __style.columnForeground
+
+                    property QtObject styleData: QtObject {
+                        readonly property int column: columnItem.__columnIndex
+                        readonly property bool activeFocus: columnPathView.activeFocus
+                    }
+                }
+
+                Loader {
+                    id: separatorDelegateLoader
+                    objectName: "separatorDelegateLoader"
+                    sourceComponent: __style.separator
+                    // Don't need a separator after the last delegate.
+                    active: __columnIndex < tumbler.columnCount - 1
+                    anchors.left: columnPathView.right
+                    anchors.top: parent.top
+                    anchors.bottom: parent.bottom
+                    visible: columnObject.visible
+
+                    // Use the width of the first separator to help us
+                    // determine the default separator width.
+                    onWidthChanged: {
+                        if (__columnIndex == 0) {
+                            tumbler.__style.__separatorWidth = width;
+                        }
+                    }
+
+                    property QtObject styleData: QtObject {
+                        readonly property int index: __columnIndex
+                    }
+                }
+            }
+        }
+    }
+
+    Loader {
+        id: foregroundLoader
+        sourceComponent: __style.foreground
+        anchors.fill: backgroundLoader
+    }
+}
diff --git a/deployment_test/QtQuick/Extras/Tumbler.qmlc b/deployment_test/QtQuick/Extras/Tumbler.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..f4629eb7e8e5ddf601c96cb1729b31557d5904af
Binary files /dev/null and b/deployment_test/QtQuick/Extras/Tumbler.qmlc differ
diff --git a/deployment_test/QtQuick/Extras/TumblerColumn.qml b/deployment_test/QtQuick/Extras/TumblerColumn.qml
new file mode 100644
index 0000000000000000000000000000000000000000..f630a228ac0a325eaacf1811a3dfe364f5df3470
--- /dev/null
+++ b/deployment_test/QtQuick/Extras/TumblerColumn.qml
@@ -0,0 +1,171 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Extras module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.4
+import QtQuick.Controls.Private 1.0
+
+/*!
+    \qmltype TumblerColumn
+    \inqmlmodule QtQuick.Extras
+    \since 5.5
+    \ingroup extras
+    \brief A column within a tumbler.
+
+    TumblerColumn represents a column within a tumbler, providing the interface
+    to define the items and width of each column.
+
+    \code
+    Tumbler {
+        TumblerColumn {
+            model: [1, 2, 3]
+        }
+
+        TumblerColumn {
+            model: ["A", "B", "C"]
+            visible: false
+        }
+    }
+    \endcode
+
+    You can create a custom appearance for a Tumbler by assigning a
+    \l {TumblerStyle}.
+*/
+
+QtObject {
+    id: tumblerColumn
+
+    /*! \internal */
+    property Item __tumbler: null
+
+    /*!
+        \internal
+
+        The index of this column within the tumbler.
+    */
+    property int __index: -1
+
+    /*!
+        \internal
+
+        The index of the current item, if the PathView has items instantiated,
+        or the last current index if it doesn't.
+    */
+    property int __currentIndex: -1
+
+    property int accessibleRole: Accessible.ColumnHeader
+
+    /*!
+        \qmlproperty int TumblerColumn::currentIndex
+
+        This read-only property holds the index of the current item for this
+        column. If the model count is reduced, the current index will be
+        reduced to the new count minus one.
+
+        \sa {Tumbler::currentIndexAt}, {Tumbler::setCurrentIndexAt}
+    */
+    readonly property alias currentIndex: tumblerColumn.__currentIndex
+
+    /*!
+        This property holds the model that provides data for this column.
+    */
+    property var model: null
+
+    /*!
+        This property holds the model role of this column.
+    */
+    property string role: ""
+
+    /*!
+        The item delegate for this column.
+
+        If set, this delegate will be used to display items in this column,
+        instead of the
+        \l {TumblerStyle::}{delegate}
+        property in \l {TumblerStyle}.
+
+        The \l {Item::implicitHeight}{implicitHeight} property must be set,
+        and it must be the same for each delegate.
+    */
+    property Component delegate
+
+    /*!
+        The highlight delegate for this column.
+
+        If set, this highlight will be used to display the highlight in this
+        column, instead of the
+        \l {TumblerStyle::}{highlight}
+        property in \l {TumblerStyle}.
+    */
+    property Component highlight
+
+    /*!
+        The foreground of this column.
+
+        If set, this component will be used to display the foreground in this
+        column, instead of the
+        \l {TumblerStyle::}{columnForeground}
+        property in \l {TumblerStyle}.
+    */
+    property Component columnForeground
+
+    /*!
+        This property holds the visibility of this column.
+    */
+    property bool visible: true
+
+    /*!
+        This read-only property indicates whether the item has active focus.
+
+        See Item's \l {Item::activeFocus}{activeFocus} property for more
+        information.
+    */
+    readonly property bool activeFocus: {
+        if (__tumbler === null)
+            return null;
+
+        var view = __tumbler.__viewAt(__index);
+        return view && view.activeFocus ? true : false;
+    }
+
+    /*!
+        This property holds the width of this column.
+    */
+    property real width: TextSingleton.implicitHeight * 4
+}
diff --git a/deployment_test/QtQuick/Extras/TumblerColumn.qmlc b/deployment_test/QtQuick/Extras/TumblerColumn.qmlc
new file mode 100644
index 0000000000000000000000000000000000000000..c922b77cf2669b4776af2b3d0afa993bcb52acd7
Binary files /dev/null and b/deployment_test/QtQuick/Extras/TumblerColumn.qmlc differ
diff --git a/deployment_test/QtQuick/Extras/plugins.qmltypes b/deployment_test/QtQuick/Extras/plugins.qmltypes
new file mode 100644
index 0000000000000000000000000000000000000000..f16f0b5cf8adbd6f096732f64b3f3590118af147
--- /dev/null
+++ b/deployment_test/QtQuick/Extras/plugins.qmltypes
@@ -0,0 +1,657 @@
+import QtQuick.tooling 1.2
+
+// This file describes the plugin-supplied types contained in the library.
+// It is used for QML tooling purposes only.
+//
+// This file was auto-generated by:
+// 'qmlplugindump -nonrelocatable QtQuick.Extras 1.4'
+
+Module {
+    dependencies: [
+        "QtGraphicalEffects 1.12",
+        "QtQml 2.14",
+        "QtQml.Models 2.2",
+        "QtQuick 2.9",
+        "QtQuick.Controls 1.5",
+        "QtQuick.Controls.Styles 1.4",
+        "QtQuick.Layouts 1.1",
+        "QtQuick.Window 2.2"
+    ]
+    Component {
+        name: "QQuickActivationMode"
+        exports: ["QtQuick.Extras/ActivationMode 1.0"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        Enum {
+            name: "ActivationMode"
+            values: {
+                "ActivateOnPress": 0,
+                "ActivateOnRelease": 1,
+                "ActivateOnClick": 2
+            }
+        }
+    }
+    Component {
+        name: "QQuickCircularProgressBar"
+        defaultProperty: "data"
+        prototype: "QQuickPaintedItem"
+        exports: ["QtQuick.Extras.Private.CppUtils/CircularProgressBar 1.1"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "progress"; type: "double" }
+        Property { name: "barWidth"; type: "double" }
+        Property { name: "inset"; type: "double" }
+        Property { name: "minimumValueAngle"; type: "double" }
+        Property { name: "maximumValueAngle"; type: "double" }
+        Property { name: "backgroundColor"; type: "QColor" }
+        Signal {
+            name: "progressChanged"
+            Parameter { name: "progress"; type: "double" }
+        }
+        Signal {
+            name: "barWidthChanged"
+            Parameter { name: "barWidth"; type: "double" }
+        }
+        Signal {
+            name: "insetChanged"
+            Parameter { name: "inset"; type: "double" }
+        }
+        Signal {
+            name: "minimumValueAngleChanged"
+            Parameter { name: "minimumValueAngle"; type: "double" }
+        }
+        Signal {
+            name: "maximumValueAngleChanged"
+            Parameter { name: "maximumValueAngle"; type: "double" }
+        }
+        Signal {
+            name: "backgroundColorChanged"
+            Parameter { name: "backgroundColor"; type: "QColor" }
+        }
+        Method { name: "clearStops" }
+        Method {
+            name: "addStop"
+            Parameter { name: "position"; type: "double" }
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Method { name: "redraw" }
+    }
+    Component {
+        name: "QQuickFlatProgressBar"
+        defaultProperty: "data"
+        prototype: "QQuickPaintedItem"
+        exports: ["QtQuick.Extras.Private.CppUtils/FlatProgressBar 1.1"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "stripeOffset"; type: "double" }
+        Property { name: "progress"; type: "double" }
+        Property { name: "indeterminate"; type: "bool" }
+        Signal {
+            name: "stripeOffsetChanged"
+            Parameter { name: "stripeOffset"; type: "double" }
+        }
+        Signal {
+            name: "progressChanged"
+            Parameter { name: "progress"; type: "double" }
+        }
+        Signal {
+            name: "indeterminateChanged"
+            Parameter { name: "indeterminate"; type: "bool" }
+        }
+        Method { name: "repaint" }
+        Method { name: "restartAnimation" }
+        Method { name: "onVisibleChanged" }
+        Method { name: "onWidthChanged" }
+        Method { name: "onHeightChanged" }
+    }
+    Component {
+        name: "QQuickMathUtils"
+        prototype: "QObject"
+        exports: ["QtQuick.Extras.Private.CppUtils/MathUtils 1.0"]
+        isCreatable: false
+        isSingleton: true
+        exportMetaObjectRevisions: [0]
+        Property { name: "pi2"; type: "double"; isReadonly: true }
+        Method {
+            name: "degToRad"
+            type: "double"
+            Parameter { name: "degrees"; type: "double" }
+        }
+        Method {
+            name: "degToRadOffset"
+            type: "double"
+            Parameter { name: "degrees"; type: "double" }
+        }
+        Method {
+            name: "radToDeg"
+            type: "double"
+            Parameter { name: "radians"; type: "double" }
+        }
+        Method {
+            name: "radToDegOffset"
+            type: "double"
+            Parameter { name: "radians"; type: "double" }
+        }
+        Method {
+            name: "centerAlongCircle"
+            type: "QPointF"
+            Parameter { name: "xCenter"; type: "double" }
+            Parameter { name: "yCenter"; type: "double" }
+            Parameter { name: "width"; type: "double" }
+            Parameter { name: "height"; type: "double" }
+            Parameter { name: "angleOnCircle"; type: "double" }
+            Parameter { name: "distanceAlongRadius"; type: "double" }
+        }
+        Method {
+            name: "roundEven"
+            type: "double"
+            Parameter { name: "number"; type: "double" }
+        }
+    }
+    Component {
+        name: "QQuickMouseThief"
+        prototype: "QObject"
+        exports: ["QtQuick.Extras.Private.CppUtils/MouseThief 1.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "receivedPressEvent"; type: "bool" }
+        Signal {
+            name: "pressed"
+            Parameter { name: "mouseX"; type: "int" }
+            Parameter { name: "mouseY"; type: "int" }
+        }
+        Signal {
+            name: "released"
+            Parameter { name: "mouseX"; type: "int" }
+            Parameter { name: "mouseY"; type: "int" }
+        }
+        Signal {
+            name: "clicked"
+            Parameter { name: "mouseX"; type: "int" }
+            Parameter { name: "mouseY"; type: "int" }
+        }
+        Signal {
+            name: "touchUpdate"
+            Parameter { name: "mouseX"; type: "int" }
+            Parameter { name: "mouseY"; type: "int" }
+        }
+        Signal { name: "handledEventChanged" }
+        Method {
+            name: "grabMouse"
+            Parameter { name: "item"; type: "QQuickItem"; isPointer: true }
+        }
+        Method { name: "ungrabMouse" }
+        Method { name: "acceptCurrentEvent" }
+    }
+    Component {
+        name: "QQuickPicture"
+        defaultProperty: "data"
+        prototype: "QQuickPaintedItem"
+        exports: ["QtQuick.Extras/Picture 1.4"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "source"; type: "QUrl" }
+        Property { name: "color"; type: "QColor" }
+    }
+    Component {
+        name: "QQuickTriggerMode"
+        exports: ["QtQuick.Extras/TriggerMode 1.3"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        Enum {
+            name: "TriggerMode"
+            values: {
+                "TriggerOnPress": 0,
+                "TriggerOnRelease": 1,
+                "TriggerOnClick": 2
+            }
+        }
+    }
+    Component {
+        prototype: "QQuickFocusScope"
+        name: "QtQuick.Extras.Private/CircularButton 1.0"
+        exports: ["QtQuick.Extras.Private/CircularButton 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "isDefault"; type: "bool" }
+        Property { name: "menu"; type: "Menu_QMLTYPE_38"; isPointer: true }
+        Property { name: "checkable"; type: "bool" }
+        Property { name: "checked"; type: "bool" }
+        Property { name: "exclusiveGroup"; type: "QQuickExclusiveGroup1"; isPointer: true }
+        Property { name: "action"; type: "QQuickAction1"; isPointer: true }
+        Property { name: "activeFocusOnPress"; type: "bool" }
+        Property { name: "text"; type: "string" }
+        Property { name: "tooltip"; type: "string" }
+        Property { name: "iconSource"; type: "QUrl" }
+        Property { name: "iconName"; type: "string" }
+        Property { name: "__position"; type: "string" }
+        Property { name: "__iconOverriden"; type: "bool"; isReadonly: true }
+        Property { name: "__action"; type: "QQuickAction1"; isPointer: true }
+        Property { name: "__iconAction"; type: "QQuickAction1"; isReadonly: true; isPointer: true }
+        Property { name: "__behavior"; type: "QVariant" }
+        Property { name: "__effectivePressed"; type: "bool" }
+        Property { name: "pressed"; type: "bool"; isReadonly: true }
+        Property { name: "hovered"; type: "bool"; isReadonly: true }
+        Signal { name: "clicked" }
+        Method { name: "accessiblePressAction"; type: "QVariant" }
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__style"; type: "QObject"; isPointer: true }
+        Property { name: "__panel"; type: "QQuickItem"; isPointer: true }
+        Property { name: "styleHints"; type: "QVariant" }
+        Property { name: "__styleData"; type: "QObject"; isPointer: true }
+    }
+    Component {
+        prototype: "QObject"
+        name: "QtQuick.Extras.Private/CircularButtonStyleHelper 1.0"
+        exports: ["QtQuick.Extras.Private/CircularButtonStyleHelper 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        Property { name: "control"; type: "QQuickItem"; isPointer: true }
+        Property { name: "buttonColorUpTop"; type: "QColor" }
+        Property { name: "buttonColorUpBottom"; type: "QColor" }
+        Property { name: "buttonColorDownTop"; type: "QColor" }
+        Property { name: "buttonColorDownBottom"; type: "QColor" }
+        Property { name: "outerArcColorTop"; type: "QColor" }
+        Property { name: "outerArcColorBottom"; type: "QColor" }
+        Property { name: "innerArcColorTop"; type: "QColor" }
+        Property { name: "innerArcColorBottom"; type: "QColor" }
+        Property { name: "innerArcColorBottomStop"; type: "double" }
+        Property { name: "shineColor"; type: "QColor" }
+        Property { name: "smallestAxis"; type: "double" }
+        Property { name: "outerArcLineWidth"; type: "double" }
+        Property { name: "innerArcLineWidth"; type: "double" }
+        Property { name: "shineArcLineWidth"; type: "double" }
+        Property { name: "implicitWidth"; type: "double" }
+        Property { name: "implicitHeight"; type: "double" }
+        Property { name: "textColorUp"; type: "QColor" }
+        Property { name: "textColorDown"; type: "QColor" }
+        Property { name: "textRaisedColorUp"; type: "QColor" }
+        Property { name: "textRaisedColorDown"; type: "QColor" }
+        Property { name: "radius"; type: "double" }
+        Property { name: "halfRadius"; type: "double" }
+        Property { name: "outerArcRadius"; type: "double" }
+        Property { name: "innerArcRadius"; type: "double" }
+        Property { name: "shineArcRadius"; type: "double" }
+        Property { name: "zeroAngle"; type: "double" }
+        Property { name: "buttonColorTop"; type: "QColor" }
+        Property { name: "buttonColorBottom"; type: "QColor" }
+        Method {
+            name: "toPixels"
+            type: "QVariant"
+            Parameter { name: "percentageOfSmallestAxis"; type: "QVariant" }
+        }
+        Method {
+            name: "paintBackground"
+            type: "QVariant"
+            Parameter { name: "ctx"; type: "QVariant" }
+        }
+    }
+    Component {
+        prototype: "QQuickFocusScope"
+        name: "QtQuick.Extras/CircularGauge 1.0"
+        exports: ["QtQuick.Extras/CircularGauge 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "tickmarksVisible"; type: "bool" }
+        Property { name: "minimumValue"; type: "double" }
+        Property { name: "maximumValue"; type: "double" }
+        Property { name: "value"; type: "double" }
+        Property { name: "stepSize"; type: "double" }
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__style"; type: "QObject"; isPointer: true }
+        Property { name: "__panel"; type: "QQuickItem"; isPointer: true }
+        Property { name: "styleHints"; type: "QVariant" }
+        Property { name: "__styleData"; type: "QObject"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickFocusScope"
+        name: "QtQuick.Extras.Private/CircularTickmarkLabel 1.0"
+        exports: ["QtQuick.Extras.Private/CircularTickmarkLabel 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "minimumValueAngle"; type: "double" }
+        Property { name: "maximumValueAngle"; type: "double" }
+        Property { name: "angleRange"; type: "double"; isReadonly: true }
+        Property { name: "tickmarkStepSize"; type: "double" }
+        Property { name: "tickmarkInset"; type: "double" }
+        Property { name: "tickmarkCount"; type: "int"; isReadonly: true }
+        Property { name: "minorTickmarkCount"; type: "int" }
+        Property { name: "minorTickmarkInset"; type: "double" }
+        Property { name: "labelInset"; type: "double" }
+        Property { name: "labelStepSize"; type: "double" }
+        Property { name: "labelCount"; type: "int"; isReadonly: true }
+        Property { name: "__tickmarkCount"; type: "double"; isReadonly: true }
+        Property { name: "tickmarksVisible"; type: "bool" }
+        Property { name: "minimumValue"; type: "double" }
+        Property { name: "maximumValue"; type: "double" }
+        Property { name: "stepSize"; type: "double" }
+        Method {
+            name: "valueToAngle"
+            type: "QVariant"
+            Parameter { name: "value"; type: "QVariant" }
+        }
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__style"; type: "QObject"; isPointer: true }
+        Property { name: "__panel"; type: "QQuickItem"; isPointer: true }
+        Property { name: "styleHints"; type: "QVariant" }
+        Property { name: "__styleData"; type: "QObject"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickFocusScope"
+        name: "QtQuick.Extras/DelayButton 1.0"
+        exports: ["QtQuick.Extras/DelayButton 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "delay"; type: "int" }
+        Property { name: "__progress"; type: "double" }
+        Property { name: "progress"; type: "double"; isReadonly: true }
+        Signal { name: "activated" }
+        Property { name: "isDefault"; type: "bool" }
+        Property { name: "menu"; type: "Menu_QMLTYPE_38"; isPointer: true }
+        Property { name: "checkable"; type: "bool" }
+        Property { name: "checked"; type: "bool" }
+        Property { name: "exclusiveGroup"; type: "QQuickExclusiveGroup1"; isPointer: true }
+        Property { name: "action"; type: "QQuickAction1"; isPointer: true }
+        Property { name: "activeFocusOnPress"; type: "bool" }
+        Property { name: "text"; type: "string" }
+        Property { name: "tooltip"; type: "string" }
+        Property { name: "iconSource"; type: "QUrl" }
+        Property { name: "iconName"; type: "string" }
+        Property { name: "__position"; type: "string" }
+        Property { name: "__iconOverriden"; type: "bool"; isReadonly: true }
+        Property { name: "__action"; type: "QQuickAction1"; isPointer: true }
+        Property { name: "__iconAction"; type: "QQuickAction1"; isReadonly: true; isPointer: true }
+        Property { name: "__behavior"; type: "QVariant" }
+        Property { name: "__effectivePressed"; type: "bool" }
+        Property { name: "pressed"; type: "bool"; isReadonly: true }
+        Property { name: "hovered"; type: "bool"; isReadonly: true }
+        Signal { name: "clicked" }
+        Method { name: "accessiblePressAction"; type: "QVariant" }
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__style"; type: "QObject"; isPointer: true }
+        Property { name: "__panel"; type: "QQuickItem"; isPointer: true }
+        Property { name: "styleHints"; type: "QVariant" }
+        Property { name: "__styleData"; type: "QObject"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickFocusScope"
+        name: "QtQuick.Extras/Dial 1.0"
+        exports: ["QtQuick.Extras/Dial 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "__wrap"; type: "bool" }
+        Property { name: "activeFocusOnPress"; type: "bool" }
+        Property { name: "tickmarksVisible"; type: "bool" }
+        Property { name: "value"; type: "double" }
+        Property { name: "minimumValue"; type: "double" }
+        Property { name: "maximumValue"; type: "double" }
+        Property { name: "hovered"; type: "bool"; isReadonly: true }
+        Property { name: "stepSize"; type: "double" }
+        Property { name: "pressed"; type: "bool"; isReadonly: true }
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__style"; type: "QObject"; isPointer: true }
+        Property { name: "__panel"; type: "QQuickItem"; isPointer: true }
+        Property { name: "styleHints"; type: "QVariant" }
+        Property { name: "__styleData"; type: "QObject"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickFocusScope"
+        name: "QtQuick.Extras/Dial 1.1"
+        exports: ["QtQuick.Extras/Dial 1.1"]
+        exportMetaObjectRevisions: [1]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "__wrap"; type: "bool" }
+        Property { name: "activeFocusOnPress"; type: "bool" }
+        Property { name: "tickmarksVisible"; type: "bool" }
+        Property { name: "value"; type: "double" }
+        Property { name: "minimumValue"; type: "double" }
+        Property { name: "maximumValue"; type: "double" }
+        Property { name: "hovered"; type: "bool"; isReadonly: true }
+        Property { name: "stepSize"; type: "double" }
+        Property { name: "pressed"; type: "bool"; isReadonly: true }
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__style"; type: "QObject"; isPointer: true }
+        Property { name: "__panel"; type: "QQuickItem"; isPointer: true }
+        Property { name: "styleHints"; type: "QVariant" }
+        Property { name: "__styleData"; type: "QObject"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickFocusScope"
+        name: "QtQuick.Extras/Gauge 1.0"
+        exports: ["QtQuick.Extras/Gauge 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "orientation"; type: "int" }
+        Property { name: "tickmarkAlignment"; type: "int" }
+        Property { name: "__tickmarkAlignment"; type: "int" }
+        Property { name: "__tickmarksInside"; type: "bool" }
+        Property { name: "tickmarkStepSize"; type: "double" }
+        Property { name: "minorTickmarkCount"; type: "int" }
+        Property { name: "formatValue"; type: "QVariant" }
+        Property { name: "minimumValue"; type: "double" }
+        Property { name: "value"; type: "double" }
+        Property { name: "maximumValue"; type: "double" }
+        Property { name: "font"; type: "QFont" }
+        Property { name: "__hiddenText"; type: "QQuickText"; isReadonly: true; isPointer: true }
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__style"; type: "QObject"; isPointer: true }
+        Property { name: "__panel"; type: "QQuickItem"; isPointer: true }
+        Property { name: "styleHints"; type: "QVariant" }
+        Property { name: "__styleData"; type: "QObject"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickFocusScope"
+        name: "QtQuick.Extras/PieMenu 1.0"
+        exports: ["QtQuick.Extras/PieMenu 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "menuItems"
+        Property { name: "selectionAngle"; type: "double"; isReadonly: true }
+        Property { name: "triggerMode"; type: "int" }
+        Property { name: "title"; type: "string" }
+        Property { name: "boundingItem"; type: "QQuickItem"; isPointer: true }
+        Property { name: "__protectedScope"; type: "QObject"; isPointer: true }
+        Property { name: "activationMode"; type: "int" }
+        Property { name: "menuItems"; type: "QQuickMenuItem1"; isList: true; isReadonly: true }
+        Property { name: "currentIndex"; type: "int"; isReadonly: true }
+        Property { name: "currentItem"; type: "QQuickMenuItem1"; isReadonly: true; isPointer: true }
+        Property { name: "__mouseThief"; type: "QQuickMouseThief"; isReadonly: true; isPointer: true }
+        Method {
+            name: "popup"
+            type: "QVariant"
+            Parameter { name: "x"; type: "QVariant" }
+            Parameter { name: "y"; type: "QVariant" }
+        }
+        Method {
+            name: "addItem"
+            type: "QVariant"
+            Parameter { name: "text"; type: "QVariant" }
+        }
+        Method {
+            name: "insertItem"
+            type: "QVariant"
+            Parameter { name: "before"; type: "QVariant" }
+            Parameter { name: "text"; type: "QVariant" }
+        }
+        Method {
+            name: "removeItem"
+            type: "QVariant"
+            Parameter { name: "item"; type: "QVariant" }
+        }
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__style"; type: "QObject"; isPointer: true }
+        Property { name: "__panel"; type: "QQuickItem"; isPointer: true }
+        Property { name: "styleHints"; type: "QVariant" }
+        Property { name: "__styleData"; type: "QObject"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickLoader"
+        name: "QtQuick.Extras.Private/PieMenuIcon 1.0"
+        exports: ["QtQuick.Extras.Private/PieMenuIcon 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "control"; type: "PieMenu_QMLTYPE_98"; isPointer: true }
+        Property { name: "styleData"; type: "QObject"; isPointer: true }
+        Property { name: "iconSource"; type: "string"; isReadonly: true }
+    }
+    Component {
+        prototype: "QQuickFocusScope"
+        name: "QtQuick.Extras/StatusIndicator 1.0"
+        exports: ["QtQuick.Extras/StatusIndicator 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "active"; type: "bool" }
+        Property { name: "color"; type: "QColor" }
+        Property { name: "on"; type: "bool" }
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__style"; type: "QObject"; isPointer: true }
+        Property { name: "__panel"; type: "QQuickItem"; isPointer: true }
+        Property { name: "styleHints"; type: "QVariant" }
+        Property { name: "__styleData"; type: "QObject"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickFocusScope"
+        name: "QtQuick.Extras/StatusIndicator 1.1"
+        exports: ["QtQuick.Extras/StatusIndicator 1.1"]
+        exportMetaObjectRevisions: [1]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "active"; type: "bool" }
+        Property { name: "color"; type: "QColor" }
+        Property { name: "on"; type: "bool" }
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__style"; type: "QObject"; isPointer: true }
+        Property { name: "__panel"; type: "QQuickItem"; isPointer: true }
+        Property { name: "styleHints"; type: "QVariant" }
+        Property { name: "__styleData"; type: "QObject"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickText"
+        name: "QtQuick.Extras.Private/TextSingleton 1.0"
+        exports: ["QtQuick.Extras.Private/TextSingleton 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        isCreatable: false
+        isSingleton: true
+        defaultProperty: "data"
+    }
+    Component {
+        prototype: "QQuickFocusScope"
+        name: "QtQuick.Extras/ToggleButton 1.0"
+        exports: ["QtQuick.Extras/ToggleButton 1.0"]
+        exportMetaObjectRevisions: [0]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "isDefault"; type: "bool" }
+        Property { name: "menu"; type: "Menu_QMLTYPE_38"; isPointer: true }
+        Property { name: "checkable"; type: "bool" }
+        Property { name: "checked"; type: "bool" }
+        Property { name: "exclusiveGroup"; type: "QQuickExclusiveGroup1"; isPointer: true }
+        Property { name: "action"; type: "QQuickAction1"; isPointer: true }
+        Property { name: "activeFocusOnPress"; type: "bool" }
+        Property { name: "text"; type: "string" }
+        Property { name: "tooltip"; type: "string" }
+        Property { name: "iconSource"; type: "QUrl" }
+        Property { name: "iconName"; type: "string" }
+        Property { name: "__position"; type: "string" }
+        Property { name: "__iconOverriden"; type: "bool"; isReadonly: true }
+        Property { name: "__action"; type: "QQuickAction1"; isPointer: true }
+        Property { name: "__iconAction"; type: "QQuickAction1"; isReadonly: true; isPointer: true }
+        Property { name: "__behavior"; type: "QVariant" }
+        Property { name: "__effectivePressed"; type: "bool" }
+        Property { name: "pressed"; type: "bool"; isReadonly: true }
+        Property { name: "hovered"; type: "bool"; isReadonly: true }
+        Signal { name: "clicked" }
+        Method { name: "accessiblePressAction"; type: "QVariant" }
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__style"; type: "QObject"; isPointer: true }
+        Property { name: "__panel"; type: "QQuickItem"; isPointer: true }
+        Property { name: "styleHints"; type: "QVariant" }
+        Property { name: "__styleData"; type: "QObject"; isPointer: true }
+    }
+    Component {
+        prototype: "QQuickFocusScope"
+        name: "QtQuick.Extras/Tumbler 1.2"
+        exports: ["QtQuick.Extras/Tumbler 1.2"]
+        exportMetaObjectRevisions: [2]
+        isComposite: true
+        defaultProperty: "data"
+        Property { name: "__highlightMoveDuration"; type: "int" }
+        Property { name: "columnCount"; type: "int"; isReadonly: true }
+        Property { name: "__columnRow"; type: "QQuickRow"; isReadonly: true; isPointer: true }
+        Property { name: "__movementDelayTimer"; type: "QQmlTimer"; isReadonly: true; isPointer: true }
+        Method {
+            name: "__isValidColumnIndex"
+            type: "QVariant"
+            Parameter { name: "index"; type: "QVariant" }
+        }
+        Method {
+            name: "__isValidColumnAndItemIndex"
+            type: "QVariant"
+            Parameter { name: "columnIndex"; type: "QVariant" }
+            Parameter { name: "itemIndex"; type: "QVariant" }
+        }
+        Method {
+            name: "currentIndexAt"
+            type: "QVariant"
+            Parameter { name: "columnIndex"; type: "QVariant" }
+        }
+        Method {
+            name: "setCurrentIndexAt"
+            type: "QVariant"
+            Parameter { name: "columnIndex"; type: "QVariant" }
+            Parameter { name: "itemIndex"; type: "QVariant" }
+            Parameter { name: "interval"; type: "QVariant" }
+        }
+        Method {
+            name: "getColumn"
+            type: "QVariant"
+            Parameter { name: "columnIndex"; type: "QVariant" }
+        }
+        Method {
+            name: "addColumn"
+            type: "QVariant"
+            Parameter { name: "column"; type: "QVariant" }
+        }
+        Method {
+            name: "insertColumn"
+            type: "QVariant"
+            Parameter { name: "index"; type: "QVariant" }
+            Parameter { name: "column"; type: "QVariant" }
+        }
+        Method {
+            name: "__viewAt"
+            type: "QVariant"
+            Parameter { name: "index"; type: "QVariant" }
+        }
+        Property { name: "style"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "__style"; type: "QObject"; isPointer: true }
+        Property { name: "__panel"; type: "QQuickItem"; isPointer: true }
+        Property { name: "styleHints"; type: "QVariant" }
+        Property { name: "__styleData"; type: "QObject"; isPointer: true }
+    }
+    Component {
+        prototype: "QObject"
+        name: "QtQuick.Extras/TumblerColumn 1.2"
+        exports: ["QtQuick.Extras/TumblerColumn 1.2"]
+        exportMetaObjectRevisions: [2]
+        isComposite: true
+        Property { name: "__tumbler"; type: "QQuickItem"; isPointer: true }
+        Property { name: "__index"; type: "int" }
+        Property { name: "__currentIndex"; type: "int" }
+        Property { name: "model"; type: "QVariant" }
+        Property { name: "role"; type: "string" }
+        Property { name: "delegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "highlight"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "columnForeground"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "visible"; type: "bool" }
+        Property { name: "activeFocus"; type: "bool"; isReadonly: true }
+        Property { name: "width"; type: "double" }
+        Property { name: "currentIndex"; type: "int"; isReadonly: true }
+    }
+}
diff --git a/deployment_test/QtQuick/Extras/qmldir b/deployment_test/QtQuick/Extras/qmldir
new file mode 100644
index 0000000000000000000000000000000000000000..0cac6a550d5ce1b412eb0606953a5b7b6a46b04f
--- /dev/null
+++ b/deployment_test/QtQuick/Extras/qmldir
@@ -0,0 +1,7 @@
+module QtQuick.Extras
+plugin qtquickextrasplugin
+classname QtQuickExtrasPlugin
+#typeinfo plugins.qmltypes
+
+depends QtGraphicalEffects 1.0
+depends QtQml 2.14
diff --git a/deployment_test/QtQuick/Extras/qtquickextrasplugin.dll b/deployment_test/QtQuick/Extras/qtquickextrasplugin.dll
new file mode 100644
index 0000000000000000000000000000000000000000..94e067aac6de682d951408f60f8d8f4e2aa1cffd
Binary files /dev/null and b/deployment_test/QtQuick/Extras/qtquickextrasplugin.dll differ
diff --git a/deployment_test/QtQuick/Layouts/plugins.qmltypes b/deployment_test/QtQuick/Layouts/plugins.qmltypes
new file mode 100644
index 0000000000000000000000000000000000000000..d3f778d2ea161726fdc7f1c44c75c1ba7616be32
--- /dev/null
+++ b/deployment_test/QtQuick/Layouts/plugins.qmltypes
@@ -0,0 +1,130 @@
+import QtQuick.tooling 1.2
+
+// This file describes the plugin-supplied types contained in the library.
+// It is used for QML tooling purposes only.
+//
+// This file was auto-generated by qmltyperegistrar.
+
+Module {
+    dependencies: ["QtQuick 2.0"]
+    Component {
+        file: "qquicklinearlayout_p.h"
+        name: "QQuickColumnLayout"
+        prototype: "QQuickLinearLayout"
+        exports: [
+            "QtQuick.Layouts/ColumnLayout 1.0",
+            "QtQuick.Layouts/ColumnLayout 1.1",
+            "QtQuick.Layouts/ColumnLayout 1.11",
+            "QtQuick.Layouts/ColumnLayout 1.4",
+            "QtQuick.Layouts/ColumnLayout 1.7"
+        ]
+        exportMetaObjectRevisions: [0, 1, 11, 4, 7]
+    }
+    Component {
+        file: "qquicklinearlayout_p.h"
+        name: "QQuickGridLayout"
+        prototype: "QQuickGridLayoutBase"
+        exports: [
+            "QtQuick.Layouts/GridLayout 1.0",
+            "QtQuick.Layouts/GridLayout 1.1",
+            "QtQuick.Layouts/GridLayout 1.11",
+            "QtQuick.Layouts/GridLayout 1.4",
+            "QtQuick.Layouts/GridLayout 1.7"
+        ]
+        exportMetaObjectRevisions: [0, 1, 11, 4, 7]
+        Enum {
+            name: "Flow"
+            values: ["LeftToRight", "TopToBottom"]
+        }
+        Property { name: "columnSpacing"; type: "double" }
+        Property { name: "rowSpacing"; type: "double" }
+        Property { name: "columns"; type: "int" }
+        Property { name: "rows"; type: "int" }
+        Property { name: "flow"; type: "Flow" }
+    }
+    Component {
+        file: "qquicklinearlayout_p.h"
+        name: "QQuickGridLayoutBase"
+        prototype: "QQuickLayout"
+        Property { name: "layoutDirection"; revision: 1; type: "Qt::LayoutDirection" }
+        Signal { name: "layoutDirectionChanged"; revision: 1 }
+    }
+    Component {
+        file: "qquicklayout_p.h"
+        name: "QQuickLayout"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        exports: [
+            "QtQuick.Layouts/Layout 1.0",
+            "QtQuick.Layouts/Layout 1.1",
+            "QtQuick.Layouts/Layout 1.11",
+            "QtQuick.Layouts/Layout 1.4",
+            "QtQuick.Layouts/Layout 1.7"
+        ]
+        isCreatable: false
+        exportMetaObjectRevisions: [0, 1, 11, 4, 7]
+        attachedType: "QQuickLayoutAttached"
+        Method { name: "invalidateSenderItem" }
+        Method { name: "_q_dumpLayoutTree" }
+    }
+    Component {
+        name: "QQuickLayoutAttached"
+        prototype: "QObject"
+        Property { name: "minimumWidth"; type: "double" }
+        Property { name: "minimumHeight"; type: "double" }
+        Property { name: "preferredWidth"; type: "double" }
+        Property { name: "preferredHeight"; type: "double" }
+        Property { name: "maximumWidth"; type: "double" }
+        Property { name: "maximumHeight"; type: "double" }
+        Property { name: "fillHeight"; type: "bool" }
+        Property { name: "fillWidth"; type: "bool" }
+        Property { name: "row"; type: "int" }
+        Property { name: "column"; type: "int" }
+        Property { name: "rowSpan"; type: "int" }
+        Property { name: "columnSpan"; type: "int" }
+        Property { name: "alignment"; type: "Qt::Alignment" }
+        Property { name: "margins"; type: "double" }
+        Property { name: "leftMargin"; type: "double" }
+        Property { name: "topMargin"; type: "double" }
+        Property { name: "rightMargin"; type: "double" }
+        Property { name: "bottomMargin"; type: "double" }
+    }
+    Component {
+        file: "qquicklinearlayout_p.h"
+        name: "QQuickLinearLayout"
+        prototype: "QQuickGridLayoutBase"
+        Property { name: "spacing"; type: "double" }
+    }
+    Component {
+        file: "qquicklinearlayout_p.h"
+        name: "QQuickRowLayout"
+        prototype: "QQuickLinearLayout"
+        exports: [
+            "QtQuick.Layouts/RowLayout 1.0",
+            "QtQuick.Layouts/RowLayout 1.1",
+            "QtQuick.Layouts/RowLayout 1.11",
+            "QtQuick.Layouts/RowLayout 1.4",
+            "QtQuick.Layouts/RowLayout 1.7"
+        ]
+        exportMetaObjectRevisions: [0, 1, 11, 4, 7]
+    }
+    Component {
+        file: "qquickstacklayout_p.h"
+        name: "QQuickStackLayout"
+        prototype: "QQuickLayout"
+        exports: [
+            "QtQuick.Layouts/StackLayout 1.11",
+            "QtQuick.Layouts/StackLayout 1.3",
+            "QtQuick.Layouts/StackLayout 1.4",
+            "QtQuick.Layouts/StackLayout 1.7"
+        ]
+        exportMetaObjectRevisions: [11, 3, 4, 7]
+        Property { name: "count"; type: "int"; isReadonly: true }
+        Property { name: "currentIndex"; type: "int" }
+        Method {
+            name: "itemAt"
+            type: "QQuickItem*"
+            Parameter { name: "index"; type: "int" }
+        }
+    }
+}
diff --git a/deployment_test/QtQuick/Layouts/qmldir b/deployment_test/QtQuick/Layouts/qmldir
new file mode 100644
index 0000000000000000000000000000000000000000..00f85f7d64bc964d117bc3cb2f77bca248ee33ac
--- /dev/null
+++ b/deployment_test/QtQuick/Layouts/qmldir
@@ -0,0 +1,5 @@
+module QtQuick.Layouts
+plugin qquicklayoutsplugin
+classname QtQuickLayoutsPlugin
+typeinfo plugins.qmltypes
+designersupported
diff --git a/deployment_test/QtQuick/Layouts/qquicklayoutsplugin.dll b/deployment_test/QtQuick/Layouts/qquicklayoutsplugin.dll
new file mode 100644
index 0000000000000000000000000000000000000000..19010b5444c27224a4bdf9ae23013dcb5ff70a1c
Binary files /dev/null and b/deployment_test/QtQuick/Layouts/qquicklayoutsplugin.dll differ
diff --git a/deployment_test/QtQuick/Templates.2/plugins.qmltypes b/deployment_test/QtQuick/Templates.2/plugins.qmltypes
new file mode 100644
index 0000000000000000000000000000000000000000..42c04c801f4c4930e7756b7ae26e2be4958f56d7
--- /dev/null
+++ b/deployment_test/QtQuick/Templates.2/plugins.qmltypes
@@ -0,0 +1,3122 @@
+import QtQuick.tooling 1.2
+
+// This file describes the plugin-supplied types contained in the library.
+// It is used for QML tooling purposes only.
+//
+// This file was auto-generated by:
+// 'qmlplugindump -nonrelocatable -dependencies dependencies.json QtQuick.Templates 2.15'
+
+Module {
+    dependencies: ["QtQuick 2.9", "QtQuick.Window 2.2"]
+    Component {
+        name: "QQuickAbstractButton"
+        defaultProperty: "data"
+        prototype: "QQuickControl"
+        exports: [
+            "QtQuick.Templates/AbstractButton 2.0",
+            "QtQuick.Templates/AbstractButton 2.2",
+            "QtQuick.Templates/AbstractButton 2.3",
+            "QtQuick.Templates/AbstractButton 2.4",
+            "QtQuick.Templates/AbstractButton 2.5"
+        ]
+        exportMetaObjectRevisions: [0, 2, 3, 4, 5]
+        Enum {
+            name: "Display"
+            values: {
+                "IconOnly": 0,
+                "TextOnly": 1,
+                "TextBesideIcon": 2,
+                "TextUnderIcon": 3
+            }
+        }
+        Property { name: "text"; type: "string" }
+        Property { name: "down"; type: "bool" }
+        Property { name: "pressed"; type: "bool"; isReadonly: true }
+        Property { name: "checked"; type: "bool" }
+        Property { name: "checkable"; type: "bool" }
+        Property { name: "autoExclusive"; type: "bool" }
+        Property { name: "autoRepeat"; type: "bool" }
+        Property { name: "indicator"; type: "QQuickItem"; isPointer: true }
+        Property { name: "icon"; revision: 3; type: "QQuickIcon" }
+        Property { name: "display"; revision: 3; type: "Display" }
+        Property { name: "action"; revision: 3; type: "QQuickAction"; isPointer: true }
+        Property { name: "autoRepeatDelay"; revision: 4; type: "int" }
+        Property { name: "autoRepeatInterval"; revision: 4; type: "int" }
+        Property { name: "pressX"; revision: 4; type: "double"; isReadonly: true }
+        Property { name: "pressY"; revision: 4; type: "double"; isReadonly: true }
+        Property { name: "implicitIndicatorWidth"; revision: 5; type: "double"; isReadonly: true }
+        Property { name: "implicitIndicatorHeight"; revision: 5; type: "double"; isReadonly: true }
+        Signal { name: "pressed" }
+        Signal { name: "released" }
+        Signal { name: "canceled" }
+        Signal { name: "clicked" }
+        Signal { name: "pressAndHold" }
+        Signal { name: "doubleClicked" }
+        Signal { name: "toggled"; revision: 2 }
+        Signal { name: "iconChanged"; revision: 3 }
+        Signal { name: "displayChanged"; revision: 3 }
+        Signal { name: "actionChanged"; revision: 3 }
+        Signal { name: "autoRepeatDelayChanged"; revision: 4 }
+        Signal { name: "autoRepeatIntervalChanged"; revision: 4 }
+        Signal { name: "pressXChanged"; revision: 4 }
+        Signal { name: "pressYChanged"; revision: 4 }
+        Signal { name: "implicitIndicatorWidthChanged"; revision: 5 }
+        Signal { name: "implicitIndicatorHeightChanged"; revision: 5 }
+        Method { name: "toggle" }
+    }
+    Component {
+        name: "QQuickAction"
+        prototype: "QObject"
+        exports: ["QtQuick.Templates/Action 2.3"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "text"; type: "string" }
+        Property { name: "icon"; type: "QQuickIcon" }
+        Property { name: "enabled"; type: "bool" }
+        Property { name: "checked"; type: "bool" }
+        Property { name: "checkable"; type: "bool" }
+        Property { name: "shortcut"; type: "QVariant" }
+        Signal {
+            name: "textChanged"
+            Parameter { name: "text"; type: "string" }
+        }
+        Signal {
+            name: "iconChanged"
+            Parameter { name: "icon"; type: "QQuickIcon" }
+        }
+        Signal {
+            name: "enabledChanged"
+            Parameter { name: "enabled"; type: "bool" }
+        }
+        Signal {
+            name: "checkedChanged"
+            Parameter { name: "checked"; type: "bool" }
+        }
+        Signal {
+            name: "checkableChanged"
+            Parameter { name: "checkable"; type: "bool" }
+        }
+        Signal {
+            name: "shortcutChanged"
+            Parameter { name: "shortcut"; type: "QKeySequence" }
+        }
+        Signal {
+            name: "toggled"
+            Parameter { name: "source"; type: "QObject"; isPointer: true }
+        }
+        Signal { name: "toggled" }
+        Signal {
+            name: "triggered"
+            Parameter { name: "source"; type: "QObject"; isPointer: true }
+        }
+        Signal { name: "triggered" }
+        Method {
+            name: "toggle"
+            Parameter { name: "source"; type: "QObject"; isPointer: true }
+        }
+        Method { name: "toggle" }
+        Method {
+            name: "trigger"
+            Parameter { name: "source"; type: "QObject"; isPointer: true }
+        }
+        Method { name: "trigger" }
+    }
+    Component {
+        name: "QQuickActionGroup"
+        defaultProperty: "actions"
+        prototype: "QObject"
+        exports: ["QtQuick.Templates/ActionGroup 2.3"]
+        exportMetaObjectRevisions: [0]
+        attachedType: "QQuickActionGroupAttached"
+        Property { name: "checkedAction"; type: "QQuickAction"; isPointer: true }
+        Property { name: "actions"; type: "QQuickAction"; isList: true; isReadonly: true }
+        Property { name: "exclusive"; type: "bool" }
+        Property { name: "enabled"; type: "bool" }
+        Signal {
+            name: "triggered"
+            Parameter { name: "action"; type: "QQuickAction"; isPointer: true }
+        }
+        Method {
+            name: "addAction"
+            Parameter { name: "action"; type: "QQuickAction"; isPointer: true }
+        }
+        Method {
+            name: "removeAction"
+            Parameter { name: "action"; type: "QQuickAction"; isPointer: true }
+        }
+    }
+    Component {
+        name: "QQuickActionGroupAttached"
+        prototype: "QObject"
+        Property { name: "group"; type: "QQuickActionGroup"; isPointer: true }
+    }
+    Component {
+        name: "QQuickApplicationWindow"
+        defaultProperty: "contentData"
+        prototype: "QQuickWindowQmlImpl"
+        exports: [
+            "QtQuick.Templates/ApplicationWindow 2.0",
+            "QtQuick.Templates/ApplicationWindow 2.3"
+        ]
+        exportMetaObjectRevisions: [0, 3]
+        attachedType: "QQuickApplicationWindowAttached"
+        Property { name: "background"; type: "QQuickItem"; isPointer: true }
+        Property { name: "contentItem"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property { name: "contentData"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "activeFocusControl"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property { name: "header"; type: "QQuickItem"; isPointer: true }
+        Property { name: "footer"; type: "QQuickItem"; isPointer: true }
+        Property { name: "overlay"; type: "QQuickOverlay"; isReadonly: true; isPointer: true }
+        Property { name: "font"; type: "QFont" }
+        Property { name: "locale"; type: "QLocale" }
+        Property { name: "palette"; revision: 3; type: "QPalette" }
+        Property { name: "menuBar"; revision: 3; type: "QQuickItem"; isPointer: true }
+        Signal { name: "paletteChanged"; revision: 3 }
+        Signal { name: "menuBarChanged"; revision: 3 }
+    }
+    Component {
+        name: "QQuickApplicationWindowAttached"
+        prototype: "QObject"
+        Property { name: "window"; type: "QQuickApplicationWindow"; isReadonly: true; isPointer: true }
+        Property { name: "contentItem"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property { name: "activeFocusControl"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property { name: "header"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property { name: "footer"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property { name: "overlay"; type: "QQuickOverlay"; isReadonly: true; isPointer: true }
+        Property { name: "menuBar"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+    }
+    Component {
+        name: "QQuickBusyIndicator"
+        defaultProperty: "data"
+        prototype: "QQuickControl"
+        exports: ["QtQuick.Templates/BusyIndicator 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "running"; type: "bool" }
+    }
+    Component {
+        name: "QQuickButton"
+        defaultProperty: "data"
+        prototype: "QQuickAbstractButton"
+        exports: ["QtQuick.Templates/Button 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "highlighted"; type: "bool" }
+        Property { name: "flat"; type: "bool" }
+    }
+    Component {
+        name: "QQuickButtonGroup"
+        prototype: "QObject"
+        exports: [
+            "QtQuick.Templates/ButtonGroup 2.0",
+            "QtQuick.Templates/ButtonGroup 2.1",
+            "QtQuick.Templates/ButtonGroup 2.3",
+            "QtQuick.Templates/ButtonGroup 2.4"
+        ]
+        exportMetaObjectRevisions: [0, 1, 3, 4]
+        attachedType: "QQuickButtonGroupAttached"
+        Property { name: "checkedButton"; type: "QQuickAbstractButton"; isPointer: true }
+        Property { name: "buttons"; type: "QQuickAbstractButton"; isList: true; isReadonly: true }
+        Property { name: "exclusive"; revision: 3; type: "bool" }
+        Property { name: "checkState"; revision: 4; type: "Qt::CheckState" }
+        Signal {
+            name: "clicked"
+            revision: 1
+            Parameter { name: "button"; type: "QQuickAbstractButton"; isPointer: true }
+        }
+        Signal { name: "exclusiveChanged"; revision: 3 }
+        Signal { name: "checkStateChanged"; revision: 4 }
+        Method {
+            name: "addButton"
+            Parameter { name: "button"; type: "QQuickAbstractButton"; isPointer: true }
+        }
+        Method {
+            name: "removeButton"
+            Parameter { name: "button"; type: "QQuickAbstractButton"; isPointer: true }
+        }
+    }
+    Component {
+        name: "QQuickButtonGroupAttached"
+        prototype: "QObject"
+        Property { name: "group"; type: "QQuickButtonGroup"; isPointer: true }
+    }
+    Component {
+        name: "QQuickCheckBox"
+        defaultProperty: "data"
+        prototype: "QQuickAbstractButton"
+        exports: [
+            "QtQuick.Templates/CheckBox 2.0",
+            "QtQuick.Templates/CheckBox 2.4"
+        ]
+        exportMetaObjectRevisions: [0, 4]
+        Property { name: "tristate"; type: "bool" }
+        Property { name: "checkState"; type: "Qt::CheckState" }
+        Property { name: "nextCheckState"; revision: 4; type: "QJSValue" }
+        Signal { name: "nextCheckStateChanged"; revision: 4 }
+    }
+    Component {
+        name: "QQuickCheckDelegate"
+        defaultProperty: "data"
+        prototype: "QQuickItemDelegate"
+        exports: [
+            "QtQuick.Templates/CheckDelegate 2.0",
+            "QtQuick.Templates/CheckDelegate 2.4"
+        ]
+        exportMetaObjectRevisions: [0, 4]
+        Property { name: "tristate"; type: "bool" }
+        Property { name: "checkState"; type: "Qt::CheckState" }
+        Property { name: "nextCheckState"; revision: 4; type: "QJSValue" }
+        Signal { name: "nextCheckStateChanged"; revision: 4 }
+    }
+    Component {
+        name: "QQuickComboBox"
+        defaultProperty: "data"
+        prototype: "QQuickControl"
+        exports: [
+            "QtQuick.Templates/ComboBox 2.0",
+            "QtQuick.Templates/ComboBox 2.1",
+            "QtQuick.Templates/ComboBox 2.14",
+            "QtQuick.Templates/ComboBox 2.15",
+            "QtQuick.Templates/ComboBox 2.2",
+            "QtQuick.Templates/ComboBox 2.5"
+        ]
+        exportMetaObjectRevisions: [0, 1, 14, 15, 2, 5]
+        Property { name: "count"; type: "int"; isReadonly: true }
+        Property { name: "model"; type: "QVariant" }
+        Property { name: "delegateModel"; type: "QQmlInstanceModel"; isReadonly: true; isPointer: true }
+        Property { name: "pressed"; type: "bool" }
+        Property { name: "highlightedIndex"; type: "int"; isReadonly: true }
+        Property { name: "currentIndex"; type: "int" }
+        Property { name: "currentText"; type: "string"; isReadonly: true }
+        Property { name: "displayText"; type: "string" }
+        Property { name: "textRole"; type: "string" }
+        Property { name: "delegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "indicator"; type: "QQuickItem"; isPointer: true }
+        Property { name: "popup"; type: "QQuickPopup"; isPointer: true }
+        Property { name: "flat"; revision: 1; type: "bool" }
+        Property { name: "down"; revision: 2; type: "bool" }
+        Property { name: "editable"; revision: 2; type: "bool" }
+        Property { name: "editText"; revision: 2; type: "string" }
+        Property { name: "validator"; revision: 2; type: "QValidator"; isPointer: true }
+        Property { name: "inputMethodHints"; revision: 2; type: "Qt::InputMethodHints" }
+        Property { name: "inputMethodComposing"; revision: 2; type: "bool"; isReadonly: true }
+        Property { name: "acceptableInput"; revision: 2; type: "bool"; isReadonly: true }
+        Property { name: "implicitIndicatorWidth"; revision: 5; type: "double"; isReadonly: true }
+        Property { name: "implicitIndicatorHeight"; revision: 5; type: "double"; isReadonly: true }
+        Property { name: "currentValue"; revision: 14; type: "QVariant"; isReadonly: true }
+        Property { name: "valueRole"; revision: 14; type: "string" }
+        Property { name: "selectTextByMouse"; revision: 15; type: "bool" }
+        Signal {
+            name: "activated"
+            Parameter { name: "index"; type: "int" }
+        }
+        Signal {
+            name: "highlighted"
+            Parameter { name: "index"; type: "int" }
+        }
+        Signal { name: "flatChanged"; revision: 1 }
+        Signal { name: "accepted"; revision: 2 }
+        Signal { name: "downChanged"; revision: 2 }
+        Signal { name: "editableChanged"; revision: 2 }
+        Signal { name: "editTextChanged"; revision: 2 }
+        Signal { name: "validatorChanged"; revision: 2 }
+        Signal { name: "inputMethodHintsChanged"; revision: 2 }
+        Signal { name: "inputMethodComposingChanged"; revision: 2 }
+        Signal { name: "acceptableInputChanged"; revision: 2 }
+        Signal { name: "implicitIndicatorWidthChanged"; revision: 5 }
+        Signal { name: "implicitIndicatorHeightChanged"; revision: 5 }
+        Signal { name: "valueRoleChanged"; revision: 14 }
+        Signal { name: "currentValueChanged"; revision: 14 }
+        Signal { name: "selectTextByMouseChanged"; revision: 15 }
+        Method { name: "incrementCurrentIndex" }
+        Method { name: "decrementCurrentIndex" }
+        Method { name: "selectAll"; revision: 2 }
+        Method {
+            name: "textAt"
+            type: "string"
+            Parameter { name: "index"; type: "int" }
+        }
+        Method {
+            name: "find"
+            type: "int"
+            Parameter { name: "text"; type: "string" }
+            Parameter { name: "flags"; type: "Qt::MatchFlags" }
+        }
+        Method {
+            name: "find"
+            type: "int"
+            Parameter { name: "text"; type: "string" }
+        }
+        Method {
+            name: "valueAt"
+            revision: 14
+            type: "QVariant"
+            Parameter { name: "index"; type: "int" }
+        }
+        Method {
+            name: "indexOfValue"
+            revision: 14
+            type: "int"
+            Parameter { name: "value"; type: "QVariant" }
+        }
+    }
+    Component {
+        name: "QQuickContainer"
+        defaultProperty: "contentData"
+        prototype: "QQuickControl"
+        exports: [
+            "QtQuick.Templates/Container 2.0",
+            "QtQuick.Templates/Container 2.1",
+            "QtQuick.Templates/Container 2.3",
+            "QtQuick.Templates/Container 2.5"
+        ]
+        exportMetaObjectRevisions: [0, 1, 3, 5]
+        Property { name: "count"; type: "int"; isReadonly: true }
+        Property { name: "contentModel"; type: "QVariant"; isReadonly: true }
+        Property { name: "contentData"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "contentChildren"; type: "QQuickItem"; isList: true; isReadonly: true }
+        Property { name: "currentIndex"; type: "int" }
+        Property { name: "currentItem"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property { name: "contentWidth"; revision: 5; type: "double" }
+        Property { name: "contentHeight"; revision: 5; type: "double" }
+        Signal { name: "contentWidthChanged"; revision: 5 }
+        Signal { name: "contentHeightChanged"; revision: 5 }
+        Method {
+            name: "setCurrentIndex"
+            Parameter { name: "index"; type: "int" }
+        }
+        Method { name: "incrementCurrentIndex"; revision: 1 }
+        Method { name: "decrementCurrentIndex"; revision: 1 }
+        Method {
+            name: "itemAt"
+            type: "QQuickItem*"
+            Parameter { name: "index"; type: "int" }
+        }
+        Method {
+            name: "addItem"
+            Parameter { name: "item"; type: "QQuickItem"; isPointer: true }
+        }
+        Method {
+            name: "insertItem"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "item"; type: "QQuickItem"; isPointer: true }
+        }
+        Method {
+            name: "moveItem"
+            Parameter { name: "from"; type: "int" }
+            Parameter { name: "to"; type: "int" }
+        }
+        Method {
+            name: "removeItem"
+            Parameter { name: "item"; type: "QVariant" }
+        }
+        Method {
+            name: "takeItem"
+            revision: 3
+            type: "QQuickItem*"
+            Parameter { name: "index"; type: "int" }
+        }
+    }
+    Component { name: "QQuickContentItem"; defaultProperty: "data"; prototype: "QQuickItem" }
+    Component {
+        name: "QQuickControl"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        exports: [
+            "QtQuick.Templates/Control 2.0",
+            "QtQuick.Templates/Control 2.3",
+            "QtQuick.Templates/Control 2.5"
+        ]
+        exportMetaObjectRevisions: [0, 3, 5]
+        Property { name: "font"; type: "QFont" }
+        Property { name: "availableWidth"; type: "double"; isReadonly: true }
+        Property { name: "availableHeight"; type: "double"; isReadonly: true }
+        Property { name: "padding"; type: "double" }
+        Property { name: "topPadding"; type: "double" }
+        Property { name: "leftPadding"; type: "double" }
+        Property { name: "rightPadding"; type: "double" }
+        Property { name: "bottomPadding"; type: "double" }
+        Property { name: "spacing"; type: "double" }
+        Property { name: "locale"; type: "QLocale" }
+        Property { name: "mirrored"; type: "bool"; isReadonly: true }
+        Property { name: "focusPolicy"; type: "Qt::FocusPolicy" }
+        Property { name: "focusReason"; type: "Qt::FocusReason" }
+        Property { name: "visualFocus"; type: "bool"; isReadonly: true }
+        Property { name: "hovered"; type: "bool"; isReadonly: true }
+        Property { name: "hoverEnabled"; type: "bool" }
+        Property { name: "wheelEnabled"; type: "bool" }
+        Property { name: "background"; type: "QQuickItem"; isPointer: true }
+        Property { name: "contentItem"; type: "QQuickItem"; isPointer: true }
+        Property { name: "baselineOffset"; type: "double" }
+        Property { name: "palette"; revision: 3; type: "QPalette" }
+        Property { name: "horizontalPadding"; revision: 5; type: "double" }
+        Property { name: "verticalPadding"; revision: 5; type: "double" }
+        Property { name: "implicitContentWidth"; revision: 5; type: "double"; isReadonly: true }
+        Property { name: "implicitContentHeight"; revision: 5; type: "double"; isReadonly: true }
+        Property { name: "implicitBackgroundWidth"; revision: 5; type: "double"; isReadonly: true }
+        Property { name: "implicitBackgroundHeight"; revision: 5; type: "double"; isReadonly: true }
+        Property { name: "topInset"; revision: 5; type: "double" }
+        Property { name: "leftInset"; revision: 5; type: "double" }
+        Property { name: "rightInset"; revision: 5; type: "double" }
+        Property { name: "bottomInset"; revision: 5; type: "double" }
+        Signal { name: "paletteChanged"; revision: 3 }
+        Signal { name: "horizontalPaddingChanged"; revision: 5 }
+        Signal { name: "verticalPaddingChanged"; revision: 5 }
+        Signal { name: "implicitContentWidthChanged"; revision: 5 }
+        Signal { name: "implicitContentHeightChanged"; revision: 5 }
+        Signal { name: "implicitBackgroundWidthChanged"; revision: 5 }
+        Signal { name: "implicitBackgroundHeightChanged"; revision: 5 }
+        Signal { name: "topInsetChanged"; revision: 5 }
+        Signal { name: "leftInsetChanged"; revision: 5 }
+        Signal { name: "rightInsetChanged"; revision: 5 }
+        Signal { name: "bottomInsetChanged"; revision: 5 }
+    }
+    Component {
+        name: "QQuickDelayButton"
+        defaultProperty: "data"
+        prototype: "QQuickAbstractButton"
+        exports: ["QtQuick.Templates/DelayButton 2.2"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "delay"; type: "int" }
+        Property { name: "progress"; type: "double" }
+        Property { name: "transition"; type: "QQuickTransition"; isPointer: true }
+        Signal { name: "activated" }
+    }
+    Component {
+        name: "QQuickDial"
+        defaultProperty: "data"
+        prototype: "QQuickControl"
+        exports: [
+            "QtQuick.Templates/Dial 2.0",
+            "QtQuick.Templates/Dial 2.2",
+            "QtQuick.Templates/Dial 2.5"
+        ]
+        exportMetaObjectRevisions: [0, 2, 5]
+        Enum {
+            name: "SnapMode"
+            values: {
+                "NoSnap": 0,
+                "SnapAlways": 1,
+                "SnapOnRelease": 2
+            }
+        }
+        Enum {
+            name: "InputMode"
+            values: {
+                "Circular": 0,
+                "Horizontal": 1,
+                "Vertical": 2
+            }
+        }
+        Property { name: "from"; type: "double" }
+        Property { name: "to"; type: "double" }
+        Property { name: "value"; type: "double" }
+        Property { name: "position"; type: "double"; isReadonly: true }
+        Property { name: "angle"; type: "double"; isReadonly: true }
+        Property { name: "stepSize"; type: "double" }
+        Property { name: "snapMode"; type: "SnapMode" }
+        Property { name: "wrap"; type: "bool" }
+        Property { name: "pressed"; type: "bool"; isReadonly: true }
+        Property { name: "handle"; type: "QQuickItem"; isPointer: true }
+        Property { name: "live"; revision: 2; type: "bool" }
+        Property { name: "inputMode"; revision: 5; type: "InputMode" }
+        Signal { name: "moved"; revision: 2 }
+        Signal { name: "liveChanged"; revision: 2 }
+        Signal { name: "inputModeChanged"; revision: 5 }
+        Method { name: "increase" }
+        Method { name: "decrease" }
+    }
+    Component {
+        name: "QQuickDialog"
+        defaultProperty: "contentData"
+        prototype: "QQuickPopup"
+        exports: [
+            "QtQuick.Templates/Dialog 2.1",
+            "QtQuick.Templates/Dialog 2.3",
+            "QtQuick.Templates/Dialog 2.5"
+        ]
+        exportMetaObjectRevisions: [0, 3, 5]
+        Enum {
+            name: "StandardCode"
+            values: {
+                "Rejected": 0,
+                "Accepted": 1
+            }
+        }
+        Property { name: "title"; type: "string" }
+        Property { name: "header"; type: "QQuickItem"; isPointer: true }
+        Property { name: "footer"; type: "QQuickItem"; isPointer: true }
+        Property { name: "standardButtons"; type: "QPlatformDialogHelper::StandardButtons" }
+        Property { name: "result"; revision: 3; type: "int" }
+        Property { name: "implicitHeaderWidth"; revision: 5; type: "double"; isReadonly: true }
+        Property { name: "implicitHeaderHeight"; revision: 5; type: "double"; isReadonly: true }
+        Property { name: "implicitFooterWidth"; revision: 5; type: "double"; isReadonly: true }
+        Property { name: "implicitFooterHeight"; revision: 5; type: "double"; isReadonly: true }
+        Signal { name: "accepted" }
+        Signal { name: "rejected" }
+        Signal { name: "applied"; revision: 3 }
+        Signal { name: "reset"; revision: 3 }
+        Signal { name: "discarded"; revision: 3 }
+        Signal { name: "helpRequested"; revision: 3 }
+        Signal { name: "resultChanged"; revision: 3 }
+        Method { name: "accept" }
+        Method { name: "reject" }
+        Method {
+            name: "done"
+            Parameter { name: "result"; type: "int" }
+        }
+        Method {
+            name: "standardButton"
+            revision: 3
+            type: "QQuickAbstractButton*"
+            Parameter { name: "button"; type: "QPlatformDialogHelper::StandardButton" }
+        }
+    }
+    Component {
+        name: "QQuickDialogButtonBox"
+        defaultProperty: "contentData"
+        prototype: "QQuickContainer"
+        exports: [
+            "QtQuick.Templates/DialogButtonBox 2.1",
+            "QtQuick.Templates/DialogButtonBox 2.3",
+            "QtQuick.Templates/DialogButtonBox 2.5"
+        ]
+        exportMetaObjectRevisions: [0, 3, 5]
+        attachedType: "QQuickDialogButtonBoxAttached"
+        Enum {
+            name: "Position"
+            values: {
+                "Header": 0,
+                "Footer": 1
+            }
+        }
+        Property { name: "position"; type: "Position" }
+        Property { name: "alignment"; type: "Qt::Alignment" }
+        Property { name: "standardButtons"; type: "QPlatformDialogHelper::StandardButtons" }
+        Property { name: "delegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "buttonLayout"; revision: 5; type: "QPlatformDialogHelper::ButtonLayout" }
+        Signal { name: "accepted" }
+        Signal { name: "rejected" }
+        Signal { name: "helpRequested" }
+        Signal {
+            name: "clicked"
+            Parameter { name: "button"; type: "QQuickAbstractButton"; isPointer: true }
+        }
+        Signal { name: "applied"; revision: 3 }
+        Signal { name: "reset"; revision: 3 }
+        Signal { name: "discarded"; revision: 3 }
+        Signal { name: "buttonLayoutChanged"; revision: 5 }
+        Method {
+            name: "standardButton"
+            type: "QQuickAbstractButton*"
+            Parameter { name: "button"; type: "QPlatformDialogHelper::StandardButton" }
+        }
+    }
+    Component {
+        name: "QQuickDialogButtonBoxAttached"
+        prototype: "QObject"
+        Property { name: "buttonBox"; type: "QQuickDialogButtonBox"; isReadonly: true; isPointer: true }
+        Property { name: "buttonRole"; type: "QPlatformDialogHelper::ButtonRole" }
+    }
+    Component {
+        name: "QQuickDrawer"
+        defaultProperty: "contentData"
+        prototype: "QQuickPopup"
+        exports: [
+            "QtQuick.Templates/Drawer 2.0",
+            "QtQuick.Templates/Drawer 2.2"
+        ]
+        exportMetaObjectRevisions: [0, 2]
+        Property { name: "edge"; type: "Qt::Edge" }
+        Property { name: "position"; type: "double" }
+        Property { name: "dragMargin"; type: "double" }
+        Property { name: "interactive"; revision: 2; type: "bool" }
+        Signal { name: "interactiveChanged"; revision: 2 }
+    }
+    Component {
+        name: "QQuickFrame"
+        defaultProperty: "contentData"
+        prototype: "QQuickPane"
+        exports: ["QtQuick.Templates/Frame 2.0"]
+        exportMetaObjectRevisions: [0]
+    }
+    Component {
+        name: "QQuickGroupBox"
+        defaultProperty: "contentData"
+        prototype: "QQuickFrame"
+        exports: [
+            "QtQuick.Templates/GroupBox 2.0",
+            "QtQuick.Templates/GroupBox 2.5"
+        ]
+        exportMetaObjectRevisions: [0, 5]
+        Property { name: "title"; type: "string" }
+        Property { name: "label"; type: "QQuickItem"; isPointer: true }
+        Property { name: "implicitLabelWidth"; revision: 5; type: "double"; isReadonly: true }
+        Property { name: "implicitLabelHeight"; revision: 5; type: "double"; isReadonly: true }
+        Signal { name: "implicitLabelWidthChanged"; revision: 5 }
+        Signal { name: "implicitLabelHeightChanged"; revision: 5 }
+    }
+    Component {
+        name: "QQuickHeaderViewBase"
+        defaultProperty: "flickableData"
+        prototype: "QQuickTableView"
+        Property { name: "textRole"; type: "string" }
+    }
+    Component {
+        name: "QQuickHorizontalHeaderView"
+        defaultProperty: "flickableData"
+        prototype: "QQuickHeaderViewBase"
+        exports: ["QtQuick.Templates/HorizontalHeaderView 2.15"]
+        exportMetaObjectRevisions: [0]
+        attachedType: "QQuickTableViewAttached"
+    }
+    Component {
+        name: "QQuickIcon"
+        Property { name: "name"; type: "string" }
+        Property { name: "source"; type: "QUrl" }
+        Property { name: "width"; type: "int" }
+        Property { name: "height"; type: "int" }
+        Property { name: "color"; type: "QColor" }
+        Property { name: "cache"; type: "bool" }
+    }
+    Component {
+        name: "QQuickImplicitSizeItem"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        Property { name: "implicitWidth"; type: "double"; isReadonly: true }
+        Property { name: "implicitHeight"; type: "double"; isReadonly: true }
+    }
+    Component {
+        name: "QQuickItem"
+        defaultProperty: "data"
+        prototype: "QObject"
+        Enum {
+            name: "Flags"
+            values: {
+                "ItemClipsChildrenToShape": 1,
+                "ItemAcceptsInputMethod": 2,
+                "ItemIsFocusScope": 4,
+                "ItemHasContents": 8,
+                "ItemAcceptsDrops": 16
+            }
+        }
+        Enum {
+            name: "TransformOrigin"
+            values: {
+                "TopLeft": 0,
+                "Top": 1,
+                "TopRight": 2,
+                "Left": 3,
+                "Center": 4,
+                "Right": 5,
+                "BottomLeft": 6,
+                "Bottom": 7,
+                "BottomRight": 8
+            }
+        }
+        Property { name: "parent"; type: "QQuickItem"; isPointer: true }
+        Property { name: "data"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "resources"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "children"; type: "QQuickItem"; isList: true; isReadonly: true }
+        Property { name: "x"; type: "double" }
+        Property { name: "y"; type: "double" }
+        Property { name: "z"; type: "double" }
+        Property { name: "width"; type: "double" }
+        Property { name: "height"; type: "double" }
+        Property { name: "opacity"; type: "double" }
+        Property { name: "enabled"; type: "bool" }
+        Property { name: "visible"; type: "bool" }
+        Property { name: "visibleChildren"; type: "QQuickItem"; isList: true; isReadonly: true }
+        Property { name: "states"; type: "QQuickState"; isList: true; isReadonly: true }
+        Property { name: "transitions"; type: "QQuickTransition"; isList: true; isReadonly: true }
+        Property { name: "state"; type: "string" }
+        Property { name: "childrenRect"; type: "QRectF"; isReadonly: true }
+        Property { name: "anchors"; type: "QQuickAnchors"; isReadonly: true; isPointer: true }
+        Property { name: "left"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "right"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "horizontalCenter"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "top"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "bottom"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "verticalCenter"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "baseline"; type: "QQuickAnchorLine"; isReadonly: true }
+        Property { name: "baselineOffset"; type: "double" }
+        Property { name: "clip"; type: "bool" }
+        Property { name: "focus"; type: "bool" }
+        Property { name: "activeFocus"; type: "bool"; isReadonly: true }
+        Property { name: "activeFocusOnTab"; revision: 1; type: "bool" }
+        Property { name: "rotation"; type: "double" }
+        Property { name: "scale"; type: "double" }
+        Property { name: "transformOrigin"; type: "TransformOrigin" }
+        Property { name: "transformOriginPoint"; type: "QPointF"; isReadonly: true }
+        Property { name: "transform"; type: "QQuickTransform"; isList: true; isReadonly: true }
+        Property { name: "smooth"; type: "bool" }
+        Property { name: "antialiasing"; type: "bool" }
+        Property { name: "implicitWidth"; type: "double" }
+        Property { name: "implicitHeight"; type: "double" }
+        Property { name: "containmentMask"; revision: 11; type: "QObject"; isPointer: true }
+        Property { name: "layer"; type: "QQuickItemLayer"; isReadonly: true; isPointer: true }
+        Signal {
+            name: "childrenRectChanged"
+            Parameter { type: "QRectF" }
+        }
+        Signal {
+            name: "baselineOffsetChanged"
+            Parameter { type: "double" }
+        }
+        Signal {
+            name: "stateChanged"
+            Parameter { type: "string" }
+        }
+        Signal {
+            name: "focusChanged"
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "activeFocusChanged"
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "activeFocusOnTabChanged"
+            revision: 1
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "parentChanged"
+            Parameter { type: "QQuickItem"; isPointer: true }
+        }
+        Signal {
+            name: "transformOriginChanged"
+            Parameter { type: "TransformOrigin" }
+        }
+        Signal {
+            name: "smoothChanged"
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "antialiasingChanged"
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "clipChanged"
+            Parameter { type: "bool" }
+        }
+        Signal {
+            name: "windowChanged"
+            revision: 1
+            Parameter { name: "window"; type: "QQuickWindow"; isPointer: true }
+        }
+        Signal { name: "containmentMaskChanged"; revision: 11 }
+        Method { name: "update" }
+        Method {
+            name: "grabToImage"
+            revision: 4
+            type: "bool"
+            Parameter { name: "callback"; type: "QJSValue" }
+            Parameter { name: "targetSize"; type: "QSize" }
+        }
+        Method {
+            name: "grabToImage"
+            revision: 4
+            type: "bool"
+            Parameter { name: "callback"; type: "QJSValue" }
+        }
+        Method {
+            name: "contains"
+            type: "bool"
+            Parameter { name: "point"; type: "QPointF" }
+        }
+        Method {
+            name: "mapFromItem"
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "mapToItem"
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "mapFromGlobal"
+            revision: 7
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "mapToGlobal"
+            revision: 7
+            Parameter { type: "QQmlV4Function"; isPointer: true }
+        }
+        Method { name: "forceActiveFocus" }
+        Method {
+            name: "forceActiveFocus"
+            Parameter { name: "reason"; type: "Qt::FocusReason" }
+        }
+        Method {
+            name: "nextItemInFocusChain"
+            revision: 1
+            type: "QQuickItem*"
+            Parameter { name: "forward"; type: "bool" }
+        }
+        Method { name: "nextItemInFocusChain"; revision: 1; type: "QQuickItem*" }
+        Method {
+            name: "childAt"
+            type: "QQuickItem*"
+            Parameter { name: "x"; type: "double" }
+            Parameter { name: "y"; type: "double" }
+        }
+    }
+    Component {
+        name: "QQuickItemDelegate"
+        defaultProperty: "data"
+        prototype: "QQuickAbstractButton"
+        exports: ["QtQuick.Templates/ItemDelegate 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "highlighted"; type: "bool" }
+    }
+    Component {
+        name: "QQuickLabel"
+        defaultProperty: "data"
+        prototype: "QQuickText"
+        exports: [
+            "QtQuick.Templates/Label 2.0",
+            "QtQuick.Templates/Label 2.3",
+            "QtQuick.Templates/Label 2.5"
+        ]
+        exportMetaObjectRevisions: [0, 3, 5]
+        Property { name: "font"; type: "QFont" }
+        Property { name: "background"; type: "QQuickItem"; isPointer: true }
+        Property { name: "palette"; revision: 3; type: "QPalette" }
+        Property { name: "implicitBackgroundWidth"; revision: 5; type: "double"; isReadonly: true }
+        Property { name: "implicitBackgroundHeight"; revision: 5; type: "double"; isReadonly: true }
+        Property { name: "topInset"; revision: 5; type: "double" }
+        Property { name: "leftInset"; revision: 5; type: "double" }
+        Property { name: "rightInset"; revision: 5; type: "double" }
+        Property { name: "bottomInset"; revision: 5; type: "double" }
+        Signal { name: "paletteChanged"; revision: 3 }
+        Signal { name: "implicitBackgroundWidthChanged"; revision: 5 }
+        Signal { name: "implicitBackgroundHeightChanged"; revision: 5 }
+        Signal { name: "topInsetChanged"; revision: 5 }
+        Signal { name: "leftInsetChanged"; revision: 5 }
+        Signal { name: "rightInsetChanged"; revision: 5 }
+        Signal { name: "bottomInsetChanged"; revision: 5 }
+    }
+    Component {
+        name: "QQuickMenu"
+        defaultProperty: "contentData"
+        prototype: "QQuickPopup"
+        exports: ["QtQuick.Templates/Menu 2.0", "QtQuick.Templates/Menu 2.3"]
+        exportMetaObjectRevisions: [0, 3]
+        Property { name: "contentModel"; type: "QVariant"; isReadonly: true }
+        Property { name: "contentData"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "title"; type: "string" }
+        Property { name: "count"; revision: 3; type: "int"; isReadonly: true }
+        Property { name: "cascade"; revision: 3; type: "bool" }
+        Property { name: "overlap"; revision: 3; type: "double" }
+        Property { name: "delegate"; revision: 3; type: "QQmlComponent"; isPointer: true }
+        Property { name: "currentIndex"; revision: 3; type: "int" }
+        Signal {
+            name: "titleChanged"
+            Parameter { name: "title"; type: "string" }
+        }
+        Signal { name: "countChanged"; revision: 3 }
+        Signal {
+            name: "cascadeChanged"
+            revision: 3
+            Parameter { name: "cascade"; type: "bool" }
+        }
+        Signal { name: "overlapChanged"; revision: 3 }
+        Signal { name: "delegateChanged"; revision: 3 }
+        Signal { name: "currentIndexChanged"; revision: 3 }
+        Method {
+            name: "itemAt"
+            type: "QQuickItem*"
+            Parameter { name: "index"; type: "int" }
+        }
+        Method {
+            name: "addItem"
+            Parameter { name: "item"; type: "QQuickItem"; isPointer: true }
+        }
+        Method {
+            name: "insertItem"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "item"; type: "QQuickItem"; isPointer: true }
+        }
+        Method {
+            name: "moveItem"
+            Parameter { name: "from"; type: "int" }
+            Parameter { name: "to"; type: "int" }
+        }
+        Method {
+            name: "removeItem"
+            Parameter { name: "item"; type: "QVariant" }
+        }
+        Method {
+            name: "takeItem"
+            revision: 3
+            type: "QQuickItem*"
+            Parameter { name: "index"; type: "int" }
+        }
+        Method {
+            name: "menuAt"
+            revision: 3
+            type: "QQuickMenu*"
+            Parameter { name: "index"; type: "int" }
+        }
+        Method {
+            name: "addMenu"
+            revision: 3
+            Parameter { name: "menu"; type: "QQuickMenu"; isPointer: true }
+        }
+        Method {
+            name: "insertMenu"
+            revision: 3
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "menu"; type: "QQuickMenu"; isPointer: true }
+        }
+        Method {
+            name: "removeMenu"
+            revision: 3
+            Parameter { name: "menu"; type: "QQuickMenu"; isPointer: true }
+        }
+        Method {
+            name: "takeMenu"
+            revision: 3
+            type: "QQuickMenu*"
+            Parameter { name: "index"; type: "int" }
+        }
+        Method {
+            name: "actionAt"
+            revision: 3
+            type: "QQuickAction*"
+            Parameter { name: "index"; type: "int" }
+        }
+        Method {
+            name: "addAction"
+            revision: 3
+            Parameter { name: "action"; type: "QQuickAction"; isPointer: true }
+        }
+        Method {
+            name: "insertAction"
+            revision: 3
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "action"; type: "QQuickAction"; isPointer: true }
+        }
+        Method {
+            name: "removeAction"
+            revision: 3
+            Parameter { name: "action"; type: "QQuickAction"; isPointer: true }
+        }
+        Method {
+            name: "takeAction"
+            revision: 3
+            type: "QQuickAction*"
+            Parameter { name: "index"; type: "int" }
+        }
+        Method {
+            name: "popup"
+            revision: 3
+            Parameter { name: "args"; type: "QQmlV4Function"; isPointer: true }
+        }
+        Method { name: "dismiss"; revision: 3 }
+    }
+    Component {
+        name: "QQuickMenuBar"
+        defaultProperty: "contentData"
+        prototype: "QQuickContainer"
+        exports: ["QtQuick.Templates/MenuBar 2.3"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "delegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "contentWidth"; type: "double" }
+        Property { name: "contentHeight"; type: "double" }
+        Property { name: "menus"; type: "QQuickMenu"; isList: true; isReadonly: true }
+        Property { name: "contentData"; type: "QObject"; isList: true; isReadonly: true }
+        Method {
+            name: "menuAt"
+            type: "QQuickMenu*"
+            Parameter { name: "index"; type: "int" }
+        }
+        Method {
+            name: "addMenu"
+            Parameter { name: "menu"; type: "QQuickMenu"; isPointer: true }
+        }
+        Method {
+            name: "insertMenu"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "menu"; type: "QQuickMenu"; isPointer: true }
+        }
+        Method {
+            name: "removeMenu"
+            Parameter { name: "menu"; type: "QQuickMenu"; isPointer: true }
+        }
+        Method {
+            name: "takeMenu"
+            type: "QQuickMenu*"
+            Parameter { name: "index"; type: "int" }
+        }
+    }
+    Component {
+        name: "QQuickMenuBarItem"
+        defaultProperty: "data"
+        prototype: "QQuickAbstractButton"
+        exports: ["QtQuick.Templates/MenuBarItem 2.3"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "menuBar"; type: "QQuickMenuBar"; isReadonly: true; isPointer: true }
+        Property { name: "menu"; type: "QQuickMenu"; isPointer: true }
+        Property { name: "highlighted"; type: "bool" }
+        Signal { name: "triggered" }
+    }
+    Component {
+        name: "QQuickMenuItem"
+        defaultProperty: "data"
+        prototype: "QQuickAbstractButton"
+        exports: [
+            "QtQuick.Templates/MenuItem 2.0",
+            "QtQuick.Templates/MenuItem 2.3"
+        ]
+        exportMetaObjectRevisions: [0, 3]
+        Property { name: "highlighted"; type: "bool" }
+        Property { name: "arrow"; revision: 3; type: "QQuickItem"; isPointer: true }
+        Property { name: "menu"; revision: 3; type: "QQuickMenu"; isReadonly: true; isPointer: true }
+        Property { name: "subMenu"; revision: 3; type: "QQuickMenu"; isReadonly: true; isPointer: true }
+        Signal { name: "triggered" }
+        Signal { name: "arrowChanged"; revision: 3 }
+        Signal { name: "menuChanged"; revision: 3 }
+        Signal { name: "subMenuChanged"; revision: 3 }
+    }
+    Component {
+        name: "QQuickMenuSeparator"
+        defaultProperty: "data"
+        prototype: "QQuickControl"
+        exports: ["QtQuick.Templates/MenuSeparator 2.1"]
+        exportMetaObjectRevisions: [0]
+    }
+    Component {
+        name: "QQuickOverlay"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        exports: ["QtQuick.Templates/Overlay 2.3"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        attachedType: "QQuickOverlayAttached"
+        Property { name: "modal"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "modeless"; type: "QQmlComponent"; isPointer: true }
+        Signal { name: "pressed" }
+        Signal { name: "released" }
+    }
+    Component {
+        name: "QQuickOverlayAttached"
+        prototype: "QObject"
+        Property { name: "overlay"; type: "QQuickOverlay"; isReadonly: true; isPointer: true }
+        Property { name: "modal"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "modeless"; type: "QQmlComponent"; isPointer: true }
+        Signal { name: "pressed" }
+        Signal { name: "released" }
+    }
+    Component {
+        name: "QQuickPage"
+        defaultProperty: "contentData"
+        prototype: "QQuickPane"
+        exports: [
+            "QtQuick.Templates/Page 2.0",
+            "QtQuick.Templates/Page 2.1",
+            "QtQuick.Templates/Page 2.5"
+        ]
+        exportMetaObjectRevisions: [0, 1, 5]
+        Property { name: "title"; type: "string" }
+        Property { name: "header"; type: "QQuickItem"; isPointer: true }
+        Property { name: "footer"; type: "QQuickItem"; isPointer: true }
+        Property { name: "contentWidth"; revision: 1; type: "double" }
+        Property { name: "contentHeight"; revision: 1; type: "double" }
+        Property { name: "implicitHeaderWidth"; revision: 5; type: "double"; isReadonly: true }
+        Property { name: "implicitHeaderHeight"; revision: 5; type: "double"; isReadonly: true }
+        Property { name: "implicitFooterWidth"; revision: 5; type: "double"; isReadonly: true }
+        Property { name: "implicitFooterHeight"; revision: 5; type: "double"; isReadonly: true }
+    }
+    Component {
+        name: "QQuickPageIndicator"
+        defaultProperty: "data"
+        prototype: "QQuickControl"
+        exports: ["QtQuick.Templates/PageIndicator 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "count"; type: "int" }
+        Property { name: "currentIndex"; type: "int" }
+        Property { name: "interactive"; type: "bool" }
+        Property { name: "delegate"; type: "QQmlComponent"; isPointer: true }
+    }
+    Component {
+        name: "QQuickPane"
+        defaultProperty: "contentData"
+        prototype: "QQuickControl"
+        exports: ["QtQuick.Templates/Pane 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "contentWidth"; type: "double" }
+        Property { name: "contentHeight"; type: "double" }
+        Property { name: "contentData"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "contentChildren"; type: "QQuickItem"; isList: true; isReadonly: true }
+    }
+    Component {
+        name: "QQuickPopup"
+        defaultProperty: "contentData"
+        prototype: "QObject"
+        exports: [
+            "QtQuick.Templates/Popup 2.0",
+            "QtQuick.Templates/Popup 2.1",
+            "QtQuick.Templates/Popup 2.3",
+            "QtQuick.Templates/Popup 2.5"
+        ]
+        exportMetaObjectRevisions: [0, 1, 3, 5]
+        Enum {
+            name: "ClosePolicy"
+            values: {
+                "NoAutoClose": 0,
+                "CloseOnPressOutside": 1,
+                "CloseOnPressOutsideParent": 2,
+                "CloseOnReleaseOutside": 4,
+                "CloseOnReleaseOutsideParent": 8,
+                "CloseOnEscape": 16
+            }
+        }
+        Enum {
+            name: "TransformOrigin"
+            values: {
+                "TopLeft": 0,
+                "Top": 1,
+                "TopRight": 2,
+                "Left": 3,
+                "Center": 4,
+                "Right": 5,
+                "BottomLeft": 6,
+                "Bottom": 7,
+                "BottomRight": 8
+            }
+        }
+        Property { name: "x"; type: "double" }
+        Property { name: "y"; type: "double" }
+        Property { name: "z"; type: "double" }
+        Property { name: "width"; type: "double" }
+        Property { name: "height"; type: "double" }
+        Property { name: "implicitWidth"; type: "double" }
+        Property { name: "implicitHeight"; type: "double" }
+        Property { name: "contentWidth"; type: "double" }
+        Property { name: "contentHeight"; type: "double" }
+        Property { name: "availableWidth"; type: "double"; isReadonly: true }
+        Property { name: "availableHeight"; type: "double"; isReadonly: true }
+        Property { name: "margins"; type: "double" }
+        Property { name: "topMargin"; type: "double" }
+        Property { name: "leftMargin"; type: "double" }
+        Property { name: "rightMargin"; type: "double" }
+        Property { name: "bottomMargin"; type: "double" }
+        Property { name: "padding"; type: "double" }
+        Property { name: "topPadding"; type: "double" }
+        Property { name: "leftPadding"; type: "double" }
+        Property { name: "rightPadding"; type: "double" }
+        Property { name: "bottomPadding"; type: "double" }
+        Property { name: "locale"; type: "QLocale" }
+        Property { name: "font"; type: "QFont" }
+        Property { name: "parent"; type: "QQuickItem"; isPointer: true }
+        Property { name: "background"; type: "QQuickItem"; isPointer: true }
+        Property { name: "contentItem"; type: "QQuickItem"; isPointer: true }
+        Property { name: "contentData"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "contentChildren"; type: "QQuickItem"; isList: true; isReadonly: true }
+        Property { name: "clip"; type: "bool" }
+        Property { name: "focus"; type: "bool" }
+        Property { name: "activeFocus"; type: "bool"; isReadonly: true }
+        Property { name: "modal"; type: "bool" }
+        Property { name: "dim"; type: "bool" }
+        Property { name: "visible"; type: "bool" }
+        Property { name: "opacity"; type: "double" }
+        Property { name: "scale"; type: "double" }
+        Property { name: "closePolicy"; type: "ClosePolicy" }
+        Property { name: "transformOrigin"; type: "TransformOrigin" }
+        Property { name: "enter"; type: "QQuickTransition"; isPointer: true }
+        Property { name: "exit"; type: "QQuickTransition"; isPointer: true }
+        Property { name: "spacing"; revision: 1; type: "double" }
+        Property { name: "opened"; revision: 3; type: "bool"; isReadonly: true }
+        Property { name: "mirrored"; revision: 3; type: "bool"; isReadonly: true }
+        Property { name: "enabled"; revision: 3; type: "bool" }
+        Property { name: "palette"; revision: 3; type: "QPalette" }
+        Property { name: "horizontalPadding"; type: "double" }
+        Property { name: "verticalPadding"; type: "double" }
+        Property {
+            name: "anchors"
+            revision: 5
+            type: "QQuickPopupAnchors"
+            isReadonly: true
+            isPointer: true
+        }
+        Property { name: "implicitContentWidth"; revision: 5; type: "double"; isReadonly: true }
+        Property { name: "implicitContentHeight"; revision: 5; type: "double"; isReadonly: true }
+        Property { name: "implicitBackgroundWidth"; revision: 5; type: "double"; isReadonly: true }
+        Property { name: "implicitBackgroundHeight"; revision: 5; type: "double"; isReadonly: true }
+        Property { name: "topInset"; revision: 5; type: "double" }
+        Property { name: "leftInset"; revision: 5; type: "double" }
+        Property { name: "rightInset"; revision: 5; type: "double" }
+        Property { name: "bottomInset"; revision: 5; type: "double" }
+        Signal { name: "opened" }
+        Signal { name: "closed" }
+        Signal { name: "aboutToShow" }
+        Signal { name: "aboutToHide" }
+        Signal {
+            name: "windowChanged"
+            Parameter { name: "window"; type: "QQuickWindow"; isPointer: true }
+        }
+        Signal { name: "spacingChanged"; revision: 1 }
+        Signal { name: "openedChanged"; revision: 3 }
+        Signal { name: "mirroredChanged"; revision: 3 }
+        Signal { name: "enabledChanged"; revision: 3 }
+        Signal { name: "paletteChanged"; revision: 3 }
+        Signal { name: "horizontalPaddingChanged"; revision: 5 }
+        Signal { name: "verticalPaddingChanged"; revision: 5 }
+        Signal { name: "implicitContentWidthChanged"; revision: 5 }
+        Signal { name: "implicitContentHeightChanged"; revision: 5 }
+        Signal { name: "implicitBackgroundWidthChanged"; revision: 5 }
+        Signal { name: "implicitBackgroundHeightChanged"; revision: 5 }
+        Signal { name: "topInsetChanged"; revision: 5 }
+        Signal { name: "leftInsetChanged"; revision: 5 }
+        Signal { name: "rightInsetChanged"; revision: 5 }
+        Signal { name: "bottomInsetChanged"; revision: 5 }
+        Method { name: "open" }
+        Method { name: "close" }
+        Method {
+            name: "forceActiveFocus"
+            Parameter { name: "reason"; type: "Qt::FocusReason" }
+        }
+        Method { name: "forceActiveFocus" }
+    }
+    Component {
+        name: "QQuickPopupAnchors"
+        prototype: "QObject"
+        Property { name: "centerIn"; type: "QQuickItem"; isPointer: true }
+    }
+    Component {
+        name: "QQuickProgressBar"
+        defaultProperty: "data"
+        prototype: "QQuickControl"
+        exports: ["QtQuick.Templates/ProgressBar 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "from"; type: "double" }
+        Property { name: "to"; type: "double" }
+        Property { name: "value"; type: "double" }
+        Property { name: "position"; type: "double"; isReadonly: true }
+        Property { name: "visualPosition"; type: "double"; isReadonly: true }
+        Property { name: "indeterminate"; type: "bool" }
+    }
+    Component {
+        name: "QQuickRadioButton"
+        defaultProperty: "data"
+        prototype: "QQuickAbstractButton"
+        exports: ["QtQuick.Templates/RadioButton 2.0"]
+        exportMetaObjectRevisions: [0]
+    }
+    Component {
+        name: "QQuickRadioDelegate"
+        defaultProperty: "data"
+        prototype: "QQuickItemDelegate"
+        exports: ["QtQuick.Templates/RadioDelegate 2.0"]
+        exportMetaObjectRevisions: [0]
+    }
+    Component {
+        name: "QQuickRangeSlider"
+        defaultProperty: "data"
+        prototype: "QQuickControl"
+        exports: [
+            "QtQuick.Templates/RangeSlider 2.0",
+            "QtQuick.Templates/RangeSlider 2.1",
+            "QtQuick.Templates/RangeSlider 2.2",
+            "QtQuick.Templates/RangeSlider 2.3",
+            "QtQuick.Templates/RangeSlider 2.5"
+        ]
+        exportMetaObjectRevisions: [0, 1, 2, 3, 5]
+        Enum {
+            name: "SnapMode"
+            values: {
+                "NoSnap": 0,
+                "SnapAlways": 1,
+                "SnapOnRelease": 2
+            }
+        }
+        Property { name: "from"; type: "double" }
+        Property { name: "to"; type: "double" }
+        Property { name: "first"; type: "QQuickRangeSliderNode"; isReadonly: true; isPointer: true }
+        Property { name: "second"; type: "QQuickRangeSliderNode"; isReadonly: true; isPointer: true }
+        Property { name: "stepSize"; type: "double" }
+        Property { name: "snapMode"; type: "SnapMode" }
+        Property { name: "orientation"; type: "Qt::Orientation" }
+        Property { name: "live"; revision: 2; type: "bool" }
+        Property { name: "horizontal"; revision: 3; type: "bool"; isReadonly: true }
+        Property { name: "vertical"; revision: 3; type: "bool"; isReadonly: true }
+        Property { name: "touchDragThreshold"; revision: 5; type: "double" }
+        Signal { name: "liveChanged"; revision: 2 }
+        Signal { name: "touchDragThresholdChanged"; revision: 5 }
+        Method {
+            name: "setValues"
+            Parameter { name: "firstValue"; type: "double" }
+            Parameter { name: "secondValue"; type: "double" }
+        }
+        Method {
+            name: "valueAt"
+            revision: 5
+            type: "double"
+            Parameter { name: "position"; type: "double" }
+        }
+    }
+    Component {
+        name: "QQuickRangeSliderNode"
+        prototype: "QObject"
+        Property { name: "value"; type: "double" }
+        Property { name: "position"; type: "double"; isReadonly: true }
+        Property { name: "visualPosition"; type: "double"; isReadonly: true }
+        Property { name: "handle"; type: "QQuickItem"; isPointer: true }
+        Property { name: "pressed"; type: "bool" }
+        Property { name: "hovered"; revision: 1; type: "bool" }
+        Property { name: "implicitHandleWidth"; revision: 5; type: "double"; isReadonly: true }
+        Property { name: "implicitHandleHeight"; revision: 5; type: "double"; isReadonly: true }
+        Signal { name: "hoveredChanged"; revision: 1 }
+        Signal { name: "moved" }
+        Method { name: "increase" }
+        Method { name: "decrease" }
+    }
+    Component {
+        name: "QQuickRoundButton"
+        defaultProperty: "data"
+        prototype: "QQuickButton"
+        exports: ["QtQuick.Templates/RoundButton 2.1"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "radius"; type: "double" }
+    }
+    Component {
+        name: "QQuickScrollBar"
+        defaultProperty: "data"
+        prototype: "QQuickControl"
+        exports: [
+            "QtQuick.Templates/ScrollBar 2.0",
+            "QtQuick.Templates/ScrollBar 2.2",
+            "QtQuick.Templates/ScrollBar 2.3",
+            "QtQuick.Templates/ScrollBar 2.4"
+        ]
+        exportMetaObjectRevisions: [0, 2, 3, 4]
+        attachedType: "QQuickScrollBarAttached"
+        Enum {
+            name: "SnapMode"
+            values: {
+                "NoSnap": 0,
+                "SnapAlways": 1,
+                "SnapOnRelease": 2
+            }
+        }
+        Enum {
+            name: "Policy"
+            values: {
+                "AsNeeded": 0,
+                "AlwaysOff": 1,
+                "AlwaysOn": 2
+            }
+        }
+        Property { name: "size"; type: "double" }
+        Property { name: "position"; type: "double" }
+        Property { name: "stepSize"; type: "double" }
+        Property { name: "active"; type: "bool" }
+        Property { name: "pressed"; type: "bool" }
+        Property { name: "orientation"; type: "Qt::Orientation" }
+        Property { name: "snapMode"; revision: 2; type: "SnapMode" }
+        Property { name: "interactive"; revision: 2; type: "bool" }
+        Property { name: "policy"; revision: 2; type: "Policy" }
+        Property { name: "horizontal"; revision: 3; type: "bool"; isReadonly: true }
+        Property { name: "vertical"; revision: 3; type: "bool"; isReadonly: true }
+        Property { name: "minimumSize"; revision: 4; type: "double" }
+        Property { name: "visualSize"; revision: 4; type: "double"; isReadonly: true }
+        Property { name: "visualPosition"; revision: 4; type: "double"; isReadonly: true }
+        Signal { name: "snapModeChanged"; revision: 2 }
+        Signal { name: "interactiveChanged"; revision: 2 }
+        Signal { name: "policyChanged"; revision: 2 }
+        Signal { name: "minimumSizeChanged"; revision: 4 }
+        Signal { name: "visualSizeChanged"; revision: 4 }
+        Signal { name: "visualPositionChanged"; revision: 4 }
+        Method { name: "increase" }
+        Method { name: "decrease" }
+        Method {
+            name: "setSize"
+            Parameter { name: "size"; type: "double" }
+        }
+        Method {
+            name: "setPosition"
+            Parameter { name: "position"; type: "double" }
+        }
+    }
+    Component {
+        name: "QQuickScrollBarAttached"
+        prototype: "QObject"
+        Property { name: "horizontal"; type: "QQuickScrollBar"; isPointer: true }
+        Property { name: "vertical"; type: "QQuickScrollBar"; isPointer: true }
+    }
+    Component {
+        name: "QQuickScrollIndicator"
+        defaultProperty: "data"
+        prototype: "QQuickControl"
+        exports: [
+            "QtQuick.Templates/ScrollIndicator 2.0",
+            "QtQuick.Templates/ScrollIndicator 2.3",
+            "QtQuick.Templates/ScrollIndicator 2.4"
+        ]
+        exportMetaObjectRevisions: [0, 3, 4]
+        attachedType: "QQuickScrollIndicatorAttached"
+        Property { name: "size"; type: "double" }
+        Property { name: "position"; type: "double" }
+        Property { name: "active"; type: "bool" }
+        Property { name: "orientation"; type: "Qt::Orientation" }
+        Property { name: "horizontal"; revision: 3; type: "bool"; isReadonly: true }
+        Property { name: "vertical"; revision: 3; type: "bool"; isReadonly: true }
+        Property { name: "minimumSize"; revision: 4; type: "double" }
+        Property { name: "visualSize"; revision: 4; type: "double"; isReadonly: true }
+        Property { name: "visualPosition"; revision: 4; type: "double"; isReadonly: true }
+        Signal { name: "minimumSizeChanged"; revision: 4 }
+        Signal { name: "visualSizeChanged"; revision: 4 }
+        Signal { name: "visualPositionChanged"; revision: 4 }
+        Method {
+            name: "setSize"
+            Parameter { name: "size"; type: "double" }
+        }
+        Method {
+            name: "setPosition"
+            Parameter { name: "position"; type: "double" }
+        }
+    }
+    Component {
+        name: "QQuickScrollIndicatorAttached"
+        prototype: "QObject"
+        Property { name: "horizontal"; type: "QQuickScrollIndicator"; isPointer: true }
+        Property { name: "vertical"; type: "QQuickScrollIndicator"; isPointer: true }
+    }
+    Component {
+        name: "QQuickScrollView"
+        defaultProperty: "contentData"
+        prototype: "QQuickPane"
+        exports: ["QtQuick.Templates/ScrollView 2.2"]
+        exportMetaObjectRevisions: [0]
+    }
+    Component {
+        name: "QQuickSlider"
+        defaultProperty: "data"
+        prototype: "QQuickControl"
+        exports: [
+            "QtQuick.Templates/Slider 2.0",
+            "QtQuick.Templates/Slider 2.1",
+            "QtQuick.Templates/Slider 2.2",
+            "QtQuick.Templates/Slider 2.3",
+            "QtQuick.Templates/Slider 2.5"
+        ]
+        exportMetaObjectRevisions: [0, 1, 2, 3, 5]
+        Enum {
+            name: "SnapMode"
+            values: {
+                "NoSnap": 0,
+                "SnapAlways": 1,
+                "SnapOnRelease": 2
+            }
+        }
+        Property { name: "from"; type: "double" }
+        Property { name: "to"; type: "double" }
+        Property { name: "value"; type: "double" }
+        Property { name: "position"; type: "double"; isReadonly: true }
+        Property { name: "visualPosition"; type: "double"; isReadonly: true }
+        Property { name: "stepSize"; type: "double" }
+        Property { name: "snapMode"; type: "SnapMode" }
+        Property { name: "pressed"; type: "bool" }
+        Property { name: "orientation"; type: "Qt::Orientation" }
+        Property { name: "handle"; type: "QQuickItem"; isPointer: true }
+        Property { name: "live"; revision: 2; type: "bool" }
+        Property { name: "horizontal"; revision: 3; type: "bool"; isReadonly: true }
+        Property { name: "vertical"; revision: 3; type: "bool"; isReadonly: true }
+        Property { name: "touchDragThreshold"; revision: 5; type: "double" }
+        Property { name: "implicitHandleWidth"; revision: 5; type: "double"; isReadonly: true }
+        Property { name: "implicitHandleHeight"; revision: 5; type: "double"; isReadonly: true }
+        Signal { name: "moved"; revision: 2 }
+        Signal { name: "liveChanged"; revision: 2 }
+        Signal { name: "touchDragThresholdChanged"; revision: 5 }
+        Signal { name: "implicitHandleWidthChanged"; revision: 5 }
+        Signal { name: "implicitHandleHeightChanged"; revision: 5 }
+        Method { name: "increase" }
+        Method { name: "decrease" }
+        Method {
+            name: "valueAt"
+            revision: 1
+            type: "double"
+            Parameter { name: "position"; type: "double" }
+        }
+    }
+    Component {
+        name: "QQuickSpinBox"
+        defaultProperty: "data"
+        prototype: "QQuickControl"
+        exports: [
+            "QtQuick.Templates/SpinBox 2.0",
+            "QtQuick.Templates/SpinBox 2.1",
+            "QtQuick.Templates/SpinBox 2.2",
+            "QtQuick.Templates/SpinBox 2.3",
+            "QtQuick.Templates/SpinBox 2.4",
+            "QtQuick.Templates/SpinBox 2.5"
+        ]
+        exportMetaObjectRevisions: [0, 1, 2, 3, 4, 5]
+        Property { name: "from"; type: "int" }
+        Property { name: "to"; type: "int" }
+        Property { name: "value"; type: "int" }
+        Property { name: "stepSize"; type: "int" }
+        Property { name: "editable"; type: "bool" }
+        Property { name: "validator"; type: "QValidator"; isPointer: true }
+        Property { name: "textFromValue"; type: "QJSValue" }
+        Property { name: "valueFromText"; type: "QJSValue" }
+        Property { name: "up"; type: "QQuickSpinButton"; isReadonly: true; isPointer: true }
+        Property { name: "down"; type: "QQuickSpinButton"; isReadonly: true; isPointer: true }
+        Property { name: "inputMethodHints"; revision: 2; type: "Qt::InputMethodHints" }
+        Property { name: "inputMethodComposing"; revision: 2; type: "bool"; isReadonly: true }
+        Property { name: "wrap"; revision: 3; type: "bool" }
+        Property { name: "displayText"; revision: 4; type: "string"; isReadonly: true }
+        Signal { name: "valueModified"; revision: 2 }
+        Signal { name: "inputMethodHintsChanged"; revision: 2 }
+        Signal { name: "inputMethodComposingChanged"; revision: 2 }
+        Signal { name: "wrapChanged"; revision: 3 }
+        Signal { name: "displayTextChanged"; revision: 4 }
+        Method { name: "increase" }
+        Method { name: "decrease" }
+    }
+    Component {
+        name: "QQuickSpinButton"
+        prototype: "QObject"
+        Property { name: "pressed"; type: "bool" }
+        Property { name: "indicator"; type: "QQuickItem"; isPointer: true }
+        Property { name: "hovered"; revision: 1; type: "bool" }
+        Property { name: "implicitIndicatorWidth"; revision: 5; type: "double"; isReadonly: true }
+        Property { name: "implicitIndicatorHeight"; revision: 5; type: "double"; isReadonly: true }
+        Signal { name: "hoveredChanged"; revision: 1 }
+        Signal { name: "implicitIndicatorWidthChanged"; revision: 5 }
+        Signal { name: "implicitIndicatorHeightChanged"; revision: 5 }
+    }
+    Component {
+        name: "QQuickSplitHandleAttached"
+        prototype: "QObject"
+        exports: ["QtQuick.Templates/SplitHandle 2.13"]
+        isCreatable: false
+        exportMetaObjectRevisions: [0]
+        Property { name: "hovered"; type: "bool"; isReadonly: true }
+        Property { name: "pressed"; type: "bool"; isReadonly: true }
+    }
+    Component {
+        name: "QQuickSplitView"
+        defaultProperty: "contentData"
+        prototype: "QQuickContainer"
+        exports: ["QtQuick.Templates/SplitView 2.13"]
+        exportMetaObjectRevisions: [0]
+        attachedType: "QQuickSplitViewAttached"
+        Property { name: "orientation"; type: "Qt::Orientation" }
+        Property { name: "resizing"; type: "bool"; isReadonly: true }
+        Property { name: "handle"; type: "QQmlComponent"; isPointer: true }
+        Method { name: "saveState"; type: "QVariant" }
+        Method {
+            name: "restoreState"
+            type: "bool"
+            Parameter { name: "state"; type: "QVariant" }
+        }
+    }
+    Component {
+        name: "QQuickSplitViewAttached"
+        prototype: "QObject"
+        Property { name: "view"; type: "QQuickSplitView"; isReadonly: true; isPointer: true }
+        Property { name: "minimumWidth"; type: "double" }
+        Property { name: "minimumHeight"; type: "double" }
+        Property { name: "preferredWidth"; type: "double" }
+        Property { name: "preferredHeight"; type: "double" }
+        Property { name: "maximumWidth"; type: "double" }
+        Property { name: "maximumHeight"; type: "double" }
+        Property { name: "fillHeight"; type: "bool" }
+        Property { name: "fillWidth"; type: "bool" }
+    }
+    Component {
+        name: "QQuickStackView"
+        defaultProperty: "data"
+        prototype: "QQuickControl"
+        exports: [
+            "QtQuick.Templates/StackView 2.0",
+            "QtQuick.Templates/StackView 2.1"
+        ]
+        exportMetaObjectRevisions: [0, 1]
+        attachedType: "QQuickStackViewAttached"
+        Enum {
+            name: "Status"
+            values: {
+                "Inactive": 0,
+                "Deactivating": 1,
+                "Activating": 2,
+                "Active": 3
+            }
+        }
+        Enum {
+            name: "LoadBehavior"
+            values: {
+                "DontLoad": 0,
+                "ForceLoad": 1
+            }
+        }
+        Enum {
+            name: "Operation"
+            values: {
+                "Transition": -1,
+                "Immediate": 0,
+                "PushTransition": 1,
+                "ReplaceTransition": 2,
+                "PopTransition": 3
+            }
+        }
+        Property { name: "busy"; type: "bool"; isReadonly: true }
+        Property { name: "depth"; type: "int"; isReadonly: true }
+        Property { name: "currentItem"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property { name: "initialItem"; type: "QJSValue" }
+        Property { name: "popEnter"; type: "QQuickTransition"; isPointer: true }
+        Property { name: "popExit"; type: "QQuickTransition"; isPointer: true }
+        Property { name: "pushEnter"; type: "QQuickTransition"; isPointer: true }
+        Property { name: "pushExit"; type: "QQuickTransition"; isPointer: true }
+        Property { name: "replaceEnter"; type: "QQuickTransition"; isPointer: true }
+        Property { name: "replaceExit"; type: "QQuickTransition"; isPointer: true }
+        Property { name: "empty"; revision: 3; type: "bool"; isReadonly: true }
+        Signal { name: "emptyChanged"; revision: 3 }
+        Method {
+            name: "clear"
+            Parameter { name: "operation"; type: "Operation" }
+        }
+        Method { name: "clear" }
+        Method {
+            name: "get"
+            type: "QQuickItem*"
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "behavior"; type: "LoadBehavior" }
+        }
+        Method {
+            name: "get"
+            type: "QQuickItem*"
+            Parameter { name: "index"; type: "int" }
+        }
+        Method {
+            name: "find"
+            type: "QQuickItem*"
+            Parameter { name: "callback"; type: "QJSValue" }
+            Parameter { name: "behavior"; type: "LoadBehavior" }
+        }
+        Method {
+            name: "find"
+            type: "QQuickItem*"
+            Parameter { name: "callback"; type: "QJSValue" }
+        }
+        Method {
+            name: "push"
+            Parameter { name: "args"; type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "pop"
+            Parameter { name: "args"; type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "replace"
+            Parameter { name: "args"; type: "QQmlV4Function"; isPointer: true }
+        }
+    }
+    Component {
+        name: "QQuickStackViewAttached"
+        prototype: "QObject"
+        Property { name: "index"; type: "int"; isReadonly: true }
+        Property { name: "view"; type: "QQuickStackView"; isReadonly: true; isPointer: true }
+        Property { name: "status"; type: "QQuickStackView::Status"; isReadonly: true }
+        Property { name: "visible"; type: "bool" }
+        Signal { name: "activated" }
+        Signal { name: "activating" }
+        Signal { name: "deactivated" }
+        Signal { name: "deactivating" }
+        Signal { name: "removed" }
+    }
+    Component {
+        name: "QQuickSwipe"
+        prototype: "QObject"
+        Property { name: "position"; type: "double" }
+        Property { name: "complete"; type: "bool"; isReadonly: true }
+        Property { name: "left"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "behind"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "right"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "leftItem"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property { name: "behindItem"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property { name: "rightItem"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property { name: "enabled"; type: "bool" }
+        Property { name: "transition"; type: "QQuickTransition"; isPointer: true }
+        Signal { name: "completed" }
+        Signal { name: "opened" }
+        Signal { name: "closed" }
+        Method { name: "close"; revision: 1 }
+        Method {
+            name: "open"
+            revision: 2
+            Parameter { name: "side"; type: "QQuickSwipeDelegate::Side" }
+        }
+    }
+    Component {
+        name: "QQuickSwipeDelegate"
+        defaultProperty: "data"
+        prototype: "QQuickItemDelegate"
+        exports: [
+            "QtQuick.Templates/SwipeDelegate 2.0",
+            "QtQuick.Templates/SwipeDelegate 2.1",
+            "QtQuick.Templates/SwipeDelegate 2.2"
+        ]
+        exportMetaObjectRevisions: [0, 1, 2]
+        attachedType: "QQuickSwipeDelegateAttached"
+        Enum {
+            name: "Side"
+            values: {
+                "Left": 1,
+                "Right": -1
+            }
+        }
+        Property { name: "swipe"; type: "QQuickSwipe"; isReadonly: true; isPointer: true }
+    }
+    Component {
+        name: "QQuickSwipeDelegateAttached"
+        prototype: "QObject"
+        Property { name: "pressed"; type: "bool"; isReadonly: true }
+        Signal { name: "clicked" }
+    }
+    Component {
+        name: "QQuickSwipeView"
+        defaultProperty: "contentData"
+        prototype: "QQuickContainer"
+        exports: [
+            "QtQuick.Templates/SwipeView 2.0",
+            "QtQuick.Templates/SwipeView 2.1",
+            "QtQuick.Templates/SwipeView 2.2"
+        ]
+        exportMetaObjectRevisions: [0, 1, 2]
+        attachedType: "QQuickSwipeViewAttached"
+        Property { name: "interactive"; revision: 1; type: "bool" }
+        Property { name: "orientation"; revision: 2; type: "Qt::Orientation" }
+        Property { name: "horizontal"; revision: 3; type: "bool"; isReadonly: true }
+        Property { name: "vertical"; revision: 3; type: "bool"; isReadonly: true }
+        Signal { name: "interactiveChanged"; revision: 1 }
+        Signal { name: "orientationChanged"; revision: 2 }
+    }
+    Component {
+        name: "QQuickSwipeViewAttached"
+        prototype: "QObject"
+        Property { name: "index"; type: "int"; isReadonly: true }
+        Property { name: "isCurrentItem"; type: "bool"; isReadonly: true }
+        Property { name: "view"; type: "QQuickSwipeView"; isReadonly: true; isPointer: true }
+        Property { name: "isNextItem"; revision: 1; type: "bool"; isReadonly: true }
+        Property { name: "isPreviousItem"; revision: 1; type: "bool"; isReadonly: true }
+    }
+    Component {
+        name: "QQuickSwitch"
+        defaultProperty: "data"
+        prototype: "QQuickAbstractButton"
+        exports: ["QtQuick.Templates/Switch 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "position"; type: "double" }
+        Property { name: "visualPosition"; type: "double"; isReadonly: true }
+    }
+    Component {
+        name: "QQuickSwitchDelegate"
+        defaultProperty: "data"
+        prototype: "QQuickItemDelegate"
+        exports: ["QtQuick.Templates/SwitchDelegate 2.0"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "position"; type: "double" }
+        Property { name: "visualPosition"; type: "double"; isReadonly: true }
+    }
+    Component {
+        name: "QQuickTabBar"
+        defaultProperty: "contentData"
+        prototype: "QQuickContainer"
+        exports: [
+            "QtQuick.Templates/TabBar 2.0",
+            "QtQuick.Templates/TabBar 2.2"
+        ]
+        exportMetaObjectRevisions: [0, 2]
+        attachedType: "QQuickTabBarAttached"
+        Enum {
+            name: "Position"
+            values: {
+                "Header": 0,
+                "Footer": 1
+            }
+        }
+        Property { name: "position"; type: "Position" }
+        Property { name: "contentWidth"; revision: 2; type: "double" }
+        Property { name: "contentHeight"; revision: 2; type: "double" }
+    }
+    Component {
+        name: "QQuickTabBarAttached"
+        prototype: "QObject"
+        Property { name: "index"; type: "int"; isReadonly: true }
+        Property { name: "tabBar"; type: "QQuickTabBar"; isReadonly: true; isPointer: true }
+        Property { name: "position"; type: "QQuickTabBar::Position"; isReadonly: true }
+    }
+    Component {
+        name: "QQuickTabButton"
+        defaultProperty: "data"
+        prototype: "QQuickAbstractButton"
+        exports: ["QtQuick.Templates/TabButton 2.0"]
+        exportMetaObjectRevisions: [0]
+    }
+    Component {
+        name: "QQuickTableView"
+        defaultProperty: "flickableData"
+        prototype: "QQuickFlickable"
+        exports: ["QtQuick.Templates/__TableView__ 2.15"]
+        exportMetaObjectRevisions: [15]
+        attachedType: "QQuickTableViewAttached"
+        Property { name: "rows"; type: "int"; isReadonly: true }
+        Property { name: "columns"; type: "int"; isReadonly: true }
+        Property { name: "rowSpacing"; type: "double" }
+        Property { name: "columnSpacing"; type: "double" }
+        Property { name: "rowHeightProvider"; type: "QJSValue" }
+        Property { name: "columnWidthProvider"; type: "QJSValue" }
+        Property { name: "model"; type: "QVariant" }
+        Property { name: "delegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "reuseItems"; type: "bool" }
+        Property { name: "contentWidth"; type: "double" }
+        Property { name: "contentHeight"; type: "double" }
+        Property { name: "syncView"; revision: 14; type: "QQuickTableView"; isPointer: true }
+        Property { name: "syncDirection"; revision: 14; type: "Qt::Orientations" }
+        Signal { name: "syncViewChanged"; revision: 14 }
+        Signal { name: "syncDirectionChanged"; revision: 14 }
+        Method { name: "forceLayout" }
+    }
+    Component {
+        name: "QQuickTableViewAttached"
+        prototype: "QObject"
+        Property { name: "view"; type: "QQuickTableView"; isReadonly: true; isPointer: true }
+        Signal { name: "pooled" }
+        Signal { name: "reused" }
+    }
+    Component {
+        name: "QQuickText"
+        defaultProperty: "data"
+        prototype: "QQuickImplicitSizeItem"
+        Enum {
+            name: "HAlignment"
+            values: {
+                "AlignLeft": 1,
+                "AlignRight": 2,
+                "AlignHCenter": 4,
+                "AlignJustify": 8
+            }
+        }
+        Enum {
+            name: "VAlignment"
+            values: {
+                "AlignTop": 32,
+                "AlignBottom": 64,
+                "AlignVCenter": 128
+            }
+        }
+        Enum {
+            name: "TextStyle"
+            values: {
+                "Normal": 0,
+                "Outline": 1,
+                "Raised": 2,
+                "Sunken": 3
+            }
+        }
+        Enum {
+            name: "TextFormat"
+            values: {
+                "PlainText": 0,
+                "RichText": 1,
+                "MarkdownText": 3,
+                "AutoText": 2,
+                "StyledText": 4
+            }
+        }
+        Enum {
+            name: "TextElideMode"
+            values: {
+                "ElideLeft": 0,
+                "ElideRight": 1,
+                "ElideMiddle": 2,
+                "ElideNone": 3
+            }
+        }
+        Enum {
+            name: "WrapMode"
+            values: {
+                "NoWrap": 0,
+                "WordWrap": 1,
+                "WrapAnywhere": 3,
+                "WrapAtWordBoundaryOrAnywhere": 4,
+                "Wrap": 4
+            }
+        }
+        Enum {
+            name: "RenderType"
+            values: {
+                "QtRendering": 0,
+                "NativeRendering": 1
+            }
+        }
+        Enum {
+            name: "LineHeightMode"
+            values: {
+                "ProportionalHeight": 0,
+                "FixedHeight": 1
+            }
+        }
+        Enum {
+            name: "FontSizeMode"
+            values: {
+                "FixedSize": 0,
+                "HorizontalFit": 1,
+                "VerticalFit": 2,
+                "Fit": 3
+            }
+        }
+        Property { name: "text"; type: "string" }
+        Property { name: "font"; type: "QFont" }
+        Property { name: "color"; type: "QColor" }
+        Property { name: "linkColor"; type: "QColor" }
+        Property { name: "style"; type: "TextStyle" }
+        Property { name: "styleColor"; type: "QColor" }
+        Property { name: "horizontalAlignment"; type: "HAlignment" }
+        Property { name: "effectiveHorizontalAlignment"; type: "HAlignment"; isReadonly: true }
+        Property { name: "verticalAlignment"; type: "VAlignment" }
+        Property { name: "wrapMode"; type: "WrapMode" }
+        Property { name: "lineCount"; type: "int"; isReadonly: true }
+        Property { name: "truncated"; type: "bool"; isReadonly: true }
+        Property { name: "maximumLineCount"; type: "int" }
+        Property { name: "textFormat"; type: "TextFormat" }
+        Property { name: "elide"; type: "TextElideMode" }
+        Property { name: "contentWidth"; type: "double"; isReadonly: true }
+        Property { name: "contentHeight"; type: "double"; isReadonly: true }
+        Property { name: "paintedWidth"; type: "double"; isReadonly: true }
+        Property { name: "paintedHeight"; type: "double"; isReadonly: true }
+        Property { name: "lineHeight"; type: "double" }
+        Property { name: "lineHeightMode"; type: "LineHeightMode" }
+        Property { name: "baseUrl"; type: "QUrl" }
+        Property { name: "minimumPixelSize"; type: "int" }
+        Property { name: "minimumPointSize"; type: "int" }
+        Property { name: "fontSizeMode"; type: "FontSizeMode" }
+        Property { name: "renderType"; type: "RenderType" }
+        Property { name: "hoveredLink"; revision: 2; type: "string"; isReadonly: true }
+        Property { name: "padding"; revision: 6; type: "double" }
+        Property { name: "topPadding"; revision: 6; type: "double" }
+        Property { name: "leftPadding"; revision: 6; type: "double" }
+        Property { name: "rightPadding"; revision: 6; type: "double" }
+        Property { name: "bottomPadding"; revision: 6; type: "double" }
+        Property { name: "fontInfo"; revision: 9; type: "QJSValue"; isReadonly: true }
+        Property { name: "advance"; revision: 10; type: "QSizeF"; isReadonly: true }
+        Signal {
+            name: "textChanged"
+            Parameter { name: "text"; type: "string" }
+        }
+        Signal {
+            name: "linkActivated"
+            Parameter { name: "link"; type: "string" }
+        }
+        Signal {
+            name: "linkHovered"
+            revision: 2
+            Parameter { name: "link"; type: "string" }
+        }
+        Signal {
+            name: "fontChanged"
+            Parameter { name: "font"; type: "QFont" }
+        }
+        Signal {
+            name: "styleChanged"
+            Parameter { name: "style"; type: "QQuickText::TextStyle" }
+        }
+        Signal {
+            name: "horizontalAlignmentChanged"
+            Parameter { name: "alignment"; type: "QQuickText::HAlignment" }
+        }
+        Signal {
+            name: "verticalAlignmentChanged"
+            Parameter { name: "alignment"; type: "QQuickText::VAlignment" }
+        }
+        Signal {
+            name: "textFormatChanged"
+            Parameter { name: "textFormat"; type: "QQuickText::TextFormat" }
+        }
+        Signal {
+            name: "elideModeChanged"
+            Parameter { name: "mode"; type: "QQuickText::TextElideMode" }
+        }
+        Signal { name: "contentSizeChanged" }
+        Signal {
+            name: "contentWidthChanged"
+            Parameter { name: "contentWidth"; type: "double" }
+        }
+        Signal {
+            name: "contentHeightChanged"
+            Parameter { name: "contentHeight"; type: "double" }
+        }
+        Signal {
+            name: "lineHeightChanged"
+            Parameter { name: "lineHeight"; type: "double" }
+        }
+        Signal {
+            name: "lineHeightModeChanged"
+            Parameter { name: "mode"; type: "LineHeightMode" }
+        }
+        Signal {
+            name: "lineLaidOut"
+            Parameter { name: "line"; type: "QQuickTextLine"; isPointer: true }
+        }
+        Signal { name: "paddingChanged"; revision: 6 }
+        Signal { name: "topPaddingChanged"; revision: 6 }
+        Signal { name: "leftPaddingChanged"; revision: 6 }
+        Signal { name: "rightPaddingChanged"; revision: 6 }
+        Signal { name: "bottomPaddingChanged"; revision: 6 }
+        Signal { name: "fontInfoChanged"; revision: 9 }
+        Method { name: "doLayout" }
+        Method { name: "forceLayout"; revision: 9 }
+        Method {
+            name: "linkAt"
+            revision: 3
+            type: "string"
+            Parameter { name: "x"; type: "double" }
+            Parameter { name: "y"; type: "double" }
+        }
+    }
+    Component {
+        name: "QQuickTextArea"
+        defaultProperty: "data"
+        prototype: "QQuickTextEdit"
+        exports: [
+            "QtQuick.Templates/TextArea 2.0",
+            "QtQuick.Templates/TextArea 2.1",
+            "QtQuick.Templates/TextArea 2.3",
+            "QtQuick.Templates/TextArea 2.5"
+        ]
+        exportMetaObjectRevisions: [0, 1, 3, 5]
+        attachedType: "QQuickTextAreaAttached"
+        Property { name: "font"; type: "QFont" }
+        Property { name: "implicitWidth"; type: "double" }
+        Property { name: "implicitHeight"; type: "double" }
+        Property { name: "background"; type: "QQuickItem"; isPointer: true }
+        Property { name: "placeholderText"; type: "string" }
+        Property { name: "focusReason"; type: "Qt::FocusReason" }
+        Property { name: "hovered"; revision: 1; type: "bool"; isReadonly: true }
+        Property { name: "hoverEnabled"; revision: 1; type: "bool" }
+        Property { name: "palette"; revision: 3; type: "QPalette" }
+        Property { name: "placeholderTextColor"; revision: 5; type: "QColor" }
+        Property { name: "implicitBackgroundWidth"; revision: 5; type: "double"; isReadonly: true }
+        Property { name: "implicitBackgroundHeight"; revision: 5; type: "double"; isReadonly: true }
+        Property { name: "topInset"; revision: 5; type: "double" }
+        Property { name: "leftInset"; revision: 5; type: "double" }
+        Property { name: "rightInset"; revision: 5; type: "double" }
+        Property { name: "bottomInset"; revision: 5; type: "double" }
+        Signal { name: "implicitWidthChanged3" }
+        Signal { name: "implicitHeightChanged3" }
+        Signal {
+            name: "pressAndHold"
+            Parameter { name: "event"; type: "QQuickMouseEvent"; isPointer: true }
+        }
+        Signal {
+            name: "pressed"
+            revision: 1
+            Parameter { name: "event"; type: "QQuickMouseEvent"; isPointer: true }
+        }
+        Signal {
+            name: "released"
+            revision: 1
+            Parameter { name: "event"; type: "QQuickMouseEvent"; isPointer: true }
+        }
+        Signal { name: "hoveredChanged"; revision: 1 }
+        Signal { name: "hoverEnabledChanged"; revision: 1 }
+        Signal { name: "paletteChanged"; revision: 3 }
+        Signal { name: "placeholderTextColorChanged"; revision: 5 }
+        Signal { name: "implicitBackgroundWidthChanged"; revision: 5 }
+        Signal { name: "implicitBackgroundHeightChanged"; revision: 5 }
+        Signal { name: "topInsetChanged"; revision: 5 }
+        Signal { name: "leftInsetChanged"; revision: 5 }
+        Signal { name: "rightInsetChanged"; revision: 5 }
+        Signal { name: "bottomInsetChanged"; revision: 5 }
+    }
+    Component {
+        name: "QQuickTextAreaAttached"
+        prototype: "QObject"
+        Property { name: "flickable"; type: "QQuickTextArea"; isPointer: true }
+    }
+    Component {
+        name: "QQuickTextEdit"
+        defaultProperty: "data"
+        prototype: "QQuickImplicitSizeItem"
+        Enum {
+            name: "HAlignment"
+            values: {
+                "AlignLeft": 1,
+                "AlignRight": 2,
+                "AlignHCenter": 4,
+                "AlignJustify": 8
+            }
+        }
+        Enum {
+            name: "VAlignment"
+            values: {
+                "AlignTop": 32,
+                "AlignBottom": 64,
+                "AlignVCenter": 128
+            }
+        }
+        Enum {
+            name: "TextFormat"
+            values: {
+                "PlainText": 0,
+                "RichText": 1,
+                "AutoText": 2,
+                "MarkdownText": 3
+            }
+        }
+        Enum {
+            name: "WrapMode"
+            values: {
+                "NoWrap": 0,
+                "WordWrap": 1,
+                "WrapAnywhere": 3,
+                "WrapAtWordBoundaryOrAnywhere": 4,
+                "Wrap": 4
+            }
+        }
+        Enum {
+            name: "SelectionMode"
+            values: {
+                "SelectCharacters": 0,
+                "SelectWords": 1
+            }
+        }
+        Enum {
+            name: "RenderType"
+            values: {
+                "QtRendering": 0,
+                "NativeRendering": 1
+            }
+        }
+        Property { name: "text"; type: "string" }
+        Property { name: "color"; type: "QColor" }
+        Property { name: "selectionColor"; type: "QColor" }
+        Property { name: "selectedTextColor"; type: "QColor" }
+        Property { name: "font"; type: "QFont" }
+        Property { name: "horizontalAlignment"; type: "HAlignment" }
+        Property { name: "effectiveHorizontalAlignment"; type: "HAlignment"; isReadonly: true }
+        Property { name: "verticalAlignment"; type: "VAlignment" }
+        Property { name: "wrapMode"; type: "WrapMode" }
+        Property { name: "lineCount"; type: "int"; isReadonly: true }
+        Property { name: "length"; type: "int"; isReadonly: true }
+        Property { name: "contentWidth"; type: "double"; isReadonly: true }
+        Property { name: "contentHeight"; type: "double"; isReadonly: true }
+        Property { name: "paintedWidth"; type: "double"; isReadonly: true }
+        Property { name: "paintedHeight"; type: "double"; isReadonly: true }
+        Property { name: "textFormat"; type: "TextFormat" }
+        Property { name: "readOnly"; type: "bool" }
+        Property { name: "cursorVisible"; type: "bool" }
+        Property { name: "cursorPosition"; type: "int" }
+        Property { name: "cursorRectangle"; type: "QRectF"; isReadonly: true }
+        Property { name: "cursorDelegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "overwriteMode"; type: "bool" }
+        Property { name: "selectionStart"; type: "int"; isReadonly: true }
+        Property { name: "selectionEnd"; type: "int"; isReadonly: true }
+        Property { name: "selectedText"; type: "string"; isReadonly: true }
+        Property { name: "activeFocusOnPress"; type: "bool" }
+        Property { name: "persistentSelection"; type: "bool" }
+        Property { name: "textMargin"; type: "double" }
+        Property { name: "inputMethodHints"; type: "Qt::InputMethodHints" }
+        Property { name: "selectByKeyboard"; revision: 1; type: "bool" }
+        Property { name: "selectByMouse"; type: "bool" }
+        Property { name: "mouseSelectionMode"; type: "SelectionMode" }
+        Property { name: "canPaste"; type: "bool"; isReadonly: true }
+        Property { name: "canUndo"; type: "bool"; isReadonly: true }
+        Property { name: "canRedo"; type: "bool"; isReadonly: true }
+        Property { name: "inputMethodComposing"; type: "bool"; isReadonly: true }
+        Property { name: "baseUrl"; type: "QUrl" }
+        Property { name: "renderType"; type: "RenderType" }
+        Property {
+            name: "textDocument"
+            revision: 1
+            type: "QQuickTextDocument"
+            isReadonly: true
+            isPointer: true
+        }
+        Property { name: "hoveredLink"; revision: 2; type: "string"; isReadonly: true }
+        Property { name: "padding"; revision: 6; type: "double" }
+        Property { name: "topPadding"; revision: 6; type: "double" }
+        Property { name: "leftPadding"; revision: 6; type: "double" }
+        Property { name: "rightPadding"; revision: 6; type: "double" }
+        Property { name: "bottomPadding"; revision: 6; type: "double" }
+        Property { name: "preeditText"; revision: 7; type: "string"; isReadonly: true }
+        Property { name: "tabStopDistance"; revision: 10; type: "double" }
+        Signal { name: "preeditTextChanged"; revision: 7 }
+        Signal { name: "contentSizeChanged" }
+        Signal {
+            name: "colorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "selectionColorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "selectedTextColorChanged"
+            Parameter { name: "color"; type: "QColor" }
+        }
+        Signal {
+            name: "fontChanged"
+            Parameter { name: "font"; type: "QFont" }
+        }
+        Signal {
+            name: "horizontalAlignmentChanged"
+            Parameter { name: "alignment"; type: "QQuickTextEdit::HAlignment" }
+        }
+        Signal {
+            name: "verticalAlignmentChanged"
+            Parameter { name: "alignment"; type: "QQuickTextEdit::VAlignment" }
+        }
+        Signal {
+            name: "textFormatChanged"
+            Parameter { name: "textFormat"; type: "QQuickTextEdit::TextFormat" }
+        }
+        Signal {
+            name: "readOnlyChanged"
+            Parameter { name: "isReadOnly"; type: "bool" }
+        }
+        Signal {
+            name: "cursorVisibleChanged"
+            Parameter { name: "isCursorVisible"; type: "bool" }
+        }
+        Signal {
+            name: "overwriteModeChanged"
+            Parameter { name: "overwriteMode"; type: "bool" }
+        }
+        Signal {
+            name: "activeFocusOnPressChanged"
+            Parameter { name: "activeFocusOnPressed"; type: "bool" }
+        }
+        Signal {
+            name: "persistentSelectionChanged"
+            Parameter { name: "isPersistentSelection"; type: "bool" }
+        }
+        Signal {
+            name: "textMarginChanged"
+            Parameter { name: "textMargin"; type: "double" }
+        }
+        Signal {
+            name: "selectByKeyboardChanged"
+            revision: 1
+            Parameter { name: "selectByKeyboard"; type: "bool" }
+        }
+        Signal {
+            name: "selectByMouseChanged"
+            Parameter { name: "selectByMouse"; type: "bool" }
+        }
+        Signal {
+            name: "mouseSelectionModeChanged"
+            Parameter { name: "mode"; type: "QQuickTextEdit::SelectionMode" }
+        }
+        Signal {
+            name: "linkActivated"
+            Parameter { name: "link"; type: "string" }
+        }
+        Signal {
+            name: "linkHovered"
+            revision: 2
+            Parameter { name: "link"; type: "string" }
+        }
+        Signal { name: "editingFinished"; revision: 6 }
+        Signal { name: "paddingChanged"; revision: 6 }
+        Signal { name: "topPaddingChanged"; revision: 6 }
+        Signal { name: "leftPaddingChanged"; revision: 6 }
+        Signal { name: "rightPaddingChanged"; revision: 6 }
+        Signal { name: "bottomPaddingChanged"; revision: 6 }
+        Signal {
+            name: "tabStopDistanceChanged"
+            revision: 10
+            Parameter { name: "distance"; type: "double" }
+        }
+        Method { name: "selectAll" }
+        Method { name: "selectWord" }
+        Method {
+            name: "select"
+            Parameter { name: "start"; type: "int" }
+            Parameter { name: "end"; type: "int" }
+        }
+        Method { name: "deselect" }
+        Method {
+            name: "isRightToLeft"
+            type: "bool"
+            Parameter { name: "start"; type: "int" }
+            Parameter { name: "end"; type: "int" }
+        }
+        Method { name: "cut" }
+        Method { name: "copy" }
+        Method { name: "paste" }
+        Method { name: "undo" }
+        Method { name: "redo" }
+        Method {
+            name: "insert"
+            Parameter { name: "position"; type: "int" }
+            Parameter { name: "text"; type: "string" }
+        }
+        Method {
+            name: "remove"
+            Parameter { name: "start"; type: "int" }
+            Parameter { name: "end"; type: "int" }
+        }
+        Method {
+            name: "append"
+            revision: 2
+            Parameter { name: "text"; type: "string" }
+        }
+        Method { name: "clear"; revision: 7 }
+        Method {
+            name: "inputMethodQuery"
+            revision: 4
+            type: "QVariant"
+            Parameter { name: "query"; type: "Qt::InputMethodQuery" }
+            Parameter { name: "argument"; type: "QVariant" }
+        }
+        Method {
+            name: "positionToRectangle"
+            type: "QRectF"
+            Parameter { type: "int" }
+        }
+        Method {
+            name: "positionAt"
+            type: "int"
+            Parameter { name: "x"; type: "double" }
+            Parameter { name: "y"; type: "double" }
+        }
+        Method {
+            name: "moveCursorSelection"
+            Parameter { name: "pos"; type: "int" }
+        }
+        Method {
+            name: "moveCursorSelection"
+            Parameter { name: "pos"; type: "int" }
+            Parameter { name: "mode"; type: "SelectionMode" }
+        }
+        Method {
+            name: "getText"
+            type: "string"
+            Parameter { name: "start"; type: "int" }
+            Parameter { name: "end"; type: "int" }
+        }
+        Method {
+            name: "getFormattedText"
+            type: "string"
+            Parameter { name: "start"; type: "int" }
+            Parameter { name: "end"; type: "int" }
+        }
+        Method {
+            name: "linkAt"
+            revision: 3
+            type: "string"
+            Parameter { name: "x"; type: "double" }
+            Parameter { name: "y"; type: "double" }
+        }
+    }
+    Component {
+        name: "QQuickTextField"
+        defaultProperty: "data"
+        prototype: "QQuickTextInput"
+        exports: [
+            "QtQuick.Templates/TextField 2.0",
+            "QtQuick.Templates/TextField 2.1",
+            "QtQuick.Templates/TextField 2.3",
+            "QtQuick.Templates/TextField 2.5"
+        ]
+        exportMetaObjectRevisions: [0, 1, 3, 5]
+        Property { name: "font"; type: "QFont" }
+        Property { name: "implicitWidth"; type: "double" }
+        Property { name: "implicitHeight"; type: "double" }
+        Property { name: "background"; type: "QQuickItem"; isPointer: true }
+        Property { name: "placeholderText"; type: "string" }
+        Property { name: "focusReason"; type: "Qt::FocusReason" }
+        Property { name: "hovered"; revision: 1; type: "bool"; isReadonly: true }
+        Property { name: "hoverEnabled"; revision: 1; type: "bool" }
+        Property { name: "palette"; revision: 3; type: "QPalette" }
+        Property { name: "placeholderTextColor"; revision: 5; type: "QColor" }
+        Property { name: "implicitBackgroundWidth"; revision: 5; type: "double"; isReadonly: true }
+        Property { name: "implicitBackgroundHeight"; revision: 5; type: "double"; isReadonly: true }
+        Property { name: "topInset"; revision: 5; type: "double" }
+        Property { name: "leftInset"; revision: 5; type: "double" }
+        Property { name: "rightInset"; revision: 5; type: "double" }
+        Property { name: "bottomInset"; revision: 5; type: "double" }
+        Signal { name: "implicitWidthChanged3" }
+        Signal { name: "implicitHeightChanged3" }
+        Signal {
+            name: "pressAndHold"
+            Parameter { name: "event"; type: "QQuickMouseEvent"; isPointer: true }
+        }
+        Signal {
+            name: "pressed"
+            revision: 1
+            Parameter { name: "event"; type: "QQuickMouseEvent"; isPointer: true }
+        }
+        Signal {
+            name: "released"
+            revision: 1
+            Parameter { name: "event"; type: "QQuickMouseEvent"; isPointer: true }
+        }
+        Signal { name: "hoveredChanged"; revision: 1 }
+        Signal { name: "hoverEnabledChanged"; revision: 1 }
+        Signal { name: "paletteChanged"; revision: 3 }
+        Signal { name: "placeholderTextColorChanged"; revision: 5 }
+        Signal { name: "implicitBackgroundWidthChanged"; revision: 5 }
+        Signal { name: "implicitBackgroundHeightChanged"; revision: 5 }
+        Signal { name: "topInsetChanged"; revision: 5 }
+        Signal { name: "leftInsetChanged"; revision: 5 }
+        Signal { name: "rightInsetChanged"; revision: 5 }
+        Signal { name: "bottomInsetChanged"; revision: 5 }
+    }
+    Component {
+        name: "QQuickTextInput"
+        defaultProperty: "data"
+        prototype: "QQuickImplicitSizeItem"
+        Enum {
+            name: "EchoMode"
+            values: {
+                "Normal": 0,
+                "NoEcho": 1,
+                "Password": 2,
+                "PasswordEchoOnEdit": 3
+            }
+        }
+        Enum {
+            name: "HAlignment"
+            values: {
+                "AlignLeft": 1,
+                "AlignRight": 2,
+                "AlignHCenter": 4
+            }
+        }
+        Enum {
+            name: "VAlignment"
+            values: {
+                "AlignTop": 32,
+                "AlignBottom": 64,
+                "AlignVCenter": 128
+            }
+        }
+        Enum {
+            name: "WrapMode"
+            values: {
+                "NoWrap": 0,
+                "WordWrap": 1,
+                "WrapAnywhere": 3,
+                "WrapAtWordBoundaryOrAnywhere": 4,
+                "Wrap": 4
+            }
+        }
+        Enum {
+            name: "SelectionMode"
+            values: {
+                "SelectCharacters": 0,
+                "SelectWords": 1
+            }
+        }
+        Enum {
+            name: "CursorPosition"
+            values: {
+                "CursorBetweenCharacters": 0,
+                "CursorOnCharacter": 1
+            }
+        }
+        Enum {
+            name: "RenderType"
+            values: {
+                "QtRendering": 0,
+                "NativeRendering": 1
+            }
+        }
+        Property { name: "text"; type: "string" }
+        Property { name: "length"; type: "int"; isReadonly: true }
+        Property { name: "color"; type: "QColor" }
+        Property { name: "selectionColor"; type: "QColor" }
+        Property { name: "selectedTextColor"; type: "QColor" }
+        Property { name: "font"; type: "QFont" }
+        Property { name: "horizontalAlignment"; type: "HAlignment" }
+        Property { name: "effectiveHorizontalAlignment"; type: "HAlignment"; isReadonly: true }
+        Property { name: "verticalAlignment"; type: "VAlignment" }
+        Property { name: "wrapMode"; type: "WrapMode" }
+        Property { name: "readOnly"; type: "bool" }
+        Property { name: "cursorVisible"; type: "bool" }
+        Property { name: "cursorPosition"; type: "int" }
+        Property { name: "cursorRectangle"; type: "QRectF"; isReadonly: true }
+        Property { name: "cursorDelegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "overwriteMode"; type: "bool" }
+        Property { name: "selectionStart"; type: "int"; isReadonly: true }
+        Property { name: "selectionEnd"; type: "int"; isReadonly: true }
+        Property { name: "selectedText"; type: "string"; isReadonly: true }
+        Property { name: "maximumLength"; type: "int" }
+        Property { name: "validator"; type: "QValidator"; isPointer: true }
+        Property { name: "inputMask"; type: "string" }
+        Property { name: "inputMethodHints"; type: "Qt::InputMethodHints" }
+        Property { name: "acceptableInput"; type: "bool"; isReadonly: true }
+        Property { name: "echoMode"; type: "EchoMode" }
+        Property { name: "activeFocusOnPress"; type: "bool" }
+        Property { name: "passwordCharacter"; type: "string" }
+        Property { name: "passwordMaskDelay"; revision: 4; type: "int" }
+        Property { name: "displayText"; type: "string"; isReadonly: true }
+        Property { name: "preeditText"; revision: 7; type: "string"; isReadonly: true }
+        Property { name: "autoScroll"; type: "bool" }
+        Property { name: "selectByMouse"; type: "bool" }
+        Property { name: "mouseSelectionMode"; type: "SelectionMode" }
+        Property { name: "persistentSelection"; type: "bool" }
+        Property { name: "canPaste"; type: "bool"; isReadonly: true }
+        Property { name: "canUndo"; type: "bool"; isReadonly: true }
+        Property { name: "canRedo"; type: "bool"; isReadonly: true }
+        Property { name: "inputMethodComposing"; type: "bool"; isReadonly: true }
+        Property { name: "contentWidth"; type: "double"; isReadonly: true }
+        Property { name: "contentHeight"; type: "double"; isReadonly: true }
+        Property { name: "renderType"; type: "RenderType" }
+        Property { name: "padding"; revision: 6; type: "double" }
+        Property { name: "topPadding"; revision: 6; type: "double" }
+        Property { name: "leftPadding"; revision: 6; type: "double" }
+        Property { name: "rightPadding"; revision: 6; type: "double" }
+        Property { name: "bottomPadding"; revision: 6; type: "double" }
+        Signal { name: "accepted" }
+        Signal { name: "editingFinished"; revision: 2 }
+        Signal { name: "textEdited"; revision: 9 }
+        Signal {
+            name: "fontChanged"
+            Parameter { name: "font"; type: "QFont" }
+        }
+        Signal {
+            name: "horizontalAlignmentChanged"
+            Parameter { name: "alignment"; type: "QQuickTextInput::HAlignment" }
+        }
+        Signal {
+            name: "verticalAlignmentChanged"
+            Parameter { name: "alignment"; type: "QQuickTextInput::VAlignment" }
+        }
+        Signal {
+            name: "readOnlyChanged"
+            Parameter { name: "isReadOnly"; type: "bool" }
+        }
+        Signal {
+            name: "cursorVisibleChanged"
+            Parameter { name: "isCursorVisible"; type: "bool" }
+        }
+        Signal {
+            name: "overwriteModeChanged"
+            Parameter { name: "overwriteMode"; type: "bool" }
+        }
+        Signal {
+            name: "maximumLengthChanged"
+            Parameter { name: "maximumLength"; type: "int" }
+        }
+        Signal {
+            name: "inputMaskChanged"
+            Parameter { name: "inputMask"; type: "string" }
+        }
+        Signal {
+            name: "echoModeChanged"
+            Parameter { name: "echoMode"; type: "QQuickTextInput::EchoMode" }
+        }
+        Signal {
+            name: "passwordMaskDelayChanged"
+            revision: 4
+            Parameter { name: "delay"; type: "int" }
+        }
+        Signal { name: "preeditTextChanged"; revision: 7 }
+        Signal {
+            name: "activeFocusOnPressChanged"
+            Parameter { name: "activeFocusOnPress"; type: "bool" }
+        }
+        Signal {
+            name: "autoScrollChanged"
+            Parameter { name: "autoScroll"; type: "bool" }
+        }
+        Signal {
+            name: "selectByMouseChanged"
+            Parameter { name: "selectByMouse"; type: "bool" }
+        }
+        Signal {
+            name: "mouseSelectionModeChanged"
+            Parameter { name: "mode"; type: "QQuickTextInput::SelectionMode" }
+        }
+        Signal { name: "contentSizeChanged" }
+        Signal { name: "paddingChanged"; revision: 6 }
+        Signal { name: "topPaddingChanged"; revision: 6 }
+        Signal { name: "leftPaddingChanged"; revision: 6 }
+        Signal { name: "rightPaddingChanged"; revision: 6 }
+        Signal { name: "bottomPaddingChanged"; revision: 6 }
+        Method { name: "selectAll" }
+        Method { name: "selectWord" }
+        Method {
+            name: "select"
+            Parameter { name: "start"; type: "int" }
+            Parameter { name: "end"; type: "int" }
+        }
+        Method { name: "deselect" }
+        Method {
+            name: "isRightToLeft"
+            type: "bool"
+            Parameter { name: "start"; type: "int" }
+            Parameter { name: "end"; type: "int" }
+        }
+        Method { name: "cut" }
+        Method { name: "copy" }
+        Method { name: "paste" }
+        Method { name: "undo" }
+        Method { name: "redo" }
+        Method {
+            name: "insert"
+            Parameter { name: "position"; type: "int" }
+            Parameter { name: "text"; type: "string" }
+        }
+        Method {
+            name: "remove"
+            Parameter { name: "start"; type: "int" }
+            Parameter { name: "end"; type: "int" }
+        }
+        Method {
+            name: "ensureVisible"
+            revision: 4
+            Parameter { name: "position"; type: "int" }
+        }
+        Method { name: "clear"; revision: 7 }
+        Method {
+            name: "positionAt"
+            Parameter { name: "args"; type: "QQmlV4Function"; isPointer: true }
+        }
+        Method {
+            name: "positionToRectangle"
+            type: "QRectF"
+            Parameter { name: "pos"; type: "int" }
+        }
+        Method {
+            name: "moveCursorSelection"
+            Parameter { name: "pos"; type: "int" }
+        }
+        Method {
+            name: "moveCursorSelection"
+            Parameter { name: "pos"; type: "int" }
+            Parameter { name: "mode"; type: "SelectionMode" }
+        }
+        Method {
+            name: "inputMethodQuery"
+            revision: 4
+            type: "QVariant"
+            Parameter { name: "query"; type: "Qt::InputMethodQuery" }
+            Parameter { name: "argument"; type: "QVariant" }
+        }
+        Method {
+            name: "getText"
+            type: "string"
+            Parameter { name: "start"; type: "int" }
+            Parameter { name: "end"; type: "int" }
+        }
+    }
+    Component {
+        name: "QQuickToolBar"
+        defaultProperty: "contentData"
+        prototype: "QQuickPane"
+        exports: ["QtQuick.Templates/ToolBar 2.0"]
+        exportMetaObjectRevisions: [0]
+        Enum {
+            name: "Position"
+            values: {
+                "Header": 0,
+                "Footer": 1
+            }
+        }
+        Property { name: "position"; type: "Position" }
+    }
+    Component {
+        name: "QQuickToolButton"
+        defaultProperty: "data"
+        prototype: "QQuickButton"
+        exports: ["QtQuick.Templates/ToolButton 2.0"]
+        exportMetaObjectRevisions: [0]
+    }
+    Component {
+        name: "QQuickToolSeparator"
+        defaultProperty: "data"
+        prototype: "QQuickControl"
+        exports: ["QtQuick.Templates/ToolSeparator 2.1"]
+        exportMetaObjectRevisions: [0]
+        Property { name: "orientation"; type: "Qt::Orientation" }
+        Property { name: "horizontal"; type: "bool"; isReadonly: true }
+        Property { name: "vertical"; type: "bool"; isReadonly: true }
+    }
+    Component {
+        name: "QQuickToolTip"
+        defaultProperty: "contentData"
+        prototype: "QQuickPopup"
+        exports: [
+            "QtQuick.Templates/ToolTip 2.0",
+            "QtQuick.Templates/ToolTip 2.5"
+        ]
+        exportMetaObjectRevisions: [0, 5]
+        attachedType: "QQuickToolTipAttached"
+        Property { name: "delay"; type: "int" }
+        Property { name: "timeout"; type: "int" }
+        Property { name: "text"; type: "string" }
+        Method {
+            name: "show"
+            revision: 5
+            Parameter { name: "text"; type: "string" }
+            Parameter { name: "ms"; type: "int" }
+        }
+        Method {
+            name: "show"
+            revision: 5
+            Parameter { name: "text"; type: "string" }
+        }
+        Method { name: "hide"; revision: 5 }
+    }
+    Component {
+        name: "QQuickToolTipAttached"
+        prototype: "QObject"
+        Property { name: "text"; type: "string" }
+        Property { name: "delay"; type: "int" }
+        Property { name: "timeout"; type: "int" }
+        Property { name: "visible"; type: "bool" }
+        Property { name: "toolTip"; type: "QQuickToolTip"; isReadonly: true; isPointer: true }
+        Method {
+            name: "show"
+            Parameter { name: "text"; type: "string" }
+            Parameter { name: "ms"; type: "int" }
+        }
+        Method {
+            name: "show"
+            Parameter { name: "text"; type: "string" }
+        }
+        Method { name: "hide" }
+    }
+    Component {
+        name: "QQuickTumbler"
+        defaultProperty: "data"
+        prototype: "QQuickControl"
+        exports: [
+            "QtQuick.Templates/Tumbler 2.0",
+            "QtQuick.Templates/Tumbler 2.1",
+            "QtQuick.Templates/Tumbler 2.2"
+        ]
+        exportMetaObjectRevisions: [0, 1, 2]
+        attachedType: "QQuickTumblerAttached"
+        Enum {
+            name: "PositionMode"
+            values: {
+                "Beginning": 0,
+                "Center": 1,
+                "End": 2,
+                "Visible": 3,
+                "Contain": 4,
+                "SnapPosition": 5
+            }
+        }
+        Property { name: "model"; type: "QVariant" }
+        Property { name: "count"; type: "int"; isReadonly: true }
+        Property { name: "currentIndex"; type: "int" }
+        Property { name: "currentItem"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property { name: "delegate"; type: "QQmlComponent"; isPointer: true }
+        Property { name: "visibleItemCount"; type: "int" }
+        Property { name: "wrap"; revision: 1; type: "bool" }
+        Property { name: "moving"; revision: 2; type: "bool"; isReadonly: true }
+        Signal { name: "wrapChanged"; revision: 1 }
+        Signal { name: "movingChanged"; revision: 2 }
+        Method {
+            name: "positionViewAtIndex"
+            revision: 5
+            Parameter { name: "index"; type: "int" }
+            Parameter { name: "mode"; type: "PositionMode" }
+        }
+    }
+    Component {
+        name: "QQuickTumblerAttached"
+        prototype: "QObject"
+        Property { name: "tumbler"; type: "QQuickTumbler"; isReadonly: true; isPointer: true }
+        Property { name: "displacement"; type: "double"; isReadonly: true }
+    }
+    Component {
+        name: "QQuickVerticalHeaderView"
+        defaultProperty: "flickableData"
+        prototype: "QQuickHeaderViewBase"
+        exports: ["QtQuick.Templates/VerticalHeaderView 2.15"]
+        exportMetaObjectRevisions: [0]
+        attachedType: "QQuickTableViewAttached"
+    }
+    Component {
+        name: "QQuickWindow"
+        defaultProperty: "data"
+        prototype: "QWindow"
+        Enum {
+            name: "CreateTextureOptions"
+            values: {
+                "TextureHasAlphaChannel": 1,
+                "TextureHasMipmaps": 2,
+                "TextureOwnsGLTexture": 4,
+                "TextureCanUseAtlas": 8,
+                "TextureIsOpaque": 16
+            }
+        }
+        Enum {
+            name: "SceneGraphError"
+            values: {
+                "ContextNotAvailable": 1
+            }
+        }
+        Enum {
+            name: "TextRenderType"
+            values: {
+                "QtTextRendering": 0,
+                "NativeTextRendering": 1
+            }
+        }
+        Enum {
+            name: "NativeObjectType"
+            values: {
+                "NativeObjectTexture": 0
+            }
+        }
+        Property { name: "data"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "color"; type: "QColor" }
+        Property { name: "contentItem"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property {
+            name: "activeFocusItem"
+            revision: 1
+            type: "QQuickItem"
+            isReadonly: true
+            isPointer: true
+        }
+        Signal { name: "frameSwapped" }
+        Signal {
+            name: "openglContextCreated"
+            revision: 2
+            Parameter { name: "context"; type: "QOpenGLContext"; isPointer: true }
+        }
+        Signal { name: "sceneGraphInitialized" }
+        Signal { name: "sceneGraphInvalidated" }
+        Signal { name: "beforeSynchronizing" }
+        Signal { name: "afterSynchronizing"; revision: 2 }
+        Signal { name: "beforeRendering" }
+        Signal { name: "afterRendering" }
+        Signal { name: "afterAnimating"; revision: 2 }
+        Signal { name: "sceneGraphAboutToStop"; revision: 2 }
+        Signal {
+            name: "closing"
+            revision: 1
+            Parameter { name: "close"; type: "QQuickCloseEvent"; isPointer: true }
+        }
+        Signal {
+            name: "colorChanged"
+            Parameter { type: "QColor" }
+        }
+        Signal { name: "activeFocusItemChanged"; revision: 1 }
+        Signal {
+            name: "sceneGraphError"
+            revision: 2
+            Parameter { name: "error"; type: "QQuickWindow::SceneGraphError" }
+            Parameter { name: "message"; type: "string" }
+        }
+        Signal { name: "beforeRenderPassRecording"; revision: 14 }
+        Signal { name: "afterRenderPassRecording"; revision: 14 }
+        Method { name: "update" }
+        Method { name: "releaseResources" }
+    }
+    Component {
+        name: "QQuickWindowQmlImpl"
+        defaultProperty: "data"
+        prototype: "QQuickWindow"
+        Property { name: "visible"; type: "bool" }
+        Property { name: "visibility"; type: "Visibility" }
+        Property { name: "screen"; revision: 3; type: "QObject"; isPointer: true }
+        Signal {
+            name: "visibleChanged"
+            Parameter { name: "arg"; type: "bool" }
+        }
+        Signal {
+            name: "visibilityChanged"
+            Parameter { name: "visibility"; type: "QWindow::Visibility" }
+        }
+        Signal { name: "screenChanged"; revision: 3 }
+    }
+    Component {
+        name: "QWindow"
+        prototype: "QObject"
+        Enum {
+            name: "Visibility"
+            values: {
+                "Hidden": 0,
+                "AutomaticVisibility": 1,
+                "Windowed": 2,
+                "Minimized": 3,
+                "Maximized": 4,
+                "FullScreen": 5
+            }
+        }
+        Enum {
+            name: "AncestorMode"
+            values: {
+                "ExcludeTransients": 0,
+                "IncludeTransients": 1
+            }
+        }
+        Property { name: "title"; type: "string" }
+        Property { name: "modality"; type: "Qt::WindowModality" }
+        Property { name: "flags"; type: "Qt::WindowFlags" }
+        Property { name: "x"; type: "int" }
+        Property { name: "y"; type: "int" }
+        Property { name: "width"; type: "int" }
+        Property { name: "height"; type: "int" }
+        Property { name: "minimumWidth"; type: "int" }
+        Property { name: "minimumHeight"; type: "int" }
+        Property { name: "maximumWidth"; type: "int" }
+        Property { name: "maximumHeight"; type: "int" }
+        Property { name: "visible"; type: "bool" }
+        Property { name: "active"; revision: 1; type: "bool"; isReadonly: true }
+        Property { name: "visibility"; revision: 1; type: "Visibility" }
+        Property { name: "contentOrientation"; type: "Qt::ScreenOrientation" }
+        Property { name: "opacity"; revision: 1; type: "double" }
+        Property { name: "transientParent"; revision: 13; type: "QWindow"; isPointer: true }
+        Signal {
+            name: "screenChanged"
+            Parameter { name: "screen"; type: "QScreen"; isPointer: true }
+        }
+        Signal {
+            name: "modalityChanged"
+            Parameter { name: "modality"; type: "Qt::WindowModality" }
+        }
+        Signal {
+            name: "windowStateChanged"
+            Parameter { name: "windowState"; type: "Qt::WindowState" }
+        }
+        Signal {
+            name: "windowTitleChanged"
+            revision: 2
+            Parameter { name: "title"; type: "string" }
+        }
+        Signal {
+            name: "xChanged"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Signal {
+            name: "yChanged"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Signal {
+            name: "widthChanged"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Signal {
+            name: "heightChanged"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Signal {
+            name: "minimumWidthChanged"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Signal {
+            name: "minimumHeightChanged"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Signal {
+            name: "maximumWidthChanged"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Signal {
+            name: "maximumHeightChanged"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Signal {
+            name: "visibleChanged"
+            Parameter { name: "arg"; type: "bool" }
+        }
+        Signal {
+            name: "visibilityChanged"
+            revision: 1
+            Parameter { name: "visibility"; type: "QWindow::Visibility" }
+        }
+        Signal { name: "activeChanged"; revision: 1 }
+        Signal {
+            name: "contentOrientationChanged"
+            Parameter { name: "orientation"; type: "Qt::ScreenOrientation" }
+        }
+        Signal {
+            name: "focusObjectChanged"
+            Parameter { name: "object"; type: "QObject"; isPointer: true }
+        }
+        Signal {
+            name: "opacityChanged"
+            revision: 1
+            Parameter { name: "opacity"; type: "double" }
+        }
+        Signal {
+            name: "transientParentChanged"
+            revision: 13
+            Parameter { name: "transientParent"; type: "QWindow"; isPointer: true }
+        }
+        Method { name: "requestActivate"; revision: 1 }
+        Method {
+            name: "setVisible"
+            Parameter { name: "visible"; type: "bool" }
+        }
+        Method { name: "show" }
+        Method { name: "hide" }
+        Method { name: "showMinimized" }
+        Method { name: "showMaximized" }
+        Method { name: "showFullScreen" }
+        Method { name: "showNormal" }
+        Method { name: "close"; type: "bool" }
+        Method { name: "raise" }
+        Method { name: "lower" }
+        Method {
+            name: "startSystemResize"
+            type: "bool"
+            Parameter { name: "edges"; type: "Qt::Edges" }
+        }
+        Method { name: "startSystemMove"; type: "bool" }
+        Method {
+            name: "setTitle"
+            Parameter { type: "string" }
+        }
+        Method {
+            name: "setX"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Method {
+            name: "setY"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Method {
+            name: "setWidth"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Method {
+            name: "setHeight"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Method {
+            name: "setGeometry"
+            Parameter { name: "posx"; type: "int" }
+            Parameter { name: "posy"; type: "int" }
+            Parameter { name: "w"; type: "int" }
+            Parameter { name: "h"; type: "int" }
+        }
+        Method {
+            name: "setGeometry"
+            Parameter { name: "rect"; type: "QRect" }
+        }
+        Method {
+            name: "setMinimumWidth"
+            Parameter { name: "w"; type: "int" }
+        }
+        Method {
+            name: "setMinimumHeight"
+            Parameter { name: "h"; type: "int" }
+        }
+        Method {
+            name: "setMaximumWidth"
+            Parameter { name: "w"; type: "int" }
+        }
+        Method {
+            name: "setMaximumHeight"
+            Parameter { name: "h"; type: "int" }
+        }
+        Method {
+            name: "alert"
+            revision: 1
+            Parameter { name: "msec"; type: "int" }
+        }
+        Method { name: "requestUpdate"; revision: 3 }
+    }
+}
diff --git a/deployment_test/QtQuick/Templates.2/qmldir b/deployment_test/QtQuick/Templates.2/qmldir
new file mode 100644
index 0000000000000000000000000000000000000000..9f3773a8d1ed04d41286d860c896d5241defb35c
--- /dev/null
+++ b/deployment_test/QtQuick/Templates.2/qmldir
@@ -0,0 +1,5 @@
+module QtQuick.Templates
+plugin qtquicktemplates2plugin
+classname QtQuickTemplates2Plugin
+depends QtQuick.Window 2.2
+depends QtQuick 2.9
diff --git a/deployment_test/QtQuick/Templates.2/qtquicktemplates2plugin.dll b/deployment_test/QtQuick/Templates.2/qtquicktemplates2plugin.dll
new file mode 100644
index 0000000000000000000000000000000000000000..a1c01942080e5073ff26b34da74956e65f0ba501
Binary files /dev/null and b/deployment_test/QtQuick/Templates.2/qtquicktemplates2plugin.dll differ
diff --git a/deployment_test/QtQuick/Window.2/plugins.qmltypes b/deployment_test/QtQuick/Window.2/plugins.qmltypes
new file mode 100644
index 0000000000000000000000000000000000000000..3ff3b618e27d609ce13c87bfc51cd436cb2b4be0
--- /dev/null
+++ b/deployment_test/QtQuick/Window.2/plugins.qmltypes
@@ -0,0 +1,409 @@
+import QtQuick.tooling 1.2
+
+// This file describes the plugin-supplied types contained in the library.
+// It is used for QML tooling purposes only.
+//
+// This file was auto-generated by qmltyperegistrar.
+
+Module {
+    dependencies: ["QtQuick 2.0"]
+    Component {
+        file: "plugin.h"
+        name: "QQuickRootItem"
+        defaultProperty: "data"
+        prototype: "QQuickItem"
+        Method {
+            name: "setWidth"
+            Parameter { name: "w"; type: "int" }
+        }
+        Method {
+            name: "setHeight"
+            Parameter { name: "h"; type: "int" }
+        }
+    }
+    Component {
+        file: "plugin.h"
+        name: "QQuickScreen"
+        prototype: "QObject"
+        exports: [
+            "QtQuick.Window/Screen 2.0",
+            "QtQuick.Window/Screen 2.10",
+            "QtQuick.Window/Screen 2.3"
+        ]
+        isCreatable: false
+        exportMetaObjectRevisions: [0, 10, 3]
+        attachedType: "QQuickScreenAttached"
+    }
+    Component {
+        file: "plugin.h"
+        name: "QQuickScreenAttached"
+        prototype: "QQuickScreenInfo"
+        Property { name: "orientationUpdateMask"; type: "Qt::ScreenOrientations" }
+        Method {
+            name: "screenChanged"
+            Parameter { type: "QScreen"; isPointer: true }
+        }
+        Method {
+            name: "angleBetween"
+            type: "int"
+            Parameter { name: "a"; type: "int" }
+            Parameter { name: "b"; type: "int" }
+        }
+    }
+    Component {
+        file: "plugin.h"
+        name: "QQuickScreenInfo"
+        prototype: "QObject"
+        exports: [
+            "QtQuick.Window/ScreenInfo 2.10",
+            "QtQuick.Window/ScreenInfo 2.3"
+        ]
+        isCreatable: false
+        exportMetaObjectRevisions: [10, 3]
+        Property { name: "name"; type: "string"; isReadonly: true }
+        Property { name: "manufacturer"; revision: 10; type: "string"; isReadonly: true }
+        Property { name: "model"; revision: 10; type: "string"; isReadonly: true }
+        Property { name: "serialNumber"; revision: 10; type: "string"; isReadonly: true }
+        Property { name: "width"; type: "int"; isReadonly: true }
+        Property { name: "height"; type: "int"; isReadonly: true }
+        Property { name: "desktopAvailableWidth"; type: "int"; isReadonly: true }
+        Property { name: "desktopAvailableHeight"; type: "int"; isReadonly: true }
+        Property { name: "logicalPixelDensity"; type: "double"; isReadonly: true }
+        Property { name: "pixelDensity"; type: "double"; isReadonly: true }
+        Property { name: "devicePixelRatio"; type: "double"; isReadonly: true }
+        Property { name: "primaryOrientation"; type: "Qt::ScreenOrientation"; isReadonly: true }
+        Property { name: "orientation"; type: "Qt::ScreenOrientation"; isReadonly: true }
+        Property { name: "virtualX"; revision: 3; type: "int"; isReadonly: true }
+        Property { name: "virtualY"; revision: 3; type: "int"; isReadonly: true }
+        Signal { name: "manufacturerChanged"; revision: 10 }
+        Signal { name: "modelChanged"; revision: 10 }
+        Signal { name: "serialNumberChanged"; revision: 10 }
+        Signal { name: "desktopGeometryChanged" }
+        Signal { name: "virtualXChanged"; revision: 3 }
+        Signal { name: "virtualYChanged"; revision: 3 }
+    }
+    Component {
+        file: "plugin.h"
+        name: "QQuickWindow"
+        defaultProperty: "data"
+        prototype: "QWindow"
+        exports: ["QtQuick.Window/Window 2.0"]
+        exportMetaObjectRevisions: [0]
+        Enum {
+            name: "CreateTextureOptions"
+            alias: "CreateTextureOption"
+            isFlag: true
+            values: [
+                "TextureHasAlphaChannel",
+                "TextureHasMipmaps",
+                "TextureOwnsGLTexture",
+                "TextureCanUseAtlas",
+                "TextureIsOpaque"
+            ]
+        }
+        Enum {
+            name: "SceneGraphError"
+            values: ["ContextNotAvailable"]
+        }
+        Enum {
+            name: "TextRenderType"
+            values: ["QtTextRendering", "NativeTextRendering"]
+        }
+        Enum {
+            name: "NativeObjectType"
+            values: ["NativeObjectTexture"]
+        }
+        Property { name: "data"; type: "QObject"; isList: true; isReadonly: true }
+        Property { name: "color"; type: "QColor" }
+        Property { name: "contentItem"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property {
+            name: "activeFocusItem"
+            revision: 1
+            type: "QQuickItem"
+            isReadonly: true
+            isPointer: true
+        }
+        Signal { name: "frameSwapped" }
+        Signal {
+            name: "openglContextCreated"
+            revision: 2
+            Parameter { name: "context"; type: "QOpenGLContext"; isPointer: true }
+        }
+        Signal { name: "sceneGraphInitialized" }
+        Signal { name: "sceneGraphInvalidated" }
+        Signal { name: "beforeSynchronizing" }
+        Signal { name: "afterSynchronizing"; revision: 2 }
+        Signal { name: "beforeRendering" }
+        Signal { name: "afterRendering" }
+        Signal { name: "afterAnimating"; revision: 2 }
+        Signal { name: "sceneGraphAboutToStop"; revision: 2 }
+        Signal {
+            name: "closing"
+            revision: 1
+            Parameter { name: "close"; type: "QQuickCloseEvent"; isPointer: true }
+        }
+        Signal {
+            name: "colorChanged"
+            Parameter { type: "QColor" }
+        }
+        Signal { name: "activeFocusItemChanged"; revision: 1 }
+        Signal {
+            name: "sceneGraphError"
+            revision: 2
+            Parameter { name: "error"; type: "QQuickWindow::SceneGraphError" }
+            Parameter { name: "message"; type: "string" }
+        }
+        Signal { name: "beforeRenderPassRecording"; revision: 14 }
+        Signal { name: "afterRenderPassRecording"; revision: 14 }
+        Method { name: "update" }
+        Method { name: "releaseResources" }
+        Method { name: "maybeUpdate" }
+        Method { name: "cleanupSceneGraph" }
+        Method { name: "physicalDpiChanged" }
+        Method {
+            name: "handleScreenChanged"
+            Parameter { name: "screen"; type: "QScreen"; isPointer: true }
+        }
+        Method {
+            name: "setTransientParent_helper"
+            Parameter { name: "window"; type: "QQuickWindow"; isPointer: true }
+        }
+        Method { name: "runJobsAfterSwap" }
+        Method {
+            name: "handleApplicationStateChanged"
+            Parameter { name: "state"; type: "Qt::ApplicationState" }
+        }
+    }
+    Component {
+        file: "plugin.h"
+        name: "QQuickWindowAttached"
+        prototype: "QObject"
+        Property { name: "visibility"; type: "QWindow::Visibility"; isReadonly: true }
+        Property { name: "active"; type: "bool"; isReadonly: true }
+        Property { name: "activeFocusItem"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property { name: "contentItem"; type: "QQuickItem"; isReadonly: true; isPointer: true }
+        Property { name: "width"; type: "int"; isReadonly: true }
+        Property { name: "height"; type: "int"; isReadonly: true }
+        Property { name: "window"; type: "QQuickWindow"; isReadonly: true; isPointer: true }
+        Method {
+            name: "windowChange"
+            Parameter { type: "QQuickWindow"; isPointer: true }
+        }
+    }
+    Component {
+        file: "plugin.h"
+        name: "QQuickWindowQmlImpl"
+        defaultProperty: "data"
+        prototype: "QQuickWindow"
+        exports: [
+            "QtQuick.Window/Window 2.1",
+            "QtQuick.Window/Window 2.13",
+            "QtQuick.Window/Window 2.14",
+            "QtQuick.Window/Window 2.2",
+            "QtQuick.Window/Window 2.3"
+        ]
+        exportMetaObjectRevisions: [1, 13, 14, 2, 3]
+        attachedType: "QQuickWindowAttached"
+        Property { name: "visible"; type: "bool" }
+        Property { name: "visibility"; type: "Visibility" }
+        Property { name: "screen"; revision: 3; type: "QObject"; isPointer: true }
+        Signal {
+            name: "visibleChanged"
+            Parameter { name: "arg"; type: "bool" }
+        }
+        Signal {
+            name: "visibilityChanged"
+            Parameter { name: "visibility"; type: "QWindow::Visibility" }
+        }
+        Signal { name: "screenChanged"; revision: 3 }
+        Method { name: "setWindowVisibility" }
+    }
+    Component {
+        file: "plugin.h"
+        name: "QWindow"
+        prototype: "QObject"
+        Enum {
+            name: "Visibility"
+            values: [
+                "Hidden",
+                "AutomaticVisibility",
+                "Windowed",
+                "Minimized",
+                "Maximized",
+                "FullScreen"
+            ]
+        }
+        Enum {
+            name: "AncestorMode"
+            values: ["ExcludeTransients", "IncludeTransients"]
+        }
+        Property { name: "title"; type: "string" }
+        Property { name: "modality"; type: "Qt::WindowModality" }
+        Property { name: "flags"; type: "Qt::WindowFlags" }
+        Property { name: "x"; type: "int" }
+        Property { name: "y"; type: "int" }
+        Property { name: "width"; type: "int" }
+        Property { name: "height"; type: "int" }
+        Property { name: "minimumWidth"; type: "int" }
+        Property { name: "minimumHeight"; type: "int" }
+        Property { name: "maximumWidth"; type: "int" }
+        Property { name: "maximumHeight"; type: "int" }
+        Property { name: "visible"; type: "bool" }
+        Property { name: "active"; revision: 1; type: "bool"; isReadonly: true }
+        Property { name: "visibility"; revision: 1; type: "Visibility" }
+        Property { name: "contentOrientation"; type: "Qt::ScreenOrientation" }
+        Property { name: "opacity"; revision: 1; type: "double" }
+        Property { name: "transientParent"; revision: 13; type: "QWindow"; isPointer: true }
+        Signal {
+            name: "screenChanged"
+            Parameter { name: "screen"; type: "QScreen"; isPointer: true }
+        }
+        Signal {
+            name: "modalityChanged"
+            Parameter { name: "modality"; type: "Qt::WindowModality" }
+        }
+        Signal {
+            name: "windowStateChanged"
+            Parameter { name: "windowState"; type: "Qt::WindowState" }
+        }
+        Signal {
+            name: "windowTitleChanged"
+            revision: 2
+            Parameter { name: "title"; type: "string" }
+        }
+        Signal {
+            name: "xChanged"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Signal {
+            name: "yChanged"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Signal {
+            name: "widthChanged"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Signal {
+            name: "heightChanged"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Signal {
+            name: "minimumWidthChanged"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Signal {
+            name: "minimumHeightChanged"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Signal {
+            name: "maximumWidthChanged"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Signal {
+            name: "maximumHeightChanged"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Signal {
+            name: "visibleChanged"
+            Parameter { name: "arg"; type: "bool" }
+        }
+        Signal {
+            name: "visibilityChanged"
+            revision: 1
+            Parameter { name: "visibility"; type: "QWindow::Visibility" }
+        }
+        Signal { name: "activeChanged"; revision: 1 }
+        Signal {
+            name: "contentOrientationChanged"
+            Parameter { name: "orientation"; type: "Qt::ScreenOrientation" }
+        }
+        Signal {
+            name: "focusObjectChanged"
+            Parameter { name: "object"; type: "QObject"; isPointer: true }
+        }
+        Signal {
+            name: "opacityChanged"
+            revision: 1
+            Parameter { name: "opacity"; type: "double" }
+        }
+        Signal {
+            name: "transientParentChanged"
+            revision: 13
+            Parameter { name: "transientParent"; type: "QWindow"; isPointer: true }
+        }
+        Method { name: "requestActivate"; revision: 1 }
+        Method {
+            name: "setVisible"
+            Parameter { name: "visible"; type: "bool" }
+        }
+        Method { name: "show" }
+        Method { name: "hide" }
+        Method { name: "showMinimized" }
+        Method { name: "showMaximized" }
+        Method { name: "showFullScreen" }
+        Method { name: "showNormal" }
+        Method { name: "close"; type: "bool" }
+        Method { name: "raise" }
+        Method { name: "lower" }
+        Method {
+            name: "startSystemResize"
+            type: "bool"
+            Parameter { name: "edges"; type: "Qt::Edges" }
+        }
+        Method { name: "startSystemMove"; type: "bool" }
+        Method {
+            name: "setTitle"
+            Parameter { type: "string" }
+        }
+        Method {
+            name: "setX"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Method {
+            name: "setY"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Method {
+            name: "setWidth"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Method {
+            name: "setHeight"
+            Parameter { name: "arg"; type: "int" }
+        }
+        Method {
+            name: "setGeometry"
+            Parameter { name: "posx"; type: "int" }
+            Parameter { name: "posy"; type: "int" }
+            Parameter { name: "w"; type: "int" }
+            Parameter { name: "h"; type: "int" }
+        }
+        Method {
+            name: "setGeometry"
+            Parameter { name: "rect"; type: "QRect" }
+        }
+        Method {
+            name: "setMinimumWidth"
+            Parameter { name: "w"; type: "int" }
+        }
+        Method {
+            name: "setMinimumHeight"
+            Parameter { name: "h"; type: "int" }
+        }
+        Method {
+            name: "setMaximumWidth"
+            Parameter { name: "w"; type: "int" }
+        }
+        Method {
+            name: "setMaximumHeight"
+            Parameter { name: "h"; type: "int" }
+        }
+        Method {
+            name: "alert"
+            revision: 1
+            Parameter { name: "msec"; type: "int" }
+        }
+        Method { name: "requestUpdate"; revision: 3 }
+        Method { name: "_q_clearAlert" }
+    }
+}
diff --git a/deployment_test/QtQuick/Window.2/qmldir b/deployment_test/QtQuick/Window.2/qmldir
new file mode 100644
index 0000000000000000000000000000000000000000..fb6202b3bb6c2dd19b3957de6d320224401ad122
--- /dev/null
+++ b/deployment_test/QtQuick/Window.2/qmldir
@@ -0,0 +1,5 @@
+module QtQuick.Window
+plugin windowplugin
+classname QtQuick2WindowPlugin
+typeinfo plugins.qmltypes
+designersupported
diff --git a/deployment_test/QtQuick/Window.2/windowplugin.dll b/deployment_test/QtQuick/Window.2/windowplugin.dll
new file mode 100644
index 0000000000000000000000000000000000000000..c55645762f4e6e3d98fb9eee74818749c10945b1
Binary files /dev/null and b/deployment_test/QtQuick/Window.2/windowplugin.dll differ
diff --git a/deployment_test/bearer/qgenericbearer.dll b/deployment_test/bearer/qgenericbearer.dll
new file mode 100644
index 0000000000000000000000000000000000000000..c495435356f695409188138e0e46f506026526cb
Binary files /dev/null and b/deployment_test/bearer/qgenericbearer.dll differ
diff --git a/deployment_test/iconengines/qsvgicon.dll b/deployment_test/iconengines/qsvgicon.dll
new file mode 100644
index 0000000000000000000000000000000000000000..2baa1addba6b84830c050b1c525d9a476143dbb4
Binary files /dev/null and b/deployment_test/iconengines/qsvgicon.dll differ
diff --git a/deployment_test/imageformats/qgif.dll b/deployment_test/imageformats/qgif.dll
new file mode 100644
index 0000000000000000000000000000000000000000..faa73f8ed1505fbe4f631973afca65f9a05e9cb4
Binary files /dev/null and b/deployment_test/imageformats/qgif.dll differ
diff --git a/deployment_test/imageformats/qicns.dll b/deployment_test/imageformats/qicns.dll
new file mode 100644
index 0000000000000000000000000000000000000000..3c911c1fe9acbd9263971ea7026afcce9ff4ca6a
Binary files /dev/null and b/deployment_test/imageformats/qicns.dll differ
diff --git a/deployment_test/imageformats/qico.dll b/deployment_test/imageformats/qico.dll
new file mode 100644
index 0000000000000000000000000000000000000000..b4c1b3a452fcd386c09584937c918dee015c4c25
Binary files /dev/null and b/deployment_test/imageformats/qico.dll differ
diff --git a/deployment_test/imageformats/qjpeg.dll b/deployment_test/imageformats/qjpeg.dll
new file mode 100644
index 0000000000000000000000000000000000000000..2b37397060283b25742b201709a6be6a35785900
Binary files /dev/null and b/deployment_test/imageformats/qjpeg.dll differ
diff --git a/deployment_test/imageformats/qsvg.dll b/deployment_test/imageformats/qsvg.dll
new file mode 100644
index 0000000000000000000000000000000000000000..0ce1591e6771fac5139692e097a065f60f268f61
Binary files /dev/null and b/deployment_test/imageformats/qsvg.dll differ
diff --git a/deployment_test/imageformats/qtga.dll b/deployment_test/imageformats/qtga.dll
new file mode 100644
index 0000000000000000000000000000000000000000..4b46a2ee79603d8ad80a2a7fe991dd3b673b505e
Binary files /dev/null and b/deployment_test/imageformats/qtga.dll differ
diff --git a/deployment_test/imageformats/qtiff.dll b/deployment_test/imageformats/qtiff.dll
new file mode 100644
index 0000000000000000000000000000000000000000..f518c041b92ec49c0cfd3cafce45b0b8ec6d5c11
Binary files /dev/null and b/deployment_test/imageformats/qtiff.dll differ
diff --git a/deployment_test/imageformats/qwbmp.dll b/deployment_test/imageformats/qwbmp.dll
new file mode 100644
index 0000000000000000000000000000000000000000..b39c881801d81958c4450ff645cd35e02e581143
Binary files /dev/null and b/deployment_test/imageformats/qwbmp.dll differ
diff --git a/deployment_test/imageformats/qwebp.dll b/deployment_test/imageformats/qwebp.dll
new file mode 100644
index 0000000000000000000000000000000000000000..0486e3e51d395e1e4744c1b4dc99d51625487ce0
Binary files /dev/null and b/deployment_test/imageformats/qwebp.dll differ
diff --git a/deployment_test/libEGL.dll b/deployment_test/libEGL.dll
new file mode 100644
index 0000000000000000000000000000000000000000..7195cb20ad68dd4e68e226a91362ac4e16e81e0e
Binary files /dev/null and b/deployment_test/libEGL.dll differ
diff --git a/deployment_test/libGLESv2.dll b/deployment_test/libGLESv2.dll
new file mode 100644
index 0000000000000000000000000000000000000000..4fe7a43302b9f504f7b526c7414af8c7ed5c7819
Binary files /dev/null and b/deployment_test/libGLESv2.dll differ
diff --git a/deployment_test/libstdc++-6.dll b/deployment_test/libstdc++-6.dll
new file mode 100644
index 0000000000000000000000000000000000000000..a7dc1e20bd4a4c9cfba5d184143f6ba14e967937
Binary files /dev/null and b/deployment_test/libstdc++-6.dll differ
diff --git a/deployment_test/opengl32sw.dll b/deployment_test/opengl32sw.dll
new file mode 100644
index 0000000000000000000000000000000000000000..475e82a4162878e51d6a0d204c6e1ee9f9f44d19
Binary files /dev/null and b/deployment_test/opengl32sw.dll differ
diff --git a/deployment_test/platforms/qwindows.dll b/deployment_test/platforms/qwindows.dll
new file mode 100644
index 0000000000000000000000000000000000000000..4aad851e76872483a88a18ea75158dc17e510fa9
Binary files /dev/null and b/deployment_test/platforms/qwindows.dll differ
diff --git a/deployment_test/qmltooling/qmldbg_debugger.dll b/deployment_test/qmltooling/qmldbg_debugger.dll
new file mode 100644
index 0000000000000000000000000000000000000000..6537b2f6534b4b866449d86879d37725864400b7
Binary files /dev/null and b/deployment_test/qmltooling/qmldbg_debugger.dll differ
diff --git a/deployment_test/qmltooling/qmldbg_inspector.dll b/deployment_test/qmltooling/qmldbg_inspector.dll
new file mode 100644
index 0000000000000000000000000000000000000000..2b4fe73fef2b1663417fecc6c9f99ccded658787
Binary files /dev/null and b/deployment_test/qmltooling/qmldbg_inspector.dll differ
diff --git a/deployment_test/qmltooling/qmldbg_local.dll b/deployment_test/qmltooling/qmldbg_local.dll
new file mode 100644
index 0000000000000000000000000000000000000000..308ca08f2638675e640d6f33c0d59aa206c6a51d
Binary files /dev/null and b/deployment_test/qmltooling/qmldbg_local.dll differ
diff --git a/deployment_test/qmltooling/qmldbg_messages.dll b/deployment_test/qmltooling/qmldbg_messages.dll
new file mode 100644
index 0000000000000000000000000000000000000000..98ad4580640333a848172ccf1b58e338e7508cf9
Binary files /dev/null and b/deployment_test/qmltooling/qmldbg_messages.dll differ
diff --git a/deployment_test/qmltooling/qmldbg_native.dll b/deployment_test/qmltooling/qmldbg_native.dll
new file mode 100644
index 0000000000000000000000000000000000000000..42e6344ec1b0f53a1c4e59d2384cce689afc2647
Binary files /dev/null and b/deployment_test/qmltooling/qmldbg_native.dll differ
diff --git a/deployment_test/qmltooling/qmldbg_nativedebugger.dll b/deployment_test/qmltooling/qmldbg_nativedebugger.dll
new file mode 100644
index 0000000000000000000000000000000000000000..09ca1a3f012e257fd7b276da50bc2713e7d89972
Binary files /dev/null and b/deployment_test/qmltooling/qmldbg_nativedebugger.dll differ
diff --git a/deployment_test/qmltooling/qmldbg_preview.dll b/deployment_test/qmltooling/qmldbg_preview.dll
new file mode 100644
index 0000000000000000000000000000000000000000..12d83ffd2eb557b7debcb72279d1274fbe0730fd
Binary files /dev/null and b/deployment_test/qmltooling/qmldbg_preview.dll differ
diff --git a/deployment_test/qmltooling/qmldbg_profiler.dll b/deployment_test/qmltooling/qmldbg_profiler.dll
new file mode 100644
index 0000000000000000000000000000000000000000..c547c21ee2419d4b9aac96163ad5000534db510e
Binary files /dev/null and b/deployment_test/qmltooling/qmldbg_profiler.dll differ
diff --git a/deployment_test/qmltooling/qmldbg_quickprofiler.dll b/deployment_test/qmltooling/qmldbg_quickprofiler.dll
new file mode 100644
index 0000000000000000000000000000000000000000..03d43a913a8d17170e884947ba67c107fbbe6df9
Binary files /dev/null and b/deployment_test/qmltooling/qmldbg_quickprofiler.dll differ
diff --git a/deployment_test/qmltooling/qmldbg_server.dll b/deployment_test/qmltooling/qmldbg_server.dll
new file mode 100644
index 0000000000000000000000000000000000000000..cce5f305fb0c160988c9ea16bee1c5fc2acd40a9
Binary files /dev/null and b/deployment_test/qmltooling/qmldbg_server.dll differ
diff --git a/deployment_test/qmltooling/qmldbg_tcp.dll b/deployment_test/qmltooling/qmldbg_tcp.dll
new file mode 100644
index 0000000000000000000000000000000000000000..232bf7bbab60a0ad7474ca43b340ba448c839a12
Binary files /dev/null and b/deployment_test/qmltooling/qmldbg_tcp.dll differ
diff --git a/deployment_test/styles/qwindowsvistastyle.dll b/deployment_test/styles/qwindowsvistastyle.dll
new file mode 100644
index 0000000000000000000000000000000000000000..dbe23e001e8ca4c561f067254910fa4016083815
Binary files /dev/null and b/deployment_test/styles/qwindowsvistastyle.dll differ
diff --git a/deployment_test/translations/qt_ar.qm b/deployment_test/translations/qt_ar.qm
new file mode 100644
index 0000000000000000000000000000000000000000..a3ce57e7a266300a0d0c88edc3f772e94dc88c64
Binary files /dev/null and b/deployment_test/translations/qt_ar.qm differ
diff --git a/deployment_test/translations/qt_bg.qm b/deployment_test/translations/qt_bg.qm
new file mode 100644
index 0000000000000000000000000000000000000000..b6a990dd4fd9b4d9ddcb5a0d83023bbee9a6257e
Binary files /dev/null and b/deployment_test/translations/qt_bg.qm differ
diff --git a/deployment_test/translations/qt_ca.qm b/deployment_test/translations/qt_ca.qm
new file mode 100644
index 0000000000000000000000000000000000000000..62cca8a31eab744cdcfc0ba682194e5efc541bda
Binary files /dev/null and b/deployment_test/translations/qt_ca.qm differ
diff --git a/deployment_test/translations/qt_cs.qm b/deployment_test/translations/qt_cs.qm
new file mode 100644
index 0000000000000000000000000000000000000000..459ef2664b2420f9cd2b517b53c0d163e25a52f0
Binary files /dev/null and b/deployment_test/translations/qt_cs.qm differ
diff --git a/deployment_test/translations/qt_da.qm b/deployment_test/translations/qt_da.qm
new file mode 100644
index 0000000000000000000000000000000000000000..9b3aa0b263897e45ad4c681f624a89c009ed0ed4
Binary files /dev/null and b/deployment_test/translations/qt_da.qm differ
diff --git a/deployment_test/translations/qt_de.qm b/deployment_test/translations/qt_de.qm
new file mode 100644
index 0000000000000000000000000000000000000000..5fe7f1ae05da6ffd07b9dd3670ed6e29fe4f8a17
Binary files /dev/null and b/deployment_test/translations/qt_de.qm differ
diff --git a/deployment_test/translations/qt_en.qm b/deployment_test/translations/qt_en.qm
new file mode 100644
index 0000000000000000000000000000000000000000..937ea3e78662d66ef3264d8fa715599d03e338ed
Binary files /dev/null and b/deployment_test/translations/qt_en.qm differ
diff --git a/deployment_test/translations/qt_es.qm b/deployment_test/translations/qt_es.qm
new file mode 100644
index 0000000000000000000000000000000000000000..cc291d76299179c37650e68b31f59411190f03d1
Binary files /dev/null and b/deployment_test/translations/qt_es.qm differ
diff --git a/deployment_test/translations/qt_fi.qm b/deployment_test/translations/qt_fi.qm
new file mode 100644
index 0000000000000000000000000000000000000000..ec3c67d351d501ca8be91dd2d4f64e3228cd9f35
Binary files /dev/null and b/deployment_test/translations/qt_fi.qm differ
diff --git a/deployment_test/translations/qt_fr.qm b/deployment_test/translations/qt_fr.qm
new file mode 100644
index 0000000000000000000000000000000000000000..efe353c00051bee288d86f8861d8f94fd0e2fd7b
Binary files /dev/null and b/deployment_test/translations/qt_fr.qm differ
diff --git a/deployment_test/translations/qt_gd.qm b/deployment_test/translations/qt_gd.qm
new file mode 100644
index 0000000000000000000000000000000000000000..f0571d32e0863a4aa385f6d37c2584d152c7a42a
Binary files /dev/null and b/deployment_test/translations/qt_gd.qm differ
diff --git a/deployment_test/translations/qt_he.qm b/deployment_test/translations/qt_he.qm
new file mode 100644
index 0000000000000000000000000000000000000000..4b623a38da00cf46fa8e5bf0e9a3282962d7ddf7
Binary files /dev/null and b/deployment_test/translations/qt_he.qm differ
diff --git a/deployment_test/translations/qt_hu.qm b/deployment_test/translations/qt_hu.qm
new file mode 100644
index 0000000000000000000000000000000000000000..3667c99a6fd2d8a98c6d5ec33dcf7309dd5f733c
Binary files /dev/null and b/deployment_test/translations/qt_hu.qm differ
diff --git a/deployment_test/translations/qt_it.qm b/deployment_test/translations/qt_it.qm
new file mode 100644
index 0000000000000000000000000000000000000000..6fb6e89784473d007cc5add3edf305de78a6511b
Binary files /dev/null and b/deployment_test/translations/qt_it.qm differ
diff --git a/deployment_test/translations/qt_ja.qm b/deployment_test/translations/qt_ja.qm
new file mode 100644
index 0000000000000000000000000000000000000000..67db9800f9351a0248500b9657329cc953c273c0
Binary files /dev/null and b/deployment_test/translations/qt_ja.qm differ
diff --git a/deployment_test/translations/qt_ko.qm b/deployment_test/translations/qt_ko.qm
new file mode 100644
index 0000000000000000000000000000000000000000..7884ba430b10b2222711313bc0a2d6b46f10a47c
Binary files /dev/null and b/deployment_test/translations/qt_ko.qm differ
diff --git a/deployment_test/translations/qt_lv.qm b/deployment_test/translations/qt_lv.qm
new file mode 100644
index 0000000000000000000000000000000000000000..cecea3e25fc58ce0567673dc294cecba128053c0
Binary files /dev/null and b/deployment_test/translations/qt_lv.qm differ
diff --git a/deployment_test/translations/qt_pl.qm b/deployment_test/translations/qt_pl.qm
new file mode 100644
index 0000000000000000000000000000000000000000..e9a5c3f7a604a988f157c050108348b3bfaf1044
Binary files /dev/null and b/deployment_test/translations/qt_pl.qm differ
diff --git a/deployment_test/translations/qt_ru.qm b/deployment_test/translations/qt_ru.qm
new file mode 100644
index 0000000000000000000000000000000000000000..acb898e5475105505c0c51bc9e3b54fdb3c7b989
Binary files /dev/null and b/deployment_test/translations/qt_ru.qm differ
diff --git a/deployment_test/translations/qt_sk.qm b/deployment_test/translations/qt_sk.qm
new file mode 100644
index 0000000000000000000000000000000000000000..df8724884583d313433484ef654f6ebe49e8e6b7
Binary files /dev/null and b/deployment_test/translations/qt_sk.qm differ
diff --git a/deployment_test/translations/qt_tr.qm b/deployment_test/translations/qt_tr.qm
new file mode 100644
index 0000000000000000000000000000000000000000..1dc5f6cdf93e2877b7b905c2678917d4e504905c
Binary files /dev/null and b/deployment_test/translations/qt_tr.qm differ
diff --git a/deployment_test/translations/qt_uk.qm b/deployment_test/translations/qt_uk.qm
new file mode 100644
index 0000000000000000000000000000000000000000..9ff0945795a9fb0ac38600da2b56da835d547e2a
Binary files /dev/null and b/deployment_test/translations/qt_uk.qm differ
diff --git a/deployment_test/translations/qt_zh_TW.qm b/deployment_test/translations/qt_zh_TW.qm
new file mode 100644
index 0000000000000000000000000000000000000000..62052980f2a8a25148aaadd89731ee4f3c5c26e6
Binary files /dev/null and b/deployment_test/translations/qt_zh_TW.qm differ
diff --git a/sourcefiles/POETSvisualizer.pro.user b/sourcefiles/POETSvisualizer.pro.user
index 380abdfb8572caca919429b0b953e46dc1efcb1f..e8e01088f91cc8331b4123450b0e75e604b444a9 100644
--- a/sourcefiles/POETSvisualizer.pro.user
+++ b/sourcefiles/POETSvisualizer.pro.user
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE QtCreatorProject>
-<!-- Written by QtCreator 4.13.3, 2021-05-06T16:15:48. -->
+<!-- Written by QtCreator 4.13.3, 2021-05-06T23:33:03. -->
 <qtcreator>
  <data>
   <variable>EnvironmentId</variable>
diff --git a/sourcefiles/debug/POETSvisualizer.exe b/sourcefiles/debug/POETSvisualizer.exe
index 9b1fedb87d84e102c86da3113d40fe3e4d671573..5f31f2cf11b6d5a4c0711f75c263f566564dc416 100644
Binary files a/sourcefiles/debug/POETSvisualizer.exe and b/sourcefiles/debug/POETSvisualizer.exe differ
diff --git a/sourcefiles/debug/sender.o b/sourcefiles/debug/sender.o
index e444ed24014ef128a55c535087041aadda7d6ed1..a9cd76f6f76885b35c5936b0651e6bc114151979 100644
Binary files a/sourcefiles/debug/sender.o and b/sourcefiles/debug/sender.o differ
diff --git a/sourcefiles/sender.cpp b/sourcefiles/sender.cpp
index 43d1120eb4b573b97456b6a79699e8671d3da7a8..f6acb0007b3f8dee49e0e46d984239b701e49c33 100644
--- a/sourcefiles/sender.cpp
+++ b/sourcefiles/sender.cpp
@@ -113,7 +113,7 @@ void Sender::dummyPacketsValuesTest() {
     while (true) {
         //generate random packet from random location in system
     count++;
-    if (count*0.00001 >= 360) {
+    if (count*0.000001 >= 360) {
         count = 0;
     }
 
@@ -139,7 +139,7 @@ void Sender::dummyPacketsValuesTest() {
     }
 
     //some busy waiting
-    for (int i = 0 ; i < 10 ; i++) {
+    for (int i = 0 ; i < 1000 ; i++) {
         if (true) {
 
         }
@@ -399,8 +399,8 @@ void Sender::removeChartsPage() {
 //thread main
 void Sender::run() {
     qDebug("running");
-   transmitPacket();
- //dummyPacketsValuesTest();
+   //transmitPacket();
+ dummyPacketsValuesTest();
    //dummyPacketsValuesTest2();
     //dummyPackets1();
 
diff --git a/sourcefiles/usersdominappdatalocaltemptmpwmzayx b/sourcefiles/usersdominappdatalocaltemptmpwmzayx
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/test.zip b/test.zip
new file mode 100644
index 0000000000000000000000000000000000000000..3c1b9482d77e0a3f7e103974ebea998dd97534bc
Binary files /dev/null and b/test.zip differ
diff --git a/viva/POETS Visualizer.pptx b/viva/POETS Visualizer.pptx
index 4aa66af6e684390b66d920eb26c9a420cd786eab..1dffcc87a00a1359d29f94298e603ea400d91ed0 100644
Binary files a/viva/POETS Visualizer.pptx and b/viva/POETS Visualizer.pptx differ