Index: uspace/app/uidemo/uidemo.c
===================================================================
--- uspace/app/uidemo/uidemo.c	(revision 5ef85c0bd5ee99c810fd320afd396bede779e6f0)
+++ uspace/app/uidemo/uidemo.c	(revision 1026cc40ce00dd8415da596685d9d654056793cb)
@@ -89,4 +89,6 @@
 static void scrollbar_up(ui_scrollbar_t *, void *);
 static void scrollbar_down(ui_scrollbar_t *, void *);
+static void scrollbar_page_up(ui_scrollbar_t *, void *);
+static void scrollbar_page_down(ui_scrollbar_t *, void *);
 static void scrollbar_moved(ui_scrollbar_t *, void *, gfx_coord_t);
 
@@ -94,4 +96,6 @@
 	.up = scrollbar_up,
 	.down = scrollbar_down,
+	.page_up = scrollbar_page_up,
+	.page_down = scrollbar_page_down,
 	.moved = scrollbar_moved
 };
@@ -232,9 +236,5 @@
 static void scrollbar_up(ui_scrollbar_t *scrollbar, void *arg)
 {
-	ui_demo_t *demo = (ui_demo_t *) arg;
 	gfx_coord_t pos;
-	char *str;
-	errno_t rc;
-	int rv;
 
 	pos = ui_scrollbar_get_pos(scrollbar);
@@ -242,18 +242,5 @@
 
 	pos = ui_scrollbar_get_pos(scrollbar);
-
-	rv = asprintf(&str, "Scrollbar: %d of %d", (int) pos,
-	    ui_scrollbar_move_length(scrollbar));
-	if (rv < 0) {
-		printf("Out of memory.\n");
-		return;
-	}
-
-	rc = ui_entry_set_text(demo->entry, str);
-	if (rc != EOK)
-		printf("Error changing entry text.\n");
-	(void) ui_entry_paint(demo->entry);
-
-	free(str);
+	scrollbar_moved(scrollbar, arg, pos);
 }
 
@@ -265,9 +252,5 @@
 static void scrollbar_down(ui_scrollbar_t *scrollbar, void *arg)
 {
-	ui_demo_t *demo = (ui_demo_t *) arg;
 	gfx_coord_t pos;
-	char *str;
-	errno_t rc;
-	int rv;
 
 	pos = ui_scrollbar_get_pos(scrollbar);
@@ -275,18 +258,39 @@
 
 	pos = ui_scrollbar_get_pos(scrollbar);
-
-	rv = asprintf(&str, "Scrollbar: %d of %d", (int) pos,
-	    ui_scrollbar_move_length(scrollbar));
-	if (rv < 0) {
-		printf("Out of memory.\n");
-		return;
-	}
-
-	rc = ui_entry_set_text(demo->entry, str);
-	if (rc != EOK)
-		printf("Error changing entry text.\n");
-	(void) ui_entry_paint(demo->entry);
-
-	free(str);
+	scrollbar_moved(scrollbar, arg, pos);
+}
+
+/** Scrollbar page up event.
+ *
+ * @param scrollbar Scrollbar
+ * @param arg Argument (demo)
+ */
+static void scrollbar_page_up(ui_scrollbar_t *scrollbar, void *arg)
+{
+	gfx_coord_t pos;
+
+	pos = ui_scrollbar_get_pos(scrollbar);
+	ui_scrollbar_set_pos(scrollbar, pos -
+	    ui_scrollbar_through_length(scrollbar) / 4);
+
+	pos = ui_scrollbar_get_pos(scrollbar);
+	scrollbar_moved(scrollbar, arg, pos);
+}
+
+/** Scrollbar page down event.
+ *
+ * @param scrollbar Scrollbar
+ * @param arg Argument (demo)
+ */
+static void scrollbar_page_down(ui_scrollbar_t *scrollbar, void *arg)
+{
+	gfx_coord_t pos;
+
+	pos = ui_scrollbar_get_pos(scrollbar);
+	ui_scrollbar_set_pos(scrollbar, pos +
+	    ui_scrollbar_through_length(scrollbar) / 4);
+
+	pos = ui_scrollbar_get_pos(scrollbar);
+	scrollbar_moved(scrollbar, arg, pos);
 }
 
Index: uspace/lib/ui/include/ui/scrollbar.h
===================================================================
--- uspace/lib/ui/include/ui/scrollbar.h	(revision 5ef85c0bd5ee99c810fd320afd396bede779e6f0)
+++ uspace/lib/ui/include/ui/scrollbar.h	(revision 1026cc40ce00dd8415da596685d9d654056793cb)
@@ -57,9 +57,13 @@
 extern void ui_scrollbar_set_thumb_length(ui_scrollbar_t *, gfx_coord_t);
 extern void ui_scrollbar_set_pos(ui_scrollbar_t *, gfx_coord_t);
-extern void ui_scrollbar_press(ui_scrollbar_t *, gfx_coord2_t *);
+extern void ui_scrollbar_thumb_press(ui_scrollbar_t *, gfx_coord2_t *);
+extern void ui_scrollbar_up_through_press(ui_scrollbar_t *);
+extern void ui_scrollbar_down_through_press(ui_scrollbar_t *);
 extern void ui_scrollbar_release(ui_scrollbar_t *, gfx_coord2_t *);
 extern void ui_scrollbar_update(ui_scrollbar_t *, gfx_coord2_t *);
 extern void ui_scrollbar_up(ui_scrollbar_t *);
 extern void ui_scrollbar_down(ui_scrollbar_t *);
+extern void ui_scrollbar_page_up(ui_scrollbar_t *);
+extern void ui_scrollbar_page_down(ui_scrollbar_t *);
 extern void ui_scrollbar_moved(ui_scrollbar_t *, gfx_coord_t);
 extern ui_evclaim_t ui_scrollbar_pos_event(ui_scrollbar_t *, pos_event_t *);
Index: uspace/lib/ui/private/resource.h
===================================================================
--- uspace/lib/ui/private/resource.h	(revision 5ef85c0bd5ee99c810fd320afd396bede779e6f0)
+++ uspace/lib/ui/private/resource.h	(revision 1026cc40ce00dd8415da596685d9d654056793cb)
@@ -116,4 +116,6 @@
 	/** Scrollbar through color */
 	gfx_color_t *sbar_through_color;
+	/** Scrollbar active through color */
+	gfx_color_t *sbar_act_through_color;
 
 	/** Expose callback or @c NULL */
Index: uspace/lib/ui/private/scrollbar.h
===================================================================
--- uspace/lib/ui/private/scrollbar.h	(revision 5ef85c0bd5ee99c810fd320afd396bede779e6f0)
+++ uspace/lib/ui/private/scrollbar.h	(revision 1026cc40ce00dd8415da596685d9d654056793cb)
@@ -63,5 +63,9 @@
 	struct ui_pbutton *btn_down;
 	/** Thumb is currently held down */
-	bool held;
+	bool thumb_held;
+	/** Up through is currently held down */
+	bool up_through_held;
+	/** Down through is currently held down */
+	bool down_through_held;
 	/** Position where thumb was pressed */
 	gfx_coord2_t press_pos;
@@ -81,6 +85,10 @@
 	/** Through rectangle */
 	gfx_rect_t through_rect;
+	/** Up through rectangle */
+	gfx_rect_t up_through_rect;
 	/** Thumb rectangle */
 	gfx_rect_t thumb_rect;
+	/** Down through rectangle */
+	gfx_rect_t down_through_rect;
 	/** Down button rectangle */
 	gfx_rect_t down_btn_rect;
Index: uspace/lib/ui/src/resource.c
===================================================================
--- uspace/lib/ui/src/resource.c	(revision 5ef85c0bd5ee99c810fd320afd396bede779e6f0)
+++ uspace/lib/ui/src/resource.c	(revision 1026cc40ce00dd8415da596685d9d654056793cb)
@@ -85,4 +85,5 @@
 	gfx_color_t *entry_sel_text_bg_color = NULL;
 	gfx_color_t *sbar_through_color = NULL;
+	gfx_color_t *sbar_act_through_color = NULL;
 	errno_t rc;
 
@@ -211,4 +212,9 @@
 	rc = gfx_color_new_rgb_i16(0xe4e4, 0xe4e4, 0xe4e4,
 	    &sbar_through_color);
+	if (rc != EOK)
+		goto error;
+
+	rc = gfx_color_new_rgb_i16(0x5858, 0x5858, 0x5858,
+	    &sbar_act_through_color);
 	if (rc != EOK)
 		goto error;
@@ -248,4 +254,5 @@
 
 	resource->sbar_through_color = sbar_through_color;
+	resource->sbar_act_through_color = sbar_act_through_color;
 
 	*rresource = resource;
@@ -306,4 +313,6 @@
 	if (sbar_through_color != NULL)
 		gfx_color_delete(sbar_through_color);
+	if (sbar_act_through_color != NULL)
+		gfx_color_delete(sbar_act_through_color);
 
 	if (tface != NULL)
@@ -350,4 +359,5 @@
 	gfx_color_t *entry_act_bg_color = NULL;
 	gfx_color_t *sbar_through_color = NULL;
+	gfx_color_t *sbar_act_through_color = NULL;
 	errno_t rc;
 
@@ -462,4 +472,8 @@
 
 	rc = gfx_color_new_ega(0x07, &sbar_through_color);
+	if (rc != EOK)
+		goto error;
+
+	rc = gfx_color_new_ega(0x07, &sbar_act_through_color);
 	if (rc != EOK)
 		goto error;
@@ -499,4 +513,5 @@
 
 	resource->sbar_through_color = sbar_through_color;
+	resource->sbar_act_through_color = sbar_act_through_color;
 
 	*rresource = resource;
@@ -556,4 +571,6 @@
 	if (sbar_through_color != NULL)
 		gfx_color_delete(sbar_through_color);
+	if (sbar_act_through_color != NULL)
+		gfx_color_delete(sbar_act_through_color);
 
 	if (tface != NULL)
@@ -615,4 +632,5 @@
 
 	gfx_color_delete(resource->sbar_through_color);
+	gfx_color_delete(resource->sbar_act_through_color);
 
 	gfx_font_close(resource->font);
Index: uspace/lib/ui/src/scrollbar.c
===================================================================
--- uspace/lib/ui/src/scrollbar.c	(revision 5ef85c0bd5ee99c810fd320afd396bede779e6f0)
+++ uspace/lib/ui/src/scrollbar.c	(revision 1026cc40ce00dd8415da596685d9d654056793cb)
@@ -32,4 +32,27 @@
 /**
  * @file Scrollbar
+ *
+ * Anatomy of a horizontal scrollbar:
+ *
+ *       Up                Down
+ *      through           through
+ * +---+------+--------+---------+---+
+ * | < |      |   |||  |         | > |
+ * +---+------+--------+---------+---+
+ *  Up           Thumb           Down
+ * button                       button
+ *
+ *     +-------- Through --------+
+ *
+ * Scrollbar uses the same terminology whether it is running in horizontal
+ * or vertical mode, in horizontal mode up means left, down means right
+ * (i.e. lower and higher coordinates, respectively).
+ *
+ * The thumb can be dragged to a specific position, resulting in a move
+ * event. The up/down buttons generate up/down events. Pressing a mouse
+ * button on the up/down through generates page up / page down events.
+ *
+ * TODO: Up/down buttons/throughs should be equipped with an autorepeat
+ * mechanism: after an initial delay, start repeating at a preset rate.
  */
 
@@ -391,12 +414,26 @@
 		goto error;
 
-	/* Paint scrollbar through */
-
+	/* Paint scrollbar up through */
 	rc = gfx_set_color(scrollbar->res->gc,
+	    scrollbar->up_through_held ?
+	    scrollbar->res->sbar_act_through_color :
 	    scrollbar->res->sbar_through_color);
 	if (rc != EOK)
 		goto error;
 
-	rc = gfx_fill_rect(scrollbar->res->gc, &geom.through_rect);
+	rc = gfx_fill_rect(scrollbar->res->gc, &geom.up_through_rect);
+	if (rc != EOK)
+		goto error;
+
+	/* Paint scrollbar down through */
+
+	rc = gfx_set_color(scrollbar->res->gc,
+	    scrollbar->down_through_held ?
+	    scrollbar->res->sbar_act_through_color :
+	    scrollbar->res->sbar_through_color);
+	if (rc != EOK)
+		goto error;
+
+	rc = gfx_fill_rect(scrollbar->res->gc, &geom.down_through_rect);
 	if (rc != EOK)
 		goto error;
@@ -582,4 +619,14 @@
 	geom->thumb_rect.p1.y = orect.p1.y;
 
+	/* Up through */
+	geom->up_through_rect.p0 = geom->through_rect.p0;
+	geom->up_through_rect.p1.x = geom->thumb_rect.p0.x;
+	geom->up_through_rect.p1.y = geom->through_rect.p1.y;
+
+	/* Down through */
+	geom->down_through_rect.p0.x = geom->thumb_rect.p1.x;
+	geom->down_through_rect.p0.y = geom->through_rect.p0.y;
+	geom->down_through_rect.p1 = geom->through_rect.p1;
+
 	/* Down button */
 	geom->down_btn_rect.p0.x = geom->through_rect.p1.x;
@@ -618,15 +665,15 @@
 }
 
-/** Press down scrollbar.
+/** Press down scrollbar thumb.
  *
  * @param scrollbar Scrollbar
  * @param pos Pointer position
  */
-void ui_scrollbar_press(ui_scrollbar_t *scrollbar, gfx_coord2_t *pos)
-{
-	if (scrollbar->held)
+void ui_scrollbar_thumb_press(ui_scrollbar_t *scrollbar, gfx_coord2_t *pos)
+{
+	if (scrollbar->thumb_held)
 		return;
 
-	scrollbar->held = true;
+	scrollbar->thumb_held = true;
 	scrollbar->press_pos = *pos;
 	scrollbar->last_pos = scrollbar->pos;
@@ -635,4 +682,34 @@
 }
 
+/** Press down scrollbar up through.
+ *
+ * @param scrollbar Scrollbar
+ */
+void ui_scrollbar_up_through_press(ui_scrollbar_t *scrollbar)
+{
+	if (scrollbar->up_through_held)
+		return;
+
+	scrollbar->up_through_held = true;
+	(void) ui_scrollbar_paint(scrollbar);
+
+	ui_scrollbar_page_up(scrollbar);
+}
+
+/** Press down scrollbar down through.
+ *
+ * @param scrollbar Scrollbar
+ */
+void ui_scrollbar_down_through_press(ui_scrollbar_t *scrollbar)
+{
+	if (scrollbar->down_through_held)
+		return;
+
+	scrollbar->down_through_held = true;
+	(void) ui_scrollbar_paint(scrollbar);
+
+	ui_scrollbar_page_down(scrollbar);
+}
+
 /** Release scrollbar.
  *
@@ -642,9 +719,14 @@
 void ui_scrollbar_release(ui_scrollbar_t *scrollbar, gfx_coord2_t *pos)
 {
-	if (!scrollbar->held)
-		return;
-
-	ui_scrollbar_update(scrollbar, pos);
-	scrollbar->held = false;
+	if (scrollbar->thumb_held) {
+		ui_scrollbar_update(scrollbar, pos);
+		scrollbar->thumb_held = false;
+	}
+
+	if (scrollbar->up_through_held || scrollbar->down_through_held) {
+		scrollbar->up_through_held = false;
+		scrollbar->down_through_held = false;
+		(void) ui_scrollbar_paint(scrollbar);
+	}
 }
 
@@ -658,5 +740,5 @@
 	gfx_coord_t spos;
 
-	if (scrollbar->held) {
+	if (scrollbar->thumb_held) {
 		spos = scrollbar->last_pos + pos->x - scrollbar->press_pos.x;
 		ui_scrollbar_set_pos(scrollbar, spos);
@@ -680,6 +762,26 @@
 void ui_scrollbar_down(ui_scrollbar_t *scrollbar)
 {
-	if (scrollbar->cb != NULL && scrollbar->cb->up != NULL)
+	if (scrollbar->cb != NULL && scrollbar->cb->down != NULL)
 		scrollbar->cb->down(scrollbar, scrollbar->arg);
+}
+
+/** Scrollbar up through was pressed.
+ *
+ * @param scrollbar Scrollbar
+ */
+void ui_scrollbar_page_up(ui_scrollbar_t *scrollbar)
+{
+	if (scrollbar->cb != NULL && scrollbar->cb->page_up != NULL)
+		scrollbar->cb->page_up(scrollbar, scrollbar->arg);
+}
+
+/** Scrollbar down through was pressed.
+ *
+ * @param scrollbar Scrollbar
+ */
+void ui_scrollbar_page_down(ui_scrollbar_t *scrollbar)
+{
+	if (scrollbar->cb != NULL && scrollbar->cb->page_down != NULL)
+		scrollbar->cb->page_down(scrollbar, scrollbar->arg);
 }
 
@@ -703,6 +805,8 @@
 {
 	gfx_coord2_t pos;
-	gfx_rect_t rect;
 	ui_evclaim_t claimed;
+	ui_scrollbar_geom_t geom;
+
+	ui_scrollbar_get_geom(scrollbar, &geom);
 
 	pos.x = event->hpos;
@@ -719,13 +823,20 @@
 	switch (event->type) {
 	case POS_PRESS:
-		ui_scrollbar_thumb_rect(scrollbar, &rect);
-		if (gfx_pix_inside_rect(&pos, &rect)) {
-			ui_scrollbar_press(scrollbar, &pos);
-			scrollbar->press_pos = pos;
+		if (gfx_pix_inside_rect(&pos, &geom.thumb_rect)) {
+			ui_scrollbar_thumb_press(scrollbar, &pos);
+			return ui_claimed;
+		}
+		if (gfx_pix_inside_rect(&pos, &geom.up_through_rect)) {
+			ui_scrollbar_up_through_press(scrollbar);
+			return ui_claimed;
+		}
+		if (gfx_pix_inside_rect(&pos, &geom.down_through_rect)) {
+			ui_scrollbar_down_through_press(scrollbar);
 			return ui_claimed;
 		}
 		break;
 	case POS_RELEASE:
-		if (scrollbar->held) {
+		if (scrollbar->thumb_held || scrollbar->up_through_held ||
+		    scrollbar->down_through_held) {
 			ui_scrollbar_release(scrollbar, &pos);
 			return ui_claimed;
Index: uspace/lib/ui/test/scrollbar.c
===================================================================
--- uspace/lib/ui/test/scrollbar.c	(revision 5ef85c0bd5ee99c810fd320afd396bede779e6f0)
+++ uspace/lib/ui/test/scrollbar.c	(revision 1026cc40ce00dd8415da596685d9d654056793cb)
@@ -65,4 +65,6 @@
 static void test_scrollbar_up(ui_scrollbar_t *, void *);
 static void test_scrollbar_down(ui_scrollbar_t *, void *);
+static void test_scrollbar_page_up(ui_scrollbar_t *, void *);
+static void test_scrollbar_page_down(ui_scrollbar_t *, void *);
 static void test_scrollbar_moved(ui_scrollbar_t *, void *, gfx_coord_t);
 
@@ -70,4 +72,6 @@
 	.up = test_scrollbar_up,
 	.down = test_scrollbar_down,
+	.page_up = test_scrollbar_page_up,
+	.page_down = test_scrollbar_page_down,
 	.moved = test_scrollbar_moved
 };
@@ -96,4 +100,6 @@
 	bool up;
 	bool down;
+	bool page_up;
+	bool page_down;
 	bool moved;
 	gfx_coord_t pos;
@@ -295,5 +301,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	PCUT_ASSERT_FALSE(scrollbar->held);
+	PCUT_ASSERT_FALSE(scrollbar->thumb_held);
 
 	rect.p0.x = 10;
@@ -337,5 +343,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	PCUT_ASSERT_FALSE(scrollbar->held);
+	PCUT_ASSERT_FALSE(scrollbar->thumb_held);
 
 	rect.p0.x = 10;
@@ -379,5 +385,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	PCUT_ASSERT_FALSE(scrollbar->held);
+	PCUT_ASSERT_FALSE(scrollbar->thumb_held);
 
 	rect.p0.x = 10;
@@ -419,5 +425,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	PCUT_ASSERT_FALSE(scrollbar->held);
+	PCUT_ASSERT_FALSE(scrollbar->thumb_held);
 
 	rect.p0.x = 10;
@@ -459,5 +465,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	PCUT_ASSERT_FALSE(scrollbar->held);
+	PCUT_ASSERT_FALSE(scrollbar->thumb_held);
 
 	rect.p0.x = 10;
@@ -489,6 +495,6 @@
 }
 
-/** Press and release scrollbar */
-PCUT_TEST(press_release)
+/** Press and release scrollbar thumb */
+PCUT_TEST(thumb_press_release)
 {
 	errno_t rc;
@@ -521,11 +527,11 @@
 	ui_scrollbar_set_cb(scrollbar, &test_scrollbar_cb, &resp);
 
-	PCUT_ASSERT_FALSE(scrollbar->held);
+	PCUT_ASSERT_FALSE(scrollbar->thumb_held);
 
 	pos.x = 11;
 	pos.y = 22;
 
-	ui_scrollbar_press(scrollbar, &pos);
-	PCUT_ASSERT_TRUE(scrollbar->held);
+	ui_scrollbar_thumb_press(scrollbar, &pos);
+	PCUT_ASSERT_TRUE(scrollbar->thumb_held);
 	PCUT_ASSERT_FALSE(resp.moved);
 
@@ -534,5 +540,5 @@
 
 	ui_scrollbar_release(scrollbar, &pos);
-	PCUT_ASSERT_FALSE(scrollbar->held);
+	PCUT_ASSERT_FALSE(scrollbar->thumb_held);
 	PCUT_ASSERT_TRUE(resp.moved);
 	PCUT_ASSERT_INT_EQUALS(10, scrollbar->pos);
@@ -577,11 +583,11 @@
 	ui_scrollbar_set_cb(scrollbar, &test_scrollbar_cb, &resp);
 
-	PCUT_ASSERT_FALSE(scrollbar->held);
+	PCUT_ASSERT_FALSE(scrollbar->thumb_held);
 
 	pos.x = 11;
 	pos.y = 22;
 
-	ui_scrollbar_press(scrollbar, &pos);
-	PCUT_ASSERT_TRUE(scrollbar->held);
+	ui_scrollbar_thumb_press(scrollbar, &pos);
+	PCUT_ASSERT_TRUE(scrollbar->thumb_held);
 	PCUT_ASSERT_FALSE(resp.moved);
 
@@ -590,5 +596,5 @@
 
 	ui_scrollbar_update(scrollbar, &pos);
-	PCUT_ASSERT_TRUE(scrollbar->held);
+	PCUT_ASSERT_TRUE(scrollbar->thumb_held);
 	PCUT_ASSERT_TRUE(resp.moved);
 	PCUT_ASSERT_INT_EQUALS(10, scrollbar->pos);
@@ -598,5 +604,5 @@
 
 	ui_scrollbar_release(scrollbar, &pos);
-	PCUT_ASSERT_FALSE(scrollbar->held);
+	PCUT_ASSERT_FALSE(scrollbar->thumb_held);
 	PCUT_ASSERT_TRUE(resp.moved);
 	PCUT_ASSERT_INT_EQUALS(20, scrollbar->pos);
@@ -683,4 +689,86 @@
 	ui_scrollbar_down(scrollbar);
 	PCUT_ASSERT_TRUE(resp.down);
+
+	ui_scrollbar_destroy(scrollbar);
+	ui_resource_destroy(resource);
+
+	rc = gfx_context_delete(gc);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+}
+
+/** ui_scrollbar_page_up() delivers page up event */
+PCUT_TEST(page_up)
+{
+	ui_scrollbar_t *scrollbar;
+	errno_t rc;
+	gfx_context_t *gc = NULL;
+	test_gc_t tgc;
+	ui_resource_t *resource = NULL;
+	test_cb_resp_t resp;
+
+	memset(&tgc, 0, sizeof(tgc));
+	rc = gfx_context_new(&ops, &tgc, &gc);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = ui_resource_create(gc, false, &resource);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(resource);
+
+	rc = ui_scrollbar_create(resource, &scrollbar);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	/* Page up with no callbacks set */
+	ui_scrollbar_page_up(scrollbar);
+
+	/* Pge up with callback not implementing page up */
+	ui_scrollbar_set_cb(scrollbar, &dummy_scrollbar_cb, NULL);
+	ui_scrollbar_page_up(scrollbar);
+
+	/* Page up with real callback set */
+	resp.page_up = false;
+	ui_scrollbar_set_cb(scrollbar, &test_scrollbar_cb, &resp);
+	ui_scrollbar_page_up(scrollbar);
+	PCUT_ASSERT_TRUE(resp.page_up);
+
+	ui_scrollbar_destroy(scrollbar);
+	ui_resource_destroy(resource);
+
+	rc = gfx_context_delete(gc);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+}
+
+/** ui_scrollbar_page_down() delivers page down event */
+PCUT_TEST(page_down)
+{
+	ui_scrollbar_t *scrollbar;
+	errno_t rc;
+	gfx_context_t *gc = NULL;
+	test_gc_t tgc;
+	ui_resource_t *resource = NULL;
+	test_cb_resp_t resp;
+
+	memset(&tgc, 0, sizeof(tgc));
+	rc = gfx_context_new(&ops, &tgc, &gc);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = ui_resource_create(gc, false, &resource);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(resource);
+
+	rc = ui_scrollbar_create(resource, &scrollbar);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	/* Page down with no callbacks set */
+	ui_scrollbar_page_down(scrollbar);
+
+	/* Page down with callback not implementing page down */
+	ui_scrollbar_set_cb(scrollbar, &dummy_scrollbar_cb, NULL);
+	ui_scrollbar_page_down(scrollbar);
+
+	/* Page down with real callback set */
+	resp.page_down = false;
+	ui_scrollbar_set_cb(scrollbar, &test_scrollbar_cb, &resp);
+	ui_scrollbar_page_down(scrollbar);
+	PCUT_ASSERT_TRUE(resp.page_down);
 
 	ui_scrollbar_destroy(scrollbar);
@@ -757,5 +845,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	PCUT_ASSERT_FALSE(scrollbar->held);
+	PCUT_ASSERT_FALSE(scrollbar->thumb_held);
 
 	rect.p0.x = 20;
@@ -770,5 +858,5 @@
 	event.vpos = 2;
 	claim = ui_scrollbar_pos_event(scrollbar, &event);
-	PCUT_ASSERT_FALSE(scrollbar->held);
+	PCUT_ASSERT_FALSE(scrollbar->thumb_held);
 	PCUT_ASSERT_EQUALS(ui_unclaimed, claim);
 
@@ -778,5 +866,5 @@
 	event.vpos = 20;
 	claim = ui_scrollbar_pos_event(scrollbar, &event);
-	PCUT_ASSERT_TRUE(scrollbar->held);
+	PCUT_ASSERT_TRUE(scrollbar->thumb_held);
 	PCUT_ASSERT_EQUALS(ui_claimed, claim);
 
@@ -786,5 +874,5 @@
 	event.vpos = 32;
 	claim = ui_scrollbar_pos_event(scrollbar, &event);
-	PCUT_ASSERT_FALSE(scrollbar->held);
+	PCUT_ASSERT_FALSE(scrollbar->thumb_held);
 	PCUT_ASSERT_EQUALS(ui_claimed, claim);
 
@@ -819,5 +907,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	PCUT_ASSERT_FALSE(scrollbar->held);
+	PCUT_ASSERT_FALSE(scrollbar->thumb_held);
 
 	rect.p0.x = 20;
@@ -865,5 +953,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	PCUT_ASSERT_FALSE(scrollbar->held);
+	PCUT_ASSERT_FALSE(scrollbar->thumb_held);
 
 	rect.p0.x = 20;
@@ -994,4 +1082,18 @@
 }
 
+static void test_scrollbar_page_up(ui_scrollbar_t *scrollbar, void *arg)
+{
+	test_cb_resp_t *resp = (test_cb_resp_t *) arg;
+
+	resp->page_up = true;
+}
+
+static void test_scrollbar_page_down(ui_scrollbar_t *scrollbar, void *arg)
+{
+	test_cb_resp_t *resp = (test_cb_resp_t *) arg;
+
+	resp->page_down = true;
+}
+
 static void test_scrollbar_moved(ui_scrollbar_t *scrollbar, void *arg, gfx_coord_t pos)
 {
