diff --git a/options-table.c b/options-table.c
index 5da095b..526b4ce 100644
--- a/options-table.c
+++ b/options-table.c
@@ -495,6 +495,11 @@ const struct options_table_entry window_options_table[] = {
 	  .maximum = USHRT_MAX
 	},
 
+	{ .name = "case-insensitive-search",
+	  .type = OPTIONS_TABLE_FLAG,
+	  .default_num = 0
+	},
+
 	{ .name = "clock-mode-colour",
 	  .type = OPTIONS_TABLE_COLOUR,
 	  .default_num = 4
diff --git a/window-copy.c b/window-copy.c
index f690c7c..d0d334a 100644
--- a/window-copy.c
+++ b/window-copy.c
@@ -18,6 +18,7 @@
 
 #include <sys/types.h>
 
+#include <ctype.h>
 #include <stdlib.h>
 #include <string.h>
 
@@ -41,11 +42,11 @@ void	window_copy_write_lines(
 
 void	window_copy_scroll_to(struct window_pane *, u_int, u_int);
 int	window_copy_search_compare(
-	    struct grid *, u_int, u_int, struct grid *, u_int);
+	    struct grid *, u_int, u_int, struct grid *, u_int, int);
 int	window_copy_search_lr(
-	    struct grid *, struct grid *, u_int *, u_int, u_int, u_int);
+	    struct grid *, struct grid *, u_int *, u_int, u_int, u_int, int);
 int	window_copy_search_rl(
-	    struct grid *, struct grid *, u_int *, u_int, u_int, u_int);
+	    struct grid *, struct grid *, u_int *, u_int, u_int, u_int, int);
 void	window_copy_search_up(struct window_pane *, const char *);
 void	window_copy_search_down(struct window_pane *, const char *);
 void	window_copy_goto_line(struct window_pane *, const char *);
@@ -916,7 +917,7 @@ window_copy_scroll_to(struct window_pane *wp, u_int px, u_int py)
 
 int
 window_copy_search_compare(
-    struct grid *gd, u_int px, u_int py, struct grid *sgd, u_int spx)
+    struct grid *gd, u_int px, u_int py, struct grid *sgd, u_int spx, int cis)
 {
 	const struct grid_cell	*gc, *sgc;
 	struct utf8_data	 ud, sud;
@@ -928,12 +929,16 @@ window_copy_search_compare(
 
 	if (ud.size != sud.size || ud.width != sud.width)
 		return (0);
+
+	if (cis && ud.size == 1)
+		return (tolower(ud.data[0]) == tolower(sud.data[0]));
+
 	return (memcmp(ud.data, sud.data, ud.size) == 0);
 }
 
 int
 window_copy_search_lr(struct grid *gd,
-    struct grid *sgd, u_int *ppx, u_int py, u_int first, u_int last)
+    struct grid *sgd, u_int *ppx, u_int py, u_int first, u_int last, int cis)
 {
 	u_int	ax, bx, px;
 
@@ -942,7 +947,7 @@ window_copy_search_lr(struct grid *gd,
 			break;
 		for (bx = 0; bx < sgd->sx; bx++) {
 			px = ax + bx;
-			if (!window_copy_search_compare(gd, px, py, sgd, bx))
+			if (!window_copy_search_compare(gd, px, py, sgd, bx, cis))
 				break;
 		}
 		if (bx == sgd->sx) {
@@ -955,7 +960,7 @@ window_copy_search_lr(struct grid *gd,
 
 int
 window_copy_search_rl(struct grid *gd,
-    struct grid *sgd, u_int *ppx, u_int py, u_int first, u_int last)
+    struct grid *sgd, u_int *ppx, u_int py, u_int first, u_int last, int cis)
 {
 	u_int	ax, bx, px;
 
@@ -964,7 +969,7 @@ window_copy_search_rl(struct grid *gd,
 			continue;
 		for (bx = 0; bx < sgd->sx; bx++) {
 			px = ax - 1 + bx;
-			if (!window_copy_search_compare(gd, px, py, sgd, bx))
+			if (!window_copy_search_compare(gd, px, py, sgd, bx, cis))
 				break;
 		}
 		if (bx == sgd->sx) {
@@ -985,7 +990,7 @@ window_copy_search_up(struct window_pane *wp, const char *searchstr)
 	struct grid_cell	 	 gc;
 	size_t				 searchlen;
 	u_int				 i, last, fx, fy, px;
-	int				 utf8flag, n, wrapped, wrapflag;
+	int				 utf8flag, n, wrapped, wrapflag, cis;
 
 	if (*searchstr == '\0')
 		return;
@@ -1011,13 +1016,15 @@ window_copy_search_up(struct window_pane *wp, const char *searchstr)
 		fx--;
 	n = wrapped = 0;
 
+	cis = options_get_number(&wp->window->options, "case-insensitive-search");
+
 retry:
 	sgd = ss.grid;
 	for (i = fy + 1; i > 0; i--) {
 		last = screen_size_x(s);
 		if (i == fy + 1)
 			last = fx;
-		n = window_copy_search_rl(gd, sgd, &px, i - 1, 0, last);
+		n = window_copy_search_rl(gd, sgd, &px, i - 1, 0, last, cis);
 		if (n) {
 			window_copy_scroll_to(wp, px, i - 1);
 			break;
@@ -1043,7 +1050,7 @@ window_copy_search_down(struct window_pane *wp, const char *searchstr)
 	struct grid_cell	 	 gc;
 	size_t				 searchlen;
 	u_int				 i, first, fx, fy, px;
-	int				 utf8flag, n, wrapped, wrapflag;
+	int				 utf8flag, n, wrapped, wrapflag, cis;
 
 	if (*searchstr == '\0')
 		return;
@@ -1069,13 +1076,15 @@ window_copy_search_down(struct window_pane *wp, const char *searchstr)
 		fx++;
 	n = wrapped = 0;
 
+	cis = options_get_number(&wp->window->options, "case-insensitive-search");
+
 retry:
 	sgd = ss.grid;
 	for (i = fy + 1; i < gd->hsize + gd->sy + 1; i++) {
 		first = 0;
 		if (i == fy + 1)
 			first = fx;
-		n = window_copy_search_lr(gd, sgd, &px, i - 1, first, gd->sx);
+		n = window_copy_search_lr(gd, sgd, &px, i - 1, first, gd->sx, cis);
 		if (n) {
 			window_copy_scroll_to(wp, px, i - 1);
 			break;
