Index: uspace/drv/fb/kfb/port.c
===================================================================
--- uspace/drv/fb/kfb/port.c	(revision 2a515dcdbf45d99dae90d9f82bc03f8416d806b7)
+++ uspace/drv/fb/kfb/port.c	(revision f8375f741d0ccd376851c593af6a16c2591aa927)
@@ -90,4 +90,6 @@
 	gfx_bitmap_alloc_t alloc;
 	gfx_rect_t rect;
+	gfx_bitmap_flags_t flags;
+	pixel_t key_color;
 	bool myalloc;
 } kfb_bitmap_t;
@@ -203,4 +205,6 @@
 	gfx_coord2_subtract(&params->rect.p1, &params->rect.p0, &dim);
 	kfbbm->rect = params->rect;
+	kfbbm->flags = params->flags;
+	kfbbm->key_color = params->key_color;
 
 	if (alloc == NULL) {
@@ -298,12 +302,27 @@
 	gfx_rect_clip(&srect, &skfbrect, &crect);
 
-	for (pos.y = crect.p0.y; pos.y < crect.p1.y; pos.y++) {
-		for (pos.x = crect.p0.x; pos.x < crect.p1.x; pos.x++) {
-			gfx_coord2_subtract(&pos, &kfbbm->rect.p0, &sp);
-			gfx_coord2_add(&pos, &offs, &dp);
-
-			color = pixelmap_get_pixel(&pbm, sp.x, sp.y);
-			kfb->pixel2visual(kfb->addr +
-			    FB_POS(kfb, dp.x, dp.y), color);
+	if ((kfbbm->flags & bmpf_color_key) != 0) {
+		for (pos.y = crect.p0.y; pos.y < crect.p1.y; pos.y++) {
+			for (pos.x = crect.p0.x; pos.x < crect.p1.x; pos.x++) {
+				gfx_coord2_subtract(&pos, &kfbbm->rect.p0, &sp);
+				gfx_coord2_add(&pos, &offs, &dp);
+
+				color = pixelmap_get_pixel(&pbm, sp.x, sp.y);
+				if (color != kfbbm->key_color) {
+					kfb->pixel2visual(kfb->addr +
+					    FB_POS(kfb, dp.x, dp.y), color);
+				}
+			}
+		}
+	} else {
+		for (pos.y = crect.p0.y; pos.y < crect.p1.y; pos.y++) {
+			for (pos.x = crect.p0.x; pos.x < crect.p1.x; pos.x++) {
+				gfx_coord2_subtract(&pos, &kfbbm->rect.p0, &sp);
+				gfx_coord2_add(&pos, &offs, &dp);
+
+				color = pixelmap_get_pixel(&pbm, sp.x, sp.y);
+				kfb->pixel2visual(kfb->addr +
+				    FB_POS(kfb, dp.x, dp.y), color);
+			}
 		}
 	}
