diff --git a/mode-key.c b/mode-key.c
index 1ed6d40..dfa3fb2 100644
--- a/mode-key.c
+++ b/mode-key.c
@@ -292,6 +292,7 @@ const struct mode_key_entry mode_key_vi_copy[] = {
 	{ 'k',			    0, MODEKEYCOPY_UP },
 	{ 'l',			    0, MODEKEYCOPY_RIGHT },
 	{ 'n',			    0, MODEKEYCOPY_SEARCHAGAIN },
+	{ 'o',			    0, MODEKEYCOPY_OTHEREND },
 	{ 't',			    0, MODEKEYCOPY_JUMPTO },
 	{ 'q',			    0, MODEKEYCOPY_CANCEL },
 	{ 'v',			    0, MODEKEYCOPY_RECTANGLETOGGLE },
diff --git a/tmux.h b/tmux.h
index 84ad164..3817a25 100644
--- a/tmux.h
+++ b/tmux.h
@@ -557,6 +557,7 @@ enum mode_key_cmd {
 	MODEKEYCOPY_NEXTSPACEEND,
 	MODEKEYCOPY_NEXTWORD,
 	MODEKEYCOPY_NEXTWORDEND,
+	MODEKEYCOPY_OTHEREND,
 	MODEKEYCOPY_PREVIOUSPAGE,
 	MODEKEYCOPY_PREVIOUSSPACE,
 	MODEKEYCOPY_PREVIOUSWORD,
diff --git a/window-copy.c b/window-copy.c
index f690c7c..a8542a1 100644
--- a/window-copy.c
+++ b/window-copy.c
@@ -65,6 +65,7 @@ u_int	window_copy_find_length(struct window_pane *, u_int);
 void	window_copy_cursor_start_of_line(struct window_pane *);
 void	window_copy_cursor_back_to_indentation(struct window_pane *);
 void	window_copy_cursor_end_of_line(struct window_pane *);
+void	window_copy_other_end(struct window_pane *);
 void	window_copy_cursor_left(struct window_pane *);
 void	window_copy_cursor_right(struct window_pane *);
 void	window_copy_cursor_up(struct window_pane *, int);
@@ -415,6 +416,10 @@ window_copy_key(struct window_pane *wp, struct session *sess, int key)
 	case MODEKEYCOPY_CANCEL:
 		window_pane_reset_mode(wp);
 		return;
+	case MODEKEYCOPY_OTHEREND:
+		for (; np != 0; np--)
+			window_copy_other_end(wp);
+		break;
 	case MODEKEYCOPY_LEFT:
 		for (; np != 0; np--)
 			window_copy_cursor_left(wp);
@@ -1619,6 +1624,42 @@ window_copy_cursor_end_of_line(struct window_pane *wp)
 }
 
 void
+window_copy_other_end(struct window_pane *wp)
+{
+	struct window_copy_mode_data	*data = wp->modedata;
+	struct screen			*s = &data->screen;
+	u_int				 selx, sely, cx, cy, yy;
+
+	if (!s->sel.flag)
+		return;
+
+	selx = data->selx;
+	sely = data->sely;
+	cx = data->cx;
+	cy = data->cy;
+	yy = screen_hsize(data->backing) + data->cy - data->oy;
+
+
+	data->selx = cx;
+	data->sely = yy;
+	data->cx = selx;
+
+	if (sely < screen_hsize(data->backing) - data->oy) {
+		data->oy = screen_hsize(data->backing) - sely;
+		data->cy = 0;
+
+	} else if (sely > screen_hsize(data->backing) - data->oy + screen_size_y(s)) {
+		data->oy = screen_hsize(data->backing) - sely + screen_size_y(s) - 1;
+		data->cy = screen_size_y(s) - 1;
+
+	} else {
+		data->cy = cy + sely - yy;
+	}
+
+	window_copy_redraw_screen(wp);
+}
+
+void
 window_copy_cursor_left(struct window_pane *wp)
 {
 	struct window_copy_mode_data	*data = wp->modedata;
