diff --git a/src/vte.cc b/src/vte.cc
index 48b455ad..74b6d959 100644
--- a/src/vte.cc
+++ b/src/vte.cc
@@ -8752,6 +8752,7 @@ Terminal::draw_rows(VteScreen *screen_,
         gboolean hyperlink = FALSE, nhyperlink, hilite = FALSE, nhilite;
         gboolean selected;
         uint32_t attr = 0, nattr;
+        bool virama;
 	guint item_count;
 	const VteCell *cell;
 	VteRowData const* row_data;
@@ -8812,7 +8813,7 @@ Terminal::draw_rows(VteScreen *screen_,
 
                 /* Walk the line. */
                 item_count = 0;
-                for (col = 0; col < m_column_count; col++) {
+                for (col = 0; col < m_column_count; ) {
                         /* Get the character cell's contents. */
                         cell = _vte_row_data_get (row_data, col);
                         if (cell == NULL) {
@@ -8831,6 +8832,7 @@ Terminal::draw_rows(VteScreen *screen_,
                             cell->attr.spacing_mark() ||
                             cell->attr.invisible()) {
                                 /* Skip empty or fragment or spacing mark cell. */
+                                col++;
                                 continue;
                         }
 
@@ -8865,13 +8867,15 @@ Terminal::draw_rows(VteScreen *screen_,
                                 item_count = 0;
                         }
 
-                        /* Combine with subsequent spacing marks. */
+                        /* Combine with subsequent spacing marks, or with subsequent anything if currently ending in a Virama */
                         vteunistr c = cell->c;
+                        virama = _vte_unistr_ends_in_virama(c);
                         j = col + cell->attr.columns();
                         while (j < m_column_count) {
                                 cell = _vte_row_data_get (row_data, j);
-                                if (cell && cell->attr.spacing_mark() && !cell->attr.fragment()) {
+                                if (cell && !cell->attr.fragment() && (virama || cell->attr.spacing_mark())) {
                                         c = _vte_unistr_append_unistr (c, cell->c);
+                                        virama = _vte_unistr_ends_in_virama(c);
                                         j += cell->attr.columns();
                                 } else {
                                         break;
@@ -8891,6 +8895,7 @@ Terminal::draw_rows(VteScreen *screen_,
                         items[item_count].x = col * column_width;
                         items[item_count].y = y;
                         item_count++;
+                        col = j;
                 }
 
                 /* Draw the last run of cells in the row. */
diff --git a/src/vteunistr.cc b/src/vteunistr.cc
index 69c47fe0..4aa320b9 100644
--- a/src/vteunistr.cc
+++ b/src/vteunistr.cc
@@ -186,3 +186,11 @@ _vte_unistr_strlen (vteunistr s)
 	}
 	return len;
 }
+
+bool
+_vte_unistr_ends_in_virama (vteunistr s)
+{
+        if (G_LIKELY (s < VTE_UNISTR_START || s >= unistr_next))
+                return false;
+	return DECOMP_FROM_UNISTR (s).suffix == 0x094D;
+}
diff --git a/src/vteunistr.h b/src/vteunistr.h
index 9bde6b2c..45d29473 100644
--- a/src/vteunistr.h
+++ b/src/vteunistr.h
@@ -95,6 +95,15 @@ _vte_unistr_append_to_string (vteunistr s, GString *gs);
 int
 _vte_unistr_strlen (vteunistr s);
 
+/**
+ * _vte_unistr_ends_in_virama
+ * @s: a #vteunistr
+ *
+ * Returns: whether @s ends in a virama (U+094D).
+ */
+bool
+_vte_unistr_ends_in_virama (vteunistr s);
+
 G_END_DECLS
 
 #endif
