diff --git a/src/androiddeployqt/main.cpp b/src/androiddeployqt/main.cpp
index dd5b74bd6101e4a5b1c056422a4fb8fa1112cbd2..51b514f51ab6aa69b331b6bfaee344e791af0fb4 100644
--- a/src/androiddeployqt/main.cpp
+++ b/src/androiddeployqt/main.cpp
@@ -774,7 +774,8 @@ bool readInputFile(Options *options)
     {
         const QJsonValue deploymentDependencies = jsonObject.value(QStringLiteral("deployment-dependencies"));
         if (!deploymentDependencies.isUndefined()) {
-            const auto dependencies = deploymentDependencies.toString().splitRef(QLatin1Char(','));
+            QString deploymentDependenciesString = deploymentDependencies.toString();
+            const auto dependencies = deploymentDependenciesString.splitRef(QLatin1Char(','));
             for (const QStringRef &dependency : dependencies) {
                 QString path = options->qtInstallDirectory + QLatin1Char('/') + dependency;
                 if (QFileInfo(path).isDir()) {
diff --git a/src/designer/src/components/formeditor/formwindow.h b/src/designer/src/components/formeditor/formwindow.h
index bda20077fd260b1937b00e741678d8f987ebb235..aca3547287a26c20be0155c7741632aabfe2759c 100644
--- a/src/designer/src/components/formeditor/formwindow.h
+++ b/src/designer/src/components/formeditor/formwindow.h
@@ -70,6 +70,13 @@ class QT_FORMEDITOR_EXPORT FormWindow: public FormWindowBase
     Q_OBJECT
 
 public:
+    enum HandleOperation
+    {
+        NoHandleOperation,
+        ResizeHandleOperation,
+        ChangeLayoutSpanHandleOperation
+    };
+
     explicit FormWindow(FormEditor *core, QWidget *parent = 0, Qt::WindowFlags flags = 0);
     virtual ~FormWindow();
 
@@ -199,6 +206,9 @@ public:
 
     bool eventFilter(QObject *watched, QEvent *event) Q_DECL_OVERRIDE;
 
+    HandleOperation handleOperation() const { return m_handleOperation; }
+    void setHandleOperation(HandleOperation o) { m_handleOperation = o; }
+
 signals:
     void contextMenuRequested(QMenu *menu, QWidget *widget);
 
@@ -354,6 +364,7 @@ private:
     QStringList m_includeHints;
 
     QPoint m_contextMenuPosition;
+    HandleOperation m_handleOperation = NoHandleOperation;
 
 private:
     friend class WidgetEditorTool;
diff --git a/src/designer/src/components/formeditor/formwindowmanager.cpp b/src/designer/src/components/formeditor/formwindowmanager.cpp
index 2cccd851ef915a0238fa1d8a158401a99f7bbed3..0341c920b3d1d9145fe629406df6940a142fb580 100644
--- a/src/designer/src/components/formeditor/formwindowmanager.cpp
+++ b/src/designer/src/components/formeditor/formwindowmanager.cpp
@@ -209,6 +209,14 @@ bool FormWindowManager::eventFilter(QObject *o, QEvent *e)
             return true;
         }
         switch (eventType) {
+        case QEvent::LayoutRequest:
+            // QTBUG-61439: Suppress layout request while changing the QGridLayout
+            // span of a QTabWidget, which sends LayoutRequest in resizeEvent().
+            if (fw->handleOperation() == FormWindow::ChangeLayoutSpanHandleOperation) {
+                e->ignore();
+                return true;
+            }
+            break;
 
         case QEvent::WindowActivate: {
             if (fw->parentWidget()->isWindow() && fw->isMainContainer(managedWidget) && activeFormWindow() != fw) {
diff --git a/src/designer/src/components/formeditor/widgetselection.cpp b/src/designer/src/components/formeditor/widgetselection.cpp
index eda77e213110016b7914784047778875cd49c667..fcb54de9211af810fc510e95edf00387ae525e31 100644
--- a/src/designer/src/components/formeditor/widgetselection.cpp
+++ b/src/designer/src/components/formeditor/widgetselection.cpp
@@ -178,6 +178,17 @@ void WidgetHandle::mousePressEvent(QMouseEvent *e)
 
     m_origPressPos = container->mapFromGlobal(e->globalPos());
     m_geom = m_origGeom = m_widget->geometry();
+
+    switch (WidgetSelection::widgetState(m_formWindow->core(), m_widget)) {
+    case WidgetSelection::UnlaidOut:
+    case WidgetSelection::LaidOut:
+        m_formWindow->setHandleOperation(FormWindow::ResizeHandleOperation);
+        break;
+    case WidgetSelection::ManagedGridLayout:
+    case WidgetSelection::ManagedFormLayout:
+        m_formWindow->setHandleOperation(FormWindow::ChangeLayoutSpanHandleOperation);
+        break;
+    }
 }
 
 void WidgetHandle::mouseMoveEvent(QMouseEvent *e)
@@ -326,6 +337,8 @@ void WidgetHandle::mouseMoveEvent(QMouseEvent *e)
 
 void WidgetHandle::mouseReleaseEvent(QMouseEvent *e)
 {
+    m_formWindow->setHandleOperation(FormWindow::NoHandleOperation);
+
     if (e->button() != Qt::LeftButton || !m_active)
         return;
 
diff --git a/src/designer/src/uitools/quiloader_p.h b/src/designer/src/uitools/quiloader_p.h
index f9371fac48b963771e823df102cc4fa82092d59d..86e970f49bbeaeed12df0e1cc6857978a6fc85bf 100644
--- a/src/designer/src/uitools/quiloader_p.h
+++ b/src/designer/src/uitools/quiloader_p.h
@@ -1,11 +1,11 @@
 /****************************************************************************
 **
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2017 The Qt Company Ltd.
 ** Contact: https://www.qt.io/licensing/
 **
 ** This file is part of the Qt Designer of the Qt Toolkit.
 **
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** $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
@@ -14,13 +14,24 @@
 ** 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 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** 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-3.0.html.
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
 **
 ** $QT_END_LICENSE$
 **
diff --git a/src/windeployqt/main.cpp b/src/windeployqt/main.cpp
index 8ec4a6205b9b5d3708523c65032aa83057f23194..8ed6fffdfd2632da68a3b1dc42d6113bde6059fa 100644
--- a/src/windeployqt/main.cpp
+++ b/src/windeployqt/main.cpp
@@ -817,7 +817,8 @@ static const PluginModuleMapping pluginModuleMappings[] =
     {"qtwebengine", QtWebEngineModule | QtWebEngineCoreModule | QtWebEngineWidgetsModule},
     {"styles", QtWidgetsModule},
     {"sceneparsers", Qt3DRendererModule},
-    {"renderplugins", Qt3DRendererModule}
+    {"renderplugins", Qt3DRendererModule},
+    {"geometryloaders", Qt3DRendererModule}
 };
 
 static inline quint64 qtModuleForPlugin(const QString &subDirName)
@@ -1048,7 +1049,10 @@ static QString vcRedistDir()
     const QFileInfoList subDirs =
         QDir(vc2017RedistDirName).entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name | QDir::Reversed);
     for (const QFileInfo &f : subDirs) {
-        const QString path = f.absoluteFilePath();
+        QString path = f.absoluteFilePath();
+        if (QFileInfo(path + slash + vcDebugRedistDir()).isDir())
+            return path;
+        path += QStringLiteral("/onecore");
         if (QFileInfo(path + slash + vcDebugRedistDir()).isDir())
             return path;
     }
@@ -1547,6 +1551,7 @@ static bool deployWebEngineCore(const QMap<QString, QString> &qmakeVariables,
                                 const Options &options, bool isDebug, QString *errorMessage)
 {
     static const char *installDataFiles[] = {"icudtl.dat",
+                                             "qtwebengine_devtools_resources.pak",
                                              "qtwebengine_resources.pak",
                                              "qtwebengine_resources_100p.pak",
                                              "qtwebengine_resources_200p.pak"};
diff --git a/src/windeployqt/qmlutils.cpp b/src/windeployqt/qmlutils.cpp
index 9e8bb09e25eff1ae4b0b4014baf3250135121bdc..52f04406893000c5d5f658a6534910d29809c0df 100644
--- a/src/windeployqt/qmlutils.cpp
+++ b/src/windeployqt/qmlutils.cpp
@@ -39,6 +39,11 @@
 
 QT_BEGIN_NAMESPACE
 
+bool operator==(const QmlImportScanResult::Module &m1, const QmlImportScanResult::Module &m2)
+{
+    return m1.className.isEmpty() ? m1.name == m2.name : m1.className == m2.className;
+}
+
 // Return install path (cp -r semantics)
 QString QmlImportScanResult::Module::installPath(const QString &root) const
 {
@@ -153,19 +158,10 @@ QmlImportScanResult runQmlImportScanner(const QString &directory, const QString
     return result;
 }
 
-static inline bool contains(const QList<QmlImportScanResult::Module> &modules, const QString &className)
-{
-    for (const QmlImportScanResult::Module &m : modules) {
-        if (m.className == className)
-            return true;
-    }
-    return false;
-}
-
 void QmlImportScanResult::append(const QmlImportScanResult &other)
 {
     for (const QmlImportScanResult::Module &module : other.modules) {
-        if (!contains(modules, module.className))
+        if (std::find(modules.cbegin(), modules.cend(), module) == modules.cend())
             modules.append(module);
     }
     for (const QString &plugin : other.plugins) {
diff --git a/src/windeployqt/qmlutils.h b/src/windeployqt/qmlutils.h
index 5e1ddc619838a8bfea82e862452d0858363f678c..895c7f1de79f6dce05bda298a7e4f0a4394b5fe7 100644
--- a/src/windeployqt/qmlutils.h
+++ b/src/windeployqt/qmlutils.h
@@ -55,6 +55,8 @@ struct QmlImportScanResult {
     QStringList plugins;
 };
 
+bool operator==(const QmlImportScanResult::Module &m1, const QmlImportScanResult::Module &m2);
+
 QmlImportScanResult runQmlImportScanner(const QString &directory, const QString &qmlImportPath,
                                         bool usesWidgets, int platform, DebugMatchMode debugMatchMode,
                                         QString *errorMessage);
diff --git a/src/winrtrunner/appxlocalengine.cpp b/src/winrtrunner/appxlocalengine.cpp
index 3c89d715c5c9799a7f26a353373721c01cf61c4a..d7cf35b312e75d6aff0222bf6573afef1085aadd 100644
--- a/src/winrtrunner/appxlocalengine.cpp
+++ b/src/winrtrunner/appxlocalengine.cpp
@@ -412,18 +412,6 @@ bool AppxLocalEngine::installPackage(IAppxManifestReader *reader, const QString
         return false;
     }
 
-    ComPtr<IAsyncInfo> asyncInfo;
-    hr = deploymentOperation.As(&asyncInfo);
-    RETURN_FALSE_IF_FAILED("Failed to cast deployment operation to info.");
-    AsyncStatus status;
-    hr = asyncInfo->get_Status(&status);
-    RETURN_FALSE_IF_FAILED("Failed to retrieve deployment operation's status.");
-
-    if (status != Completed) {
-        qCWarning(lcWinRtRunner) << "Deployment operation did not succeed.";
-        return false;
-    }
-
     ComPtr<IDeploymentResult> results;
     hr = deploymentOperation->GetResults(&results);
     RETURN_FALSE_IF_FAILED("Failed to retrieve package registration results.");
@@ -433,10 +421,15 @@ bool AppxLocalEngine::installPackage(IAppxManifestReader *reader, const QString
     RETURN_FALSE_IF_FAILED("Failed to retrieve extended error code.");
 
     if (FAILED(errorCode)) {
-        HString errorText;
-        if (SUCCEEDED(results->get_ErrorText(errorText.GetAddressOf()))) {
-            qCWarning(lcWinRtRunner) << "Unable to register package:"
-                                     << QString::fromWCharArray(errorText.GetRawBuffer(NULL));
+        if (HRESULT_CODE(errorCode) == ERROR_INSTALL_PREREQUISITE_FAILED) {
+            qCWarning(lcWinRtRunner) << "Unable to register package: A requirement for installation was not met. "
+                "Check that your Windows version matches TargetDeviceFamily's MinVersion set in your AppxManifest.xml.";
+        } else {
+            HString errorText;
+            if (SUCCEEDED(results->get_ErrorText(errorText.GetAddressOf()))) {
+                qCWarning(lcWinRtRunner) << "Unable to register package:"
+                    << QString::fromWCharArray(errorText.GetRawBuffer(NULL));
+            }
         }
         if (HRESULT_CODE(errorCode) == ERROR_INSTALL_POLICY_FAILURE) {
             // The user's license has expired. Give them the opportunity to renew it.