diff --git a/src/feh.h b/src/feh.h
index 63771b64965b952a99c3b9c95a80fe305e6d710a..4e7a3ff0f3e224da083db78de2cccdfb67af8b40 100644
--- a/src/feh.h
+++ b/src/feh.h
@@ -27,6 +27,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #ifndef FEH_H
 #define FEH_H
 
+#define _GNU_SOURCE
 #include <X11/Xlib.h>
 #include <X11/Xutil.h>
 #include <X11/Xatom.h>
diff --git a/src/filelist.c b/src/filelist.c
index 9a4af27f2d81e8bb92c26cc03911f5e45c3424e1..159491ad8eecba7eb25bc9fbf79a620e75137dc4 100644
--- a/src/filelist.c
+++ b/src/filelist.c
@@ -399,12 +399,18 @@ void feh_file_dirname(char *dst, feh_file * f, int maxlen)
 
 int feh_cmp_filename(void *file1, void *file2)
 {
-	return(strcmp(FEH_FILE(file1)->filename, FEH_FILE(file2)->filename));
+	if (!opt.version_sort)
+		return(strcmp(FEH_FILE(file1)->filename, FEH_FILE(file2)->filename));
+	else
+		return(strverscmp(FEH_FILE(file1)->filename, FEH_FILE(file2)->filename));
 }
 
 int feh_cmp_name(void *file1, void *file2)
 {
-	return(strcmp(FEH_FILE(file1)->name, FEH_FILE(file2)->name));
+	if (!opt.version_sort)
+		return(strcmp(FEH_FILE(file1)->name, FEH_FILE(file2)->name));
+	else
+		return(strverscmp(FEH_FILE(file1)->name, FEH_FILE(file2)->name));
 }
 
 int feh_cmp_dirname(void *file1, void *file2)
@@ -413,8 +419,13 @@ int feh_cmp_dirname(void *file1, void *file2)
 	int cmp;
 	feh_file_dirname(dir1, FEH_FILE(file1), PATH_MAX);
 	feh_file_dirname(dir2, FEH_FILE(file2), PATH_MAX);
-	if ((cmp = strcmp(dir1, dir2)) != 0)
-		return(cmp);
+	if (!opt.version_sort) {
+		if ((cmp = strcmp(dir1, dir2)) != 0)
+			return(cmp);
+	} else {
+		if ((cmp = strverscmp(dir1, dir2)) != 0)
+			return(cmp);
+	}
 	return(feh_cmp_name(file1, file2));
 }
 
diff --git a/src/help.raw b/src/help.raw
index 8b244c18971c8b3e128a87dcb8130827974c15d8..86bb617f1335e362d98dfbd5022907242fe34a6c 100644
--- a/src/help.raw
+++ b/src/help.raw
@@ -52,6 +52,7 @@ OPTIONS
                            name, filename, mtime, width, height, pixels, size,
                            or format
  -n, --reverse             Reverse sort order
+     --version-sort        Natural sort of (version) numbers within text
  -A, --action [;]ACTION    Specify action to perform when pressing <return>.
                            Executed by /bin/sh, may contain FORMAT SPECIFIERS
                            reloads image with \";\", switches to next otherwise
diff --git a/src/options.c b/src/options.c
index 0ad7c74991c1fc83650caa0773e31a623721e8d5..3d1148264c8b568a396ac26fc9063aa6a1f0d0d8 100644
--- a/src/options.c
+++ b/src/options.c
@@ -415,6 +415,7 @@ static void feh_parse_option_array(int argc, char **argv, int finalrun)
 		{"insecure"      , 0, 0, 240},
 		{"no-recursive"  , 0, 0, 241},
 		{"cache-size"    , 1, 0, 243},
+		{"version-sort"  , 0, 0, 246},
 		{0, 0, 0, 0}
 	};
 	int optch = 0, cmdx = 0;
@@ -780,6 +781,9 @@ static void feh_parse_option_array(int argc, char **argv, int finalrun)
 			if (opt.cache_size > 2048)
 				opt.cache_size = 2048;
 			break;
+		case 246:
+			opt.version_sort = 1;
+			break;
 		default:
 			break;
 		}
diff --git a/src/options.h b/src/options.h
index 33b2bd35b63e316afa41983d67a82c706c28ea23..c6b4e0ef2dd854df9eae65242ccdb257f4b4db07 100644
--- a/src/options.h
+++ b/src/options.h
@@ -104,6 +104,7 @@ struct __fehoptions {
 	unsigned int thumb_redraw;
 	double reload;
 	int sort;
+	int version_sort;
 	int debug;
 	int geom_flags;
 	int geom_x;