diff --git a/ChangeLog b/ChangeLog
index c2075b63e532e53eced63d459320414619888b6f..cca05258e1f4e2e925c6e172e2cecd641ec09783 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,6 @@
-git HEAD
+Mon, 24 Dec 2012 15:45:54 +0100  Daniel Friesel <derf+feh@finalrewind.org>
 
+* Release v2.8
     * Do not apply --scale-down to the thumbnail window. It will be applied
       to windows opened from this, though.
       <https://github.com/derf/feh/issues/106>
@@ -13,6 +14,10 @@ git HEAD
     * Treat quick, low-offset drags (1px or 2px move in <1 second) as clicks
       to improve graphics tablet support
       <https://github.com/derf/feh/issues/113>
+    * Respect --start-at in thumbnail mode
+      <https://github.com/derf/feh/issues/116>
+    * Make 'z' (jump_random) work in thumbnail mode as well, fix thumbnail
+      selection roll-over <https://github.com/derf/feh/issues/115>
 
 Tue, 16 Oct 2012 06:29:58 +0200  Daniel Friesel <derf+feh@finalrewind.org>
 
diff --git a/src/keyevents.c b/src/keyevents.c
index 18853edfecd360ec101a54f801d11a352a8c55a2..470d624e0d0ec66f0b3a5383cec367ed2bc01ac6 100644
--- a/src/keyevents.c
+++ b/src/keyevents.c
@@ -658,7 +658,10 @@ void feh_event_handle_keypress(XEvent * ev)
 		opt.hide_pointer = !opt.hide_pointer;
 	}
 	else if (feh_is_kp(&keys.jump_random, keysym, state)) {
-		slideshow_change_image(winwid, SLIDE_RAND, 1);
+		if (winwid->type == WIN_TYPE_THUMBNAIL)
+			feh_thumbnail_select_next(winwid, rand() % (filelist_len - 1));
+		else
+			slideshow_change_image(winwid, SLIDE_RAND, 1);
 	}
 	else if (feh_is_kp(&keys.toggle_caption, keysym, state)) {
 		if (opt.caption_path) {
diff --git a/src/thumbnail.c b/src/thumbnail.c
index fbe2ce03a8208120237f89eeb6a38715de106df6..a77152a78594af7f4ffd24dab02f08d7e157458b 100644
--- a/src/thumbnail.c
+++ b/src/thumbnail.c
@@ -400,6 +400,16 @@ void init_thumbnail_mode(void)
 
 	if (!opt.display)
 		gib_imlib_free_image_and_decache(td.im_main);
+	else if (opt.start_list_at) {
+		for (l = thumbnails; l; l = l->next) {
+			if (!strcmp(opt.start_list_at, FEH_THUMB(l->data)->file->filename)) {
+				opt.start_list_at = NULL;
+				feh_thumbnail_select(winwid, FEH_THUMB(l->data));
+				break;
+			}
+		}
+	}
+
 
 	free(s);
 	return;
@@ -776,36 +786,47 @@ void feh_thumbnail_select(winwidget winwid, feh_thumbnail *thumbnail)
 
 void feh_thumbnail_select_next(winwidget winwid, int jump)
 {
-	gib_list *l, *tmp;
-	int i;
+	gib_list *l;
+	feh_thumbnail *thumb;
+	int len = 0, cur = 0, target = 0;
 
-	for (l = thumbnails; l && l->next; l = l->next) {
-		tmp = l;
-		for (i = jump; (i > 0) && tmp->next; i--)
-			tmp = tmp->next;
-		if (tmp->data == td.selected)
-			break;
+	for (l = thumbnails; l; l = l->next) {
+		thumb = FEH_THUMB(l->data);
+		if (thumb == td.selected)
+			cur = len;
+		len++;
 	}
 
-	feh_thumbnail_select(winwid, FEH_THUMB(l->data));
+	target = (cur + len - jump) % len;
+
+	for (l = thumbnails; l; l = l->next) {
+		if (target-- == 0) {
+			feh_thumbnail_select(winwid, FEH_THUMB(l->data));
+		}
+	}
 }
 
 void feh_thumbnail_select_prev(winwidget winwid, int jump)
 {
 	gib_list *l;
 	feh_thumbnail *thumb;
-	int i;
+	int len = 0, cur = 0, target = 0;
 
 	for (l = thumbnails; l; l = l->next) {
 		thumb = FEH_THUMB(l->data);
-		if ((thumb == td.selected) && l->next) {
-			for (i = jump; (i > 0) && l->next; i--)
-				l = l->next;
+		if (thumb == td.selected)
+			cur = len;
+		len++;
+	}
+
+	target = (cur + jump) % len;
+
+	for (l = thumbnails; l; l = l->next) {
+		if (target-- == 0) {
 			feh_thumbnail_select(winwid, FEH_THUMB(l->data));
-			return;
+			break;
 		}
 	}
-	feh_thumbnail_select(winwid, FEH_THUMB(thumbnails->data));
 }
 
 inline void feh_thumbnail_show_selected()