Index: uspace/lib/ipcgfx/private/server.h
===================================================================
--- uspace/lib/ipcgfx/private/server.h	(revision 3e640e540295e77c5c2e26976915369b05c0a5a8)
+++ uspace/lib/ipcgfx/private/server.h	(revision 5e3e42c77aaf72c8510fc527364cb6b0708ce830)
@@ -43,4 +43,5 @@
 #include <gfx/context.h>
 #include <gfx/coord.h>
+#include <stdbool.h>
 
 /** Server-side of IPC GC connection.
@@ -65,4 +66,8 @@
 	/** Bitmap ID */
 	sysarg_t bmp_id;
+	/** @c true if we allocated the pixels */
+	bool myalloc;
+	/** Pixels of the bitmap */
+	void *pixels;
 } ipc_gc_srv_bitmap_t;
 
Index: uspace/lib/ipcgfx/src/server.c
===================================================================
--- uspace/lib/ipcgfx/src/server.c	(revision 3e640e540295e77c5c2e26976915369b05c0a5a8)
+++ uspace/lib/ipcgfx/src/server.c	(revision 5e3e42c77aaf72c8510fc527364cb6b0708ce830)
@@ -164,4 +164,8 @@
 	    (unsigned) srvbmp->bmp_id);
 
+	/* We created the memory area by sharing it in */
+	srvbmp->myalloc = true;
+	srvbmp->pixels = pixels;
+
 	async_answer_1(icall, EOK, srvbmp->bmp_id);
 }
@@ -246,4 +250,9 @@
 	srvbmp->bmp = bitmap;
 	srvbmp->bmp_id = srvgc->next_bmp_id++;
+
+	/* Area allocated by backing GC, we just shared it out */
+	srvbmp->myalloc = false;
+	srvbmp->pixels = alloc.pixels; // Not really needed
+
 	printf("gc_bitmap_create_doutput_srv: storing bmp_id=%u\n",
 	    (unsigned) srvbmp->bmp_id);
@@ -271,4 +280,7 @@
 		return;
 	}
+
+	if (bitmap->myalloc)
+		as_area_destroy(bitmap->pixels);
 
 	list_remove(&bitmap->lbitmaps);
