}
 
 
-BufferSyncer::BufferSyncer(const QHash<BufferId, MsgId> &lastSeenMsg, const QHash<BufferId, MsgId> &markerLines, QObject *parent)
+BufferSyncer::BufferSyncer(const QHash<BufferId, MsgId> &lastSeenMsg, const QHash<BufferId, MsgId> &markerLines, const QHash<BufferId, Message::Types> &activities, QObject *parent)
     : SyncableObject(parent),
     _lastSeenMsg(lastSeenMsg),
-    _markerLines(markerLines)
+    _markerLines(markerLines),
+    _bufferActivities(activities)
 {
 }
 
 }
 
 
+QVariantList BufferSyncer::initActivities() const
+{
+    QVariantList list;
+    QHash<BufferId, Message::Types>::const_iterator iter = _bufferActivities.constBegin();
+    while (iter != _bufferActivities.constEnd()) {
+        list << QVariant::fromValue<BufferId>(iter.key())
+             << QVariant::fromValue<int>((int) iter.value());
+        ++iter;
+    }
+    return list;
+}
+
+
+void BufferSyncer::initSetActivities(const QVariantList &list)
+{
+    _bufferActivities.clear();
+    Q_ASSERT(list.count() % 2 == 0);
+    for (int i = 0; i < list.count(); i += 2) {
+        setBufferActivity(list.at(i).value<BufferId>(), list.at(i+1).value<int>());
+    }
+}
+
+
+Message::Types BufferSyncer::activity(BufferId buffer) const
+{
+    return _bufferActivities.value(buffer, Message::Types());
+}
+
+
 void BufferSyncer::removeBuffer(BufferId buffer)
 {
     if (_lastSeenMsg.contains(buffer))
 
 
 #include "syncableobject.h"
 #include "types.h"
+#include "message.h"
 
 class BufferSyncer : public SyncableObject
 {
 
 public:
     explicit BufferSyncer(QObject *parent);
-    explicit BufferSyncer(const QHash<BufferId, MsgId> &lastSeenMsg, const QHash<BufferId, MsgId> &markerLines, QObject *parent);
+    explicit BufferSyncer(const QHash<BufferId, MsgId> &lastSeenMsg, const QHash<BufferId, MsgId> &markerLines, const QHash<BufferId, Message::Types> &activities, QObject *parent);
 
     inline virtual const QMetaObject *syncMetaObject() const { return &staticMetaObject; }
 
     MsgId lastSeenMsg(BufferId buffer) const;
     MsgId markerLine(BufferId buffer) const;
+    Message::Types activity(BufferId buffer) const;
 
 public slots:
     QVariantList initLastSeenMsg() const;
     QVariantList initMarkerLines() const;
     void initSetMarkerLines(const QVariantList &);
 
+    QVariantList initActivities() const;
+    void initSetActivities(const QVariantList &);
+
     virtual inline void requestSetLastSeenMsg(BufferId buffer, const MsgId &msgId) { REQUEST(ARG(buffer), ARG(msgId)) }
     virtual inline void requestSetMarkerLine(BufferId buffer, const MsgId &msgId) { REQUEST(ARG(buffer), ARG(msgId)) setMarkerLine(buffer, msgId); }
 
+    virtual inline void setBufferActivity(BufferId buffer, const int &activity) {
+        SYNC(ARG(buffer), ARG(activity));
+        _bufferActivities[buffer] = Message::Types(activity);
+    }
+
     virtual inline void requestRemoveBuffer(BufferId buffer) { REQUEST(ARG(buffer)) }
     virtual void removeBuffer(BufferId buffer);
 
 private:
     QHash<BufferId, MsgId> _lastSeenMsg;
     QHash<BufferId, MsgId> _markerLines;
+    QHash<BufferId, Message::Types> _bufferActivities;
 };
 
 
 
--- /dev/null
+SELECT bufferid, bufferactivity
+FROM buffer
+WHERE userid = :userid
\ No newline at end of file
 
--- /dev/null
+UPDATE buffer
+SET bufferactivity = :bufferactivity
+WHERE userid = :userid AND bufferid = :bufferid
\ No newline at end of file
 
 
 INIT_SYNCABLE_OBJECT(CoreBufferSyncer)
 CoreBufferSyncer::CoreBufferSyncer(CoreSession *parent)
-    : BufferSyncer(Core::bufferLastSeenMsgIds(parent->user()), Core::bufferMarkerLineMsgIds(parent->user()), parent),
+    : BufferSyncer(Core::bufferLastSeenMsgIds(parent->user()), Core::bufferMarkerLineMsgIds(parent->user()), Core::bufferActivities(parent->user()), parent),
     _coreSession(parent),
     _purgeBuffers(false)
 {
+    connect(parent, SIGNAL(displayMsg(Message)), SLOT(addBufferActivity(Message)));
 }
 
 
 void CoreBufferSyncer::requestSetLastSeenMsg(BufferId buffer, const MsgId &msgId)
 {
-    if (setLastSeenMsg(buffer, msgId))
+    if (setLastSeenMsg(buffer, msgId)) {
+        setBufferActivity(buffer, (int) Core::bufferActivity(buffer, msgId));
         dirtyLastSeenBuffers << buffer;
+    }
 }
 
 
             Core::setBufferMarkerLineMsg(userId, bufferId, msgId);
     }
 
+    foreach(BufferId bufferId, dirtyActivities) {
+        Core::setBufferActivity(userId, bufferId, activity(bufferId));
+    }
+
     dirtyLastSeenBuffers.clear();
     dirtyMarkerLineBuffers.clear();
+    dirtyActivities.clear();
 }
 
 
         }
     }
 }
+
+void CoreBufferSyncer::setBufferActivity(BufferId buffer, const int &activity) {
+    BufferSyncer::setBufferActivity(buffer, activity);
+    dirtyActivities << buffer;
+}
 
     virtual inline void requestRemoveBuffer(BufferId buffer) { removeBuffer(buffer); }
     virtual void removeBuffer(BufferId bufferId);
 
+    void addBufferActivity(Message message) {
+        auto oldActivity = activity(message.bufferId());
+        if (!oldActivity.testFlag(message.type())) {
+            setBufferActivity(message.bufferId(), (int) (oldActivity | message.type()));
+        }
+    }
+
+    void setBufferActivity(BufferId buffer, const int &activity) override;
+
     virtual inline void requestRenameBuffer(BufferId buffer, QString newName) { renameBuffer(buffer, newName); }
     virtual void renameBuffer(BufferId buffer, QString newName);
 
 
     virtual void requestPurgeBufferIds();
 
-    virtual inline void requestMarkBufferAsRead(BufferId buffer) { markBufferAsRead(buffer); }
+    virtual inline void requestMarkBufferAsRead(BufferId buffer) {
+        setLastSeenMsg(buffer, (int) Message::Types());
+        markBufferAsRead(buffer);
+    }
 
     void storeDirtyIds();
 
 
     QSet<BufferId> dirtyLastSeenBuffers;
     QSet<BufferId> dirtyMarkerLineBuffers;
+    QSet<BufferId> dirtyActivities;
 
     void purgeBufferIds();
 };
 
     return bufferActivityHash;
 }
 
-Message::Types PostgreSqlStorage::bufferActivity(BufferId &bufferId, MsgId &lastSeenMsgId)
+Message::Types PostgreSqlStorage::bufferActivity(BufferId &bufferId, const MsgId &lastSeenMsgId)
 {
     QSqlQuery query(logDb());
     query.prepare(queryString("select_buffer_bufferactivity"));
 
     virtual QHash<BufferId, MsgId> bufferMarkerLineMsgIds(UserId user);
     virtual void setBufferActivity(UserId id, const BufferId &bufferId, const Message::Types &type);
     virtual QHash<BufferId, Message::Types> bufferActivities(UserId id);
-    virtual Message::Types bufferActivity(BufferId &bufferId, MsgId &lastSeenMsgId);
+    virtual Message::Types bufferActivity(BufferId &bufferId, const MsgId &lastSeenMsgId);
 
     /* Message handling */
     virtual bool logMessage(Message &msg);
 
     <file>./SQL/SQLite/select_authuser.sql</file>
     <file>./SQL/SQLite/select_bufferByName.sql</file>
     <file>./SQL/SQLite/select_bufferExists.sql</file>
+    <file>./SQL/SQLite/select_buffer_bufferactivities.sql</file>
     <file>./SQL/SQLite/select_buffer_bufferactivity.sql</file>
     <file>./SQL/SQLite/select_buffer_by_id.sql</file>
     <file>./SQL/SQLite/select_buffer_lastseen_messages.sql</file>
     <file>./SQL/SQLite/setup_130_identity.sql</file>
     <file>./SQL/SQLite/setup_140_identity_nick.sql</file>
     <file>./SQL/SQLite/update_backlog_bufferid.sql</file>
+    <file>./SQL/SQLite/update_buffer_bufferactivity.sql</file>
     <file>./SQL/SQLite/update_buffer_lastseen.sql</file>
     <file>./SQL/SQLite/update_buffer_markerlinemsgid.sql</file>
     <file>./SQL/SQLite/update_buffer_name.sql</file>
 
 }
 
 
-Message::Types SqliteStorage::bufferActivity(BufferId &bufferId, MsgId &lastSeenMsgId)
+Message::Types SqliteStorage::bufferActivity(BufferId &bufferId, const MsgId &lastSeenMsgId)
 {
     QSqlDatabase db = logDb();
     db.transaction();
 
     virtual QHash<BufferId, MsgId> bufferMarkerLineMsgIds(UserId user);
     virtual void setBufferActivity(UserId id, const BufferId &bufferId, const Message::Types &type);
     virtual QHash<BufferId, Message::Types> bufferActivities(UserId id);
-    virtual Message::Types bufferActivity(BufferId &bufferId, MsgId &lastSeenMsgId);
+    virtual Message::Types bufferActivity(BufferId &bufferId, const MsgId &lastSeenMsgId);
 
     /* Message handling */
     virtual bool logMessage(Message &msg);
 
      * \param bufferId The buffer
      * \param lastSeenMsgId     The last seen message
      */
-    virtual Message::Types bufferActivity(BufferId &bufferId, MsgId &lastSeenMsgId) = 0;
+    virtual Message::Types bufferActivity(BufferId &bufferId, const MsgId &lastSeenMsgId) = 0;
 
     /* Message handling */