diff --git a/app/dockview.cpp b/app/dockview.cpp
index b51979248..f9a35b353 100644
--- a/app/dockview.cpp
+++ b/app/dockview.cpp
@@ -299,6 +299,15 @@ void DockView::initSignalingForLocationChangeSliding()
     });
 }
 
+void DockView::disconnectSensitiveSignals()
+{
+    disconnect(corona(), &Plasma::Corona::availableScreenRectChanged, this, &DockView::availableScreenRectChanged);
+
+    if (visibility()) {
+        visibility()->setEnabledDynamicBackground(false);
+    }
+}
+
 void DockView::availableScreenRectChanged()
 {
     if (m_inDelete)
diff --git a/app/dockview.h b/app/dockview.h
index 57e1c6276..5e0008ccd 100644
--- a/app/dockview.h
+++ b/app/dockview.h
@@ -181,6 +181,10 @@ public:
     static QScreen *atScreens(QQmlListProperty<QScreen> *property, int index);
     void reconsiderScreen();
 
+    //! these are signals that create crashes, such a example is the availableScreenRectChanged from corona
+    //! when its containment is destroyed
+    void disconnectSensitiveSignals();
+
 public slots:
     Q_INVOKABLE void addNewDock();
     Q_INVOKABLE void removeDock();
diff --git a/app/layout.cpp b/app/layout.cpp
index 0f8161143..50a497287 100644
--- a/app/layout.cpp
+++ b/app/layout.cpp
@@ -64,6 +64,30 @@ void Layout::unloadContainments()
 
     qDebug() << "Layout - " + name() + " unload: containments ... size: " << m_containments.size();
 
+    foreach (auto view, m_dockViews) {
+        view->disconnectSensitiveSignals();
+    }
+
+    foreach (auto view, m_waitingDockViews) {
+        view->disconnectSensitiveSignals();
+    }
+
+    QList<Plasma::Containment *> systrays;
+
+    //!identify systrays and unload them first
+    foreach (auto containment, m_containments) {
+        if (Plasma::Applet *parentApplet = qobject_cast<Plasma::Applet *>(containment->parent())) {
+            systrays.append(containment);
+        }
+    }
+
+    while (!systrays.isEmpty()) {
+        Plasma::Containment *systray = systrays.at(0);
+        systrays.removeFirst();
+        m_containments.removeAll(systray);
+        delete systray;
+    }
+
     while (!m_containments.isEmpty()) {
         Plasma::Containment *containment = m_containments.at(0);
         m_containments.removeFirst();