diff --git a/containment/contents/ui/VisibilityManager.qml b/containment/contents/ui/VisibilityManager.qml
index 94b81831f..aaf23345e 100644
--- a/containment/contents/ui/VisibilityManager.qml
+++ b/containment/contents/ui/VisibilityManager.qml
@@ -134,7 +134,7 @@ Item{
 
     function slotMustBeHide() {
         // console.log("hide....");
-        if(!dock.visibility.blockHiding && !dock.visibility.containsMouse && windowSystem.compositingActive) {
+        if(!dock.visibility.blockHiding && !dock.visibility.containsMouse && Latte.WindowSystem.compositingActive) {
             slidingAnimationAutoHiddenOut.init();
         }
     }
@@ -149,7 +149,7 @@ Item{
         var localY = 0;
 
         normalState = ((root.animationsNeedBothAxis === 0) && (root.animationsNeedLength === 0))
-                || !windowSystem.compositingActive
+                || !Latte.WindowSystem.compositingActive
                 || (dock.visibility.isHidden && !dock.visibility.containsMouse && root.animationsNeedThickness == 0);
 
         // debug maskArea criteria
@@ -183,11 +183,11 @@ Item{
             tempThickness = thicknessNormal;
 
             if (root.animationsNeedThickness > 0) {
-                tempThickness = windowSystem.compositingActive ? thicknessMidOriginal : thicknessNormalOriginal;
+                tempThickness = Latte.WindowSystem.compositingActive ? thicknessMidOriginal : thicknessNormalOriginal;
             }
 
             if (dock.visibility.isHidden && !slidingAnimationAutoHiddenOut.running ) {
-                tempThickness = windowSystem.compositingActive ? thicknessAutoHidden : thicknessNormalOriginal;
+                tempThickness = Latte.WindowSystem.compositingActive ? thicknessAutoHidden : thicknessNormalOriginal;
             }
 
             //configure x,y based on plasmoid position and root.panelAlignment(Alignment)
@@ -241,14 +241,14 @@ Item{
                 tempThickness = root.editMode ? editModeThickness : thicknessNormalOriginal;
 
                 if (dock.visibility.isHidden && !slidingAnimationAutoHiddenOut.running ) {
-                    tempThickness = windowSystem.compositingActive ? thicknessAutoHidden : thicknessNormalOriginal;
+                    tempThickness = Latte.WindowSystem.compositingActive ? thicknessAutoHidden : thicknessNormalOriginal;
                 } else if (root.animationsNeedThickness > 0) {
                     tempThickness = thicknessMidOriginal;
                 }
             } else{
                 //use all thickness space
                 if (dock.visibility.isHidden && !slidingAnimationAutoHiddenOut.running ) {
-                    tempThickness = windowSystem.compositingActive ? thicknessAutoHidden : thicknessNormalOriginal;
+                    tempThickness = Latte.WindowSystem.compositingActive ? thicknessAutoHidden : thicknessNormalOriginal;
                 } else {
                     tempThickness = thicknessZoomOriginal;
                 }
diff --git a/containment/contents/ui/main.qml b/containment/contents/ui/main.qml
index d0cc6a7ad..052a8e3c0 100644
--- a/containment/contents/ui/main.qml
+++ b/containment/contents/ui/main.qml
@@ -106,7 +106,7 @@ DragDrop.DropArea {
                                                   ( plasmoid.configuration.panelPosition === Latte.Dock.Justify ?
                                                        Latte.Dock.Center : plasmoid.configuration.panelPosition )
 
-    property real zoomFactor: (windowSystem.compositingActive && durationTime>0) ? ( 1 + (plasmoid.configuration.zoomLevel / 20) ) : 1
+    property real zoomFactor: (Latte.WindowSystem.compositingActive && durationTime>0) ? ( 1 + (plasmoid.configuration.zoomLevel / 20) ) : 1
 
     readonly property string plasmoidName: "org.kde.latte.plasmoid"
 
@@ -154,7 +154,7 @@ DragDrop.DropArea {
                                     layoutsContainer.height + 0.5*iconMargin : mainLayout.height + iconMargin) :
                                Screen.height //on unlocked state use the maximum*/
 
-    Plasmoid.backgroundHints: windowSystem.compositingActive ? PlasmaCore.Types.NoBackground : PlasmaCore.Types.DefaultBackground
+    Plasmoid.backgroundHints: Latte.WindowSystem.compositingActive ? PlasmaCore.Types.NoBackground : PlasmaCore.Types.DefaultBackground
 
     //// BEGIN properties in functions
     property int noApplets: {
@@ -1049,14 +1049,16 @@ DragDrop.DropArea {
 
 
     ////BEGIN interfaces
-    Latte.WindowSystem {
-        id:windowSystem
 
-        onCompositingActiveChanged:{
+    Connections {
+        target: Latte.WindowSystem
+
+        onCompositingActiveChanged: {
             visibilityManager.updateMaskArea();
         }
     }
 
+
     ////END interfaces
 
     ///////////////BEGIN components
@@ -1095,7 +1097,7 @@ DragDrop.DropArea {
             // FIX IT && TEST IT: it is crashing Plasma with two Now Docks one of which has only
             // task manager (small)
             //active: root.useThemePanel
-            active: windowSystem.compositingActive
+            active: Latte.WindowSystem.compositingActive
             sourceComponent: PanelBox{}
 
         }
@@ -1165,14 +1167,14 @@ DragDrop.DropArea {
 
         x: {
             if ( dock && (plasmoid.configuration.panelPosition === Latte.Dock.Justify) && root.isHorizontal
-                    && !root.editMode && windowSystem.compositingActive && !root.drawShadowsExternal ){
+                    && !root.editMode && Latte.WindowSystem.compositingActive && !root.drawShadowsExternal ){
                 return ((dock.width/2) - (root.maxLength/2))
             } else {
                 if ((visibilityManager.inSlidingIn || visibilityManager.inSlidingOut) && root.isVertical){
                     return;
                 }
 
-                if (dock.visibility.isHidden && windowSystem.compositingActive && root.isVertical) {
+                if (dock.visibility.isHidden && Latte.WindowSystem.compositingActive && root.isVertical) {
                     return visibilityManager.slidingOutToPos;
                 } else {
                     return 0;
@@ -1182,14 +1184,14 @@ DragDrop.DropArea {
 
         y: {
             if ( dock && (plasmoid.configuration.panelPosition === Latte.Dock.Justify) && root.isVertical
-                    && !root.editMode && windowSystem.compositingActive && !root.drawShadowsExternal ) {
+                    && !root.editMode && Latte.WindowSystem.compositingActive && !root.drawShadowsExternal ) {
                 return ((dock.height/2) - (root.maxLength/2));
             } else {
                 if ((visibilityManager.inSlidingIn || visibilityManager.inSlidingOut) && root.isHorizontal){
                     return;
                 }
 
-                if (dock.visibility.isHidden && windowSystem.compositingActive && root.isHorizontal) {
+                if (dock.visibility.isHidden && Latte.WindowSystem.compositingActive && root.isHorizontal) {
                     return visibilityManager.slidingOutToPos;
                 } else {
                     return 0;
@@ -1420,7 +1422,7 @@ DragDrop.DropArea {
     ///this is an approach to try to solve #132 issue///
     Loader{
         anchors.fill: parent
-        active: dock & !drawShadowsExternal && windowSystem.compositingActive
+        active: dock & !drawShadowsExternal && Latte.WindowSystem.compositingActive
         z: 1000
 
         sourceComponent: Item{
diff --git a/liblattedock/CMakeLists.txt b/liblattedock/CMakeLists.txt
index 3d0910afc..b700d6738 100644
--- a/liblattedock/CMakeLists.txt
+++ b/liblattedock/CMakeLists.txt
@@ -1,6 +1,6 @@
 set(lattedock_SRCS
     lattedockplugin.cpp
-    windowsystem.cpp
+    quickwindowsystem.cpp
     dock.cpp
     iconitem.cpp
 )
diff --git a/liblattedock/lattedockplugin.cpp b/liblattedock/lattedockplugin.cpp
index 1d2545531..12fd545cd 100644
--- a/liblattedock/lattedockplugin.cpp
+++ b/liblattedock/lattedockplugin.cpp
@@ -19,16 +19,16 @@
 */
 
 #include "lattedockplugin.h"
-#include "windowsystem.h"
+#include "quickwindowsystem.h"
 #include "dock.h"
 #include "iconitem.h"
 
-#include <qqml.h>
+#include <QtQml>
 
 void LatteDockPlugin::registerTypes(const char *uri)
 {
     Q_ASSERT(uri == QLatin1String("org.kde.latte"));
     qmlRegisterUncreatableType<Latte::Dock>(uri, 0, 1, "Dock", "Latte Dock Types uncreatable");
-    qmlRegisterType<Latte::WindowSystem>(uri, 0, 1, "WindowSystem");
     qmlRegisterType<Latte::IconItem>(uri, 0, 1, "IconItem");
+    qmlRegisterSingletonType<Latte::QuickWindowSystem>(uri, 0, 1, "WindowSystem", &Latte::windowsystem_qobject_singletontype_provider);
 }
diff --git a/liblattedock/windowsystem.cpp b/liblattedock/quickwindowsystem.cpp
similarity index 58%
rename from liblattedock/windowsystem.cpp
rename to liblattedock/quickwindowsystem.cpp
index 48e44ff89..e56bcafa8 100644
--- a/liblattedock/windowsystem.cpp
+++ b/liblattedock/quickwindowsystem.cpp
@@ -18,55 +18,41 @@
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
-#include "windowsystem.h"
+#include "quickwindowsystem.h"
+
+#include <QDebug>
 
 #include <KWindowSystem>
 
 namespace Latte {
 
-WindowSystem::WindowSystem(QObject *parent) :
+QuickWindowSystem::QuickWindowSystem(QObject *parent) :
     QObject(parent)
 {
     if (KWindowSystem::isPlatformWayland()) {
         //! TODO: Wayland compositing active
     } else {
-        compositingChangedProxy(KWindowSystem::self()->compositingActive());
         connect(KWindowSystem::self(), &KWindowSystem::compositingChanged
-                , this, &WindowSystem::compositingChangedProxy);
-    }
-}
-
-WindowSystem::~WindowSystem()
-{
-}
+                , this, [&](bool enabled){
+            if (m_compositing == enabled)
+                return;
 
-WindowSystem &WindowSystem::self()
-{
-    static WindowSystem ws;
-    return ws;
-}
+            m_compositing = enabled;
+            emit compositingChanged();
+        });
 
-bool WindowSystem::compositingActive() const
-{
-    return m_compositing;
+        m_compositing = KWindowSystem::compositingActive();
+    }
 }
 
-void WindowSystem::skipTaskBar(const QDialog &dialog) const
+QuickWindowSystem::~QuickWindowSystem()
 {
-    if (KWindowSystem::isPlatformWayland()) {
-        //! TODO: Wayland skip task bar
-    } else {
-        KWindowSystem::setState(dialog.winId(), NET::SkipTaskbar);
-    }
+    qDebug() << staticMetaObject.className() << "destructed";
 }
 
-void WindowSystem::compositingChangedProxy(bool enable)
+bool QuickWindowSystem::compositingActive() const
 {
-    if (m_compositing == enable)
-        return;
-
-    m_compositing = enable;
-    emit compositingChanged();
+    return m_compositing;
 }
 
 } //end of namespace
diff --git a/liblattedock/windowsystem.h b/liblattedock/quickwindowsystem.h
similarity index 59%
rename from liblattedock/windowsystem.h
rename to liblattedock/quickwindowsystem.h
index 40412605c..b29b9da3c 100644
--- a/liblattedock/windowsystem.h
+++ b/liblattedock/quickwindowsystem.h
@@ -18,38 +18,46 @@
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
-#ifndef WINDOWSYSTEM_H
-#define WINDOWSYSTEM_H
+#ifndef QUICKWINDOWSYSTEM_H
+#define QUICKWINDOWSYSTEM_H
 
 #include <QObject>
-#include <QDialog>
+#include <QQmlEngine>
+#include <QJSEngine>
 
 namespace Latte {
 
-class WindowSystem : public QObject {
+/**
+ * @brief The QuickWindowSystem class,
+ * is a tiny class that provide basic information of WindowSystem
+ */
+class QuickWindowSystem final : public QObject {
     Q_OBJECT
 
-    Q_PROPERTY(bool compositingActive READ compositingActive NOTIFY compositingChanged)
+    Q_PROPERTY(bool compositingActive READ compositingActive NOTIFY compositingChanged FINAL)
 
 public:
-    explicit WindowSystem(QObject *parent = nullptr);
-    ~WindowSystem();
-
-    static WindowSystem &self();
+    explicit QuickWindowSystem(QObject *parent = nullptr);
+    virtual ~QuickWindowSystem();
 
     bool compositingActive() const;
-    void skipTaskBar(const QDialog &dialog) const;
 
 signals:
     void compositingChanged();
 
-private slots:
-    void compositingChangedProxy(bool state);
-
 private:
-    bool m_compositing{false};
+   bool m_compositing : 1;
 };
 
-}//LatteDock namespace
+static QObject *windowsystem_qobject_singletontype_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
+{
+    Q_UNUSED(engine)
+    Q_UNUSED(scriptEngine)
+
+// NOTE: QML engine is the owner of this resource
+    return new QuickWindowSystem;
+}
+
+}
 
-#endif
+#endif // QUICKWINDOWSYSTEM_H
diff --git a/plasmoid/contents/ui/TaskDelegate.qml b/plasmoid/contents/ui/TaskDelegate.qml
index 26f6169d7..1d67c41ce 100644
--- a/plasmoid/contents/ui/TaskDelegate.qml
+++ b/plasmoid/contents/ui/TaskDelegate.qml
@@ -28,6 +28,7 @@ import org.kde.plasma.plasmoid 2.0
 
 import org.kde.plasma.private.taskmanager 0.1 as TaskManagerApplet
 
+import org.kde.latte 0.1 as Latte
 
 MouseArea{
     id: mainItemContainer
@@ -634,7 +635,7 @@ MouseArea{
 
         ////window previews/////////
         if (isWindow) {
-            if(containsMouse && root.showPreviews && windowSystem.compositingActive){
+            if(containsMouse && root.showPreviews && Latte.WindowSystem.compositingActive){
                 hoveredTimerObj = hoveredTimerComponent.createObject(mainItemContainer);
                 //  preparePreviewWindow();
             }
@@ -649,7 +650,7 @@ MouseArea{
 
     onPressed: {
         //console.log("Pressed Task Delegate..");
-        if (windowSystem.compositingActive) {
+        if (Latte.WindowSystem.compositingActive) {
             windowsPreviewDlg.hide(2);
         }
 
@@ -703,7 +704,7 @@ MouseArea{
                 }
                 else{
                     if (model.IsGroupParent) {
-                        if (windowSystem.compositingActive) {
+                        if (Latte.WindowSystem.compositingActive) {
                             root.presentWindows(model.LegacyWinIdList);
                         } else {
                             if ((windowsPreviewDlg.visualParent === mainItemContainer)&&(windowsPreviewDlg.visible)) {
@@ -969,7 +970,7 @@ MouseArea{
     ///item's added Animation
     SequentialAnimation{
         id:showWindowAnimation
-        property int speed: windowSystem.compositingActive ? root.durationTime* (1.2*units.longDuration) : 0
+        property int speed: Latte.WindowSystem.compositingActive ? root.durationTime* (1.2*units.longDuration) : 0
         property bool animationSent: false
 
         ScriptAction{
diff --git a/plasmoid/contents/ui/TaskIconItem.qml b/plasmoid/contents/ui/TaskIconItem.qml
index 7fa7308e5..fbd09e964 100644
--- a/plasmoid/contents/ui/TaskIconItem.qml
+++ b/plasmoid/contents/ui/TaskIconItem.qml
@@ -704,7 +704,7 @@ Item{
         }
 
         function removeTask(){
-            if(!centralItem.toBeDestroyed && plasmoid.configuration.showShadows && windowSystem.compositingActive){
+            if(!centralItem.toBeDestroyed && plasmoid.configuration.showShadows && Latte.WindowSystem.compositingActive){
                 removingAnimation.init();
             }
         }
diff --git a/plasmoid/contents/ui/main.qml b/plasmoid/contents/ui/main.qml
index 02c26b80f..dad4ea040 100644
--- a/plasmoid/contents/ui/main.qml
+++ b/plasmoid/contents/ui/main.qml
@@ -218,9 +218,6 @@ Item {
     }
 
     ////BEGIN interfaces
-    Latte.WindowSystem{
-        id:windowSystem
-    }
 
     PlasmaCore.Dialog{
         id: windowsPreviewDlg