diff --git a/src/display.cpp b/src/display.cpp
index b444ae36b4fc09ce16dfdfb3f79cefe3ed61fa26..eed3e09340aadcf16699f34b8aad82bea918f57d 100644
--- a/src/display.cpp
+++ b/src/display.cpp
@@ -18,6 +18,9 @@ rgb24 gameColor = {colorR, colorG, colorB};
 rgb24 textColor = {255, 255, 255};
 rgb24 pixelColor = {255, 255, 255};
 
+uint8_t fontWidth = 3;
+uint8_t fontHeight = 5;
+
 SMARTMATRIX_ALLOCATE_BUFFERS(matrix, kMatrixWidth, kMatrixHeight, kRefreshDepth, kDmaBufferRows, kPanelType, kMatrixOptions);
 SMARTMATRIX_ALLOCATE_BACKGROUND_LAYER(backgroundLayer, kMatrixWidth, kMatrixHeight, COLOR_DEPTH, kBackgroundLayerOptions);
 SMARTMATRIX_ALLOCATE_INDEXED_LAYER(indexedLayer, kMatrixWidth, kMatrixHeight, COLOR_DEPTH, kIndexedLayerOptions);
@@ -105,29 +108,57 @@ void ageColor(uint8_t age, uint8_t decay)
   }
 }
 
-void showMessage(String strMsg)
+void showMessage(int lineOffset, String message, bool firstLine, bool lastLine)
 {
-  uint8_t fontWidth = 3;
-  uint8_t fontHeight = 5;
-  indexedLayer.fillScreen(0);
-  uint8_t msgLen = strMsg.length();
+  if (firstLine)
+  {
+    indexedLayer.fillScreen(0);
+  }
+
+  uint8_t lineSpacing = 3;
+  uint8_t msgLen = message.length();
   uint8_t msgWidth = (msgLen * fontWidth) + msgLen;
+  uint8_t linePosY;
+  if (lineOffset < 0)
+  {
+    linePosY = (matrix.getScreenHeight() / 2) - floor(fontHeight / 2) - (lineOffset * -1) * (fontHeight + lineSpacing);
+  }
+  else if (lineOffset == 0)
+  {
+    linePosY = (matrix.getScreenHeight() / 2) - floor(fontHeight / 2);
+  }
+  else if (lineOffset > 0)
+  {
+    linePosY = (matrix.getScreenHeight() / 2) - floor(fontHeight / 2) + lineOffset * (fontHeight + lineSpacing);
+  }
+
   char charMsg[msgLen + 1];
-  strMsg.toCharArray(charMsg, msgLen + 1);
-  indexedLayer.drawString((matrix.getScreenWidth() / 2) - (msgWidth / 2), (matrix.getScreenHeight() / 2) - ceil(fontHeight / 2), 1, charMsg);
-  indexedLayer.swapBuffers(false);
+  message.toCharArray(charMsg, msgLen + 1);
+  indexedLayer.drawString((matrix.getScreenWidth() / 2) - (msgWidth / 2), linePosY, 1, charMsg);
+
+  if (lastLine)
+  {
+    indexedLayer.swapBuffers(false);
+  }
+}
+
+void showStartScreen() {
+  showMessage(-1, "Game", true, false);
+  showMessage(0, "of", false, false);
+  showMessage(1, "Life", false, true);
 }
 
-void showEndScreen(uint16_t ticks)
+void showEndScreen(uint16_t ticks, uint16_t cells)
 {
   char msg_game[15];
   sprintf(msg_game, "Game %d ended", gameEra);
-  char msg_evo[12];
-  sprintf(msg_evo, "Ticks: %d", ticks);
-  indexedLayer.fillScreen(0);
-  indexedLayer.drawString((matrix.getScreenWidth() / 2) - (strlen(msg_game) * 4) / 2, (matrix.getScreenHeight() / 2) - 2 - 5, 1, msg_game);
-  indexedLayer.drawString((matrix.getScreenWidth() / 2) - (strlen(msg_evo) * 4) / 2, (matrix.getScreenHeight() / 2) + 2, 1, msg_evo);
-  indexedLayer.swapBuffers(false);
+  showMessage(-1, String(msg_game), true, false);
+  char msg_ticks[12];
+  sprintf(msg_ticks, "Ticks: %d", ticks);
+  showMessage(0, String(msg_ticks), false, false);
+  char msg_cells[12];
+  sprintf(msg_cells, "Cells: %d", cells);
+  showMessage(1, String(msg_cells), false, true);
 }
 
 void displayBrightness(uint8_t brightness)
diff --git a/src/display.h b/src/display.h
index 9b9f31f22df4fb89e519b75cc71124f759db6f1b..252fe822f5b971b61f2f30255dab29e646e7de66 100644
--- a/src/display.h
+++ b/src/display.h
@@ -17,8 +17,9 @@ extern uint8_t colorB;
 void setupDisplay();
 void displayLoop();
 void ageColor(uint8_t age, uint8_t decay);
-void showEndScreen(uint16_t ticks);
-void showMessage(String msg);
+void showStartScreen();
+void showEndScreen(uint16_t ticks, uint16_t cells);
+void showMessage(int lineOffset, String message, bool firstLine, bool lastLine);
 void displayBrightness(uint8_t brightness);
 void gameBrightness(uint8_t brightness);
 void setGameColor(uint8_t r, uint8_t g, uint8_t b);
diff --git a/src/gameoflife.cpp b/src/gameoflife.cpp
index cc0fe513c58ac2d067fb4adc4588dc391a79938e..297c6eebc561a1930f518833c3f0d61184eb3b2d 100644
--- a/src/gameoflife.cpp
+++ b/src/gameoflife.cpp
@@ -168,7 +168,7 @@ void gameLoop()
     {
       finalTicks = currentTick - noEvolutionTicksLimit;
       currentMillis = millis();
-      showEndScreen(finalTicks);
+      showEndScreen(finalTicks, cellsAliveNow);
       if (updateHighscores(gameEra, finalTicks, cellsAliveNow))
       {
         sendHighscores();
diff --git a/src/main.cpp b/src/main.cpp
index 6bec0862bb977cef33a9fd12eff2c437830a49dc..9333df6e75fcd80992f3826b19bdc304ae9857a4 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -21,7 +21,7 @@ void setup()
   logLine("", true);
   loadSettings();
   setupDisplay();
-  showMessage("Game of Life");
+  showStartScreen();
   setupNetwork();
   clearDisplay();
   setupGame();
diff --git a/src/network.cpp b/src/network.cpp
index fe1100d0004644ce990bbf1c98e35efe877f2853..5b63710de6abc1b169cc0866e26a1776d2fbbb93 100644
--- a/src/network.cpp
+++ b/src/network.cpp
@@ -73,7 +73,7 @@ void setupOTA()
                           if (percent > otaProgress) {
                             char msg[9];
                             sprintf(msg, "OTA:%3d%%", percent);
-                            showMessage(String(msg));
+                            showMessage(0, String(msg), true, true);
                             logLine("OTA: ", false);
                             logLine((String)percent, false);
                             logLine("%");