diff --git a/lib/shared/messages/add-members-message-spec.js b/lib/shared/messages/add-members-message-spec.js
--- a/lib/shared/messages/add-members-message-spec.js
+++ b/lib/shared/messages/add-members-message-spec.js
@@ -9,10 +9,11 @@
   MessageInfo,
   ClientDBMessageInfo,
 } from '../../types/message-types.js';
-import type {
-  AddMembersMessageData,
-  AddMembersMessageInfo,
-  RawAddMembersMessageInfo,
+import {
+  type AddMembersMessageData,
+  type AddMembersMessageInfo,
+  type RawAddMembersMessageInfo,
+  rawAddMembersMessageInfoValidator,
 } from '../../types/messages/add-members.js';
 import type { NotifTexts } from '../../types/notif-types.js';
 import type { ThreadInfo } from '../../types/thread-types.js';
@@ -156,4 +157,6 @@
   userIDs(rawMessageInfo: RawAddMembersMessageInfo): $ReadOnlyArray<string> {
     return rawMessageInfo.addedUserIDs;
   },
+
+  validator: rawAddMembersMessageInfoValidator,
 });
diff --git a/lib/shared/messages/change-role-message-spec.js b/lib/shared/messages/change-role-message-spec.js
--- a/lib/shared/messages/change-role-message-spec.js
+++ b/lib/shared/messages/change-role-message-spec.js
@@ -14,10 +14,11 @@
   MessageInfo,
   ClientDBMessageInfo,
 } from '../../types/message-types.js';
-import type {
-  ChangeRoleMessageData,
-  ChangeRoleMessageInfo,
-  RawChangeRoleMessageInfo,
+import {
+  type ChangeRoleMessageData,
+  type ChangeRoleMessageInfo,
+  type RawChangeRoleMessageInfo,
+  rawChangeRoleMessageInfoValidator,
 } from '../../types/messages/change-role.js';
 import type { NotifTexts } from '../../types/notif-types.js';
 import type { ThreadInfo } from '../../types/thread-types.js';
@@ -174,4 +175,6 @@
   },
 
   generatesNotifs: async () => pushTypes.NOTIF,
+
+  validator: rawChangeRoleMessageInfoValidator,
 });
diff --git a/lib/shared/messages/change-settings-message-spec.js b/lib/shared/messages/change-settings-message-spec.js
--- a/lib/shared/messages/change-settings-message-spec.js
+++ b/lib/shared/messages/change-settings-message-spec.js
@@ -13,10 +13,11 @@
   MessageInfo,
   ClientDBMessageInfo,
 } from '../../types/message-types.js';
-import type {
-  ChangeSettingsMessageData,
-  ChangeSettingsMessageInfo,
-  RawChangeSettingsMessageInfo,
+import {
+  type ChangeSettingsMessageData,
+  type ChangeSettingsMessageInfo,
+  type RawChangeSettingsMessageInfo,
+  rawChangeSettingsMessageInfoValidator,
 } from '../../types/messages/change-settings.js';
 import type { NotifTexts } from '../../types/notif-types.js';
 import { assertThreadType } from '../../types/thread-types.js';
@@ -173,4 +174,6 @@
   },
 
   generatesNotifs: async () => pushTypes.NOTIF,
+
+  validator: rawChangeSettingsMessageInfoValidator,
 });
diff --git a/lib/shared/messages/create-entry-message-spec.js b/lib/shared/messages/create-entry-message-spec.js
--- a/lib/shared/messages/create-entry-message-spec.js
+++ b/lib/shared/messages/create-entry-message-spec.js
@@ -9,10 +9,11 @@
   MessageInfo,
   ClientDBMessageInfo,
 } from '../../types/message-types.js';
-import type {
-  CreateEntryMessageData,
-  CreateEntryMessageInfo,
-  RawCreateEntryMessageInfo,
+import {
+  type CreateEntryMessageData,
+  type CreateEntryMessageInfo,
+  type RawCreateEntryMessageInfo,
+  rawCreateEntryMessageInfoValidator,
 } from '../../types/messages/create-entry.js';
 import type { NotifTexts } from '../../types/notif-types.js';
 import type { ThreadInfo } from '../../types/thread-types.js';
@@ -119,4 +120,6 @@
   },
 
   generatesNotifs: async () => pushTypes.NOTIF,
+
+  validator: rawCreateEntryMessageInfoValidator,
 });
diff --git a/lib/shared/messages/create-sidebar-message-spec.js b/lib/shared/messages/create-sidebar-message-spec.js
--- a/lib/shared/messages/create-sidebar-message-spec.js
+++ b/lib/shared/messages/create-sidebar-message-spec.js
@@ -16,10 +16,11 @@
   MessageInfo,
   ClientDBMessageInfo,
 } from '../../types/message-types.js';
-import type {
-  CreateSidebarMessageData,
-  CreateSidebarMessageInfo,
-  RawCreateSidebarMessageInfo,
+import {
+  type CreateSidebarMessageData,
+  type CreateSidebarMessageInfo,
+  type RawCreateSidebarMessageInfo,
+  rawCreateSidebarMessageInfoValidator,
 } from '../../types/messages/create-sidebar.js';
 import type { RawUnsupportedMessageInfo } from '../../types/messages/unsupported.js';
 import type { NotifTexts } from '../../types/notif-types.js';
@@ -227,4 +228,6 @@
     const { parentThreadID } = rawMessageInfo.initialThreadState;
     return [parentThreadID];
   },
+
+  validator: rawCreateSidebarMessageInfoValidator,
 });
diff --git a/lib/shared/messages/create-sub-thread-message-spec.js b/lib/shared/messages/create-sub-thread-message-spec.js
--- a/lib/shared/messages/create-sub-thread-message-spec.js
+++ b/lib/shared/messages/create-sub-thread-message-spec.js
@@ -15,10 +15,11 @@
   MessageInfo,
   ClientDBMessageInfo,
 } from '../../types/message-types.js';
-import type {
-  CreateSubthreadMessageData,
-  CreateSubthreadMessageInfo,
-  RawCreateSubthreadMessageInfo,
+import {
+  type CreateSubthreadMessageData,
+  type CreateSubthreadMessageInfo,
+  type RawCreateSubthreadMessageInfo,
+  rawCreateSubthreadMessageInfoValidator,
 } from '../../types/messages/create-subthread.js';
 import type { NotifTexts } from '../../types/notif-types.js';
 import { threadPermissions, threadTypes } from '../../types/thread-types.js';
@@ -160,4 +161,6 @@
   ): $ReadOnlyArray<string> {
     return [rawMessageInfo.childThreadID];
   },
+
+  validator: rawCreateSubthreadMessageInfoValidator,
 });
diff --git a/lib/shared/messages/create-thread-message-spec.js b/lib/shared/messages/create-thread-message-spec.js
--- a/lib/shared/messages/create-thread-message-spec.js
+++ b/lib/shared/messages/create-thread-message-spec.js
@@ -14,10 +14,11 @@
   MessageInfo,
   ClientDBMessageInfo,
 } from '../../types/message-types.js';
-import type {
-  CreateThreadMessageData,
-  CreateThreadMessageInfo,
-  RawCreateThreadMessageInfo,
+import {
+  type CreateThreadMessageData,
+  type CreateThreadMessageInfo,
+  type RawCreateThreadMessageInfo,
+  rawCreateThreadMessageInfoValidator,
 } from '../../types/messages/create-thread.js';
 import type { NotifTexts } from '../../types/notif-types.js';
 import type { ThreadInfo } from '../../types/thread-types.js';
@@ -200,4 +201,6 @@
     const { parentThreadID } = rawMessageInfo.initialThreadState;
     return parentThreadID ? [parentThreadID] : [];
   },
+
+  validator: rawCreateThreadMessageInfoValidator,
 });
diff --git a/lib/shared/messages/delete-entry-message-spec.js b/lib/shared/messages/delete-entry-message-spec.js
--- a/lib/shared/messages/delete-entry-message-spec.js
+++ b/lib/shared/messages/delete-entry-message-spec.js
@@ -9,10 +9,11 @@
   MessageInfo,
   ClientDBMessageInfo,
 } from '../../types/message-types.js';
-import type {
-  DeleteEntryMessageData,
-  DeleteEntryMessageInfo,
-  RawDeleteEntryMessageInfo,
+import {
+  type DeleteEntryMessageData,
+  type DeleteEntryMessageInfo,
+  type RawDeleteEntryMessageInfo,
+  rawDeleteEntryMessageInfoValidator,
 } from '../../types/messages/delete-entry.js';
 import type { NotifTexts } from '../../types/notif-types.js';
 import type { ThreadInfo } from '../../types/thread-types.js';
@@ -134,4 +135,6 @@
   },
 
   generatesNotifs: async () => pushTypes.NOTIF,
+
+  validator: rawDeleteEntryMessageInfoValidator,
 });
diff --git a/lib/shared/messages/edit-entry-message-spec.js b/lib/shared/messages/edit-entry-message-spec.js
--- a/lib/shared/messages/edit-entry-message-spec.js
+++ b/lib/shared/messages/edit-entry-message-spec.js
@@ -9,10 +9,11 @@
   MessageInfo,
   ClientDBMessageInfo,
 } from '../../types/message-types.js';
-import type {
-  EditEntryMessageData,
-  EditEntryMessageInfo,
-  RawEditEntryMessageInfo,
+import {
+  type EditEntryMessageData,
+  type EditEntryMessageInfo,
+  type RawEditEntryMessageInfo,
+  rawEditEntryMessageInfoValidator,
 } from '../../types/messages/edit-entry.js';
 import type { NotifTexts } from '../../types/notif-types.js';
 import type { ThreadInfo } from '../../types/thread-types.js';
@@ -119,4 +120,6 @@
   },
 
   generatesNotifs: async () => pushTypes.NOTIF,
+
+  validator: rawEditEntryMessageInfoValidator,
 });
diff --git a/lib/shared/messages/edit-message-spec.js b/lib/shared/messages/edit-message-spec.js
--- a/lib/shared/messages/edit-message-spec.js
+++ b/lib/shared/messages/edit-message-spec.js
@@ -9,10 +9,11 @@
   messageTypes,
 } from '../../types/message-types-enum.js';
 import { type ClientDBMessageInfo } from '../../types/message-types.js';
-import type {
-  EditMessageData,
-  RawEditMessageInfo,
-  EditMessageInfo,
+import {
+  type EditMessageData,
+  type RawEditMessageInfo,
+  type EditMessageInfo,
+  rawEditMessageInfoValidator,
 } from '../../types/messages/edit.js';
 import type { RawUnsupportedMessageInfo } from '../../types/messages/unsupported.js';
 import type { RelativeUserInfo } from '../../types/user-types.js';
@@ -140,4 +141,6 @@
   },
 
   generatesNotifs: async () => undefined,
+
+  validator: rawEditMessageInfoValidator,
 });
diff --git a/lib/shared/messages/join-thread-message-spec.js b/lib/shared/messages/join-thread-message-spec.js
--- a/lib/shared/messages/join-thread-message-spec.js
+++ b/lib/shared/messages/join-thread-message-spec.js
@@ -9,10 +9,11 @@
   MessageInfo,
   ClientDBMessageInfo,
 } from '../../types/message-types.js';
-import type {
-  JoinThreadMessageData,
-  JoinThreadMessageInfo,
-  RawJoinThreadMessageInfo,
+import {
+  type JoinThreadMessageData,
+  type JoinThreadMessageInfo,
+  type RawJoinThreadMessageInfo,
+  rawJoinThreadMessageInfoValidator,
 } from '../../types/messages/join-thread.js';
 import type { NotifTexts } from '../../types/notif-types.js';
 import type { ThreadInfo } from '../../types/thread-types.js';
@@ -119,4 +120,6 @@
   },
 
   generatesNotifs: async () => undefined,
+
+  validator: rawJoinThreadMessageInfoValidator,
 });
diff --git a/lib/shared/messages/leave-thread-message-spec.js b/lib/shared/messages/leave-thread-message-spec.js
--- a/lib/shared/messages/leave-thread-message-spec.js
+++ b/lib/shared/messages/leave-thread-message-spec.js
@@ -9,10 +9,11 @@
   MessageInfo,
   ClientDBMessageInfo,
 } from '../../types/message-types.js';
-import type {
-  LeaveThreadMessageData,
-  LeaveThreadMessageInfo,
-  RawLeaveThreadMessageInfo,
+import {
+  type LeaveThreadMessageData,
+  type LeaveThreadMessageInfo,
+  type RawLeaveThreadMessageInfo,
+  rawLeaveThreadMessageInfoValidator,
 } from '../../types/messages/leave-thread.js';
 import type { NotifTexts } from '../../types/notif-types.js';
 import type { ThreadInfo } from '../../types/thread-types.js';
@@ -119,4 +120,6 @@
   },
 
   generatesNotifs: async () => undefined,
+
+  validator: rawLeaveThreadMessageInfoValidator,
 });
diff --git a/lib/shared/messages/message-spec.js b/lib/shared/messages/message-spec.js
--- a/lib/shared/messages/message-spec.js
+++ b/lib/shared/messages/message-spec.js
@@ -1,5 +1,7 @@
 // @flow
 
+import type { TType } from 'tcomb';
+
 import type { PlatformDetails } from '../../types/device-types.js';
 import type { Media } from '../../types/media-types.js';
 import type {
@@ -114,4 +116,5 @@
   +threadIDs?: (rawMessageInfo: RawInfo) => $ReadOnlyArray<string>,
   +includedInRepliesCount?: boolean,
   +useCreationSideEffectsFunc?: () => CreationSideEffectsFunc<RawInfo>,
+  +validator: TType<RawInfo>,
 };
diff --git a/lib/shared/messages/multimedia-message-spec.js b/lib/shared/messages/multimedia-message-spec.js
--- a/lib/shared/messages/multimedia-message-spec.js
+++ b/lib/shared/messages/multimedia-message-spec.js
@@ -18,7 +18,10 @@
   assertMessageType,
   messageTypes,
 } from '../../types/message-types-enum.js';
-import { isMediaMessageType } from '../../types/message-types.js';
+import {
+  isMediaMessageType,
+  rawMultimediaMessageInfoValidator,
+} from '../../types/message-types.js';
 import type {
   MessageInfo,
   RawMessageInfo,
@@ -323,6 +326,8 @@
   ) => (messageData.sidebarCreation ? undefined : pushTypes.NOTIF),
 
   includedInRepliesCount: true,
+
+  validator: rawMultimediaMessageInfoValidator,
 });
 
 // Four photos were uploaded before dimensions were calculated server-side,
diff --git a/lib/shared/messages/reaction-message-spec.js b/lib/shared/messages/reaction-message-spec.js
--- a/lib/shared/messages/reaction-message-spec.js
+++ b/lib/shared/messages/reaction-message-spec.js
@@ -18,10 +18,11 @@
   type MessageInfo,
   type ClientDBMessageInfo,
 } from '../../types/message-types.js';
-import type {
-  ReactionMessageData,
-  RawReactionMessageInfo,
-  ReactionMessageInfo,
+import {
+  type ReactionMessageData,
+  type RawReactionMessageInfo,
+  type ReactionMessageInfo,
+  rawReactionMessageInfoValidator,
 } from '../../types/messages/reaction.js';
 import type { RawUnsupportedMessageInfo } from '../../types/messages/unsupported.js';
 import type { NotifTexts } from '../../types/notif-types.js';
@@ -216,4 +217,6 @@
     }
     return action === 'add_reaction' ? pushTypes.NOTIF : pushTypes.RESCIND;
   },
+
+  validator: rawReactionMessageInfoValidator,
 });
diff --git a/lib/shared/messages/remove-members-message-spec.js b/lib/shared/messages/remove-members-message-spec.js
--- a/lib/shared/messages/remove-members-message-spec.js
+++ b/lib/shared/messages/remove-members-message-spec.js
@@ -9,10 +9,11 @@
   MessageInfo,
   ClientDBMessageInfo,
 } from '../../types/message-types.js';
-import type {
-  RawRemoveMembersMessageInfo,
-  RemoveMembersMessageData,
-  RemoveMembersMessageInfo,
+import {
+  type RawRemoveMembersMessageInfo,
+  type RemoveMembersMessageData,
+  type RemoveMembersMessageInfo,
+  rawRemoveMembersMessageInfoValidator,
 } from '../../types/messages/remove-members.js';
 import type { NotifTexts } from '../../types/notif-types.js';
 import type { ThreadInfo } from '../../types/thread-types.js';
@@ -156,4 +157,6 @@
   userIDs(rawMessageInfo: RawRemoveMembersMessageInfo): $ReadOnlyArray<string> {
     return rawMessageInfo.removedUserIDs;
   },
+
+  validator: rawRemoveMembersMessageInfoValidator,
 });
diff --git a/lib/shared/messages/restore-entry-message-spec.js b/lib/shared/messages/restore-entry-message-spec.js
--- a/lib/shared/messages/restore-entry-message-spec.js
+++ b/lib/shared/messages/restore-entry-message-spec.js
@@ -9,10 +9,11 @@
   MessageInfo,
   ClientDBMessageInfo,
 } from '../../types/message-types.js';
-import type {
-  RawRestoreEntryMessageInfo,
-  RestoreEntryMessageData,
-  RestoreEntryMessageInfo,
+import {
+  type RawRestoreEntryMessageInfo,
+  type RestoreEntryMessageData,
+  type RestoreEntryMessageInfo,
+  rawRestoreEntryMessageInfoValidator,
 } from '../../types/messages/restore-entry.js';
 import type { NotifTexts } from '../../types/notif-types.js';
 import type { ThreadInfo } from '../../types/thread-types.js';
@@ -134,4 +135,6 @@
   },
 
   generatesNotifs: async () => pushTypes.NOTIF,
+
+  validator: rawRestoreEntryMessageInfoValidator,
 });
diff --git a/lib/shared/messages/sidebar-source-message-spec.js b/lib/shared/messages/sidebar-source-message-spec.js
--- a/lib/shared/messages/sidebar-source-message-spec.js
+++ b/lib/shared/messages/sidebar-source-message-spec.js
@@ -17,6 +17,7 @@
   type SidebarSourceMessageInfo,
   type ClientDBMessageInfo,
   isMessageSidebarSourceReactionOrEdit,
+  rawSidebarSourceMessageInfoValidator,
 } from '../../types/message-types.js';
 import type { RawUnsupportedMessageInfo } from '../../types/messages/unsupported.js';
 import type { NotifTexts } from '../../types/notif-types.js';
@@ -173,4 +174,6 @@
   generatesNotifs: async () => pushTypes.NOTIF,
 
   startsThread: true,
+
+  validator: rawSidebarSourceMessageInfoValidator,
 });
diff --git a/lib/shared/messages/text-message-spec.js b/lib/shared/messages/text-message-spec.js
--- a/lib/shared/messages/text-message-spec.js
+++ b/lib/shared/messages/text-message-spec.js
@@ -19,10 +19,11 @@
   MessageInfo,
   ClientDBMessageInfo,
 } from '../../types/message-types.js';
-import type {
-  RawTextMessageInfo,
-  TextMessageData,
-  TextMessageInfo,
+import {
+  type RawTextMessageInfo,
+  type TextMessageData,
+  type TextMessageInfo,
+  rawTextMessageInfoValidator,
 } from '../../types/messages/text.js';
 import type { NotifTexts } from '../../types/notif-types.js';
 import { threadTypes } from '../../types/thread-types.js';
@@ -312,4 +313,6 @@
       await addMembersPromise;
     };
   },
+
+  validator: rawTextMessageInfoValidator,
 });
diff --git a/lib/shared/messages/toggle-pin-message-spec.js b/lib/shared/messages/toggle-pin-message-spec.js
--- a/lib/shared/messages/toggle-pin-message-spec.js
+++ b/lib/shared/messages/toggle-pin-message-spec.js
@@ -10,10 +10,11 @@
 import type { PlatformDetails } from '../../types/device-types';
 import { messageTypes } from '../../types/message-types-enum.js';
 import type { ClientDBMessageInfo } from '../../types/message-types.js';
-import type {
-  TogglePinMessageData,
-  TogglePinMessageInfo,
-  RawTogglePinMessageInfo,
+import {
+  type TogglePinMessageData,
+  type TogglePinMessageInfo,
+  type RawTogglePinMessageInfo,
+  rawTogglePinMessageInfoValidator,
 } from '../../types/messages/toggle-pin.js';
 import type { RawUnsupportedMessageInfo } from '../../types/messages/unsupported';
 import type { RelativeUserInfo } from '../../types/user-types.js';
@@ -155,4 +156,6 @@
   },
 
   generatesNotifs: async () => undefined,
+
+  validator: rawTogglePinMessageInfoValidator,
 });
diff --git a/lib/shared/messages/unsupported-message-spec.js b/lib/shared/messages/unsupported-message-spec.js
--- a/lib/shared/messages/unsupported-message-spec.js
+++ b/lib/shared/messages/unsupported-message-spec.js
@@ -5,9 +5,10 @@
 import { pushTypes, type MessageSpec } from './message-spec.js';
 import { messageTypes } from '../../types/message-types-enum.js';
 import { type ClientDBMessageInfo } from '../../types/message-types.js';
-import type {
-  RawUnsupportedMessageInfo,
-  UnsupportedMessageInfo,
+import {
+  type RawUnsupportedMessageInfo,
+  type UnsupportedMessageInfo,
+  rawUnsupportedMessageInfoValidator,
 } from '../../types/messages/unsupported.js';
 import type { RelativeUserInfo } from '../../types/user-types.js';
 import { ET, type EntityText } from '../../utils/entity-text.js';
@@ -72,4 +73,6 @@
   },
 
   generatesNotifs: async () => pushTypes.NOTIF,
+
+  validator: rawUnsupportedMessageInfoValidator,
 });
diff --git a/lib/shared/messages/update-relationship-message-spec.js b/lib/shared/messages/update-relationship-message-spec.js
--- a/lib/shared/messages/update-relationship-message-spec.js
+++ b/lib/shared/messages/update-relationship-message-spec.js
@@ -15,10 +15,11 @@
   ClientDBMessageInfo,
 } from '../../types/message-types.js';
 import type { RawUnsupportedMessageInfo } from '../../types/messages/unsupported.js';
-import type {
-  RawUpdateRelationshipMessageInfo,
-  UpdateRelationshipMessageData,
-  UpdateRelationshipMessageInfo,
+import {
+  type RawUpdateRelationshipMessageInfo,
+  type UpdateRelationshipMessageData,
+  type UpdateRelationshipMessageInfo,
+  rawUpdateRelationshipMessageInfoValidator,
 } from '../../types/messages/update-relationship.js';
 import type { NotifTexts } from '../../types/notif-types.js';
 import type { ThreadInfo } from '../../types/thread-types.js';
@@ -175,4 +176,6 @@
   },
 
   generatesNotifs: async () => pushTypes.NOTIF,
+
+  validator: rawUpdateRelationshipMessageInfoValidator,
 });
diff --git a/lib/types/message-types.js b/lib/types/message-types.js
--- a/lib/types/message-types.js
+++ b/lib/types/message-types.js
@@ -239,10 +239,8 @@
 export type RawMultimediaMessageInfo =
   | RawImagesMessageInfo
   | RawMediaMessageInfo;
-const rawMultimediaMessageInfoValidator = t.union([
-  rawImagesMessageInfoValidator,
-  rawMediaMessageInfoValidator,
-]);
+export const rawMultimediaMessageInfoValidator: TUnion<RawMultimediaMessageInfo> =
+  t.union([rawImagesMessageInfoValidator, rawMediaMessageInfoValidator]);
 
 export type RawComposableMessageInfo =
   | RawTextMessageInfo
diff --git a/lib/types/validation.test.js b/lib/types/validation.test.js
--- a/lib/types/validation.test.js
+++ b/lib/types/validation.test.js
@@ -8,28 +8,7 @@
   mediaValidator,
 } from './media-types.js';
 import { messageTypes } from './message-types-enum.js';
-import { rawSidebarSourceMessageInfoValidator } from './message-types.js';
-import { rawAddMembersMessageInfoValidator } from './messages/add-members.js';
-import { rawChangeRoleMessageInfoValidator } from './messages/change-role.js';
-import { rawChangeSettingsMessageInfoValidator } from './messages/change-settings.js';
-import { rawCreateEntryMessageInfoValidator } from './messages/create-entry.js';
-import { rawCreateSidebarMessageInfoValidator } from './messages/create-sidebar.js';
-import { rawCreateSubthreadMessageInfoValidator } from './messages/create-subthread.js';
-import { rawCreateThreadMessageInfoValidator } from './messages/create-thread.js';
-import { rawDeleteEntryMessageInfoValidator } from './messages/delete-entry.js';
-import { rawEditEntryMessageInfoValidator } from './messages/edit-entry.js';
-import { rawEditMessageInfoValidator } from './messages/edit.js';
-import { rawImagesMessageInfoValidator } from './messages/images.js';
-import { rawJoinThreadMessageInfoValidator } from './messages/join-thread.js';
-import { rawLeaveThreadMessageInfoValidator } from './messages/leave-thread.js';
-import { rawMediaMessageInfoValidator } from './messages/media.js';
-import { rawReactionMessageInfoValidator } from './messages/reaction.js';
-import { rawRemoveMembersMessageInfoValidator } from './messages/remove-members.js';
-import { rawRestoreEntryMessageInfoValidator } from './messages/restore-entry.js';
-import { rawTextMessageInfoValidator } from './messages/text.js';
-import { rawTogglePinMessageInfoValidator } from './messages/toggle-pin.js';
-import { rawUnsupportedMessageInfoValidator } from './messages/unsupported.js';
-import { rawUpdateRelationshipMessageInfoValidator } from './messages/update-relationship.js';
+import { messageSpecs } from '../shared/messages/message-specs.js';
 
 describe('media validation', () => {
   const photo = {
@@ -314,45 +293,25 @@
     },
   ];
 
-  const validatorByMessageType = {
-    '0': rawTextMessageInfoValidator,
-    '1': rawCreateThreadMessageInfoValidator,
-    '2': rawAddMembersMessageInfoValidator,
-    '3': rawCreateSubthreadMessageInfoValidator,
-    '4': rawChangeSettingsMessageInfoValidator,
-    '5': rawRemoveMembersMessageInfoValidator,
-    '6': rawChangeRoleMessageInfoValidator,
-    '7': rawLeaveThreadMessageInfoValidator,
-    '8': rawJoinThreadMessageInfoValidator,
-    '9': rawCreateEntryMessageInfoValidator,
-    '10': rawEditEntryMessageInfoValidator,
-    '11': rawDeleteEntryMessageInfoValidator,
-    '12': rawRestoreEntryMessageInfoValidator,
-    '13': rawUnsupportedMessageInfoValidator,
-    '14': rawImagesMessageInfoValidator,
-    '15': rawMediaMessageInfoValidator,
-    '16': rawUpdateRelationshipMessageInfoValidator,
-    '17': rawSidebarSourceMessageInfoValidator,
-    '18': rawCreateSidebarMessageInfoValidator,
-    '19': rawReactionMessageInfoValidator,
-    '20': rawEditMessageInfoValidator,
-    '21': rawTogglePinMessageInfoValidator,
-  };
-
-  for (const validatorMessageType in validatorByMessageType) {
-    const validator = validatorByMessageType[validatorMessageType];
-    const validatorMessageTypeName = _findKey(
-      e => e === Number(validatorMessageType),
-    )(messageTypes);
+  for (const validatorMessageTypeName in messageTypes) {
+    const validatorMessageType = messageTypes[validatorMessageTypeName];
+    const validator = messageSpecs[validatorMessageType].validator;
 
     for (const message of messages) {
       const messageTypeName = _findKey(e => e === message.type)(messageTypes);
 
-      if (Number(validatorMessageType) === message.type) {
+      if (validatorMessageType === message.type) {
         it(`${validatorMessageTypeName} should validate ${messageTypeName}`, () => {
           expect(validator.is(message)).toBe(true);
         });
-      } else {
+      } else if (
+        !(
+          (validatorMessageType === messageTypes.IMAGES &&
+            message.type === messageTypes.MULTIMEDIA) ||
+          (validatorMessageType === messageTypes.MULTIMEDIA &&
+            message.type === messageTypes.IMAGES)
+        )
+      ) {
         it(`${validatorMessageTypeName} shouldn't validate ${messageTypeName}`, () => {
           expect(validator.is(message)).toBe(false);
         });