diff --git a/cicd/stages/build.yml b/cicd/stages/build.yml
index 73af01b906f84ea16ecd27b72a65d72ecc13eea4..659a333daf0c01900ae15d0595f289b5ccbdffa4 100644
--- a/cicd/stages/build.yml
+++ b/cicd/stages/build.yml
@@ -40,6 +40,7 @@
     -DANDROID_OPENSSL_PATH=${QDS_CI_JOB_OPENSSL_PATH} \
     -DGOOGLE_PLAY_APP_VERSION=${GOOGLE_PLAY_APP_VERSION} \
     -DBUILD_EXAMPLES=OFF
+  - cat ${QDS_CI_JOB_BUILD_PATH}/src/dynamic_imports.qml
   - cmake --build ${QDS_CI_JOB_BUILD_PATH} --target aab
 
 .copy-and-sign-apks: &copy-and-sign-apks
@@ -118,4 +119,5 @@ build-desktop:
       -DCMAKE_BUILD_TYPE=Release \
       -DCMAKE_PREFIX_PATH=${QDS_CI_JOB_QT_PATH} \
       -DBUILD_EXAMPLES=OFF
+    - cat ${QDS_CI_JOB_BUILD_PATH}/src/dynamic_imports.qml
     - cmake --build ${QDS_CI_JOB_BUILD_PATH}
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 327a9b65bc3c2665816fe7f8b6494c69315aa08c..2188ab774e9e6918e732c858e558ec55db8255ee 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -46,12 +46,26 @@ foreach(imported_target IN LISTS imported_targets)
         _qt_qml_module_installed_plugin_target)
 
     if(qml_plugin_target)
-        message(STATUS
-            "Imported target: ${imported_target} -> ${qml_plugin_target}")
+
+    message(STATUS
+    "Imported target: ${imported_target} -> ${qml_plugin_target}")
 
         # Get location of the plugin file.
-        get_target_property(imported_location "${qml_plugin_target}" IMPORTED_LOCATION)
-        if(NOT EXISTS "${imported_location}")
+        get_target_property(imported_location_default "${qml_plugin_target}" IMPORTED_LOCATION)
+        get_target_property(imported_location_release "${qml_plugin_target}" IMPORTED_LOCATION_RELEASE)
+        get_target_property(imported_location_min_size "${qml_plugin_target}" IMPORTED_LOCATION_MINSIZEREL)
+        get_target_property(imported_location_min_size_rel "${qml_plugin_target}" IMPORTED_LOCATION_RELWITHDEBINFO)
+
+        if(imported_location_default)
+            set(imported_location "${imported_location_default}")
+        elseif(imported_location_release)
+            set(imported_location "${imported_location_release}")
+        elseif(imported_location_min_size)
+            set(imported_location "${imported_location_min_size}")
+        elseif(imported_location_min_size_rel)
+            set(imported_location "${imported_location_min_size_rel}")
+        else()
+            message(WARNING "No imported location found for ${qml_plugin_target}.")
             continue()
         endif()
 
@@ -62,12 +76,14 @@ foreach(imported_target IN LISTS imported_targets)
         # to the plugin file. That's at least usually the case for Qt qml plugins.
         set(qmldir_path "${imported_location_dir}/qmldir")
         if(NOT EXISTS "${qmldir_path}")
+            message(WARNING "No qmldir file found for ${qml_plugin_target}.")
             continue()
         endif()
 
         # Read qmldir file contents.
         file(READ "${qmldir_path}" qmldir_content)
         if(qmldir_content STREQUAL "")
+            message(WARNING "Empty qmldir for ${qml_plugin_target}.")
             continue()
         endif()
 
diff --git a/src/backend/dsconnector/dsmanager.cpp b/src/backend/dsconnector/dsmanager.cpp
index 29d301f038de4ef740ed2d362f00b57cdffe8591..1c1e6028c5af3b51b281d0ced2695ebaa61c0540 100644
--- a/src/backend/dsconnector/dsmanager.cpp
+++ b/src/backend/dsconnector/dsmanager.cpp
@@ -39,7 +39,10 @@ void DesignStudioManager::init()
 
         QUdpSocket udpSocket;
         const int port = 53452;
+
+#ifdef Q_OS_ANDROID
         udpSocket.writeDatagram(datagram, QHostAddress::LocalHost, port);
+#endif
         udpSocket.writeDatagram(datagram, QHostAddress::Broadcast, port);
         udpSocket.writeDatagram(datagram, QHostAddress::AnyIPv4, port);
         udpSocket.writeDatagram(datagram, QHostAddress::AnyIPv6, port);
diff --git a/src/backend/main.cpp b/src/backend/main.cpp
index 79bca5d3c614f9af69ae9d6511bd6fc5f87c287f..237cac5ef5b9e9c8f6130742d5eab4640c675c42 100644
--- a/src/backend/main.cpp
+++ b/src/backend/main.cpp
@@ -48,7 +48,12 @@ int main(int argc, char *argv[])
     view.engine()->rootContext()->setContextProperty("backend", &backend);
     view.setSource(QUrl(QStringLiteral("qrc:/qt/qml/AndroidUI/Main.qml")));
     view.setResizeMode(QQuickView::SizeRootObjectToView);
+
+#ifdef Q_OS_ANDROID
     view.showMaximized();
+#else
+    view.show();
+#endif
 
     return app.exec();
 }
diff --git a/src/backend/projectmanager.cpp b/src/backend/projectmanager.cpp
index e28f7aaa16ab856a984c54e2c24da6d63893e863..016e710ce2bdcad478c1f14d07b46a5254ba542e 100644
--- a/src/backend/projectmanager.cpp
+++ b/src/backend/projectmanager.cpp
@@ -135,9 +135,12 @@ QString ProjectManager::unpackProject(const QByteArray &project)
     return resourcePath;
 }
 
-QString ProjectManager::findFile(const QString &dir, const QString &filter)
+QString ProjectManager::findFile(const QString &dir, const QString &filter, const bool recursive)
 {
-    QDirIterator it(dir, {filter}, QDir::Files);
+    QDirIterator it(dir,
+                    {filter},
+                    QDir::Files,
+                    recursive ? QDirIterator::Subdirectories : QDirIterator::NoIteratorFlags);
     return it.next();
 }
 
@@ -203,7 +206,7 @@ bool ProjectManager::runProjectInternal(const QByteArray &project)
     const QString projectPath = unpackProject(project);
     qDebug() << "Project location: " << projectPath;
 
-    const QString qmlProjectFile = findFile(projectPath, "*.qmlproject");
+    const QString qmlProjectFile = findFile(projectPath, "*.qmlproject", false);
     if (qmlProjectFile.isEmpty()) {
         qCritical() << "No \"*.qmlproject\" found in \"" << projectPath << "\".";
         return false;
@@ -217,7 +220,7 @@ bool ProjectManager::runProjectInternal(const QByteArray &project)
     if (mainQmlFilePath.isEmpty())
         return false;
 
-    const QString qtquickcontrols2File = findFile(projectPath, "qtquickcontrols2.conf");
+    const QString qtquickcontrols2File = findFile(projectPath, "qtquickcontrols2.conf", false);
     if (!qtquickcontrols2File.isEmpty()) {
         qputenv("QT_QUICK_CONTROLS_CONF", qtquickcontrols2File.toLatin1());
     }
diff --git a/src/backend/projectmanager.h b/src/backend/projectmanager.h
index 515ecdf8ea73a3710c9f22457473674c45cced57..ae12e3cf6ca38d8f2b3d90c2a1ead4646d0c3f82 100644
--- a/src/backend/projectmanager.h
+++ b/src/backend/projectmanager.h
@@ -62,7 +62,7 @@ private:
 
     // project management
     bool runProjectInternal(const QByteArray &project);
-    QString findFile(const QString &dir, const QString &filter);
+    QString findFile(const QString &dir, const QString &filter, const bool recursive = true);
     QString readQmlProjectFile(const QString &qmlProjectFilePath);
     QString getMainQmlFile(const QString &projectPath, const QString &qmlProjectFileContent);
     QStringList getImportPaths(const QString &projectPath, const QString &qmlProjectFileContent);