Index: uspace/lib/ui/src/window.c
===================================================================
--- uspace/lib/ui/src/window.c	(revision 03145ee0ced600293786f89425025b95a350d992)
+++ uspace/lib/ui/src/window.c	(revision b93ec7c0b1ad687158c0b60742ae81046302f956)
@@ -36,4 +36,5 @@
 #include <display.h>
 #include <errno.h>
+#include <gfx/bitmap.h>
 #include <gfx/context.h>
 #include <gfx/render.h>
@@ -41,4 +42,5 @@
 #include <io/pos_event.h>
 #include <mem.h>
+#include <memgfx/memgc.h>
 #include <stdlib.h>
 #include <ui/control.h>
@@ -74,4 +76,6 @@
 	.move = wd_move
 };
+
+static void ui_window_app_update(void *, gfx_rect_t *);
 
 /** Initialize window parameters structure.
@@ -223,4 +227,9 @@
 }
 
+/** Get UI resource from window.
+ *
+ * @param window Window
+ * @return UI resource
+ */
 ui_resource_t *ui_window_get_res(ui_window_t *window)
 {
@@ -228,4 +237,9 @@
 }
 
+/** Get window GC.
+ *
+ * @param window Window
+ * @return GC (relative to window)
+ */
 gfx_context_t *ui_window_get_gc(ui_window_t *window)
 {
@@ -233,4 +247,60 @@
 }
 
+/** Get window application area GC
+ *
+ * @param window Window
+ * @param rgc Place to store GC (relative to application area)
+ * @return EOK on success or an error code
+ */
+errno_t ui_window_get_app_gc(ui_window_t *window, gfx_context_t **rgc)
+{
+	gfx_bitmap_params_t params;
+	gfx_bitmap_alloc_t alloc;
+	gfx_rect_t rect;
+	mem_gc_t *memgc;
+	errno_t rc;
+
+	if (window->app_gc == NULL) {
+		assert(window->app_bmp == NULL);
+
+		gfx_bitmap_params_init(&params);
+
+		/*
+		 * The bitmap will have the same dimensions as the
+		 * application rectangle, but start at 0,0.
+		 */
+		ui_window_get_app_rect(window, &rect);
+		gfx_rect_rtranslate(&rect.p0, &rect, &params.rect);
+
+		rc = gfx_bitmap_create(window->gc, &params, NULL,
+		    &window->app_bmp);
+		if (rc != EOK)
+			return rc;
+
+		rc = gfx_bitmap_get_alloc(window->app_bmp, &alloc);
+		if (rc != EOK) {
+			gfx_bitmap_destroy(window->app_bmp);
+			return rc;
+		}
+
+		rc = mem_gc_create(&params.rect, &alloc, ui_window_app_update,
+		    (void *) window, &memgc);
+		if (rc != EOK) {
+			gfx_bitmap_destroy(window->app_bmp);
+			return rc;
+		}
+
+		window->app_gc = mem_gc_get_ctx(memgc);
+	}
+
+	*rgc = window->app_gc;
+	return EOK;
+}
+
+/** Get window application rectangle
+ *
+ * @param window Window
+ * @param rect Place to store application rectangle
+ */
 void ui_window_get_app_rect(ui_window_t *window, gfx_rect_t *rect)
 {
@@ -241,4 +311,9 @@
 }
 
+/** Paint window
+ *
+ * @param window Window
+ * @return EOK on success or an error code
+ */
 errno_t ui_window_paint(ui_window_t *window)
 {
@@ -428,4 +503,20 @@
 }
 
+/** Application area update callback
+ *
+ * @param arg Argument (ui_window_t *)
+ * @param rect Rectangle to update
+ */
+static void ui_window_app_update(void *arg, gfx_rect_t *rect)
+{
+	ui_window_t *window = (ui_window_t *) arg;
+	gfx_rect_t arect;
+
+	ui_window_get_app_rect(window, &arect);
+
+	/* Render bitmap rectangle inside the application area */
+	(void) gfx_bitmap_render(window->app_bmp, rect, &arect.p0);
+}
+
 /** @}
  */
