diff --git a/src/vte.cc b/src/vte.cc
index 80c7c59e..748a2005 100644
--- a/src/vte.cc
+++ b/src/vte.cc
@@ -8872,6 +8872,8 @@ Terminal::draw_rows(VteScreen *screen_,
                         }
 
                         nhyperlink = (m_allow_hyperlink && cell->attr.hyperlink_idx != 0);
+                        /* Skip empty or fragment cell.
+                         * Skip spacing mark cell (it's combined with the preceding regular one) except in the first column. */
                         if (cell->c == 0 ||
                                 ((cell->c == ' ' || cell->c == '\t') &&  // FIXME '\t' is newly added now, double check
                                  cell->attr.has_none(VTE_ATTR_UNDERLINE_MASK |
@@ -8879,8 +8881,8 @@ Terminal::draw_rows(VteScreen *screen_,
                                                      VTE_ATTR_OVERLINE_MASK) &&
                                  !nhyperlink) ||
                             cell->attr.fragment() ||
-                            cell->attr.invisible()) {
-                                /* Skip empty or fragment cell. */
+                            cell->attr.invisible() ||
+                            (col > 0 && g_unichar_ismark (_vte_unistr_get_base (cell->c)))) {
                                 continue;
                         }
 
@@ -8915,6 +8917,19 @@ Terminal::draw_rows(VteScreen *screen_,
                                 item_count = 0;
                         }
 
+                        /* Combine with subsequent spacing marks. */
+                        vteunistr c = cell->c;
+                        j = col + cell->attr.columns();
+                        while (j < m_column_count) {
+                                cell = _vte_row_data_get (row_data, j);
+                                if (cell && !cell->attr.fragment() && g_unichar_ismark (_vte_unistr_get_base (cell->c))) {
+                                        c = _vte_unistr_append_unistr (c, cell->c);
+                                        j += cell->attr.columns();
+                                } else {
+                                        break;
+                                }
+                        }
+
                         attr = nattr;
                         fore = nfore;
                         back = nback;
@@ -8923,8 +8938,8 @@ Terminal::draw_rows(VteScreen *screen_,
                         hilite = nhilite;
 
                         g_assert_cmpint (item_count, <, column_count);
-                        items[item_count].c = cell->c;
-                        items[item_count].columns = cell->attr.columns();
+                        items[item_count].c = c;
+                        items[item_count].columns = j - col;
                         items[item_count].x = col * column_width;
                         items[item_count].y = y;
                         item_count++;
diff --git a/src/vteunistr.cc b/src/vteunistr.cc
index 2e412e3e..69c47fe0 100644
--- a/src/vteunistr.cc
+++ b/src/vteunistr.cc
@@ -140,6 +140,19 @@ _vte_unistr_append_unichar (vteunistr s, gunichar c)
 	return ret;
 }
 
+vteunistr
+_vte_unistr_append_unistr (vteunistr s, vteunistr t)
+{
+        g_return_val_if_fail (s < unistr_next, s);
+        g_return_val_if_fail (t < unistr_next, s);
+        if (G_UNLIKELY (t >= VTE_UNISTR_START)) {
+                s = _vte_unistr_append_unistr (s, DECOMP_FROM_UNISTR (t).prefix);
+                return _vte_unistr_append_unichar (s, DECOMP_FROM_UNISTR (t).suffix);
+        } else {
+                return _vte_unistr_append_unichar (s, t);
+        }
+}
+
 gunichar
 _vte_unistr_get_base (vteunistr s)
 {
diff --git a/src/vteunistr.h b/src/vteunistr.h
index 04aa9fb6..9bde6b2c 100644
--- a/src/vteunistr.h
+++ b/src/vteunistr.h
@@ -57,6 +57,19 @@ typedef guint32 vteunistr;
 vteunistr
 _vte_unistr_append_unichar (vteunistr s, gunichar c);
 
+/**
+ * _vte_unistr_append_unistr:
+ * @s: a #vteunistr
+ * @t: another #vteunistr to append to @s
+ *
+ * Creates a vteunistr value for the string @s followed by the
+ * string @t.
+ *
+ * Returns: the new #vteunistr value
+ **/
+vteunistr
+_vte_unistr_append_unistr (vteunistr s, vteunistr t);
+
 gunichar
 _vte_unistr_get_base (vteunistr s);
 
