diff -ur vte-0.34.7.orig/src/vte.c vte-0.34.7/src/vte.c
--- vte-0.34.7.orig/src/vte.c	2013-06-28 16:44:33.000000000 +0200
+++ vte-0.34.7/src/vte.c	2013-09-05 02:43:50.513898154 +0200
@@ -8009,6 +8009,42 @@
 	}
 }
 
+void ring_rewrap(VteRing *ring, VteTerminal *terminal)
+{
+	int old_row_index, old_col_index, new_col;
+	int deltadelta;
+	VteRing ring_old;
+	memcpy(&ring_old, ring, sizeof(VteRing));
+	_vte_ring_init(ring, ring_old.max);
+
+	VteRowData *new_row = NULL;
+	for (old_row_index = _vte_ring_delta(&ring_old); old_row_index < _vte_ring_next(&ring_old); old_row_index++) {
+		VteRowData *old_row = _vte_ring_index(&ring_old, old_row_index);
+		if (new_row == NULL) {
+			new_row = _vte_ring_append(ring);
+			new_col = 0;
+		}
+		for (old_col_index = 0; old_col_index < old_row->len; old_col_index++) {
+			VteCell *cell = _vte_row_data_get(old_row, old_col_index);
+			if (!cell->attr.fragment && new_col + cell->attr.columns > terminal->column_count) {
+				new_row->attr.soft_wrapped = 1;
+				new_row = _vte_ring_append(ring);
+				new_col = 0;
+			}
+			_vte_row_data_append(new_row, cell);
+			new_col++;
+		}
+		if (!old_row->attr.soft_wrapped) {
+			new_row = NULL;
+		}
+	}
+
+	terminal->pvt->screen->scroll_delta += _vte_ring_next(ring) - _vte_ring_next(&ring_old);  // ?????
+	terminal->pvt->screen->insert_delta += _vte_ring_delta(ring) - _vte_ring_delta(&ring_old);  // ?????
+
+	_vte_ring_fini(&ring_old);
+}
+
 /**
  * vte_terminal_set_size:
  * @terminal: a #VteTerminal
@@ -8047,6 +8083,10 @@
 		terminal->row_count = rows;
 		terminal->column_count = columns;
 	}
+	if (old_columns != terminal->column_count) {
+		ring_rewrap(terminal->pvt->normal_screen.row_data, terminal);
+		ring_rewrap(terminal->pvt->alternate_screen.row_data, terminal);
+	}
 	if (old_rows != terminal->row_count || old_columns != terminal->column_count) {
 		VteScreen *screen = terminal->pvt->screen;
 		glong visible_rows = MIN (old_rows, _vte_ring_length (screen->row_data));
