This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git


The following commit(s) were added to refs/heads/master by this push:
     new 18bfae3  JAMES-3516 Allow setting threadId through 
MessageFactory::createMessage params (#514)
18bfae3 is described below

commit 18bfae3f347fa305fc099513130c3efc032de493
Author: Trần Hồng Quân <[email protected]>
AuthorDate: Fri Jul 2 08:59:47 2021 +0700

    JAMES-3516 Allow setting threadId through MessageFactory::createMessage 
params (#514)
    
    Add threadId property to SimpleMailboxMessage
---
 .../mailbox/backup/MailboxMessageFixture.java      |  4 +++
 .../cassandra/mail/CassandraMessageMetadata.java   |  1 +
 .../cassandra/mail/MessageRepresentation.java      |  1 +
 .../cassandra/mail/CassandraMessageDAOTest.java    | 17 +++++-----
 .../cassandra/mail/CassandraMessageDAOV3Test.java  | 17 +++++-----
 .../mail/migration/MessageV3MigrationTest.java     |  6 ++--
 ...asticSearchListeningMessageSearchIndexTest.java |  7 +++--
 .../v7/json/MessageToElasticSearchJsonTest.java    | 19 ++++++++++--
 .../mailbox/jpa/openjpa/OpenJPAMessageFactory.java |  3 +-
 .../james/mailbox/jpa/mail/MessageUtilsTest.java   |  4 ++-
 .../spamassassin/SpamAssassinListenerTest.java     |  4 ++-
 .../apache/james/mailbox/store/MessageFactory.java |  7 +++--
 .../apache/james/mailbox/store/MessageStorer.java  |  7 +++--
 .../mail/model/impl/SimpleMailboxMessage.java      | 27 +++++++++++++---
 .../apache/james/mailbox/store/MessageBuilder.java |  4 ++-
 .../mailbox/store/MessageIdManagerTestSystem.java  |  8 +++--
 .../StoreMailboxMessageResultIteratorTest.java     |  3 +-
 .../store/mail/model/ListMessageAssertTest.java    | 20 ++++++------
 .../store/mail/model/MailboxMessageAssertTest.java | 14 +++++----
 .../store/mail/model/MessageIdMapperTest.java      |  6 +++-
 .../store/mail/model/MessageMapperTest.java        |  3 +-
 .../mailbox/store/mail/model/MessageMoveTest.java  |  3 +-
 .../model/MessageWithAttachmentMapperTest.java     | 19 +++++++-----
 .../store/mail/model/MetadataMapAssertTest.java    |  3 +-
 .../mail/model/impl/SimpleMailboxMessageTest.java  | 36 ++++++++++++++++++++--
 .../mail/utils/ApplicableFlagCalculatorTest.java   |  3 +-
 .../ListeningMessageSearchIndexContract.java       |  3 ++
 .../james/webadmin/routes/MailboxesRoutesTest.java |  3 ++
 .../webadmin/routes/UserMailboxesRoutesTest.java   |  2 ++
 29 files changed, 184 insertions(+), 70 deletions(-)

diff --git 
a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/MailboxMessageFixture.java
 
b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/MailboxMessageFixture.java
index a05cbe0..b3c5bd2 100644
--- 
a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/MailboxMessageFixture.java
+++ 
b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/MailboxMessageFixture.java
@@ -40,6 +40,7 @@ import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.TestId;
 import org.apache.james.mailbox.model.TestMessageId;
+import org.apache.james.mailbox.model.ThreadId;
 import org.apache.james.mailbox.model.UidValidity;
 import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;
@@ -124,6 +125,7 @@ public interface MailboxMessageFixture {
 
     SimpleMailboxMessage MESSAGE_1 = SimpleMailboxMessage.builder()
         .messageId(MESSAGE_ID_1)
+        .threadId(ThreadId.fromBaseMessageId(MESSAGE_ID_1))
         .uid(MESSAGE_UID_1)
         .content(CONTENT_STREAM_1)
         .size(SIZE_1)
@@ -136,6 +138,7 @@ public interface MailboxMessageFixture {
 
     SimpleMailboxMessage MESSAGE_1_OTHER_USER = SimpleMailboxMessage.builder()
         .messageId(MESSAGE_ID_OTHER_USER_1)
+        .threadId(ThreadId.fromBaseMessageId(MESSAGE_ID_OTHER_USER_1))
         .uid(MESSAGE_UID_OTHER_USER_1)
         .content(CONTENT_STREAM_1)
         .size(SIZE_1)
@@ -148,6 +151,7 @@ public interface MailboxMessageFixture {
 
     SimpleMailboxMessage MESSAGE_2 = SimpleMailboxMessage.builder()
         .messageId(MESSAGE_ID_2)
+        .threadId(ThreadId.fromBaseMessageId(MESSAGE_ID_2))
         .uid(MESSAGE_UID_2)
         .content(CONTENT_STREAM_2)
         .size(SIZE_2)
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMetadata.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMetadata.java
index e41e39c..02cd6a5 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMetadata.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMetadata.java
@@ -329,6 +329,7 @@ public class CassandraMessageMetadata {
             SimpleMailboxMessage.builder()
                 
.mailboxId(composedMessageId.getComposedMessageId().getMailboxId())
                 
.messageId(composedMessageId.getComposedMessageId().getMessageId())
+                .threadId(composedMessageId.getThreadId())
                 .uid(composedMessageId.getComposedMessageId().getUid())
                 .modseq(composedMessageId.getModSeq())
                 .flags(composedMessageId.getFlags())
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/MessageRepresentation.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/MessageRepresentation.java
index b0d528a..39cada4 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/MessageRepresentation.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/MessageRepresentation.java
@@ -57,6 +57,7 @@ public class MessageRepresentation {
     public SimpleMailboxMessage toMailboxMessage(ComposedMessageIdWithMetaData 
metadata, List<MessageAttachmentMetadata> attachments) {
         return SimpleMailboxMessage.builder()
             .messageId(messageId)
+            .threadId(metadata.getThreadId())
             .mailboxId(metadata.getComposedMessageId().getMailboxId())
             .uid(metadata.getComposedMessageId().getUid())
             .modseq(metadata.getModSeq())
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java
index b80822e..58a60bb 100644
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java
+++ 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java
@@ -82,12 +82,14 @@ class CassandraMessageDAOTest {
 
     private SimpleMailboxMessage message;
     private CassandraMessageId messageId;
+    private ThreadId threadId;
     private ComposedMessageIdWithMetaData messageIdWithMetadata;
 
     @BeforeEach
     void setUp(CassandraCluster cassandra) {
         messageIdFactory = new CassandraMessageId.Factory();
         messageId = messageIdFactory.generate();
+        threadId = ThreadId.fromBaseMessageId(messageId);
         BlobStore blobStore = 
CassandraBlobStoreFactory.forTesting(cassandra.getConf(), new 
RecordingMetricFactory())
             .passthrough();
         HashBlobId.Factory blobIdFactory = new HashBlobId.Factory();
@@ -103,13 +105,13 @@ class CassandraMessageDAOTest {
                 .composedMessageId(new ComposedMessageId(MAILBOX_ID, 
messageId, messageUid))
                 .flags(new Flags())
                 .modSeq(ModSeq.of(1))
-                .threadId(ThreadId.fromBaseMessageId(messageId))
+                .threadId(threadId)
                 .build();
     }
 
     @Test
     void saveShouldSaveNullValueForTextualLineCountAsZero() throws Exception {
-        message = createMessage(messageId, CONTENT, BODY_START, new 
PropertyBuilder(), NO_ATTACHMENT);
+        message = createMessage(messageId, threadId, CONTENT, BODY_START, new 
PropertyBuilder(), NO_ATTACHMENT);
 
         testee.save(message).block();
 
@@ -125,7 +127,7 @@ class CassandraMessageDAOTest {
         long textualLineCount = 10L;
         PropertyBuilder propertyBuilder = new PropertyBuilder();
         propertyBuilder.setTextualLineCount(textualLineCount);
-        message = createMessage(messageId, CONTENT, BODY_START, 
propertyBuilder, NO_ATTACHMENT);
+        message = createMessage(messageId, threadId, CONTENT, BODY_START, 
propertyBuilder, NO_ATTACHMENT);
 
         testee.save(message).block();
 
@@ -137,7 +139,7 @@ class CassandraMessageDAOTest {
 
     @Test
     void saveShouldStoreMessageWithFullContent() throws Exception {
-        message = createMessage(messageId, CONTENT, BODY_START, new 
PropertyBuilder(), NO_ATTACHMENT);
+        message = createMessage(messageId, threadId, CONTENT, BODY_START, new 
PropertyBuilder(), NO_ATTACHMENT);
 
         testee.save(message).block();
 
@@ -150,7 +152,7 @@ class CassandraMessageDAOTest {
 
     @Test
     void saveShouldStoreMessageWithBodyContent() throws Exception {
-        message = createMessage(messageId, CONTENT, BODY_START, new 
PropertyBuilder(), NO_ATTACHMENT);
+        message = createMessage(messageId, threadId, CONTENT, BODY_START, new 
PropertyBuilder(), NO_ATTACHMENT);
 
         testee.save(message).block();
 
@@ -166,7 +168,7 @@ class CassandraMessageDAOTest {
 
     @Test
     void saveShouldStoreMessageWithHeaderContent() throws Exception {
-        message = createMessage(messageId, CONTENT, BODY_START, new 
PropertyBuilder(), NO_ATTACHMENT);
+        message = createMessage(messageId, threadId, CONTENT, BODY_START, new 
PropertyBuilder(), NO_ATTACHMENT);
 
         testee.save(message).block();
 
@@ -177,9 +179,10 @@ class CassandraMessageDAOTest {
             .isEqualTo(CONTENT.substring(0, BODY_START));
     }
 
-    private SimpleMailboxMessage createMessage(MessageId messageId, String 
content, int bodyStart, PropertyBuilder propertyBuilder, 
Collection<MessageAttachmentMetadata> attachments) {
+    private SimpleMailboxMessage createMessage(MessageId messageId, ThreadId 
threadId, String content, int bodyStart, PropertyBuilder propertyBuilder, 
Collection<MessageAttachmentMetadata> attachments) {
         return SimpleMailboxMessage.builder()
             .messageId(messageId)
+            .threadId(threadId)
             .mailboxId(MAILBOX_ID)
             .uid(messageUid)
             .internalDate(new Date())
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV3Test.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV3Test.java
index 21c9f5a..252616a 100644
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV3Test.java
+++ 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV3Test.java
@@ -81,12 +81,14 @@ class CassandraMessageDAOV3Test {
 
     private SimpleMailboxMessage message;
     private CassandraMessageId messageId;
+    private ThreadId threadId;
     private ComposedMessageIdWithMetaData messageIdWithMetadata;
 
     @BeforeEach
     void setUp(CassandraCluster cassandra) {
         CassandraMessageId.Factory messageIdFactory = new 
CassandraMessageId.Factory();
         messageId = messageIdFactory.generate();
+        threadId = ThreadId.fromBaseMessageId(messageId);
         BlobStore blobStore = 
CassandraBlobStoreFactory.forTesting(cassandra.getConf(), new 
RecordingMetricFactory())
             .passthrough();
         HashBlobId.Factory blobIdFactory = new HashBlobId.Factory();
@@ -101,13 +103,13 @@ class CassandraMessageDAOV3Test {
                 .composedMessageId(new ComposedMessageId(MAILBOX_ID, 
messageId, messageUid))
                 .flags(new Flags())
                 .modSeq(ModSeq.of(1))
-                .threadId(ThreadId.fromBaseMessageId(messageId))
+                .threadId(threadId)
                 .build();
     }
 
     @Test
     void saveShouldSaveNullValueForTextualLineCountAsZero() throws Exception {
-        message = createMessage(messageId, CONTENT, BODY_START, new 
PropertyBuilder(), NO_ATTACHMENT);
+        message = createMessage(messageId, threadId, CONTENT, BODY_START, new 
PropertyBuilder(), NO_ATTACHMENT);
 
         testee.save(message).block();
 
@@ -123,7 +125,7 @@ class CassandraMessageDAOV3Test {
         long textualLineCount = 10L;
         PropertyBuilder propertyBuilder = new PropertyBuilder();
         propertyBuilder.setTextualLineCount(textualLineCount);
-        message = createMessage(messageId, CONTENT, BODY_START, 
propertyBuilder, NO_ATTACHMENT);
+        message = createMessage(messageId, threadId, CONTENT, BODY_START, 
propertyBuilder, NO_ATTACHMENT);
 
         testee.save(message).block();
 
@@ -135,7 +137,7 @@ class CassandraMessageDAOV3Test {
 
     @Test
     void saveShouldStoreMessageWithFullContent() throws Exception {
-        message = createMessage(messageId, CONTENT, BODY_START, new 
PropertyBuilder(), NO_ATTACHMENT);
+        message = createMessage(messageId, threadId, CONTENT, BODY_START, new 
PropertyBuilder(), NO_ATTACHMENT);
 
         testee.save(message).block();
 
@@ -148,7 +150,7 @@ class CassandraMessageDAOV3Test {
 
     @Test
     void saveShouldStoreMessageWithBodyContent() throws Exception {
-        message = createMessage(messageId, CONTENT, BODY_START, new 
PropertyBuilder(), NO_ATTACHMENT);
+        message = createMessage(messageId, threadId, CONTENT, BODY_START, new 
PropertyBuilder(), NO_ATTACHMENT);
 
         testee.save(message).block();
 
@@ -164,7 +166,7 @@ class CassandraMessageDAOV3Test {
 
     @Test
     void saveShouldStoreMessageWithHeaderContent() throws Exception {
-        message = createMessage(messageId, CONTENT, BODY_START, new 
PropertyBuilder(), NO_ATTACHMENT);
+        message = createMessage(messageId, threadId,  CONTENT, BODY_START, new 
PropertyBuilder(), NO_ATTACHMENT);
 
         testee.save(message).block();
 
@@ -175,9 +177,10 @@ class CassandraMessageDAOV3Test {
             .isEqualTo(CONTENT.substring(0, BODY_START));
     }
 
-    private SimpleMailboxMessage createMessage(MessageId messageId, String 
content, int bodyStart, PropertyBuilder propertyBuilder, 
Collection<MessageAttachmentMetadata> attachments) {
+    private SimpleMailboxMessage createMessage(MessageId messageId, ThreadId 
threadId, String content, int bodyStart, PropertyBuilder propertyBuilder, 
Collection<MessageAttachmentMetadata> attachments) {
         return SimpleMailboxMessage.builder()
             .messageId(messageId)
+            .threadId(threadId)
             .mailboxId(MAILBOX_ID)
             .uid(messageUid)
             .internalDate(new Date())
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/MessageV3MigrationTest.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/MessageV3MigrationTest.java
index efd5cda..6ccd260 100644
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/MessageV3MigrationTest.java
+++ 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/MessageV3MigrationTest.java
@@ -45,6 +45,7 @@ import 
org.apache.james.mailbox.cassandra.modules.CassandraMessageModule;
 import org.apache.james.mailbox.model.ByteContent;
 import org.apache.james.mailbox.model.MessageAttachmentMetadata;
 import org.apache.james.mailbox.model.MessageId;
+import org.apache.james.mailbox.model.ThreadId;
 import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;
@@ -97,7 +98,7 @@ class MessageV3MigrationTest {
     }
 
     @Test
-    void migrationTaskShouldMoveDataToMostRecentDao() throws Exception{
+    void migrationTaskShouldMoveDataToMostRecentDao() throws Exception {
         SimpleMailboxMessage message1 = 
createMessage(messageIdFactory.generate());
         SimpleMailboxMessage message2 = 
createMessage(messageIdFactory.generate());
         SimpleMailboxMessage message3 = 
createMessage(messageIdFactory.generate());
@@ -125,7 +126,7 @@ class MessageV3MigrationTest {
     }
 
     @Test
-    void migrationTaskShouldPreserveMessageContent() throws Exception{
+    void migrationTaskShouldPreserveMessageContent() throws Exception {
         SimpleMailboxMessage message1 = 
createMessage(messageIdFactory.generate());
         daoV2.save(message1).block();
         MessageRepresentation original = 
daoV2.retrieveMessage((CassandraMessageId) message1.getMessageId(), 
MessageMapper.FetchType.Metadata).block();
@@ -142,6 +143,7 @@ class MessageV3MigrationTest {
     private SimpleMailboxMessage createMessage(MessageId messageId) {
         return SimpleMailboxMessage.builder()
             .messageId(messageId)
+            .threadId(ThreadId.fromBaseMessageId(messageId))
             .mailboxId(MAILBOX_ID)
             .uid(messageUid)
             .internalDate(new Date())
diff --git 
a/mailbox/elasticsearch-v7/src/test/java/org/apache/james/mailbox/elasticsearch/v7/events/ElasticSearchListeningMessageSearchIndexTest.java
 
b/mailbox/elasticsearch-v7/src/test/java/org/apache/james/mailbox/elasticsearch/v7/events/ElasticSearchListeningMessageSearchIndexTest.java
index b4232bf..4996c4b 100644
--- 
a/mailbox/elasticsearch-v7/src/test/java/org/apache/james/mailbox/elasticsearch/v7/events/ElasticSearchListeningMessageSearchIndexTest.java
+++ 
b/mailbox/elasticsearch-v7/src/test/java/org/apache/james/mailbox/elasticsearch/v7/events/ElasticSearchListeningMessageSearchIndexTest.java
@@ -30,7 +30,6 @@ import java.time.ZoneId;
 import java.util.Date;
 
 import javax.mail.Flags;
-import javax.mail.util.SharedByteArrayInputStream;
 
 import org.apache.james.backends.es.v7.DockerElasticSearchExtension;
 import org.apache.james.backends.es.v7.ElasticSearchIndexer;
@@ -50,7 +49,6 @@ import 
org.apache.james.mailbox.elasticsearch.v7.json.MessageToElasticSearchJson
 import org.apache.james.mailbox.elasticsearch.v7.query.CriterionConverter;
 import org.apache.james.mailbox.elasticsearch.v7.query.QueryConverter;
 import org.apache.james.mailbox.elasticsearch.v7.search.ElasticSearchSearcher;
-import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.extractor.ParsedContent;
 import org.apache.james.mailbox.extractor.TextExtractor;
 import org.apache.james.mailbox.inmemory.InMemoryId;
@@ -68,6 +66,7 @@ import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.SearchQuery;
 import org.apache.james.mailbox.model.TestId;
 import org.apache.james.mailbox.model.TestMessageId;
+import org.apache.james.mailbox.model.ThreadId;
 import org.apache.james.mailbox.model.UidValidity;
 import org.apache.james.mailbox.model.UpdatedFlags;
 import org.apache.james.mailbox.store.FakeAuthenticator;
@@ -88,7 +87,6 @@ import org.elasticsearch.index.query.QueryBuilder;
 import org.elasticsearch.index.query.QueryBuilders;
 import org.elasticsearch.search.builder.SearchSourceBuilder;
 import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
@@ -127,10 +125,12 @@ class ElasticSearchListeningMessageSearchIndexTest {
         .modseq(MOD_SEQ);
 
     static final SimpleMailboxMessage MESSAGE_1 = 
MESSAGE_BUILDER.messageId(MESSAGE_ID_1)
+        .threadId(ThreadId.fromBaseMessageId(MESSAGE_ID_1))
         .uid(MESSAGE_UID_1)
         .build();
 
     static final SimpleMailboxMessage MESSAGE_2 = 
MESSAGE_BUILDER.messageId(MESSAGE_ID_2)
+        .threadId(ThreadId.fromBaseMessageId(MESSAGE_ID_2))
         .uid(MESSAGE_UID_2)
         .build();
 
@@ -145,6 +145,7 @@ class ElasticSearchListeningMessageSearchIndexTest {
         .build();
 
     static final SimpleMailboxMessage MESSAGE_WITH_ATTACHMENT = 
MESSAGE_BUILDER.messageId(MESSAGE_ID_3)
+        .threadId(ThreadId.fromBaseMessageId(MESSAGE_ID_3))
         .uid(MESSAGE_UID_3)
         .addAttachments(ImmutableList.of(MESSAGE_ATTACHMENT))
         .build();
diff --git 
a/mailbox/elasticsearch-v7/src/test/java/org/apache/james/mailbox/elasticsearch/v7/json/MessageToElasticSearchJsonTest.java
 
b/mailbox/elasticsearch-v7/src/test/java/org/apache/james/mailbox/elasticsearch/v7/json/MessageToElasticSearchJsonTest.java
index 2f2d210..cd7e573 100644
--- 
a/mailbox/elasticsearch-v7/src/test/java/org/apache/james/mailbox/elasticsearch/v7/json/MessageToElasticSearchJsonTest.java
+++ 
b/mailbox/elasticsearch-v7/src/test/java/org/apache/james/mailbox/elasticsearch/v7/json/MessageToElasticSearchJsonTest.java
@@ -42,6 +42,7 @@ import org.apache.james.mailbox.model.ByteContent;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.TestId;
 import org.apache.james.mailbox.model.TestMessageId;
+import org.apache.james.mailbox.model.ThreadId;
 import org.apache.james.mailbox.store.extractor.DefaultTextExtractor;
 import org.apache.james.mailbox.store.extractor.JsoupTextExtractor;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
@@ -64,6 +65,7 @@ class MessageToElasticSearchJsonTest {
     static final int BODY_START_OCTET = 100;
     static final TestId MAILBOX_ID = TestId.of(18L);
     static final MessageId MESSAGE_ID = TestMessageId.of(184L);
+    static final ThreadId THREAD_ID = ThreadId.fromBaseMessageId(MESSAGE_ID);
     static final ModSeq MOD_SEQ = ModSeq.of(42L);
     static final MessageUid UID = MessageUid.of(25);
     static final Username USERNAME = Username.of("username");
@@ -97,6 +99,7 @@ class MessageToElasticSearchJsonTest {
             new DefaultTextExtractor(),
             ZoneId.of("Europe/Paris"), IndexAttachments.YES);
         MailboxMessage spamMail = new SimpleMailboxMessage(MESSAGE_ID,
+                THREAD_ID,
                 date,
                 SIZE,
                 BODY_START_OCTET,
@@ -117,6 +120,7 @@ class MessageToElasticSearchJsonTest {
             new DefaultTextExtractor(),
             ZoneId.of("Europe/Paris"), IndexAttachments.YES);
         MailboxMessage spamMail = new SimpleMailboxMessage(MESSAGE_ID,
+                THREAD_ID,
                 date,
                 SIZE,
                 BODY_START_OCTET,
@@ -139,6 +143,7 @@ class MessageToElasticSearchJsonTest {
             new DefaultTextExtractor(),
             ZoneId.of("Europe/Paris"), IndexAttachments.YES);
         MailboxMessage htmlMail = new SimpleMailboxMessage(MESSAGE_ID,
+                THREAD_ID,
                 date,
                 SIZE,
                 BODY_START_OCTET,
@@ -159,6 +164,7 @@ class MessageToElasticSearchJsonTest {
             new DefaultTextExtractor(),
             ZoneId.of("Europe/Paris"), IndexAttachments.YES);
         MailboxMessage pgpSignedMail = new SimpleMailboxMessage(MESSAGE_ID,
+                THREAD_ID,
                 date,
                 SIZE,
                 BODY_START_OCTET,
@@ -179,6 +185,7 @@ class MessageToElasticSearchJsonTest {
             new DefaultTextExtractor(),
             ZoneId.of("Europe/Paris"), IndexAttachments.YES);
         MailboxMessage mail = new SimpleMailboxMessage(MESSAGE_ID,
+                THREAD_ID,
                 date,
                 SIZE,
                 BODY_START_OCTET,
@@ -199,7 +206,8 @@ class MessageToElasticSearchJsonTest {
         MessageToElasticSearchJson messageToElasticSearchJson = new 
MessageToElasticSearchJson(
             new DefaultTextExtractor(),
             ZoneId.of("Europe/Paris"), IndexAttachments.YES);
-        MailboxMessage recursiveMail = new SimpleMailboxMessage(MESSAGE_ID, 
+        MailboxMessage recursiveMail = new SimpleMailboxMessage(MESSAGE_ID,
+                THREAD_ID,
                 date,
                 SIZE,
                 BODY_START_OCTET,
@@ -220,6 +228,7 @@ class MessageToElasticSearchJsonTest {
             new DefaultTextExtractor(),
             ZoneId.of("Europe/Paris"), IndexAttachments.YES);
         MailboxMessage mailWithNoInternalDate = new 
SimpleMailboxMessage(MESSAGE_ID,
+                THREAD_ID,
                 null,
                 SIZE,
                 BODY_START_OCTET,
@@ -239,6 +248,7 @@ class MessageToElasticSearchJsonTest {
     void 
emailWithAttachmentsShouldConvertAttachmentsWhenIndexAttachmentsIsTrue() throws 
IOException {
         // Given
         MailboxMessage mailWithNoInternalDate = new 
SimpleMailboxMessage(MESSAGE_ID,
+                THREAD_ID,
                 null,
                 SIZE,
                 BODY_START_OCTET,
@@ -267,6 +277,7 @@ class MessageToElasticSearchJsonTest {
     void 
emailWithAttachmentsShouldNotConvertAttachmentsWhenIndexAttachmentsIsFalse() 
throws IOException {
         // Given
         MailboxMessage mailWithNoInternalDate = new 
SimpleMailboxMessage(MESSAGE_ID,
+                THREAD_ID,
                 null,
                 SIZE,
                 BODY_START_OCTET,
@@ -296,7 +307,7 @@ class MessageToElasticSearchJsonTest {
         MessageToElasticSearchJson messageToElasticSearchJson = new 
MessageToElasticSearchJson(
             new DefaultTextExtractor(),
             ZoneId.of("Europe/Paris"), IndexAttachments.YES);
-        MailboxMessage mailWithNoMailboxId = new 
SimpleMailboxMessage(MESSAGE_ID, date,
+        MailboxMessage mailWithNoMailboxId = new 
SimpleMailboxMessage(MESSAGE_ID, THREAD_ID, date,
             SIZE,
             BODY_START_OCTET,
             new 
ByteContent(IOUtils.toByteArray(ClassLoaderUtils.getSystemResourceAsSharedStream("eml/recursiveMail.eml"))),
@@ -348,7 +359,7 @@ class MessageToElasticSearchJsonTest {
             textExtractor,
             ZoneId.of("Europe/Paris"),
             IndexAttachments.YES);
-        MailboxMessage spamMail = new SimpleMailboxMessage(MESSAGE_ID, date,
+        MailboxMessage spamMail = new SimpleMailboxMessage(MESSAGE_ID, 
THREAD_ID, date,
             SIZE,
             BODY_START_OCTET,
             new 
ByteContent(IOUtils.toByteArray(ClassLoaderUtils.getSystemResourceAsSharedStream("eml/nonTextual.eml"))),
@@ -368,6 +379,7 @@ class MessageToElasticSearchJsonTest {
     void convertToJsonWithoutAttachmentShouldConvertEmailBoby() throws 
IOException {
         // Given
         MailboxMessage message = new SimpleMailboxMessage(MESSAGE_ID,
+            THREAD_ID,
             null,
             SIZE,
             BODY_START_OCTET,
@@ -396,6 +408,7 @@ class MessageToElasticSearchJsonTest {
     void convertToJsonShouldExtractHtmlText() throws IOException {
         // Given
         MailboxMessage message = new SimpleMailboxMessage(MESSAGE_ID,
+            THREAD_ID,
             date,
             SIZE,
             BODY_START_OCTET,
diff --git 
a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageFactory.java
 
b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageFactory.java
index 4e96bbc..b296258 100644
--- 
a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageFactory.java
+++ 
b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageFactory.java
@@ -34,6 +34,7 @@ import org.apache.james.mailbox.model.Content;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MessageAttachmentMetadata;
 import org.apache.james.mailbox.model.MessageId;
+import org.apache.james.mailbox.model.ThreadId;
 import org.apache.james.mailbox.store.MessageFactory;
 import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
 
@@ -51,7 +52,7 @@ public class OpenJPAMessageFactory implements 
MessageFactory<AbstractJPAMailboxM
     }
 
     @Override
-    public AbstractJPAMailboxMessage createMessage(MessageId messageId, 
Mailbox mailbox, Date internalDate, int size, int bodyStartOctet, Content 
content, Flags flags, PropertyBuilder propertyBuilder, 
List<MessageAttachmentMetadata> attachments) throws MailboxException {
+    public AbstractJPAMailboxMessage createMessage(MessageId messageId, 
ThreadId threadId, Mailbox mailbox, Date internalDate, int size, int 
bodyStartOctet, Content content, Flags flags, PropertyBuilder propertyBuilder, 
List<MessageAttachmentMetadata> attachments) throws MailboxException {
         switch (feature) {
             case Streaming:
                 return new 
JPAStreamingMailboxMessage(JPAMailbox.from(mailbox), internalDate, size, flags, 
content,
diff --git 
a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/MessageUtilsTest.java
 
b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/MessageUtilsTest.java
index ab01f67..ca310e7 100644
--- 
a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/MessageUtilsTest.java
+++ 
b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/MessageUtilsTest.java
@@ -34,6 +34,7 @@ import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.model.ByteContent;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MessageId;
+import org.apache.james.mailbox.model.ThreadId;
 import org.apache.james.mailbox.store.mail.ModSeqProvider;
 import org.apache.james.mailbox.store.mail.UidProvider;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
@@ -48,6 +49,7 @@ import org.mockito.MockitoAnnotations;
 class MessageUtilsTest {
     static final MessageUid MESSAGE_UID = MessageUid.of(1);
     static final MessageId MESSAGE_ID = new DefaultMessageId();
+    static final ThreadId THREAD_ID = ThreadId.fromBaseMessageId(MESSAGE_ID);
     static final int BODY_START = 16;
     static final String CONTENT = "anycontent";
     
@@ -62,7 +64,7 @@ class MessageUtilsTest {
     void setUp() {
         MockitoAnnotations.initMocks(this);
         messageUtils = new MessageUtils(uidProvider, modSeqProvider);
-        message = new SimpleMailboxMessage(MESSAGE_ID, new Date(), 
CONTENT.length(), BODY_START,
+        message = new SimpleMailboxMessage(MESSAGE_ID, THREAD_ID, new Date(), 
CONTENT.length(), BODY_START,
             new ByteContent(CONTENT.getBytes()), new Flags(), new 
PropertyBuilder().build(), mailbox.getMailboxId());
     }
     
diff --git 
a/mailbox/plugin/spamassassin/src/test/java/org/apache/james/mailbox/spamassassin/SpamAssassinListenerTest.java
 
b/mailbox/plugin/spamassassin/src/test/java/org/apache/james/mailbox/spamassassin/SpamAssassinListenerTest.java
index bbef07c..2c6d28a 100644
--- 
a/mailbox/plugin/spamassassin/src/test/java/org/apache/james/mailbox/spamassassin/SpamAssassinListenerTest.java
+++ 
b/mailbox/plugin/spamassassin/src/test/java/org/apache/james/mailbox/spamassassin/SpamAssassinListenerTest.java
@@ -48,6 +48,7 @@ import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.MessageMoves;
 import org.apache.james.mailbox.model.TestMessageId;
+import org.apache.james.mailbox.model.ThreadId;
 import org.apache.james.mailbox.model.UidValidity;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
 import org.apache.james.mailbox.store.StoreMailboxManager;
@@ -64,6 +65,7 @@ class SpamAssassinListenerTest {
     static final MailboxSession MAILBOX_SESSION = 
MailboxSessionUtil.create(USER);
     static final UidValidity UID_VALIDITY = UidValidity.of(43);
     static final TestMessageId MESSAGE_ID = TestMessageId.of(45);
+    static final ThreadId THREAD_ID = ThreadId.fromBaseMessageId(MESSAGE_ID);
 
     SpamAssassin spamAssassin;
     SpamAssassinListener listener;
@@ -271,7 +273,7 @@ class SpamAssassinListenerTest {
         int size = 45;
         int bodyStartOctet = 25;
         byte[] content = "Subject: 
test\r\n\r\nBody\r\n".getBytes(StandardCharsets.UTF_8);
-        SimpleMailboxMessage message = new SimpleMailboxMessage(MESSAGE_ID, 
new Date(),
+        SimpleMailboxMessage message = new SimpleMailboxMessage(MESSAGE_ID, 
THREAD_ID, new Date(),
             size, bodyStartOctet, new ByteContent(content), new Flags(), new 
PropertyBuilder().build(),
             mailbox.getMailboxId());
         MessageMetaData messageMetaData = 
mapperFactory.createMessageMapper(null).add(mailbox, message);
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageFactory.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageFactory.java
index fcf3627..dffe153 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageFactory.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageFactory.java
@@ -29,21 +29,22 @@ import org.apache.james.mailbox.model.Content;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MessageAttachmentMetadata;
 import org.apache.james.mailbox.model.MessageId;
+import org.apache.james.mailbox.model.ThreadId;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;
 
 public interface MessageFactory<T extends MailboxMessage> {
-    T createMessage(MessageId messageId, Mailbox mailbox, Date internalDate, 
int size, int bodyStartOctet,
+    T createMessage(MessageId messageId, ThreadId threadId, Mailbox mailbox, 
Date internalDate, int size, int bodyStartOctet,
                     Content content, Flags flags, PropertyBuilder 
propertyBuilder,
                     List<MessageAttachmentMetadata> attachments) throws 
MailboxException;
 
     class StoreMessageFactory implements MessageFactory<SimpleMailboxMessage> {
         @Override
-        public SimpleMailboxMessage createMessage(MessageId messageId, Mailbox 
mailbox, Date internalDate, int size,
+        public SimpleMailboxMessage createMessage(MessageId messageId, 
ThreadId threadId, Mailbox mailbox, Date internalDate, int size,
                                                   int bodyStartOctet, Content 
content, Flags flags,
                                                   PropertyBuilder 
propertyBuilder, List<MessageAttachmentMetadata> attachments) {
-            return new SimpleMailboxMessage(messageId, internalDate, size, 
bodyStartOctet, content, flags, propertyBuilder.build(),
+            return new SimpleMailboxMessage(messageId, threadId, internalDate, 
size, bodyStartOctet, content, flags, propertyBuilder.build(),
                 mailbox.getMailboxId(), attachments);
         }
     }
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageStorer.java 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageStorer.java
index 23a33f5..4c1bb88 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageStorer.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageStorer.java
@@ -35,6 +35,7 @@ import 
org.apache.james.mailbox.model.MessageAttachmentMetadata;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.ParsedAttachment;
+import org.apache.james.mailbox.model.ThreadId;
 import org.apache.james.mailbox.store.mail.AttachmentMapperFactory;
 import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
@@ -86,12 +87,13 @@ public interface MessageStorer {
         public Mono<Pair<MessageMetaData, 
Optional<List<MessageAttachmentMetadata>>>> appendMessageToStore(Mailbox 
mailbox, Date internalDate, int size, int bodyStartOctet, Content content, 
Flags flags, PropertyBuilder propertyBuilder, Optional<Message> maybeMessage, 
MailboxSession session) throws MailboxException {
             MessageMapper messageMapper = 
mapperFactory.getMessageMapper(session);
             MessageId messageId = messageIdFactory.generate();
+            ThreadId threadId = ThreadId.fromBaseMessageId(messageId);
 
             return mapperFactory.getMessageMapper(session)
                 .executeReactive(
                     storeAttachments(messageId, content, maybeMessage, session)
                         
.flatMap(Throwing.function((List<MessageAttachmentMetadata> attachments) -> {
-                                MailboxMessage message = 
messageFactory.createMessage(messageId, mailbox, internalDate, size, 
bodyStartOctet, content, flags, propertyBuilder, attachments);
+                                MailboxMessage message = 
messageFactory.createMessage(messageId, threadId, mailbox, internalDate, size, 
bodyStartOctet, content, flags, propertyBuilder, attachments);
                                 return 
Mono.from(messageMapper.addReactive(mailbox, message))
                                     .map(metadata -> Pair.of(metadata, 
Optional.of(attachments)));
                             }).sneakyThrow()));
@@ -142,7 +144,8 @@ public interface MessageStorer {
         public Mono<Pair<MessageMetaData, 
Optional<List<MessageAttachmentMetadata>>>> appendMessageToStore(Mailbox 
mailbox, Date internalDate, int size, int bodyStartOctet, Content content, 
Flags flags, PropertyBuilder propertyBuilder, Optional<Message> maybeMessage, 
MailboxSession session) throws MailboxException {
             MessageMapper messageMapper = 
mapperFactory.getMessageMapper(session);
             MessageId messageId = messageIdFactory.generate();
-            MailboxMessage message = messageFactory.createMessage(messageId, 
mailbox, internalDate, size, bodyStartOctet, content, flags, propertyBuilder, 
ImmutableList.of());
+            ThreadId threadId = ThreadId.fromBaseMessageId(messageId);
+            MailboxMessage message = messageFactory.createMessage(messageId, 
threadId, mailbox, internalDate, size, bodyStartOctet, content, flags, 
propertyBuilder, ImmutableList.of());
 
             return mapperFactory.getMessageMapper(session)
                 .executeReactive(Mono.from(messageMapper.addReactive(mailbox, 
message)))
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessage.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessage.java
index 6bfb513..c611139 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessage.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessage.java
@@ -39,6 +39,7 @@ import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageAttachmentMetadata;
 import org.apache.james.mailbox.model.MessageId;
+import org.apache.james.mailbox.model.ThreadId;
 import org.apache.james.mailbox.store.mail.model.DelegatingMailboxMessage;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 
@@ -56,6 +57,7 @@ public class SimpleMailboxMessage extends 
DelegatingMailboxMessage {
 
     public static class Builder {
         private MessageId messageId;
+        private ThreadId threadId;
         private Date internalDate;
         private Long size;
         private Integer bodyStartOctet;
@@ -72,6 +74,11 @@ public class SimpleMailboxMessage extends 
DelegatingMailboxMessage {
             return this;
         }
 
+        public Builder threadId(ThreadId threadId) {
+            this.threadId = threadId;
+            return this;
+        }
+
         public Builder uid(MessageUid messageUid) {
             this.uid = Optional.of(messageUid);
             return this;
@@ -131,6 +138,7 @@ public class SimpleMailboxMessage extends 
DelegatingMailboxMessage {
 
         public SimpleMailboxMessage build() {
             Preconditions.checkNotNull(messageId, "messageId is required");
+            Preconditions.checkNotNull(threadId, "threadId is required");
             Preconditions.checkNotNull(internalDate, "internalDate is 
required");
             Preconditions.checkNotNull(size, "size is required");
             Preconditions.checkNotNull(bodyStartOctet, "bodyStartOctet is 
required");
@@ -140,7 +148,7 @@ public class SimpleMailboxMessage extends 
DelegatingMailboxMessage {
             Preconditions.checkNotNull(mailboxId, "mailboxId is required");
 
             ImmutableList<MessageAttachmentMetadata> attachments = 
this.attachments.build();
-            SimpleMailboxMessage simpleMailboxMessage = new 
SimpleMailboxMessage(messageId, internalDate, size,
+            SimpleMailboxMessage simpleMailboxMessage = new 
SimpleMailboxMessage(messageId, threadId, internalDate, size,
                 bodyStartOctet, content, flags, properties, mailboxId, 
attachments);
 
             uid.ifPresent(simpleMailboxMessage::setUid);
@@ -161,6 +169,7 @@ public class SimpleMailboxMessage extends 
DelegatingMailboxMessage {
 
     public static Builder fromWithoutAttachments(MailboxMessage original) 
throws MailboxException {
         return builder()
+            .threadId(original.getThreadId())
             .bodyStartOctet(Ints.checkedCast(original.getFullContentOctets() - 
original.getBodyOctets()))
             .content(copyFullContent(original))
             .messageId(original.getMessageId())
@@ -185,6 +194,7 @@ public class SimpleMailboxMessage extends 
DelegatingMailboxMessage {
 
     private MessageUid uid;
     private final MailboxId mailboxId;
+    private final ThreadId threadId;
     private boolean answered;
     private boolean deleted;
     private boolean draft;
@@ -194,7 +204,7 @@ public class SimpleMailboxMessage extends 
DelegatingMailboxMessage {
     private String[] userFlags;
     private ModSeq modSeq;
 
-    public SimpleMailboxMessage(MessageId messageId, Date internalDate, long 
size, int bodyStartOctet,
+    public SimpleMailboxMessage(MessageId messageId, ThreadId threadId, Date 
internalDate, long size, int bodyStartOctet,
                                 Content content, Flags flags,
                                 Properties properties, MailboxId mailboxId, 
List<MessageAttachmentMetadata> attachments) {
         super(new SimpleMessage(
@@ -207,12 +217,13 @@ public class SimpleMailboxMessage extends 
DelegatingMailboxMessage {
 
             setFlags(flags);
             this.mailboxId = mailboxId;
+            this.threadId = threadId;
     }
 
-    public SimpleMailboxMessage(MessageId messageId, Date internalDate, long 
size, int bodyStartOctet,
+    public SimpleMailboxMessage(MessageId messageId, ThreadId threadId, Date 
internalDate, long size, int bodyStartOctet,
                                 Content content, Flags flags,
                                 Properties properties, MailboxId mailboxId) {
-        this(messageId, internalDate, size, bodyStartOctet,
+        this(messageId, threadId, internalDate, size, bodyStartOctet,
                 content, flags,
                 properties, mailboxId, ImmutableList.of());
     }
@@ -223,7 +234,7 @@ public class SimpleMailboxMessage extends 
DelegatingMailboxMessage {
             .modSeq(modSeq)
             .flags(createFlags())
             .composedMessageId(new ComposedMessageId(mailboxId, 
getMessageId(), uid))
-            .threadId(getThreadId())
+            .threadId(threadId)
             .build();
     }
 
@@ -238,6 +249,11 @@ public class SimpleMailboxMessage extends 
DelegatingMailboxMessage {
     }
 
     @Override
+    public ThreadId getThreadId() {
+        return threadId;
+    }
+
+    @Override
     public MessageUid getUid() {
         return uid;
     }
@@ -316,6 +332,7 @@ public class SimpleMailboxMessage extends 
DelegatingMailboxMessage {
         return MoreObjects.toStringHelper(this)
             .add("uid", this.uid)
             .add("mailboxId", this.mailboxId)
+            .add("threadId", this.threadId)
             .add("answered", this.answered)
             .add("deleted", this.deleted)
             .add("draft", this.draft)
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/MessageBuilder.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/MessageBuilder.java
index fb6dad7..79eecaa 100644
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/MessageBuilder.java
+++ 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/MessageBuilder.java
@@ -34,6 +34,7 @@ import org.apache.james.mailbox.model.ByteContent;
 import org.apache.james.mailbox.model.MessageAttachmentMetadata;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.TestId;
+import org.apache.james.mailbox.model.ThreadId;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
@@ -80,7 +81,8 @@ public class MessageBuilder {
 
     public MailboxMessage build(MessageId messageId) throws Exception {
         byte[] headerContent = getHeaderContent();
-        SimpleMailboxMessage mailboxMessage = new 
SimpleMailboxMessage(messageId, internalDate, size, headerContent.length,
+        ThreadId threadId = ThreadId.fromBaseMessageId(messageId);
+        SimpleMailboxMessage mailboxMessage = new 
SimpleMailboxMessage(messageId, threadId, internalDate, size, 
headerContent.length,
             new ByteContent(Bytes.concat(headerContent, body)), flags, new 
PropertyBuilder().build(), mailboxId, NO_ATTACHMENTS);
         mailboxMessage.setUid(uid);
         return mailboxMessage;
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/MessageIdManagerTestSystem.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/MessageIdManagerTestSystem.java
index d974faf..5a6a8a1 100644
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/MessageIdManagerTestSystem.java
+++ 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/MessageIdManagerTestSystem.java
@@ -36,6 +36,7 @@ import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageId;
+import org.apache.james.mailbox.model.ThreadId;
 import org.apache.james.mailbox.store.event.EventFactory;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
@@ -82,8 +83,9 @@ public class MessageIdManagerTestSystem {
     public MessageId persist(MailboxId mailboxId, MessageUid uid, Flags flags, 
MailboxSession mailboxSession) {
         try {
             MessageId messageId = messageIdFactory.generate();
+            ThreadId threadId = ThreadId.fromBaseMessageId(messageId);
             Mailbox mailbox = 
mapperFactory.getMailboxMapper(mailboxSession).findMailboxById(mailboxId).block();
-            MailboxMessage message = createMessage(mailboxId, flags, 
messageId, uid);
+            MailboxMessage message = createMessage(mailboxId, flags, 
messageId, threadId, uid);
             mapperFactory.getMessageMapper(mailboxSession).add(mailbox, 
message);
             mailboxManager.getEventBus().dispatch(EventFactory.added()
                 .randomEventId()
@@ -112,8 +114,8 @@ public class MessageIdManagerTestSystem {
         }
     }
 
-    private static MailboxMessage createMessage(MailboxId mailboxId, Flags 
flags, MessageId messageId, MessageUid uid) {
-        MailboxMessage mailboxMessage = new SimpleMailboxMessage(messageId, 
new Date(), MESSAGE_CONTENT.length, 1256,
+    private static MailboxMessage createMessage(MailboxId mailboxId, Flags 
flags, MessageId messageId, ThreadId threadId, MessageUid uid) {
+        MailboxMessage mailboxMessage = new SimpleMailboxMessage(messageId, 
threadId, new Date(), MESSAGE_CONTENT.length, 1256,
             new ByteContent(MESSAGE_CONTENT), flags, new 
PropertyBuilder().build(), mailboxId);
         mailboxMessage.setModSeq(MOD_SEQ);
         mailboxMessage.setUid(uid);
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxMessageResultIteratorTest.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxMessageResultIteratorTest.java
index 0bbd549..24860a2 100644
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxMessageResultIteratorTest.java
+++ 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxMessageResultIteratorTest.java
@@ -41,6 +41,7 @@ import org.apache.james.mailbox.model.MailboxCounters;
 import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.TestId;
+import org.apache.james.mailbox.model.ThreadId;
 import org.apache.james.mailbox.model.UpdatedFlags;
 import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
@@ -84,7 +85,7 @@ class StoreMailboxMessageResultIteratorTest {
         }
 
         private SimpleMailboxMessage createMessage(MessageUid uid) {
-            SimpleMailboxMessage message = new SimpleMailboxMessage(new 
DefaultMessageId(), null, 0, 0, new ByteContent(
+            SimpleMailboxMessage message = new SimpleMailboxMessage(new 
DefaultMessageId(), ThreadId.fromBaseMessageId(new DefaultMessageId()), null, 
0, 0, new ByteContent(
                     "".getBytes()), new Flags(), new 
PropertyBuilder().build(), TestId.of(1L));
             message.setUid(uid);
             return message;
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMessageAssertTest.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMessageAssertTest.java
index 19a8920..f7a0b2e 100644
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMessageAssertTest.java
+++ 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMessageAssertTest.java
@@ -38,6 +38,7 @@ import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.TestId;
+import org.apache.james.mailbox.model.ThreadId;
 import org.apache.james.mailbox.model.UidValidity;
 import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;
@@ -54,6 +55,7 @@ class ListMessageAssertTest {
     static final MailboxId MAILBOX_ID = TestId.of(1);
     static final MessageUid MESSAGE_UID = MessageUid.of(2);
     static final MessageId MESSAGE_ID = new DefaultMessageId();
+    static final ThreadId THREAD_ID = ThreadId.fromBaseMessageId(MESSAGE_ID);
     static final Date INTERNAL_DATE = new Date();
 
     Mailbox benwaInboxMailbox;
@@ -65,8 +67,8 @@ class ListMessageAssertTest {
     void setUp() {
         benwaInboxMailbox = 
createMailbox(MailboxPath.inbox(Username.of("user")));
 
-        message1 = createMessage(benwaInboxMailbox, MESSAGE_ID, BODY_CONTENT1, 
BODY_START, new PropertyBuilder());
-        message2 = createMessage(benwaInboxMailbox, MESSAGE_ID, BODY_CONTENT2, 
BODY_START, new PropertyBuilder());
+        message1 = createMessage(benwaInboxMailbox, MESSAGE_ID, THREAD_ID, 
BODY_CONTENT1, BODY_START, new PropertyBuilder());
+        message2 = createMessage(benwaInboxMailbox, MESSAGE_ID, THREAD_ID, 
BODY_CONTENT2, BODY_START, new PropertyBuilder());
     }
 
     @Test
@@ -74,8 +76,8 @@ class ListMessageAssertTest {
         List<MailboxMessage> actual = ImmutableList.of(message1, message2);
 
         assertMessages(actual).containOnly(
-                createMailboxMessage(MAILBOX_ID, MESSAGE_ID, MESSAGE_UID, 
INTERNAL_DATE, BODY_CONTENT1, BODY_START, new PropertyBuilder()),
-                createMailboxMessage(MAILBOX_ID, MESSAGE_ID, MESSAGE_UID, 
INTERNAL_DATE, BODY_CONTENT2, BODY_START, new PropertyBuilder()));
+                createMailboxMessage(MAILBOX_ID, MESSAGE_ID, THREAD_ID, 
MESSAGE_UID, INTERNAL_DATE, BODY_CONTENT1, BODY_START, new PropertyBuilder()),
+                createMailboxMessage(MAILBOX_ID, MESSAGE_ID, THREAD_ID, 
MESSAGE_UID, INTERNAL_DATE, BODY_CONTENT2, BODY_START, new PropertyBuilder()));
     }
 
     @Test
@@ -83,13 +85,13 @@ class ListMessageAssertTest {
         List<MailboxMessage> actual = ImmutableList.of(message1);
 
         assertThatThrownBy(() -> assertMessages(actual).containOnly(
-                createMailboxMessage(MAILBOX_ID, MESSAGE_ID, MESSAGE_UID, 
INTERNAL_DATE, BODY_CONTENT2, BODY_START, new PropertyBuilder())))
+                createMailboxMessage(MAILBOX_ID, MESSAGE_ID, THREAD_ID, 
MESSAGE_UID, INTERNAL_DATE, BODY_CONTENT2, BODY_START, new PropertyBuilder())))
             .isInstanceOf(AssertionError.class);
     }
 
-    private MailboxMessage createMailboxMessage(MailboxId mailboxId, MessageId 
messageId, MessageUid uid, Date internalDate,
+    private MailboxMessage createMailboxMessage(MailboxId mailboxId, MessageId 
messageId, ThreadId threadId, MessageUid uid, Date internalDate,
                                                 String content, int bodyStart, 
PropertyBuilder propertyBuilder) {
-        SimpleMailboxMessage simpleMailboxMessage = new 
SimpleMailboxMessage(messageId, internalDate, content.length(),
+        SimpleMailboxMessage simpleMailboxMessage = new 
SimpleMailboxMessage(messageId, threadId, internalDate, content.length(),
             bodyStart, new 
ByteContent(content.getBytes(StandardCharsets.UTF_8)), new Flags(), 
propertyBuilder.build(), mailboxId);
 
         simpleMailboxMessage.setUid(uid);
@@ -101,8 +103,8 @@ class ListMessageAssertTest {
         return new Mailbox(mailboxPath, UID_VALIDITY, MAILBOX_ID);
     }
 
-    private MailboxMessage createMessage(Mailbox mailbox, MessageId messageId, 
String content, int bodyStart, PropertyBuilder propertyBuilder) {
-        SimpleMailboxMessage simpleMailboxMessage = new 
SimpleMailboxMessage(messageId, INTERNAL_DATE, content.length(),
+    private MailboxMessage createMessage(Mailbox mailbox, MessageId messageId, 
ThreadId threadId, String content, int bodyStart, PropertyBuilder 
propertyBuilder) {
+        SimpleMailboxMessage simpleMailboxMessage = new 
SimpleMailboxMessage(messageId, threadId, INTERNAL_DATE, content.length(),
             bodyStart, new ByteContent(content.getBytes()), new Flags(), 
propertyBuilder.build(), mailbox.getMailboxId());
 
         simpleMailboxMessage.setUid(MESSAGE_UID);
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMessageAssertTest.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMessageAssertTest.java
index 553ce37..6c26b8c 100644
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMessageAssertTest.java
+++ 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMessageAssertTest.java
@@ -30,6 +30,7 @@ import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.model.ByteContent;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.TestId;
+import org.apache.james.mailbox.model.ThreadId;
 import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;
@@ -40,6 +41,7 @@ class MailboxMessageAssertTest {
     static final TestId MAILBOX_ID = TestId.of(42L);
     static final MessageUid UID = MessageUid.of(24);
     static final MessageId MESSAGE_ID = new DefaultMessageId();
+    static final ThreadId THREAD_ID = ThreadId.fromBaseMessageId(MESSAGE_ID);
 
     @Test
     void messageAssertShouldSucceedWithTwoEqualsMessages() throws IOException {
@@ -47,11 +49,11 @@ class MailboxMessageAssertTest {
         String bodyString = "body\n.\n";
         Date date = new Date();
 
-        SimpleMailboxMessage message1 = new SimpleMailboxMessage(MESSAGE_ID, 
date, headerString.length() + bodyString.length(),
+        SimpleMailboxMessage message1 = new SimpleMailboxMessage(MESSAGE_ID, 
THREAD_ID, date, headerString.length() + bodyString.length(),
             headerString.length(), new ByteContent((headerString + 
bodyString).getBytes()), new Flags(), new PropertyBuilder().build(), 
MAILBOX_ID);
         message1.setUid(UID);
 
-        SimpleMailboxMessage message2 = new SimpleMailboxMessage(MESSAGE_ID, 
date, headerString.length() + bodyString.length(),
+        SimpleMailboxMessage message2 = new SimpleMailboxMessage(MESSAGE_ID, 
THREAD_ID, date, headerString.length() + bodyString.length(),
             headerString.length(), new ByteContent((headerString + 
bodyString).getBytes()), new Flags(), new PropertyBuilder().build(), 
MAILBOX_ID);
         message2.setUid(UID);
 
@@ -64,12 +66,12 @@ class MailboxMessageAssertTest {
         String bodyString = "body\n.\n";
         Date date = new Date();
 
-        SimpleMailboxMessage message1 = new SimpleMailboxMessage(MESSAGE_ID, 
date, headerString.length() + bodyString.length(),
+        SimpleMailboxMessage message1 = new SimpleMailboxMessage(MESSAGE_ID, 
THREAD_ID, date, headerString.length() + bodyString.length(),
             headerString.length(), new ByteContent((headerString + 
bodyString).getBytes()), new Flags(), new PropertyBuilder().build(), 
MAILBOX_ID);
         message1.setUid(UID);
 
         bodyString = "work\n.\n";
-        SimpleMailboxMessage message2 = new SimpleMailboxMessage(MESSAGE_ID, 
date, headerString.length() + bodyString.length(),
+        SimpleMailboxMessage message2 = new SimpleMailboxMessage(MESSAGE_ID, 
THREAD_ID, date, headerString.length() + bodyString.length(),
             headerString.length(), new ByteContent((headerString + 
bodyString).getBytes()), new Flags(), new PropertyBuilder().build(), 
MAILBOX_ID);
         message2.setUid(UID);
 
@@ -82,12 +84,12 @@ class MailboxMessageAssertTest {
         String bodyString = "body\n.\n";
         Date date = new Date();
 
-        SimpleMailboxMessage message1 = new SimpleMailboxMessage(MESSAGE_ID, 
date, headerString.length() + bodyString.length(),
+        SimpleMailboxMessage message1 = new SimpleMailboxMessage(MESSAGE_ID, 
THREAD_ID, date, headerString.length() + bodyString.length(),
             headerString.length(), new ByteContent((headerString + 
bodyString).getBytes()), new Flags(), new PropertyBuilder().build(), 
MAILBOX_ID);
         message1.setUid(UID);
 
         bodyString = "work\n.\n";
-        SimpleMailboxMessage message2 = new SimpleMailboxMessage(MESSAGE_ID, 
date, headerString.length() + bodyString.length(),
+        SimpleMailboxMessage message2 = new SimpleMailboxMessage(MESSAGE_ID, 
THREAD_ID, date, headerString.length() + bodyString.length(),
             headerString.length(), new ByteContent((headerString + 
bodyString).getBytes()), new Flags(), new PropertyBuilder().build(), 
MAILBOX_ID);
         message2.setUid(UID);
 
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java
index 6c1919b..ad80db9 100644
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java
+++ 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java
@@ -42,6 +42,7 @@ import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageId;
+import org.apache.james.mailbox.model.ThreadId;
 import org.apache.james.mailbox.model.UidValidity;
 import org.apache.james.mailbox.model.UpdatedFlags;
 import org.apache.james.mailbox.store.mail.MailboxMapper;
@@ -1001,7 +1002,10 @@ public abstract class MessageIdMapperTest {
     }
 
     private SimpleMailboxMessage createMessage(Mailbox mailbox, String 
content, int bodyStart, PropertyBuilder propertyBuilder) {
-        return new SimpleMailboxMessage(mapperProvider.generateMessageId(), 
+        MessageId messageId = mapperProvider.generateMessageId();
+        ThreadId threadId = ThreadId.fromBaseMessageId(messageId);
+        return new SimpleMailboxMessage(messageId,
+                threadId,
                 new Date(), 
                 content.length(), 
                 bodyStart, 
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java
index 110eb4c..3689f66 100644
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java
+++ 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java
@@ -48,6 +48,7 @@ import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.MessageRange;
+import org.apache.james.mailbox.model.ThreadId;
 import org.apache.james.mailbox.model.UidValidity;
 import org.apache.james.mailbox.model.UpdatedFlags;
 import org.apache.james.mailbox.store.FlagsUpdateCalculator;
@@ -1265,6 +1266,6 @@ public abstract class MessageMapperTest {
     }
     
     private MailboxMessage createMessage(Mailbox mailbox, MessageId messageId, 
String content, int bodyStart, PropertyBuilder propertyBuilder) {
-        return new SimpleMailboxMessage(messageId, new Date(), 
content.length(), bodyStart, new ByteContent(content.getBytes()), new Flags(), 
propertyBuilder.build(), mailbox.getMailboxId());
+        return new SimpleMailboxMessage(messageId, 
ThreadId.fromBaseMessageId(messageId), new Date(), content.length(), bodyStart, 
new ByteContent(content.getBytes()), new Flags(), propertyBuilder.build(), 
mailbox.getMailboxId());
     }
 }
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMoveTest.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMoveTest.java
index b20b814..b851a8d 100644
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMoveTest.java
+++ 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMoveTest.java
@@ -33,6 +33,7 @@ import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.MessageRange;
+import org.apache.james.mailbox.model.ThreadId;
 import org.apache.james.mailbox.model.UidValidity;
 import org.apache.james.mailbox.store.mail.MailboxMapper;
 import org.apache.james.mailbox.store.mail.MessageMapper;
@@ -148,6 +149,6 @@ public abstract class MessageMoveTest {
     }
     
     private MailboxMessage createMessage(Mailbox mailbox, MessageId messageId, 
String content, int bodyStart, PropertyBuilder propertyBuilder) {
-        return new SimpleMailboxMessage(messageId, new Date(), 
content.length(), bodyStart, new ByteContent(content.getBytes()), new Flags(), 
propertyBuilder.build(), mailbox.getMailboxId());
+        return new SimpleMailboxMessage(messageId, 
ThreadId.fromBaseMessageId(messageId),new Date(), content.length(), bodyStart, 
new ByteContent(content.getBytes()), new Flags(), propertyBuilder.build(), 
mailbox.getMailboxId());
     }
 }
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageWithAttachmentMapperTest.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageWithAttachmentMapperTest.java
index 27d2338..a2f8ba8 100644
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageWithAttachmentMapperTest.java
+++ 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageWithAttachmentMapperTest.java
@@ -40,6 +40,7 @@ import 
org.apache.james.mailbox.model.MessageAttachmentMetadata;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.ParsedAttachment;
+import org.apache.james.mailbox.model.ThreadId;
 import org.apache.james.mailbox.model.UidValidity;
 import org.apache.james.mailbox.store.mail.AttachmentMapper;
 import org.apache.james.mailbox.store.mail.MessageMapper;
@@ -101,15 +102,19 @@ public abstract class MessageWithAttachmentMapperTest {
             .inline(false);
 
         MessageId messageId1 = mapperProvider.generateMessageId();
+        ThreadId threadId1 = ThreadId.fromBaseMessageId(messageId1);
         MessageId messageId2 = mapperProvider.generateMessageId();
+        ThreadId threadId2 = ThreadId.fromBaseMessageId(messageId2);
+        MessageId messageId3 = mapperProvider.generateMessageId();
+        ThreadId threadId3 = ThreadId.fromBaseMessageId(messageId3);
         List<MessageAttachmentMetadata> message1Attachments = 
attachmentMapper.storeAttachmentsForMessage(ImmutableList.of(attachment1), 
messageId1);
         List<MessageAttachmentMetadata> message2Attachments = 
attachmentMapper.storeAttachmentsForMessage(ImmutableList.of(attachment2, 
attachment3), messageId2);
 
-        messageWith1Attachment = createMessage(attachmentsMailbox, messageId1, 
"Subject: Test7 \n\nBody7\n.\n", BODY_START, new PropertyBuilder(),
+        messageWith1Attachment = createMessage(attachmentsMailbox, messageId1, 
threadId1, "Subject: Test7 \n\nBody7\n.\n", BODY_START, new PropertyBuilder(),
                 message1Attachments);
-        messageWith2Attachments = createMessage(attachmentsMailbox, 
messageId2, "Subject: Test8 \n\nBody8\n.\n", BODY_START, new PropertyBuilder(),
+        messageWith2Attachments = createMessage(attachmentsMailbox, 
messageId2, threadId2, "Subject: Test8 \n\nBody8\n.\n", BODY_START, new 
PropertyBuilder(),
                 message2Attachments);
-        messageWithoutAttachment = createMessage(attachmentsMailbox, 
mapperProvider.generateMessageId(), "Subject: Test1 \n\nBody1\n.\n", 
BODY_START, new PropertyBuilder());
+        messageWithoutAttachment = createMessage(attachmentsMailbox, 
messageId3, threadId3, "Subject: Test1 \n\nBody1\n.\n", BODY_START, new 
PropertyBuilder());
     }
 
     @Test
@@ -193,11 +198,11 @@ public abstract class MessageWithAttachmentMapperTest {
         
messageWith2Attachments.setModSeq(messageMapper.getHighestModSeq(attachmentsMailbox));
     }
 
-    private SimpleMailboxMessage createMessage(Mailbox mailbox, MessageId 
messageId, String content, int bodyStart, PropertyBuilder propertyBuilder, 
List<MessageAttachmentMetadata> attachments) {
-        return new SimpleMailboxMessage(messageId, new Date(), 
content.length(), bodyStart, new ByteContent(content.getBytes()), new Flags(), 
propertyBuilder.build(), mailbox.getMailboxId(), attachments);
+    private SimpleMailboxMessage createMessage(Mailbox mailbox, MessageId 
messageId, ThreadId threadId, String content, int bodyStart, PropertyBuilder 
propertyBuilder, List<MessageAttachmentMetadata> attachments) {
+        return new SimpleMailboxMessage(messageId, threadId, new Date(), 
content.length(), bodyStart, new ByteContent(content.getBytes()), new Flags(), 
propertyBuilder.build(), mailbox.getMailboxId(), attachments);
     }
 
-    private SimpleMailboxMessage createMessage(Mailbox mailbox, MessageId 
messageId, String content, int bodyStart, PropertyBuilder propertyBuilder) {
-        return new SimpleMailboxMessage(messageId, new Date(), 
content.length(), bodyStart, new ByteContent(content.getBytes()), new Flags(), 
propertyBuilder.build(), mailbox.getMailboxId());
+    private SimpleMailboxMessage createMessage(Mailbox mailbox, MessageId 
messageId, ThreadId threadId, String content, int bodyStart, PropertyBuilder 
propertyBuilder) {
+        return new SimpleMailboxMessage(messageId, threadId, new Date(), 
content.length(), bodyStart, new ByteContent(content.getBytes()), new Flags(), 
propertyBuilder.build(), mailbox.getMailboxId());
     }
 }
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MetadataMapAssertTest.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MetadataMapAssertTest.java
index ef4796c..6fe06f6 100644
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MetadataMapAssertTest.java
+++ 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MetadataMapAssertTest.java
@@ -43,6 +43,7 @@ class MetadataMapAssertTest {
 
     static final MessageUid UID = MessageUid.of(18);
     static final MessageId MESSAGE_ID = new DefaultMessageId();
+    static final ThreadId THREAD_ID = ThreadId.fromBaseMessageId(MESSAGE_ID);
     static final ModSeq MODSEQ = ModSeq.of(24L);
     static final Date DATE = new Date();
     static final String HEADER_STRING = "name: headerName\n\n";
@@ -53,7 +54,7 @@ class MetadataMapAssertTest {
 
     @BeforeEach
     void setUp() {
-        message1 = new SimpleMailboxMessage(MESSAGE_ID, DATE, 
HEADER_STRING.length() + BODY_STRING.length(),
+        message1 = new SimpleMailboxMessage(MESSAGE_ID, THREAD_ID, DATE, 
HEADER_STRING.length() + BODY_STRING.length(),
             HEADER_STRING.length(), new ByteContent((HEADER_STRING + 
BODY_STRING).getBytes()), new Flags(), new PropertyBuilder().build(), 
MAILBOX_ID);
         message1.setUid(UID);
         message1.setModSeq(MODSEQ);
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessageTest.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessageTest.java
index 910ff8d..c8e9df7 100644
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessageTest.java
+++ 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessageTest.java
@@ -41,6 +41,7 @@ import 
org.apache.james.mailbox.model.MessageAttachmentMetadata;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.TestId;
 import org.apache.james.mailbox.model.TestMessageId;
+import org.apache.james.mailbox.model.ThreadId;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
 import org.assertj.core.api.SoftAssertions;
 import org.junit.jupiter.api.BeforeEach;
@@ -56,6 +57,7 @@ class SimpleMailboxMessageTest {
     static final TestId TEST_ID = TestId.of(1L);
     static final int BODY_START_OCTET = 0;
     static final MessageId MESSAGE_ID = new TestMessageId.Factory().generate();
+    static final ThreadId THREAD_ID = ThreadId.fromBaseMessageId(MESSAGE_ID);
     static final int SIZE = 1000;
 
     SimpleMailboxMessage message;
@@ -109,7 +111,9 @@ class SimpleMailboxMessageTest {
         propertyBuilder.setTextualLineCount(textualLineCount);
         propertyBuilder.setMediaType(text);
         propertyBuilder.setSubType(plain);
-        SimpleMailboxMessage original = new SimpleMailboxMessage(new 
TestMessageId.Factory().generate(), new Date(),
+        MessageId messageId = new TestMessageId.Factory().generate();
+        ThreadId threadId = ThreadId.fromBaseMessageId(messageId);
+        SimpleMailboxMessage original = new SimpleMailboxMessage(messageId, 
threadId, new Date(),
             MESSAGE_CONTENT.length(),
             BODY_START_OCTET,
             CONTENT_STREAM,
@@ -132,7 +136,7 @@ class SimpleMailboxMessageTest {
     }
 
     private static SimpleMailboxMessage buildMessage(String content) {
-        return new SimpleMailboxMessage(new DefaultMessageId(), 
Calendar.getInstance().getTime(),
+        return new SimpleMailboxMessage(new DefaultMessageId(), 
ThreadId.fromBaseMessageId(new DefaultMessageId()), 
Calendar.getInstance().getTime(),
             content.length(), BODY_START_OCTET, new ByteContent(
                     content.getBytes(MESSAGE_CHARSET)), new Flags(),
             new PropertyBuilder().build(), TEST_ID);
@@ -157,6 +161,7 @@ class SimpleMailboxMessageTest {
         Date internalDate = new Date();
         SimpleMailboxMessage.builder()
             .messageId(MESSAGE_ID)
+            .threadId(THREAD_ID)
             .mailboxId(TEST_ID)
             .internalDate(internalDate)
             .bodyStartOctet(BODY_START_OCTET)
@@ -187,6 +192,7 @@ class SimpleMailboxMessageTest {
             .build();
         SimpleMailboxMessage message = SimpleMailboxMessage.builder()
             .messageId(MESSAGE_ID)
+            .threadId(THREAD_ID)
             .mailboxId(TEST_ID)
             .modseq(modseq)
             .uid(uid)
@@ -219,6 +225,7 @@ class SimpleMailboxMessageTest {
     void buildShouldThrowOnMissingMessageId() {
         Date internalDate = new Date();
         assertThatThrownBy(() -> SimpleMailboxMessage.builder()
+                .threadId(THREAD_ID)
                 .mailboxId(TEST_ID)
                 .internalDate(internalDate)
                 .bodyStartOctet(BODY_START_OCTET)
@@ -231,10 +238,27 @@ class SimpleMailboxMessageTest {
     }
 
     @Test
+    void buildShouldThrowOnMissingThreadId() {
+        Date internalDate = new Date();
+        assertThatThrownBy(() -> SimpleMailboxMessage.builder()
+            .messageId(MESSAGE_ID)
+            .mailboxId(TEST_ID)
+            .internalDate(internalDate)
+            .bodyStartOctet(BODY_START_OCTET)
+            .size(SIZE)
+            .content(CONTENT_STREAM)
+            .flags(new Flags())
+            .properties(new PropertyBuilder())
+            .build())
+            .isInstanceOf(NullPointerException.class);
+    }
+
+    @Test
     void buildShouldThrowOnMissingMailboxId() {
         Date internalDate = new Date();
         assertThatThrownBy(() -> SimpleMailboxMessage.builder()
                 .messageId(MESSAGE_ID)
+                .threadId(THREAD_ID)
                 .internalDate(internalDate)
                 .bodyStartOctet(BODY_START_OCTET)
                 .size(SIZE)
@@ -249,6 +273,7 @@ class SimpleMailboxMessageTest {
     void buildShouldThrowOnMissingInternalDate() {
         assertThatThrownBy(() -> SimpleMailboxMessage.builder()
                 .messageId(MESSAGE_ID)
+                .threadId(THREAD_ID)
                 .mailboxId(TEST_ID)
                 .bodyStartOctet(BODY_START_OCTET)
                 .size(SIZE)
@@ -264,6 +289,7 @@ class SimpleMailboxMessageTest {
         Date internalDate = new Date();
         assertThatThrownBy(() -> SimpleMailboxMessage.builder()
                 .messageId(MESSAGE_ID)
+                .threadId(THREAD_ID)
                 .mailboxId(TEST_ID)
                 .internalDate(internalDate)
                 .size(SIZE)
@@ -279,6 +305,7 @@ class SimpleMailboxMessageTest {
         Date internalDate = new Date();
         assertThatThrownBy(() -> SimpleMailboxMessage.builder()
                 .messageId(MESSAGE_ID)
+                .threadId(THREAD_ID)
                 .mailboxId(TEST_ID)
                 .internalDate(internalDate)
                 .bodyStartOctet(BODY_START_OCTET)
@@ -294,6 +321,7 @@ class SimpleMailboxMessageTest {
         Date internalDate = new Date();
         assertThatThrownBy(() -> SimpleMailboxMessage.builder()
                 .messageId(MESSAGE_ID)
+                .threadId(THREAD_ID)
                 .mailboxId(TEST_ID)
                 .internalDate(internalDate)
                 .bodyStartOctet(BODY_START_OCTET)
@@ -309,6 +337,7 @@ class SimpleMailboxMessageTest {
         Date internalDate = new Date();
         assertThatThrownBy(() -> SimpleMailboxMessage.builder()
                 .messageId(MESSAGE_ID)
+                .threadId(THREAD_ID)
                 .mailboxId(TEST_ID)
                 .internalDate(internalDate)
                 .bodyStartOctet(BODY_START_OCTET)
@@ -324,6 +353,7 @@ class SimpleMailboxMessageTest {
         Date internalDate = new Date();
         assertThatThrownBy(() -> SimpleMailboxMessage.builder()
                 .messageId(MESSAGE_ID)
+                .threadId(THREAD_ID)
                 .mailboxId(TEST_ID)
                 .internalDate(internalDate)
                 .bodyStartOctet(BODY_START_OCTET)
@@ -336,7 +366,7 @@ class SimpleMailboxMessageTest {
 
     @Test
     void simpleMessageShouldReturnThreadIdWhichWrapsMessageId() {
-        
assertThat(message.getThreadId().getBaseMessageId()).isEqualTo(message.getMessageId());
+        
assertThat(message.getThreadId().getBaseMessageId()).isInstanceOf(MessageId.class);
     }
 
 }
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/utils/ApplicableFlagCalculatorTest.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/utils/ApplicableFlagCalculatorTest.java
index 9a0184f..f76104d 100644
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/utils/ApplicableFlagCalculatorTest.java
+++ 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/utils/ApplicableFlagCalculatorTest.java
@@ -31,6 +31,7 @@ import javax.mail.Flags.Flag;
 import org.apache.james.mailbox.ApplicableFlagBuilder;
 import org.apache.james.mailbox.model.ByteContent;
 import org.apache.james.mailbox.model.TestId;
+import org.apache.james.mailbox.model.ThreadId;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
@@ -104,7 +105,7 @@ class ApplicableFlagCalculatorTest {
         String content = "Any content";
         int bodyStart = 10;
 
-        return new SimpleMailboxMessage(new DefaultMessageId(), new Date(), 
content.length(), bodyStart,
+        return new SimpleMailboxMessage(new DefaultMessageId(), 
ThreadId.fromBaseMessageId(new DefaultMessageId()), new Date(), 
content.length(), bodyStart,
             new ByteContent(content.getBytes()), messageFlags, new 
PropertyBuilder().build(), TestId.of(1));
     }
 
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndexContract.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndexContract.java
index e990741..69244f4 100644
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndexContract.java
+++ 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndexContract.java
@@ -34,6 +34,7 @@ import org.apache.james.mailbox.model.ByteContent;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.TestMessageId;
+import org.apache.james.mailbox.model.ThreadId;
 import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;
 import org.junit.jupiter.api.Test;
@@ -43,10 +44,12 @@ public interface ListeningMessageSearchIndexContract {
     int SIZE = 25;
     int BODY_START_OCTET = 100;
     MessageId MESSAGE_ID = TestMessageId.of(21L);
+    ThreadId THREAD_ID = ThreadId.fromBaseMessageId(MESSAGE_ID);
     MessageUid MESSAGE_UID = MessageUid.of(28);
     
     SimpleMailboxMessage.Builder MESSAGE_BUILDER = 
SimpleMailboxMessage.builder()
         .messageId(MESSAGE_ID)
+        .threadId(THREAD_ID)
         .uid(MESSAGE_UID)
         .bodyStartOctet(BODY_START_OCTET)
         .internalDate(new Date(1433628000000L))
diff --git 
a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MailboxesRoutesTest.java
 
b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MailboxesRoutesTest.java
index 232c3af..7ae9d11 100644
--- 
a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MailboxesRoutesTest.java
+++ 
b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/MailboxesRoutesTest.java
@@ -71,6 +71,7 @@ import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageResult;
+import org.apache.james.mailbox.model.ThreadId;
 import org.apache.james.mailbox.model.UpdatedFlags;
 import org.apache.james.mailbox.store.extractor.DefaultTextExtractor;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
@@ -631,6 +632,7 @@ class MailboxesRoutesTest {
 
                 SimpleMailboxMessage message = SimpleMailboxMessage.builder()
                     .messageId(InMemoryMessageId.of(42L))
+                    
.threadId(ThreadId.fromBaseMessageId(InMemoryMessageId.of(42L)))
                     .uid(uid)
                     .content(new ByteContent(content))
                     .size(content.length)
@@ -1050,6 +1052,7 @@ class MailboxesRoutesTest {
 
                 SimpleMailboxMessage message = SimpleMailboxMessage.builder()
                     .messageId(InMemoryMessageId.of(42L))
+                    
.threadId(ThreadId.fromBaseMessageId(InMemoryMessageId.of(42L)))
                     .uid(uid)
                     .content(new ByteContent(content))
                     .size(content.length)
diff --git 
a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java
 
b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java
index 6468333..5b26333 100644
--- 
a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java
+++ 
b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java
@@ -90,6 +90,7 @@ import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxMetaData;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageResult;
+import org.apache.james.mailbox.model.ThreadId;
 import org.apache.james.mailbox.model.UpdatedFlags;
 import org.apache.james.mailbox.model.search.MailboxQuery;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
@@ -1547,6 +1548,7 @@ class UserMailboxesRoutesTest {
 
                 SimpleMailboxMessage message = SimpleMailboxMessage.builder()
                     .messageId(InMemoryMessageId.of(42L))
+                    
.threadId(ThreadId.fromBaseMessageId(InMemoryMessageId.of(42L)))
                     .uid(uid)
                     .content(new ByteContent(content))
                     .size(content.length)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to