diff --git a/.build/preproc/ctags_target_for_gcc_minus_e.cpp b/.build/preproc/ctags_target_for_gcc_minus_e.cpp
index 7da623636e616aa97ff591450a0883dcdbf923e5..c8f442e3a3bfc234fe3ac9ef0b7c4803b9387270 100644
--- a/.build/preproc/ctags_target_for_gcc_minus_e.cpp
+++ b/.build/preproc/ctags_target_for_gcc_minus_e.cpp
@@ -12,7 +12,7 @@ void setup()
         const char *headers[] = {"Vorname", "Nachname", "Alter", "Stadt", "Beruf", "Unternehmen", "Hobby", "Bemerkung"};
         int columnWidths[] = {10, 15, 5, 10, 10, 15, 10, 20};
 
-        SerialTable table(headers, columnWidths, 8);
+        SerialTable table(headers, columnWidths, 8, true, true);
         table.printHeader();
 
         // Erstellen von 20 Zeilen mit unterschiedlichen Einträgen
diff --git a/README.md b/README.md
index f88995229af7cc1891e2a8bf98fd4d08073d74e5..fee8ccc2f253839d067593c3b20078e0831e62d0 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
 # SerialTable (thk_serialTable)
 
 Die `SerialTable`-Klasse bietet eine komfortable Möglichkeit, tabellarische Daten über die serielle Schnittstelle auf einem Arduino-Gerät auszugeben. Sie unterstützt die Darstellung von mehrbyteigen UTF-8-Zeichen, wie z.B. Umlauten, und bietet Funktionen, um Textangaben innerhalb definierter Spaltenbreiten zu verwalten.
-```cpp
+```txt
 +----------+---------------+-----+----------+----------+---------------+----------+--------------------+
 |Vorname   |Nachname       |Alter|Stadt     |Beruf     |Unternehmen    |Hobby     |Bemerkung           |
 +==========+===============+=====+==========+==========+===============+==========+====================+
diff --git a/SerialTable.h b/SerialTable.h
index 27731954972edfdee428fc4f1042a2a00c1318b1..11b48b8335d8e230dddb1a8c0d281582e75bbdf3 100644
--- a/SerialTable.h
+++ b/SerialTable.h
@@ -6,8 +6,8 @@
 class SerialTable
 {
 public:
-    SerialTable(const char *headers[], const int columnWidths[], size_t size)
-        : headers(headers), columnWidths(columnWidths), size(size) {}
+    SerialTable(const char *headers[], const int columnWidths[], size_t size, bool doTruncateText = false, bool doReplaceUmlauts = false)
+        : headers(headers), columnWidths(columnWidths), size(size), doTruncateText(doTruncateText), doReplaceUmlauts(doReplaceUmlauts) {}
 
     // Diese Methode gibt den Header an die serielle Schnittstelle aus
     void printHeader()
@@ -36,13 +36,18 @@ public:
         // Erste Phase: Teile jede Zelle in Zeilen und finde maximale Zeilenzahl
         for (size_t i = 0; i < size; ++i)
         {
-            if (truncateText)
+            if (doReplaceUmlauts)
+                replaceUmlauts(t_row[i]);
+
+            safeStringCopy(buffer, t_row[i], sizeof(buffer));
+
+            if (doTruncateText)
             {
-                truncateToColumnWidth(t_row[i], columnWidths[i], buffer);
+                truncateToColumnWidth(buffer, columnWidths[i], buffer);
             }
             else
             {
-                splitStringByLength(t_row[i], columnWidths[i], buffer);
+                splitStringByLength(buffer, columnWidths[i], buffer);
             }
 
             // Zähle Zeilen in dieser Zelle
@@ -64,7 +69,17 @@ public:
             // Gehe durch jede Spalte
             for (size_t col = 0; col < size; ++col)
             {
-                if (truncateText)
+                if (replaceUmlauts)
+                {
+                    safeStringCopy(buffer, t_row[col], sizeof(buffer));
+                    replaceUmlauts(buffer);
+                }
+                else
+                {
+                    safeStringCopy(buffer, t_row[col], sizeof(buffer));
+                }
+
+                if (doTruncateText)
                 {
                     truncateToColumnWidth(t_row[col], columnWidths[col], buffer);
                 }
@@ -119,16 +134,22 @@ public:
         return output;
     }
 
-    void setTruncateText(bool value)
+    void setDoReplaceUmlauts(bool value)
+    {
+        doReplaceUmlauts = value;
+    }
+
+    void setdoTruncateText(bool value)
     {
-        truncateText = value;
+        doTruncateText = value;
     }
 
-public: // private:
+public: // private: //public für UnitTests!
     const char **headers;
     const int *columnWidths;
     size_t size;
-    bool truncateText = false;
+    bool doTruncateText = false;
+    bool doReplaceUmlauts = false;
 
     static int displayLength(const char *text)
     {
@@ -260,9 +281,9 @@ public: // private:
         int len = strlen(input);
         if (len > width)
         {
-            width = (width > 3) ? width - 3 : width;
+            width = (width > 2) ? width - 2 : width;
             strncpy(output, input, width);
-            strcpy(output + width, "...");
+            strcpy(output + width, "..");
         }
         else
         {
diff --git a/examples/serialTable/serialTable.ino b/examples/serialTable/serialTable.ino
index ac42ae46fb8c1ee4de7a9a161dabb0117dbc58ad..0a927d279838e3e37587f60fdcdac427e899905a 100644
--- a/examples/serialTable/serialTable.ino
+++ b/examples/serialTable/serialTable.ino
@@ -11,7 +11,7 @@ void setup()
         const char *headers[] = {"Vorname", "Nachname", "Alter", "Stadt", "Beruf", "Unternehmen", "Hobby", "Bemerkung"};
         int columnWidths[] = {10, 15, 5, 10, 10, 15, 10, 20};
 
-        SerialTable table(headers, columnWidths, 8);
+        SerialTable table(headers, columnWidths, 8, true, true);
         table.printHeader();
 
         // Erstellen von 20 Zeilen mit unterschiedlichen Einträgen