diff --git a/multiscreen-compositor/compositor-messages.cpp b/multiscreen-compositor/compositor-messages.cpp
index 3dee7462e37ce387deec3a19dcaaff9dd455a8b5..38ff1aa566f0f219827066a9ebf89fc541ebef26 100644
--- a/multiscreen-compositor/compositor-messages.cpp
+++ b/multiscreen-compositor/compositor-messages.cpp
@@ -1,6 +1,7 @@
 #include "compositor-messages.h"
 #include <message-serverconnection.h>
 #include <QDebug>
+#include <unistd.h>
 
 CompositorMessages::CompositorMessages(QObject *parent)
     : QObject{parent}
@@ -12,15 +13,12 @@ void CompositorMessages::messageReceived(QString message, quint32 windowId, quin
 
     if(message == "moveWindowToScreen"){
         emit moveWindowToScreen(windowId, screenId);
-       emit sendStatus(screenId);
     }else
     if(message == "hideWindow"){
        emit hideWindow(windowId);
-       emit sendStatus(0);
     }else
     if(message == "showWindow"){
        emit showWindow(windowId);
-       emit sendStatus(0);
     }else
     if(message == "logWindows"){
        emit logWindows();
@@ -43,3 +41,20 @@ void CompositorMessages::screenInfoReceived(int screenId){
 
    emit sendStatus(screenId);
 }
+
+bool CompositorMessages::isPidAlive(int pid)
+{
+    char path[PATH_MAX+1];
+    memset(path, 0, PATH_MAX+1);
+    snprintf(path, PATH_MAX, "/proc/%d/cmdline", pid);
+    if (access(path, F_OK) == 0)
+    {
+        qDebug() << "Pid is alive: " << pid;
+        return true;
+    }
+    else
+    {
+        qDebug() << "Pid is dead: " << pid;
+        return false;
+    }
+}
diff --git a/multiscreen-compositor/compositor-messages.h b/multiscreen-compositor/compositor-messages.h
index 288eb787c1ecc0f6d49a65d151a4927821931a5d..cb70d0a376dc6bcaef2494ef99df9698b720c9b7 100644
--- a/multiscreen-compositor/compositor-messages.h
+++ b/multiscreen-compositor/compositor-messages.h
@@ -9,6 +9,8 @@ class CompositorMessages : public QObject
 public:
     explicit CompositorMessages(QObject *parent = nullptr);
 
+    Q_INVOKABLE bool isPidAlive(int pid);
+
 public slots:
     void messageReceived(QString, quint32 value0, quint32 value2);
     void screenInfoReceived(int screenId);
diff --git a/multiscreen-compositor/main.cpp b/multiscreen-compositor/main.cpp
index 555506f44dd638af3e55d852d4a73fc2fcefaea7..7916cd2a6c50eea3bc7195cf634083a74f42a5b9 100644
--- a/multiscreen-compositor/main.cpp
+++ b/multiscreen-compositor/main.cpp
@@ -98,6 +98,7 @@ int main(int argc, char *argv[])
     QQmlApplicationEngine appEngine;
     appEngine.rootContext()->setContextProperty("config", config);
     appEngine.rootContext()->setContextProperty("commands", &commands);
+    appEngine.rootContext()->setContextProperty("server", &server);
     appEngine.load(QUrl("qrc:///qml/main.qml"));
 
     return app.exec();
diff --git a/multiscreen-compositor/message-server.cpp b/multiscreen-compositor/message-server.cpp
index e75ab0c9c89b605127479324b9bda226c19c5897..1e3916f2379b27c671eae37ee78d54195541319d 100644
--- a/multiscreen-compositor/message-server.cpp
+++ b/multiscreen-compositor/message-server.cpp
@@ -53,6 +53,7 @@ void MessageServer::handleConnection()
     connect(c, &MessageServerConnection::disconnected, this, &MessageServer::connectionGone);
     connect(c, &MessageServerConnection::newMessage, this, &MessageServer::messageReceived);
     connect(this, &MessageServer::sendStatus, c, &MessageServerConnection::sendStatus);
+    connect(this, &MessageServer::sendMessage, c, &MessageServerConnection::sendMessage);
     connections.append(c);
 }
 
@@ -73,3 +74,8 @@ void MessageServer::returnStatus(int status)
     qDebug() <<"returning Status " << status;
     emit sendStatus(status);
 }
+
+void MessageServer::broadcastMessage(QString msg, quint32 windowId, quint32 screenId)
+{
+    emit sendMessage(msg, windowId, screenId);
+}
diff --git a/multiscreen-compositor/message-server.h b/multiscreen-compositor/message-server.h
index 46e97e0abaed25af48151dcbaf215ddc33568598..32874d930673b2a1c0fb099bbebf0fecfc11f076 100644
--- a/multiscreen-compositor/message-server.h
+++ b/multiscreen-compositor/message-server.h
@@ -11,6 +11,8 @@ public:
     explicit MessageServer(QObject *parent = nullptr);
     bool listen();
 
+    Q_INVOKABLE void broadcastMessage(QString msg, quint32 windowId, quint32 screenId);
+    Q_INVOKABLE void returnStatus(int);
 
 public slots:
     void destroy();
@@ -18,12 +20,12 @@ public slots:
 signals:
     void newMessage(QString, quint32 value0, quint32 value2);
     void sendStatus(int);
+    void sendMessage(QString msg, quint32 windowId, quint32 screenId);
 
 private slots:
     void handleConnection(void);
     void connectionGone(MessageServerConnection *c);
     void messageReceived(QString, quint32, quint32);
-    void returnStatus(int);
 
 private:
     static const QString socketName;
diff --git a/multiscreen-compositor/message-serverconnection.cpp b/multiscreen-compositor/message-serverconnection.cpp
index d853fad6d77e29b8b2a5de5b27ea3ef3235042fa..e46714e9b119bc7c1bc254026d8fa3c2e4b9c58b 100644
--- a/multiscreen-compositor/message-serverconnection.cpp
+++ b/multiscreen-compositor/message-serverconnection.cpp
@@ -47,6 +47,22 @@ void MessageServerConnection::readData(void){
     }
 }
 
+int MessageServerConnection::sendMessage(QString msg, qint32 windowid, qint32 screenid){
+    QByteArray data;
+    QDataStream out(&data, QIODevice::WriteOnly);
+
+    if( ! socket->isValid()){
+        qWarning() << "Can't send something. Socket not valid";
+        return -1;
+    }
+
+    out << quint32(COMPOSITOR_MESSAGE_START_SEQUENCE) << msg << windowid << screenid;
+    qDebug() << "Compositor Message:" << msg << windowid << screenid;
+    socket->write(data);
+    socket->flush();
+    return 0;
+}
+
 void MessageServerConnection::sendStatus(int status)
 {
     QByteArray data;
diff --git a/multiscreen-compositor/message-serverconnection.h b/multiscreen-compositor/message-serverconnection.h
index 909303c17fa46d1c02a9d47caad84b27ba12f86e..580b7252636bc347d0912db0297051ad579346fc 100644
--- a/multiscreen-compositor/message-serverconnection.h
+++ b/multiscreen-compositor/message-serverconnection.h
@@ -11,6 +11,7 @@ class MessageServerConnection : public QObject
 public:
     explicit MessageServerConnection( QLocalSocket *socket, QObject *parent = nullptr);
     void sendStatus(int status);
+    int sendMessage(QString msg, qint32 windowid, qint32 screenid);
 
 signals:
     void disconnected(MessageServerConnection*);
diff --git a/multiscreen-compositor/qml/main.qml b/multiscreen-compositor/qml/main.qml
index bcef4baed9066a51025208b79c3abb2d92a6141e..b75fe94bf16fa5cf7493bc7f63fa6f206f613bfb 100644
--- a/multiscreen-compositor/qml/main.qml
+++ b/multiscreen-compositor/qml/main.qml
@@ -109,7 +109,6 @@ WaylandCompositor {
 
     IviApplication {
         onIviSurfaceCreated: handleIviSurfaceCreated(iviSurface)
-        //onIviSurfaceRequested: console.log("IVI surface requested: surface", surface, "iviId", iviId, "resource", resource);
     }
 
     // =============================================
@@ -124,12 +123,6 @@ WaylandCompositor {
 
     onSurfaceRequested: {
         console.log("Surface requested: client", client, "id", id, "version", version, "pid", client.processId);
-        /*
-        var surface = WaylandSurface;
-        surface.initialize(this, client, id, version);
-        console.log("created surface:", surface);
-        return surface;
-          */
     }
 
     function createShellSurfaceItem(shellSurface, moveItem, output) {
@@ -215,6 +208,7 @@ WaylandCompositor {
     // =============================================
     function handleIviSurfaceCreated(iviSurface) {
         console.log("handleIviSurfaceCreated: surface", iviSurface, "id", iviSurface.iviId);
+
         cleanUpApplist();
         var item = {};
         var screenId = 0;
@@ -259,15 +253,18 @@ WaylandCompositor {
                 {
                     for (var k=0; k < frozenSurfaceIds.length; k++)
                     {
-                        if  (item.iviId === frozenSurfaceIds[k].iviId)
+                        if  (!commands.isPidAlive(frozenSurfaceIds[k].pid))
                         {
-                            //console.log("throwing out dead pid:", frozenSurfaceIds[k].pid, "iviId", frozenSurfaceIds[k].iviId);
+                            console.log("throwing out dead pid:", frozenSurfaceIds[k].pid, "iviId", frozenSurfaceIds[k].iviId);
                             frozenSurfaceIds = Array.from(frozenSurfaceIds).filter((e, idx) => idx !== k)
                         }
                     }
                     frozenSurfaceIds.push({ 'iviId': item.iviId, 'pid': item.pid, 'screen': item.screen, 'master': item.master });
                 }
+                /*
+                  commenting out this log line also reduced the crashiness quite a bit.
                 console.log("Removed lost surface from applist and saving screen assignment! iviId:", item.iviId, "pid:", item.pid, "screen:", item.screen)
+                */
             }
         }
     }
@@ -373,33 +370,44 @@ WaylandCompositor {
 
             if( screenid > screens.count ){
                 console.log("Given screen ID is out of range");
+                server.returnStatus(-1);
                 return
             }
 
             var affectedSurfaces = getActiveSurfaces(getPidFromIviId(windowid));
-            if (affectedSurfaces.length === 0) return;
+            //if (affectedSurfaces.length === 0) return;
             for (var i=0; i < affectedSurfaces.length; i++)
             {
                 var surface = affectedSurfaces[i];
-                if( !surface ) return;
-
-                console.log("Move", surface, "to screen", screenid)
-                surface.parent = screens.objectAt(screenid).surfaceArea;
-                updateScreenAssignment(getPidFromIviId(windowid), screenid);
+                if( surface )
+                {
+                    console.log("Move", surface, "to screen", screenid)
+                    surface.parent = screens.objectAt(screenid).surfaceArea;
+                    updateScreenAssignment(getPidFromIviId(windowid), screenid);
+                }
             }
+            server.returnStatus(screenid);
+            server.sendMessage("Move", windowid, screenid);
         }
 
         function windowVisibility(windowid, show){
+            var ret = 0;
             var affectedSurfaces = getActiveSurfaces(getPidFromIviId(windowid));
-            if (affectedSurfaces.length === 0) return;
+            //if (affectedSurfaces.length === 0) return;
             for (var i=0; i < affectedSurfaces.length; i++)
             {
                 var surface = affectedSurfaces[i];
-                if( !surface ) return;
+                if( surface )
+                {
 
-                console.log("Set visible to", show,"for", surface)
-                surface.visible = show
+                    console.log("Set visible to", show,"for", surface)
+                    surface.visible = show
+                    ret++;
+                }
             }
+
+            server.returnStatus(ret);
+            server.sendMessage(show ? "Show" : "Hide", windowid, null);
         }
 
         function onHideWindow(windowid){