diff --git a/demo/data/demo.ui b/demo/data/demo.ui
--- a/demo/data/demo.ui
+++ b/demo/data/demo.ui
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.22.2 
+<!-- Generated with glade 3.38.2 
 
 Talkatu - GTK widgets for chat applications
 Copyright (C) 2017-2020 Gary Kramlich <grim@reaperworld.com>
@@ -26,31 +26,28 @@
   <!-- interface-description GTK widgets for chat applications -->
   <!-- interface-copyright Gary Kramlich <grim@reaperworld.com> -->
   <template class="TalkatuDemoWindow" parent="GtkWindow">
-    <property name="can_focus">False</property>
-    <property name="border_width">12</property>
+    <property name="can-focus">False</property>
+    <property name="border-width">12</property>
     <signal name="delete-event" handler="talkatu_demo_window_closed_cb" swapped="no"/>
-    <child type="titlebar">
-      <placeholder/>
-    </child>
     <child>
       <object class="GtkPaned">
         <property name="visible">True</property>
-        <property name="can_focus">True</property>
+        <property name="can-focus">True</property>
         <property name="orientation">vertical</property>
-        <property name="wide_handle">True</property>
+        <property name="wide-handle">True</property>
         <child>
           <object class="TalkatuScrolledWindow">
             <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="shadow_type">in</property>
+            <property name="can-focus">True</property>
+            <property name="shadow-type">in</property>
             <child>
               <object class="TalkatuHistory" id="history">
                 <property name="name">history</property>
                 <property name="visible">True</property>
-                <property name="can_focus">True</property>
+                <property name="can-focus">True</property>
                 <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                <property name="hexpand_set">True</property>
-                <property name="vexpand_set">True</property>
+                <property name="hexpand-set">True</property>
+                <property name="vexpand-set">True</property>
               </object>
             </child>
           </object>
@@ -62,20 +59,20 @@
         <child>
           <object class="GtkBox">
             <property name="visible">True</property>
-            <property name="can_focus">False</property>
+            <property name="can-focus">False</property>
             <property name="orientation">vertical</property>
             <child>
               <object class="GtkToolbar">
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
+                <property name="can-focus">False</property>
                 <child>
                   <object class="GtkRadioToolButton" id="toggle_plain">
                     <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="tooltip_text" translatable="yes">Use a TalkatuBuffer</property>
+                    <property name="can-focus">False</property>
+                    <property name="tooltip-text" translatable="yes">Use a TalkatuBuffer</property>
                     <property name="label" translatable="yes">Plain</property>
-                    <property name="use_underline">True</property>
-                    <property name="icon_name">text-x-generic</property>
+                    <property name="use-underline">True</property>
+                    <property name="icon-name">text-x-generic</property>
                     <property name="active">True</property>
                     <signal name="toggled" handler="talkatu_demo_window_buffer_changed_cb" object="TalkatuDemoWindow" swapped="no"/>
                   </object>
@@ -87,11 +84,11 @@
                 <child>
                   <object class="GtkRadioToolButton" id="toggle_whole">
                     <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="tooltip_text" translatable="yes">Use a TalkatuWholeBuffer</property>
+                    <property name="can-focus">False</property>
+                    <property name="tooltip-text" translatable="yes">Use a TalkatuWholeBuffer</property>
                     <property name="label" translatable="yes">Whole</property>
-                    <property name="use_underline">True</property>
-                    <property name="icon_name">ascii</property>
+                    <property name="use-underline">True</property>
+                    <property name="icon-name">ascii</property>
                     <property name="group">toggle_plain</property>
                     <signal name="toggled" handler="talkatu_demo_window_buffer_changed_cb" object="TalkatuDemoWindow" swapped="no"/>
                   </object>
@@ -103,11 +100,11 @@
                 <child>
                   <object class="GtkRadioToolButton" id="toggle_html">
                     <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="tooltip_text" translatable="yes">Use a TalkatuHTMLBuffer</property>
+                    <property name="can-focus">False</property>
+                    <property name="tooltip-text" translatable="yes">Use a TalkatuHTMLBuffer</property>
                     <property name="label" translatable="yes">HTML</property>
-                    <property name="use_underline">True</property>
-                    <property name="icon_name">text-html</property>
+                    <property name="use-underline">True</property>
+                    <property name="icon-name">text-html</property>
                     <property name="group">toggle_plain</property>
                     <signal name="toggled" handler="talkatu_demo_window_buffer_changed_cb" object="TalkatuDemoWindow" swapped="no"/>
                   </object>
@@ -119,11 +116,11 @@
                 <child>
                   <object class="GtkRadioToolButton" id="toggle_markdown">
                     <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="tooltip_text" translatable="yes">Use a TalkatuMarkdownBuffer</property>
+                    <property name="can-focus">False</property>
+                    <property name="tooltip-text" translatable="yes">Use a TalkatuMarkdownBuffer</property>
                     <property name="label" translatable="yes">Markdown</property>
-                    <property name="use_underline">True</property>
-                    <property name="icon_name">text-x-generic-template</property>
+                    <property name="use-underline">True</property>
+                    <property name="icon-name">text-x-generic-template</property>
                     <property name="group">toggle_plain</property>
                     <signal name="toggled" handler="talkatu_demo_window_buffer_changed_cb" object="TalkatuDemoWindow" swapped="no"/>
                   </object>
@@ -135,7 +132,7 @@
                 <child>
                   <object class="GtkSeparatorToolItem">
                     <property name="visible">True</property>
-                    <property name="can_focus">False</property>
+                    <property name="can-focus">False</property>
                   </object>
                   <packing>
                     <property name="expand">False</property>
@@ -145,11 +142,11 @@
                 <child>
                   <object class="GtkToolButton">
                     <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="tooltip_text" translatable="yes">Insert HTML from a file</property>
+                    <property name="can-focus">False</property>
+                    <property name="tooltip-text" translatable="yes">Insert HTML from a file</property>
                     <property name="label" translatable="yes">Insert HTML</property>
-                    <property name="use_underline">True</property>
-                    <property name="icon_name">text-html</property>
+                    <property name="use-underline">True</property>
+                    <property name="icon-name">text-html</property>
                     <signal name="clicked" handler="talkatu_demo_window_insert_html_cb" object="TalkatuDemoWindow" swapped="no"/>
                   </object>
                   <packing>
@@ -160,11 +157,11 @@
                 <child>
                   <object class="GtkToolButton">
                     <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="tooltip_text" translatable="yes">Insert Markdown from a file</property>
+                    <property name="can-focus">False</property>
+                    <property name="tooltip-text" translatable="yes">Insert Markdown from a file</property>
                     <property name="label" translatable="yes">Insert Markdown</property>
-                    <property name="use_underline">True</property>
-                    <property name="icon_name">text-x-generic</property>
+                    <property name="use-underline">True</property>
+                    <property name="icon-name">text-x-generic</property>
                     <signal name="clicked" handler="talkatu_demo_window_insert_markdown_cb" object="TalkatuDemoWindow" swapped="no"/>
                   </object>
                   <packing>
@@ -175,7 +172,7 @@
                 <child>
                   <object class="GtkSeparatorToolItem">
                     <property name="visible">True</property>
-                    <property name="can_focus">False</property>
+                    <property name="can-focus">False</property>
                   </object>
                   <packing>
                     <property name="expand">False</property>
@@ -185,10 +182,10 @@
                 <child>
                   <object class="GtkToggleToolButton" id="author_button">
                     <property name="visible">True</property>
-                    <property name="can_focus">False</property>
+                    <property name="can-focus">False</property>
                     <property name="label" translatable="yes">Author</property>
-                    <property name="use_underline">True</property>
-                    <property name="icon_name">system-users</property>
+                    <property name="use-underline">True</property>
+                    <property name="icon-name">system-users</property>
                     <signal name="toggled" handler="talkatu_demo_window_author_toggled_cb" object="author_popover" swapped="no"/>
                   </object>
                   <packing>
@@ -197,9 +194,23 @@
                   </packing>
                 </child>
                 <child>
+                  <object class="GtkToggleToolButton" id="author_name_color_button">
+                    <property name="visible">True</property>
+                    <property name="can-focus">False</property>
+                    <property name="label" translatable="yes">Color</property>
+                    <property name="use-underline">True</property>
+                    <property name="icon-name">color-select-symbolic</property>
+                    <signal name="toggled" handler="talkatu_demo_window_author_name_color_toggled_cb" object="author_name_color_popover" swapped="no"/>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="homogeneous">True</property>
+                  </packing>
+                </child>
+                <child>
                   <object class="GtkSeparatorToolItem">
                     <property name="visible">True</property>
-                    <property name="can_focus">False</property>
+                    <property name="can-focus">False</property>
                   </object>
                   <packing>
                     <property name="expand">False</property>
@@ -209,10 +220,10 @@
                 <child>
                   <object class="GtkToggleToolButton" id="toggle_toolbar">
                     <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="tooltip_text" translatable="yes">Toggle toolbar visibility</property>
+                    <property name="can-focus">False</property>
+                    <property name="tooltip-text" translatable="yes">Toggle toolbar visibility</property>
                     <property name="label" translatable="yes">Toolbar</property>
-                    <property name="use_underline">True</property>
+                    <property name="use-underline">True</property>
                   </object>
                   <packing>
                     <property name="expand">False</property>
@@ -222,10 +233,10 @@
                 <child>
                   <object class="GtkToggleToolButton" id="toggle_send_button">
                     <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="tooltip_text" translatable="yes">Toggle send button visibility</property>
+                    <property name="can-focus">False</property>
+                    <property name="tooltip-text" translatable="yes">Toggle send button visibility</property>
                     <property name="label" translatable="yes">Send Button</property>
-                    <property name="use_underline">True</property>
+                    <property name="use-underline">True</property>
                   </object>
                   <packing>
                     <property name="expand">False</property>
@@ -235,10 +246,10 @@
                 <child>
                   <object class="GtkToggleToolButton" id="toggle_edited">
                     <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="tooltip_text" translatable="yes">Toggle whether the message is edited</property>
+                    <property name="can-focus">False</property>
+                    <property name="tooltip-text" translatable="yes">Toggle whether the message is edited</property>
                     <property name="label" translatable="yes">Edited</property>
-                    <property name="use_underline">True</property>
+                    <property name="use-underline">True</property>
                   </object>
                   <packing>
                     <property name="expand">False</property>
@@ -257,13 +268,13 @@
                 <property name="orientation">vertical</property>
                 <property name="visible">True</property>
                 <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                <property name="hexpand_set">True</property>
-                <property name="vexpand_set">True</property>
+                <property name="hexpand-set">True</property>
+                <property name="vexpand-set">True</property>
                 <child internal-child="toolbar">
                   <object class="TalkatuToolbar">
                     <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                    <property name="hexpand_set">True</property>
-                    <property name="vexpand_set">True</property>
+                    <property name="hexpand-set">True</property>
+                    <property name="vexpand-set">True</property>
                   </object>
                   <packing>
                     <property name="fill">False</property>
@@ -271,8 +282,8 @@
                 </child>
                 <child internal-child="input">
                   <object class="TalkatuInput">
-                    <property name="hexpand_set">True</property>
-                    <property name="vexpand_set">True</property>
+                    <property name="hexpand-set">True</property>
+                    <property name="vexpand-set">True</property>
                     <property name="buffer">buffer_plain</property>
                     <signal name="open-url" handler="talkatu_demo_window_view_open_url_cb" object="TalkatuDemoWindow" swapped="no"/>
                     <signal name="send-message" handler="talkatu_demo_window_view_send_message_cb" object="TalkatuDemoWindow" swapped="no"/>
@@ -283,8 +294,8 @@
                 </child>
                 <child internal-child="send_button">
                   <object class="GtkButton">
-                    <property name="can_focus">False</property>
-                    <property name="receives_default">False</property>
+                    <property name="can-focus">False</property>
+                    <property name="receives-default">False</property>
                   </object>
                   <packing>
                     <property name="fill">False</property>
@@ -317,24 +328,133 @@
       </object>
     </child>
   </template>
+  <object class="GtkPopover" id="author_name_color_popover">
+    <property name="can-focus">False</property>
+    <property name="relative-to">author_button</property>
+    <signal name="closed" handler="talkatu_demo_window_author_name_color_popover_closed_cb" object="author_name_color_button" swapped="no"/>
+    <child>
+      <object class="GtkBox">
+        <property name="visible">True</property>
+        <property name="can-focus">False</property>
+        <property name="border-width">6</property>
+        <property name="orientation">vertical</property>
+        <child>
+          <object class="GtkRadioButton" id="author_name_color_item">
+            <property name="label" translatable="yes">Not set</property>
+            <property name="visible">True</property>
+            <property name="can-focus">True</property>
+            <property name="receives-default">False</property>
+            <property name="active">True</property>
+            <property name="draw-indicator">True</property>
+            <signal name="toggled" handler="talkatu_demo_window_author_name_color_changed" object="TalkatuDemoWindow" swapped="no"/>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkRadioButton">
+            <property name="label" translatable="yes">Red</property>
+            <property name="visible">True</property>
+            <property name="can-focus">True</property>
+            <property name="receives-default">False</property>
+            <property name="draw-indicator">True</property>
+            <property name="group">author_name_color_item</property>
+            <signal name="toggled" handler="talkatu_demo_window_author_name_color_changed" object="TalkatuDemoWindow" swapped="no"/>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkRadioButton">
+            <property name="label" translatable="yes">Green</property>
+            <property name="visible">True</property>
+            <property name="can-focus">True</property>
+            <property name="receives-default">False</property>
+            <property name="draw-indicator">True</property>
+            <property name="group">author_name_color_item</property>
+            <signal name="toggled" handler="talkatu_demo_window_author_name_color_changed" object="TalkatuDemoWindow" swapped="no"/>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkRadioButton">
+            <property name="label" translatable="yes">Blue</property>
+            <property name="visible">True</property>
+            <property name="can-focus">True</property>
+            <property name="receives-default">False</property>
+            <property name="draw-indicator">True</property>
+            <property name="group">author_name_color_item</property>
+            <signal name="toggled" handler="talkatu_demo_window_author_name_color_changed" object="TalkatuDemoWindow" swapped="no"/>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">3</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkRadioButton">
+            <property name="label" translatable="yes">Yellow</property>
+            <property name="visible">True</property>
+            <property name="can-focus">True</property>
+            <property name="receives-default">False</property>
+            <property name="draw-indicator">True</property>
+            <property name="group">author_name_color_item</property>
+            <signal name="toggled" handler="talkatu_demo_window_author_name_color_changed" object="TalkatuDemoWindow" swapped="no"/>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">4</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkRadioButton">
+            <property name="label" translatable="yes">Purple</property>
+            <property name="visible">True</property>
+            <property name="can-focus">True</property>
+            <property name="receives-default">False</property>
+            <property name="draw-indicator">True</property>
+            <property name="group">author_name_color_item</property>
+            <signal name="toggled" handler="talkatu_demo_window_author_name_color_changed" object="TalkatuDemoWindow" swapped="no"/>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">5</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </object>
   <object class="GtkPopover" id="author_popover">
-    <property name="can_focus">False</property>
-    <property name="relative_to">author_button</property>
+    <property name="can-focus">False</property>
+    <property name="relative-to">author_button</property>
     <signal name="closed" handler="talkatu_demo_window_author_popover_closed_cb" object="author_button" swapped="no"/>
     <child>
       <object class="GtkBox">
         <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="border_width">6</property>
+        <property name="can-focus">False</property>
+        <property name="border-width">6</property>
         <property name="orientation">vertical</property>
         <child>
           <object class="GtkRadioButton" id="author_item">
             <property name="label" translatable="yes">Alice</property>
             <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">False</property>
+            <property name="can-focus">True</property>
+            <property name="receives-default">False</property>
             <property name="active">True</property>
-            <property name="draw_indicator">True</property>
+            <property name="draw-indicator">True</property>
             <signal name="toggled" handler="talkatu_demo_window_author_changed" object="TalkatuDemoWindow" swapped="no"/>
           </object>
           <packing>
@@ -347,9 +467,9 @@
           <object class="GtkRadioButton">
             <property name="label" translatable="yes">Bob</property>
             <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">False</property>
-            <property name="draw_indicator">True</property>
+            <property name="can-focus">True</property>
+            <property name="receives-default">False</property>
+            <property name="draw-indicator">True</property>
             <property name="group">author_item</property>
             <signal name="toggled" handler="talkatu_demo_window_author_changed" object="TalkatuDemoWindow" swapped="no"/>
           </object>
@@ -363,9 +483,9 @@
           <object class="GtkRadioButton">
             <property name="label" translatable="yes">Carol</property>
             <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">False</property>
-            <property name="draw_indicator">True</property>
+            <property name="can-focus">True</property>
+            <property name="receives-default">False</property>
+            <property name="draw-indicator">True</property>
             <property name="group">author_item</property>
             <signal name="toggled" handler="talkatu_demo_window_author_changed" object="TalkatuDemoWindow" swapped="no"/>
           </object>
@@ -379,9 +499,9 @@
           <object class="GtkRadioButton">
             <property name="label" translatable="yes">David</property>
             <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">False</property>
-            <property name="draw_indicator">True</property>
+            <property name="can-focus">True</property>
+            <property name="receives-default">False</property>
+            <property name="draw-indicator">True</property>
             <property name="group">author_item</property>
             <signal name="toggled" handler="talkatu_demo_window_author_changed" object="TalkatuDemoWindow" swapped="no"/>
           </object>
@@ -395,9 +515,9 @@
           <object class="GtkRadioButton">
             <property name="label" translatable="yes">Eve</property>
             <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">False</property>
-            <property name="draw_indicator">True</property>
+            <property name="can-focus">True</property>
+            <property name="receives-default">False</property>
+            <property name="draw-indicator">True</property>
             <property name="group">author_item</property>
             <signal name="toggled" handler="talkatu_demo_window_author_changed" object="TalkatuDemoWindow" swapped="no"/>
           </object>
@@ -411,9 +531,9 @@
           <object class="GtkRadioButton">
             <property name="label" translatable="yes">Mallory</property>
             <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">False</property>
-            <property name="draw_indicator">True</property>
+            <property name="can-focus">True</property>
+            <property name="receives-default">False</property>
+            <property name="draw-indicator">True</property>
             <property name="group">author_item</property>
             <signal name="toggled" handler="talkatu_demo_window_author_changed" object="TalkatuDemoWindow" swapped="no"/>
           </object>
@@ -429,21 +549,21 @@
   <object class="TalkatuTagTable" id="table_history"/>
   <object class="TalkatuTagTable" id="table_html"/>
   <object class="TalkatuHtmlBuffer" id="buffer_html">
-    <property name="tag_table">table_html</property>
+    <property name="tag-table">table_html</property>
     <signal name="changed" handler="talkatu_demo_window_buffer_modified_cb" object="TalkatuDemoWindow" swapped="no"/>
   </object>
   <object class="TalkatuTagTable" id="table_markdown"/>
   <object class="TalkatuMarkdownBuffer" id="buffer_markdown">
-    <property name="tag_table">table_markdown</property>
+    <property name="tag-table">table_markdown</property>
     <signal name="changed" handler="talkatu_demo_window_buffer_modified_cb" object="TalkatuDemoWindow" swapped="no"/>
   </object>
   <object class="TalkatuTagTable" id="table_plain"/>
   <object class="TalkatuBuffer" id="buffer_plain">
-    <property name="tag_table">table_plain</property>
+    <property name="tag-table">table_plain</property>
     <signal name="changed" handler="talkatu_demo_window_buffer_modified_cb" object="TalkatuDemoWindow" swapped="no"/>
   </object>
   <object class="TalkatuWholeBuffer" id="buffer_whole">
-    <property name="tag_table">table_plain</property>
+    <property name="tag-table">table_plain</property>
     <property name="style">whole</property>
     <signal name="changed" handler="talkatu_demo_window_buffer_modified_cb" object="TalkatuDemoWindow" swapped="no"/>
   </object>
diff --git a/demo/talkatudemowindow.c b/demo/talkatudemowindow.c
--- a/demo/talkatudemowindow.c
+++ b/demo/talkatudemowindow.c
@@ -262,6 +262,49 @@
 	}
 }
 
+static void
+talkatu_demo_window_author_name_color_toggled_cb(GtkToolButton *button,
+                                                 gpointer data)
+{
+	GtkPopover *popover = GTK_POPOVER(data);
+
+#if GTK_CHECK_VERSION(3,22,0)
+	gtk_popover_popup(popover);
+#else
+	gtk_widget_show(popover);
+#endif
+}
+
+static void
+talkatu_demo_window_author_name_color_popover_closed_cb(GtkPopover *popover,
+                                                        gpointer data)
+{
+	GtkToggleToolButton *button = GTK_TOGGLE_TOOL_BUTTON(data);
+
+	gtk_toggle_tool_button_set_active(button, FALSE);
+}
+
+static void
+talkatu_demo_window_author_name_color_changed(GtkRadioButton *item,
+                                              gpointer data)
+{
+	TalkatuDemoWindow *window = TALKATU_DEMO_WINDOW(data);
+
+	if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(item))) {
+		TalkatuEditor *editor = TALKATU_EDITOR(window->editor);
+		GtkWidget *input = talkatu_editor_get_input(editor);
+		GdkRGBA color;
+		const gchar *label = gtk_button_get_label(GTK_BUTTON(item));
+
+		if(gdk_rgba_parse(&color, label)) {
+			talkatu_message_set_author_name_color(TALKATU_MESSAGE(input),
+			                                      &color);
+		} else {
+			talkatu_message_set_author_name_color(TALKATU_MESSAGE(input), NULL);
+		}
+	}
+}
+
 /******************************************************************************
  * GObject Implementation
  *****************************************************************************/
@@ -336,6 +379,10 @@
 	gtk_widget_class_bind_template_callback(widget_class, talkatu_demo_window_author_toggled_cb);
 	gtk_widget_class_bind_template_callback(widget_class, talkatu_demo_window_author_popover_closed_cb);
 	gtk_widget_class_bind_template_callback(widget_class, talkatu_demo_window_author_changed);
+
+	gtk_widget_class_bind_template_callback(widget_class, talkatu_demo_window_author_name_color_toggled_cb);
+	gtk_widget_class_bind_template_callback(widget_class, talkatu_demo_window_author_name_color_popover_closed_cb);
+	gtk_widget_class_bind_template_callback(widget_class, talkatu_demo_window_author_name_color_changed);
 }
 
 /******************************************************************************
diff --git a/talkatu/data/historyrow.ui b/talkatu/data/historyrow.ui
--- a/talkatu/data/historyrow.ui
+++ b/talkatu/data/historyrow.ui
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.22.2 
+<!-- Generated with glade 3.38.2 
 
 Talkatu - GTK widgets for chat applications
 Copyright (C) 2017-2020 Gary Kramlich <grim@reaperworld.com>
@@ -26,19 +26,19 @@
   <!-- interface-copyright Gary Kramlich <grim@reaperworld.com> -->
   <template class="TalkatuHistoryRow" parent="GtkListBoxRow">
     <property name="visible">True</property>
-    <property name="can_focus">False</property>
+    <property name="can-focus">False</property>
     <child>
       <object class="GtkBox">
         <property name="visible">True</property>
-        <property name="can_focus">False</property>
+        <property name="can-focus">False</property>
         <child>
           <object class="GtkEventBox" id="avatar_event">
-            <property name="can_focus">False</property>
+            <property name="can-focus">False</property>
             <child>
               <object class="GtkImage" id="avatar_image">
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="stock">gtk-missing-image</property>
+                <property name="can-focus">False</property>
+                <property name="icon-name">image-missing</property>
               </object>
             </child>
           </object>
@@ -51,17 +51,19 @@
         <child>
           <object class="GtkBox">
             <property name="visible">True</property>
-            <property name="can_focus">False</property>
+            <property name="can-focus">False</property>
             <property name="orientation">vertical</property>
             <child>
               <object class="GtkBox">
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
+                <property name="can-focus">False</property>
                 <property name="spacing">8</property>
                 <child>
                   <object class="GtkLabel" id="author">
                     <property name="visible">True</property>
-                    <property name="can_focus">False</property>
+                    <property name="can-focus">False</property>
+                    <property name="label" translatable="yes">Author</property>
+                    <property name="use-markup">True</property>
                   </object>
                   <packing>
                     <property name="expand">False</property>
@@ -72,7 +74,9 @@
                 <child>
                   <object class="GtkLabel" id="timestamp">
                     <property name="visible">True</property>
-                    <property name="can_focus">False</property>
+                    <property name="can-focus">False</property>
+                    <property name="label" translatable="yes">12:34PM</property>
+                    <property name="use-markup">True</property>
                   </object>
                   <packing>
                     <property name="expand">False</property>
@@ -82,7 +86,7 @@
                 </child>
                 <child>
                   <object class="GtkLabel" id="edited">
-                    <property name="can_focus">False</property>
+                    <property name="can-focus">False</property>
                     <property name="label" translatable="yes">(edited)</property>
                   </object>
                   <packing>
@@ -101,9 +105,9 @@
             <child>
               <object class="GtkLabel" id="content">
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
+                <property name="can-focus">False</property>
                 <property name="wrap">True</property>
-                <property name="wrap_mode">word-char</property>
+                <property name="wrap-mode">word-char</property>
                 <property name="xalign">0</property>
                 <property name="yalign">0</property>
               </object>
diff --git a/talkatu/talkatuhistoryrow.c b/talkatu/talkatuhistoryrow.c
--- a/talkatu/talkatuhistoryrow.c
+++ b/talkatu/talkatuhistoryrow.c
@@ -76,12 +76,16 @@
 	} else {
 		GDateTime *timestamp = NULL;
 		TalkatuContentType content_type;
+		GdkRGBA *author_name_color = NULL;
+		PangoAttrList *author_attrs = NULL;
+		PangoAttribute *attr = NULL;
 		gchar *author = NULL, *contents = NULL, *datetime = NULL;
 		gboolean edited = FALSE;
 
 		g_object_get(
 			G_OBJECT(row->message),
 			"author", &author,
+			"author-name-color", &author_name_color,
 			"content-type", &content_type,
 			"contents", &contents,
 			"edited", &edited,
@@ -89,9 +93,18 @@
 			NULL
 		);
 
-		datetime = g_date_time_format(timestamp, "%I:%M %P");
+		author_attrs = pango_attr_list_new();
+		if(author_name_color != NULL) {
+			attr = pango_attr_foreground_new(0xFFFF * author_name_color->red,
+			                                 0xFFFF * author_name_color->green,
+			                                 0xFFFF * author_name_color->blue);
+			pango_attr_list_insert(author_attrs, attr);
+		}
+		gtk_label_set_attributes(GTK_LABEL(row->author), author_attrs);
+		pango_attr_list_unref(author_attrs);
+		gtk_label_set_text(GTK_LABEL(row->author), author);
 
-		gtk_label_set_text(GTK_LABEL(row->author), author);
+		datetime = g_date_time_format(timestamp, "%I:%M %P");
 		gtk_label_set_text(GTK_LABEL(row->timestamp), datetime);
 
 		if(edited) {
@@ -123,6 +136,7 @@
 		g_free(datetime);
 		g_free(contents);
 		g_clear_pointer(&timestamp, g_date_time_unref);
+		g_clear_pointer(&author_name_color, gdk_rgba_free);
 	}
 }
 
diff --git a/talkatu/talkatuinput.c b/talkatu/talkatuinput.c
--- a/talkatu/talkatuinput.c
+++ b/talkatu/talkatuinput.c
@@ -100,7 +100,10 @@
 	guint64 id;
 	GDateTime *timestamp;
 	TalkatuContentType content_type;
+
 	gchar *author;
+	GdkRGBA *author_name_color;
+
 	gboolean edited;
 } TalkatuInputPrivate;
 
@@ -118,6 +121,7 @@
 	PROP_TIMESTAMP,
 	PROP_CONTENT_TYPE,
 	PROP_AUTHOR,
+	PROP_AUTHOR_NAME_COLOR,
 	PROP_CONTENTS,
 	PROP_EDITED,
 };
@@ -222,6 +226,30 @@
 	g_object_notify(G_OBJECT(input), "author");
 }
 
+static GdkRGBA *
+talkatu_input_get_author_name_color(TalkatuInput *input) {
+	TalkatuInputPrivate *priv = talkatu_input_get_instance_private(input);
+
+	if(priv->author_name_color != NULL) {
+		return gdk_rgba_copy(priv->author_name_color);
+	}
+
+	return NULL;
+}
+
+static void
+talkatu_input_set_author_name_color(TalkatuInput *input, GdkRGBA *color) {
+	TalkatuInputPrivate *priv = talkatu_input_get_instance_private(input);
+
+	g_clear_pointer(&priv->author_name_color, gdk_rgba_free);
+
+	if(color != NULL) {
+		priv->author_name_color = gdk_rgba_copy(color);
+	}
+
+	g_object_notify(G_OBJECT(input), "author-name-color");
+}
+
 static gchar *
 talkatu_input_get_contents(TalkatuInput *input) {
 	GtkTextBuffer *buffer = NULL;
@@ -625,6 +653,9 @@
 		case PROP_AUTHOR:
 			g_value_set_string(value, talkatu_input_get_author(input));
 			break;
+		case PROP_AUTHOR_NAME_COLOR:
+			g_value_set_boxed(value, talkatu_input_get_author_name_color(input));
+			break;
 		case PROP_CONTENTS:
 			g_value_set_string(value, talkatu_input_get_contents(input));
 			break;
@@ -657,6 +688,9 @@
 		case PROP_AUTHOR:
 			talkatu_input_set_author(input, g_value_get_string(value));
 			break;
+		case PROP_AUTHOR_NAME_COLOR:
+			talkatu_input_set_author_name_color(input, g_value_get_boxed(value));
+			break;
 		case PROP_CONTENTS:
 			talkatu_input_set_contents(input, g_value_get_string(value));
 			break;
@@ -707,6 +741,11 @@
 
 	g_hash_table_destroy(priv->attachments);
 
+	g_clear_pointer(&priv->timestamp, g_date_time_unref);
+
+	g_clear_pointer(&priv->author, g_free);
+	g_clear_pointer(&priv->author_name_color, gdk_rgba_free);
+
 	G_OBJECT_CLASS(talkatu_input_parent_class)->finalize(obj);
 }
 
@@ -741,6 +780,7 @@
 	g_object_class_override_property(obj_class, PROP_TIMESTAMP, "timestamp");
 	g_object_class_override_property(obj_class, PROP_CONTENT_TYPE, "content-type");
 	g_object_class_override_property(obj_class, PROP_AUTHOR, "author");
+	g_object_class_override_property(obj_class, PROP_AUTHOR_NAME_COLOR, "author-name-color");
 	g_object_class_override_property(obj_class, PROP_CONTENTS, "contents");
 	g_object_class_override_property(obj_class, PROP_EDITED, "edited");
 
diff --git a/talkatu/talkatumessage.h b/talkatu/talkatumessage.h
--- a/talkatu/talkatumessage.h
+++ b/talkatu/talkatumessage.h
@@ -70,6 +70,9 @@
 gchar *talkatu_message_get_author(TalkatuMessage *message);
 void talkatu_message_set_author(TalkatuMessage *message, const gchar *author);
 
+GdkRGBA *talkatu_message_get_author_name_color(TalkatuMessage *message);
+void talkatu_message_set_author_name_color(TalkatuMessage *message, GdkRGBA *color);
+
 gchar *talkatu_message_get_contents(TalkatuMessage *message);
 void talkatu_message_set_contents(TalkatuMessage *message, const gchar *contents);
 
diff --git a/talkatu/talkatumessage.c b/talkatu/talkatumessage.c
--- a/talkatu/talkatumessage.c
+++ b/talkatu/talkatumessage.c
@@ -134,6 +134,20 @@
 	g_object_interface_install_property(iface, pspec);
 
 	/**
+	 * TalkatuMessage::author-name-color:
+	 *
+	 * The color for the author's name.
+	 */
+	pspec = g_param_spec_boxed(
+		"author-name-color", "author-name-color",
+		"The color to use when rendering the author's name",
+		GDK_TYPE_RGBA,
+		G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS
+	);
+	g_object_interface_install_property(iface, pspec);
+
+
+	/**
 	 * TalkatuMessage::contents:
 	 *
 	 * The contents of the message.
@@ -302,6 +316,42 @@
 }
 
 /**
+ * talkatu_message_get_author_name_color:
+ * @message: The #TalkatuMessage instance.
+ *
+ * Gets a #GdkRGBA that the author's name will be rendered with or %NULL if no
+ * color is set.
+ *
+ * Returns: (transfer full): The #GdkRGBA to renderer the author's name with if
+ *          set, otherwise %NULL.
+ */
+GdkRGBA *
+talkatu_message_get_author_name_color(TalkatuMessage *message) {
+	GdkRGBA *color = NULL;
+
+	g_return_val_if_fail(TALKATU_IS_MESSAGE(message), NULL);
+
+	g_object_get(G_OBJECT(message), "author-name-color", &color, NULL);
+
+	return color;
+}
+
+/**
+ * talkatu_message_set_author_name_color:
+ * @message: The #TalkatuMessage instance.
+ * @color: The new color for the author's name.
+ *
+ * Sets the color for the name of the author of @message to @color. Calling
+ * this with @color set to %NULL will unset a previously set color.
+ */
+void
+talkatu_message_set_author_name_color(TalkatuMessage *message, GdkRGBA *color) {
+	g_return_if_fail(TALKATU_IS_MESSAGE(message));
+
+	g_object_set(G_OBJECT(message), "author-name-color", color, NULL);
+}
+
+/**
  * talkatu_message_get_contents:
  * @message: The #TalkatuMessage instance.
  *
