diff --git a/src/ftxui/dom/table_test.cpp b/src/ftxui/dom/table_test.cpp
index 3313923ebb8352f5c20669c7a60d2685c639c0d0..1e13776c5015b402d803622f31930fb2fff5abc5 100644
--- a/src/ftxui/dom/table_test.cpp
+++ b/src/ftxui/dom/table_test.cpp
@@ -708,6 +708,28 @@ TEST(TableTest, RowFlexTwo) {
       screen.ToString());
 }
 
+TEST(TableTest, Merge) {
+  auto table = Table({
+      {"a", "b", "c"},
+      {"d", "e", "f"},
+      {"g", "h", "i"},
+  });
+  table.SelectAll().Border(LIGHT);
+  table.SelectColumn(1).Border(HEAVY);
+  table.SelectRow(1).Border(HEAVY);
+  Screen screen(7, 7);
+  Render(screen, table.Render());
+  EXPECT_EQ(
+    "┌─┲━┱─┐\r\n"
+    "│a┃b┃c│\r\n"
+    "┢━╋━╋━┪\r\n"
+    "┃d┃e┃f┃\r\n"
+    "┡━╋━╋━┩\r\n"
+    "│g┃h┃i│\r\n"
+    "└─┺━┹─┘",
+    screen.ToString());
+}
+
 }  // namespace ftxui
 
 // Copyright 2021 Arthur Sonzogni. All rights reserved.
diff --git a/src/ftxui/screen/screen.cpp b/src/ftxui/screen/screen.cpp
index 2f7b1240e3cec34cab6fd2aa5266fc0ff127acd8..6d19f790b41dc4a5181f9f701d0f3e27c820a896 100644
--- a/src/ftxui/screen/screen.cpp
+++ b/src/ftxui/screen/screen.cpp
@@ -501,22 +501,25 @@ void Screen::Clear() {
 // clang-format off
 void Screen::ApplyShader() {
   // Merge box characters togethers.
-  for (int y = 1; y < dimy_; ++y) {
-    for (int x = 1; x < dimx_; ++x) {
+  for (int y = 0; y < dimy_; ++y) {
+    for (int x = 0; x < dimx_; ++x) {
       // Box drawing character uses exactly 3 byte.
       Pixel& cur = pixels_[y][x];
       if (!ShouldAttemptAutoMerge(cur)) {
         continue;
       }
 
-      Pixel& left = pixels_[y][x-1];
-      Pixel& top = pixels_[y-1][x];
-
-      if (ShouldAttemptAutoMerge(left)) {
-        UpgradeLeftRight(left.character, cur.character);
+      if (x > 0) {
+        Pixel& left = pixels_[y][x-1];
+        if (ShouldAttemptAutoMerge(left)) {
+          UpgradeLeftRight(left.character, cur.character);
+        }
       }
-      if (ShouldAttemptAutoMerge(top)) {
-        UpgradeTopDown(top.character, cur.character);
+      if (y > 0) {
+        Pixel& top = pixels_[y-1][x];
+        if (ShouldAttemptAutoMerge(top)) {
+          UpgradeTopDown(top.character, cur.character);
+        }
       }
     }
   }