diff --git a/imdelegate.cpp b/imdelegate.cpp
index f18cf1d..054f4fc 100644
--- a/imdelegate.cpp
+++ b/imdelegate.cpp
@@ -19,36 +19,41 @@
 #include "imdelegate.h"
 
 #include <QApplication>
+#include <QTextDocument>
+#include <QSettings>
+#include <QDateTime>
 
 #include "media/text.h"
 #include "media/textrecording.h"
 
 #include "ringthemeutils.h"
+#include "settingskey.h"
 
 ImDelegate::ImDelegate(QObject *parent)
-    : QStyledItemDelegate(parent), showDate_(false), showAuthor_(false)
-{}
-
-void ImDelegate::setDisplayOptions(ImDelegate::DisplayOptions opt)
+    : QStyledItemDelegate(parent)
 {
-    showAuthor_ = opt & DisplayOptions::AUTHOR;
-    showDate_ = opt & DisplayOptions::DATE;
-    emit sizeHintChanged(QModelIndex());
 }
 
 void
 ImDelegate::formatMsg(const QModelIndex& index, QString& msg) const
 {
-    if (showAuthor_) {
-        auto author = index.data(
+    QSettings settings;
+    QStringList meta;
+    if (settings.value(SettingsKey::imShowAuthor).toBool()) {
+        meta << index.data(
                     static_cast<int>(Media::TextRecording::Role::AuthorDisplayname)).toString();
-        msg = QString("(%1)\n%2").arg(author, msg);
     }
-    if (showDate_) {
-        auto formattedDate = index.data(
-                    static_cast<int>(Media::TextRecording::Role::FormattedDate)).toString();
-        msg = QString("%2\n%1").arg(formattedDate, msg);
+    if (settings.value(SettingsKey::imShowDate).toBool()) {
+        auto timeStamp = index.data(
+                    static_cast<int>(Media::TextRecording::Role::Timestamp)).value<uint>();
+        auto date = QDateTime::fromTime_t(timeStamp);
+        auto now = QDateTime::currentDateTime();
+        if (now.date() == date.date())
+            meta << date.time().toString();
+        else
+            meta << date.toString();
     }
+    msg = QString("%2<footer><i>%1</i></footer>").arg(meta.join(" - "), msg);
 }
 
 void
@@ -64,7 +69,7 @@
     painter->setFont(fontMsg_);
 
     if (index.isValid()) {
-        auto msg = index.data(Qt::DisplayRole).toString();
+        auto msg = index.data(static_cast<int>(Media::TextRecording::Role::FormattedHtml)).toString();
         opt.text.clear();
         QStyle* style = opt.widget ? opt.widget->style() : QApplication::style();
 
@@ -76,53 +81,73 @@
 
         QRect textRect = getBoundingRect(dir, msg, opt);
 
-        QRect bubbleRect(textRect.left() - padding_,
-                         textRect.top() - padding_,
-                         textRect.width() + 2 * padding_,
-                         textRect.height() + 2 * padding_ );
-
-        opt.decorationSize = iconSize_;
-        opt.decorationPosition = (dir == Qt::AlignRight ?
-                                      QStyleOptionViewItem::Right : QStyleOptionViewItem::Left);
-        opt.decorationAlignment = Qt::AlignTop | Qt::AlignHCenter;
+        if (dir == Qt::AlignLeft) {
+            opt.decorationSize = iconSize_;
+            opt.decorationPosition = (dir == Qt::AlignRight ?
+                                          QStyleOptionViewItem::Right : QStyleOptionViewItem::Left);
+            opt.decorationAlignment = Qt::AlignTop | Qt::AlignHCenter;
+        } else
+            opt.decorationSize = QSize();
         style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, opt.widget);
 
         QPainterPath path;
-        path.addRoundedRect(bubbleRect, padding_, padding_);
+        path.addRoundedRect(textRect, padding_, padding_);
 
         if (dir == Qt::AlignRight) {
             painter->fillPath(path, RingTheme::blue_);
-            painter->setPen(Qt::white);
         }
         else {
             painter->fillPath(path, Qt::white);
-            painter->setPen(Qt::black);
         }
 
-        painter->drawText(textRect, Qt::AlignLeft | Qt::AlignTop | Qt::TextWordWrap, msg);
+        painter->save();
+
+        QTextDocument document;
+        document.setDefaultFont(fontMsg_);
+
+        if (dir == Qt::AlignRight)
+            document.setDefaultStyleSheet("body { color : white; } i { opacity: 100; font-size : 11px; text-align : right; }");
+        else
+            document.setDefaultStyleSheet("body { color : black; } i { opacity: 100; font-size : 11px; text-align : right; }");
+
+        document.setHtml(msg);
+
+        auto textOptions = QTextOption(Qt::AlignLeft);
+        textOptions.setWrapMode(QTextOption::WrapMode::WordWrap);
+        document.setDefaultTextOption(textOptions);
+        document.setTextWidth(textRect.width());
+
+        painter->translate(textRect.topLeft());
+        document.drawContents(painter);
+        painter->restore();
     }
 }
 
-QRect ImDelegate::getBoundingRect(const Qt::AlignmentFlag& dir, const QString& msg, const QStyleOptionViewItem &option) const
+QRect ImDelegate::getBoundingRect(const Qt::AlignmentFlag& dir,
+                                  const QString& msg,
+                                  const QStyleOptionViewItem &option) const
 {
-    QFont textFont = option.font;
-    QFontMetrics textFontMetrics(textFont);
     QRect textRect;
 
-    if (dir == Qt::AlignRight) {
-        textRect = textFontMetrics.boundingRect(option.rect.left() + 2 * padding_,
-                                                option.rect.top() + 2 * padding_,
-                                                option.rect.width() - iconSize_.width() - 4 * padding_,
-                                                0,
-                                                dir|Qt::AlignTop|Qt::TextWordWrap,
-                                                msg);
+    QTextDocument txtDoc;
+    txtDoc.setDefaultFont(fontMsg_);
+    txtDoc.setHtml(msg);
+    auto textOptions = QTextOption(Qt::AlignLeft);
+    textOptions.setWrapMode(QTextOption::WrapMode::WordWrap);
+    txtDoc.setDefaultTextOption(textOptions);
+
+    if (dir == Qt::AlignLeft) {
+        txtDoc.setTextWidth(option.rect.width() - iconSize_.width() - padding_);
+        textRect.setRect(option.rect.left() + iconSize_.width() + padding_,
+                         option.rect.top() + padding_,
+                         txtDoc.idealWidth(),
+                         txtDoc.size().height());
     } else {
-        textRect = textFontMetrics.boundingRect(option.rect.left() + iconSize_.width() + 2 * padding_,
-                                                option.rect.top() + 2 * padding_,
-                                                option.rect.width() - iconSize_.width() - 4 * padding_ ,
-                                                0,
-                                                dir|Qt::AlignTop|Qt::TextWordWrap,
-                                                msg);
+        txtDoc.setTextWidth(option.rect.width() - padding_);
+        textRect.setRect(option.rect.right() - padding_ - txtDoc.idealWidth(),
+                         option.rect.top() + padding_,
+                         txtDoc.idealWidth(),
+                         txtDoc.size().height());
     }
     return textRect;
 }
@@ -134,7 +159,7 @@
     QStyleOptionViewItem opt = option;
     opt.font = fontMsg_;
 
-    QString msg = index.data(Qt::DisplayRole).toString();
+    QString msg = index.data(static_cast<int>(Media::TextRecording::Role::FormattedHtml)).toString();
 
     auto dir = index.data(
                 static_cast<int>(Media::TextRecording::Role::Direction))
@@ -145,11 +170,13 @@
 
     QRect boundingRect = getBoundingRect(dir, msg, opt);
 
-    QSize size(option.rect.width(), boundingRect.height() + padding_);
+    QSize size(option.rect.width(), boundingRect.height());
 
     /* Keep the minimum height needed. */
     if(size.height() < iconSize_.height())
-        size.setHeight(iconSize_.height() + padding_);
+        size.setHeight(iconSize_.height());
+
+    size.setHeight(size.height() + 2 * padding_);
 
     return size;
 }
