diff --git a/src/keyevents.c b/src/keyevents.c
index ddfe782bcdf7422d4382b01920b52b3c818e1f8d..12e9f7360c9480cc9281e919a7d571bfd79f2b2d 100644
--- a/src/keyevents.c
+++ b/src/keyevents.c
@@ -50,22 +50,22 @@ static void feh_set_parse_kb_partial(fehkey *key, int index, char *ks) {
 		return;
 	}
 
-	if (ks[1] == '-') {
-		switch (ks[0]) {
+	while (cur[1] == '-') {
+		switch (cur[0]) {
 			case 'C':
-				mod = ControlMask;
+				mod |= ControlMask;
 				break;
 			case '1':
-				mod = Mod1Mask;
+				mod |= Mod1Mask;
 				break;
 			case '4':
-				mod = Mod4Mask;
+				mod |= Mod4Mask;
 				break;
 			default:
-				weprintf("keys: invalid modifier %c in %s", ks[0], ks);
+				weprintf("keys: invalid modifier %c in %s", cur[0], ks);
 				break;
 		}
-		cur = ks + 2;
+		cur += 2;
 	}
 
 	key->keysyms[index] = XStringToKeysym(cur);
@@ -97,6 +97,10 @@ void init_keyevents(void) {
 	feh_set_kb(&keys.scroll_right,0,XK_KP_Right  , 4, XK_Right     , 0, 0);
 	feh_set_kb(&keys.scroll_down,0, XK_KP_Down   , 4, XK_Down      , 0, 0);
 	feh_set_kb(&keys.scroll_up , 0, XK_KP_Up     , 4, XK_Up        , 0, 0);
+	feh_set_kb(&keys.scroll_left_page , 8, XK_Left , 0, 0          , 0, 0);
+	feh_set_kb(&keys.scroll_right_page, 8, XK_Right, 0, 0          , 0, 0);
+	feh_set_kb(&keys.scroll_down_page , 8, XK_Down , 0, 0          , 0, 0);
+	feh_set_kb(&keys.scroll_up_page   , 8, XK_Up   , 0, 0          , 0, 0);
 	feh_set_kb(&keys.prev_img  , 0, XK_Left      , 0, XK_p         , 0, XK_BackSpace);
 	feh_set_kb(&keys.next_img  , 0, XK_Right     , 0, XK_n         , 0, XK_space);
 	feh_set_kb(&keys.jump_back , 0, XK_Page_Up   , 0, XK_KP_Page_Up, 0, 0);
@@ -191,6 +195,14 @@ void init_keyevents(void) {
 			cur_kb = &keys.scroll_up;
 		else if (!strcmp(action, "scroll_down"))
 			cur_kb = &keys.scroll_down;
+		else if (!strcmp(action, "scroll_right_page"))
+			cur_kb = &keys.scroll_right_page;
+		else if (!strcmp(action, "scroll_left_page"))
+			cur_kb = &keys.scroll_left_page;
+		else if (!strcmp(action, "scroll_up_page"))
+			cur_kb = &keys.scroll_up_page;
+		else if (!strcmp(action, "scroll_down_page"))
+			cur_kb = &keys.scroll_down_page;
 		else if (!strcmp(action, "prev_img"))
 			cur_kb = &keys.prev_img;
 		else if (!strcmp(action, "next_img"))
@@ -449,6 +461,22 @@ void feh_event_handle_keypress(XEvent * ev)
 		winwid->im_y += 20;
 		winwidget_render_image(winwid, 0, 1);
 	}
+	else if (feh_is_kp(&keys.scroll_right_page, keysym, state)) {
+		winwid->im_x -= winwid->w;
+		winwidget_render_image(winwid, 0, 1);
+	}
+	else if (feh_is_kp(&keys.scroll_left_page, keysym, state)) {
+		winwid->im_x += winwid->w;
+		winwidget_render_image(winwid, 0, 1);
+	}
+	else if (feh_is_kp(&keys.scroll_down_page, keysym, state)) {
+		winwid->im_y -= winwid->h;
+		winwidget_render_image(winwid, 0, 1);
+	}
+	else if (feh_is_kp(&keys.scroll_up_page, keysym, state)) {
+		winwid->im_y += winwid->h;
+		winwidget_render_image(winwid, 0, 1);
+	}
 	else if (feh_is_kp(&keys.jump_back, keysym, state)) {
 		if (opt.slideshow)
 			slideshow_change_image(winwid, SLIDE_JUMP_BACK);
diff --git a/src/options.h b/src/options.h
index f0015c9be35a20afed93897fbfdb0dc7fe4b58c8..3c624413e8bc0f661de73ad3e41a3b0abc05e696 100644
--- a/src/options.h
+++ b/src/options.h
@@ -152,6 +152,10 @@ struct __fehkb {
 	struct __fehkey next_img;
 	struct __fehkey scroll_up;
 	struct __fehkey scroll_down;
+	struct __fehkey scroll_right_page;
+	struct __fehkey scroll_left_page;
+	struct __fehkey scroll_up_page;
+	struct __fehkey scroll_down_page;
 	struct __fehkey jump_back;
 	struct __fehkey quit;
 	struct __fehkey jump_fwd;