diff --git a/KelvinDashboardGUI/DapServiceController.cpp b/KelvinDashboardGUI/DapServiceController.cpp
index f3859cdd2e6f8415f096f791ba214131b3817895..e43d06d15b4c689645ae7ee7bf99723622efc99b 100644
--- a/KelvinDashboardGUI/DapServiceController.cpp
+++ b/KelvinDashboardGUI/DapServiceController.cpp
@@ -1,6 +1,8 @@
 #include "DapServiceController.h"
 #include "DapUiQmlWidgetModel.h"
-DapServiceController::DapServiceController(QObject *apParent) 
+#include "DapLogMessage.h"
+
+DapServiceController::DapServiceController(QObject *apParent)
     : QObject(apParent)
 {
     
@@ -64,7 +66,28 @@ void DapServiceController::getNodeLogs(int aiTimeStamp, int aiRowCount) const
 void DapServiceController::processGetNodeLogs(const QStringList &aNodeLogs)
 {
     for(QString s : aNodeLogs)
+    {
         qDebug() << s;
+        QStringList tempList = s.split(" ");
+        DapLogMessage message;
+        if(tempList.at(1) == "[INF]")
+            message.setType(Type::Info);
+        else if(tempList.at(1) == "[WRN]")
+            message.setType(Type::Warning);
+        else if(tempList.at(1) == "[DBG]")
+            message.setType(Type::Debug);
+        else if(tempList.at(1) == "[ERR]")
+            message.setType(Type::Error);
+        QString str = tempList.at(0);
+        message.setTimeStamp(str.remove("[").remove("]"));
+        QStringList tempList2 = tempList.at(2).split("\t");
+        QString str2 = tempList2.at(0);
+        message.setFile(str2.remove("[").remove("]"));
+        QString str3 = s.split("\t").at(1);
+        int pos = str3.indexOf('\n');
+        message.setMessage(str3.remove(pos, str3.size()-pos));
+        DapLogModel::getInstance().append(message);
+    }
 }
 
 /// Get an instance of a class.
diff --git a/KelvinDashboardGUI/DapServiceController.h b/KelvinDashboardGUI/DapServiceController.h
index 645700372392c099e8aaa7c8492e70e8aa62d44b..cc18d73129fa5d01e71ab90db37b05c47438eec6 100644
--- a/KelvinDashboardGUI/DapServiceController.h
+++ b/KelvinDashboardGUI/DapServiceController.h
@@ -9,6 +9,7 @@
 
 #include "DapCommandController.h"
 #include "DapServiceClient.h"
+#include "DapLogModel.h"
 
 class DapServiceController : public QObject
 {
@@ -57,6 +58,9 @@ public:
     /// @param aiRowCount Number of lines displayed.
     void getNodeLogs(int aiTimeStamp, int aiRowCount) const;
     
+    DapLogModel getLogModel() const;
+    void setLogModel(const DapLogModel &dapLogModel);
+
 signals:
     /// The signal is emitted when the Brand company property changes.
     void brandChanged(const QString &brand);
diff --git a/KelvinDashboardGUI/DapUiQmlWidgetChainNodeLogs.ui.qml b/KelvinDashboardGUI/DapUiQmlWidgetChainNodeLogs.ui.qml
index ffb7b6afbb502e3e67b852ef73662dc427a3ad99..98096425efad25d92d4b5a655e17b4af10329bf6 100644
--- a/KelvinDashboardGUI/DapUiQmlWidgetChainNodeLogs.ui.qml
+++ b/KelvinDashboardGUI/DapUiQmlWidgetChainNodeLogs.ui.qml
@@ -7,24 +7,6 @@ Page {
     id: dapUiQmlWidgetChainNodeLogs
     title: "Logs"
     
-    
-    ListModel {
-            id: dataModel
-    
-            ListElement {
-                    name: "Apple"
-                    cost: 2.45
-                }
-                ListElement {
-                    name: "Orange"
-                    cost: 3.25
-                }
-                ListElement {
-                    name: "Banana"
-                    cost: 1.95
-                }
-        }
-    
         TabView
         {
             id: tabViewLogs
@@ -48,47 +30,62 @@ Page {
 //                        anchors.bottom: parent.bottom
 //                        anchors.left: parent.left
 //                        anchors.right: parent.right
-                        model: dataModel
+                        model: dapLogModel
                 clip: true
                 
                         TableViewColumn {
                             id: columnType
-                            role: "type"
+//                            role: "type"
                             title: "Type"
                             
                              delegate:
+                                 Item{
                                          Image {
                                              id: names
-                                             source: "qrc:/Resources/Icons/icon.png"
+                                             anchors.centerIn: parent
+                                             source: "qrc:/Resources/Icons/dialog.png"
+                                             width: 14
+                                             height: 14
                                          }
-                        }
-                        TableViewColumn {
-                            id: columnDate
-                            role: "name"
-                            title: "Date"
+                             }
                         }
                         TableViewColumn {
                             id: columnTime
-                            role: "cost"
-                            title: "Time"
+                            role: "timestamp"
+                            title: "Timestamp"
+                            delegate: Item {
+                                        Text {
+                                            anchors.centerIn: parent
+                                            renderType: Text.NativeRendering
+                                            text: styleData.value
+                                        }
+                                    }
                         }
                         TableViewColumn {
                             id: columnFile
                             role: "file"
                             title: "File"
+                            delegate: Item {
+                                        Text {
+                                            anchors.centerIn: parent
+                                            renderType: Text.NativeRendering
+                                            text: styleData.value
+                                        }
+                                    }
                         }
                         TableViewColumn {
                             id: columnMessage
-                            role: "Message"
+                            role: "message"
                             title: "Message"
-                        }
-                        itemDelegate: Item {
-                                    Text {
-                                        anchors.centerIn: parent
-                                        renderType: Text.NativeRendering
-                                        text: styleData.value
+                            delegate: Item {
+                                        Text {
+                                            renderType: Text.NativeRendering
+                                            text: styleData.value
+                                        }
                                     }
-                                }
+                        }
+
+
                         headerDelegate: Rectangle {
                             height: 20
                             color: "red"
diff --git a/KelvinDashboardGUI/Resources/Icons/dialog.png b/KelvinDashboardGUI/Resources/Icons/dialog.png
new file mode 100644
index 0000000000000000000000000000000000000000..176bc26d4962885d56ed46d4c7fb9c62f195529e
Binary files /dev/null and b/KelvinDashboardGUI/Resources/Icons/dialog.png differ
diff --git a/KelvinDashboardGUI/main.cpp b/KelvinDashboardGUI/main.cpp
index 5d39cd220179776d5322d290e264207912f08002..f2d8ca3f4a36747138b639dd9ca96a6904718d81 100755
--- a/KelvinDashboardGUI/main.cpp
+++ b/KelvinDashboardGUI/main.cpp
@@ -16,6 +16,8 @@
 #include "DapServiceClient.h"
 #include "DapServiceController.h"
 #include "DapLogger.h"
+#include "DapLogMessage.h"
+#include "DapLogModel.h"
 
 int main(int argc, char *argv[])
 {
@@ -45,12 +47,14 @@ int main(int argc, char *argv[])
     
     qmlRegisterType<DapScreenDialog>("KelvinDashboard", 1, 0, "DapScreenDialog");
     qmlRegisterType<DapScreenDialogChangeWidget>("KelvinDashboard", 1, 0, "DapScreenDialogChangeWidget");
+    qmlRegisterType<DapLogMessage>("LogMessage", 1, 0, "DapLogMessage");
     qmlRegisterSingletonType<DapServiceController>("KelvinDashboard", 1, 0, "DapServiceController", DapServiceController::singletonProvider);
     qmlRegisterSingletonType<DapUiQmlWidgetModel>("KelvinDashboard", 1, 0, "DapUiQmlWidgetModel", DapUiQmlWidgetModel::singletonProvider);
     
     QQmlApplicationEngine engine;
     engine.rootContext()->setContextProperty("dapServiceController", &DapServiceController::getInstance());
     engine.rootContext()->setContextProperty("dapUiQmlWidgetModel", &DapUiQmlWidgetModel::getInstance());
+    engine.rootContext()->setContextProperty("dapLogModel", &DapLogModel::getInstance());
     engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
     
 //    DapSettings &settings = DapSettings::getInstance("Settings.json");
diff --git a/KelvinDashboardGUI/qml.qrc b/KelvinDashboardGUI/qml.qrc
index 8d93e1b02c9a6c266a93892ce9f6505fecba7074..9d4d9bc8622ffd701129e9a5a849cace8f002132 100755
--- a/KelvinDashboardGUI/qml.qrc
+++ b/KelvinDashboardGUI/qml.qrc
@@ -22,5 +22,6 @@
         <file>DapUiQmlWidgetChainNodeLogs.ui.qml</file>
         <file>Resources/Icons/add.png</file>
         <file>Resources/Icons/icon.ico</file>
+        <file>Resources/Icons/dialog.png</file>
     </qresource>
 </RCC>
diff --git a/KelvinDashboardService/DapChainDashboardService.h b/KelvinDashboardService/DapChainDashboardService.h
index 43d453b742eb2bd93b1285cb9bfd6e1604b77858..5527ef925f1b166f7fd6bbb37188e4ff6ff6b7c0 100755
--- a/KelvinDashboardService/DapChainDashboardService.h
+++ b/KelvinDashboardService/DapChainDashboardService.h
@@ -33,8 +33,11 @@ class DapChainDashboardService : public DapRpcService
 {
     Q_OBJECT
     Q_CLASSINFO("serviceName", "RPCServer")
+    /// Service core.
     DapUiService            * m_pServer {nullptr};
+    /// Socket of client connection with the service.
     DapUiSocketServer       * m_pSocketService {nullptr};
+    /// Log reader.
     DapLogReader            * m_pDapLogReader {nullptr};
 public:
     /// Standard сonstructor.
diff --git a/KelvinDashboardService/DapLogReader.cpp b/KelvinDashboardService/DapLogReader.cpp
index fb2fc13b129d2dcc273df01901584386625ada48..9907b1c834736ec59737ce759b8f1bf47a910fe2 100644
--- a/KelvinDashboardService/DapLogReader.cpp
+++ b/KelvinDashboardService/DapLogReader.cpp
@@ -9,14 +9,14 @@ DapLogReader::DapLogReader(QObject *parent) : QObject(parent)
 
 QStringList DapLogReader::parse(const QByteArray &aLogMessages)
 {
-    auto list = QString::fromLatin1(aLogMessages).split(";");
+    QStringList list = QString::fromLatin1(aLogMessages).split(";");
 
-    for(QString l : list)
+    auto resultEnd = std::remove_if(list.begin(), list.end(),
+    [] (const QString& aLogMessage)
     {
-        if(l.contains("["))
-            qDebug() << l;
-    }
-
+        return !aLogMessage.contains('[');
+    });
+    list.erase(resultEnd, list.end());
     return list;
 }
 
diff --git a/KelvinDashboardService/DapLogReader.h b/KelvinDashboardService/DapLogReader.h
index d14bf5c9426dbe2306a7afe12c8baf63d99baef1..a164d3598eb548be7bcc81ff4ea9186d2cfed976 100644
--- a/KelvinDashboardService/DapLogReader.h
+++ b/KelvinDashboardService/DapLogReader.h
@@ -4,8 +4,11 @@
 #include <QObject>
 #include <QString>
 #include <QProcess>
+#include <algorithm>
 #include <QDebug>
 
+#include "DapLogMessage.h"
+
 class DapLogReader : public QObject
 {
     Q_OBJECT
diff --git a/libKelvinDashboardCommon/DapLogMessage.cpp b/libKelvinDashboardCommon/DapLogMessage.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..fec32450ba53bd2f7eeb9101c796953456aa740d
--- /dev/null
+++ b/libKelvinDashboardCommon/DapLogMessage.cpp
@@ -0,0 +1,57 @@
+#include "DapLogMessage.h"
+
+DapLogMessage::DapLogMessage(const Type &type, const QString &timestamp, const QString &file, const QString &message, QObject *parent) : QObject(parent)
+{
+    m_type = type;
+    m_sTimeStamp = timestamp;
+    m_sFile = file;
+    m_sMessage = message;
+}
+
+Type DapLogMessage::getType() const
+{
+    return m_type;
+}
+
+void DapLogMessage::setType(const Type &type)
+{
+    m_type = type;
+
+    emit typeChanged(m_type);
+}
+
+QString DapLogMessage::getTimeStamp() const
+{
+    return m_sTimeStamp;
+}
+
+void DapLogMessage::setTimeStamp(const QString &sTimeStamp)
+{
+    m_sTimeStamp = sTimeStamp;
+
+    emit timeStampChanged(m_sTimeStamp);
+}
+
+QString DapLogMessage::getFile() const
+{
+    return m_sFile;
+}
+
+void DapLogMessage::setFile(const QString &sFile)
+{
+    m_sFile = sFile;
+
+    emit fileChanged(m_sFile);
+}
+
+QString DapLogMessage::getMessage() const
+{
+    return m_sMessage;
+}
+
+void DapLogMessage::setMessage(const QString &sMessage)
+{
+    m_sMessage = sMessage;
+
+    emit messageChanged(m_sMessage);
+}
diff --git a/libKelvinDashboardCommon/DapLogMessage.h b/libKelvinDashboardCommon/DapLogMessage.h
new file mode 100644
index 0000000000000000000000000000000000000000..c3e0d2d4acd3ef44fc9259fa1a828e19b35aa481
--- /dev/null
+++ b/libKelvinDashboardCommon/DapLogMessage.h
@@ -0,0 +1,53 @@
+#ifndef DAPLOGMESSAGE_H
+#define DAPLOGMESSAGE_H
+
+#include <QObject>
+
+enum Type
+{
+    Info,
+    Warning,
+    Debug,
+    Error
+};
+
+class DapLogMessage : public QObject
+{
+    Q_OBJECT
+
+    Type m_type;
+    QString m_sTimeStamp;
+    QString m_sFile;
+    QString m_sMessage;
+
+public:
+    explicit DapLogMessage(QObject *parent = nullptr) {}
+    DapLogMessage(const Type &type, const QString &timestamp, const QString  &file, const QString &message, QObject *parent = nullptr);
+
+
+    Q_PROPERTY(Type type READ getType WRITE setType NOTIFY typeChanged)
+    Q_PROPERTY(QString timestamp READ getTimeStamp WRITE setTimeStamp NOTIFY timeStampChanged)
+    Q_PROPERTY(QString file READ getFile WRITE setFile NOTIFY fileChanged)
+    Q_PROPERTY(QString message READ getMessage WRITE setMessage NOTIFY messageChanged)
+
+    Type getType() const;
+    void setType(const Type &type);
+
+    QString getTimeStamp() const;
+    void setTimeStamp(const QString &sTimeStamp);
+
+    QString getFile() const;
+    void setFile(const QString &sFile);
+
+    QString getMessage() const;
+    void setMessage(const QString &sMessage);
+
+signals:
+    void typeChanged(Type aType);
+    void timeStampChanged(const QString& aTimeStamp);
+    void fileChanged(const QString& aFile);
+    void messageChanged(const QString& aMessage);
+
+};
+
+#endif // DAPLOGMESSAGE_H
diff --git a/libKelvinDashboardCommon/DapLogModel.cpp b/libKelvinDashboardCommon/DapLogModel.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ad8d7d4f3c080b2b11bac5a6cd55b4677ef4abd6
--- /dev/null
+++ b/libKelvinDashboardCommon/DapLogModel.cpp
@@ -0,0 +1,98 @@
+#include "DapLogModel.h"
+
+DapLogModel::DapLogModel(QObject *parent) : QAbstractListModel(parent)
+{
+
+}
+
+DapLogModel &DapLogModel::getInstance()
+{
+    static DapLogModel instance;
+    return instance;
+}
+
+int DapLogModel::rowCount(const QModelIndex &) const
+{
+    return m_dapLogMessage.count();
+}
+
+QVariant DapLogModel::data(const QModelIndex &index, int role) const
+{
+    if (index.row() < rowCount())
+            switch (role) {
+            case TypeRole: return m_dapLogMessage.at(index.row())->getType();
+            case TimeStampRole: return m_dapLogMessage.at(index.row())->getTimeStamp();
+            case FileRole: return m_dapLogMessage.at(index.row())->getFile();
+            case MessageRole: return m_dapLogMessage.at(index.row())->getMessage();
+            default:
+                return QVariant();
+        }
+    return QVariant();
+}
+
+QHash<int, QByteArray> DapLogModel::roleNames() const
+{
+    static const QHash<int, QByteArray> roles {
+            { TypeRole, "type" },
+            { TimeStampRole, "timestamp" },
+            { FileRole, "file" },
+            { MessageRole, "message" }
+        };
+
+    return roles;
+}
+
+QVariantMap DapLogModel::get(int row) const
+{
+    const DapLogMessage *widget = m_dapLogMessage.value(row);
+    return { {"type", widget->getType()}, {"timestamp", widget->getTimeStamp()}, {"file", widget->getFile()}, {"message", widget->getMessage()} };
+}
+
+void DapLogModel::append(const DapLogMessage &message)
+{
+    this->append(message.getType(), message.getTimeStamp(), message.getFile(), message.getMessage());
+}
+
+void DapLogModel::append(const Type &type, const QString &timestamp, const QString &file, const QString &message)
+{
+    int row = 0;
+    while (row < m_dapLogMessage.count() && timestamp > m_dapLogMessage.at(row)->getTimeStamp())
+        ++row;
+    beginInsertRows(QModelIndex(), row, row);
+    m_dapLogMessage.insert(row, new DapLogMessage(type, timestamp, file, message));
+    endInsertRows();
+}
+
+void DapLogModel::set(int row, const Type &type, const QString &timestamp, const QString &file, const QString &message)
+{
+    if (row < 0 || row >= m_dapLogMessage.count())
+            return;
+
+        DapLogMessage *widget = m_dapLogMessage.value(row);
+        widget->setType(type);
+        widget->setTimeStamp(timestamp);
+        widget->setFile(file);
+        widget->setMessage(message);
+        dataChanged(index(row, 0), index(row, 0), { TypeRole, TimeStampRole, FileRole, MessageRole });
+}
+
+void DapLogModel::remove(int row)
+{
+    if (row < 0 || row >= m_dapLogMessage.count())
+            return;
+
+        beginRemoveRows(QModelIndex(), row, row);
+        m_dapLogMessage.removeAt(row);
+        endRemoveRows();
+}
+
+/// Method that implements the singleton pattern for the qml layer.
+/// @param engine QML application.
+/// @param scriptEngine The QJSEngine class provides an environment for evaluating JavaScript code.
+QObject *DapLogModel::singletonProvider(QQmlEngine *engine, QJSEngine *scriptEngine)
+{
+    Q_UNUSED(engine)
+    Q_UNUSED(scriptEngine)
+
+    return &getInstance();
+}
diff --git a/libKelvinDashboardCommon/DapLogModel.h b/libKelvinDashboardCommon/DapLogModel.h
new file mode 100644
index 0000000000000000000000000000000000000000..0bb8decba70e3f9a66206f4deea4055dd935f8e0
--- /dev/null
+++ b/libKelvinDashboardCommon/DapLogModel.h
@@ -0,0 +1,55 @@
+#ifndef DAPLOGMODEL_H
+#define DAPLOGMODEL_H
+
+#include <QObject>
+#include <QAbstractListModel>
+#include <QList>
+#include <QQmlEngine>
+#include <QJSEngine>
+#include <QXmlStreamWriter>
+#include <QXmlStreamReader>
+#include <QXmlStreamAttribute>
+
+#include "DapLogMessage.h"
+
+enum DapLogRole {
+        TypeRole = Qt::DisplayRole,
+        TimeStampRole = Qt::UserRole,
+        FileRole,
+        MessageRole
+    };
+
+class DapLogModel : public QAbstractListModel
+{
+    Q_OBJECT
+
+    QList<DapLogMessage*>    m_dapLogMessage;
+
+    DapLogModel(QObject *parent = nullptr);
+public:
+
+    /// Get an instance of a class.
+    /// @return Instance of a class.
+    Q_INVOKABLE static DapLogModel &getInstance();
+
+
+    Q_ENUM(DapLogRole)
+
+    int rowCount(const QModelIndex & = QModelIndex()) const;
+    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
+    QHash<int, QByteArray> roleNames() const;
+
+    Q_INVOKABLE QVariantMap get(int row) const;
+    Q_INVOKABLE void append(const DapLogMessage &message);
+    Q_INVOKABLE void append(const Type &type, const QString &timestamp, const QString  &file, const QString &message);
+    Q_INVOKABLE void set(int row, const Type &type, const QString &timestamp, const QString  &file, const QString &message);
+    Q_INVOKABLE void remove(int row);
+
+public slots:
+    /// Method that implements the singleton pattern for the qml layer.
+    /// @param engine QML application.
+    /// @param scriptEngine The QJSEngine class provides an environment for evaluating JavaScript code.
+    static QObject *singletonProvider(QQmlEngine *engine, QJSEngine *scriptEngine);
+};
+
+#endif // DAPLOGMODEL_H
diff --git a/libKelvinDashboardCommon/libKelvinDashboardCommon.pri b/libKelvinDashboardCommon/libKelvinDashboardCommon.pri
index 3dfc99342e9488d181c765703c467353d6512265..ee6bc4c894696ea960690aa0efeb2f04dd0ff66c 100755
--- a/libKelvinDashboardCommon/libKelvinDashboardCommon.pri
+++ b/libKelvinDashboardCommon/libKelvinDashboardCommon.pri
@@ -14,9 +14,13 @@ QT += quick quickwidgets
 SOURCES +=\
     $$PWD/DapHalper.cpp \
     $$PWD/DapSettings.cpp \
-    $$PWD/DapSettingsCipher.cpp
+    $$PWD/DapSettingsCipher.cpp \
+    $$PWD/DapLogMessage.cpp \
+    $$PWD/DapLogModel.cpp
 
 HEADERS +=\
     $$PWD/DapHalper.h \
     $$PWD/DapSettings.h \
-    $$PWD/DapSettingsCipher.h
+    $$PWD/DapSettingsCipher.h \
+    $$PWD/DapLogMessage.h \
+    $$PWD/DapLogModel.h