diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml
index 9a8ef3109ce58c48830406191282f468027aa99a..fa8a2154c6bb2efea0948737b79378de87364115 100644
--- a/android/AndroidManifest.xml
+++ b/android/AndroidManifest.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="io.qt.qtdesignviewer"
-    android:installLocation="auto" android:versionCode="18" android:versionName="1.2">
+    android:installLocation="auto" android:versionCode="19" android:versionName="1.2">
     <!-- %%INSERT_PERMISSIONS -->
     <!-- %%INSERT_FEATURES -->
     <supports-screens android:anyDensity="true" android:largeScreens="true"
diff --git a/src/backend.cpp b/src/backend.cpp
index 7f598107a5db94d25ff8062bc13ddf9e0e193da2..5562cc9cf4594b3e1ffc502f2dd5711dbcb30fa1 100644
--- a/src/backend.cpp
+++ b/src/backend.cpp
@@ -74,11 +74,10 @@ void Backend::initialize()
         updateUserProjectList();
     }
 
-    connect(&m_serviceConnector, &ServiceConnector::downloadProgress, this, &Backend::downloadProgress);
-    connect(&m_projectManager,
-            &ProjectManager::projectStateChanged,
+    connect(&m_serviceConnector,
+            &ServiceConnector::downloadProgress,
             this,
-            &Backend::popupTextChanged);
+            &Backend::downloadProgress);
 
     qDebug("Initialization complete");
 }
@@ -87,7 +86,23 @@ void Backend::updatePopup(const QString &text, bool indeterminate)
 {
     emit popupTextChanged(text);
     emit popupProgressIndeterminateChanged(indeterminate);
-    QEventLoop().processEvents(QEventLoop::AllEvents, 100);
+    QEventLoop().processEvents(QEventLoop::AllEvents, 1000);
+}
+
+void Backend::initializeProjectManager()
+{
+    if (m_projectManager)
+        return;
+
+    qDebug() << "Initializing Project Manager";
+    m_projectManager.reset(new ProjectManager);
+    connect(m_projectManager.data(), &ProjectManager::closingProject, this, [&] {
+        emit popupClose();
+        qDebug() << "Project Manager is closing";
+        m_projectManager.reset();
+    });
+
+    qDebug() << "Project Manager is initialized";
 }
 
 bool Backend::connectDesignStudio()
@@ -112,13 +127,14 @@ bool Backend::connectDesignStudio()
 
             connect(m_designStudioConnector.data(),
                     &DesignStudioConnector::projectReceived,
-                    &m_projectManager,
+                    this,
                     [this](const QByteArray &projectData) {
                         qDebug() << "Project received from Design Studio";
+                        initializeProjectManager();
                         emit popupOpen();
                         updatePopup("Unpacking project...");
                         qDebug() << "Project data size: " << projectData.size();
-                        const QString projectPath = m_projectManager.unpackProject(projectData);
+                        const QString projectPath = m_projectManager->unpackProject(projectData);
 
                         if (projectPath.isEmpty()) {
                             qCritical()
@@ -131,11 +147,11 @@ bool Backend::connectDesignStudio()
                         qDebug() << "Project unpacked to " << projectPath;
                         updatePopup("Running project...");
 
-                        if (!m_projectManager.runProject(projectPath)) {
+                        if (!m_projectManager->runProject(projectPath)) {
                             qCritical() << "Could not run project. Please check the logs for more "
                                            "information.";
                         } else {
-                            m_projectManager.showAppWindow();
+                            m_projectManager->showAppWindow();
                         }
                         emit popupClose();
                     });
@@ -178,10 +194,11 @@ void Backend::disconnectDesignStudio()
 
 void Backend::runDemoProject(const QString &projectName)
 {
+    initializeProjectManager();
     qDebug() << "Checking if demo project is cached for " << projectName;
     emit popupOpen();
 
-    const bool cached = m_projectManager.isDemoProjectCached(projectName);
+    const bool cached = m_projectManager->isDemoProjectCached(projectName);
 
     if (!cached) {
         updatePopup("Downloading demo project...", false);
@@ -191,7 +208,7 @@ void Backend::runDemoProject(const QString &projectName)
         qDebug() << "Demo project is not cached. Trying to download from " << url << " ...";
 
         updatePopup("Caching demo project...");
-        if (!m_projectManager.cacheDemoProject(project, projectName)) {
+        if (!m_projectManager->cacheDemoProject(project, projectName)) {
             qCritical()
                 << "Could not cache demo project. Please check the logs for more information.";
             emit popupClose();
@@ -202,10 +219,12 @@ void Backend::runDemoProject(const QString &projectName)
     }
 
     updatePopup("Running demo project...");
-    if (!m_projectManager.runDemoProject(projectName))
+    if (!m_projectManager->runDemoProject(projectName))
         qCritical() << "Could not run demo project. Please check the logs for more information.";
-    else
-        m_projectManager.showAppWindow();
+    else {
+        updatePopup("Showing the app window...");
+        m_projectManager->showAppWindow();
+    }
 
     emit popupClose();
 }
@@ -214,12 +233,15 @@ void Backend::clearDemoCaches()
 {
     emit popupOpen();
     updatePopup("Clearing demo caches...");
-    m_projectManager.clearDemoCaches();
+    m_projectManager.reset(new ProjectManager);
+    m_projectManager->clearDemoCaches();
+    m_projectManager.reset();
     emit popupClose();
 }
 
 void Backend::runUserProject(const QString &url)
 {
+    initializeProjectManager();
     updatePopup("Running user project");
     emit popupOpen();
 
@@ -236,7 +258,7 @@ void Backend::runUserProject(const QString &url)
         }
     }
 
-    const bool projectCached = m_projectManager.isProjectCached(projectInfo);
+    const bool projectCached = m_projectManager->isProjectCached(projectInfo);
 
     if (!projectCached) {
         qDebug("Project is not cached. Downloading...");
@@ -244,20 +266,21 @@ void Backend::runUserProject(const QString &url)
         QByteArray projectData = m_serviceConnector.fetchProject(url);
 
         updatePopup("Caching user project...");
-        if (!m_projectManager.cacheProject(projectData, projectInfo)) {
+        if (!m_projectManager->cacheProject(projectData, projectInfo)) {
             qCritical() << "Could not cache project. Please check the logs for more information.";
             emit popupClose();
             return;
         }
-    } else {
-        qDebug("Project is cached. Running cached project...");
     }
 
+    qDebug("Project is cached. Running cached project...");
     updatePopup("Running cached project...");
-    if (!m_projectManager.runCachedProject(projectInfo))
+    if (!m_projectManager->runCachedProject(projectInfo))
         qCritical() << "Could not run project. Please check the logs for more information.";
-    else
-        m_projectManager.showAppWindow();
+    else {
+        updatePopup("Showing the app window...");
+        m_projectManager->showAppWindow();
+    }
 
     emit popupClose();
 }
diff --git a/src/backend.h b/src/backend.h
index 4d9dae1844d954e95f7be4ea88fc42ad2e2599b8..13aa6a5d71d7c126c680eb5643b9447a110652cf 100644
--- a/src/backend.h
+++ b/src/backend.h
@@ -58,7 +58,7 @@ private:
     // Other members
     QString m_userHash;
     ServiceConnector m_serviceConnector;
-    ProjectManager m_projectManager;
+    QScopedPointer<ProjectManager> m_projectManager;
     QScopedPointer<DesignStudioConnector> m_designStudioConnector;
     QThread m_dsConnectorThread;
 
@@ -86,6 +86,9 @@ public slots:
     void registerUser(const QUrl &url);
     bool connectDesignStudio();
     void disconnectDesignStudio();
+
+private slots:
+    void initializeProjectManager();
 };
 
 #endif // DV_ANDROID_H
diff --git a/src/projectManager.cpp b/src/projectManager.cpp
index 83c4734bd3327e21d1dd30c9ed5131d3b3032187..090b8de4489d09e233cae2f01eddd95031f1803e 100644
--- a/src/projectManager.cpp
+++ b/src/projectManager.cpp
@@ -241,9 +241,6 @@ bool ProjectManager::runProject(const QString &projectPath)
                          }
                      });
 
-    emit projectStateChanged("Loading project...");
-    QEventLoop().processEvents(QEventLoop::AllEvents, 1000);
-
     qDebug() << "Loading mainQmlUrl: " << mainQmlUrl.toString();
     m_qmlComponent.reset(new QQmlComponent(m_qmlEngine.data()));
 
@@ -265,9 +262,6 @@ bool ProjectManager::runProject(const QString &projectPath)
         return false;
     }
 
-    emit projectStateChanged("Setting up the quickWindow...");
-    QEventLoop().processEvents(QEventLoop::AllEvents, 1000);
-
     qDebug() << "Setting up the quickWindow";
     m_quickWindow.reset(qobject_cast<QQuickWindow *>(topLevel));
     if (m_quickWindow) {
@@ -503,9 +497,10 @@ void ProjectManager::showAppWindow()
 
     connect(m_quickWindow.data(), &QQuickWindow::closing, this, [this, screen]() {
         qDebug() << "QML app window is closing";
-        m_qmlEngine.reset();
-        m_qmlComponent.reset();
         disconnect(screen, &QScreen::orientationChanged, this, &ProjectManager::orientateWindow);
+        // this signal is connected to the lambda in the backend
+        // which will reset the project manager
+        emit closingProject();
     });
 
     m_quickWindow->setFlags(Qt::Window | Qt::WindowStaysOnTopHint);
diff --git a/src/projectManager.h b/src/projectManager.h
index 6fad257544a894c3fc000bae78c29803c597dbab..6bfbf141bfb047531abd498fb4d4be181ed678a6 100644
--- a/src/projectManager.h
+++ b/src/projectManager.h
@@ -80,7 +80,7 @@ private:
     void cacheProject(const QString &projectName, const QString &projectPath);
 
 signals:
-    void projectStateChanged(const QString &state);
+    void closingProject();
 };
 
 #endif // PROJECTMANAGER_H