Index: daemon/app_supervisor.c
===================================================================
--- daemon/app_supervisor.c (revision 4248abe1d7524b5476ff47049f507c5179567121)
+++ daemon/app_supervisor.c (revision e8f9b6b02ee1b13c36af920f47f12b3c129cd498)
@@ -226,4 +226,21 @@
 }
 
+ladish_app_handle ladish_app_supervisor_find_app_by_uuid(ladish_app_supervisor_handle supervisor_handle, const uuid_t uuid)
+{
+  struct list_head * node_ptr;
+  struct ladish_app * app_ptr;
+
+  list_for_each(node_ptr, &supervisor_ptr->applist)
+  {
+    app_ptr = list_entry(node_ptr, struct ladish_app, siblings);
+    if (uuid_compare(app_ptr->uuid, uuid) == 0)
+    {
+      return (ladish_app_handle)app_ptr;
+    }
+  }
+
+  return NULL;
+}
+
 ladish_app_handle
 ladish_app_supervisor_add(
@@ -599,4 +616,13 @@
 }
 
+void ladish_app_del_pid(ladish_app_handle app_handle, pid_t pid)
+{
+  if (app_ptr->firstborn_pid != 0 && app_ptr->firstborn_pid == pid)
+  {
+    log_info("First grandchild with pid %u has gone", (unsigned int)pid);
+    app_ptr->firstborn_pid = 0;
+  }
+}
+
 #undef app_ptr
 
Index: daemon/app_supervisor.h
===================================================================
--- daemon/app_supervisor.h (revision 99b1ab0da40a97955655bceea29cfda375e8af67)
+++ daemon/app_supervisor.h (revision e8f9b6b02ee1b13c36af920f47f12b3c129cd498)
@@ -288,4 +288,17 @@
 
 /**
+ * Search app by uuid
+ *
+ * @param[in] supervisor_handle supervisor object handle
+ * @param[in] uuid uuid of the app to search for
+ *
+ * @return app handle on if found; NULL if app is not found; the app handle is owned by the app supervisor object
+ */
+ladish_app_handle
+ladish_app_supervisor_find_app_by_uuid(
+  ladish_app_supervisor_handle supervisor_handle,
+  const uuid_t uuid);
+
+/**
  * The the D-Bus object path for the supervisor.
  *
@@ -394,4 +407,12 @@
 
 /**
+ * Deassociate pid with app.
+ *
+ * @param[in] app_handle Handle of app
+ * @param[in] pid PID to deassociate with the app
+ */
+void ladish_app_del_pid(ladish_app_handle app_handle, pid_t pid);
+
+/**
  * D-Bus interface descriptor for the app supervisor interface. The call context must be a ::ladish_app_supervisor_handle
  */
Index: daemon/studio.c
===================================================================
--- daemon/studio.c (revision fb15df6218dc5b759e5ba614d8413f1d1cda2d30)
+++ daemon/studio.c (revision e8f9b6b02ee1b13c36af920f47f12b3c129cd498)
@@ -774,5 +774,5 @@
 }
 
-struct ladish_studio_app_supervisor_match_context
+struct ladish_studio_app_supervisor_match_opath_context
 {
   const char * opath;
@@ -780,7 +780,7 @@
 };
 
-#define iterate_context_ptr ((struct ladish_studio_app_supervisor_match_context *)context)
-
-static bool ladish_studio_app_supervisor_match(void * context, ladish_graph_handle graph, ladish_app_supervisor_handle app_supervisor)
+#define iterate_context_ptr ((struct ladish_studio_app_supervisor_match_opath_context *)context)
+
+static bool ladish_studio_app_supervisor_match_opath(void * context, ladish_graph_handle graph, ladish_app_supervisor_handle app_supervisor)
 {
   ASSERT(strcmp(ladish_app_supervisor_get_opath(app_supervisor), ladish_graph_get_opath(graph)) == 0);
@@ -799,10 +799,44 @@
 ladish_app_supervisor_handle ladish_studio_find_app_supervisor(const char * opath)
 {
-  struct ladish_studio_app_supervisor_match_context ctx;
+  struct ladish_studio_app_supervisor_match_opath_context ctx;
 
   ctx.opath = opath;
   ctx.supervisor = NULL;
-  ladish_studio_iterate_virtual_graphs(&ctx, ladish_studio_app_supervisor_match);
+  ladish_studio_iterate_virtual_graphs(&ctx, ladish_studio_app_supervisor_match_opath);
   return ctx.supervisor;
+}
+
+struct ladish_studio_app_supervisor_match_app_context
+{
+  uuid_t app_uuid;
+  ladish_app_handle app;
+};
+
+#define iterate_context_ptr ((struct ladish_studio_app_supervisor_match_app_context *)context)
+
+static bool ladish_studio_app_supervisor_match_app(void * context, ladish_graph_handle graph, ladish_app_supervisor_handle app_supervisor)
+{
+  ASSERT(strcmp(ladish_app_supervisor_get_opath(app_supervisor), ladish_graph_get_opath(graph)) == 0);
+  ASSERT(iterate_context_ptr->app == NULL);
+
+  iterate_context_ptr->app = ladish_app_supervisor_find_app_by_uuid(app_supervisor, iterate_context_ptr->app_uuid);
+  if (iterate_context_ptr->app != NULL)
+  {
+    return false;               /* stop iteration */
+  }
+
+  return true;                  /* continue iteration */
+}
+
+#undef iterate_context_ptr
+
+ladish_app_handle ladish_studio_find_app_by_uuid(const uuid_t app_uuid)
+{
+  struct ladish_studio_app_supervisor_match_app_context ctx;
+
+  uuid_copy(ctx.app_uuid, app_uuid);
+  ctx.app = NULL;
+  ladish_studio_iterate_virtual_graphs(&ctx, ladish_studio_app_supervisor_match_app);
+  return ctx.app;
 }
 
Index: daemon/studio.h
===================================================================
--- daemon/studio.h (revision a9a55b0ddcb2223fc1ba0a5a47f357955bb1a42e)
+++ daemon/studio.h (revision e8f9b6b02ee1b13c36af920f47f12b3c129cd498)
@@ -61,4 +61,5 @@
 void ladish_studio_stop_app_supervisors(void);
 ladish_app_supervisor_handle ladish_studio_find_app_supervisor(const char * opath);
+ladish_app_handle ladish_studio_find_app_by_uuid(const uuid_t app_uuid);
 struct ladish_cqueue * ladish_studio_get_cmd_queue(void);
 ladish_virtualizer_handle ladish_studio_get_virtualizer(void);
Index: daemon/virtualizer.c
===================================================================
--- daemon/virtualizer.c (revision 416c65254bc9ccc5cdc7d6a4b8d0550e4b2d9041)
+++ daemon/virtualizer.c (revision e8f9b6b02ee1b13c36af920f47f12b3c129cd498)
@@ -384,4 +384,6 @@
   ladish_client_handle client;
   pid_t pid;
+  uuid_t app_uuid;
+  ladish_app_handle app;
   ladish_graph_handle vgraph;
 
@@ -400,7 +402,17 @@
 
   pid = ladish_client_get_pid(client);
-  if (ladish_client_has_app(client))
+  if (ladish_client_get_app(client, app_uuid))
   {
     virtualizer_ptr->our_clients_count--;
+    app = ladish_studio_find_app_by_uuid(app_uuid);
+    if (app != NULL)
+    {
+      ladish_app_del_pid(app, pid);
+    }
+    else
+    {
+      log_error("app of disappearing client %"PRIu64" not found. pid is %"PRIu64, id, (uint64_t)pid);
+      ASSERT_NO_PASS;
+    }
   }
 
