diff --git a/cmd-choose-buffer.c b/cmd-choose-buffer.c
index d79f6fd..a46db3e 100644
--- a/cmd-choose-buffer.c
+++ b/cmd-choose-buffer.c
@@ -45,6 +45,7 @@ cmd_choose_buffer_exec(struct cmd *self, struct cmd_q *cmdq)
 	struct client			*c;
 	struct window_choose_data	*cdata;
 	struct winlink			*wl;
+	struct window_pane		*wp;
 	struct paste_buffer		*pb;
 	char				*action, *action_data;
 	const char			*template;
@@ -61,6 +62,9 @@ cmd_choose_buffer_exec(struct cmd *self, struct cmd_q *cmdq)
 	if ((wl = cmd_find_window(cmdq, args_get(args, 't'), NULL)) == NULL)
 		return (CMD_RETURN_ERROR);
 
+	if (cmd_find_pane(cmdq, args_get(args, 't'), NULL, &wp) == NULL)
+		return (CMD_RETURN_ERROR);
+
 	if (paste_get_top(&global_buffers) == NULL)
 		return (CMD_RETURN_NORMAL);
 
@@ -79,7 +83,7 @@ cmd_choose_buffer_exec(struct cmd *self, struct cmd_q *cmdq)
 
 		cdata->ft_template = xstrdup(template);
 		format_add(cdata->ft, "line", "%u", idx - 1);
-		format_paste_buffer(cdata->ft, pb);
+		format_paste_buffer(cdata->ft, wp, pb);
 
 		xasprintf(&action_data, "%u", idx - 1);
 		cdata->command = cmd_template_replace(action, action_data, 1);
diff --git a/cmd-list-buffers.c b/cmd-list-buffers.c
index 02a4183..042889a 100644
--- a/cmd-list-buffers.c
+++ b/cmd-list-buffers.c
@@ -42,12 +42,16 @@ enum cmd_retval
 cmd_list_buffers_exec(unused struct cmd *self, struct cmd_q *cmdq)
 {
 	struct args		*args = self->args;
+	struct window_pane	*wp;
 	struct paste_buffer	*pb;
 	struct format_tree	*ft;
 	u_int			 idx;
 	char			*line;
 	const char		*template;
 
+	if (cmd_find_pane(cmdq, args_get(args, 't'), NULL, &wp) == NULL)
+		return (CMD_RETURN_ERROR);
+
 	if ((template = args_get(args, 'F')) == NULL)
 		template = LIST_BUFFERS_TEMPLATE;
 
@@ -55,7 +59,7 @@ cmd_list_buffers_exec(unused struct cmd *self, struct cmd_q *cmdq)
 	while ((pb = paste_walk_stack(&global_buffers, &idx)) != NULL) {
 		ft = format_create();
 		format_add(ft, "line", "%u", idx - 1);
-		format_paste_buffer(ft, pb);
+		format_paste_buffer(wp, ft, pb);
 
 		line = format_expand(ft, template);
 		cmdq_print(cmdq, "%s", line);
diff --git a/compat/vis.c b/compat/vis.c
index da4ac7c..f761834 100644
--- a/compat/vis.c
+++ b/compat/vis.c
@@ -219,3 +219,38 @@ strvisx(char *dst, const char *src, size_t len, int flag)
 	*dst = '\0';
 	return (dst - start);
 }
+
+/*
+ * strvisutf8 - encode characters using utf8 from src into dst exactly len bytes
+ */
+int
+strvisutf8(char *dst, const char *src, size_t len, int flag)
+{
+	struct utf8_data utf8data;
+	char *start;
+	int c, append;
+	size_t i;
+
+	for (start = dst; (size_t)(dst - start) < len; ) {
+		if (utf8_open(&utf8data, (u_char)*src)) {
+			while ((size_t)(dst - start) + utf8data.have < len
+				&& (append = utf8_append(&utf8data,
+							 (u_char)*++src)));
+			if (append == 0) {
+				++src;	/* utf8 char is just finished */
+				for (i = 0; i < utf8data.size; i++) {
+					*dst++ = utf8data.data[i];
+				}
+				continue;
+			}
+			else if (utf8data.have > 0) {
+				src -= (utf8data.have - 1);
+			}
+		}
+		c = *src;
+		dst = vis(dst, c, flag, *++src);
+	}
+	*dst = '\0';
+
+	return (dst - start);
+}
diff --git a/compat/vis.h b/compat/vis.h
index e43e9ad..b52eb6e 100644
--- a/compat/vis.h
+++ b/compat/vis.h
@@ -76,6 +76,7 @@ char	*vis(char *, int, int, int);
 int	strvis(char *, const char *, int);
 int	strnvis(char *, const char *, size_t, int);
 int	strvisx(char *, const char *, size_t, int);
+int	strvisutf8(char *, const char *, size_t, int);
 int	strunvis(char *, const char *);
 int	unvis(char *, char, int *, int);
 ssize_t strnunvis(char *, const char *, size_t);
diff --git a/format.c b/format.c
index 497b5b5..750a7a7 100644
--- a/format.c
+++ b/format.c
@@ -603,9 +603,9 @@ format_window_pane(struct format_tree *ft, struct window_pane *wp)
 
 /* Set default format keys for paste buffer. */
 void
-format_paste_buffer(struct format_tree *ft, struct paste_buffer *pb)
+format_paste_buffer(struct format_tree *ft, struct window_pane *wp, struct paste_buffer *pb)
 {
-	char	*pb_print = paste_print(pb, 50);
+	char	*pb_print = paste_print(pb, wp, 50);
 
 	format_add(ft, "buffer_size", "%zu", pb->size);
 	format_add(ft, "buffer_sample", "%s", pb_print);
diff --git a/paste.c b/paste.c
index 28f1230..2db3bd7 100644
--- a/paste.c
+++ b/paste.c
@@ -149,22 +149,31 @@ paste_replace(struct paste_stack *ps, u_int idx, char *data, size_t size)
 
 /* Convert a buffer into a visible string. */
 char *
-paste_print(struct paste_buffer *pb, size_t width)
+paste_print(struct paste_buffer *pb, struct window_pane *wp, size_t width)
 {
 	char	*buf;
 	size_t	 len, used;
+	int	utf8flag;
 
 	if (width < 3)
 		width = 3;
-	buf = xmalloc(width * 4 + 1);
+	buf = xmalloc(width * 4 + 3);
 
 	len = pb->size;
 	if (len > width)
 		len = width;
 
-	used = strvisx(buf, pb->data, len, VIS_OCTAL|VIS_TAB|VIS_NL);
-	if (pb->size > width || used > width)
-		strlcpy(buf + width - 3, "...", 4);
+	utf8flag = options_get_number(&wp->window->options, "utf8");
+	if (utf8flag) {
+		used = strvisutf8(buf, pb->data, len, VIS_OCTAL|VIS_TAB|VIS_NL);
+		if (pb->size > width || used > width)
+			strlcpy(buf + width, "...", 4);
+	}
+	else {
+		used = strvisx(buf, pb->data, len, VIS_OCTAL|VIS_TAB|VIS_NL);
+		if (pb->size > width || used > width)
+			strlcpy(buf + width - 3, "...", 4);
+	}
 
 	return (buf);
 }
diff --git a/tmux.h b/tmux.h
index 5aac390..29f6494 100644
--- a/tmux.h
+++ b/tmux.h
@@ -1541,6 +1541,7 @@ void		 format_winlink(struct format_tree *, struct session *,
 void		 format_window_pane(struct format_tree *,
 		     struct window_pane *);
 void		 format_paste_buffer(struct format_tree *,
+		     struct window_pane *,
 		     struct paste_buffer *);
 
 /* mode-key.c */
@@ -1711,7 +1712,8 @@ int		 paste_free_top(struct paste_stack *);
 int		 paste_free_index(struct paste_stack *, u_int);
 void		 paste_add(struct paste_stack *, char *, size_t, u_int);
 int		 paste_replace(struct paste_stack *, u_int, char *, size_t);
-char		*paste_print(struct paste_buffer *, size_t);
+char		*paste_print(struct paste_buffer *, struct window_pane *,
+		     size_t);
 void		 paste_send_pane(struct paste_buffer *, struct window_pane *,
 		     const char *, int);
 
