diff --git a/Makefile b/Makefile
index 4455b9b..07fff5e 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-VERSION   := git-20161030
+VERSION   := git-20161128
 
 PREFIX    := /usr/local
 MANPREFIX := $(PREFIX)/share/man
diff --git a/image.c b/image.c
index 801bbe5..dd37207 100644
--- a/image.c
+++ b/image.c
@@ -68,6 +68,7 @@ void img_init(img_t *img, win_t *win)
 	img->alpha = ALPHA_LAYER;
 	img->multi.cap = img->multi.cnt = 0;
 	img->multi.animate = options->animate;
+	img->multi.framedelay = options->framerate > 0 ? 1000 / options->framerate : 0;
 	img->multi.length = 0;
 
 	img->cmod = imlib_create_color_modifier();
@@ -263,6 +264,7 @@ bool img_load_gif(img_t *img, const fileinfo_t *file)
 				                             img->multi.cap * sizeof(img_frame_t));
 			}
 			img->multi.frames[img->multi.cnt].im = im;
+			delay = img->multi.framedelay > 0 ? img->multi.framedelay : delay;
 			img->multi.frames[img->multi.cnt].delay = delay > 0 ? delay : DEF_GIF_DELAY;
 			img->multi.length += img->multi.frames[img->multi.cnt].delay;
 			img->multi.cnt++;
diff --git a/image.h b/image.h
index 8932fdf..2813c9b 100644
--- a/image.h
+++ b/image.h
@@ -35,6 +35,7 @@ typedef struct {
 	int cnt;
 	int sel;
 	bool animate;
+	int framedelay;
 	int length;
 } multi_img_t;
 
diff --git a/options.c b/options.c
index 4a9772c..5220330 100644
--- a/options.c
+++ b/options.c
@@ -32,8 +32,9 @@ const options_t *options = (const options_t*) &_options;
 
 void print_usage(void)
 {
-	printf("usage: sxiv [-abcfhioqrtvZ] [-e WID] [-G GAMMA] [-g GEOMETRY] "
-	       "[-N NAME] [-n NUM] [-S DELAY] [-s MODE] [-z ZOOM] FILES...\n");
+	printf("usage: sxiv [-abcfhioqrtvZ] [-A FRAMERATE] [-e WID] [-G GAMMA] "
+	       "[-g GEOMETRY] [-N NAME] [-n NUM] [-S DELAY] [-s MODE] [-z ZOOM] "
+	       "FILES...\n");
 }
 
 void print_version(void)
@@ -60,6 +61,7 @@ void parse_options(int argc, char **argv)
 	_options.animate = false;
 	_options.gamma = 0;
 	_options.slideshow = 0;
+	_options.framerate = 0;
 
 	_options.fullscreen = false;
 	_options.embed = 0;
@@ -71,11 +73,17 @@ void parse_options(int argc, char **argv)
 	_options.thumb_mode = false;
 	_options.clean_cache = false;
 
-	while ((opt = getopt(argc, argv, "abce:fG:g:hin:N:oqrS:s:tvZz:")) != -1) {
+	while ((opt = getopt(argc, argv, "A:abce:fG:g:hin:N:oqrS:s:tvZz:")) != -1) {
 		switch (opt) {
 			case '?':
 				print_usage();
 				exit(EXIT_FAILURE);
+			case 'A':
+				n = strtol(optarg, &end, 0);
+				if (*end != '\0' || n <= 0)
+					error(EXIT_FAILURE, 0, "Invalid argument for option -A: %s", optarg);
+				_options.framerate = n;
+				/* fall through */
 			case 'a':
 				_options.animate = true;
 				break;
diff --git a/options.h b/options.h
index 40c2506..c9879f3 100644
--- a/options.h
+++ b/options.h
@@ -37,6 +37,7 @@ typedef struct {
 	bool animate;
 	int gamma;
 	int slideshow;
+	int framerate;
 
 	/* window: */
 	bool fullscreen;
diff --git a/sxiv.1 b/sxiv.1
index ed91322..56841e8 100644
--- a/sxiv.1
+++ b/sxiv.1
@@ -4,6 +4,8 @@ sxiv \- Simple X Image Viewer
 .SH SYNOPSIS
 .B sxiv
 .RB [ \-abcfhioqrtvZ ]
+.RB [ \-A
+.IR FRAMERATE ]
 .RB [ \-e
 .IR WID ]
 .RB [ \-G
@@ -33,6 +35,10 @@ Please note, that the fullscreen mode requires an EWMH/NetWM compliant window
 manager.
 .SH OPTIONS
 .TP
+.BI "\-A " FRAMERATE
+Play animations with a constant frame rate set to
+.IR FRAMERATE .
+.TP
 .B \-a
 Play animations of multi-frame images.
 .TP