Index: uspace/app/gfxdemo/gfxdemo.c
===================================================================
--- uspace/app/gfxdemo/gfxdemo.c	(revision ef30659b5a6d6900205c910888f55a84f2520f88)
+++ uspace/app/gfxdemo/gfxdemo.c	(revision e49b799749611ec0efd1eb1a09379f3b62d0d269)
@@ -499,4 +499,7 @@
 		return rc;
 
+	display_window_destroy(window);
+	display_close(display);
+
 	return EOK;
 }
Index: uspace/lib/display/src/display.c
===================================================================
--- uspace/lib/display/src/display.c	(revision ef30659b5a6d6900205c910888f55a84f2520f88)
+++ uspace/lib/display/src/display.c	(revision e49b799749611ec0efd1eb1a09379f3b62d0d269)
@@ -123,9 +123,10 @@
 void display_close(display_t *display)
 {
+	fibril_mutex_lock(&display->lock);
 	async_hangup(display->sess);
+	display->sess = NULL;
 
 	/* Wait for callback handler to terminate */
 
-	fibril_mutex_lock(&display->lock);
 	while (!display->cb_done)
 		fibril_condvar_wait(&display->cv, &display->lock);
@@ -495,5 +496,13 @@
 
 	while (true) {
-		rc = display_get_event(display, &window, &event);
+		fibril_mutex_lock(&display->lock);
+
+		if (display->sess != NULL)
+			rc = display_get_event(display, &window, &event);
+		else
+			rc = ENOENT;
+
+		fibril_mutex_unlock(&display->lock);
+
 		if (rc != EOK)
 			break;
