You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2019/11/28 02:12:29 UTC

[james-project] 12/23: JAMES-2989 POJOify FetchGroup

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

commit 4a44dc857120f9d43eab97c6603b5fc9f5e29321
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Nov 25 11:59:52 2019 +0700

    JAMES-2989 POJOify FetchGroup
---
 .../listeners/SetCustomFlagOnBigMessagesTest.java  |   6 +-
 .../org/apache/james/mailbox/MessageIdManager.java |   2 +-
 .../org/apache/james/mailbox/MessageManager.java   |   2 +-
 .../model/{FetchGroupImpl.java => FetchGroup.java} |  53 ++++++++---
 .../org/apache/james/mailbox/model/Headers.java    |   1 -
 .../apache/james/mailbox/model/MessageResult.java  |  51 -----------
 .../james/mailbox/model/PartContentDescriptor.java |  14 +--
 .../apache/james/mailbox/MailboxManagerTest.java   |  10 +-
 .../james/mailbox/backup/DefaultMailboxBackup.java |   4 +-
 .../james/vault/DeletedMessageVaultHookTest.java   |   4 +-
 .../james/mailbox/store/MessageResultImpl.java     |  11 ++-
 .../apache/james/mailbox/store/ResultUtils.java    |  28 +++---
 .../james/mailbox/store/StoreBlobManager.java      |   4 +-
 .../james/mailbox/store/StoreMessageIdManager.java |   5 +-
 .../james/mailbox/store/StoreMessageManager.java   |   2 +-
 .../mailbox/store/StoreMessageResultIterator.java  |   4 +-
 .../mailbox/store/mail/FetchGroupConverter.java    |  22 ++---
 .../store/AbstractCombinationManagerTest.java      |  45 +++++----
 .../AbstractMessageIdManagerSideEffectTest.java    |  18 ++--
 .../store/AbstractMessageIdManagerStorageTest.java | 102 ++++++++++-----------
 .../james/mailbox/store/StoreBlobManagerTest.java  |  18 ++--
 .../StoreMailboxMessageResultIteratorTest.java     |  10 +-
 .../mailbox/tools/copier/MailboxCopierImpl.java    |   4 +-
 .../imap/processor/AbstractMailboxProcessor.java   |   4 +-
 .../james/imap/processor/SearchProcessor.java      |   4 +-
 .../james/imap/processor/StoreProcessor.java       |  13 ++-
 .../james/imap/processor/fetch/FetchProcessor.java |  21 ++---
 .../apache/james/jmap/draft/MessageIdProbe.java    |   6 +-
 .../mailets/delivery/MailboxAppenderTest.java      |  10 +-
 .../jmap/draft/methods/GetMessagesMethod.java      |   4 +-
 .../james/jmap/draft/methods/ReferenceUpdater.java |   4 +-
 .../james/jmap/draft/methods/SendMDNProcessor.java |   4 +-
 .../draft/methods/SetMessagesUpdateProcessor.java  |   6 +-
 .../jmap/draft/send/PostDequeueDecorator.java      |   4 +-
 .../message/view/MessageFullViewFactoryTest.java   |   6 +-
 .../message/view/MessageHeaderViewFactoryTest.java |   6 +-
 .../view/MessageMetadataViewFactoryTest.java       |   6 +-
 .../jmap/draft/send/PostDequeueDecoratorTest.java  |  24 ++---
 .../james/pop3server/mailbox/MailboxAdapter.java   |  11 +--
 .../routes/DeletedMessagesVaultRoutesTest.java     |   4 +-
 40 files changed, 264 insertions(+), 293 deletions(-)

diff --git a/examples/custom-listeners/src/test/java/org/apache/james/examples/custom/listeners/SetCustomFlagOnBigMessagesTest.java b/examples/custom-listeners/src/test/java/org/apache/james/examples/custom/listeners/SetCustomFlagOnBigMessagesTest.java
index be8f918..e3340d5 100644
--- a/examples/custom-listeners/src/test/java/org/apache/james/examples/custom/listeners/SetCustomFlagOnBigMessagesTest.java
+++ b/examples/custom-listeners/src/test/java/org/apache/james/examples/custom/listeners/SetCustomFlagOnBigMessagesTest.java
@@ -37,7 +37,7 @@ import org.apache.james.mailbox.events.Event;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
 import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
 import org.apache.james.mailbox.model.ComposedMessageId;
-import org.apache.james.mailbox.model.FetchGroupImpl;
+import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageMetaData;
@@ -125,7 +125,7 @@ class SetCustomFlagOnBigMessagesTest {
             mailboxSession);
 
         MessageResult addedMessage = inboxMessageManager
-            .getMessages(MessageRange.one(composedIdOfSmallMessage.getUid()), FetchGroupImpl.MINIMAL, mailboxSession)
+            .getMessages(MessageRange.one(composedIdOfSmallMessage.getUid()), FetchGroup.MINIMAL, mailboxSession)
             .next();
         MessageMetaData oneMBMetaData = new MessageMetaData(addedMessage.getUid(), addedMessage.getModSeq(),
             addedMessage.getFlags(), ONE_MB, addedMessage.getInternalDate(), addedMessage.getMessageId());
@@ -181,7 +181,7 @@ class SetCustomFlagOnBigMessagesTest {
 
     private Stream<Flags> getMessageFlags(MessageUid messageUid) throws Exception {
         return Streams.stream(inboxMessageManager
-            .getMessages(MessageRange.one(messageUid), FetchGroupImpl.MINIMAL, mailboxSession))
+            .getMessages(MessageRange.one(messageUid), FetchGroup.MINIMAL, mailboxSession))
             .map(MessageResult::getFlags);
     }
 
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/MessageIdManager.java b/mailbox/api/src/main/java/org/apache/james/mailbox/MessageIdManager.java
index c61581d..7b69892 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/MessageIdManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MessageIdManager.java
@@ -28,10 +28,10 @@ import javax.mail.Flags;
 import org.apache.james.mailbox.MessageManager.FlagsUpdateMode;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.DeleteResult;
+import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.MessageResult;
-import org.apache.james.mailbox.model.MessageResult.FetchGroup;
 
 import com.google.common.collect.ImmutableList;
 
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java b/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
index 58a887e..e91c432 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
@@ -38,6 +38,7 @@ import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.UnsupportedCriteriaException;
 import org.apache.james.mailbox.exception.UnsupportedRightException;
 import org.apache.james.mailbox.model.ComposedMessageId;
+import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MailboxCounters;
@@ -45,7 +46,6 @@ import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.MessageResult;
-import org.apache.james.mailbox.model.MessageResult.FetchGroup;
 import org.apache.james.mailbox.model.MessageResultIterator;
 import org.apache.james.mailbox.model.SearchQuery;
 import org.apache.james.mime4j.dom.Message;
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/FetchGroupImpl.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/FetchGroup.java
similarity index 62%
rename from mailbox/api/src/main/java/org/apache/james/mailbox/model/FetchGroupImpl.java
rename to mailbox/api/src/main/java/org/apache/james/mailbox/model/FetchGroup.java
index c9dd1c7..40b5fae 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/FetchGroupImpl.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/FetchGroup.java
@@ -23,32 +23,51 @@ import java.util.HashSet;
 import java.util.Set;
 
 /**
- * Specifies a fetch group.
+ * Indicates the results fetched.
  */
-public class FetchGroupImpl implements MessageResult.FetchGroup {
-
-    public static final FetchGroupImpl MINIMAL = new FetchGroupImpl(MessageResult.FetchGroup.MINIMAL);
-
-    public static final FetchGroupImpl HEADERS = new FetchGroupImpl(MessageResult.FetchGroup.HEADERS);
-
-    public static final FetchGroupImpl FULL_CONTENT = new FetchGroupImpl(MessageResult.FetchGroup.FULL_CONTENT);
-
-    public static final FetchGroupImpl BODY_CONTENT = new FetchGroupImpl(MessageResult.FetchGroup.BODY_CONTENT);
+public class FetchGroup {
+    /**
+     * For example: could have best performance when doing store and then
+     * forget. UIDs are always returned
+     */
+    public static final int MINIMAL_MASK = 0x00;
+    public static final int MIME_DESCRIPTOR_MASK = 0x01;
+    public static final int HEADERS_MASK = 0x100;
+    public static final int FULL_CONTENT_MASK = 0x200;
+    public static final int BODY_CONTENT_MASK = 0x400;
+    public static final int MIME_HEADERS_MASK = 0x800;
+    public static final int MIME_CONTENT_MASK = 0x1000;
+
+    public static final FetchGroup MINIMAL = new FetchGroup(MINIMAL_MASK);
+    public static final FetchGroup HEADERS = new FetchGroup(HEADERS_MASK);
+    public static final FetchGroup FULL_CONTENT = new FetchGroup(FULL_CONTENT_MASK);
+    public static final FetchGroup BODY_CONTENT = new FetchGroup(BODY_CONTENT_MASK);
 
     private int content;
 
     private Set<PartContentDescriptor> partContentDescriptors;
 
-    private FetchGroupImpl(int content) {
+    private FetchGroup(int content) {
         this(content, new HashSet<>());
     }
 
-    private FetchGroupImpl(int content, Set<PartContentDescriptor> partContentDescriptors) {
+    private FetchGroup(int content, Set<PartContentDescriptor> partContentDescriptors) {
         this.content = content;
         this.partContentDescriptors = partContentDescriptors;
     }
 
-    @Override
+    /**
+     * Contents to be fetched. Composed bitwise.
+     *
+     * @return bitwise description
+     * @see #MINIMAL_MASK
+     * @see #MIME_DESCRIPTOR_MASK
+     * @see #HEADERS_MASK
+     * @see #FULL_CONTENT_MASK
+     * @see #BODY_CONTENT_MASK
+     * @see #MIME_HEADERS_MASK
+     * @see #MIME_CONTENT_MASK
+     */
     public int content() {
         return content;
     }
@@ -61,7 +80,13 @@ public class FetchGroupImpl implements MessageResult.FetchGroup {
         return "Fetch " + content;
     }
 
-    @Override
+    /**
+     * Gets contents to be fetched for contained parts. For each part to be
+     * contained, only one descriptor should be contained.
+     *
+     * @return <code>Set</code> of {@link PartContentDescriptor}, or null if
+     *         there is no part content to be fetched
+     */
     public Set<PartContentDescriptor> getPartContentDescriptors() {
         return partContentDescriptors;
     }
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/Headers.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/Headers.java
index 12e6007..52b959b 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/Headers.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/Headers.java
@@ -22,7 +22,6 @@ package org.apache.james.mailbox.model;
 import java.util.Iterator;
 
 import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.model.MessageResult.FetchGroup;
 import org.apache.james.mailbox.model.MessageResult.Header;
 
 public interface Headers extends Content {
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MessageResult.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MessageResult.java
index 12a4ae8..c85df56 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MessageResult.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MessageResult.java
@@ -23,7 +23,6 @@ import java.io.IOException;
 import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
-import java.util.Set;
 
 import javax.mail.Flags;
 
@@ -75,56 +74,6 @@ public interface MessageResult extends Comparable<MessageResult> {
 
     ModSeq getModSeq();
 
-    /**
-     * Indicates the results fetched.
-     */
-    interface FetchGroup {
-
-        /**
-         * For example: could have best performance when doing store and then
-         * forget. UIDs are always returned
-         */
-        int MINIMAL = 0x00;
-
-        /**
-         * 
-         */
-        int MIME_DESCRIPTOR = 0x01;
-
-        int HEADERS = 0x100;
-
-        int FULL_CONTENT = 0x200;
-
-        int BODY_CONTENT = 0x400;
-
-        int MIME_HEADERS = 0x800;
-
-        int MIME_CONTENT = 0x1000;
-
-        /**
-         * Contents to be fetched. Composed bitwise.
-         * 
-         * @return bitwise description
-         * @see #MINIMAL
-         * @see #MIME_DESCRIPTOR
-         * @see #HEADERS
-         * @see #FULL_CONTENT
-         * @see #BODY_CONTENT
-         * @see #MIME_HEADERS
-         * @see #MIME_CONTENT
-         */
-        int content();
-
-        /**
-         * Gets contents to be fetched for contained parts. For each part to be
-         * contained, only one descriptor should be contained.
-         * 
-         * @return <code>Set</code> of {@link PartContentDescriptor}, or null if
-         *         there is no part content to be fetched
-         */
-        Set<PartContentDescriptor> getPartContentDescriptors();
-    }
-
     MimeDescriptor getMimeDescriptor() throws MailboxException;
 
     MailboxId getMailboxId();
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/PartContentDescriptor.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/PartContentDescriptor.java
index 38a949c..2a1b815 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/PartContentDescriptor.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/PartContentDescriptor.java
@@ -44,13 +44,13 @@ public class PartContentDescriptor {
      * Contents to be fetched. Composed bitwise.
      *
      * @return bitwise descripion
-     * @see MessageResult.FetchGroup#MINIMAL
-     * @see MessageResult.FetchGroup#MIME_DESCRIPTOR
-     * @see MessageResult.FetchGroup#HEADERS
-     * @see MessageResult.FetchGroup#FULL_CONTENT
-     * @see MessageResult.FetchGroup#BODY_CONTENT
-     * @see MessageResult.FetchGroup#MIME_HEADERS
-     * @see MessageResult.FetchGroup#MIME_CONTENT
+     * @see FetchGroup#MINIMAL_MASK
+     * @see FetchGroup#MIME_DESCRIPTOR_MASK
+     * @see FetchGroup#HEADERS_MASK
+     * @see FetchGroup#FULL_CONTENT_MASK
+     * @see FetchGroup#BODY_CONTENT_MASK
+     * @see FetchGroup#MIME_HEADERS_MASK
+     * @see FetchGroup#MIME_CONTENT_MASK
      */
     public int content() {
         return content;
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
index 022294b..91bd97f 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
@@ -59,7 +59,7 @@ import org.apache.james.mailbox.exception.TooLongMailboxNameException;
 import org.apache.james.mailbox.extension.PreDeletionHook;
 import org.apache.james.mailbox.mock.DataProvisioner;
 import org.apache.james.mailbox.model.ComposedMessageId;
-import org.apache.james.mailbox.model.FetchGroupImpl;
+import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MailboxAnnotation;
 import org.apache.james.mailbox.model.MailboxAnnotationKey;
@@ -1771,7 +1771,7 @@ public abstract class MailboxManagerTest<T extends MailboxManager> {
                 assertThatThrownBy(() -> inboxManager.expunge(MessageRange.one(composeId1.getUid()), session))
                     .isInstanceOf(RuntimeException.class);
 
-                assertThat(ImmutableList.copyOf(inboxManager.getMessages(MessageRange.one(composeId1.getUid()), FetchGroupImpl.MINIMAL, session))
+                assertThat(ImmutableList.copyOf(inboxManager.getMessages(MessageRange.one(composeId1.getUid()), FetchGroup.MINIMAL, session))
                         .stream()
                         .map(MessageResult::getMessageId))
                     .hasSize(1)
@@ -1802,7 +1802,7 @@ public abstract class MailboxManagerTest<T extends MailboxManager> {
                 latchForHook1.await();
                 latchForHook2.await();
 
-                assertThat(inboxManager.getMessages(MessageRange.one(composeId1.getUid()), FetchGroupImpl.MINIMAL, session))
+                assertThat(inboxManager.getMessages(MessageRange.one(composeId1.getUid()), FetchGroup.MINIMAL, session))
                     .toIterable()
                     .isEmpty();
             }
@@ -1827,7 +1827,7 @@ public abstract class MailboxManagerTest<T extends MailboxManager> {
                 .withFlags(new Flags(Flags.Flag.DELETED))
                 .build(ClassLoaderUtils.getSystemResourceAsSharedStream("eml/twoAttachmentsApi.eml")), session);
 
-            MessageResultIterator messages = inboxManager.getMessages(MessageRange.one(composeId.getUid()), FetchGroupImpl.MINIMAL, session);
+            MessageResultIterator messages = inboxManager.getMessages(MessageRange.one(composeId.getUid()), FetchGroup.MINIMAL, session);
 
             assertThat(messages).toIterable()
                 .hasSize(1)
@@ -1841,7 +1841,7 @@ public abstract class MailboxManagerTest<T extends MailboxManager> {
                 .withFlags(new Flags(Flags.Flag.DELETED))
                 .build(message), session);
 
-            MessageResultIterator messages = inboxManager.getMessages(MessageRange.one(composeId.getUid()), FetchGroupImpl.MINIMAL, session);
+            MessageResultIterator messages = inboxManager.getMessages(MessageRange.one(composeId.getUid()), FetchGroup.MINIMAL, session);
 
             assertThat(messages).toIterable()
                 .hasSize(1)
diff --git a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/DefaultMailboxBackup.java b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/DefaultMailboxBackup.java
index 61a699d..ab708f6 100644
--- a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/DefaultMailboxBackup.java
+++ b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/DefaultMailboxBackup.java
@@ -30,7 +30,7 @@ import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.exception.BadCredentialsException;
 import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.model.FetchGroupImpl;
+import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxAnnotation;
 import org.apache.james.mailbox.model.MailboxMetaData;
@@ -128,7 +128,7 @@ public class DefaultMailboxBackup implements MailboxBackup {
             Mailbox mailbox = messageManager.getMailboxEntity();
             List<MailboxAnnotation> annotations = mailboxManager.getAllAnnotations(path, session);
             MailboxWithAnnotations mailboxWithAnnotations = new MailboxWithAnnotations(mailbox, annotations);
-            Stream<MessageResult> messages = Iterators.toStream(messageManager.getMessages(MessageRange.all(), FetchGroupImpl.FULL_CONTENT, session));
+            Stream<MessageResult> messages = Iterators.toStream(messageManager.getMessages(MessageRange.all(), FetchGroup.FULL_CONTENT, session));
             return Stream.of(new MailAccountContent(mailboxWithAnnotations, messages));
         } catch (MailboxException e) {
             LOGGER.error("Error while fetching Mailbox during backup", e);
diff --git a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultHookTest.java b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultHookTest.java
index bfe285c..f3f9b15 100644
--- a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultHookTest.java
+++ b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultHookTest.java
@@ -41,7 +41,7 @@ import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
 import org.apache.james.mailbox.model.ComposedMessageId;
-import org.apache.james.mailbox.model.FetchGroupImpl;
+import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
@@ -303,7 +303,7 @@ class DeletedMessageVaultHookTest {
     }
 
     private long messageSize(MessageManager messageManager, ComposedMessageId composedMessageId) throws MailboxException {
-        return messageManager.getMessages(MessageRange.one(composedMessageId.getUid()), FetchGroupImpl.MINIMAL, aliceSession)
+        return messageManager.getMessages(MessageRange.one(composedMessageId.getUid()), FetchGroup.MINIMAL, aliceSession)
             .next()
             .getSize();
     }
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageResultImpl.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageResultImpl.java
index 46a92c9..e3f5e05 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageResultImpl.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageResultImpl.java
@@ -33,6 +33,7 @@ import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.Content;
+import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.Headers;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageAttachment;
@@ -233,7 +234,7 @@ public class MessageResultImpl implements MessageResult {
         }
 
         public void setBody(Content body) {
-            content = content | FetchGroup.BODY_CONTENT;
+            content = content | FetchGroup.BODY_CONTENT_MASK;
             this.body = body;
         }
 
@@ -242,7 +243,7 @@ public class MessageResultImpl implements MessageResult {
         }
 
         void setMimeBody(Content mimeBody) {
-            content = content | FetchGroup.MIME_CONTENT;
+            content = content | FetchGroup.MIME_CONTENT_MASK;
             this.mimeBody = mimeBody;
         }
 
@@ -251,7 +252,7 @@ public class MessageResultImpl implements MessageResult {
         }
 
         public void setFull(Content full) {
-            content = content | FetchGroup.FULL_CONTENT;
+            content = content | FetchGroup.FULL_CONTENT_MASK;
             this.full = full;
         }
 
@@ -260,7 +261,7 @@ public class MessageResultImpl implements MessageResult {
         }
 
         public void setHeaders(Iterator<Header> headers) {
-            content = content | FetchGroup.HEADERS;
+            content = content | FetchGroup.HEADERS_MASK;
             this.headers = headers;
         }
 
@@ -269,7 +270,7 @@ public class MessageResultImpl implements MessageResult {
         }
 
         void setMimeHeaders(Iterator<Header> mimeHeaders) {
-            content = content | FetchGroup.MIME_HEADERS;
+            content = content | FetchGroup.MIME_HEADERS_MASK;
             this.mimeHeaders = mimeHeaders;
         }
     }
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/ResultUtils.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/ResultUtils.java
index b1acbe6..d3803ae 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/ResultUtils.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/ResultUtils.java
@@ -27,8 +27,8 @@ import java.util.List;
 
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.Content;
+import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.MessageResult;
-import org.apache.james.mailbox.model.MessageResult.FetchGroup;
 import org.apache.james.mailbox.model.MimePath;
 import org.apache.james.mailbox.model.PartContentDescriptor;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
@@ -100,17 +100,17 @@ public class ResultUtils {
             if (fetchGroup != null) {
                 int content = fetchGroup.content();
 
-                if ((content & FetchGroup.HEADERS) > 0) {
-                    content -= FetchGroup.HEADERS;
+                if ((content & FetchGroup.HEADERS_MASK) > 0) {
+                    content -= FetchGroup.HEADERS_MASK;
                 }
-                if ((content & FetchGroup.BODY_CONTENT) > 0) {
-                    content -= FetchGroup.BODY_CONTENT;
+                if ((content & FetchGroup.BODY_CONTENT_MASK) > 0) {
+                    content -= FetchGroup.BODY_CONTENT_MASK;
                 }
-                if ((content & FetchGroup.FULL_CONTENT) > 0) {
-                    content -= FetchGroup.FULL_CONTENT;
+                if ((content & FetchGroup.FULL_CONTENT_MASK) > 0) {
+                    content -= FetchGroup.FULL_CONTENT_MASK;
                 }
-                if ((content & FetchGroup.MIME_DESCRIPTOR) > 0) {
-                    content -= FetchGroup.MIME_DESCRIPTOR;
+                if ((content & FetchGroup.MIME_DESCRIPTOR_MASK) > 0) {
+                    content -= FetchGroup.MIME_DESCRIPTOR_MASK;
                 }
                 if (content != 0) {
                     throw new UnsupportedOperationException("Unsupported result: " + content);
@@ -140,19 +140,19 @@ public class ResultUtils {
             throws MailboxException, IOException, MimeException {
         MimePath mimePath = descriptor.path();
         int content = descriptor.content();
-        if ((content & MessageResult.FetchGroup.FULL_CONTENT) > 0) {
+        if ((content & FetchGroup.FULL_CONTENT_MASK) > 0) {
             addFullContent(message, messageResult, mimePath);
         }
-        if ((content & MessageResult.FetchGroup.BODY_CONTENT) > 0) {
+        if ((content & FetchGroup.BODY_CONTENT_MASK) > 0) {
             addBodyContent(message, messageResult, mimePath);
         }
-        if ((content & MessageResult.FetchGroup.MIME_CONTENT) > 0) {
+        if ((content & FetchGroup.MIME_CONTENT_MASK) > 0) {
             addMimeBodyContent(message, messageResult, mimePath);
         }
-        if ((content & MessageResult.FetchGroup.HEADERS) > 0) {
+        if ((content & FetchGroup.HEADERS_MASK) > 0) {
             addHeaders(message, messageResult, mimePath);
         }
-        if ((content & MessageResult.FetchGroup.MIME_HEADERS) > 0) {
+        if ((content & FetchGroup.MIME_HEADERS_MASK) > 0) {
             addMimeHeaders(message, messageResult, mimePath);
         }
     }
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreBlobManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreBlobManager.java
index 0b85405..85eba76 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreBlobManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreBlobManager.java
@@ -35,7 +35,7 @@ import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.Blob;
 import org.apache.james.mailbox.model.BlobId;
-import org.apache.james.mailbox.model.FetchGroupImpl;
+import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.MessageId;
 
 import com.github.fge.lambdas.Throwing;
@@ -97,7 +97,7 @@ public class StoreBlobManager implements BlobManager {
 
     private Optional<InputStream> loadMessageAsBlob(MessageId messageId, MailboxSession mailboxSession)  {
         try {
-            return messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.FULL_CONTENT, mailboxSession)
+            return messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.FULL_CONTENT, mailboxSession)
                 .stream()
                 .map(Throwing.function(message -> message.getFullContent().getInputStream()))
                 .findFirst();
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
index 229638e..2170733 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
@@ -43,6 +43,7 @@ import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MailboxNotFoundException;
 import org.apache.james.mailbox.extension.PreDeletionHook;
 import org.apache.james.mailbox.model.DeleteResult;
+import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxACL.Right;
 import org.apache.james.mailbox.model.MailboxId;
@@ -136,7 +137,7 @@ public class StoreMessageIdManager implements MessageIdManager {
     }
 
     @Override
-    public List<MessageResult> getMessages(List<MessageId> messageIds, MessageResult.FetchGroup fetchGroup, MailboxSession mailboxSession) throws MailboxException {
+    public List<MessageResult> getMessages(List<MessageId> messageIds, FetchGroup fetchGroup, MailboxSession mailboxSession) throws MailboxException {
         MessageIdMapper messageIdMapper = mailboxSessionMapperFactory.getMessageIdMapper(mailboxSession);
 
         MessageMapper.FetchType fetchType = FetchGroupConverter.getFetchType(fetchGroup);
@@ -406,7 +407,7 @@ public class StoreMessageIdManager implements MessageIdManager {
         messageIdMapper.copyInMailbox(mailboxMessage);
     }
 
-    private ThrowingFunction<MailboxMessage, MessageResult> messageResultConverter(MessageResult.FetchGroup fetchGroup) {
+    private ThrowingFunction<MailboxMessage, MessageResult> messageResultConverter(FetchGroup fetchGroup) {
         return input -> ResultUtils.loadMessageResult(input, fetchGroup);
     }
 
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
index b7e5df3..d985641 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
@@ -59,6 +59,7 @@ import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.ReadOnlyException;
 import org.apache.james.mailbox.exception.UnsupportedRightException;
 import org.apache.james.mailbox.model.ComposedMessageId;
+import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MailboxCounters;
@@ -70,7 +71,6 @@ import org.apache.james.mailbox.model.MessageId.Factory;
 import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.MessageMoves;
 import org.apache.james.mailbox.model.MessageRange;
-import org.apache.james.mailbox.model.MessageResult.FetchGroup;
 import org.apache.james.mailbox.model.MessageResultIterator;
 import org.apache.james.mailbox.model.SearchQuery;
 import org.apache.james.mailbox.model.UpdatedFlags;
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageResultIterator.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageResultIterator.java
index aec7a7d..dfdf2ce 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageResultIterator.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageResultIterator.java
@@ -32,6 +32,7 @@ import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.Content;
+import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.Headers;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxId;
@@ -41,7 +42,6 @@ import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.MessageRange.Type;
 import org.apache.james.mailbox.model.MessageResult;
-import org.apache.james.mailbox.model.MessageResult.FetchGroup;
 import org.apache.james.mailbox.model.MessageResultIterator;
 import org.apache.james.mailbox.model.MimeDescriptor;
 import org.apache.james.mailbox.model.MimePath;
@@ -66,7 +66,7 @@ public class StoreMessageResultIterator implements MessageResultIterator {
     private final MessageMapper mapper;
     private final FetchType ftype;
 
-    public StoreMessageResultIterator(MessageMapper mapper, Mailbox mailbox, MessageRange range, BatchSizes batchSizes, org.apache.james.mailbox.model.MessageResult.FetchGroup group) {
+    public StoreMessageResultIterator(MessageMapper mapper, Mailbox mailbox, MessageRange range, BatchSizes batchSizes, FetchGroup group) {
         this.mailbox = mailbox;
         this.group = group;
         this.mapper = mapper;
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/FetchGroupConverter.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/FetchGroupConverter.java
index d280172..cfd91fb 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/FetchGroupConverter.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/FetchGroupConverter.java
@@ -19,42 +19,42 @@
 
 package org.apache.james.mailbox.store.mail;
 
-import org.apache.james.mailbox.model.MessageResult;
+import org.apache.james.mailbox.model.FetchGroup;
 
 public class FetchGroupConverter {
     /**
-     * Use the passed {@link MessageResult.FetchGroup} and calculate the right
+     * Use the passed {@link FetchGroup} and calculate the right
      * {@link MessageMapper.FetchType} for it
      */
-    public static MessageMapper.FetchType getFetchType(MessageResult.FetchGroup group) {
+    public static MessageMapper.FetchType getFetchType(FetchGroup group) {
         int content = group.content();
         boolean headers = false;
         boolean body = false;
         boolean full = false;
 
-        if ((content & MessageResult.FetchGroup.HEADERS) > 0) {
+        if ((content & FetchGroup.HEADERS_MASK) > 0) {
             headers = true;
-            content -= MessageResult.FetchGroup.HEADERS;
+            content -= FetchGroup.HEADERS_MASK;
         }
         if (group.getPartContentDescriptors().size() > 0) {
             full = true;
         }
-        if ((content & MessageResult.FetchGroup.BODY_CONTENT) > 0) {
+        if ((content & FetchGroup.BODY_CONTENT_MASK) > 0) {
             body = true;
-            content -= MessageResult.FetchGroup.BODY_CONTENT;
+            content -= FetchGroup.BODY_CONTENT_MASK;
         }
 
-        if ((content & MessageResult.FetchGroup.FULL_CONTENT) > 0) {
+        if ((content & FetchGroup.FULL_CONTENT_MASK) > 0) {
             full = true;
-            content -= MessageResult.FetchGroup.FULL_CONTENT;
+            content -= FetchGroup.FULL_CONTENT_MASK;
         }
 
-        if ((content & MessageResult.FetchGroup.MIME_DESCRIPTOR) > 0) {
+        if ((content & FetchGroup.MIME_DESCRIPTOR_MASK) > 0) {
             // If we need the mimedescriptor we MAY need the full content later
             // too.
             // This gives us no other choice then request it
             full = true;
-            content -= MessageResult.FetchGroup.MIME_DESCRIPTOR;
+            content -= FetchGroup.MIME_DESCRIPTOR_MASK;
         }
         if (full || (body && headers)) {
             return MessageMapper.FetchType.Full;
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractCombinationManagerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractCombinationManagerTest.java
index 15e934b..344d673 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractCombinationManagerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractCombinationManagerTest.java
@@ -36,11 +36,10 @@ import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageManager.FlagsUpdateMode;
-import org.apache.james.mailbox.MessageManager.MetaData.FetchGroup;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.fixture.MailboxFixture;
 import org.apache.james.mailbox.model.ComposedMessageId;
-import org.apache.james.mailbox.model.FetchGroupImpl;
+import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.MessageRange;
@@ -128,7 +127,7 @@ public abstract class AbstractCombinationManagerTest {
         messageIdManager.setInMailboxes(messageId,
             ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
 
-        MessageUid uidInMailbox2 = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, session)
+        MessageUid uidInMailbox2 = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, session)
             .get(0)
             .getUid();
 
@@ -176,7 +175,7 @@ public abstract class AbstractCombinationManagerTest {
         messageManager1.setFlags(deleted, FlagsUpdateMode.ADD, MessageRange.all(), session);
         messageManager1.expunge(MessageRange.all(), session);
 
-        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, session)).isEmpty();
+        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, session)).isEmpty();
     }
 
     @Test
@@ -211,7 +210,7 @@ public abstract class AbstractCombinationManagerTest {
         MessageId messageId = messageManager1.appendMessage(MessageManager.AppendCommand.from(mailContent), session)
             .getMessageId();
 
-        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, session)).hasSize(1);
+        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, session)).hasSize(1);
     }
 
     @Test
@@ -221,7 +220,7 @@ public abstract class AbstractCombinationManagerTest {
 
         mailboxManager.copyMessages(MessageRange.all(), mailbox1.getMailboxId(), mailbox2.getMailboxId(), session);
 
-        List<MessageResult> listMessages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, session);
+        List<MessageResult> listMessages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, session);
 
         assertThat(listMessages).hasSize(2)
             .extractingResultOf("getMailboxId")
@@ -235,7 +234,7 @@ public abstract class AbstractCombinationManagerTest {
 
         mailboxManager.copyMessages(MessageRange.all(), MailboxFixture.INBOX_ALICE, MailboxFixture.OUTBOX_ALICE, session);
 
-        List<MessageResult> listMessages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, session);
+        List<MessageResult> listMessages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, session);
 
         assertThat(listMessages).hasSize(2)
             .extractingResultOf("getMailboxId")
@@ -249,7 +248,7 @@ public abstract class AbstractCombinationManagerTest {
 
         mailboxManager.moveMessages(MessageRange.all(), MailboxFixture.INBOX_ALICE, MailboxFixture.OUTBOX_ALICE, session);
 
-        List<MessageResult> listMessages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, session);
+        List<MessageResult> listMessages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, session);
 
         assertThat(listMessages).hasSize(1)
             .extractingResultOf("getMailboxId")
@@ -263,7 +262,7 @@ public abstract class AbstractCombinationManagerTest {
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
 
-        assertThat(messageManager2.getMessages(MessageRange.all(), FetchGroupImpl.MINIMAL, session))
+        assertThat(messageManager2.getMessages(MessageRange.all(), FetchGroup.MINIMAL, session))
             .toIterable()
             .hasSize(1);
     }
@@ -276,10 +275,10 @@ public abstract class AbstractCombinationManagerTest {
                 .withFlags(recent)
                 .build(mailContent), session);
 
-        long mailbox2NextUid = messageManager2.getMetaData(true, session, FetchGroup.UNSEEN_COUNT).getUidNext().asLong();
+        long mailbox2NextUid = messageManager2.getMetaData(true, session, MessageManager.MetaData.FetchGroup.UNSEEN_COUNT).getUidNext().asLong();
         messageIdManager.setInMailboxes(messageId.getMessageId(), ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
 
-        List<MessageUid> messageUids = messageManager2.getMetaData(true, session, FetchGroup.UNSEEN_COUNT).getRecent();
+        List<MessageUid> messageUids = messageManager2.getMetaData(true, session, MessageManager.MetaData.FetchGroup.UNSEEN_COUNT).getRecent();
 
         assertThat(messageUids).hasSize(1);
         assertThat(messageUids.get(0).asLong()).isGreaterThanOrEqualTo(mailbox2NextUid);
@@ -296,7 +295,7 @@ public abstract class AbstractCombinationManagerTest {
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
 
-        assertThat(messageManager2.getMetaData(true, session, FetchGroup.FIRST_UNSEEN).countRecent()).isEqualTo(1);
+        assertThat(messageManager2.getMetaData(true, session, MessageManager.MetaData.FetchGroup.FIRST_UNSEEN).countRecent()).isEqualTo(1);
     }
 
     @Test
@@ -309,7 +308,7 @@ public abstract class AbstractCombinationManagerTest {
 
         messageIdManager.setInMailboxes(messageId.getMessageId(), ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
 
-        List<MessageResult> listMessages = messageIdManager.getMessages(ImmutableList.of(messageId.getMessageId()), FetchGroupImpl.MINIMAL, session);
+        List<MessageResult> listMessages = messageIdManager.getMessages(ImmutableList.of(messageId.getMessageId()), FetchGroup.MINIMAL, session);
 
         long uid2 = listMessages.stream()
             .filter(messageInMailbox2())
@@ -318,7 +317,7 @@ public abstract class AbstractCombinationManagerTest {
             .getUid()
             .asLong();
 
-        assertThat(messageManager2.getMetaData(true, session, FetchGroup.FIRST_UNSEEN).getUidNext().asLong())
+        assertThat(messageManager2.getMetaData(true, session, MessageManager.MetaData.FetchGroup.FIRST_UNSEEN).getUidNext().asLong())
             .isGreaterThan(uid2);
     }
 
@@ -329,7 +328,7 @@ public abstract class AbstractCombinationManagerTest {
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
 
-        assertThat(messageManager2.getMetaData(true, session, FetchGroup.FIRST_UNSEEN).getHighestModSeq().asLong()).isNotNegative();
+        assertThat(messageManager2.getMetaData(true, session, MessageManager.MetaData.FetchGroup.FIRST_UNSEEN).getHighestModSeq().asLong()).isNotNegative();
     }
 
     @Test
@@ -339,7 +338,7 @@ public abstract class AbstractCombinationManagerTest {
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
 
-        assertThat(messageManager2.getMetaData(true, session, FetchGroup.FIRST_UNSEEN).getMessageCount()).isEqualTo(1);
+        assertThat(messageManager2.getMetaData(true, session, MessageManager.MetaData.FetchGroup.FIRST_UNSEEN).getMessageCount()).isEqualTo(1);
     }
 
     @Test
@@ -349,7 +348,7 @@ public abstract class AbstractCombinationManagerTest {
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
 
-        assertThat(messageManager2.getMetaData(true, session, FetchGroup.UNSEEN_COUNT).getUnseenCount()).isEqualTo(1);
+        assertThat(messageManager2.getMetaData(true, session, MessageManager.MetaData.FetchGroup.UNSEEN_COUNT).getUnseenCount()).isEqualTo(1);
     }
 
     @Test
@@ -358,7 +357,7 @@ public abstract class AbstractCombinationManagerTest {
 
         messageIdManager.setInMailboxes(messageId.getMessageId(), ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
 
-        assertThat(messageManager2.getMetaData(true, session, FetchGroup.FIRST_UNSEEN).getFirstUnseen()).isEqualTo(messageId.getUid());
+        assertThat(messageManager2.getMetaData(true, session, MessageManager.MetaData.FetchGroup.FIRST_UNSEEN).getFirstUnseen()).isEqualTo(messageId.getUid());
     }
 
     @Test
@@ -369,7 +368,7 @@ public abstract class AbstractCombinationManagerTest {
 
         messageIdManager.setFlags(newFlag, FlagsUpdateMode.ADD, messageId, ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
 
-        assertThat(messageManager1.getMetaData(true, session, FetchGroup.UNSEEN_COUNT).getUnseenCount()).isEqualTo(1);
+        assertThat(messageManager1.getMetaData(true, session, MessageManager.MetaData.FetchGroup.UNSEEN_COUNT).getUnseenCount()).isEqualTo(1);
     }
 
     @Test
@@ -379,7 +378,7 @@ public abstract class AbstractCombinationManagerTest {
 
         messageIdManager.setFlags(newFlag, FlagsUpdateMode.ADD, messageId.getMessageId(), ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
 
-        assertThat(messageManager1.getMetaData(true, session, FetchGroup.FIRST_UNSEEN).getFirstUnseen()).isEqualTo(messageId.getUid());
+        assertThat(messageManager1.getMetaData(true, session, MessageManager.MetaData.FetchGroup.FIRST_UNSEEN).getFirstUnseen()).isEqualTo(messageId.getUid());
     }
 
     @Test
@@ -389,10 +388,10 @@ public abstract class AbstractCombinationManagerTest {
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(mailbox2.getMailboxId()), session);
 
-        assertThat(messageManager1.getMessages(MessageRange.all(), FetchGroupImpl.MINIMAL, session))
+        assertThat(messageManager1.getMessages(MessageRange.all(), FetchGroup.MINIMAL, session))
             .toIterable()
             .isEmpty();
-        assertThat(messageManager2.getMessages(MessageRange.all(), FetchGroupImpl.MINIMAL, session))
+        assertThat(messageManager2.getMessages(MessageRange.all(), FetchGroup.MINIMAL, session))
             .toIterable()
             .hasSize(1)
             .extracting(MessageResult::getMessageId)
@@ -502,7 +501,7 @@ public abstract class AbstractCombinationManagerTest {
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
 
-        MessageUid uid2 = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, session)
+        MessageUid uid2 = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, session)
             .stream()
             .filter(messageInMailbox2())
             .findFirst()
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java
index de0169f..60124c3 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java
@@ -55,7 +55,7 @@ import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.OverQuotaException;
 import org.apache.james.mailbox.extension.PreDeletionHook;
 import org.apache.james.mailbox.fixture.MailboxFixture;
-import org.apache.james.mailbox.model.FetchGroupImpl;
+import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.MessageMetaData;
@@ -134,7 +134,7 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
         givenUnlimitedQuota();
         MessageId messageId = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS, session);
 
-        MessageResult messageResult = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, session).get(0);
+        MessageResult messageResult = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, session).get(0);
         MessageMetaData simpleMessageMetaData = messageResult.messageMetaData();
 
         eventBus.register(eventCollector);
@@ -158,9 +158,9 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
         MessageId messageId1 = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS, session);
         MessageId messageId2 = testingData.persist(mailbox1.getMailboxId(), messageUid2, FLAGS, session);
 
-        MessageResult messageResult1 = messageIdManager.getMessages(ImmutableList.of(messageId1), FetchGroupImpl.MINIMAL, session).get(0);
+        MessageResult messageResult1 = messageIdManager.getMessages(ImmutableList.of(messageId1), FetchGroup.MINIMAL, session).get(0);
         MessageMetaData simpleMessageMetaData1 = messageResult1.messageMetaData();
-        MessageResult messageResult2 = messageIdManager.getMessages(ImmutableList.of(messageId2), FetchGroupImpl.MINIMAL, session).get(0);
+        MessageResult messageResult2 = messageIdManager.getMessages(ImmutableList.of(messageId2), FetchGroup.MINIMAL, session).get(0);
         MessageMetaData simpleMessageMetaData2 = messageResult2.messageMetaData();
 
         eventBus.register(eventCollector);
@@ -275,7 +275,7 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
         assertThatThrownBy(() -> messageIdManager.delete(messageId, ImmutableList.of(mailbox1.getMailboxId()), session))
             .isInstanceOf(RuntimeException.class);
 
-        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, session)
+        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, session)
                 .stream()
                 .map(MessageResult::getMessageId))
             .hasSize(1)
@@ -306,7 +306,7 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
         latchForHook1.await();
         latchForHook2.await();
 
-        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, session))
+        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, session))
             .isEmpty();
     }
 
@@ -343,7 +343,7 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
         eventBus.register(eventCollector);
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId(), mailbox3.getMailboxId()), session);
 
-        messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, session);
+        messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, session);
 
         assertThat(eventCollector.getEvents()).filteredOn(event -> event instanceof MessageMoveEvent).hasSize(1);
         assertThat(eventCollector.getEvents()).filteredOn(event -> event instanceof MailboxListener.Added).hasSize(2)
@@ -373,7 +373,7 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
         MessageId messageId = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS, session);
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
 
-        List<MessageResult> messageResults = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, session);
+        List<MessageResult> messageResults = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, session);
         assertThat(messageResults).hasSize(2);
 
         eventBus.register(eventCollector);
@@ -459,7 +459,7 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
         Flags newFlags = new Flags(Flags.Flag.SEEN);
         messageIdManager.setFlags(newFlags, MessageManager.FlagsUpdateMode.ADD, messageId, ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
 
-        List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, session);
+        List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, session);
         assertThat(messages).hasSize(1);
         MessageResult messageResult = messages.get(0);
         MessageUid messageUid = messageResult.getUid();
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerStorageTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerStorageTest.java
index 2874746..ac79368 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerStorageTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerStorageTest.java
@@ -40,7 +40,7 @@ import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MailboxNotFoundException;
 import org.apache.james.mailbox.fixture.MailboxFixture;
 import org.apache.james.mailbox.model.DeleteResult;
-import org.apache.james.mailbox.model.FetchGroupImpl;
+import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MailboxACL.Rfc4314Rights;
@@ -92,7 +92,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     void getMessagesShouldReturnEmptyListWhenMessageIdNotUsed() throws Exception {
         MessageId messageId = testingData.createNotUsedMessageId();
 
-        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, aliceSession))
+        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession))
             .isEmpty();
     }
 
@@ -122,7 +122,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     void getMessagesShouldReturnStoredResults() throws Exception {
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
 
-        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, aliceSession))
+        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession))
             .hasSize(1);
     }
 
@@ -130,8 +130,8 @@ public abstract class AbstractMessageIdManagerStorageTest {
     void getMessageShouldReturnOnlyMessageBelongingToCurrentUser() throws Exception {
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
 
-        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, aliceSession)).hasSize(1);
-        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, bobSession)).isEmpty();
+        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession)).hasSize(1);
+        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, bobSession)).isEmpty();
     }
 
     @Test
@@ -140,7 +140,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(aliceMailbox1.getMailboxId(), aliceMailbox2.getMailboxId()), aliceSession);
 
-        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, aliceSession))
+        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession))
             .hasSize(2);
     }
 
@@ -150,7 +150,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(aliceMailbox1.getMailboxId()), aliceSession);
 
-        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, aliceSession))
+        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession))
             .hasSize(1);
     }
 
@@ -161,10 +161,10 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.setInMailboxes(messageId2, ImmutableList.of(aliceMailbox1.getMailboxId()), aliceSession);
 
-        MessageUid uidMessage1Mailbox1 = messageIdManager.getMessages(ImmutableList.of(messageId1), FetchGroupImpl.MINIMAL, aliceSession)
+        MessageUid uidMessage1Mailbox1 = messageIdManager.getMessages(ImmutableList.of(messageId1), FetchGroup.MINIMAL, aliceSession)
             .get(0)
             .getUid();
-        MessageUid uidMessage2Mailbox1 = messageIdManager.getMessages(ImmutableList.of(messageId2), FetchGroupImpl.MINIMAL, aliceSession)
+        MessageUid uidMessage2Mailbox1 = messageIdManager.getMessages(ImmutableList.of(messageId2), FetchGroup.MINIMAL, aliceSession)
             .stream()
             .filter(inMailbox(aliceMailbox1.getMailboxId()))
             .findFirst()
@@ -181,10 +181,10 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.setInMailboxes(messageId2, ImmutableList.of(aliceMailbox1.getMailboxId(), aliceMailbox2.getMailboxId()), aliceSession);
 
-        ModSeq modSeqMessage1Mailbox1 = messageIdManager.getMessages(ImmutableList.of(messageId1), FetchGroupImpl.MINIMAL, aliceSession)
+        ModSeq modSeqMessage1Mailbox1 = messageIdManager.getMessages(ImmutableList.of(messageId1), FetchGroup.MINIMAL, aliceSession)
             .get(0)
             .getModSeq();
-        ModSeq modSeqMessage2Mailbox1 = messageIdManager.getMessages(ImmutableList.of(messageId2), FetchGroupImpl.MINIMAL, aliceSession)
+        ModSeq modSeqMessage2Mailbox1 = messageIdManager.getMessages(ImmutableList.of(messageId2), FetchGroup.MINIMAL, aliceSession)
             .stream()
             .filter(inMailbox(aliceMailbox1.getMailboxId()))
             .findFirst()
@@ -197,13 +197,13 @@ public abstract class AbstractMessageIdManagerStorageTest {
     @Test
     void setInMailboxesShouldNotChangeUidAndModSeqInOriginalMailbox() throws Exception {
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
-        MessageResult messageResult1 = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, aliceSession).get(0);
+        MessageResult messageResult1 = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession).get(0);
         MessageUid messageUid1 = messageResult1.getUid();
         ModSeq modSeq1 = messageResult1.getModSeq();
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(aliceMailbox1.getMailboxId(), aliceMailbox2.getMailboxId()), aliceSession);
 
-        MessageResult messageResult2 = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, aliceSession)
+        MessageResult messageResult2 = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession)
             .stream()
             .filter(inMailbox(aliceMailbox1.getMailboxId()))
             .findFirst()
@@ -221,7 +221,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(aliceMailbox1.getMailboxId(), aliceMailbox2.getMailboxId()), aliceSession);
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(aliceMailbox1.getMailboxId(), aliceMailbox3.getMailboxId()), aliceSession);
 
-        List<MailboxId> messageMailboxIds = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, aliceSession)
+        List<MailboxId> messageMailboxIds = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession)
             .stream()
             .map(MessageResult::getMailboxId)
             .collect(Guavate.toImmutableList());
@@ -238,7 +238,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(aliceMailbox1.getMailboxId(), aliceMailbox3.getMailboxId()), aliceSession);
 
-        MessageResult messageResult3 = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, aliceSession)
+        MessageResult messageResult3 = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession)
             .stream()
             .filter(inMailbox(aliceMailbox3.getMailboxId()))
             .findFirst()
@@ -272,7 +272,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(aliceMailbox1.getMailboxId()), aliceSession);
 
-        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, aliceSession)).isEmpty();
+        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession)).isEmpty();
     }
 
     @Test
@@ -281,7 +281,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.delete(messageId, ImmutableList.of(aliceMailbox1.getMailboxId()), aliceSession);
 
-        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, aliceSession)).isEmpty();
+        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession)).isEmpty();
     }
 
     @Test
@@ -290,7 +290,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.delete(messageId, aliceSession);
 
-        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, aliceSession)).isEmpty();
+        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession)).isEmpty();
     }
 
     @Test
@@ -300,7 +300,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.delete(messageId, ImmutableList.of(aliceMailbox1.getMailboxId()), aliceSession);
 
-        List<MessageResult> messageResults = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, aliceSession);
+        List<MessageResult> messageResults = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession);
         assertThat(messageResults).hasSize(1);
         assertThat(messageResults.get(0).getMailboxId()).isEqualTo(aliceMailbox2.getMailboxId());
     }
@@ -312,7 +312,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.delete(messageId, aliceSession);
 
-        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, aliceSession)).isEmpty();
+        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession)).isEmpty();
     }
 
     @Test
@@ -321,7 +321,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.delete(messageId, ImmutableList.of(aliceMailbox2.getMailboxId()), aliceSession);
 
-        List<MessageResult> messageResults = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, aliceSession);
+        List<MessageResult> messageResults = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession);
         assertThat(messageResults).hasSize(1);
         assertThat(messageResults.get(0).getMailboxId()).isEqualTo(aliceMailbox1.getMailboxId());
     }
@@ -365,7 +365,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.setFlags(newFlags, MessageManager.FlagsUpdateMode.ADD, messageId, ImmutableList.of(aliceMailbox1.getMailboxId()), aliceSession);
 
-        MessageResult messageResult = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, aliceSession).get(0);
+        MessageResult messageResult = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession).get(0);
         assertThat(messageResult.getFlags()).isEqualTo(newFlags);
     }
 
@@ -374,12 +374,12 @@ public abstract class AbstractMessageIdManagerStorageTest {
         Flags newFlags = new Flags(Flags.Flag.SEEN);
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
 
-        MessageResult messageResult1 = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, aliceSession).get(0);
+        MessageResult messageResult1 = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession).get(0);
         MessageUid messageUid1 = messageResult1.getUid();
 
         messageIdManager.setFlags(newFlags, MessageManager.FlagsUpdateMode.ADD, messageId, ImmutableList.of(aliceMailbox1.getMailboxId()), aliceSession);
 
-        MessageResult messageResult2 = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, aliceSession).get(0);
+        MessageResult messageResult2 = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession).get(0);
         MessageUid messageUid2 = messageResult2.getUid();
 
         assertThat(messageUid2).isEqualTo(messageUid1);
@@ -390,12 +390,12 @@ public abstract class AbstractMessageIdManagerStorageTest {
         Flags newFlags = new Flags(Flags.Flag.SEEN);
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
 
-        MessageResult messageResult1 = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, aliceSession).get(0);
+        MessageResult messageResult1 = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession).get(0);
         ModSeq modSeq1 = messageResult1.getModSeq();
 
         messageIdManager.setFlags(newFlags, MessageManager.FlagsUpdateMode.ADD, messageId, ImmutableList.of(aliceMailbox1.getMailboxId()), aliceSession);
 
-        MessageResult messageResult2 = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, aliceSession).get(0);
+        MessageResult messageResult2 = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession).get(0);
         ModSeq modSeq2 = messageResult2.getModSeq();
 
         assertThat(modSeq2).isGreaterThan(modSeq1);
@@ -409,7 +409,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.setFlags(newFlags, MessageManager.FlagsUpdateMode.ADD, messageId, ImmutableList.of(aliceMailbox1.getMailboxId(), aliceMailbox2.getMailboxId()), aliceSession);
 
-        List<Flags> flags = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, aliceSession)
+        List<Flags> flags = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession)
             .stream()
             .map(MessageResult::getFlags)
             .collect(Guavate.toImmutableList());
@@ -427,7 +427,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.setFlags(newFlags, MessageManager.FlagsUpdateMode.ADD, messageId2, ImmutableList.of(aliceMailbox1.getMailboxId()), aliceSession);
 
-        List<Flags> flags = messageIdManager.getMessages(ImmutableList.of(messageId1), FetchGroupImpl.MINIMAL, aliceSession)
+        List<Flags> flags = messageIdManager.getMessages(ImmutableList.of(messageId1), FetchGroup.MINIMAL, aliceSession)
             .stream()
             .map(MessageResult::getFlags)
             .collect(Guavate.toImmutableList());
@@ -443,7 +443,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.setFlags(newFlags, MessageManager.FlagsUpdateMode.ADD, messageId1, ImmutableList.of(), aliceSession);
 
-        List<Flags> flags = messageIdManager.getMessages(ImmutableList.of(messageId1), FetchGroupImpl.MINIMAL, aliceSession)
+        List<Flags> flags = messageIdManager.getMessages(ImmutableList.of(messageId1), FetchGroup.MINIMAL, aliceSession)
             .stream()
             .map(MessageResult::getFlags)
             .collect(Guavate.toImmutableList());
@@ -459,7 +459,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.setFlags(newFlags, MessageManager.FlagsUpdateMode.ADD, messageId1, ImmutableList.of(aliceMailbox2.getMailboxId()), aliceSession);
 
-        List<Flags> flags = messageIdManager.getMessages(ImmutableList.of(messageId1), FetchGroupImpl.MINIMAL, aliceSession)
+        List<Flags> flags = messageIdManager.getMessages(ImmutableList.of(messageId1), FetchGroup.MINIMAL, aliceSession)
             .stream()
             .map(MessageResult::getFlags)
             .collect(Guavate.toImmutableList());
@@ -476,7 +476,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.setFlags(newFlags, MessageManager.FlagsUpdateMode.ADD, messageId1, ImmutableList.of(aliceMailbox1.getMailboxId(), aliceMailbox2.getMailboxId()), aliceSession);
 
-        Map<MessageId, Flags> flags = messageIdManager.getMessages(ImmutableList.of(messageId1, messageId2), FetchGroupImpl.MINIMAL, aliceSession)
+        Map<MessageId, Flags> flags = messageIdManager.getMessages(ImmutableList.of(messageId1, messageId2), FetchGroup.MINIMAL, aliceSession)
             .stream()
             .collect(Guavate.toImmutableMap(MessageResult::getMessageId, MessageResult::getFlags));
 
@@ -530,7 +530,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         testingData.deleteMailbox(aliceMailbox1.getMailboxId(), aliceSession);
 
-        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, aliceSession)).isEmpty();
+        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession)).isEmpty();
     }
 
     @Test
@@ -540,7 +540,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         testingData.deleteMailbox(aliceMailbox1.getMailboxId(), aliceSession);
 
-        List<MessageResult> messageResults = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, aliceSession);
+        List<MessageResult> messageResults = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession);
         assertThat(messageResults).hasSize(1);
         assertThat(messageResults.get(0).getMailboxId()).isEqualTo(aliceMailbox2.getMailboxId());
     }
@@ -589,7 +589,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
 
         List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId),
-            FetchGroupImpl.MINIMAL, bobSession);
+            FetchGroup.MINIMAL, bobSession);
 
         assertThat(messages)
             .extracting(MessageResult::getMessageId)
@@ -607,7 +607,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
             aliceSession);
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
 
-        List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, bobSession);
+        List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, bobSession);
 
         assertThat(messages)
             .isEmpty();
@@ -628,7 +628,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
         messageIdManager.setFlags(newFlags, MessageManager.FlagsUpdateMode.REPLACE,
             messageId, ImmutableList.of(aliceMailbox1.getMailboxId()), bobSession);
 
-        List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, aliceSession);
+        List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession);
         assertThat(messages)
             .extracting(MessageResult::getFlags)
             .containsOnly(newFlags);
@@ -650,7 +650,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
                 messageId, ImmutableList.of(aliceMailbox1.getMailboxId()), bobSession))
             .isInstanceOf(MailboxNotFoundException.class);
 
-        List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, aliceSession);
+        List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession);
         assertThat(messages)
             .extracting(MessageResult::getFlags)
             .containsOnly(FLAGS);
@@ -672,7 +672,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(aliceMailbox1.getMailboxId(), bobMailbox1.getMailboxId()), bobSession);
 
         //Then
-        List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, bobSession);
+        List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, bobSession);
         assertThat(messages)
             .extracting(MessageResult::getMessageId)
             .containsOnly(messageId, messageId);
@@ -703,7 +703,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
         //Then
         List<MessageResult> messages = messageIdManager.getMessages(
             ImmutableList.of(messageId),
-            FetchGroupImpl.MINIMAL,
+            FetchGroup.MINIMAL,
             bobSession);
         assertThat(messages)
             .isEmpty();
@@ -727,7 +727,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
         //Then
         List<MessageResult> messages = messageIdManager.getMessages(
             ImmutableList.of(messageId),
-            FetchGroupImpl.MINIMAL,
+            FetchGroup.MINIMAL,
             aliceSession);
         assertThat(messages)
             .extracting(MessageResult::getMessageId)
@@ -759,7 +759,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
         //Then
         List<MessageResult> messages = messageIdManager.getMessages(
             ImmutableList.of(messageId),
-            FetchGroupImpl.MINIMAL,
+            FetchGroup.MINIMAL,
             bobSession);
         assertThat(messages)
             .extracting(MessageResult::getMessageId)
@@ -787,7 +787,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
         //Then
         List<MessageResult> messages = messageIdManager.getMessages(
             ImmutableList.of(messageId),
-            FetchGroupImpl.MINIMAL,
+            FetchGroup.MINIMAL,
             bobSession);
         assertThat(messages)
             .extracting(MessageResult::getMessageId)
@@ -819,7 +819,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
         //Then
         List<MessageResult> messages = messageIdManager.getMessages(
             ImmutableList.of(messageId),
-            FetchGroupImpl.MINIMAL,
+            FetchGroup.MINIMAL,
             bobSession);
         assertThat(messages)
             .extracting(MessageResult::getMessageId)
@@ -850,7 +850,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
         //Then
         List<MessageResult> messagesForSharee = messageIdManager.getMessages(
             ImmutableList.of(messageId),
-            FetchGroupImpl.MINIMAL,
+            FetchGroup.MINIMAL,
             bobSession);
         assertThat(messagesForSharee)
             .extracting(MessageResult::getMessageId)
@@ -861,7 +861,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         List<MessageResult> messagesForOwner = messageIdManager.getMessages(
             ImmutableList.of(messageId),
-            FetchGroupImpl.MINIMAL,
+            FetchGroup.MINIMAL,
             aliceSession);
         assertThat(messagesForOwner)
             .extracting(MessageResult::getMessageId)
@@ -884,7 +884,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.delete(messageId, ImmutableList.of(aliceMailbox1.getMailboxId()), bobSession);
 
-        List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, aliceSession);
+        List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession);
         assertThat(messages)
             .isEmpty();
     }
@@ -904,7 +904,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
             messageIdManager.delete(messageId, ImmutableList.of(aliceMailbox1.getMailboxId()), bobSession))
             .isInstanceOf(MailboxNotFoundException.class);
 
-        List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, aliceSession);
+        List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession);
         assertThat(messages)
             .extracting(MessageResult::getMessageId)
             .containsOnly(messageId);
@@ -958,7 +958,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(aliceMailbox1.getMailboxId()), bobSession);
 
-        List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, aliceSession);
+        List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession);
         assertThat(messages)
             .extracting(MessageResult::getFlags)
             .containsOnly(new Flags());
@@ -978,7 +978,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(aliceMailbox1.getMailboxId()), bobSession);
 
-        List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, aliceSession);
+        List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession);
         assertThat(messages)
             .extracting(MessageResult::getFlags)
             .containsOnly(flags);
@@ -992,7 +992,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
             .build(ClassLoaderUtils.getSystemResourceAsSharedStream("eml/twoAttachmentsApi.eml")), bobSession)
             .getMessageId();
 
-        List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, bobSession);
+        List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, bobSession);
 
         assertThat(messages)
             .hasSize(1)
@@ -1005,7 +1005,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
         Flags flags = new Flags(Flags.Flag.FLAGGED);
         MessageId messageId = testingData.persist(bobMailbox1.getMailboxId(), messageUid1, flags, bobSession);
 
-        List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, bobSession);
+        List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, bobSession);
 
         assertThat(messages)
             .hasSize(1)
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreBlobManagerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreBlobManagerTest.java
index 33a3a32..26bfd1d 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreBlobManagerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreBlobManagerTest.java
@@ -42,7 +42,7 @@ import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.Blob;
 import org.apache.james.mailbox.model.BlobId;
 import org.apache.james.mailbox.model.Content;
-import org.apache.james.mailbox.model.FetchGroupImpl;
+import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.MessageResult;
 import org.apache.james.mailbox.model.TestMessageId;
 import org.junit.Before;
@@ -94,7 +94,7 @@ public class StoreBlobManagerTest {
     public void retrieveShouldThrowWhenNotFound() throws Exception {
         when(attachmentManager.getAttachment(ATTACHMENT_ID, session))
             .thenThrow(new AttachmentNotFoundException(ID));
-        when(messageIdManager.getMessages(ImmutableList.of(MESSAGE_ID), FetchGroupImpl.FULL_CONTENT, session))
+        when(messageIdManager.getMessages(ImmutableList.of(MESSAGE_ID), FetchGroup.FULL_CONTENT, session))
             .thenReturn(ImmutableList.of());
 
         assertThatThrownBy(() -> blobManager.retrieve(BLOB_ID_ATTACHMENT, session))
@@ -110,7 +110,7 @@ public class StoreBlobManagerTest {
         Content content = mock(Content.class);
         when(content.getInputStream()).thenReturn(new ByteArrayInputStream(BYTES));
         when(messageResult.getFullContent()).thenReturn(content);
-        when(messageIdManager.getMessages(ImmutableList.of(MESSAGE_ID), FetchGroupImpl.FULL_CONTENT, session))
+        when(messageIdManager.getMessages(ImmutableList.of(MESSAGE_ID), FetchGroup.FULL_CONTENT, session))
             .thenReturn(ImmutableList.of(messageResult));
 
         assertThat(blobManager.retrieve(BLOB_ID_MESSAGE, session))
@@ -144,7 +144,7 @@ public class StoreBlobManagerTest {
         when(attachmentManager.getAttachment(any(), any()))
             .thenThrow(new AttachmentNotFoundException(ID));
 
-        when(messageIdManager.getMessages(ImmutableList.of(MESSAGE_ID), FetchGroupImpl.FULL_CONTENT, session))
+        when(messageIdManager.getMessages(ImmutableList.of(MESSAGE_ID), FetchGroup.FULL_CONTENT, session))
             .thenThrow(new RuntimeException());
 
         assertThatThrownBy(() -> blobManager.retrieve(BLOB_ID_MESSAGE, session))
@@ -156,7 +156,7 @@ public class StoreBlobManagerTest {
         when(attachmentManager.getAttachment(any(), any()))
             .thenThrow(new AttachmentNotFoundException(ID));
 
-        when(messageIdManager.getMessages(ImmutableList.of(MESSAGE_ID), FetchGroupImpl.FULL_CONTENT, session))
+        when(messageIdManager.getMessages(ImmutableList.of(MESSAGE_ID), FetchGroup.FULL_CONTENT, session))
             .thenThrow(new MailboxException());
 
         assertThatThrownBy(() -> blobManager.retrieve(BLOB_ID_MESSAGE, session))
@@ -170,7 +170,7 @@ public class StoreBlobManagerTest {
 
         MessageResult messageResult = mock(MessageResult.class);
         when(messageResult.getFullContent()).thenThrow(new MailboxException());
-        when(messageIdManager.getMessages(ImmutableList.of(MESSAGE_ID), FetchGroupImpl.FULL_CONTENT, session))
+        when(messageIdManager.getMessages(ImmutableList.of(MESSAGE_ID), FetchGroup.FULL_CONTENT, session))
             .thenReturn(ImmutableList.of(messageResult));
 
         assertThatThrownBy(() -> blobManager.retrieve(BLOB_ID_MESSAGE, session))
@@ -184,7 +184,7 @@ public class StoreBlobManagerTest {
 
         MessageResult messageResult = mock(MessageResult.class);
         when(messageResult.getFullContent()).thenThrow(new RuntimeException());
-        when(messageIdManager.getMessages(ImmutableList.of(MESSAGE_ID), FetchGroupImpl.FULL_CONTENT, session))
+        when(messageIdManager.getMessages(ImmutableList.of(MESSAGE_ID), FetchGroup.FULL_CONTENT, session))
             .thenReturn(ImmutableList.of(messageResult));
 
         assertThatThrownBy(() -> blobManager.retrieve(BLOB_ID_MESSAGE, session))
@@ -200,7 +200,7 @@ public class StoreBlobManagerTest {
         Content content = mock(Content.class);
         when(content.getInputStream()).thenThrow(new IOException());
         when(messageResult.getFullContent()).thenReturn(content);
-        when(messageIdManager.getMessages(ImmutableList.of(MESSAGE_ID), FetchGroupImpl.FULL_CONTENT, session))
+        when(messageIdManager.getMessages(ImmutableList.of(MESSAGE_ID), FetchGroup.FULL_CONTENT, session))
             .thenReturn(ImmutableList.of(messageResult));
 
         assertThatThrownBy(() -> blobManager.retrieve(BLOB_ID_MESSAGE, session))
@@ -216,7 +216,7 @@ public class StoreBlobManagerTest {
         Content content = mock(Content.class);
         when(content.getInputStream()).thenThrow(new RuntimeException());
         when(messageResult.getFullContent()).thenReturn(content);
-        when(messageIdManager.getMessages(ImmutableList.of(MESSAGE_ID), FetchGroupImpl.FULL_CONTENT, session))
+        when(messageIdManager.getMessages(ImmutableList.of(MESSAGE_ID), FetchGroup.FULL_CONTENT, session))
             .thenReturn(ImmutableList.of(messageResult));
 
         assertThatThrownBy(() -> blobManager.retrieve(BLOB_ID_MESSAGE, session))
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 a41d703..cadaf56 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
@@ -35,7 +35,7 @@ import javax.mail.util.SharedByteArrayInputStream;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.model.FetchGroupImpl;
+import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxCounters;
 import org.apache.james.mailbox.model.MessageMetaData;
@@ -189,7 +189,7 @@ public class StoreMailboxMessageResultIteratorTest {
     public void testBatching() {
         MessageRange range = MessageRange.range(MessageUid.of(1), MessageUid.of(10));
         BatchSizes batchSize = BatchSizes.uniqueBatchSize(3);
-        StoreMessageResultIterator it = new StoreMessageResultIterator(new TestMessageMapper(MessageRange.all()), null, range, batchSize, FetchGroupImpl.MINIMAL);
+        StoreMessageResultIterator it = new StoreMessageResultIterator(new TestMessageMapper(MessageRange.all()), null, range, batchSize, FetchGroup.MINIMAL);
 
         assertThat(it).toIterable()
             .extracting(input -> input.getUid().asLong())
@@ -200,7 +200,7 @@ public class StoreMailboxMessageResultIteratorTest {
     public void nextShouldReturnFirstElement() {
         MessageRange range = MessageUid.of(1).toRange();
         BatchSizes batchSize = BatchSizes.uniqueBatchSize(42);
-        StoreMessageResultIterator iterator = new StoreMessageResultIterator(new TestMessageMapper(range), null, range, batchSize, FetchGroupImpl.MINIMAL);
+        StoreMessageResultIterator iterator = new StoreMessageResultIterator(new TestMessageMapper(range), null, range, batchSize, FetchGroup.MINIMAL);
         assertThat(iterator.next()).isNotNull();
     }
     
@@ -209,7 +209,7 @@ public class StoreMailboxMessageResultIteratorTest {
         MessageRange messages = MessageUid.of(1).toRange();
         MessageRange findRange = MessageUid.of(2).toRange();
         BatchSizes batchSize = BatchSizes.uniqueBatchSize(42);
-        StoreMessageResultIterator iterator = new StoreMessageResultIterator(new TestMessageMapper(messages), null, findRange, batchSize, FetchGroupImpl.MINIMAL);
+        StoreMessageResultIterator iterator = new StoreMessageResultIterator(new TestMessageMapper(messages), null, findRange, batchSize, FetchGroup.MINIMAL);
         iterator.next();
     }
     
@@ -218,7 +218,7 @@ public class StoreMailboxMessageResultIteratorTest {
         MessageRange messages = MessageUid.of(1).toRange();
         MessageRange findRange = MessageUid.of(2).toRange();
         BatchSizes batchSize = BatchSizes.uniqueBatchSize(42);
-        StoreMessageResultIterator iterator = new StoreMessageResultIterator(new TestMessageMapper(messages), null, findRange, batchSize, FetchGroupImpl.MINIMAL);
+        StoreMessageResultIterator iterator = new StoreMessageResultIterator(new TestMessageMapper(messages), null, findRange, batchSize, FetchGroup.MINIMAL);
         assertThat(iterator.hasNext()).isFalse();
     }
 }
diff --git a/mailbox/tools/copier/src/main/java/org/apache/james/mailbox/tools/copier/MailboxCopierImpl.java b/mailbox/tools/copier/src/main/java/org/apache/james/mailbox/tools/copier/MailboxCopierImpl.java
index 5955469..cf9f0f4 100644
--- a/mailbox/tools/copier/src/main/java/org/apache/james/mailbox/tools/copier/MailboxCopierImpl.java
+++ b/mailbox/tools/copier/src/main/java/org/apache/james/mailbox/tools/copier/MailboxCopierImpl.java
@@ -32,7 +32,7 @@ import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.copier.MailboxCopier;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MailboxExistsException;
-import org.apache.james.mailbox.model.FetchGroupImpl;
+import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.MessageResult;
@@ -99,7 +99,7 @@ public class MailboxCopierImpl implements MailboxCopier {
                 MessageManager dstMessageManager = dstMailboxManager.getMailbox(mailboxPath, dstMailboxSession);
 
                 int j = 0;
-                Iterator<MessageResult> messageResultIterator = srcMessageManager.getMessages(MessageRange.all(), FetchGroupImpl.FULL_CONTENT, srcMailboxSession);
+                Iterator<MessageResult> messageResultIterator = srcMessageManager.getMessages(MessageRange.all(), FetchGroup.FULL_CONTENT, srcMailboxSession);
                 
                 while (messageResultIterator.hasNext()) {
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
index b8930db..0073028 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
@@ -57,7 +57,7 @@ import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MessageRangeException;
-import org.apache.james.mailbox.model.FetchGroupImpl;
+import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.MessageRange.Type;
@@ -238,7 +238,7 @@ public abstract class AbstractMailboxProcessor<R extends ImapRequest> extends Ab
                                    MessageRange messageSet, MessageManager mailbox,
                                    boolean isModSeqPermanent,
                                    MailboxSession mailboxSession) throws MailboxException {
-        final MessageResultIterator it = mailbox.getMessages(messageSet, FetchGroupImpl.MINIMAL,  mailboxSession);
+        final MessageResultIterator it = mailbox.getMessages(messageSet, FetchGroup.MINIMAL,  mailboxSession);
         final boolean qresyncEnabled = EnableProcessor.getEnabledCapabilities(session).contains(ImapConstants.SUPPORTS_QRESYNC);
         final boolean condstoreEnabled = EnableProcessor.getEnabledCapabilities(session).contains(ImapConstants.SUPPORTS_CONDSTORE);
         while (it.hasNext()) {
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/SearchProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
index 6185386..ce1920a 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
@@ -55,7 +55,7 @@ import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MessageRangeException;
-import org.apache.james.mailbox.model.FetchGroupImpl;
+import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.MessageResultIterator;
 import org.apache.james.mailbox.model.SearchQuery;
@@ -244,7 +244,7 @@ public class SearchProcessor extends AbstractMailboxProcessor<SearchRequest> imp
         // Reverse loop over the ranges as its more likely that we find a match at the end
         int size = ranges.size();
         for (int i = size - 1; i > 0; i--) {
-            MessageResultIterator results = mailbox.getMessages(ranges.get(i), FetchGroupImpl.MINIMAL, session);
+            MessageResultIterator results = mailbox.getMessages(ranges.get(i), FetchGroup.MINIMAL, session);
             while (results.hasNext()) {
                 ModSeq modSeq = results.next().getModSeq();
                 if (highestModSeq == null || modSeq.asLong() > highestModSeq.asLong()) {
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/StoreProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/StoreProcessor.java
index daed075..b8ac0bd 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/StoreProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/StoreProcessor.java
@@ -47,12 +47,11 @@ import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageManager.MetaData;
-import org.apache.james.mailbox.MessageManager.MetaData.FetchGroup;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MessageRangeException;
-import org.apache.james.mailbox.model.FetchGroupImpl;
+import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.MessageRange.Type;
 import org.apache.james.mailbox.model.MessageResult;
@@ -88,7 +87,7 @@ public class StoreProcessor extends AbstractMailboxProcessor<StoreRequest> {
             final Flags flags = request.getFlags();
             
             if (unchangedSince != -1) {
-                MetaData metaData = mailbox.getMetaData(false, mailboxSession, FetchGroup.NO_COUNT);
+                MetaData metaData = mailbox.getMetaData(false, mailboxSession, MetaData.FetchGroup.NO_COUNT);
                 if (metaData.isModSeqPermanent() == false) {
                     // Check if the mailbox did not support modsequences. If so return a tagged bad response.
                     // See RFC4551 3.1.2. NOMODSEQ Response Code 
@@ -125,7 +124,7 @@ public class StoreProcessor extends AbstractMailboxProcessor<StoreRequest> {
 
                         List<MessageUid> uids = new ArrayList<>();
 
-                        MessageResultIterator results = mailbox.getMessages(messageSet, FetchGroupImpl.MINIMAL, mailboxSession);
+                        MessageResultIterator results = mailbox.getMessages(messageSet, FetchGroup.MINIMAL, mailboxSession);
                         while (results.hasNext()) {
                             MessageResult r = results.next();
                             MessageUid uid = r.getUid();
@@ -245,7 +244,7 @@ public class StoreProcessor extends AbstractMailboxProcessor<StoreRequest> {
         // See IMAP-303
         if (selected.hasNewApplicableFlags()) {
             flags(responder, selected);
-            permanentFlags(responder, mailbox.getMetaData(false, mailboxSession, FetchGroup.NO_COUNT), selected);
+            permanentFlags(responder, mailbox.getMetaData(false, mailboxSession, MetaData.FetchGroup.NO_COUNT), selected);
             selected.resetNewApplicableFlags();
         }
         
@@ -264,7 +263,7 @@ public class StoreProcessor extends AbstractMailboxProcessor<StoreRequest> {
             //      - QRESYNC was enabled via ENABLE QRESYNC
             //
             if (unchangedSince != -1 || qresyncEnabled || condstoreEnabled) {
-                MessageResultIterator results = mailbox.getMessages(messageSet, FetchGroupImpl.MINIMAL, mailboxSession);
+                MessageResultIterator results = mailbox.getMessages(messageSet, FetchGroup.MINIMAL, mailboxSession);
                 while (results.hasNext()) {
                     MessageResult r = results.next();
                     // Store the modseq for the uid for later usage in the response
@@ -322,7 +321,7 @@ public class StoreProcessor extends AbstractMailboxProcessor<StoreRequest> {
 
             if (unchangedSince != -1) {
                 // Enable CONDSTORE as this is a CONDSTORE enabling command
-                condstoreEnablingCommand(session, responder,  mailbox.getMetaData(false, mailboxSession, FetchGroup.NO_COUNT), true);
+                condstoreEnablingCommand(session, responder,  mailbox.getMetaData(false, mailboxSession, MetaData.FetchGroup.NO_COUNT), true);
                                   
             }
         }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
index 03ba656..4326df9 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
@@ -43,10 +43,9 @@ import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageManager.MetaData;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MessageRangeException;
-import org.apache.james.mailbox.model.FetchGroupImpl;
+import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.MessageResult;
-import org.apache.james.mailbox.model.MessageResult.FetchGroup;
 import org.apache.james.mailbox.model.MessageResultIterator;
 import org.apache.james.mailbox.model.MimePath;
 import org.apache.james.metrics.api.MetricFactory;
@@ -186,13 +185,13 @@ public class FetchProcessor extends AbstractMailboxProcessor<FetchRequest> {
     }
 
     protected FetchGroup getFetchGroup(FetchData fetch) {
-        FetchGroupImpl result = FetchGroupImpl.MINIMAL;
+        FetchGroup result = FetchGroup.MINIMAL;
 
         if (fetch.isEnvelope()) {
-            result.or(FetchGroup.HEADERS);
+            result.or(FetchGroup.HEADERS_MASK);
         }
         if (fetch.isBody() || fetch.isBodyStructure()) {
-            result.or(FetchGroup.MIME_DESCRIPTOR);
+            result.or(FetchGroup.MIME_DESCRIPTOR_MASK);
         }
 
         Collection<BodyFetchElement> bodyElements = fetch.getBodyElements();
@@ -204,21 +203,21 @@ public class FetchProcessor extends AbstractMailboxProcessor<FetchRequest> {
                 switch (sectionType) {
                     case BodyFetchElement.CONTENT:
                         if (isBase) {
-                            addContent(result, path, isBase, FetchGroup.FULL_CONTENT);
+                            addContent(result, path, isBase, FetchGroup.FULL_CONTENT_MASK);
                         } else {
-                            addContent(result, path, isBase, FetchGroup.MIME_CONTENT);
+                            addContent(result, path, isBase, FetchGroup.MIME_CONTENT_MASK);
                         }
                         break;
                     case BodyFetchElement.HEADER:
                     case BodyFetchElement.HEADER_NOT_FIELDS:
                     case BodyFetchElement.HEADER_FIELDS:
-                        addContent(result, path, isBase, FetchGroup.HEADERS);
+                        addContent(result, path, isBase, FetchGroup.HEADERS_MASK);
                         break;
                     case BodyFetchElement.MIME:
-                        addContent(result, path, isBase, FetchGroup.MIME_HEADERS);
+                        addContent(result, path, isBase, FetchGroup.MIME_HEADERS_MASK);
                         break;
                     case BodyFetchElement.TEXT:
-                        addContent(result, path, isBase, FetchGroup.BODY_CONTENT);
+                        addContent(result, path, isBase, FetchGroup.BODY_CONTENT_MASK);
                         break;
                     default:
                         break;
@@ -229,7 +228,7 @@ public class FetchProcessor extends AbstractMailboxProcessor<FetchRequest> {
         return result;
     }
 
-    private void addContent(FetchGroupImpl result, int[] path, boolean isBase, int content) {
+    private void addContent(FetchGroup result, int[] path, boolean isBase, int content) {
         if (isBase) {
             result.or(content);
         } else {
diff --git a/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/MessageIdProbe.java b/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/MessageIdProbe.java
index a2ae27d..6b57af0 100644
--- a/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/MessageIdProbe.java
+++ b/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/MessageIdProbe.java
@@ -31,7 +31,7 @@ import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.MessageManager.FlagsUpdateMode;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.AttachmentId;
-import org.apache.james.mailbox.model.FetchGroupImpl;
+import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageAttachment;
 import org.apache.james.mailbox.model.MessageId;
@@ -55,7 +55,7 @@ public class MessageIdProbe implements GuiceProbe {
     public List<MessageResult> getMessages(MessageId messageId, Username user) throws MailboxException {
         MailboxSession mailboxSession = mailboxManager.createSystemSession(user);
 
-        return messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.FULL_CONTENT, mailboxSession);
+        return messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.FULL_CONTENT, mailboxSession);
     }
 
     public void updateNewFlags(Username user, Flags newFlags, MessageId messageId, List<MailboxId> mailboxIds) throws MailboxException {
@@ -68,7 +68,7 @@ public class MessageIdProbe implements GuiceProbe {
         MailboxSession mailboxSession = mailboxManager.createSystemSession(username);
         List<MessageResult> messages = messageIdManager.getMessages(
             ImmutableList.of(messageId),
-            FetchGroupImpl.FULL_CONTENT,
+            FetchGroup.FULL_CONTENT,
             mailboxSession);
 
         return messages.stream()
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailboxAppenderTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailboxAppenderTest.java
index 58102dd..72461e2 100644
--- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailboxAppenderTest.java
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailboxAppenderTest.java
@@ -32,7 +32,7 @@ import org.apache.james.core.builder.MimeMessageBuilder;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
-import org.apache.james.mailbox.model.FetchGroupImpl;
+import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.MessageResultIterator;
@@ -71,7 +71,7 @@ public class MailboxAppenderTest {
         testee.append(mimeMessage, USER, FOLDER);
 
         MessageResultIterator messages = mailboxManager.getMailbox(MailboxPath.forUser(USER, FOLDER), session)
-            .getMessages(MessageRange.all(), FetchGroupImpl.FULL_CONTENT, session);
+            .getMessages(MessageRange.all(), FetchGroup.FULL_CONTENT, session);
 
         assertThat(messages).toIterable()
             .hasSize(1);
@@ -85,7 +85,7 @@ public class MailboxAppenderTest {
         testee.append(mimeMessage, USER, FOLDER);
 
         MessageResultIterator messages = mailboxManager.getMailbox(mailboxPath, session)
-            .getMessages(MessageRange.all(), FetchGroupImpl.FULL_CONTENT, session);
+            .getMessages(MessageRange.all(), FetchGroup.FULL_CONTENT, session);
 
         assertThat(messages).toIterable()
             .hasSize(1);
@@ -102,7 +102,7 @@ public class MailboxAppenderTest {
         testee.append(mimeMessage, USER, "." + FOLDER);
 
         MessageResultIterator messages = mailboxManager.getMailbox(MailboxPath.forUser(USER, FOLDER), session)
-            .getMessages(MessageRange.all(), FetchGroupImpl.FULL_CONTENT, session);
+            .getMessages(MessageRange.all(), FetchGroup.FULL_CONTENT, session);
 
         assertThat(messages).toIterable()
             .hasSize(1);
@@ -113,7 +113,7 @@ public class MailboxAppenderTest {
         testee.append(mimeMessage, USER, FOLDER + "/any");
 
         MessageResultIterator messages = mailboxManager.getMailbox(MailboxPath.forUser(USER, FOLDER + ".any"), session)
-            .getMessages(MessageRange.all(), FetchGroupImpl.FULL_CONTENT, session);
+            .getMessages(MessageRange.all(), FetchGroup.FULL_CONTENT, session);
 
         assertThat(messages).toIterable()
             .hasSize(1);
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/GetMessagesMethod.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/GetMessagesMethod.java
index b29a38e..966ec40 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/GetMessagesMethod.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/GetMessagesMethod.java
@@ -38,7 +38,7 @@ import org.apache.james.jmap.draft.model.message.view.MessageFullViewFactory;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.model.FetchGroupImpl;
+import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.MessageResult;
 import org.apache.james.metrics.api.MetricFactory;
 import org.apache.james.util.MDCBuilder;
@@ -125,7 +125,7 @@ public class GetMessagesMethod implements Method {
             MessageProperties.ReadProfile readProfile = getMessagesRequest.getProperties().computeReadLevel();
             return GetMessagesResponse.builder()
                 .messages(
-                    messageIdManager.getMessages(getMessagesRequest.getIds(), FetchGroupImpl.FULL_CONTENT, mailboxSession)
+                    messageIdManager.getMessages(getMessagesRequest.getIds(), FetchGroup.FULL_CONTENT, mailboxSession)
                         .stream()
                         .collect(Guavate.toImmutableListMultimap(MessageResult::getMessageId))
                         .asMap()
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/ReferenceUpdater.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/ReferenceUpdater.java
index 6637b99..410c17d 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/ReferenceUpdater.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/ReferenceUpdater.java
@@ -32,7 +32,7 @@ import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.MessageManager.FlagsUpdateMode;
 import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.model.FetchGroupImpl;
+import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.Headers;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageId;
@@ -93,7 +93,7 @@ public class ReferenceUpdater {
         List<MessageId> references = mailboxManager.search(searchByRFC822MessageId, session, limit);
         try {
             MessageId reference = Iterables.getOnlyElement(references);
-            List<MailboxId> mailboxIds = messageIdManager.getMessages(references, FetchGroupImpl.MINIMAL, session).stream()
+            List<MailboxId> mailboxIds = messageIdManager.getMessages(references, FetchGroup.MINIMAL, session).stream()
                 .map(MessageResult::getMailboxId)
                 .collect(Guavate.toImmutableList());
             messageIdManager.setFlags(flag, FlagsUpdateMode.ADD, reference, mailboxIds, session);
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SendMDNProcessor.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SendMDNProcessor.java
index 67db9a2..9edfb60 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SendMDNProcessor.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SendMDNProcessor.java
@@ -44,7 +44,7 @@ import org.apache.james.mailbox.SystemMailboxesProvider;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.OverQuotaException;
 import org.apache.james.mailbox.model.Attachment;
-import org.apache.james.mailbox.model.FetchGroupImpl;
+import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.MessageAttachment;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.MessageResult;
@@ -162,7 +162,7 @@ public class SendMDNProcessor implements SetMessagesProcessor {
 
     private Message retrieveOriginalMessage(JmapMDN mdn, MailboxSession mailboxSession) throws MailboxException, IOException, MessageNotFoundException {
         List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(mdn.getMessageId()),
-            FetchGroupImpl.HEADERS,
+            FetchGroup.HEADERS,
             mailboxSession);
 
         if (messages.size() == 0) {
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMessagesUpdateProcessor.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMessagesUpdateProcessor.java
index 331acd2..0633c0d 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMessagesUpdateProcessor.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMessagesUpdateProcessor.java
@@ -56,7 +56,7 @@ import org.apache.james.mailbox.SystemMailboxesProvider;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MailboxNotFoundException;
 import org.apache.james.mailbox.exception.OverQuotaException;
-import org.apache.james.mailbox.model.FetchGroupImpl;
+import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxId.Factory;
 import org.apache.james.mailbox.model.MessageId;
@@ -127,7 +127,7 @@ public class SetMessagesUpdateProcessor implements SetMessagesProcessor {
     private void update(MessageId messageId, UpdateMessagePatch updateMessagePatch, MailboxSession mailboxSession,
                         SetMessagesResponse.Builder builder) {
         try {
-            List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, mailboxSession);
+            List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, mailboxSession);
             assertValidUpdate(messages, updateMessagePatch, mailboxSession);
 
             if (messages.isEmpty()) {
@@ -175,7 +175,7 @@ public class SetMessagesUpdateProcessor implements SetMessagesProcessor {
         if (isTargetingOutbox(mailboxSession, listTargetMailboxIds(updateMessagePatch))) {
             Optional<MessageResult> maybeMessageToSend =
                 messageIdManager.getMessages(
-                    ImmutableList.of(messageId), FetchGroupImpl.FULL_CONTENT, mailboxSession)
+                    ImmutableList.of(messageId), FetchGroup.FULL_CONTENT, mailboxSession)
                     .stream()
                     .findFirst();
             if (maybeMessageToSend.isPresent()) {
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/send/PostDequeueDecorator.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/send/PostDequeueDecorator.java
index 751e677..a7ff93c 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/send/PostDequeueDecorator.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/send/PostDequeueDecorator.java
@@ -34,7 +34,7 @@ import org.apache.james.mailbox.Role;
 import org.apache.james.mailbox.SystemMailboxesProvider;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MailboxRoleNotFoundException;
-import org.apache.james.mailbox.model.FetchGroupImpl;
+import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.MessageId.Factory;
@@ -143,7 +143,7 @@ public class PostDequeueDecorator extends MailQueueItemDecorator {
 
     private void assertMessageBelongsToOutbox(MessageId messageId, MailboxSession mailboxSession) throws MailboxException, MailShouldBeInOutboxException {
         MailboxId outboxMailboxId = getOutboxMailboxId(mailboxSession);
-        List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, mailboxSession);
+        List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, mailboxSession);
         for (MessageResult message: messages) {
             if (message.getMailboxId().equals(outboxMailboxId)) {
                 return;
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewFactoryTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewFactoryTest.java
index da51cb7..c1c3082 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewFactoryTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewFactoryTest.java
@@ -55,7 +55,7 @@ import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
 import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.Cid;
 import org.apache.james.mailbox.model.ComposedMessageId;
-import org.apache.james.mailbox.model.FetchGroupImpl;
+import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageAttachment;
@@ -112,7 +112,7 @@ class MessageFullViewFactoryTest {
     @Test
     void fromMessageResultsShouldReturnCorrectView() throws Exception {
         List<MessageResult> messages = messageIdManager
-            .getMessages(ImmutableList.of(message1.getMessageId()), FetchGroupImpl.MINIMAL, session);
+            .getMessages(ImmutableList.of(message1.getMessageId()), FetchGroup.FULL_CONTENT, session);
 
         MessageFullView actual = messageFullViewFactory.fromMessageResults(messages);
         SoftAssertions.assertSoftly(softly -> {
@@ -146,7 +146,7 @@ class MessageFullViewFactoryTest {
         bobMailbox.setFlags(new Flags(Flags.Flag.FLAGGED), MessageManager.FlagsUpdateMode.REPLACE, MessageRange.all(), session);
 
         List<MessageResult> messages = messageIdManager
-            .getMessages(ImmutableList.of(message1.getMessageId()), FetchGroupImpl.MINIMAL, session);
+            .getMessages(ImmutableList.of(message1.getMessageId()), FetchGroup.FULL_CONTENT, session);
 
         MessageFullView actual = messageFullViewFactory.fromMessageResults(messages);
         SoftAssertions.assertSoftly(softly -> {
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageHeaderViewFactoryTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageHeaderViewFactoryTest.java
index ec7711c..4973e1e 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageHeaderViewFactoryTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageHeaderViewFactoryTest.java
@@ -41,7 +41,7 @@ import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
 import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
 import org.apache.james.mailbox.model.ComposedMessageId;
-import org.apache.james.mailbox.model.FetchGroupImpl;
+import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageRange;
@@ -85,7 +85,7 @@ class MessageHeaderViewFactoryTest {
     @Test
     void fromMessageResultsShouldReturnCorrectView() throws Exception {
         List<MessageResult> messages = messageIdManager
-            .getMessages(ImmutableList.of(message1.getMessageId()), FetchGroupImpl.MINIMAL, session);
+            .getMessages(ImmutableList.of(message1.getMessageId()), FetchGroup.HEADERS, session);
 
         MessageHeaderView actual = testee.fromMessageResults(messages);
         SoftAssertions.assertSoftly(softly -> {
@@ -113,7 +113,7 @@ class MessageHeaderViewFactoryTest {
         bobMailbox.setFlags(new Flags(Flags.Flag.FLAGGED), MessageManager.FlagsUpdateMode.REPLACE, MessageRange.all(), session);
 
         List<MessageResult> messages = messageIdManager
-            .getMessages(ImmutableList.of(message1.getMessageId()), FetchGroupImpl.MINIMAL, session);
+            .getMessages(ImmutableList.of(message1.getMessageId()), FetchGroup.HEADERS, session);
 
         MessageHeaderView actual = testee.fromMessageResults(messages);
         SoftAssertions.assertSoftly(softly -> {
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageMetadataViewFactoryTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageMetadataViewFactoryTest.java
index f4f82c0..d6626f4 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageMetadataViewFactoryTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageMetadataViewFactoryTest.java
@@ -35,7 +35,7 @@ import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
 import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
 import org.apache.james.mailbox.model.ComposedMessageId;
-import org.apache.james.mailbox.model.FetchGroupImpl;
+import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageRange;
@@ -78,7 +78,7 @@ class MessageMetadataViewFactoryTest {
     @Test
     void fromMessageResultsShouldReturnCorrectView() throws Exception {
         List<MessageResult> messages = messageIdManager
-            .getMessages(ImmutableList.of(message1.getMessageId()), FetchGroupImpl.MINIMAL, session);
+            .getMessages(ImmutableList.of(message1.getMessageId()), FetchGroup.MINIMAL, session);
 
         MessageMetadataView actual = testee.fromMessageResults(messages);
         SoftAssertions.assertSoftly(softly -> {
@@ -97,7 +97,7 @@ class MessageMetadataViewFactoryTest {
         bobMailbox.setFlags(new Flags(Flags.Flag.FLAGGED), MessageManager.FlagsUpdateMode.REPLACE, MessageRange.all(), session);
 
         List<MessageResult> messages = messageIdManager
-            .getMessages(ImmutableList.of(message1.getMessageId()), FetchGroupImpl.MINIMAL, session);
+            .getMessages(ImmutableList.of(message1.getMessageId()), FetchGroup.MINIMAL, session);
 
         MessageMetadataView actual = testee.fromMessageResults(messages);
         SoftAssertions.assertSoftly(softly -> {
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/send/PostDequeueDecoratorTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/send/PostDequeueDecoratorTest.java
index cd7b85d..21555bf 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/send/PostDequeueDecoratorTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/send/PostDequeueDecoratorTest.java
@@ -44,7 +44,7 @@ import org.apache.james.mailbox.exception.MailboxRoleNotFoundException;
 import org.apache.james.mailbox.inmemory.InMemoryMessageId;
 import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
 import org.apache.james.mailbox.model.ComposedMessageId;
-import org.apache.james.mailbox.model.FetchGroupImpl;
+import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageRange;
@@ -146,7 +146,7 @@ public class PostDequeueDecoratorTest {
         testee.done(true);
         
         MessageManager sentMailbox = mailboxManager.getMailbox(SENT_MAILBOX_PATH, mailboxSession);
-        MessageResultIterator resultIterator = sentMailbox.getMessages(MessageRange.one(UID), FetchGroupImpl.FULL_CONTENT, mailboxSession);
+        MessageResultIterator resultIterator = sentMailbox.getMessages(MessageRange.one(UID), FetchGroup.FULL_CONTENT, mailboxSession);
         assertThat(resultIterator).toIterable()
             .hasSize(1);
     }
@@ -164,7 +164,7 @@ public class PostDequeueDecoratorTest {
         testee.done(true);
         
         MessageManager mailbox = mailboxManager.getMailbox(OUTBOX_MAILBOX_PATH, mailboxSession);
-        MessageResultIterator resultIterator = mailbox.getMessages(MessageRange.one(UID), FetchGroupImpl.FULL_CONTENT, mailboxSession);
+        MessageResultIterator resultIterator = mailbox.getMessages(MessageRange.one(UID), FetchGroup.FULL_CONTENT, mailboxSession);
         assertThat(resultIterator).toIterable()
             .hasSize(0);
     }
@@ -182,7 +182,7 @@ public class PostDequeueDecoratorTest {
         testee.done(false);
         
         MessageManager mailbox = mailboxManager.getMailbox(OUTBOX_MAILBOX_PATH, mailboxSession);
-        MessageResultIterator resultIterator = mailbox.getMessages(MessageRange.one(UID), FetchGroupImpl.FULL_CONTENT, mailboxSession);
+        MessageResultIterator resultIterator = mailbox.getMessages(MessageRange.one(UID), FetchGroup.FULL_CONTENT, mailboxSession);
         assertThat(resultIterator).toIterable()
             .hasSize(1);
     }
@@ -198,7 +198,7 @@ public class PostDequeueDecoratorTest {
         testee.done(true);
         
         MessageManager mailbox = mailboxManager.getMailbox(OUTBOX_MAILBOX_PATH, mailboxSession);
-        MessageResultIterator resultIterator = mailbox.getMessages(MessageRange.one(UID), FetchGroupImpl.FULL_CONTENT, mailboxSession);
+        MessageResultIterator resultIterator = mailbox.getMessages(MessageRange.one(UID), FetchGroup.FULL_CONTENT, mailboxSession);
         assertThat(resultIterator).toIterable()
             .hasSize(1);
     }
@@ -215,7 +215,7 @@ public class PostDequeueDecoratorTest {
         testee.done(true);
         
         MessageManager mailbox = mailboxManager.getMailbox(OUTBOX_MAILBOX_PATH, mailboxSession);
-        MessageResultIterator resultIterator = mailbox.getMessages(MessageRange.one(UID), FetchGroupImpl.FULL_CONTENT, mailboxSession);
+        MessageResultIterator resultIterator = mailbox.getMessages(MessageRange.one(UID), FetchGroup.FULL_CONTENT, mailboxSession);
         assertThat(resultIterator).toIterable()
             .hasSize(1);
     }
@@ -232,7 +232,7 @@ public class PostDequeueDecoratorTest {
         testee.done(true);
         
         MessageManager mailbox = mailboxManager.getMailbox(OUTBOX_MAILBOX_PATH, mailboxSession);
-        MessageResultIterator resultIterator = mailbox.getMessages(MessageRange.one(UID), FetchGroupImpl.FULL_CONTENT, mailboxSession);
+        MessageResultIterator resultIterator = mailbox.getMessages(MessageRange.one(UID), FetchGroup.FULL_CONTENT, mailboxSession);
         assertThat(resultIterator).toIterable()
             .hasSize(1);
     }
@@ -250,7 +250,7 @@ public class PostDequeueDecoratorTest {
         testee.done(true);
         
         MessageManager mailbox = mailboxManager.getMailbox(OUTBOX_MAILBOX_PATH, mailboxSession);
-        MessageResultIterator resultIterator = mailbox.getMessages(MessageRange.one(UID), FetchGroupImpl.FULL_CONTENT, mailboxSession);
+        MessageResultIterator resultIterator = mailbox.getMessages(MessageRange.one(UID), FetchGroup.FULL_CONTENT, mailboxSession);
         assertThat(resultIterator).toIterable()
             .hasSize(1);
     }
@@ -269,14 +269,14 @@ public class PostDequeueDecoratorTest {
         mail.setAttribute(messageIdAttribute(messageId.getMessageId().serialize()));
         mail.setAttribute(USERNAME_ATTRIBUTE);
 
-        ImmutableList<MessageResult> allMessages = ImmutableList.copyOf(messageManager.getMessages(MessageRange.all(), FetchGroupImpl.MINIMAL, mailboxSession));
+        ImmutableList<MessageResult> allMessages = ImmutableList.copyOf(messageManager.getMessages(MessageRange.all(), FetchGroup.MINIMAL, mailboxSession));
 
-        when(messageIdManager.getMessages(eq(ImmutableList.of(messageId.getMessageId())), eq(FetchGroupImpl.MINIMAL), any(MailboxSession.class))).thenReturn(allMessages);
+        when(messageIdManager.getMessages(eq(ImmutableList.of(messageId.getMessageId())), eq(FetchGroup.MINIMAL), any(MailboxSession.class))).thenReturn(allMessages);
 
         testee.done(true);
         testee.done(true);
 
-        verify(messageIdManager, times(1)).getMessages(eq(ImmutableList.of(messageId.getMessageId())), eq(FetchGroupImpl.MINIMAL), any(MailboxSession.class));
+        verify(messageIdManager, times(1)).getMessages(eq(ImmutableList.of(messageId.getMessageId())), eq(FetchGroup.MINIMAL), any(MailboxSession.class));
         verify(messageIdManager, times(1)).setInMailboxes(eq(messageId.getMessageId()), eq(ImmutableList.of(sentMailboxId)), any(MailboxSession.class));
         verify(messageIdManager, times(1)).setFlags(eq(new Flags(Flag.SEEN)), eq(MessageManager.FlagsUpdateMode.ADD), eq(messageId.getMessageId()), eq(ImmutableList.of(sentMailboxId)), any(MailboxSession.class));
 
@@ -297,7 +297,7 @@ public class PostDequeueDecoratorTest {
         mail.setAttribute(messageIdAttribute(messageId.getMessageId().serialize()));
         mail.setAttribute(USERNAME_ATTRIBUTE);
 
-        when(messageIdManager.getMessages(eq(ImmutableList.of(messageId.getMessageId())), eq(FetchGroupImpl.MINIMAL), any(MailboxSession.class))).thenThrow(MailboxException.class);
+        when(messageIdManager.getMessages(eq(ImmutableList.of(messageId.getMessageId())), eq(FetchGroup.MINIMAL), any(MailboxSession.class))).thenThrow(MailboxException.class);
 
         testee.done(true);
     }
diff --git a/server/protocols/protocols-pop3/src/main/java/org/apache/james/pop3server/mailbox/MailboxAdapter.java b/server/protocols/protocols-pop3/src/main/java/org/apache/james/pop3server/mailbox/MailboxAdapter.java
index 996e3b3..cffb653 100644
--- a/server/protocols/protocols-pop3/src/main/java/org/apache/james/pop3server/mailbox/MailboxAdapter.java
+++ b/server/protocols/protocols-pop3/src/main/java/org/apache/james/pop3server/mailbox/MailboxAdapter.java
@@ -31,10 +31,9 @@ import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.model.FetchGroupImpl;
+import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.MessageResult;
-import org.apache.james.mailbox.model.MessageResult.FetchGroup;
 import org.apache.james.protocols.pop3.mailbox.Mailbox;
 import org.apache.james.protocols.pop3.mailbox.MessageMetaData;
 
@@ -42,10 +41,10 @@ import com.github.steveash.guavate.Guavate;
 import com.google.common.collect.ImmutableList;
 
 public class MailboxAdapter implements Mailbox {
-    private static final FetchGroup FULL_GROUP = FetchGroupImpl.FULL_CONTENT;
-    private static final FetchGroup BODY_GROUP = FetchGroupImpl.BODY_CONTENT;
-    private static final FetchGroup HEADERS_GROUP = FetchGroupImpl.HEADERS;
-    private static final FetchGroup METADATA_GROUP = FetchGroupImpl.MINIMAL;
+    private static final FetchGroup FULL_GROUP = FetchGroup.FULL_CONTENT;
+    private static final FetchGroup BODY_GROUP = FetchGroup.BODY_CONTENT;
+    private static final FetchGroup HEADERS_GROUP = FetchGroup.HEADERS;
+    private static final FetchGroup METADATA_GROUP = FetchGroup.MINIMAL;
 
     private final MessageManager manager;
     private final MailboxSession session;
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java
index 6cb20b1..4025a5b 100644
--- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java
@@ -92,7 +92,7 @@ import org.apache.james.mailbox.inmemory.InMemoryId;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
 import org.apache.james.mailbox.inmemory.InMemoryMessageId;
 import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
-import org.apache.james.mailbox.model.FetchGroupImpl;
+import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageId;
@@ -2269,7 +2269,7 @@ class DeletedMessagesVaultRoutesTest {
     private List<MessageResult> restoreMailboxMessages(Username username) throws Exception {
         MailboxSession session = mailboxManager.createSystemSession(username);
         MessageManager messageManager = mailboxManager.getMailbox(MailboxPath.forUser(username, DefaultMailboxes.RESTORED_MESSAGES), session);
-        return ImmutableList.copyOf(messageManager.getMessages(MessageRange.all(), FetchGroupImpl.MINIMAL, session));
+        return ImmutableList.copyOf(messageManager.getMessages(MessageRange.all(), FetchGroup.MINIMAL, session));
     }
 
     private DeletedMessage.Builder.RequireHasAttachment<DeletedMessage.Builder.RequireSize<DeletedMessage.Builder.FinalStage>> messageWithAttachmentBuilder() {


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org