Index: uspace/lib/draw/drawctx.c
===================================================================
--- uspace/lib/draw/drawctx.c	(revision beb5683be3c54340d968ffbc0b93e7a8ae7ce0c8)
+++ uspace/lib/draw/drawctx.c	(revision 7dba813edf9ca94fe86972cf728c299ee15088c8)
@@ -129,26 +129,48 @@
 	}
 
-	bool clipped = false;
-	bool masked = false;
-
-	for (sysarg_t _y = y; _y < y + height; ++_y) {
-		for (sysarg_t _x = x; _x < x + width; ++_x) {
-			if (context->shall_clip) {
-				clipped = _x < context->clip_x && _x >= context->clip_width
-				    && _y < context->clip_y && _y >= context->clip_height;
-			}
-			
-			if (context->mask) {
-				pixel_t p = surface_get_pixel(context->mask, _x, _y);
-				masked = p > 0 ? false : true;
-			}
-
-			if (!clipped && !masked) {
-				pixel_t p_src = source_determine_pixel(context->source, _x, _y);
-				pixel_t p_dst = surface_get_pixel(context->surface, _x, _y);
-				pixel_t p_res = context->compose(p_src, p_dst);
-				surface_put_pixel(context->surface, _x, _y, p_res);
+	bool transfer_fast = source_is_fast(context->source)
+	    && (context->shall_clip == false)
+	    && (context->mask == NULL)
+	    && (context->compose == compose_src || context->compose == compose_over);
+
+	if (transfer_fast) {
+
+		for (sysarg_t _y = y; _y < y + height; ++_y) {
+			pixel_t *src = source_direct_access(context->source, x, _y);
+			pixel_t *dst = pixelmap_pixel_at(surface_pixmap_access(context->surface), x, _y);
+			if (src && dst) {
+				sysarg_t count = width;
+				while (count-- != 0) {
+					*dst++ = *src++;
+				}
 			}
 		}
+		surface_add_damaged_region(context->surface, x, y, width, height);
+
+	} else {
+
+		bool clipped = false;
+		bool masked = false;
+		for (sysarg_t _y = y; _y < y + height; ++_y) {
+			for (sysarg_t _x = x; _x < x + width; ++_x) {
+				if (context->shall_clip) {
+					clipped = _x < context->clip_x && _x >= context->clip_width
+					    && _y < context->clip_y && _y >= context->clip_height;
+				}
+
+				if (context->mask) {
+					pixel_t p = surface_get_pixel(context->mask, _x, _y);
+					masked = p > 0 ? false : true;
+				}
+
+				if (!clipped && !masked) {
+					pixel_t p_src = source_determine_pixel(context->source, _x, _y);
+					pixel_t p_dst = surface_get_pixel(context->surface, _x, _y);
+					pixel_t p_res = context->compose(p_src, p_dst);
+					surface_put_pixel(context->surface, _x, _y, p_res);
+				}
+			}
+		}
+
 	}
 }
Index: uspace/lib/draw/source.c
===================================================================
--- uspace/lib/draw/source.c	(revision beb5683be3c54340d968ffbc0b93e7a8ae7ce0c8)
+++ uspace/lib/draw/source.c	(revision 7dba813edf9ca94fe86972cf728c299ee15088c8)
@@ -90,4 +90,28 @@
 }
 
+bool source_is_fast(source_t *source)
+{
+	return (source->mask == NULL)
+	    && (source->alpha == (pixel_t) PIXEL(255, 0, 0, 0))
+	    && (source->texture != NULL)
+	    && (source->texture_tile == false)
+	    && transform_is_fast(&source->transform);
+}
+
+pixel_t *source_direct_access(source_t *source, double x, double y)
+{
+	assert(source_is_fast(source));
+
+	long _x = (long) (x + source->transform.m[0][2]);
+	long _y = (long) (y + source->transform.m[1][2]);
+
+	pixelmap_t *pixmap = surface_pixmap_access(source->texture);
+	if (_x < 0 || _x >= (long) pixmap->width || _y < 0 || _y >= (long) pixmap->height) {
+		return NULL;
+	}
+
+	return pixelmap_pixel_at(pixmap, (sysarg_t) _x, (sysarg_t) _y);
+}
+
 pixel_t source_determine_pixel(source_t *source, double x, double y)
 {
Index: uspace/lib/draw/source.h
===================================================================
--- uspace/lib/draw/source.h	(revision beb5683be3c54340d968ffbc0b93e7a8ae7ce0c8)
+++ uspace/lib/draw/source.h	(revision 7dba813edf9ca94fe86972cf728c299ee15088c8)
@@ -71,4 +71,6 @@
 extern void source_set_mask(source_t *, surface_t *, bool);
 
+extern bool source_is_fast(source_t *);
+extern pixel_t *source_direct_access(source_t *, double, double);
 extern pixel_t source_determine_pixel(source_t *, double, double);
 
Index: uspace/lib/draw/surface.c
===================================================================
--- uspace/lib/draw/surface.c	(revision beb5683be3c54340d968ffbc0b93e7a8ae7ce0c8)
+++ uspace/lib/draw/surface.c	(revision 7dba813edf9ca94fe86972cf728c299ee15088c8)
@@ -143,4 +143,17 @@
 }
 
+void surface_add_damaged_region(surface_t *surface, surface_coord_t x, surface_coord_t y,
+    surface_coord_t width, surface_coord_t height)
+{
+	surface->dirty_x_lo = surface->dirty_x_lo > x ? x : surface->dirty_x_lo;
+	surface->dirty_y_lo = surface->dirty_y_lo > y ? y : surface->dirty_y_lo;
+
+	surface_coord_t x_hi = x + width - 1;
+	surface_coord_t y_hi = y + height - 1;
+
+	surface->dirty_x_hi = surface->dirty_x_hi < x_hi ? x_hi : surface->dirty_x_hi;
+	surface->dirty_y_hi = surface->dirty_y_hi < y_hi ? y_hi : surface->dirty_y_hi;
+}
+
 void surface_reset_damaged_region(surface_t *surface)
 {
Index: uspace/lib/draw/surface.h
===================================================================
--- uspace/lib/draw/surface.h	(revision beb5683be3c54340d968ffbc0b93e7a8ae7ce0c8)
+++ uspace/lib/draw/surface.h	(revision 7dba813edf9ca94fe86972cf728c299ee15088c8)
@@ -61,4 +61,6 @@
 extern void surface_get_damaged_region(surface_t *, surface_coord_t *, surface_coord_t *,
     surface_coord_t *, surface_coord_t *);
+extern void surface_add_damaged_region(surface_t *, surface_coord_t , surface_coord_t ,
+    surface_coord_t , surface_coord_t );
 extern void surface_reset_damaged_region(surface_t *);
 
