diff --git a/src/feh.h b/src/feh.h
index bfd71db9ab73f35c4e9927f321c20f92e1633e2e..60baade11d9744d5b6a0a9bef1c7a7818885850b 100644
--- a/src/feh.h
+++ b/src/feh.h
@@ -133,6 +133,7 @@ void init_list_mode(void);
 void init_loadables_mode(void);
 void init_unloadables_mode(void);
 void feh_clean_exit(void);
+int feh_should_ignore_image(Imlib_Image * im);
 int feh_load_image(Imlib_Image * im, feh_file * file);
 void show_mini_usage(void);
 void slideshow_change_image(winwidget winwid, int change, int render);
diff --git a/src/filelist.c b/src/filelist.c
index b569b8ae7e98ef67a581d67abf3a4370136a7d35..9a4af27f2d81e8bb92c26cc03911f5e45c3424e1 100644
--- a/src/filelist.c
+++ b/src/filelist.c
@@ -464,9 +464,17 @@ int feh_cmp_format(void *file1, void *file2)
 
 void feh_prepare_filelist(void)
 {
-	if (opt.list || opt.customlist || (opt.sort > SORT_MTIME)
-			|| opt.preload || opt.min_width || opt.min_height
-			|| (opt.max_width != UINT_MAX) || (opt.max_height != UINT_MAX)) {
+	/*
+	 * list and customlist mode as well as the somewhat more fancy sort modes
+	 * need access to file infos. Preloading them is also useful for
+	 * list/customlist as --min-dimension/--max-dimension may filter images
+	 * which should not be processed.
+	 * Finally, if --min-dimension/--max-dimension (-> opt.filter_by_dimensions)
+	 * is set and we're in thumbnail mode, we need to filter images first so
+	 * we can create a properly sized thumbnail list.
+	 */
+	if (opt.list || opt.preload || opt.customlist || (opt.sort > SORT_MTIME)
+			|| (opt.filter_by_dimensions && (opt.index || opt.collage || opt.thumbs || opt.bgmode))) {
 		/* For these sort options, we have to preload images */
 		filelist = feh_file_info_preload(filelist);
 		if (!gib_list_length(filelist))
diff --git a/src/imlib.c b/src/imlib.c
index 6de6bdba952bae908080c8ec715ed1a01b8faa7d..d9c5cd014b4a15375cc9ea00e7f7de903169e126 100644
--- a/src/imlib.c
+++ b/src/imlib.c
@@ -139,6 +139,18 @@ void init_x_and_imlib(void)
 	return;
 }
 
+int feh_should_ignore_image(Imlib_Image * im)
+{
+	if (opt.filter_by_dimensions) {
+		unsigned int w = gib_imlib_image_get_width(im);
+		unsigned int h = gib_imlib_image_get_height(im);
+		if (w < opt.min_width || w > opt.max_width || h < opt.min_height || h > opt.max_height) {
+			return 1;
+		}
+	}
+	return 0;
+}
+
 int feh_load_image_char(Imlib_Image * im, char *filename)
 {
 	feh_file *file;
diff --git a/src/options.c b/src/options.c
index bf5c67ccd09ff0aca8979e6db1c20c485646b3c4..76d70c5f518081f515d451fb0446c3ebeededfe4 100644
--- a/src/options.c
+++ b/src/options.c
@@ -433,6 +433,7 @@ static void feh_parse_option_array(int argc, char **argv, int finalrun)
 			opt.debug = 1;
 			break;
 		case '<':
+			opt.filter_by_dimensions = 1;
 			XParseGeometry(optarg, &discard, &discard, &opt.max_width, &opt.max_height);
 			if (opt.max_width == 0)
 				opt.max_width = UINT_MAX;
@@ -440,6 +441,7 @@ static void feh_parse_option_array(int argc, char **argv, int finalrun)
 				opt.max_height = UINT_MAX;
 			break;
 		case '>':
+			opt.filter_by_dimensions = 1;
 			XParseGeometry(optarg, &discard, &discard, &opt.min_width, &opt.min_height);
 			break;
 		case '.':
diff --git a/src/options.h b/src/options.h
index c6959c8a2218553394794ca5bdac28a9e00e1428..9bf27635968c9e883b494a912198d7d55ebb5406 100644
--- a/src/options.h
+++ b/src/options.h
@@ -75,6 +75,7 @@ struct __fehoptions {
 	unsigned char no_fehbg;
 	unsigned char keep_zoom_vp;
 	unsigned char insecure_ssl;
+	unsigned char filter_by_dimensions;
 
 	char *output_file;
 	char *output_dir;
diff --git a/src/slideshow.c b/src/slideshow.c
index c6d82a6a1841e8a4d39af27cc2673831388befdf..d56c1b680b9beda608a19598a2c805648978f542 100644
--- a/src/slideshow.c
+++ b/src/slideshow.c
@@ -360,16 +360,20 @@ void slideshow_change_image(winwidget winwid, int change, int render)
 			tzoom = winwid->zoom;
 		}
 
-		if ((winwidget_loadimage(winwid, FEH_FILE(current_file->data)))
-		    != 0) {
+		if (winwidget_loadimage(winwid, FEH_FILE(current_file->data))) {
+			int w = gib_imlib_image_get_width(winwid->im);
+			int h = gib_imlib_image_get_height(winwid->im);
+			if (feh_should_ignore_image(winwid->im)) {
+				last = current_file;
+				continue;
+			}
 			winwid->mode = MODE_NORMAL;
 			winwid->file = current_file;
-			if ((winwid->im_w != gib_imlib_image_get_width(winwid->im))
-			    || (winwid->im_h != gib_imlib_image_get_height(winwid->im)))
+			if ((winwid->im_w != w) || (winwid->im_h != h))
 				winwid->had_resize = 1;
 			winwidget_reset_image(winwid);
-			winwid->im_w = gib_imlib_image_get_width(winwid->im);
-			winwid->im_h = gib_imlib_image_get_height(winwid->im);
+			winwid->im_w = w;
+			winwid->im_h = h;
 			if (opt.keep_zoom_vp) {
 				/* put back in: */
 				winwid->mode = tmode;
diff --git a/src/winwidget.c b/src/winwidget.c
index 33113834073208e5d8927dbd39e599781ede28b5..96004658afe414a229137fefdd41dc2a774f88a4 100644
--- a/src/winwidget.c
+++ b/src/winwidget.c
@@ -115,7 +115,7 @@ winwidget winwidget_create_from_file(gib_list * list, char type)
 	ret->file = list;
 	ret->type = type;
 
-	if (winwidget_loadimage(ret, file) == 0) {
+	if ((winwidget_loadimage(ret, file) == 0) || feh_should_ignore_image(ret->im)) {
 		winwidget_destroy(ret);
 		return(NULL);
 	}