diff --git a/lib/shared/dm-ops/process-dm-ops.js b/lib/shared/dm-ops/process-dm-ops.js
--- a/lib/shared/dm-ops/process-dm-ops.js
+++ b/lib/shared/dm-ops/process-dm-ops.js
@@ -1,5 +1,6 @@
 // @flow
 
+import invariant from 'invariant';
 import _groupBy from 'lodash/fp/groupBy.js';
 import * as React from 'react';
 import uuid from 'uuid';
@@ -31,7 +32,6 @@
 import type { RawThreadInfo } from '../../types/minimally-encoded-thread-permissions-types.js';
 import type { DispatchMetadata } from '../../types/redux-types.js';
 import type { OutboundP2PMessage } from '../../types/sqlite-types.js';
-import { threadTypes } from '../../types/thread-types-enum.js';
 import type { LegacyRawThreadInfo } from '../../types/thread-types.js';
 import { updateTypes } from '../../types/update-types-enum.js';
 import { extractUserIDsFromPayload } from '../../utils/conversion-utils.js';
@@ -194,10 +194,7 @@
         const updatedThreadInfo = updateSpecs[
           update.type
         ].getUpdatedThreadInfo?.(update, updatedThreadInfosByThreadID);
-        if (
-          updatedThreadInfo &&
-          updatedThreadInfo?.type === threadTypes.THICK_SIDEBAR
-        ) {
+        if (updatedThreadInfo) {
           updatedThreadInfosByThreadID[updatedThreadInfo.id] =
             updatedThreadInfo;
         }
@@ -207,8 +204,10 @@
         const repliesCountIncreasingMessages = messagesByThreadID[
           threadID
         ].filter(message => messageSpecs[message.type].includedInRepliesCount);
+
+        const threadInfo = updatedThreadInfosByThreadID[threadID];
+
         if (repliesCountIncreasingMessages.length > 0) {
-          const threadInfo = updatedThreadInfosByThreadID[threadID];
           const repliesCountIncreaseTime = Math.max(
             repliesCountIncreasingMessages.map(message => message.time),
           );
@@ -230,17 +229,52 @@
         if (messagesFromOtherPeers.length === 0) {
           continue;
         }
-        // We take the most recent timestamp to make sure that updates older
+        // We take the most recent timestamp to make sure that
+        // change_thread_read_status operation older
         // than it won't flip the status to read.
         const time = Math.max(
           messagesFromOtherPeers.map(message => message.time),
         );
+        invariant(threadInfo.thick, 'Thread should be thick');
+
+        // We aren't checking if the unread timestamp is lower than the time.
+        // We're doing this because we want to flip the thread to unread after
+        // any new message from a non-viewer.
+        const updatedThreadInfo = threadInfo.minimallyEncoded
+          ? {
+              ...threadInfo,
+              currentUser: {
+                ...threadInfo.currentUser,
+                unread: true,
+              },
+              timestamps: {
+                ...threadInfo.timestamps,
+                currentUser: {
+                  ...threadInfo.timestamps.currentUser,
+                  unread: time,
+                },
+              },
+            }
+          : {
+              ...threadInfo,
+              currentUser: {
+                ...threadInfo.currentUser,
+                unread: true,
+              },
+              timestamps: {
+                ...threadInfo.timestamps,
+                currentUser: {
+                  ...threadInfo.timestamps.currentUser,
+                  unread: time,
+                },
+              },
+            };
+
         updateInfos.push({
-          type: updateTypes.UPDATE_THREAD_READ_STATUS,
+          type: updateTypes.UPDATE_THREAD,
           id: uuid.v4(),
           time,
-          threadID,
-          unread: true,
+          threadInfo: updatedThreadInfo,
         });
       }