diff --git a/src/bin/psql/print.c b/src/bin/psql/print.c
index 79fc43e..659d197 100644
--- a/src/bin/psql/print.c
+++ b/src/bin/psql/print.c
@@ -1234,6 +1234,46 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
 			fprintf(fout, "%s\n", cont->title);
 	}
 
+	if (cont->opt->format == PRINT_WRAPPED)
+	{
+		int output_columns = 0;
+
+		/*
+		 * Choose target output width: \pset columns, or $COLUMNS, or ioctl
+		 */
+		if (cont->opt->columns > 0)
+			output_columns = cont->opt->columns;
+		else
+		{
+			if (cont->opt->env_columns > 0)
+				output_columns = cont->opt->env_columns;
+#ifdef TIOCGWINSZ
+			else
+			{
+				struct winsize screen_size;
+
+				if (ioctl(fileno(stdout), TIOCGWINSZ, &screen_size) != -1)
+					output_columns = screen_size.ws_col;
+			}
+#endif
+		}
+
+		output_columns -= hwidth;
+
+		if (opt_border == 0)
+			output_columns -= 1;
+		else
+		{
+			output_columns -= 3; /* -+- */
+
+			if (opt_border > 1)
+				output_columns -= 4; /* +--+ */
+		}
+
+		if (output_columns > 0 && dwidth > output_columns)
+			dwidth = output_columns;
+	}
+
 	/* print records */
 	for (i = 0, ptr = cont->cells; *ptr; i++, ptr++)
 	{
@@ -1292,20 +1332,52 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
 			else
 				fputc(' ', fout);
 
-			if (!dcomplete)
+			if (!dcomplete && dlineptr[line_count].width > 0)
 			{
-				if (opt_border < 2)
-					fprintf(fout, "%s\n", dlineptr[line_count].ptr);
-				else
-					fprintf(fout, "%-s%*s %s\n", dlineptr[line_count].ptr,
-							dwidth - dlineptr[line_count].width, "",
-							dformat->rightvrule);
+				int		offset = 0,
+						chars_to_output = dlineptr[line_count].width;
+
+				while (chars_to_output > 0)
+				{
+					int 	target_width,
+							bytes_to_output;
+
+					if (offset > 0)
+					{
+						if (opt_border == 2)
+							fprintf(fout, "%s ", dformat->leftvrule);
+
+						fprintf(fout, "%*s", hwidth, " ");
+
+						if (opt_border > 0)
+							fprintf(fout, " %s ", dformat->midvrule);
+						else
+							fputc(' ', fout);
+					}
+
+					target_width = dwidth;
+					bytes_to_output = strlen_max_width(dlineptr[line_count].ptr + offset,
+													   &target_width, encoding);
+					fputnbytes(fout, (char *)(dlineptr[line_count].ptr + offset),
+							   bytes_to_output);
+
+					chars_to_output -= target_width;
+					offset += bytes_to_output;
+
+					if (opt_border < 2)
+						fputc('\n', fout);
+					else
+						fprintf(fout, "%*s %s\n", dwidth - target_width, "",
+								dformat->rightvrule);
+				}
 
 				if (!dlineptr[line_count + 1].ptr)
 					dcomplete = 1;
 			}
 			else
 			{
+				dcomplete = 1;
+
 				if (opt_border < 2)
 					fputc('\n', fout);
 				else
