diff --git a/options.c b/options.c
index 258dc37..66cfcc5 100644
--- a/options.c
+++ b/options.c
@@ -32,7 +32,7 @@ const options_t *options = (const options_t*) &_options;
 
 void print_usage(void)
 {
-	printf("usage: sxiv [-abcfhioqrtvZ] [-A FRAMERATE] [-e WID] [-G GAMMA] "
+	printf("usage: sxiv [-abcfhiopqrtvZ] [-A FRAMERATE] [-e WID] [-G GAMMA] "
 	       "[-g GEOMETRY] [-N NAME] [-n NUM] [-S DELAY] [-s MODE] [-z ZOOM] "
 	       "FILES...\n");
 }
@@ -72,8 +72,9 @@ void parse_options(int argc, char **argv)
 	_options.quiet = false;
 	_options.thumb_mode = false;
 	_options.clean_cache = false;
+	_options.private_mode = false;
 
-	while ((opt = getopt(argc, argv, "A:abce:fG:g:hin:N:oqrS:s:tvZz:")) != -1) {
+	while ((opt = getopt(argc, argv, "A:abce:fG:g:hin:N:opqrS:s:tvZz:")) != -1) {
 		switch (opt) {
 			case '?':
 				print_usage();
@@ -129,6 +130,9 @@ void parse_options(int argc, char **argv)
 			case 'o':
 				_options.to_stdout = true;
 				break;
+			case 'p':
+				_options.private_mode = true;
+				break;
 			case 'q':
 				_options.quiet = true;
 				break;
diff --git a/options.h b/options.h
index c9879f3..53153da 100644
--- a/options.h
+++ b/options.h
@@ -50,6 +50,7 @@ typedef struct {
 	bool quiet;
 	bool thumb_mode;
 	bool clean_cache;
+	bool private_mode;
 } options_t;
 
 extern const options_t *options;
diff --git a/sxiv.1 b/sxiv.1
index dd2d7c5..bf738f8 100644
--- a/sxiv.1
+++ b/sxiv.1
@@ -3,7 +3,7 @@
 sxiv \- Simple X Image Viewer
 .SH SYNOPSIS
 .B sxiv
-.RB [ \-abcfhioqrtvZ ]
+.RB [ \-abcfhiopqrtvZ ]
 .RB [ \-A
 .IR FRAMERATE ]
 .RB [ \-e
@@ -80,6 +80,9 @@ with
 .B \-i
 sxiv can be used as a visual filter/pipe.
 .TP
+.B \-p
+Enable private mode, in which sxiv does not write any cache or temporary files.
+.TP
 .B \-q
 Be quiet, disable warnings to standard error stream.
 .TP
diff --git a/thumbs.c b/thumbs.c
index 4f6c181..a9f4fe0 100644
--- a/thumbs.c
+++ b/thumbs.c
@@ -25,6 +25,7 @@
 #include <unistd.h>
 #include <utime.h>
 
+#include "options.h"
 #include "thumbs.h"
 #include "util.h"
 
@@ -83,6 +84,9 @@ void tns_cache_write(Imlib_Image im, const char *filepath, bool force)
 	struct utimbuf times;
 	Imlib_Load_Error err = 0;
 
+	if (options->private_mode)
+		return;
+
 	if (stat(filepath, &fstats) < 0)
 		return;
 
@@ -270,7 +274,7 @@ bool tns_load(tns_t *tns, int n, bool force, bool cache_only)
 				cache_hit = true;
 			}
 #if HAVE_LIBEXIF
-		} else if (!force) {
+		} else if (!force && !options->private_mode) {
 			int pw = 0, ph = 0, w, h, x = 0, y = 0;
 			bool err;
 			float zw, zh;