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 ro...@apache.org on 2019/11/07 09:46:52 UTC

[james-project] branch master updated (78fc056 -> f48dc2d)

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

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


    from 78fc056  JAMES-2945 Make Sender case insensitive in SMTP
     new 3bcfde9  JAMES-2949 Rename core.User to core.Username
     new f48dc2d  JAMES-2949 Rename Username.fromUsername to Username.of

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../apache/james/core/{User.java => Username.java} |  38 ++---
 .../java/org/apache/james/core/CoreFixture.java    |  16 +-
 .../core/{UserTest.java => UsernameTest.java}      |  98 +++++------
 .../listeners/SetCustomFlagOnBigMessages.java      |   4 +-
 .../org/apache/james/mailbox/MailboxSession.java   |   6 +-
 .../james/mailbox/SystemMailboxesProvider.java     |   8 +-
 .../org/apache/james/mailbox/events/Event.java     |   4 +-
 .../james/mailbox/events/MailboxListener.java      |  92 +++++-----
 .../james/mailbox/events/MessageMoveEvent.java     |  28 ++--
 .../apache/james/mailbox/indexer/ReIndexer.java    |   4 +-
 .../james/mailbox/model/search/MailboxQuery.java   |  10 +-
 .../james/mailbox/quota/UserQuotaRootResolver.java |   5 +-
 .../apache/james/mailbox/MailboxListenerTest.java  |   4 +-
 .../apache/james/mailbox/MessageMoveEventTest.java |   4 +-
 .../james/mailbox/events/EventBusTestFixture.java  |  10 +-
 .../mailbox/events/EventDeadLettersContract.java   |  12 +-
 .../apache/james/mailbox/events/GroupContract.java |   6 +-
 .../apache/james/mailbox/events/KeyContract.java   |   4 +-
 .../james/mailbox/backup/DefaultMailboxBackup.java |  20 +--
 .../james/mailbox/backup/MailArchiveRestorer.java  |   4 +-
 .../apache/james/mailbox/backup/MailboxBackup.java |  10 +-
 .../mailbox/backup/ZipMailArchiveRestorer.java     |   6 +-
 .../mailbox/backup/DefaultMailboxBackupTest.java   |  28 ++--
 .../mailbox/backup/MailboxMessageFixture.java      |   6 +-
 .../mailbox/backup/ZipArchivesLoaderTest.java      |   8 +-
 .../json/MessageToElasticSearchJson.java           |   6 +-
 .../json/MessageToElasticSearchJsonTest.java       |  29 ++--
 .../mailbox/events/delivery/InVmEventDelivery.java |   4 +-
 .../james/mailbox/events/EventDispatcher.java      |   2 +-
 .../james/mailbox/events/GroupConsumerRetry.java   |   2 +-
 .../mailbox/events/KeyRegistrationHandler.java     |   2 +-
 .../mailbox/events/MailboxListenerExecutor.java    |   2 +-
 .../apache/james/event/json/EventSerializer.scala  |  44 ++---
 .../james/event/json/AddedSerializationTest.java   |   8 +-
 .../event/json/ExpungedSerializationTest.java      |   8 +-
 .../event/json/FlagsUpdatedSerializationTest.java  |   8 +-
 .../MailboxACLUpdatedEventSerializationTest.java   |   6 +-
 .../event/json/MailboxAddedSerializationTest.java  |   6 +-
 .../json/MailboxDeletionSerializationTest.java     |   8 +-
 .../json/MailboxRenamedSerializationTest.java      |  10 +-
 .../json/MessageMoveEventSerializationTest.java    |  10 +-
 .../QuotaUsageUpdatedEventSerializationTest.java   |   4 +-
 .../org/apache/james/event/json/dtos/UserTest.java |  11 +-
 .../CassandraDeletedMessageMetadataVault.java      |  18 +-
 .../vault/metadata/DeletedMessageIdentifier.java   |   8 +-
 .../apache/james/vault/metadata/MetadataDAO.java   |  18 +-
 .../vault/metadata/StorageInformationDAO.java      |  14 +-
 .../james/vault/metadata/UserPerBucketDAO.java     |  10 +-
 .../CassandraDeletedMessageMetadataVaultTest.java  |  42 ++---
 .../james/vault/metadata/MetadataDAOTest.java      |  34 ++--
 .../vault/metadata/StorageInformationDAOTest.java  |   4 +-
 .../james/vault/metadata/UserPerBucketDAOTest.java |   7 +-
 .../org/apache/james/vault/DeletedMessage.java     |  14 +-
 .../DeletedMessageContentNotFoundException.java    |   6 +-
 .../james/vault/DeletedMessageConverter.java       |   4 +-
 .../apache/james/vault/DeletedMessageVault.java    |   8 +-
 .../james/vault/DeletedMessageVaultHook.java       |  16 +-
 .../vault/blob/BlobStoreDeletedMessageVault.java   |  36 ++--
 ...etedMessageWithStorageInformationConverter.java |   4 +-
 .../MemoryDeletedMessageMetadataVault.java         |  20 +--
 .../metadata/DeletedMessageMetadataVault.java      |   8 +-
 .../james/vault/DeletedMessageConverterTest.java   |   8 +-
 .../apache/james/vault/DeletedMessageFixture.java  |  14 +-
 .../org/apache/james/vault/DeletedMessageTest.java |   4 +-
 .../james/vault/DeletedMessageVaultContract.java   |  50 +++---
 .../james/vault/DeletedMessageVaultHookTest.java   |  10 +-
 .../vault/DeletedMessageVaultSearchContract.java   |  22 +--
 .../blob/BlobStoreDeletedMessageVaultTest.java     |  16 +-
 .../DeletedMessageMetadataVaultContract.java       |  26 +--
 .../james/mailbox/quota/cassandra/dto/DTOTest.java |  10 +-
 .../mailing/aggregates/UserQuotaThresholds.java    |  28 ++--
 .../mailing/commands/DetectThresholdCrossing.java  |  16 +-
 .../commands/DetectThresholdCrossingHandler.java   |   2 +-
 .../listeners/QuotaThresholdCrossingListener.java  |   8 +-
 .../mailing/subscribers/QuotaThresholdMailer.java  |   8 +-
 .../aggregates/UserQuotaThresholdsTest.java        |   8 +-
 .../QuotaThresholdConfigurationChangesTest.java    |   4 +-
 .../QuotaThresholdMailingIntegrationTest.java      |   4 +-
 .../mailbox/quota/model/QuotaThresholdFixture.java |   4 +-
 .../elasticsearch/ElasticSearchQuotaSearcher.java  |   6 +-
 .../elasticsearch/UserRoutingKeyFactory.java       |   6 +-
 .../events/ElasticSearchQuotaMailboxListener.java  |  10 +-
 .../json/QuotaRatioToElasticSearchJson.java        |   2 +-
 .../ElasticSearchQuotaSearcherTest.java            |  12 +-
 .../elasticsearch/UserRoutingKeyFactoryTest.java   |   5 +-
 .../ElasticSearchQuotaMailboxListenerTest.java     |   4 +-
 .../json/QuotaRatioToElasticSearchJsonTest.java    |   6 +-
 .../quota/search/scanning/ClauseConverter.java     |  20 +--
 .../search/scanning/ScanningQuotaSearcher.java     |  12 +-
 .../apache/james/quota/search/QuotaSearcher.java   |   6 +-
 .../james/quota/search/QuotaSearchFixture.java     |   4 +-
 .../james/quota/search/QuotaSearcherContract.java  |   6 +-
 .../james/mailbox/spamassassin/SpamAssassin.java   |  10 +-
 .../mailbox/spamassassin/SpamAssassinListener.java |  14 +-
 .../mailbox/store/StoreAttachmentManager.java      |  10 +-
 .../james/mailbox/store/StoreRightManager.java     |  12 +-
 .../mailbox/store/SystemMailboxesProviderImpl.java |  14 +-
 .../james/mailbox/store/event/EventFactory.java    |  82 ++++-----
 .../store/event/MailboxAnnotationListener.java     |   2 +-
 .../store/quota/DefaultUserQuotaRootResolver.java  |  18 +-
 .../store/quota/ListeningCurrentQuotaUpdater.java  |   4 +-
 .../store/search/ListeningMessageSearchIndex.java  |   2 +-
 .../store/event/MailboxAnnotationListenerTest.java |   2 +-
 .../quota/ListeningCurrentQuotaUpdaterTest.java    |  16 +-
 .../mailbox/tools/indexer/ReIndexerImpl.java       |   6 +-
 .../mailbox/tools/indexer/ReIndexerPerformer.java  |  10 +-
 .../mailbox/tools/indexer/ThrowsReIndexer.java     |   4 +-
 .../mailbox/tools/indexer/UserReindexingTask.java  |  30 ++--
 ...UserReindexingTaskAdditionalInformationDTO.java |   6 +-
 .../tools/indexer/UserReindexingTaskDTO.java       |   2 +-
 .../mailbox/tools/indexer/ReIndexerImplTest.java   |   4 +-
 .../UserReindexingTaskSerializationTest.java       |  16 +-
 .../james/mpt/host/JamesManageSieveHostSystem.java |   4 +-
 .../org/apache/james/mpt/smtp/SmtpTestRule.java    |   4 +-
 .../james/imap/processor/CopyProcessorTest.java    |   7 +-
 .../james/imap/processor/MoveProcessorTest.java    |   6 +-
 .../james/managesieve/core/CoreProcessor.java      |  16 +-
 .../james/modules/protocols/SieveProbeImpl.java    |  14 +-
 .../java/org/apache/james/rrt/lib/Mapping.java     |   8 +-
 .../org/apache/james/rrt/lib/MappingSource.java    |  28 ++--
 .../org/apache/james/rrt/lib/UserRewritter.java    |  12 +-
 .../sieverepository/api/SieveQuotaRepository.java  |  10 +-
 .../james/sieverepository/api/SieveRepository.java |  22 +--
 .../org/apache/james/user/api/UsersRepository.java |   3 +-
 .../java/org/apache/james/user/api/model/User.java |   8 +-
 .../apache/james/rrt/lib/DomainRewriterTest.java   |  11 +-
 .../apache/james/rrt/lib/MappingSourceTest.java    |   5 +-
 .../apache/james/rrt/lib/ReplaceRewriterTest.java  |  15 +-
 .../apache/james/rrt/lib/ThrowingRewriterTest.java |   4 +-
 .../sieve/cassandra/CassandraActiveScriptDAO.java  |  14 +-
 .../james/sieve/cassandra/CassandraSieveDAO.java   |  26 +--
 .../sieve/cassandra/CassandraSieveQuotaDAO.java    |  22 +--
 .../sieve/cassandra/CassandraSieveRepository.java  | 118 ++++++-------
 .../cassandra/CassandraActiveScriptDAOTest.java    |  26 +--
 .../sieve/cassandra/CassandraSieveDAOTest.java     |  40 ++---
 .../cassandra/CassandraSieveQuotaDAOTest.java      |  38 ++---
 .../sieverepository/file/SieveFileRepository.java  | 118 ++++++-------
 .../james/jmap/cassandra/filtering/DTOTest.java    |   8 +-
 .../jmap/api/filtering/FilteringManagement.java    |  14 +-
 .../api/filtering/impl/DefineRulesCommand.java     |  20 +--
 .../filtering/impl/DefineRulesCommandHandler.java  |   2 +-
 .../impl/EventSourcingFilteringManagement.java     |  12 +-
 .../api/filtering/impl/FilteringAggregateId.java   |  20 +--
 .../api/filtering/FilteringAggregateIdTest.java    |   4 +-
 .../api/filtering/FilteringManagementContract.java |  38 ++---
 .../api/filtering/impl/DefineRulesCommandTest.java |   4 +-
 .../apache/james/sieve/jpa/JPASieveRepository.java | 132 +++++++--------
 .../user/ldap/ReadOnlyUsersLDAPRepository.java     |   7 +-
 .../rrt/lib/AbstractRecipientRewriteTable.java     |  40 ++---
 .../lib/SieveRepositoryManagement.java             |  14 +-
 .../user/lib/AbstractJamesUsersRepository.java     |   3 +-
 .../james/user/lib/AbstractUsersRepository.java    |  10 +-
 .../lib/AbstractSieveRepositoryTest.java           | 186 ++++++++++-----------
 .../lib/SieveRepositoryManagementTest.java         |  14 +-
 .../user/lib/AbstractUsersRepositoryTest.java      |   5 +-
 .../rrt/memory/MemoryRecipientRewriteTable.java    |   4 +-
 .../memory/InMemorySieveQuotaRepository.java       |  22 +--
 .../james/user/memory/MemoryUsersRepository.java   |   3 +-
 .../james/transport/mailets/RandomStoring.java     |  12 +-
 .../james/transport/mailets/SpamAssassin.java      |   4 +-
 .../transport/mailets/jsieve/ResourceLocator.java  |  10 +-
 .../transport/mailets/ResourceLocatorTest.java     |   8 +-
 .../mailets/delivery/LocalDeliveryTest.java        |   6 +-
 .../mailets/delivery/ToRecipientFolderTest.java    |   6 +-
 .../managesieve/ManageSieveMailetTestCase.java     |  40 ++---
 .../draft/DefaultMailboxesProvisioningFilter.java  |  10 +-
 .../james/jmap/draft/UserProvisioningFilter.java   |  22 +--
 .../james/jmap/draft/methods/GetFilterMethod.java  |   6 +-
 .../james/jmap/draft/methods/RequestHandler.java   |   4 +-
 .../james/jmap/draft/methods/SetFilterMethod.java  |   6 +-
 .../methods/SetMessagesCreationProcessor.java      |   4 +-
 .../draft/methods/SetMessagesUpdateProcessor.java  |   4 +-
 .../org/apache/james/jmap/draft/model/JmapMDN.java |   8 +-
 .../jmap/event/PropagateLookupRightListener.java   |   2 +-
 .../james/jmap/mailet/filter/ActionApplier.java    |  16 +-
 .../james/jmap/mailet/filter/JMAPFiltering.java    |  14 +-
 .../jmap/draft/methods/GetMessagesMethodTest.java  |   4 +-
 .../methods/GetVacationResponseMethodTest.java     |  12 +-
 .../methods/SetMessagesCreationProcessorTest.java  |   4 +-
 .../methods/SetVacationResponseMethodTest.java     |  11 +-
 .../jmap/mailet/filter/JMAPFilteringExtension.java |   4 +-
 .../jmap/mailet/filter/JMAPFilteringTest.java      |  16 +-
 ...dminServerTaskSerializationIntegrationTest.java |  12 +-
 .../apache/james/webadmin/routes/AliasRoutes.java  |   4 +-
 .../james/webadmin/routes/ForwardRoutes.java       |   6 +-
 .../apache/james/webadmin/routes/GroupsRoutes.java |   6 +-
 .../james/webadmin/routes/MappingRoutes.java       |   6 +-
 .../james/webadmin/routes/RegexMappingRoutes.java  |   4 +-
 .../james/webadmin/routes/SieveQuotaRoutes.java    |  16 +-
 .../james/webadmin/routes/SieveScriptRoutes.java   |  12 +-
 .../apache/james/webadmin/service/UserService.java |   3 +-
 .../james/webadmin/routes/GroupsRoutesTest.java    |   4 +-
 .../james/webadmin/routes/MappingRoutesTest.java   |  62 +++----
 .../webadmin/routes/RegexMappingRoutesTest.java    |  16 +-
 .../webadmin/routes/SieveQuotaRoutesTest.java      |  14 +-
 .../webadmin/routes/SieveScriptRoutesTest.java     |  10 +-
 .../routes/DeletedMessagesVaultDeleteTask.java     |  32 ++--
 ...gesVaultDeleteTaskAdditionalInformationDTO.java |   6 +-
 .../routes/DeletedMessagesVaultDeleteTaskDTO.java  |   2 +-
 .../routes/DeletedMessagesVaultExportTask.java     |  12 +-
 ...gesVaultExportTaskAdditionalInformationDTO.java |   4 +-
 .../routes/DeletedMessagesVaultExportTaskDTO.java  |   4 +-
 .../routes/DeletedMessagesVaultRestoreTask.java    |  18 +-
 ...esVaultRestoreTaskAdditionalInformationDTO.java |   6 +-
 .../routes/DeletedMessagesVaultRestoreTaskDTO.java |   6 +-
 .../vault/routes/DeletedMessagesVaultRoutes.java   |  26 +--
 .../james/webadmin/vault/routes/ExportService.java |  26 +--
 .../webadmin/vault/routes/RestoreService.java      |   8 +-
 ...edMessagesVaultDeleteTaskSerializationTest.java |  15 +-
 ...edMessagesVaultExportTaskSerializationTest.java |  10 +-
 ...dMessagesVaultRestoreTaskSerializationTest.java |  10 +-
 .../routes/DeletedMessagesVaultRoutesTest.java     | 136 +++++++--------
 .../james/webadmin/dto/UsersQuotaDetailsDTO.java   |  22 +--
 .../james/webadmin/routes/ReindexingRoutes.java    |   6 +-
 .../james/webadmin/routes/UserQuotaRoutes.java     |  38 ++---
 .../james/webadmin/service/UserQuotaService.java   |  34 ++--
 .../webadmin/dto/UsersQuotaDetailsDTOTest.java     |  10 +-
 .../routes/EventDeadLettersRoutesTest.java         |   6 +-
 .../webadmin/routes/ReindexingRoutesTest.java      |   4 +-
 .../james/webadmin/routes/UserQuotaRoutesTest.java |  16 +-
 .../james/spamassassin/SpamAssassinInvoker.java    |  18 +-
 .../spamassassin/SpamAssassinInvokerTest.java      |  30 ++--
 222 files changed, 1772 insertions(+), 1763 deletions(-)
 rename core/src/main/java/org/apache/james/core/{User.java => Username.java} (77%)
 rename core/src/test/java/org/apache/james/core/{UserTest.java => UsernameTest.java} (65%)


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


[james-project] 01/02: JAMES-2949 Rename core.User to core.Username

Posted by ro...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 3bcfde90573bfb2cad7ca139b439cbc8376550da
Author: Raphael Ouazana <ra...@linagora.com>
AuthorDate: Wed Oct 30 16:23:21 2019 +0100

    JAMES-2949 Rename core.User to core.Username
---
 .../apache/james/core/{User.java => Username.java} |  38 ++---
 .../java/org/apache/james/core/CoreFixture.java    |  16 +-
 .../core/{UserTest.java => UsernameTest.java}      |  98 +++++------
 .../listeners/SetCustomFlagOnBigMessages.java      |   4 +-
 .../org/apache/james/mailbox/MailboxSession.java   |   6 +-
 .../james/mailbox/SystemMailboxesProvider.java     |   8 +-
 .../org/apache/james/mailbox/events/Event.java     |   4 +-
 .../james/mailbox/events/MailboxListener.java      |  92 +++++-----
 .../james/mailbox/events/MessageMoveEvent.java     |  28 ++--
 .../apache/james/mailbox/indexer/ReIndexer.java    |   4 +-
 .../james/mailbox/model/search/MailboxQuery.java   |  10 +-
 .../james/mailbox/quota/UserQuotaRootResolver.java |   5 +-
 .../apache/james/mailbox/MailboxListenerTest.java  |   4 +-
 .../apache/james/mailbox/MessageMoveEventTest.java |   4 +-
 .../james/mailbox/events/EventBusTestFixture.java  |  10 +-
 .../mailbox/events/EventDeadLettersContract.java   |  12 +-
 .../apache/james/mailbox/events/GroupContract.java |   6 +-
 .../apache/james/mailbox/events/KeyContract.java   |   4 +-
 .../james/mailbox/backup/DefaultMailboxBackup.java |  20 +--
 .../james/mailbox/backup/MailArchiveRestorer.java  |   4 +-
 .../apache/james/mailbox/backup/MailboxBackup.java |  10 +-
 .../mailbox/backup/ZipMailArchiveRestorer.java     |   6 +-
 .../mailbox/backup/DefaultMailboxBackupTest.java   |  28 ++--
 .../mailbox/backup/MailboxMessageFixture.java      |   6 +-
 .../mailbox/backup/ZipArchivesLoaderTest.java      |   8 +-
 .../json/MessageToElasticSearchJson.java           |   6 +-
 .../json/MessageToElasticSearchJsonTest.java       |  29 ++--
 .../mailbox/events/delivery/InVmEventDelivery.java |   4 +-
 .../james/mailbox/events/EventDispatcher.java      |   2 +-
 .../james/mailbox/events/GroupConsumerRetry.java   |   2 +-
 .../mailbox/events/KeyRegistrationHandler.java     |   2 +-
 .../mailbox/events/MailboxListenerExecutor.java    |   2 +-
 .../apache/james/event/json/EventSerializer.scala  |  44 ++---
 .../james/event/json/AddedSerializationTest.java   |   8 +-
 .../event/json/ExpungedSerializationTest.java      |   8 +-
 .../event/json/FlagsUpdatedSerializationTest.java  |   8 +-
 .../MailboxACLUpdatedEventSerializationTest.java   |   6 +-
 .../event/json/MailboxAddedSerializationTest.java  |   6 +-
 .../json/MailboxDeletionSerializationTest.java     |   8 +-
 .../json/MailboxRenamedSerializationTest.java      |  10 +-
 .../json/MessageMoveEventSerializationTest.java    |  10 +-
 .../QuotaUsageUpdatedEventSerializationTest.java   |   4 +-
 .../org/apache/james/event/json/dtos/UserTest.java |  11 +-
 .../CassandraDeletedMessageMetadataVault.java      |  18 +-
 .../vault/metadata/DeletedMessageIdentifier.java   |   8 +-
 .../apache/james/vault/metadata/MetadataDAO.java   |  18 +-
 .../vault/metadata/StorageInformationDAO.java      |  14 +-
 .../james/vault/metadata/UserPerBucketDAO.java     |  10 +-
 .../CassandraDeletedMessageMetadataVaultTest.java  |  42 ++---
 .../james/vault/metadata/MetadataDAOTest.java      |  34 ++--
 .../vault/metadata/StorageInformationDAOTest.java  |   4 +-
 .../james/vault/metadata/UserPerBucketDAOTest.java |   7 +-
 .../org/apache/james/vault/DeletedMessage.java     |  14 +-
 .../DeletedMessageContentNotFoundException.java    |   6 +-
 .../james/vault/DeletedMessageConverter.java       |   4 +-
 .../apache/james/vault/DeletedMessageVault.java    |   8 +-
 .../james/vault/DeletedMessageVaultHook.java       |  16 +-
 .../vault/blob/BlobStoreDeletedMessageVault.java   |  36 ++--
 ...etedMessageWithStorageInformationConverter.java |   4 +-
 .../MemoryDeletedMessageMetadataVault.java         |  20 +--
 .../metadata/DeletedMessageMetadataVault.java      |   8 +-
 .../james/vault/DeletedMessageConverterTest.java   |   8 +-
 .../apache/james/vault/DeletedMessageFixture.java  |  14 +-
 .../org/apache/james/vault/DeletedMessageTest.java |   4 +-
 .../james/vault/DeletedMessageVaultContract.java   |  50 +++---
 .../james/vault/DeletedMessageVaultHookTest.java   |  10 +-
 .../vault/DeletedMessageVaultSearchContract.java   |  22 +--
 .../blob/BlobStoreDeletedMessageVaultTest.java     |  16 +-
 .../DeletedMessageMetadataVaultContract.java       |  26 +--
 .../james/mailbox/quota/cassandra/dto/DTOTest.java |  10 +-
 .../mailing/aggregates/UserQuotaThresholds.java    |  28 ++--
 .../mailing/commands/DetectThresholdCrossing.java  |  16 +-
 .../commands/DetectThresholdCrossingHandler.java   |   2 +-
 .../listeners/QuotaThresholdCrossingListener.java  |   8 +-
 .../mailing/subscribers/QuotaThresholdMailer.java  |   8 +-
 .../aggregates/UserQuotaThresholdsTest.java        |   8 +-
 .../QuotaThresholdConfigurationChangesTest.java    |   4 +-
 .../QuotaThresholdMailingIntegrationTest.java      |   4 +-
 .../mailbox/quota/model/QuotaThresholdFixture.java |   4 +-
 .../elasticsearch/ElasticSearchQuotaSearcher.java  |   6 +-
 .../elasticsearch/UserRoutingKeyFactory.java       |   6 +-
 .../events/ElasticSearchQuotaMailboxListener.java  |  10 +-
 .../json/QuotaRatioToElasticSearchJson.java        |   2 +-
 .../ElasticSearchQuotaSearcherTest.java            |  12 +-
 .../elasticsearch/UserRoutingKeyFactoryTest.java   |   5 +-
 .../ElasticSearchQuotaMailboxListenerTest.java     |   4 +-
 .../json/QuotaRatioToElasticSearchJsonTest.java    |   6 +-
 .../quota/search/scanning/ClauseConverter.java     |  20 +--
 .../search/scanning/ScanningQuotaSearcher.java     |  12 +-
 .../apache/james/quota/search/QuotaSearcher.java   |   6 +-
 .../james/quota/search/QuotaSearchFixture.java     |   4 +-
 .../james/quota/search/QuotaSearcherContract.java  |   6 +-
 .../james/mailbox/spamassassin/SpamAssassin.java   |  10 +-
 .../mailbox/spamassassin/SpamAssassinListener.java |  14 +-
 .../mailbox/store/StoreAttachmentManager.java      |  10 +-
 .../james/mailbox/store/StoreRightManager.java     |  12 +-
 .../mailbox/store/SystemMailboxesProviderImpl.java |  14 +-
 .../james/mailbox/store/event/EventFactory.java    |  82 ++++-----
 .../store/event/MailboxAnnotationListener.java     |   2 +-
 .../store/quota/DefaultUserQuotaRootResolver.java  |  18 +-
 .../store/quota/ListeningCurrentQuotaUpdater.java  |   4 +-
 .../store/search/ListeningMessageSearchIndex.java  |   2 +-
 .../store/event/MailboxAnnotationListenerTest.java |   2 +-
 .../quota/ListeningCurrentQuotaUpdaterTest.java    |  16 +-
 .../mailbox/tools/indexer/ReIndexerImpl.java       |   6 +-
 .../mailbox/tools/indexer/ReIndexerPerformer.java  |  10 +-
 .../mailbox/tools/indexer/ThrowsReIndexer.java     |   4 +-
 .../mailbox/tools/indexer/UserReindexingTask.java  |  30 ++--
 ...UserReindexingTaskAdditionalInformationDTO.java |   6 +-
 .../tools/indexer/UserReindexingTaskDTO.java       |   2 +-
 .../mailbox/tools/indexer/ReIndexerImplTest.java   |   4 +-
 .../UserReindexingTaskSerializationTest.java       |  16 +-
 .../james/mpt/host/JamesManageSieveHostSystem.java |   4 +-
 .../org/apache/james/mpt/smtp/SmtpTestRule.java    |   4 +-
 .../james/imap/processor/CopyProcessorTest.java    |   7 +-
 .../james/imap/processor/MoveProcessorTest.java    |   6 +-
 .../james/managesieve/core/CoreProcessor.java      |  16 +-
 .../james/modules/protocols/SieveProbeImpl.java    |  14 +-
 .../java/org/apache/james/rrt/lib/Mapping.java     |   8 +-
 .../org/apache/james/rrt/lib/MappingSource.java    |  28 ++--
 .../org/apache/james/rrt/lib/UserRewritter.java    |  12 +-
 .../sieverepository/api/SieveQuotaRepository.java  |  10 +-
 .../james/sieverepository/api/SieveRepository.java |  22 +--
 .../org/apache/james/user/api/UsersRepository.java |   3 +-
 .../java/org/apache/james/user/api/model/User.java |   8 +-
 .../apache/james/rrt/lib/DomainRewriterTest.java   |  11 +-
 .../apache/james/rrt/lib/MappingSourceTest.java    |   5 +-
 .../apache/james/rrt/lib/ReplaceRewriterTest.java  |  15 +-
 .../apache/james/rrt/lib/ThrowingRewriterTest.java |   4 +-
 .../sieve/cassandra/CassandraActiveScriptDAO.java  |  14 +-
 .../james/sieve/cassandra/CassandraSieveDAO.java   |  26 +--
 .../sieve/cassandra/CassandraSieveQuotaDAO.java    |  22 +--
 .../sieve/cassandra/CassandraSieveRepository.java  | 118 ++++++-------
 .../cassandra/CassandraActiveScriptDAOTest.java    |  26 +--
 .../sieve/cassandra/CassandraSieveDAOTest.java     |  40 ++---
 .../cassandra/CassandraSieveQuotaDAOTest.java      |  38 ++---
 .../sieverepository/file/SieveFileRepository.java  | 118 ++++++-------
 .../james/jmap/cassandra/filtering/DTOTest.java    |   8 +-
 .../jmap/api/filtering/FilteringManagement.java    |  14 +-
 .../api/filtering/impl/DefineRulesCommand.java     |  20 +--
 .../filtering/impl/DefineRulesCommandHandler.java  |   2 +-
 .../impl/EventSourcingFilteringManagement.java     |  12 +-
 .../api/filtering/impl/FilteringAggregateId.java   |  20 +--
 .../api/filtering/FilteringAggregateIdTest.java    |   4 +-
 .../api/filtering/FilteringManagementContract.java |  38 ++---
 .../api/filtering/impl/DefineRulesCommandTest.java |   4 +-
 .../apache/james/sieve/jpa/JPASieveRepository.java | 132 +++++++--------
 .../user/ldap/ReadOnlyUsersLDAPRepository.java     |   7 +-
 .../rrt/lib/AbstractRecipientRewriteTable.java     |  40 ++---
 .../lib/SieveRepositoryManagement.java             |  14 +-
 .../user/lib/AbstractJamesUsersRepository.java     |   3 +-
 .../james/user/lib/AbstractUsersRepository.java    |  10 +-
 .../lib/AbstractSieveRepositoryTest.java           | 186 ++++++++++-----------
 .../lib/SieveRepositoryManagementTest.java         |  14 +-
 .../user/lib/AbstractUsersRepositoryTest.java      |   5 +-
 .../rrt/memory/MemoryRecipientRewriteTable.java    |   4 +-
 .../memory/InMemorySieveQuotaRepository.java       |  22 +--
 .../james/user/memory/MemoryUsersRepository.java   |   3 +-
 .../james/transport/mailets/RandomStoring.java     |  12 +-
 .../james/transport/mailets/SpamAssassin.java      |   4 +-
 .../transport/mailets/jsieve/ResourceLocator.java  |  10 +-
 .../transport/mailets/ResourceLocatorTest.java     |   8 +-
 .../mailets/delivery/LocalDeliveryTest.java        |   6 +-
 .../mailets/delivery/ToRecipientFolderTest.java    |   6 +-
 .../managesieve/ManageSieveMailetTestCase.java     |  40 ++---
 .../draft/DefaultMailboxesProvisioningFilter.java  |  10 +-
 .../james/jmap/draft/UserProvisioningFilter.java   |  22 +--
 .../james/jmap/draft/methods/GetFilterMethod.java  |   6 +-
 .../james/jmap/draft/methods/RequestHandler.java   |   4 +-
 .../james/jmap/draft/methods/SetFilterMethod.java  |   6 +-
 .../methods/SetMessagesCreationProcessor.java      |   4 +-
 .../draft/methods/SetMessagesUpdateProcessor.java  |   4 +-
 .../org/apache/james/jmap/draft/model/JmapMDN.java |   8 +-
 .../jmap/event/PropagateLookupRightListener.java   |   2 +-
 .../james/jmap/mailet/filter/ActionApplier.java    |  16 +-
 .../james/jmap/mailet/filter/JMAPFiltering.java    |  14 +-
 .../jmap/draft/methods/GetMessagesMethodTest.java  |   4 +-
 .../methods/GetVacationResponseMethodTest.java     |  12 +-
 .../methods/SetMessagesCreationProcessorTest.java  |   4 +-
 .../methods/SetVacationResponseMethodTest.java     |  11 +-
 .../jmap/mailet/filter/JMAPFilteringExtension.java |   4 +-
 .../jmap/mailet/filter/JMAPFilteringTest.java      |  16 +-
 ...dminServerTaskSerializationIntegrationTest.java |  12 +-
 .../apache/james/webadmin/routes/AliasRoutes.java  |   4 +-
 .../james/webadmin/routes/ForwardRoutes.java       |   6 +-
 .../apache/james/webadmin/routes/GroupsRoutes.java |   6 +-
 .../james/webadmin/routes/MappingRoutes.java       |   6 +-
 .../james/webadmin/routes/RegexMappingRoutes.java  |   4 +-
 .../james/webadmin/routes/SieveQuotaRoutes.java    |  16 +-
 .../james/webadmin/routes/SieveScriptRoutes.java   |  12 +-
 .../apache/james/webadmin/service/UserService.java |   3 +-
 .../james/webadmin/routes/GroupsRoutesTest.java    |   4 +-
 .../james/webadmin/routes/MappingRoutesTest.java   |  62 +++----
 .../webadmin/routes/RegexMappingRoutesTest.java    |  16 +-
 .../webadmin/routes/SieveQuotaRoutesTest.java      |  14 +-
 .../webadmin/routes/SieveScriptRoutesTest.java     |  10 +-
 .../routes/DeletedMessagesVaultDeleteTask.java     |  32 ++--
 ...gesVaultDeleteTaskAdditionalInformationDTO.java |   6 +-
 .../routes/DeletedMessagesVaultDeleteTaskDTO.java  |   2 +-
 .../routes/DeletedMessagesVaultExportTask.java     |  12 +-
 ...gesVaultExportTaskAdditionalInformationDTO.java |   4 +-
 .../routes/DeletedMessagesVaultExportTaskDTO.java  |   4 +-
 .../routes/DeletedMessagesVaultRestoreTask.java    |  18 +-
 ...esVaultRestoreTaskAdditionalInformationDTO.java |   6 +-
 .../routes/DeletedMessagesVaultRestoreTaskDTO.java |   6 +-
 .../vault/routes/DeletedMessagesVaultRoutes.java   |  26 +--
 .../james/webadmin/vault/routes/ExportService.java |  26 +--
 .../webadmin/vault/routes/RestoreService.java      |   8 +-
 ...edMessagesVaultDeleteTaskSerializationTest.java |  15 +-
 ...edMessagesVaultExportTaskSerializationTest.java |  10 +-
 ...dMessagesVaultRestoreTaskSerializationTest.java |  10 +-
 .../routes/DeletedMessagesVaultRoutesTest.java     | 136 +++++++--------
 .../james/webadmin/dto/UsersQuotaDetailsDTO.java   |  22 +--
 .../james/webadmin/routes/ReindexingRoutes.java    |   6 +-
 .../james/webadmin/routes/UserQuotaRoutes.java     |  38 ++---
 .../james/webadmin/service/UserQuotaService.java   |  34 ++--
 .../webadmin/dto/UsersQuotaDetailsDTOTest.java     |  10 +-
 .../routes/EventDeadLettersRoutesTest.java         |   6 +-
 .../webadmin/routes/ReindexingRoutesTest.java      |   4 +-
 .../james/webadmin/routes/UserQuotaRoutesTest.java |  16 +-
 .../james/spamassassin/SpamAssassinInvoker.java    |  18 +-
 .../spamassassin/SpamAssassinInvokerTest.java      |  30 ++--
 222 files changed, 1772 insertions(+), 1763 deletions(-)

diff --git a/core/src/main/java/org/apache/james/core/User.java b/core/src/main/java/org/apache/james/core/Username.java
similarity index 77%
rename from core/src/main/java/org/apache/james/core/User.java
rename to core/src/main/java/org/apache/james/core/Username.java
index 044f730..7049dbf 100644
--- a/core/src/main/java/org/apache/james/core/User.java
+++ b/core/src/main/java/org/apache/james/core/Username.java
@@ -31,10 +31,10 @@ import com.google.common.base.Splitter;
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
 
-public class User {
+public class Username {
     public static final int MAXIMUM_MAIL_ADDRESS_LENGTH = 255;
 
-    public static User fromUsername(String username) {
+    public static Username fromUsername(String username) {
         Preconditions.checkArgument(!Strings.isNullOrEmpty(username));
         Preconditions.checkArgument(username.length() <= MAXIMUM_MAIL_ADDRESS_LENGTH);
 
@@ -48,37 +48,37 @@ public class User {
         throw new IllegalArgumentException("The username should not contain multiple domain delimiter.");
     }
 
-    public static User fromLocalPartWithDomain(String localPart, String domain) {
+    public static Username fromLocalPartWithDomain(String localPart, String domain) {
         Preconditions.checkNotNull(domain);
 
         return fromLocalPartWithDomain(localPart, Domain.of(domain));
     }
 
-    public static User fromLocalPartWithDomain(String localPart, Domain domain) {
+    public static Username fromLocalPartWithDomain(String localPart, Domain domain) {
         Preconditions.checkNotNull(domain);
 
-        return new User(localPart, Optional.of(domain));
+        return new Username(localPart, Optional.of(domain));
     }
 
-    public static User fromMailAddress(MailAddress address) {
+    public static Username fromMailAddress(MailAddress address) {
         Preconditions.checkNotNull(address);
 
-        return new User(address.getLocalPart(), Optional.of(address.getDomain()));
+        return new Username(address.getLocalPart(), Optional.of(address.getDomain()));
     }
 
-    public static User fromLocalPartWithoutDomain(String localPart) {
+    public static Username fromLocalPartWithoutDomain(String localPart) {
         return from(localPart,
             Optional.empty());
     }
 
-    public static User from(String localPart, Optional<String> domain) {
-       return new User(localPart, domain.map(Domain::of));
+    public static Username from(String localPart, Optional<String> domain) {
+       return new Username(localPart, domain.map(Domain::of));
     }
 
     private final String localPart;
     private final Optional<Domain> domainPart;
 
-    private User(String localPart, Optional<Domain> domainPart) {
+    private Username(String localPart, Optional<Domain> domainPart) {
         Preconditions.checkNotNull(localPart);
         Preconditions.checkArgument(!localPart.isEmpty(), "username should not be empty");
         Preconditions.checkArgument(!localPart.contains("@"), "username can not contain domain delimiter");
@@ -99,18 +99,18 @@ public class User {
         return domainPart.isPresent();
     }
 
-    public User withDefaultDomain(Optional<Domain> defaultDomain) {
+    public Username withDefaultDomain(Optional<Domain> defaultDomain) {
         if (hasDomainPart()) {
             return this;
         }
-        return new User(localPart, defaultDomain);
+        return new Username(localPart, defaultDomain);
     }
 
-    public User withDefaultDomain(Domain defaultDomain) {
+    public Username withDefaultDomain(Domain defaultDomain) {
         return withDefaultDomain(Optional.of(defaultDomain));
     }
 
-    public User withDefaultDomainFromUser(User other) {
+    public Username withDefaultDomainFromUser(Username other) {
         return withDefaultDomain(other.domainPart);
     }
 
@@ -126,11 +126,11 @@ public class User {
 
     @Override
     public final boolean equals(Object o) {
-        if (o instanceof User) {
-            User user = (User) o;
+        if (o instanceof Username) {
+            Username username = (Username) o;
 
-            return Objects.equals(this.localPart, user.localPart)
-                && Objects.equals(this.domainPart, user.domainPart);
+            return Objects.equals(this.localPart, username.localPart)
+                && Objects.equals(this.domainPart, username.domainPart);
         }
         return false;
     }
diff --git a/core/src/test/java/org/apache/james/core/CoreFixture.java b/core/src/test/java/org/apache/james/core/CoreFixture.java
index 4220bc3..09cac8e 100644
--- a/core/src/test/java/org/apache/james/core/CoreFixture.java
+++ b/core/src/test/java/org/apache/james/core/CoreFixture.java
@@ -32,18 +32,18 @@ public interface CoreFixture {
 
     interface Users {
         interface Simpson {
-            User BART = User.fromLocalPartWithDomain("bart", SIMPSON_COM);
-            User HOMER = User.fromLocalPartWithDomain("homer", SIMPSON_COM);
-            User LISA = User.fromLocalPartWithDomain("lisa", SIMPSON_COM);
+            Username BART = Username.fromLocalPartWithDomain("bart", SIMPSON_COM);
+            Username HOMER = Username.fromLocalPartWithDomain("homer", SIMPSON_COM);
+            Username LISA = Username.fromLocalPartWithDomain("lisa", SIMPSON_COM);
         }
 
         interface Alphabet {
-            User AAA = User.fromLocalPartWithDomain("aaa", ALPHABET_TLD);
-            User ABA = User.fromLocalPartWithDomain("aba", ALPHABET_TLD);
-            User ABB = User.fromLocalPartWithDomain("abb", ALPHABET_TLD);
-            User ACB = User.fromLocalPartWithDomain("acb", ALPHABET_TLD);
+            Username AAA = Username.fromLocalPartWithDomain("aaa", ALPHABET_TLD);
+            Username ABA = Username.fromLocalPartWithDomain("aba", ALPHABET_TLD);
+            Username ABB = Username.fromLocalPartWithDomain("abb", ALPHABET_TLD);
+            Username ACB = Username.fromLocalPartWithDomain("acb", ALPHABET_TLD);
         }
 
-        User BENOIT_AT_DOMAIN_TLD = User.fromLocalPartWithDomain("benoit", DOMAIN_TLD);
+        Username BENOIT_AT_DOMAIN_TLD = Username.fromLocalPartWithDomain("benoit", DOMAIN_TLD);
     }
 }
diff --git a/core/src/test/java/org/apache/james/core/UserTest.java b/core/src/test/java/org/apache/james/core/UsernameTest.java
similarity index 64%
rename from core/src/test/java/org/apache/james/core/UserTest.java
rename to core/src/test/java/org/apache/james/core/UsernameTest.java
index bbf83d9..7ce0136 100644
--- a/core/src/test/java/org/apache/james/core/UserTest.java
+++ b/core/src/test/java/org/apache/james/core/UsernameTest.java
@@ -28,219 +28,219 @@ import org.apache.commons.lang3.StringUtils;
 
 import org.junit.Test;
 
-public class UserTest {
+public class UsernameTest {
 
     @Test
     public void fromShouldThrowOnEmptyLocalPart() {
-        assertThatThrownBy(() -> User.from("", Optional.empty()))
+        assertThatThrownBy(() -> Username.from("", Optional.empty()))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
     public void fromShouldThrowOnNullDomainPart() {
-        assertThatThrownBy(() -> User.from(null, Optional.empty()))
+        assertThatThrownBy(() -> Username.from(null, Optional.empty()))
             .isInstanceOf(NullPointerException.class);
     }
 
     @Test
     public void fromShouldThrowOnLocalPartWithDomainDelimiter() {
-        assertThatThrownBy(() -> User.from("aa@bb", Optional.empty()))
+        assertThatThrownBy(() -> Username.from("aa@bb", Optional.empty()))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
     public void fromShouldThrowOnEmptyDomain() {
-        assertThatThrownBy(() -> User.from("aa", Optional.of("")))
+        assertThatThrownBy(() -> Username.from("aa", Optional.of("")))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
     public void fromShouldThrowWhenDomainContainsDomainDelimiter() {
-        assertThatThrownBy(() -> User.from("aa", Optional.of("bb@cc")))
+        assertThatThrownBy(() -> Username.from("aa", Optional.of("bb@cc")))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
     public void fromLocalPartWithDomainStringVersionShouldThrowOnNullLocalPart() {
-        assertThatThrownBy(() -> User.fromLocalPartWithDomain(null, "domain"))
+        assertThatThrownBy(() -> Username.fromLocalPartWithDomain(null, "domain"))
             .isInstanceOf(NullPointerException.class);
     }
 
     @Test
     public void fromLocalPartWithDomainStringVersionShouldThrowOnEmptyLocalPart() {
-        assertThatThrownBy(() -> User.fromLocalPartWithDomain("", "domain"))
+        assertThatThrownBy(() -> Username.fromLocalPartWithDomain("", "domain"))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
     public void fromLocalPartWithDomainStringVersionShouldThrowOnLocalPartThatContainsDomainDelimiter() {
-        assertThatThrownBy(() -> User.fromLocalPartWithDomain("aa@bb", "domain"))
+        assertThatThrownBy(() -> Username.fromLocalPartWithDomain("aa@bb", "domain"))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
     public void fromLocalPartWithDomainStringVersionShouldThrowOnNullDomainPart() {
         String domain = null;
-        assertThatThrownBy(() -> User.fromLocalPartWithDomain("local", domain))
+        assertThatThrownBy(() -> Username.fromLocalPartWithDomain("local", domain))
             .isInstanceOf(NullPointerException.class);
     }
 
     @Test
     public void fromLocalPartWithDomainStringVersionShouldThrowOnEmptyDomainPart() {
-        assertThatThrownBy(() -> User.fromLocalPartWithDomain("local", ""))
+        assertThatThrownBy(() -> Username.fromLocalPartWithDomain("local", ""))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
     public void fromLocalPartWithDomainStringVersionShouldThrowOnDomainPartThatContainsDomainDelimiter() {
-        assertThatThrownBy(() -> User.fromLocalPartWithDomain("local", "aa@bb"))
+        assertThatThrownBy(() -> Username.fromLocalPartWithDomain("local", "aa@bb"))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
     public void fromLocalPartWithoutDomainShouldThrowOnEmpty() {
-        assertThatThrownBy(() -> User.fromLocalPartWithoutDomain(""))
+        assertThatThrownBy(() -> Username.fromLocalPartWithoutDomain(""))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
     public void fromLocalPartWithoutDomainShouldThrowOnNull() {
-        assertThatThrownBy(() -> User.fromLocalPartWithoutDomain(null))
+        assertThatThrownBy(() -> Username.fromLocalPartWithoutDomain(null))
             .isInstanceOf(NullPointerException.class);
     }
 
     @Test
     public void fromLocalPartWithoutDomainShouldThrowOnUsernameThatContainsDomainDelimiter() {
-        assertThatThrownBy(() -> User.fromLocalPartWithoutDomain("aa@bb"))
+        assertThatThrownBy(() -> Username.fromLocalPartWithoutDomain("aa@bb"))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
     public void fromUsernameShouldThrowOnNull() {
-        assertThatThrownBy(() -> User.fromUsername(null))
+        assertThatThrownBy(() -> Username.fromUsername(null))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
     public void fromUsernameShouldThrowOnEmpty() {
-        assertThatThrownBy(() -> User.fromUsername(""))
+        assertThatThrownBy(() -> Username.fromUsername(""))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
     public void fromUsernameShouldAllow255LongUsername() {
         String tail = "@a";
-        assertThat(User.fromUsername(StringUtils.repeat('j', 255 - tail.length()) + tail).asString())
+        assertThat(Username.fromUsername(StringUtils.repeat('j', 255 - tail.length()) + tail).asString())
             .hasSize(255);
     }
 
     @Test
     public void fromUsernameShouldThrowWhenTooLong() {
         String tail = "@a";
-        assertThatThrownBy(() -> User.fromUsername(StringUtils.repeat('j', 255 - tail.length() + 1) + tail))
+        assertThatThrownBy(() -> Username.fromUsername(StringUtils.repeat('j', 255 - tail.length() + 1) + tail))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
     public void fromUsernameShouldThrowWhenMultipleDomainDelimiter() {
-        assertThatThrownBy(() -> User.fromUsername("aa@aa@aa"))
+        assertThatThrownBy(() -> Username.fromUsername("aa@aa@aa"))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
     public void fromUsernameShouldThrowWhenEndsWithDomainDelimiter() {
-        assertThatThrownBy(() -> User.fromUsername("aa@"))
+        assertThatThrownBy(() -> Username.fromUsername("aa@"))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
     public void fromUsernameShouldThrowWhenStartsWithDomainDelimiter() {
-        assertThatThrownBy(() -> User.fromUsername("@aa"))
+        assertThatThrownBy(() -> Username.fromUsername("@aa"))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
     public void fromUsernameShouldParseUsernameWithDomain() {
-        assertThat(User.fromUsername("aa@bb"))
-            .isEqualTo(User.from("aa", Optional.of("bb")));
+        assertThat(Username.fromUsername("aa@bb"))
+            .isEqualTo(Username.from("aa", Optional.of("bb")));
     }
 
     @Test
     public void fromUsernameShouldParseUsernameWithoutDomain() {
-        assertThat(User.fromUsername("aa"))
-            .isEqualTo(User.from("aa", Optional.empty()));
+        assertThat(Username.fromUsername("aa"))
+            .isEqualTo(Username.from("aa", Optional.empty()));
     }
 
     @Test
     public void fromLocalPartWithDomainShouldReturnAValidUser() {
-        assertThat(User.fromLocalPartWithDomain("aa", "bb"))
-            .isEqualTo(User.from("aa", Optional.of("bb")));
+        assertThat(Username.fromLocalPartWithDomain("aa", "bb"))
+            .isEqualTo(Username.from("aa", Optional.of("bb")));
     }
 
     @Test
     public void fromLocalPartWithoutDomainShouldReturnAValidUser() {
-        assertThat(User.fromLocalPartWithoutDomain("aa"))
-            .isEqualTo(User.from("aa", Optional.empty()));
+        assertThat(Username.fromLocalPartWithoutDomain("aa"))
+            .isEqualTo(Username.from("aa", Optional.empty()));
     }
 
     @Test
     public void hasDomainPartShouldReturnFalseWhenNoDomain() {
-        assertThat(User.fromLocalPartWithoutDomain("aa").hasDomainPart())
+        assertThat(Username.fromLocalPartWithoutDomain("aa").hasDomainPart())
             .isFalse();
     }
 
     @Test
     public void hasDomainPartShouldReturnTrueWhenHasADomain() {
-        assertThat(User.fromLocalPartWithDomain("aa", "domain").hasDomainPart())
+        assertThat(Username.fromLocalPartWithDomain("aa", "domain").hasDomainPart())
             .isTrue();
     }
 
     @Test
     public void withDefaultDomainShouldAppendDefaultDomainWhenNone() {
-        assertThat(User.fromUsername("user")
+        assertThat(Username.fromUsername("user")
             .withDefaultDomain(Domain.LOCALHOST))
-            .isEqualTo(User.fromLocalPartWithDomain("user", Domain.LOCALHOST));
+            .isEqualTo(Username.fromLocalPartWithDomain("user", Domain.LOCALHOST));
     }
 
     @Test
     public void withDefaultDomainShouldNotAppendDefaultDomainWhenDomainIsPresent() {
-        assertThat(User.fromUsername("user@domain")
+        assertThat(Username.fromUsername("user@domain")
             .withDefaultDomain(Domain.LOCALHOST))
-            .isEqualTo(User.fromUsername("user@domain"));
+            .isEqualTo(Username.fromUsername("user@domain"));
     }
 
     @Test
     public void withDefaultDomainShouldNotThrowUponEmptyDomain() {
-        assertThat(User.fromUsername("user")
+        assertThat(Username.fromUsername("user")
             .withDefaultDomain(Optional.empty()))
-            .isEqualTo(User.fromUsername("user"));
+            .isEqualTo(Username.fromUsername("user"));
     }
 
     @Test
     public void withDefaultDomainShouldNotThrowUponEmptyDomainWhenUsersHadADomain() {
-        assertThat(User.fromUsername("user@domain")
+        assertThat(Username.fromUsername("user@domain")
             .withDefaultDomain(Optional.empty()))
-            .isEqualTo(User.fromUsername("user@domain"));
+            .isEqualTo(Username.fromUsername("user@domain"));
     }
 
     @Test
     public void withDefaultDomainFromUserShouldPreserveUserWhenAlreadyHasADomain() {
-        assertThat(User.fromUsername("user@domain")
-            .withDefaultDomainFromUser(User.fromUsername("bob@tld")))
-            .isEqualTo(User.fromUsername("user@domain"));
+        assertThat(Username.fromUsername("user@domain")
+            .withDefaultDomainFromUser(Username.fromUsername("bob@tld")))
+            .isEqualTo(Username.fromUsername("user@domain"));
     }
 
     @Test
     public void withDefaultDomainFromUserShouldAppendOtherUserDomainWhenNone() {
-        assertThat(User.fromUsername("user")
-            .withDefaultDomainFromUser(User.fromUsername("bob@tld")))
-            .isEqualTo(User.fromUsername("user@tld"));
+        assertThat(Username.fromUsername("user")
+            .withDefaultDomainFromUser(Username.fromUsername("bob@tld")))
+            .isEqualTo(Username.fromUsername("user@tld"));
     }
 
     @Test
     public void withDefaultDomainFromUserShouldNotThrowUponNoDomain() {
-        assertThat(User.fromUsername("user")
-            .withDefaultDomainFromUser(User.fromUsername("bob")))
-            .isEqualTo(User.fromUsername("user"));
+        assertThat(Username.fromUsername("user")
+            .withDefaultDomainFromUser(Username.fromUsername("bob")))
+            .isEqualTo(Username.fromUsername("user"));
     }
 }
diff --git a/examples/custom-listeners/src/main/java/org/apache/james/examples/custom/listeners/SetCustomFlagOnBigMessages.java b/examples/custom-listeners/src/main/java/org/apache/james/examples/custom/listeners/SetCustomFlagOnBigMessages.java
index f435605..274ec02 100644
--- a/examples/custom-listeners/src/main/java/org/apache/james/examples/custom/listeners/SetCustomFlagOnBigMessages.java
+++ b/examples/custom-listeners/src/main/java/org/apache/james/examples/custom/listeners/SetCustomFlagOnBigMessages.java
@@ -77,7 +77,7 @@ class SetCustomFlagOnBigMessages implements MailboxListener.GroupMailboxListener
 
     private void setBigMessageFlag(Added addedEvent, MessageUid messageUid) {
         try {
-            MailboxSession session = mailboxManager.createSystemSession(addedEvent.getUser().asString());
+            MailboxSession session = mailboxManager.createSystemSession(addedEvent.getUsername().asString());
             MessageManager messageManager = mailboxManager.getMailbox(addedEvent.getMailboxId(), session);
 
             messageManager.setFlags(
@@ -87,7 +87,7 @@ class SetCustomFlagOnBigMessages implements MailboxListener.GroupMailboxListener
                 session);
         } catch (MailboxException e) {
             LOGGER.error("error happens when adding '{}' flag to the message with uid {} in mailbox {} of user {}",
-                BIG_MESSAGE, messageUid.asLong(), addedEvent.getMailboxId(), addedEvent.getUser().asString(), e);
+                BIG_MESSAGE, messageUid.asLong(), addedEvent.getMailboxId(), addedEvent.getUsername().asString(), e);
         }
     }
 
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxSession.java b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxSession.java
index 1a39081..dfd8eb7 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxSession.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxSession.java
@@ -27,7 +27,7 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.Objects;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.model.MailboxConstants;
 
 import com.google.common.base.MoreObjects;
@@ -166,8 +166,8 @@ public class MailboxSession {
      * 
      * @return not null
      */
-    public User getUser() {
-        return User.fromUsername(userName);
+    public Username getUser() {
+        return Username.fromUsername(userName);
     }
 
     /**
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/SystemMailboxesProvider.java b/mailbox/api/src/main/java/org/apache/james/mailbox/SystemMailboxesProvider.java
index f593aad..f88498c 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/SystemMailboxesProvider.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/SystemMailboxesProvider.java
@@ -21,15 +21,15 @@ package org.apache.james.mailbox;
 
 import java.util.stream.Stream;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MailboxRoleNotFoundException;
 
 public interface SystemMailboxesProvider {
-    Stream<MessageManager> getMailboxByRole(Role aRole, User user) throws MailboxException;
+    Stream<MessageManager> getMailboxByRole(Role aRole, Username username) throws MailboxException;
 
-    default MessageManager findMailbox(Role role, User user) throws MailboxException {
-        return getMailboxByRole(role, user).findAny()
+    default MessageManager findMailbox(Role role, Username username) throws MailboxException {
+        return getMailboxByRole(role, username).findAny()
             .orElseThrow(() -> new MailboxRoleNotFoundException(role));
     }
 }
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/events/Event.java b/mailbox/api/src/main/java/org/apache/james/mailbox/events/Event.java
index ff01b03..43060a6 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/events/Event.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/events/Event.java
@@ -21,7 +21,7 @@ package org.apache.james.mailbox.events;
 import java.util.Objects;
 import java.util.UUID;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Preconditions;
@@ -75,7 +75,7 @@ public interface Event {
         }
     }
 
-    User getUser();
+    Username getUsername();
 
     boolean isNoop();
 
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/events/MailboxListener.java b/mailbox/api/src/main/java/org/apache/james/mailbox/events/MailboxListener.java
index 364968b..34bfdc6 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/events/MailboxListener.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/events/MailboxListener.java
@@ -26,7 +26,7 @@ import java.util.Map;
 import java.util.Objects;
 import java.util.SortedMap;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.core.quota.QuotaCount;
 import org.apache.james.core.quota.QuotaSize;
 import org.apache.james.mailbox.MailboxSession;
@@ -81,15 +81,15 @@ public interface MailboxListener {
 
     class QuotaUsageUpdatedEvent implements QuotaEvent {
         private final EventId eventId;
-        private final User user;
+        private final Username username;
         private final QuotaRoot quotaRoot;
         private final Quota<QuotaCount> countQuota;
         private final Quota<QuotaSize> sizeQuota;
         private final Instant instant;
 
-        public QuotaUsageUpdatedEvent(EventId eventId, User user, QuotaRoot quotaRoot, Quota<QuotaCount> countQuota, Quota<QuotaSize> sizeQuota, Instant instant) {
+        public QuotaUsageUpdatedEvent(EventId eventId, Username username, QuotaRoot quotaRoot, Quota<QuotaCount> countQuota, Quota<QuotaSize> sizeQuota, Instant instant) {
             this.eventId = eventId;
-            this.user = user;
+            this.username = username;
             this.quotaRoot = quotaRoot;
             this.countQuota = countQuota;
             this.sizeQuota = sizeQuota;
@@ -102,8 +102,8 @@ public interface MailboxListener {
         }
 
         @Override
-        public User getUser() {
-            return user;
+        public Username getUsername() {
+            return username;
         }
 
         public Quota<QuotaCount> getCountQuota() {
@@ -134,7 +134,7 @@ public interface MailboxListener {
                 QuotaUsageUpdatedEvent that = (QuotaUsageUpdatedEvent) o;
 
                 return Objects.equals(this.eventId, that.eventId)
-                    && Objects.equals(this.user, that.user)
+                    && Objects.equals(this.username, that.username)
                     && Objects.equals(this.quotaRoot, that.quotaRoot)
                     && Objects.equals(this.countQuota, that.countQuota)
                     && Objects.equals(this.sizeQuota, that.sizeQuota)
@@ -145,7 +145,7 @@ public interface MailboxListener {
 
         @Override
         public final int hashCode() {
-            return Objects.hash(eventId, user, quotaRoot, countQuota, sizeQuota, instant);
+            return Objects.hash(eventId, username, quotaRoot, countQuota, sizeQuota, instant);
         }
 
     }
@@ -156,12 +156,12 @@ public interface MailboxListener {
     abstract class MailboxEvent implements Event {
         protected final MailboxPath path;
         protected final MailboxId mailboxId;
-        protected final User user;
+        protected final Username username;
         protected final MailboxSession.SessionId sessionId;
         protected final EventId eventId;
 
-        public MailboxEvent(MailboxSession.SessionId sessionId, User user, MailboxPath path, MailboxId mailboxId, EventId eventId) {
-            this.user = user;
+        public MailboxEvent(MailboxSession.SessionId sessionId, Username username, MailboxPath path, MailboxId mailboxId, EventId eventId) {
+            this.username = username;
             this.path = path;
             this.mailboxId = mailboxId;
             this.sessionId = sessionId;
@@ -169,14 +169,14 @@ public interface MailboxListener {
         }
 
         /**
-         * Gets the {@link User} in which's context the {@link MailboxEvent}
+         * Gets the {@link Username} in which's context the {@link MailboxEvent}
          * happened
          *
          * @return user
          */
         @Override
-        public User getUser() {
-            return user;
+        public Username getUsername() {
+            return username;
         }
 
         @Override
@@ -221,9 +221,9 @@ public interface MailboxListener {
         private final QuotaCount deletedMessageCount;
         private final QuotaSize totalDeletedSize;
 
-        public MailboxDeletion(MailboxSession.SessionId sessionId, User user, MailboxPath path, QuotaRoot quotaRoot, QuotaCount deletedMessageCount, QuotaSize totalDeletedSize,
+        public MailboxDeletion(MailboxSession.SessionId sessionId, Username username, MailboxPath path, QuotaRoot quotaRoot, QuotaCount deletedMessageCount, QuotaSize totalDeletedSize,
                                MailboxId mailboxId, EventId eventId) {
-            super(sessionId, user, path, mailboxId, eventId);
+            super(sessionId, username, path, mailboxId, eventId);
             this.quotaRoot = quotaRoot;
             this.deletedMessageCount = deletedMessageCount;
             this.totalDeletedSize = totalDeletedSize;
@@ -253,7 +253,7 @@ public interface MailboxListener {
 
                 return Objects.equals(this.eventId, that.eventId)
                     && Objects.equals(this.sessionId, that.sessionId)
-                    && Objects.equals(this.user, that.user)
+                    && Objects.equals(this.username, that.username)
                     && Objects.equals(this.path, that.path)
                     && Objects.equals(this.mailboxId, that.mailboxId)
                     && Objects.equals(this.quotaRoot, that.quotaRoot)
@@ -265,7 +265,7 @@ public interface MailboxListener {
 
         @Override
         public final int hashCode() {
-            return Objects.hash(eventId, sessionId, user, path, mailboxId, quotaRoot, deletedMessageCount, totalDeletedSize);
+            return Objects.hash(eventId, sessionId, username, path, mailboxId, quotaRoot, deletedMessageCount, totalDeletedSize);
         }
     }
 
@@ -274,8 +274,8 @@ public interface MailboxListener {
      */
     class MailboxAdded extends MailboxEvent {
 
-        public MailboxAdded(MailboxSession.SessionId sessionId, User user, MailboxPath path, MailboxId mailboxId, EventId eventId) {
-            super(sessionId, user, path, mailboxId, eventId);
+        public MailboxAdded(MailboxSession.SessionId sessionId, Username username, MailboxPath path, MailboxId mailboxId, EventId eventId) {
+            super(sessionId, username, path, mailboxId, eventId);
         }
 
         @Override
@@ -290,7 +290,7 @@ public interface MailboxListener {
 
                 return Objects.equals(this.eventId, that.eventId)
                     && Objects.equals(this.sessionId, that.sessionId)
-                    && Objects.equals(this.user, that.user)
+                    && Objects.equals(this.username, that.username)
                     && Objects.equals(this.path, that.path)
                     && Objects.equals(this.mailboxId, that.mailboxId);
             }
@@ -299,7 +299,7 @@ public interface MailboxListener {
 
         @Override
         public final int hashCode() {
-            return Objects.hash(eventId, sessionId, user, path, mailboxId);
+            return Objects.hash(eventId, sessionId, username, path, mailboxId);
         }
     }
 
@@ -309,8 +309,8 @@ public interface MailboxListener {
     class MailboxRenamed extends MailboxEvent {
         private final MailboxPath newPath;
 
-        public MailboxRenamed(MailboxSession.SessionId sessionId, User user, MailboxPath path, MailboxId mailboxId, MailboxPath newPath, EventId eventId) {
-            super(sessionId, user, path, mailboxId, eventId);
+        public MailboxRenamed(MailboxSession.SessionId sessionId, Username username, MailboxPath path, MailboxId mailboxId, MailboxPath newPath, EventId eventId) {
+            super(sessionId, username, path, mailboxId, eventId);
             this.newPath = newPath;
         }
 
@@ -335,7 +335,7 @@ public interface MailboxListener {
 
                 return Objects.equals(this.eventId, that.eventId)
                     && Objects.equals(this.sessionId, that.sessionId)
-                    && Objects.equals(this.user, that.user)
+                    && Objects.equals(this.username, that.username)
                     && Objects.equals(this.path, that.path)
                     && Objects.equals(this.mailboxId, that.mailboxId)
                     && Objects.equals(this.newPath, that.newPath);
@@ -345,7 +345,7 @@ public interface MailboxListener {
 
         @Override
         public final int hashCode() {
-            return Objects.hash(eventId, sessionId, user, path, mailboxId, newPath);
+            return Objects.hash(eventId, sessionId, username, path, mailboxId, newPath);
         }
     }
 
@@ -356,8 +356,8 @@ public interface MailboxListener {
     class MailboxACLUpdated extends MailboxEvent {
         private final ACLDiff aclDiff;
 
-        public MailboxACLUpdated(MailboxSession.SessionId sessionId, User user, MailboxPath path, ACLDiff aclDiff, MailboxId mailboxId, EventId eventId) {
-            super(sessionId, user, path, mailboxId, eventId);
+        public MailboxACLUpdated(MailboxSession.SessionId sessionId, Username username, MailboxPath path, ACLDiff aclDiff, MailboxId mailboxId, EventId eventId) {
+            super(sessionId, username, path, mailboxId, eventId);
             this.aclDiff = aclDiff;
         }
 
@@ -377,7 +377,7 @@ public interface MailboxListener {
 
                 return Objects.equals(this.eventId, that.eventId)
                     && Objects.equals(this.sessionId, that.sessionId)
-                    && Objects.equals(this.user, that.user)
+                    && Objects.equals(this.username, that.username)
                     && Objects.equals(this.path, that.path)
                     && Objects.equals(this.aclDiff, that.aclDiff)
                     && Objects.equals(this.mailboxId, that.mailboxId);
@@ -387,7 +387,7 @@ public interface MailboxListener {
 
         @Override
         public final int hashCode() {
-            return Objects.hash(eventId, sessionId, user, path, aclDiff, mailboxId);
+            return Objects.hash(eventId, sessionId, username, path, aclDiff, mailboxId);
         }
 
     }
@@ -397,8 +397,8 @@ public interface MailboxListener {
      */
     abstract class MessageEvent extends MailboxEvent {
 
-        public MessageEvent(MailboxSession.SessionId sessionId, User user, MailboxPath path, MailboxId mailboxId, EventId eventId) {
-            super(sessionId, user, path, mailboxId, eventId);
+        public MessageEvent(MailboxSession.SessionId sessionId, Username username, MailboxPath path, MailboxId mailboxId, EventId eventId) {
+            super(sessionId, username, path, mailboxId, eventId);
         }
 
         /**
@@ -411,8 +411,8 @@ public interface MailboxListener {
 
     abstract class MetaDataHoldingEvent extends MessageEvent {
 
-        public MetaDataHoldingEvent(MailboxSession.SessionId sessionId, User user, MailboxPath path, MailboxId mailboxId, EventId eventId) {
-            super(sessionId, user, path, mailboxId, eventId);
+        public MetaDataHoldingEvent(MailboxSession.SessionId sessionId, Username username, MailboxPath path, MailboxId mailboxId, EventId eventId) {
+            super(sessionId, username, path, mailboxId, eventId);
         }
 
         /**
@@ -427,8 +427,8 @@ public interface MailboxListener {
     class Expunged extends MetaDataHoldingEvent {
         private final Map<MessageUid, MessageMetaData> expunged;
 
-        public Expunged(MailboxSession.SessionId sessionId, User user, MailboxPath path, MailboxId mailboxId, Map<MessageUid, MessageMetaData> uids, EventId eventId) {
-            super(sessionId, user, path, mailboxId, eventId);
+        public Expunged(MailboxSession.SessionId sessionId, Username username, MailboxPath path, MailboxId mailboxId, Map<MessageUid, MessageMetaData> uids, EventId eventId) {
+            super(sessionId, username, path, mailboxId, eventId);
             this.expunged = ImmutableMap.copyOf(uids);
         }
 
@@ -463,7 +463,7 @@ public interface MailboxListener {
 
                 return Objects.equals(this.eventId, that.eventId)
                     && Objects.equals(this.sessionId, that.sessionId)
-                    && Objects.equals(this.user, that.user)
+                    && Objects.equals(this.username, that.username)
                     && Objects.equals(this.path, that.path)
                     && Objects.equals(this.mailboxId, that.mailboxId)
                     && Objects.equals(this.expunged, that.expunged);
@@ -473,7 +473,7 @@ public interface MailboxListener {
 
         @Override
         public final int hashCode() {
-            return Objects.hash(eventId, sessionId, user, path, mailboxId, expunged);
+            return Objects.hash(eventId, sessionId, username, path, mailboxId, expunged);
         }
     }
 
@@ -484,9 +484,9 @@ public interface MailboxListener {
         private final List<MessageUid> uids;
         private final List<UpdatedFlags> updatedFlags;
 
-        public FlagsUpdated(MailboxSession.SessionId sessionId, User user, MailboxPath path, MailboxId mailboxId, List<UpdatedFlags> updatedFlags,
+        public FlagsUpdated(MailboxSession.SessionId sessionId, Username username, MailboxPath path, MailboxId mailboxId, List<UpdatedFlags> updatedFlags,
                             EventId eventId) {
-            super(sessionId, user, path, mailboxId, eventId);
+            super(sessionId, username, path, mailboxId, eventId);
             this.updatedFlags = ImmutableList.copyOf(updatedFlags);
             this.uids = updatedFlags.stream()
                 .map(UpdatedFlags::getUid)
@@ -514,7 +514,7 @@ public interface MailboxListener {
 
                 return Objects.equals(this.eventId, that.eventId)
                     && Objects.equals(this.sessionId, that.sessionId)
-                    && Objects.equals(this.user, that.user)
+                    && Objects.equals(this.username, that.username)
                     && Objects.equals(this.path, that.path)
                     && Objects.equals(this.mailboxId, that.mailboxId)
                     && Objects.equals(this.uids, that.uids)
@@ -525,7 +525,7 @@ public interface MailboxListener {
 
         @Override
         public final int hashCode() {
-            return Objects.hash(eventId, sessionId, user, path, mailboxId, uids, updatedFlags);
+            return Objects.hash(eventId, sessionId, username, path, mailboxId, uids, updatedFlags);
         }
     }
 
@@ -535,9 +535,9 @@ public interface MailboxListener {
     class Added extends MetaDataHoldingEvent {
         private final Map<MessageUid, MessageMetaData> added;
 
-        public Added(MailboxSession.SessionId sessionId, User user, MailboxPath path, MailboxId mailboxId,
+        public Added(MailboxSession.SessionId sessionId, Username username, MailboxPath path, MailboxId mailboxId,
                      SortedMap<MessageUid, MessageMetaData> uids, EventId eventId) {
-            super(sessionId, user, path, mailboxId, eventId);
+            super(sessionId, username, path, mailboxId, eventId);
             this.added = ImmutableMap.copyOf(uids);
         }
 
@@ -571,7 +571,7 @@ public interface MailboxListener {
 
                 return Objects.equals(this.eventId, that.eventId)
                     && Objects.equals(this.sessionId, that.sessionId)
-                    && Objects.equals(this.user, that.user)
+                    && Objects.equals(this.username, that.username)
                     && Objects.equals(this.path, that.path)
                     && Objects.equals(this.mailboxId, that.mailboxId)
                     && Objects.equals(this.added, that.added);
@@ -581,7 +581,7 @@ public interface MailboxListener {
 
         @Override
         public final int hashCode() {
-            return Objects.hash(eventId, sessionId, user, path, mailboxId, added);
+            return Objects.hash(eventId, sessionId, username, path, mailboxId, added);
         }
     }
 
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/events/MessageMoveEvent.java b/mailbox/api/src/main/java/org/apache/james/mailbox/events/MessageMoveEvent.java
index 494f9ae..b149f25 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/events/MessageMoveEvent.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/events/MessageMoveEvent.java
@@ -22,7 +22,7 @@ import java.util.Collection;
 import java.util.Objects;
 import java.util.Optional;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageId;
@@ -40,7 +40,7 @@ public class MessageMoveEvent implements Event {
 
     public static class Builder {
         private ImmutableList.Builder<MessageId> messageIds;
-        private User user;
+        private Username username;
         private MessageMoves messageMoves;
         private Optional<EventId> eventId;
 
@@ -50,12 +50,12 @@ public class MessageMoveEvent implements Event {
         }
 
         public Builder session(MailboxSession session) {
-            this.user = session.getUser();
+            this.username = session.getUser();
             return this;
         }
 
-        public Builder user(User user) {
-            this.user = user;
+        public Builder user(Username username) {
+            this.username = username;
             return this;
         }
 
@@ -80,22 +80,22 @@ public class MessageMoveEvent implements Event {
         }
 
         public MessageMoveEvent build() {
-            Preconditions.checkNotNull(user, "'user' is mandatory");
+            Preconditions.checkNotNull(username, "'user' is mandatory");
             Preconditions.checkNotNull(messageMoves, "'messageMoves' is mandatory");
 
-            return new MessageMoveEvent(eventId.orElse(EventId.random()), user, messageMoves, messageIds.build());
+            return new MessageMoveEvent(eventId.orElse(EventId.random()), username, messageMoves, messageIds.build());
         }
     }
 
     private final EventId eventId;
-    private final User user;
+    private final Username username;
     private final MessageMoves messageMoves;
     private final Collection<MessageId> messageIds;
 
     @VisibleForTesting
-    MessageMoveEvent(EventId eventId, User user, MessageMoves messageMoves, Collection<MessageId> messageIds) {
+    MessageMoveEvent(EventId eventId, Username username, MessageMoves messageMoves, Collection<MessageId> messageIds) {
         this.eventId = eventId;
-        this.user = user;
+        this.username = username;
         this.messageMoves = messageMoves;
         this.messageIds = messageIds;
     }
@@ -115,8 +115,8 @@ public class MessageMoveEvent implements Event {
     }
 
     @Override
-    public User getUser() {
-        return user;
+    public Username getUsername() {
+        return username;
     }
 
     public MessageMoves getMessageMoves() {
@@ -139,7 +139,7 @@ public class MessageMoveEvent implements Event {
             MessageMoveEvent that = (MessageMoveEvent) o;
 
             return Objects.equals(this.eventId, that.eventId)
-                && Objects.equals(this.user, that.user)
+                && Objects.equals(this.username, that.username)
                 && Objects.equals(this.messageMoves, that.messageMoves)
                 && Objects.equals(this.messageIds, that.messageIds);
         }
@@ -148,6 +148,6 @@ public class MessageMoveEvent implements Event {
 
     @Override
     public final int hashCode() {
-        return Objects.hash(eventId, user, messageMoves, messageIds);
+        return Objects.hash(eventId, username, messageMoves, messageIds);
     }
 }
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/indexer/ReIndexer.java b/mailbox/api/src/main/java/org/apache/james/mailbox/indexer/ReIndexer.java
index 01a6e27..90cf51f 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/indexer/ReIndexer.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/indexer/ReIndexer.java
@@ -19,7 +19,7 @@
 
 package org.apache.james.mailbox.indexer;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MailboxId;
@@ -28,7 +28,7 @@ import org.apache.james.task.Task;
 
 public interface ReIndexer {
 
-    Task reIndex(User user) throws MailboxException;
+    Task reIndex(Username username) throws MailboxException;
 
     Task reIndex(MailboxPath path) throws MailboxException;
 
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxQuery.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxQuery.java
index 6c10eac..d5ea66a 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxQuery.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxQuery.java
@@ -21,7 +21,7 @@ package org.apache.james.mailbox.model.search;
 
 import java.util.Optional;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MailboxPath;
@@ -76,8 +76,8 @@ public final class MailboxQuery {
             return this;
         }
 
-        public Builder user(User user) {
-            this.username(user.asString());
+        public Builder user(Username username) {
+            this.username(username.asString());
             return this;
         }
 
@@ -143,9 +143,9 @@ public final class MailboxQuery {
     }
 
     public boolean isPrivateMailboxes(MailboxSession session) {
-        User sessionUser = session.getUser();
+        Username sessionUsername = session.getUser();
         return namespace.map(MailboxConstants.USER_NAMESPACE::equals).orElse(false)
-            && user.map(User::fromUsername).map(sessionUser::equals).orElse(false);
+            && user.map(Username::fromUsername).map(sessionUsername::equals).orElse(false);
     }
 
     @VisibleForTesting
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/quota/UserQuotaRootResolver.java b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/UserQuotaRootResolver.java
index c643f4b..6d3b7ab 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/quota/UserQuotaRootResolver.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/UserQuotaRootResolver.java
@@ -18,12 +18,11 @@
  ****************************************************************/
 package org.apache.james.mailbox.quota;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.model.QuotaRoot;
-import org.apache.james.mailbox.quota.QuotaRootResolver;
 
 public interface UserQuotaRootResolver extends QuotaRootResolver {
 
-    QuotaRoot forUser(User user);
+    QuotaRoot forUser(Username username);
 
 }
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxListenerTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxListenerTest.java
index 57957ac..a80f066 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxListenerTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxListenerTest.java
@@ -28,7 +28,7 @@ import java.util.Optional;
 import javax.mail.Flags;
 
 import org.apache.commons.lang3.tuple.Pair;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.core.quota.QuotaCount;
 import org.apache.james.core.quota.QuotaSize;
 import org.apache.james.mailbox.acl.ACLDiff;
@@ -52,7 +52,7 @@ import nl.jqno.equalsverifier.EqualsVerifier;
 class MailboxListenerTest {
     private static final MailboxPath PATH = MailboxPath.forUser("bob", "mailbox");
     private static final MailboxPath OTHER_PATH = MailboxPath.forUser("bob", "mailbox.other");
-    private static final User BOB = User.fromUsername("bob");
+    private static final Username BOB = Username.fromUsername("bob");
     private static final MailboxSession.SessionId SESSION_ID = MailboxSession.SessionId.of(42);
     private static final TestId MAILBOX_ID = TestId.of(18);
     private static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("bob", Optional.empty());
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/MessageMoveEventTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/MessageMoveEventTest.java
index ad422d8..6a3b92d 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/MessageMoveEventTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/MessageMoveEventTest.java
@@ -21,7 +21,7 @@ package org.apache.james.mailbox;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.events.MessageMoveEvent;
 import org.apache.james.mailbox.model.MessageMoves;
 import org.apache.james.mailbox.model.TestId;
@@ -102,7 +102,7 @@ public class MessageMoveEventTest {
             .messageId(messageId)
             .build();
 
-        softly.assertThat(event.getUser()).isEqualTo(User.fromUsername(username));
+        softly.assertThat(event.getUsername()).isEqualTo(Username.fromUsername(username));
         softly.assertThat(event.getMessageMoves()).isEqualTo(messageMoves);
         softly.assertThat(event.getMessageIds()).containsExactly(messageId);
     }
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventBusTestFixture.java b/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventBusTestFixture.java
index 0a59c42..26d12e0 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventBusTestFixture.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventBusTestFixture.java
@@ -27,7 +27,7 @@ import static org.mockito.Mockito.when;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicInteger;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MailboxId;
@@ -93,14 +93,14 @@ public interface EventBusTestFixture {
     }
 
     MailboxSession.SessionId SESSION_ID = MailboxSession.SessionId.of(42);
-    User USER = User.fromUsername("user");
+    Username USERNAME = Username.fromUsername("user");
     MailboxPath MAILBOX_PATH = new MailboxPath(MailboxConstants.USER_NAMESPACE, "user", "mailboxName");
     TestId TEST_ID = TestId.of(18);
     Event.EventId EVENT_ID = Event.EventId.of("6e0dd59d-660e-4d9b-b22f-0354479f47b4");
     Event.EventId EVENT_ID_2 = Event.EventId.of("5a7a9f3f-5f03-44be-b457-a51e93760645");
-    MailboxListener.MailboxEvent EVENT = new MailboxListener.MailboxAdded(SESSION_ID, USER, MAILBOX_PATH, TEST_ID, EVENT_ID);
-    MailboxListener.MailboxEvent EVENT_2 = new MailboxListener.MailboxAdded(SESSION_ID, USER, MAILBOX_PATH, TEST_ID, EVENT_ID_2);
-    MailboxListener.MailboxRenamed EVENT_UNSUPPORTED_BY_LISTENER = new MailboxListener.MailboxRenamed(SESSION_ID, USER, MAILBOX_PATH, TEST_ID, MAILBOX_PATH, EVENT_ID_2);
+    MailboxListener.MailboxEvent EVENT = new MailboxListener.MailboxAdded(SESSION_ID, USERNAME, MAILBOX_PATH, TEST_ID, EVENT_ID);
+    MailboxListener.MailboxEvent EVENT_2 = new MailboxListener.MailboxAdded(SESSION_ID, USERNAME, MAILBOX_PATH, TEST_ID, EVENT_ID_2);
+    MailboxListener.MailboxRenamed EVENT_UNSUPPORTED_BY_LISTENER = new MailboxListener.MailboxRenamed(SESSION_ID, USERNAME, MAILBOX_PATH, TEST_ID, MAILBOX_PATH, EVENT_ID_2);
 
     java.time.Duration ONE_SECOND = java.time.Duration.ofSeconds(1);
     java.time.Duration THIRTY_SECONDS = java.time.Duration.ofSeconds(30);
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersContract.java b/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersContract.java
index 4540a1b..845c5fb 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersContract.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersContract.java
@@ -30,7 +30,7 @@ import java.util.function.Function;
 import java.util.stream.IntStream;
 import java.util.stream.Stream;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MailboxPath;
@@ -93,7 +93,7 @@ interface EventDeadLettersContract {
     }
 
     static Event event(Event.EventId eventId) {
-        return new MailboxListener.MailboxAdded(SESSION_ID, USER, MAILBOX_PATH, MAILBOX_ID, eventId);
+        return new MailboxListener.MailboxAdded(SESSION_ID, USERNAME, MAILBOX_PATH, MAILBOX_ID, eventId);
     }
 
     List<Group> CONCURRENT_GROUPS = ImmutableList.of(new Group0(), new Group1(), new Group2(), new Group3(), new Group4(), new Group5(),
@@ -103,15 +103,15 @@ interface EventDeadLettersContract {
     int OPERATION_COUNT = 50;
 
     MailboxPath MAILBOX_PATH = new MailboxPath(MailboxConstants.USER_NAMESPACE, "user", "mailboxName");
-    User USER = User.fromUsername("user");
+    Username USERNAME = Username.fromUsername("user");
     MailboxSession.SessionId SESSION_ID = MailboxSession.SessionId.of(235);
     TestId MAILBOX_ID = TestId.of(563);
     Event.EventId EVENT_ID_1 = Event.EventId.of("6e0dd59d-660e-4d9b-b22f-0354479f47b4");
     Event.EventId EVENT_ID_2 = Event.EventId.of("6e0dd59d-660e-4d9b-b22f-0354479f47b5");
     Event.EventId EVENT_ID_3 = Event.EventId.of("6e0dd59d-660e-4d9b-b22f-0354479f47b6");
-    MailboxListener.MailboxAdded EVENT_1 = new MailboxListener.MailboxAdded(SESSION_ID, USER, MAILBOX_PATH, MAILBOX_ID, EVENT_ID_1);
-    MailboxListener.MailboxAdded EVENT_2 = new MailboxListener.MailboxAdded(SESSION_ID, USER, MAILBOX_PATH, MAILBOX_ID, EVENT_ID_2);
-    MailboxListener.MailboxAdded EVENT_3 = new MailboxListener.MailboxAdded(SESSION_ID, USER, MAILBOX_PATH, MAILBOX_ID, EVENT_ID_3);
+    MailboxListener.MailboxAdded EVENT_1 = new MailboxListener.MailboxAdded(SESSION_ID, USERNAME, MAILBOX_PATH, MAILBOX_ID, EVENT_ID_1);
+    MailboxListener.MailboxAdded EVENT_2 = new MailboxListener.MailboxAdded(SESSION_ID, USERNAME, MAILBOX_PATH, MAILBOX_ID, EVENT_ID_2);
+    MailboxListener.MailboxAdded EVENT_3 = new MailboxListener.MailboxAdded(SESSION_ID, USERNAME, MAILBOX_PATH, MAILBOX_ID, EVENT_ID_3);
     EventDeadLetters.InsertionId INSERTION_ID_1 = EventDeadLetters.InsertionId.of("6e0dd59d-660e-4d9b-b22f-0354479f47b7");
     EventDeadLetters.InsertionId INSERTION_ID_2 = EventDeadLetters.InsertionId.of("6e0dd59d-660e-4d9b-b22f-0354479f47b8");
     EventDeadLetters.InsertionId INSERTION_ID_3 = EventDeadLetters.InsertionId.of("6e0dd59d-660e-4d9b-b22f-0354479f47b9");
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/events/GroupContract.java b/mailbox/api/src/test/java/org/apache/james/mailbox/events/GroupContract.java
index c55a91f..8cc0482 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/events/GroupContract.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/events/GroupContract.java
@@ -46,7 +46,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.IntStream;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.TestId;
@@ -141,7 +141,7 @@ public interface GroupContract {
 
             eventBus().register(listener, GROUP_A);
 
-            MailboxListener.Added noopEvent = new MailboxListener.Added(MailboxSession.SessionId.of(18), User.fromUsername("bob"), MailboxPath.forUser("bob", "mailbox"), TestId.of(58), ImmutableSortedMap.of(), Event.EventId.random());
+            MailboxListener.Added noopEvent = new MailboxListener.Added(MailboxSession.SessionId.of(18), Username.fromUsername("bob"), MailboxPath.forUser("bob", "mailbox"), TestId.of(58), ImmutableSortedMap.of(), Event.EventId.random());
             eventBus().dispatch(noopEvent, NO_KEYS).block();
 
             verify(listener, after(FIVE_HUNDRED_MS.toMillis()).never())
@@ -351,7 +351,7 @@ public interface GroupContract {
 
             eventBus().register(listener, GROUP_A);
 
-            MailboxListener.Added noopEvent = new MailboxListener.Added(MailboxSession.SessionId.of(18), User.fromUsername("bob"), MailboxPath.forUser("bob", "mailbox"), TestId.of(58), ImmutableSortedMap.of(), Event.EventId.random());
+            MailboxListener.Added noopEvent = new MailboxListener.Added(MailboxSession.SessionId.of(18), Username.fromUsername("bob"), MailboxPath.forUser("bob", "mailbox"), TestId.of(58), ImmutableSortedMap.of(), Event.EventId.random());
             eventBus().reDeliver(GROUP_A, noopEvent).block();
 
             verify(listener, after(FIVE_HUNDRED_MS.toMillis()).never()).event(any());
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/events/KeyContract.java b/mailbox/api/src/test/java/org/apache/james/mailbox/events/KeyContract.java
index 96a134c..82ec64e 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/events/KeyContract.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/events/KeyContract.java
@@ -48,7 +48,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.IntStream;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.TestId;
@@ -90,7 +90,7 @@ public interface KeyContract extends EventBusContract {
 
             eventBus().register(listener, KEY_1);
 
-            MailboxListener.Added noopEvent = new MailboxListener.Added(MailboxSession.SessionId.of(18), User.fromUsername("bob"), MailboxPath.forUser("bob", "mailbox"), TestId.of(58), ImmutableSortedMap.of(), Event.EventId.random());
+            MailboxListener.Added noopEvent = new MailboxListener.Added(MailboxSession.SessionId.of(18), Username.fromUsername("bob"), MailboxPath.forUser("bob", "mailbox"), TestId.of(58), ImmutableSortedMap.of(), Event.EventId.random());
             eventBus().dispatch(noopEvent, KEY_1).block();
 
             verify(listener, after(FIVE_HUNDRED_MS.toMillis()).never())
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 b1f2a23..6dd74ef 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
@@ -24,7 +24,7 @@ import java.io.OutputStream;
 import java.util.List;
 import java.util.stream.Stream;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
@@ -83,8 +83,8 @@ public class DefaultMailboxBackup implements MailboxBackup {
     }
 
     @Override
-    public void backupAccount(User user, OutputStream destination) throws IOException, MailboxException {
-        MailboxSession session = mailboxManager.createSystemSession(user.asString());
+    public void backupAccount(Username username, OutputStream destination) throws IOException, MailboxException {
+        MailboxSession session = mailboxManager.createSystemSession(username.asString());
         List<MailAccountContent> accountContents = getAccountContentForUser(session);
         List<MailboxWithAnnotations> mailboxes = accountContents.stream()
             .map(MailAccountContent::getMailboxWithAnnotations)
@@ -94,8 +94,8 @@ public class DefaultMailboxBackup implements MailboxBackup {
         archive(mailboxes, messages, destination);
     }
 
-    private boolean isAccountNonEmpty(User user) throws BadCredentialsException, MailboxException, IOException {
-        MailboxSession session = mailboxManager.createSystemSession(user.asString());
+    private boolean isAccountNonEmpty(Username username) throws BadCredentialsException, MailboxException, IOException {
+        MailboxSession session = mailboxManager.createSystemSession(username.asString());
         return getAccountContentForUser(session)
             .stream()
             .findFirst()
@@ -103,19 +103,19 @@ public class DefaultMailboxBackup implements MailboxBackup {
     }
 
     @Override
-    public Publisher<BackupStatus> restore(User user, InputStream source) {
+    public Publisher<BackupStatus> restore(Username username, InputStream source) {
         try {
-            if (isAccountNonEmpty(user)) {
+            if (isAccountNonEmpty(username)) {
                 return Mono.just(BackupStatus.NON_EMPTY_RECEIVER_ACCOUNT);
             }
         } catch (Exception e) {
-            LOGGER.error("Error during account restoration for user : " + user, e);
+            LOGGER.error("Error during account restoration for user : " + username, e);
             return Mono.just(BackupStatus.FAILED);
         }
 
-        return Mono.fromRunnable(Throwing.runnable(() -> archiveRestorer.restore(user, source)).sneakyThrow())
+        return Mono.fromRunnable(Throwing.runnable(() -> archiveRestorer.restore(username, source)).sneakyThrow())
             .subscribeOn(Schedulers.boundedElastic())
-            .doOnError(e -> LOGGER.error("Error during account restoration for user : " + user, e))
+            .doOnError(e -> LOGGER.error("Error during account restoration for user : " + username, e))
             .doOnTerminate(Throwing.runnable(source::close).sneakyThrow())
             .thenReturn(BackupStatus.DONE)
             .onErrorReturn(BackupStatus.FAILED);
diff --git a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/MailArchiveRestorer.java b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/MailArchiveRestorer.java
index 091a258..3c55326 100644
--- a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/MailArchiveRestorer.java
+++ b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/MailArchiveRestorer.java
@@ -21,10 +21,10 @@ package org.apache.james.mailbox.backup;
 import java.io.IOException;
 import java.io.InputStream;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.MailboxException;
 
 public interface MailArchiveRestorer {
 
-    void restore(User user, InputStream source) throws MailboxException, IOException;
+    void restore(Username username, InputStream source) throws MailboxException, IOException;
 }
diff --git a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/MailboxBackup.java b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/MailboxBackup.java
index 4770eed..3b18283 100644
--- a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/MailboxBackup.java
+++ b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/MailboxBackup.java
@@ -22,7 +22,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.reactivestreams.Publisher;
 
@@ -35,15 +35,15 @@ public interface MailboxBackup {
     }
 
     /**
-     * @param user the user account to export
+     * @param username the user account to export
      */
-    void backupAccount(User user, OutputStream destination) throws IOException, MailboxException;
+    void backupAccount(Username username, OutputStream destination) throws IOException, MailboxException;
 
     /**
-     * @param user   the user in which account the restored elements will be stored.
+     * @param username   the user in which account the restored elements will be stored.
      * @param source the input stream to the archive containing the account elements.
      * @return a Publisher indicating when the action is completed
      */
-    Publisher<BackupStatus> restore(User user, InputStream source) throws IOException, MailboxException;
+    Publisher<BackupStatus> restore(Username username, InputStream source) throws IOException, MailboxException;
 
 }
diff --git a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/ZipMailArchiveRestorer.java b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/ZipMailArchiveRestorer.java
index a49c827..3197fb4 100644
--- a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/ZipMailArchiveRestorer.java
+++ b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/ZipMailArchiveRestorer.java
@@ -26,7 +26,7 @@ import java.util.Optional;
 import java.util.stream.Stream;
 
 import org.apache.commons.lang3.tuple.ImmutablePair;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
@@ -53,8 +53,8 @@ public class ZipMailArchiveRestorer implements MailArchiveRestorer {
         this.archiveLoader = archiveLoader;
     }
 
-    public void restore(User user, InputStream source) throws MailboxException, IOException {
-        MailboxSession session = mailboxManager.createSystemSession(user.asString());
+    public void restore(Username username, InputStream source) throws MailboxException, IOException {
+        MailboxSession session = mailboxManager.createSystemSession(username.asString());
         restoreEntries(source, session);
     }
 
diff --git a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/DefaultMailboxBackupTest.java b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/DefaultMailboxBackupTest.java
index e47806f..ba7869c 100644
--- a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/DefaultMailboxBackupTest.java
+++ b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/DefaultMailboxBackupTest.java
@@ -81,7 +81,7 @@ class DefaultMailboxBackupTest implements MailboxMessageFixture {
     @Test
     void doBackupWithoutMailboxShouldStoreEmptyBackup() throws Exception {
         ByteArrayOutputStream destination = new ByteArrayOutputStream(BUFFER_SIZE);
-        backup.backupAccount(USER1, destination);
+        backup.backupAccount(USERNAME_1, destination);
         try (ZipAssert zipAssert = ZipAssert.assertThatZip(destination)) {
             zipAssert.containsOnlyEntriesMatching();
         }
@@ -92,7 +92,7 @@ class DefaultMailboxBackupTest implements MailboxMessageFixture {
         ByteArrayOutputStream destination = new ByteArrayOutputStream(BUFFER_SIZE);
         createMailbox(sessionUser, MAILBOX_PATH_USER1_MAILBOX1);
 
-        backup.backupAccount(USER1, destination);
+        backup.backupAccount(USERNAME_1, destination);
         try (ZipAssert zipAssert = ZipAssert.assertThatZip(destination)) {
             zipAssert.containsOnlyEntriesMatching(EntryChecks.hasName(MAILBOX_1_NAME + "/").isDirectory());
         }
@@ -104,7 +104,7 @@ class DefaultMailboxBackupTest implements MailboxMessageFixture {
         createMailbox(sessionUser, MAILBOX_PATH_USER1_MAILBOX1);
         mailboxManager.updateAnnotations(MAILBOX_PATH_USER1_MAILBOX1, sessionUser, WITH_ANNOTATION_1);
 
-        backup.backupAccount(USER1, destination);
+        backup.backupAccount(USERNAME_1, destination);
         try (ZipAssert zipAssert = ZipAssert.assertThatZip(destination)) {
             zipAssert.containsOnlyEntriesMatching(EntryChecks.hasName(MAILBOX_1_NAME + "/").isDirectory(),
                 EntryChecks.hasName(MAILBOX_1_NAME + "/" + EXPECTED_ANNOTATIONS_DIR + "/").isDirectory(),
@@ -118,7 +118,7 @@ class DefaultMailboxBackupTest implements MailboxMessageFixture {
         ByteArrayOutputStream destination = new ByteArrayOutputStream(BUFFER_SIZE);
         createMailboxWithMessages(sessionUser, MAILBOX_PATH_USER1_MAILBOX1, getMessage1AppendCommand());
 
-        backup.backupAccount(USER1, destination);
+        backup.backupAccount(USERNAME_1, destination);
 
         try (ZipAssert zipAssert = ZipAssert.assertThatZip(destination)) {
             zipAssert.containsOnlyEntriesMatching(
@@ -134,7 +134,7 @@ class DefaultMailboxBackupTest implements MailboxMessageFixture {
         createMailboxWithMessages(sessionUser, MAILBOX_PATH_USER1_MAILBOX1, getMessage1AppendCommand());
         createMailbox(sessionUser, MAILBOX_PATH_USER1_MAILBOX2);
 
-        backup.backupAccount(USER1, destination);
+        backup.backupAccount(USERNAME_1, destination);
 
         try (ZipAssert zipAssert = ZipAssert.assertThatZip(destination)) {
             zipAssert.containsOnlyEntriesMatching(
@@ -152,7 +152,7 @@ class DefaultMailboxBackupTest implements MailboxMessageFixture {
         createMailboxWithMessages(sessionUser, MAILBOX_PATH_USER1_MAILBOX1, getMessage1AppendCommand());
         createMailboxWithMessages(sessionOtherUser, MAILBOX_PATH_OTHER_USER_MAILBOX1, getMessage1OtherUserAppendCommand());
 
-        backup.backupAccount(USER1, destination);
+        backup.backupAccount(USERNAME_1, destination);
         try (ZipAssert zipAssert = ZipAssert.assertThatZip(destination)) {
             zipAssert.containsOnlyEntriesMatching(
                 EntryChecks.hasName(MAILBOX_1_NAME + "/").isDirectory(),
@@ -164,10 +164,10 @@ class DefaultMailboxBackupTest implements MailboxMessageFixture {
     @Test
     void backupEmptyAccountThenRestoringItInUser2AccountShouldCreateNoElements() throws Exception {
         ByteArrayOutputStream destination = new ByteArrayOutputStream(BUFFER_SIZE);
-        backup.backupAccount(USER1, destination);
+        backup.backupAccount(USERNAME_1, destination);
 
         InputStream source = new ByteArrayInputStream(destination.toByteArray());
-        MailboxBackup.BackupStatus backupStatus = Mono.from(backup.restore(USER2, source)).block();
+        MailboxBackup.BackupStatus backupStatus = Mono.from(backup.restore(USERNAME_2, source)).block();
         assertThat(backupStatus).isEqualTo(MailboxBackup.BackupStatus.DONE);
         List<DefaultMailboxBackup.MailAccountContent> content = backup.getAccountContentForUser(sessionOtherUser);
 
@@ -179,10 +179,10 @@ class DefaultMailboxBackupTest implements MailboxMessageFixture {
         createMailbox(sessionUser, MAILBOX_PATH_USER1_MAILBOX1);
 
         ByteArrayOutputStream destination = new ByteArrayOutputStream(BUFFER_SIZE);
-        backup.backupAccount(USER1, destination);
+        backup.backupAccount(USERNAME_1, destination);
 
         InputStream source = new ByteArrayInputStream(destination.toByteArray());
-        MailboxBackup.BackupStatus backupStatus = Mono.from(backup.restore(USER2, source)).block();
+        MailboxBackup.BackupStatus backupStatus = Mono.from(backup.restore(USERNAME_2, source)).block();
         assertThat(backupStatus).isEqualTo(MailboxBackup.BackupStatus.DONE);
 
         List<DefaultMailboxBackup.MailAccountContent> content = backup.getAccountContentForUser(sessionOtherUser);
@@ -200,10 +200,10 @@ class DefaultMailboxBackupTest implements MailboxMessageFixture {
         createMailbox(sessionOtherUser, MAILBOX_PATH_OTHER_USER_MAILBOX1);
 
         ByteArrayOutputStream destination = new ByteArrayOutputStream(BUFFER_SIZE);
-        backup.backupAccount(USER1, destination);
+        backup.backupAccount(USERNAME_1, destination);
 
         InputStream source = new ByteArrayInputStream(destination.toByteArray());
-        MailboxBackup.BackupStatus backupStatus = Mono.from(backup.restore(USER2, source)).block();
+        MailboxBackup.BackupStatus backupStatus = Mono.from(backup.restore(USERNAME_2, source)).block();
 
         assertThat(backupStatus).isEqualTo(MailboxBackup.BackupStatus.NON_EMPTY_RECEIVER_ACCOUNT);
     }
@@ -214,10 +214,10 @@ class DefaultMailboxBackupTest implements MailboxMessageFixture {
         createMailbox(sessionUser, MAILBOX_PATH_USER1_MAILBOX2);
 
         ByteArrayOutputStream destination = new ByteArrayOutputStream(BUFFER_SIZE);
-        backup.backupAccount(USER1, destination);
+        backup.backupAccount(USERNAME_1, destination);
 
         InputStream source = new ByteArrayInputStream(destination.toByteArray());
-        MailboxBackup.BackupStatus backupStatus = Mono.from(backup.restore(USER2, source)).block();
+        MailboxBackup.BackupStatus backupStatus = Mono.from(backup.restore(USERNAME_2, source)).block();
 
         assertThat(backupStatus).isEqualTo(MailboxBackup.BackupStatus.DONE);
 
diff --git a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/MailboxMessageFixture.java b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/MailboxMessageFixture.java
index 23641da..34cad7b 100644
--- a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/MailboxMessageFixture.java
+++ b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/MailboxMessageFixture.java
@@ -28,7 +28,7 @@ import java.util.List;
 import javax.mail.Flags;
 import javax.mail.util.SharedByteArrayInputStream;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.MessageUid;
@@ -50,8 +50,8 @@ public interface MailboxMessageFixture {
     String USER = "user";
     String OTHER_USER = "otherUser";
 
-    User USER1 = User.fromUsername(USER);
-    User USER2 = User.fromUsername(OTHER_USER);
+    Username USERNAME_1 = Username.fromUsername(USER);
+    Username USERNAME_2 = Username.fromUsername(OTHER_USER);
 
     String DATE_STRING_1 = "2018-02-15T15:54:02Z";
     String DATE_STRING_2 = "2018-03-15T15:54:02Z";
diff --git a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipArchivesLoaderTest.java b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipArchivesLoaderTest.java
index 67baac8..8ac762f 100644
--- a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipArchivesLoaderTest.java
+++ b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipArchivesLoaderTest.java
@@ -75,7 +75,7 @@ public class ZipArchivesLoaderTest implements MailboxMessageFixture {
     @Test
     void mailAccountIteratorFromEmptyArchiveShouldThrowNoSuchElementException() throws Exception {
         ByteArrayOutputStream destination = new ByteArrayOutputStream(BUFFER_SIZE);
-        backup.backupAccount(USER1, destination);
+        backup.backupAccount(USERNAME_1, destination);
 
         InputStream source = new ByteArrayInputStream(destination.toByteArray());
         MailArchiveIterator mailArchiveIterator = archiveLoader.load(source);
@@ -87,7 +87,7 @@ public class ZipArchivesLoaderTest implements MailboxMessageFixture {
     @Test
     void callingNextSeveralTimeOnAnEmptyIteratorShouldThrowNoSuchElementException()  throws Exception {
         ByteArrayOutputStream destination = new ByteArrayOutputStream(BUFFER_SIZE);
-        backup.backupAccount(USER1, destination);
+        backup.backupAccount(USERNAME_1, destination);
 
         InputStream source = new ByteArrayInputStream(destination.toByteArray());
         MailArchiveIterator mailArchiveIterator = archiveLoader.load(source);
@@ -103,7 +103,7 @@ public class ZipArchivesLoaderTest implements MailboxMessageFixture {
         createMailBoxWithMessage(MAILBOX_PATH_USER1_MAILBOX1);
 
         ByteArrayOutputStream destination = new ByteArrayOutputStream(BUFFER_SIZE);
-        backup.backupAccount(USER1, destination);
+        backup.backupAccount(USERNAME_1, destination);
 
         InputStream source = new ByteArrayInputStream(destination.toByteArray());
         MailArchiveIterator mailArchiveIterator = archiveLoader.load(source);
@@ -120,7 +120,7 @@ public class ZipArchivesLoaderTest implements MailboxMessageFixture {
         createMailBoxWithMessage(MAILBOX_PATH_USER1_MAILBOX2);
 
         ByteArrayOutputStream destination = new ByteArrayOutputStream(BUFFER_SIZE);
-        backup.backupAccount(USER1, destination);
+        backup.backupAccount(USERNAME_1, destination);
 
         InputStream source = new ByteArrayInputStream(destination.toByteArray());
         MailArchiveIterator mailArchiveIterator = archiveLoader.load(source);
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJson.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJson.java
index d2800c7..3494c49 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJson.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJson.java
@@ -25,7 +25,7 @@ import java.util.List;
 import javax.inject.Inject;
 import javax.mail.Flags;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.elasticsearch.IndexAttachments;
 import org.apache.james.mailbox.extractor.TextExtractor;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
@@ -57,7 +57,7 @@ public class MessageToElasticSearchJson {
         this(textExtractor, ZoneId.systemDefault(), indexAttachments);
     }
 
-    public String convertToJson(MailboxMessage message, List<User> users) throws JsonProcessingException {
+    public String convertToJson(MailboxMessage message, List<Username> usernames) throws JsonProcessingException {
         Preconditions.checkNotNull(message);
 
         return mapper.writeValueAsString(IndexableMessage.builder()
@@ -68,7 +68,7 @@ public class MessageToElasticSearchJson {
                 .build());
     }
 
-    public String convertToJsonWithoutAttachment(MailboxMessage message, List<User> users) throws JsonProcessingException {
+    public String convertToJsonWithoutAttachment(MailboxMessage message, List<Username> usernames) throws JsonProcessingException {
         return mapper.writeValueAsString(IndexableMessage.builder()
                 .message(message)
                 .extractor(textExtractor)
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJsonTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJsonTest.java
index ff73f72..0f23394 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJsonTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJsonTest.java
@@ -31,7 +31,7 @@ import java.util.Date;
 
 import javax.mail.Flags;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.FlagsBuilder;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.elasticsearch.IndexAttachments;
@@ -63,8 +63,7 @@ public class MessageToElasticSearchJsonTest {
     private static final MessageId MESSAGE_ID = TestMessageId.of(184L);
     private static final long MOD_SEQ = 42L;
     private static final MessageUid UID = MessageUid.of(25);
-    private static final String USERNAME = "username";
-    private static final User USER = User.fromUsername(USERNAME);
+    private static final Username USERNAME = Username.fromUsername("username");
 
     private TextExtractor textExtractor;
 
@@ -105,7 +104,7 @@ public class MessageToElasticSearchJsonTest {
                 MAILBOX_ID);
         spamMail.setUid(UID);
         spamMail.setModSeq(MOD_SEQ);
-        assertThatJson(messageToElasticSearchJson.convertToJson(spamMail, ImmutableList.of(USER)))
+        assertThatJson(messageToElasticSearchJson.convertToJson(spamMail, ImmutableList.of(USERNAME)))
             .when(IGNORING_ARRAY_ORDER)
             .isEqualTo(ClassLoaderUtils.getSystemResourceAsString("eml/spamMail.json"));
     }
@@ -125,7 +124,7 @@ public class MessageToElasticSearchJsonTest {
                 MAILBOX_ID);
         htmlMail.setModSeq(MOD_SEQ);
         htmlMail.setUid(UID);
-        assertThatJson(messageToElasticSearchJson.convertToJson(htmlMail, ImmutableList.of(USER)))
+        assertThatJson(messageToElasticSearchJson.convertToJson(htmlMail, ImmutableList.of(USERNAME)))
             .when(IGNORING_ARRAY_ORDER)
             .isEqualTo(ClassLoaderUtils.getSystemResourceAsString("eml/htmlMail.json"));
     }
@@ -145,7 +144,7 @@ public class MessageToElasticSearchJsonTest {
                 MAILBOX_ID);
         pgpSignedMail.setModSeq(MOD_SEQ);
         pgpSignedMail.setUid(UID);
-        assertThatJson(messageToElasticSearchJson.convertToJson(pgpSignedMail, ImmutableList.of(USER)))
+        assertThatJson(messageToElasticSearchJson.convertToJson(pgpSignedMail, ImmutableList.of(USERNAME)))
             .when(IGNORING_ARRAY_ORDER)
             .isEqualTo(ClassLoaderUtils.getSystemResourceAsString("eml/pgpSignedMail.json"));
     }
@@ -166,7 +165,7 @@ public class MessageToElasticSearchJsonTest {
         mail.setModSeq(MOD_SEQ);
         mail.setUid(UID);
         assertThatJson(messageToElasticSearchJson.convertToJson(mail,
-                ImmutableList.of(User.fromUsername("user1"), User.fromUsername("user2"))))
+                ImmutableList.of(Username.fromUsername("user1"), Username.fromUsername("user2"))))
             .when(IGNORING_ARRAY_ORDER).when(IGNORING_VALUES)
             .isEqualTo(ClassLoaderUtils.getSystemResourceAsString("eml/mail.json"));
     }
@@ -186,7 +185,7 @@ public class MessageToElasticSearchJsonTest {
                 MAILBOX_ID);
         recursiveMail.setModSeq(MOD_SEQ);
         recursiveMail.setUid(UID);
-        assertThatJson(messageToElasticSearchJson.convertToJson(recursiveMail, ImmutableList.of(USER)))
+        assertThatJson(messageToElasticSearchJson.convertToJson(recursiveMail, ImmutableList.of(USERNAME)))
             .when(IGNORING_ARRAY_ORDER).when(IGNORING_VALUES)
             .isEqualTo(ClassLoaderUtils.getSystemResourceAsString("eml/recursiveMail.json"));
     }
@@ -206,7 +205,7 @@ public class MessageToElasticSearchJsonTest {
                 MAILBOX_ID);
         mailWithNoInternalDate.setModSeq(MOD_SEQ);
         mailWithNoInternalDate.setUid(UID);
-        assertThatJson(messageToElasticSearchJson.convertToJson(mailWithNoInternalDate, ImmutableList.of(USER)))
+        assertThatJson(messageToElasticSearchJson.convertToJson(mailWithNoInternalDate, ImmutableList.of(USERNAME)))
             .when(IGNORING_ARRAY_ORDER)
             .when(IGNORING_VALUES)
             .isEqualTo(ClassLoaderUtils.getSystemResourceAsString("eml/recursiveMail.json"));
@@ -231,7 +230,7 @@ public class MessageToElasticSearchJsonTest {
             new DefaultTextExtractor(),
             ZoneId.of("Europe/Paris"),
             IndexAttachments.YES);
-        String convertToJson = messageToElasticSearchJson.convertToJson(mailWithNoInternalDate, ImmutableList.of(USER));
+        String convertToJson = messageToElasticSearchJson.convertToJson(mailWithNoInternalDate, ImmutableList.of(USERNAME));
 
         // Then
         assertThatJson(convertToJson)
@@ -259,7 +258,7 @@ public class MessageToElasticSearchJsonTest {
             new DefaultTextExtractor(),
             ZoneId.of("Europe/Paris"),
             IndexAttachments.NO);
-        String convertToJson = messageToElasticSearchJson.convertToJson(mailWithNoInternalDate, ImmutableList.of(USER));
+        String convertToJson = messageToElasticSearchJson.convertToJson(mailWithNoInternalDate, ImmutableList.of(USERNAME));
 
         // Then
         assertThatJson(convertToJson)
@@ -284,7 +283,7 @@ public class MessageToElasticSearchJsonTest {
         mailWithNoMailboxId.setUid(UID);
 
         assertThatThrownBy(() ->
-            messageToElasticSearchJson.convertToJson(mailWithNoMailboxId, ImmutableList.of(USER)))
+            messageToElasticSearchJson.convertToJson(mailWithNoMailboxId, ImmutableList.of(USERNAME)))
             .isInstanceOf(NullPointerException.class);
     }
 
@@ -333,7 +332,7 @@ public class MessageToElasticSearchJsonTest {
         spamMail.setUid(UID);
         spamMail.setModSeq(MOD_SEQ);
 
-        assertThatJson(messageToElasticSearchJson.convertToJson(spamMail, ImmutableList.of(USER)))
+        assertThatJson(messageToElasticSearchJson.convertToJson(spamMail, ImmutableList.of(USERNAME)))
             .when(IGNORING_ARRAY_ORDER)
             .isEqualTo(
                 ClassLoaderUtils.getSystemResourceAsString("eml/nonTextual.json", StandardCharsets.UTF_8));
@@ -358,7 +357,7 @@ public class MessageToElasticSearchJsonTest {
                 new DefaultTextExtractor(),
                 ZoneId.of("Europe/Paris"),
                 IndexAttachments.NO);
-        String convertToJsonWithoutAttachment = messageToElasticSearchJson.convertToJsonWithoutAttachment(message, ImmutableList.of(USER));
+        String convertToJsonWithoutAttachment = messageToElasticSearchJson.convertToJsonWithoutAttachment(message, ImmutableList.of(USERNAME));
 
         // Then
         assertThatJson(convertToJsonWithoutAttachment)
@@ -386,7 +385,7 @@ public class MessageToElasticSearchJsonTest {
                 new JsoupTextExtractor(),
                 ZoneId.of("Europe/Paris"),
                 IndexAttachments.NO);
-        String convertToJsonWithoutAttachment = messageToElasticSearchJson.convertToJsonWithoutAttachment(message, ImmutableList.of(USER));
+        String convertToJsonWithoutAttachment = messageToElasticSearchJson.convertToJsonWithoutAttachment(message, ImmutableList.of(USERNAME));
 
         System.out.println(convertToJsonWithoutAttachment);
 
diff --git a/mailbox/event/event-memory/src/main/java/org/apache/james/mailbox/events/delivery/InVmEventDelivery.java b/mailbox/event/event-memory/src/main/java/org/apache/james/mailbox/events/delivery/InVmEventDelivery.java
index 9a538d2..718d5f1 100644
--- a/mailbox/event/event-memory/src/main/java/org/apache/james/mailbox/events/delivery/InVmEventDelivery.java
+++ b/mailbox/event/event-memory/src/main/java/org/apache/james/mailbox/events/delivery/InVmEventDelivery.java
@@ -93,7 +93,7 @@ public class InVmEventDelivery implements EventDelivery {
         return MDCBuilder.create()
             .addContext(EventBus.StructuredLoggingFields.EVENT_ID, event.getEventId())
             .addContext(EventBus.StructuredLoggingFields.EVENT_CLASS, event.getClass())
-            .addContext(EventBus.StructuredLoggingFields.USER, event.getUser())
+            .addContext(EventBus.StructuredLoggingFields.USER, event.getUsername())
             .addContext(EventBus.StructuredLoggingFields.LISTENER_CLASS, mailboxListener.getClass())
             .build();
     }
@@ -102,7 +102,7 @@ public class InVmEventDelivery implements EventDelivery {
         return MDCStructuredLogger.forLogger(LOGGER)
             .addField(EventBus.StructuredLoggingFields.EVENT_ID, event.getEventId())
             .addField(EventBus.StructuredLoggingFields.EVENT_CLASS, event.getClass())
-            .addField(EventBus.StructuredLoggingFields.USER, event.getUser())
+            .addField(EventBus.StructuredLoggingFields.USER, event.getUsername())
             .addField(EventBus.StructuredLoggingFields.LISTENER_CLASS, mailboxListener.getClass());
     }
 }
diff --git a/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/EventDispatcher.java b/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/EventDispatcher.java
index e144adb..47844d7 100644
--- a/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/EventDispatcher.java
+++ b/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/EventDispatcher.java
@@ -115,7 +115,7 @@ class EventDispatcher {
         return MDCStructuredLogger.forLogger(LOGGER)
             .addField(EventBus.StructuredLoggingFields.EVENT_ID, event.getEventId())
             .addField(EventBus.StructuredLoggingFields.EVENT_CLASS, event.getClass())
-            .addField(EventBus.StructuredLoggingFields.USER, event.getUser())
+            .addField(EventBus.StructuredLoggingFields.USER, event.getUsername())
             .addField(EventBus.StructuredLoggingFields.REGISTRATION_KEYS, keys);
     }
 
diff --git a/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/GroupConsumerRetry.java b/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/GroupConsumerRetry.java
index 991be75..bf1145a 100644
--- a/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/GroupConsumerRetry.java
+++ b/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/GroupConsumerRetry.java
@@ -131,7 +131,7 @@ class GroupConsumerRetry {
         return MDCStructuredLogger.forLogger(LOGGER)
             .addField(EventBus.StructuredLoggingFields.EVENT_ID, event.getEventId())
             .addField(EventBus.StructuredLoggingFields.EVENT_CLASS, event.getClass())
-            .addField(EventBus.StructuredLoggingFields.USER, event.getUser())
+            .addField(EventBus.StructuredLoggingFields.USER, event.getUsername())
             .addField(EventBus.StructuredLoggingFields.GROUP, group.asString());
     }
 }
diff --git a/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/KeyRegistrationHandler.java b/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/KeyRegistrationHandler.java
index dc968fe..e0f9001 100644
--- a/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/KeyRegistrationHandler.java
+++ b/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/KeyRegistrationHandler.java
@@ -152,7 +152,7 @@ class KeyRegistrationHandler {
         return MDCStructuredLogger.forLogger(LOGGER)
             .addField(EventBus.StructuredLoggingFields.EVENT_ID, event.getEventId())
             .addField(EventBus.StructuredLoggingFields.EVENT_CLASS, event.getClass())
-            .addField(EventBus.StructuredLoggingFields.USER, event.getUser())
+            .addField(EventBus.StructuredLoggingFields.USER, event.getUsername())
             .addField(EventBus.StructuredLoggingFields.REGISTRATION_KEY, key);
     }
 }
diff --git a/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/MailboxListenerExecutor.java b/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/MailboxListenerExecutor.java
index 70783e7..696fa49 100644
--- a/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/MailboxListenerExecutor.java
+++ b/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/MailboxListenerExecutor.java
@@ -49,7 +49,7 @@ public class MailboxListenerExecutor {
         return mdcBuilder
             .addContext(EventBus.StructuredLoggingFields.EVENT_ID, event.getEventId())
             .addContext(EventBus.StructuredLoggingFields.EVENT_CLASS, event.getClass())
-            .addContext(EventBus.StructuredLoggingFields.USER, event.getUser())
+            .addContext(EventBus.StructuredLoggingFields.USER, event.getUsername())
             .addContext(EventBus.StructuredLoggingFields.LISTENER_CLASS, listener.getClass())
             .build();
     }
diff --git a/mailbox/event/json/src/main/scala/org/apache/james/event/json/EventSerializer.scala b/mailbox/event/json/src/main/scala/org/apache/james/event/json/EventSerializer.scala
index 4bd09b2..ac343a5 100644
--- a/mailbox/event/json/src/main/scala/org/apache/james/event/json/EventSerializer.scala
+++ b/mailbox/event/json/src/main/scala/org/apache/james/event/json/EventSerializer.scala
@@ -24,7 +24,7 @@ import java.util.{TreeMap => JavaTreeMap}
 
 import javax.inject.Inject
 import julienrf.json.derived
-import org.apache.james.core.User
+import org.apache.james.core.Username
 import org.apache.james.core.quota.{QuotaCount, QuotaSize, QuotaValue}
 import org.apache.james.event.json.DTOs.SystemFlag.SystemFlag
 import org.apache.james.event.json.DTOs._
@@ -44,30 +44,30 @@ private sealed trait Event {
 }
 
 private object DTO {
-  case class MailboxACLUpdated(eventId: EventId, sessionId: SessionId, user: User, mailboxPath: MailboxPath, aclDiff: ACLDiff, mailboxId: MailboxId) extends Event {
+  case class MailboxACLUpdated(eventId: EventId, sessionId: SessionId, user: Username, mailboxPath: MailboxPath, aclDiff: ACLDiff, mailboxId: MailboxId) extends Event {
     override def toJava: JavaEvent = new JavaMailboxACLUpdated(sessionId, user, mailboxPath.toJava, aclDiff.toJava, mailboxId, eventId)
   }
 
-  case class MailboxAdded(eventId: EventId, mailboxPath: MailboxPath, mailboxId: MailboxId, user: User, sessionId: SessionId) extends Event {
+  case class MailboxAdded(eventId: EventId, mailboxPath: MailboxPath, mailboxId: MailboxId, user: Username, sessionId: SessionId) extends Event {
     override def toJava: JavaEvent = new JavaMailboxAdded(sessionId, user, mailboxPath.toJava, mailboxId, eventId)
   }
 
-  case class MailboxDeletion(eventId: EventId, sessionId: SessionId, user: User, path: MailboxPath, quotaRoot: QuotaRoot,
+  case class MailboxDeletion(eventId: EventId, sessionId: SessionId, user: Username, path: MailboxPath, quotaRoot: QuotaRoot,
                              deletedMessageCount: QuotaCount, totalDeletedSize: QuotaSize, mailboxId: MailboxId) extends Event {
     override def toJava: JavaEvent = new JavaMailboxDeletion(sessionId, user, path.toJava, quotaRoot, deletedMessageCount,
       totalDeletedSize, mailboxId, eventId)
   }
 
-  case class MailboxRenamed(eventId: EventId, sessionId: SessionId, user: User, path: MailboxPath, mailboxId: MailboxId, newPath: MailboxPath) extends Event {
+  case class MailboxRenamed(eventId: EventId, sessionId: SessionId, user: Username, path: MailboxPath, mailboxId: MailboxId, newPath: MailboxPath) extends Event {
     override def toJava: JavaEvent = new JavaMailboxRenamed(sessionId, user, path.toJava, mailboxId, newPath.toJava, eventId)
   }
 
-  case class QuotaUsageUpdatedEvent(eventId: EventId, user: User, quotaRoot: QuotaRoot, countQuota: Quota[QuotaCount],
+  case class QuotaUsageUpdatedEvent(eventId: EventId, user: Username, quotaRoot: QuotaRoot, countQuota: Quota[QuotaCount],
                                     sizeQuota: Quota[QuotaSize], time: Instant) extends Event {
     override def toJava: JavaEvent = new JavaQuotaUsageUpdatedEvent(eventId, user, quotaRoot, countQuota.toJava, sizeQuota.toJava, time)
   }
 
-  case class Added(eventId: EventId, sessionId: SessionId, user: User, path: MailboxPath, mailboxId: MailboxId,
+  case class Added(eventId: EventId, sessionId: SessionId, user: Username, path: MailboxPath, mailboxId: MailboxId,
                    added: Map[MessageUid, DTOs.MessageMetaData]) extends Event {
     override def toJava: JavaEvent = new JavaAdded(
       sessionId,
@@ -78,7 +78,7 @@ private object DTO {
       eventId)
   }
 
-  case class Expunged(eventId: EventId, sessionId: SessionId, user: User, path: MailboxPath, mailboxId: MailboxId,
+  case class Expunged(eventId: EventId, sessionId: SessionId, user: Username, path: MailboxPath, mailboxId: MailboxId,
                       expunged: Map[MessageUid, DTOs.MessageMetaData]) extends Event {
     override def toJava: JavaEvent = new JavaExpunged(
       sessionId,
@@ -89,7 +89,7 @@ private object DTO {
       eventId)
   }
 
-  case class MessageMoveEvent(eventId: EventId, user: User, previousMailboxIds: Iterable[MailboxId], targetMailboxIds: Iterable[MailboxId],
+  case class MessageMoveEvent(eventId: EventId, user: Username, previousMailboxIds: Iterable[MailboxId], targetMailboxIds: Iterable[MailboxId],
                               messageIds: Iterable[MessageId]) extends Event {
     override def toJava: JavaEvent = JavaMessageMoveEvent.builder()
       .eventId(eventId)
@@ -102,7 +102,7 @@ private object DTO {
       .build()
   }
 
-  case class FlagsUpdated(eventId: EventId, sessionId: SessionId, user: User, path: MailboxPath, mailboxId: MailboxId,
+  case class FlagsUpdated(eventId: EventId, sessionId: SessionId, user: Username, path: MailboxPath, mailboxId: MailboxId,
                           updatedFlags: List[DTOs.UpdatedFlags]) extends Event {
     override def toJava: JavaEvent = new JavaFlagsUpdated(
       sessionId,
@@ -118,7 +118,7 @@ private object ScalaConverter {
   private def toScala(event: JavaMailboxACLUpdated): DTO.MailboxACLUpdated = DTO.MailboxACLUpdated(
     eventId = event.getEventId,
     sessionId = event.getSessionId,
-    user = event.getUser,
+    user = event.getUsername,
     mailboxPath = MailboxPath.fromJava(event.getMailboxPath),
     aclDiff = ACLDiff.fromJava(event.getAclDiff),
     mailboxId = event.getMailboxId)
@@ -127,13 +127,13 @@ private object ScalaConverter {
     eventId = event.getEventId,
     mailboxPath = MailboxPath.fromJava(event.getMailboxPath),
     mailboxId = event.getMailboxId,
-    user = event.getUser,
+    user = event.getUsername,
     sessionId = event.getSessionId)
 
   private def toScala(event: JavaMailboxDeletion): DTO.MailboxDeletion = DTO.MailboxDeletion(
     eventId = event.getEventId,
     sessionId = event.getSessionId,
-    user = event.getUser,
+    user = event.getUsername,
     quotaRoot = event.getQuotaRoot,
     path = MailboxPath.fromJava(event.getMailboxPath),
     deletedMessageCount = event.getDeletedMessageCount,
@@ -143,14 +143,14 @@ private object ScalaConverter {
   private def toScala(event: JavaMailboxRenamed): DTO.MailboxRenamed = DTO.MailboxRenamed(
     eventId = event.getEventId,
     sessionId = event.getSessionId,
-    user = event.getUser,
+    user = event.getUsername,
     path = MailboxPath.fromJava(event.getMailboxPath),
     mailboxId = event.getMailboxId,
     newPath = MailboxPath.fromJava(event.getNewPath))
 
   private def toScala(event: JavaQuotaUsageUpdatedEvent): DTO.QuotaUsageUpdatedEvent = DTO.QuotaUsageUpdatedEvent(
     eventId = event.getEventId,
-    user = event.getUser,
+    user = event.getUsername,
     quotaRoot = event.getQuotaRoot,
     countQuota = Quota.toScala(event.getCountQuota),
     sizeQuota = Quota.toScala(event.getSizeQuota),
@@ -159,7 +159,7 @@ private object ScalaConverter {
   private def toScala(event: JavaAdded): DTO.Added = DTO.Added(
     eventId = event.getEventId,
     sessionId = event.getSessionId,
-    user = event.getUser,
+    user = event.getUsername,
     path = MailboxPath.fromJava(event.getMailboxPath),
     mailboxId = event.getMailboxId,
     added = event.getAdded.asScala.mapValues(DTOs.MessageMetaData.fromJava).toMap)
@@ -167,14 +167,14 @@ private object ScalaConverter {
   private def toScala(event: JavaExpunged): DTO.Expunged = DTO.Expunged(
     eventId = event.getEventId,
     sessionId = event.getSessionId,
-    user = event.getUser,
+    user = event.getUsername,
     path = MailboxPath.fromJava(event.getMailboxPath),
     mailboxId = event.getMailboxId,
     expunged = event.getExpunged.asScala.mapValues(DTOs.MessageMetaData.fromJava).toMap)
 
   private def toScala(event: JavaMessageMoveEvent): DTO.MessageMoveEvent = DTO.MessageMoveEvent(
     eventId = event.getEventId,
-    user = event.getUser,
+    user = event.getUsername,
     previousMailboxIds = event.getMessageMoves.getPreviousMailboxIds.asScala,
     targetMailboxIds = event.getMessageMoves.getTargetMailboxIds.asScala,
     messageIds = event.getMessageIds.asScala)
@@ -182,7 +182,7 @@ private object ScalaConverter {
   private def toScala(event: JavaFlagsUpdated): DTO.FlagsUpdated = DTO.FlagsUpdated(
     eventId = event.getEventId,
     sessionId = event.getSessionId,
-    user = event.getUser,
+    user = event.getUsername,
     path = DTOs.MailboxPath.fromJava(event.getMailboxPath),
     mailboxId = event.getMailboxId,
     updatedFlags = event.getUpdatedFlags.asScala.map(DTOs.UpdatedFlags.toUpdatedFlags).toList)
@@ -203,7 +203,7 @@ private object ScalaConverter {
 
 class JsonSerialize(mailboxIdFactory: MailboxId.Factory, messageIdFactory: MessageId.Factory, quotaRootDeserializer: QuotaRootDeserializer) {
   implicit val systemFlagsWrites: Writes[SystemFlag] = Writes.enumNameWrites
-  implicit val userWriters: Writes[User] = (user: User) => JsString(user.asString)
+  implicit val userWriters: Writes[Username] = (user: Username) => JsString(user.asString)
   implicit val quotaRootWrites: Writes[QuotaRoot] = quotaRoot => JsString(quotaRoot.getValue)
   implicit val quotaValueWrites: Writes[QuotaValue[_]] = value => if (value.isUnlimited) JsNull else JsNumber(value.asLong())
   implicit val quotaScopeWrites: Writes[JavaQuota.Scope] = value => JsString(value.name)
@@ -260,8 +260,8 @@ class JsonSerialize(mailboxIdFactory: MailboxId.Factory, messageIdFactory: Messa
     case JsNumber(id) => JsSuccess(SessionId.of(id.longValue))
     case _ => JsError()
   }
-  implicit val userReads: Reads[User] = {
-    case JsString(userAsString) => JsSuccess(User.fromUsername(userAsString))
+  implicit val userReads: Reads[Username] = {
+    case JsString(userAsString) => JsSuccess(Username.fromUsername(userAsString))
     case _ => JsError()
   }
   implicit val messageIdReads: Reads[MessageId] = {
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/AddedSerializationTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/AddedSerializationTest.java
index 155d41e..f7efce4 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/AddedSerializationTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/AddedSerializationTest.java
@@ -32,7 +32,7 @@ import java.util.SortedMap;
 
 import javax.mail.Flags;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.FlagsBuilder;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
@@ -50,7 +50,7 @@ import com.google.common.collect.ImmutableSortedMap;
 
 class AddedSerializationTest {
 
-    private static final User USER = User.fromUsername("user");
+    private static final Username USERNAME = Username.fromUsername("user");
     private static final MailboxSession.SessionId SESSION_ID = MailboxSession.SessionId.of(42);
     private static final MailboxId MAILBOX_ID = TestId.of(18);
     private static final String MAILBOX_NAME = "mailboxName";
@@ -67,7 +67,7 @@ class AddedSerializationTest {
     private static final SortedMap<MessageUid, MessageMetaData> ADDED = ImmutableSortedMap.of(
         MESSAGE_UID, new MessageMetaData(MESSAGE_UID, MOD_SEQ, FLAGS, SIZE, Date.from(INSTANT), MESSAGE_ID));
 
-    private static final MailboxListener.Added DEFAULT_ADDED_EVENT = new MailboxListener.Added(SESSION_ID, USER,
+    private static final MailboxListener.Added DEFAULT_ADDED_EVENT = new MailboxListener.Added(SESSION_ID, USERNAME,
         MAILBOX_PATH, MAILBOX_ID, ADDED, EVENT_ID);
     private static final String DEFAULT_ADDED_EVENT_JSON = 
         "{" +
@@ -111,7 +111,7 @@ class AddedSerializationTest {
     @Nested
     class WithEmptyAddedMap {
 
-        private final MailboxListener.Added emptyAddedEvent = new MailboxListener.Added(SESSION_ID, USER, MAILBOX_PATH,
+        private final MailboxListener.Added emptyAddedEvent = new MailboxListener.Added(SESSION_ID, USERNAME, MAILBOX_PATH,
             MAILBOX_ID, ImmutableSortedMap.of(), EVENT_ID);
         private final String emptyAddedEventJson =
             "{" +
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/ExpungedSerializationTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/ExpungedSerializationTest.java
index 513ccea..eefd5f1 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/ExpungedSerializationTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/ExpungedSerializationTest.java
@@ -32,7 +32,7 @@ import java.util.NoSuchElementException;
 
 import javax.mail.Flags;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.FlagsBuilder;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
@@ -50,7 +50,7 @@ import com.google.common.collect.ImmutableMap;
 
 class ExpungedSerializationTest {
 
-    private static final User USER = User.fromUsername("user");
+    private static final Username USERNAME = Username.fromUsername("user");
     private static final MailboxSession.SessionId SESSION_ID = MailboxSession.SessionId.of(42);
     private static final MailboxId MAILBOX_ID = TestId.of(18);
     private static final String MAILBOX_NAME = "mailboxName";
@@ -67,7 +67,7 @@ class ExpungedSerializationTest {
     private static final Map<MessageUid, MessageMetaData> EXPUNGED = ImmutableMap.of(
         MESSAGE_UID, new MessageMetaData(MESSAGE_UID, MOD_SEQ, FLAGS, SIZE, Date.from(INSTANT), MESSAGE_ID));
 
-    private static final MailboxListener.Expunged DEFAULT_EXPUNGED_EVENT = new MailboxListener.Expunged(SESSION_ID, USER,
+    private static final MailboxListener.Expunged DEFAULT_EXPUNGED_EVENT = new MailboxListener.Expunged(SESSION_ID, USERNAME,
         MAILBOX_PATH, MAILBOX_ID, EXPUNGED, EVENT_ID);
     private static final String DEFAULT_EXPUNGED_EVENT_JSON =
         "{" +
@@ -111,7 +111,7 @@ class ExpungedSerializationTest {
     @Nested
     class WithEmptyExpungedMap {
 
-        private final MailboxListener.Expunged emptyExpungedEvent = new MailboxListener.Expunged(SESSION_ID, USER,
+        private final MailboxListener.Expunged emptyExpungedEvent = new MailboxListener.Expunged(SESSION_ID, USERNAME,
             MAILBOX_PATH, MAILBOX_ID, ImmutableMap.of(), EVENT_ID);
         private final String emptyExpungedEventJson =
             "{" +
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/FlagsUpdatedSerializationTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/FlagsUpdatedSerializationTest.java
index 9a0f19d..de4f5fb 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/FlagsUpdatedSerializationTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/FlagsUpdatedSerializationTest.java
@@ -30,7 +30,7 @@ import java.util.NoSuchElementException;
 
 import javax.mail.Flags;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.FlagsBuilder;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
@@ -49,7 +49,7 @@ import net.javacrumbs.jsonunit.core.Option;
 
 class FlagsUpdatedSerializationTest {
 
-    private static final User USER = User.fromUsername("user");
+    private static final Username USERNAME = Username.fromUsername("user");
     private static final MailboxSession.SessionId SESSION_ID = MailboxSession.SessionId.of(42);
     private static final MailboxId MAILBOX_ID = TestId.of(18);
     private static final String MAILBOX_NAME = "mailboxName";
@@ -91,7 +91,7 @@ class FlagsUpdatedSerializationTest {
 
     private static List<UpdatedFlags> UPDATED_FLAGS_LIST = ImmutableList.of(UPDATED_FLAG_1, UPDATED_FLAG_2);
 
-    private static final MailboxListener.FlagsUpdated DEFAULT_EVENT = new MailboxListener.FlagsUpdated(SESSION_ID, USER,
+    private static final MailboxListener.FlagsUpdated DEFAULT_EVENT = new MailboxListener.FlagsUpdated(SESSION_ID, USERNAME,
         MAILBOX_PATH, MAILBOX_ID, UPDATED_FLAGS_LIST, EVENT_ID);
     private static final String DEFAULT_EVENT_JSON =
         "{" +
@@ -138,7 +138,7 @@ class FlagsUpdatedSerializationTest {
     @Nested
     class WithEmptyUpdatedFlags {
         private final List<UpdatedFlags> emptyUpdatedFlags = ImmutableList.of();
-        private final MailboxListener.FlagsUpdated emptyUpdatedFlagsEvent = new MailboxListener.FlagsUpdated(SESSION_ID, USER, MAILBOX_PATH,
+        private final MailboxListener.FlagsUpdated emptyUpdatedFlagsEvent = new MailboxListener.FlagsUpdated(SESSION_ID, USERNAME, MAILBOX_PATH,
             MAILBOX_ID, emptyUpdatedFlags, EVENT_ID);
 
         private static final String EVENT_JSON_WITH_EMPTY_UPDATED_FLAGS =
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxACLUpdatedEventSerializationTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxACLUpdatedEventSerializationTest.java
index d0f6c6a..75c0f58 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxACLUpdatedEventSerializationTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxACLUpdatedEventSerializationTest.java
@@ -27,7 +27,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.util.NoSuchElementException;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.acl.ACLDiff;
 import org.apache.james.mailbox.events.MailboxListener;
@@ -40,7 +40,7 @@ import org.junit.jupiter.api.Test;
 
 class MailboxACLUpdatedEventSerializationTest {
 
-    private static final User USER = User.fromUsername("user");
+    private static final Username USERNAME = Username.fromUsername("user");
     private static final MailboxACL.EntryKey ENTRY_KEY = org.apache.james.mailbox.model.MailboxACL.EntryKey.createGroupEntryKey("any", false);
     private static final MailboxACL.Rfc4314Rights RIGHTS = new MailboxACL.Rfc4314Rights(MailboxACL.Right.Administer, MailboxACL.Right.Read);
     private static final MailboxACL MAILBOX_ACL = new MailboxACL(
@@ -50,7 +50,7 @@ class MailboxACLUpdatedEventSerializationTest {
 
     private static final MailboxListener.MailboxACLUpdated MAILBOX_ACL_UPDATED = new MailboxListener.MailboxACLUpdated(
                 MailboxSession.SessionId.of(6),
-                USER,
+        USERNAME,
                 new MailboxPath(MailboxConstants.USER_NAMESPACE, "bob", "mailboxName"),
                 ACLDiff.computeDiff(MailboxACL.EMPTY, MAILBOX_ACL),
                 TestId.of(23),
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxAddedSerializationTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxAddedSerializationTest.java
index baf19c0..020b944 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxAddedSerializationTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxAddedSerializationTest.java
@@ -27,7 +27,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.util.NoSuchElementException;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.events.MailboxListener;
 import org.apache.james.mailbox.model.MailboxConstants;
@@ -37,10 +37,10 @@ import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 
 class MailboxAddedSerializationTest {
-    private static final User USER = User.fromUsername("user");
+    private static final Username USERNAME = Username.fromUsername("user");
     private static final MailboxListener.MailboxAdded EVENT_1 = new MailboxListener.MailboxAdded(
         MailboxSession.SessionId.of(42),
-        USER,
+        USERNAME,
         new MailboxPath(MailboxConstants.USER_NAMESPACE, "bob", "mailboxName"),
         TestId.of(18),
         EVENT_ID);
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxDeletionSerializationTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxDeletionSerializationTest.java
index 535bcfe..2948d1e 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxDeletionSerializationTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxDeletionSerializationTest.java
@@ -30,7 +30,7 @@ import java.util.NoSuchElementException;
 import java.util.Optional;
 
 import org.apache.james.core.Domain;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.core.quota.QuotaCount;
 import org.apache.james.core.quota.QuotaSize;
 import org.apache.james.mailbox.MailboxSession;
@@ -45,15 +45,15 @@ import org.junit.jupiter.api.Test;
 class MailboxDeletionSerializationTest {
 
     private static final MailboxSession.SessionId SESSION_ID = MailboxSession.SessionId.of(3652);
-    private static final User USER = User.fromUsername("user");
-    private static final MailboxPath MAILBOX_PATH = new MailboxPath(USER_NAMESPACE, USER.asString(), "mailboxName");
+    private static final Username USERNAME = Username.fromUsername("user");
+    private static final MailboxPath MAILBOX_PATH = new MailboxPath(USER_NAMESPACE, USERNAME.asString(), "mailboxName");
     private static final MailboxId MAILBOX_ID = TestId.of(789);
     private static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("#private&user@domain", Optional.of(Domain.of("domain")));
     private static final QuotaCount DELETED_MESSAGE_COUNT = QuotaCount.count(60);
     private static final QuotaSize TOTAL_DELETED_SIZE = QuotaSize.size(100);
     private static final MailboxListener.MailboxDeletion DEFAULT_MAILBOX_DELETION_EVENT = new MailboxListener.MailboxDeletion(
         SESSION_ID,
-        USER,
+        USERNAME,
         MAILBOX_PATH,
         QUOTA_ROOT,
         DELETED_MESSAGE_COUNT,
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxRenamedSerializationTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxRenamedSerializationTest.java
index 43fc727..3f3a0f5 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxRenamedSerializationTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxRenamedSerializationTest.java
@@ -28,7 +28,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.util.NoSuchElementException;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.events.MailboxListener;
 import org.apache.james.mailbox.model.MailboxId;
@@ -39,16 +39,16 @@ import org.junit.jupiter.api.Test;
 
 class MailboxRenamedSerializationTest {
 
-    private static final User DEFAULT_USER = User.fromUsername("user");
+    private static final Username DEFAULT_USERNAME = Username.fromUsername("user");
     private static final String OLD_MAILBOX_NAME = "oldMailboxName";
-    private static final MailboxPath DEFAULT_OLD_MAILBOX_PATH = new MailboxPath(USER_NAMESPACE, DEFAULT_USER.asString(), OLD_MAILBOX_NAME);
+    private static final MailboxPath DEFAULT_OLD_MAILBOX_PATH = new MailboxPath(USER_NAMESPACE, DEFAULT_USERNAME.asString(), OLD_MAILBOX_NAME);
     private static final String NEW_MAILBOX_NAME = "newMailboxName";
-    private static final MailboxPath DEFAULT_NEW_MAILBOX_PATH = new MailboxPath(USER_NAMESPACE, DEFAULT_USER.asString(), NEW_MAILBOX_NAME);
+    private static final MailboxPath DEFAULT_NEW_MAILBOX_PATH = new MailboxPath(USER_NAMESPACE, DEFAULT_USERNAME.asString(), NEW_MAILBOX_NAME);
     private static final MailboxSession.SessionId DEFAULT_SESSION_ID = MailboxSession.SessionId.of(123456789);
     private static final MailboxId DEFAULT_MAILBOX_ID = TestId.of(123456);
     private static final MailboxListener.MailboxRenamed DEFAULT_MAILBOX_RENAMED_EVENT = new MailboxListener.MailboxRenamed(
         DEFAULT_SESSION_ID,
-        DEFAULT_USER,
+        DEFAULT_USERNAME,
         DEFAULT_OLD_MAILBOX_PATH,
         DEFAULT_MAILBOX_ID,
         DEFAULT_NEW_MAILBOX_PATH,
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/MessageMoveEventSerializationTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/MessageMoveEventSerializationTest.java
index 28b3630..e80a7ae 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/MessageMoveEventSerializationTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/MessageMoveEventSerializationTest.java
@@ -27,7 +27,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.util.NoSuchElementException;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.events.Event;
 import org.apache.james.mailbox.events.MessageMoveEvent;
 import org.apache.james.mailbox.model.MessageMoves;
@@ -39,7 +39,7 @@ import org.junit.jupiter.api.Test;
 class MessageMoveEventSerializationTest {
     private static final Event EVENT = MessageMoveEvent.builder()
         .eventId(EVENT_ID)
-        .user(User.fromUsername("bob@domain.tld"))
+        .user(Username.fromUsername("bob@domain.tld"))
         .messageId(TestMessageId.of(42))
         .messageMoves(
             MessageMoves.builder()
@@ -75,7 +75,7 @@ class MessageMoveEventSerializationTest {
         class EmptyTargetMailboxIds {
             private final Event event = MessageMoveEvent.builder()
                 .eventId(EVENT_ID)
-                .user(User.fromUsername("bob"))
+                .user(Username.fromUsername("bob"))
                 .messageId(TestMessageId.of(42))
                 .messageMoves(
                     MessageMoves.builder()
@@ -109,7 +109,7 @@ class MessageMoveEventSerializationTest {
         class EmptyPreviousMailboxIds {
             private final Event event = MessageMoveEvent.builder()
                 .eventId(EVENT_ID)
-                .user(User.fromUsername("bob"))
+                .user(Username.fromUsername("bob"))
                 .messageId(TestMessageId.of(42))
                 .messageMoves(
                     MessageMoves.builder()
@@ -143,7 +143,7 @@ class MessageMoveEventSerializationTest {
         class EmptyMessagesIds {
             private final Event event = MessageMoveEvent.builder()
                 .eventId(EVENT_ID)
-                .user(User.fromUsername("bob"))
+                .user(Username.fromUsername("bob"))
                 .messageMoves(
                     MessageMoves.builder()
                         .previousMailboxIds(TestId.of(18), TestId.of(24))
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/QuotaUsageUpdatedEventSerializationTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/QuotaUsageUpdatedEventSerializationTest.java
index 00627ea..c67930b 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/QuotaUsageUpdatedEventSerializationTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/QuotaUsageUpdatedEventSerializationTest.java
@@ -29,7 +29,7 @@ import java.time.Instant;
 import java.util.NoSuchElementException;
 import java.util.Optional;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.core.quota.QuotaCount;
 import org.apache.james.core.quota.QuotaSize;
 import org.apache.james.mailbox.events.MailboxListener;
@@ -50,7 +50,7 @@ class QuotaUsageUpdatedEventSerializationTest {
     private static final Instant INSTANT = Instant.parse("2018-11-13T12:00:55Z");
     private final MailboxListener.QuotaUsageUpdatedEvent eventWithUserContainsUsername = new MailboxListener.QuotaUsageUpdatedEvent(
         EVENT_ID,
-        User.fromUsername("onlyUsername"),
+        Username.fromUsername("onlyUsername"),
         QUOTA_ROOT,
         QUOTA_COUNT,
         QUOTA_SIZE,
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/UserTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/UserTest.java
index 2e1d69e..cb4066a 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/UserTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/UserTest.java
@@ -23,7 +23,8 @@ import static org.apache.james.event.json.SerializerFixture.DTO_JSON_SERIALIZE;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
+
 import org.junit.jupiter.api.Test;
 
 import play.api.libs.json.JsError;
@@ -35,26 +36,26 @@ import scala.math.BigDecimal;
 class UserTest {
     @Test
     void userShouldBeWellSerialized() {
-        assertThat(DTO_JSON_SERIALIZE.userWriters().writes(User.fromUsername("bob")))
+        assertThat(DTO_JSON_SERIALIZE.userWriters().writes(Username.fromUsername("bob")))
             .isEqualTo(new JsString("bob"));
     }
 
     @Test
     void userShouldBeWellDeSerialized() {
         assertThat(DTO_JSON_SERIALIZE.userReads().reads(new JsString("bob")).get())
-            .isEqualTo(User.fromUsername("bob"));
+            .isEqualTo(Username.fromUsername("bob"));
     }
 
     @Test
     void userShouldBeWellSerializedWhenVirtualHosting() {
-        assertThat(DTO_JSON_SERIALIZE.userWriters().writes(User.fromUsername("bob@domain")))
+        assertThat(DTO_JSON_SERIALIZE.userWriters().writes(Username.fromUsername("bob@domain")))
             .isEqualTo(new JsString("bob@domain"));
     }
 
     @Test
     void userShouldBeWellDeSerializedWhenVirtualHosting() {
         assertThat(DTO_JSON_SERIALIZE.userReads().reads(new JsString("bob@domain")).get())
-            .isEqualTo(User.fromUsername("bob@domain"));
+            .isEqualTo(Username.fromUsername("bob@domain"));
     }
 
     @Test
diff --git a/mailbox/plugin/deleted-messages-vault-cassandra/src/main/java/org/apache/james/vault/metadata/CassandraDeletedMessageMetadataVault.java b/mailbox/plugin/deleted-messages-vault-cassandra/src/main/java/org/apache/james/vault/metadata/CassandraDeletedMessageMetadataVault.java
index 819fa6d..28dd0ba 100644
--- a/mailbox/plugin/deleted-messages-vault-cassandra/src/main/java/org/apache/james/vault/metadata/CassandraDeletedMessageMetadataVault.java
+++ b/mailbox/plugin/deleted-messages-vault-cassandra/src/main/java/org/apache/james/vault/metadata/CassandraDeletedMessageMetadataVault.java
@@ -22,7 +22,7 @@ package org.apache.james.vault.metadata;
 import javax.inject.Inject;
 
 import org.apache.james.blob.api.BucketName;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.model.MessageId;
 import org.reactivestreams.Publisher;
 
@@ -41,7 +41,7 @@ public class CassandraDeletedMessageMetadataVault implements DeletedMessageMetad
     @Override
     public Publisher<Void> store(DeletedMessageWithStorageInformation deletedMessage) {
         BucketName bucketName = deletedMessage.getStorageInformation().getBucketName();
-        User owner = deletedMessage.getDeletedMessage().getOwner();
+        Username owner = deletedMessage.getDeletedMessage().getOwner();
         MessageId messageId = deletedMessage.getDeletedMessage().getMessageId();
         return storageInformationDAO.referenceStorageInformation(owner, messageId, deletedMessage.getStorageInformation())
             .then(metadataDAO.store(deletedMessage))
@@ -61,19 +61,19 @@ public class CassandraDeletedMessageMetadataVault implements DeletedMessageMetad
     }
 
     @Override
-    public Publisher<Void> remove(BucketName bucketName, User user, MessageId messageId) {
-        return storageInformationDAO.deleteStorageInformation(user, messageId)
-            .then(metadataDAO.deleteMessage(bucketName, user, messageId));
+    public Publisher<Void> remove(BucketName bucketName, Username username, MessageId messageId) {
+        return storageInformationDAO.deleteStorageInformation(username, messageId)
+            .then(metadataDAO.deleteMessage(bucketName, username, messageId));
     }
 
     @Override
-    public Publisher<StorageInformation> retrieveStorageInformation(User user, MessageId messageId) {
-        return storageInformationDAO.retrieveStorageInformation(user, messageId);
+    public Publisher<StorageInformation> retrieveStorageInformation(Username username, MessageId messageId) {
+        return storageInformationDAO.retrieveStorageInformation(username, messageId);
     }
 
     @Override
-    public Publisher<DeletedMessageWithStorageInformation> listMessages(BucketName bucketName, User user) {
-        return metadataDAO.retrieveMetadata(bucketName, user);
+    public Publisher<DeletedMessageWithStorageInformation> listMessages(BucketName bucketName, Username username) {
+        return metadataDAO.retrieveMetadata(bucketName, username);
     }
 
     @Override
diff --git a/mailbox/plugin/deleted-messages-vault-cassandra/src/main/java/org/apache/james/vault/metadata/DeletedMessageIdentifier.java b/mailbox/plugin/deleted-messages-vault-cassandra/src/main/java/org/apache/james/vault/metadata/DeletedMessageIdentifier.java
index 773ab31..b80f467 100644
--- a/mailbox/plugin/deleted-messages-vault-cassandra/src/main/java/org/apache/james/vault/metadata/DeletedMessageIdentifier.java
+++ b/mailbox/plugin/deleted-messages-vault-cassandra/src/main/java/org/apache/james/vault/metadata/DeletedMessageIdentifier.java
@@ -21,19 +21,19 @@ package org.apache.james.vault.metadata;
 
 import java.util.Objects;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.model.MessageId;
 
 public class DeletedMessageIdentifier {
-    private final User owner;
+    private final Username owner;
     private final MessageId messageId;
 
-    public DeletedMessageIdentifier(User owner, MessageId messageId) {
+    public DeletedMessageIdentifier(Username owner, MessageId messageId) {
         this.owner = owner;
         this.messageId = messageId;
     }
 
-    public User getOwner() {
+    public Username getOwner() {
         return owner;
     }
 
diff --git a/mailbox/plugin/deleted-messages-vault-cassandra/src/main/java/org/apache/james/vault/metadata/MetadataDAO.java b/mailbox/plugin/deleted-messages-vault-cassandra/src/main/java/org/apache/james/vault/metadata/MetadataDAO.java
index c2ec2be..251728c 100644
--- a/mailbox/plugin/deleted-messages-vault-cassandra/src/main/java/org/apache/james/vault/metadata/MetadataDAO.java
+++ b/mailbox/plugin/deleted-messages-vault-cassandra/src/main/java/org/apache/james/vault/metadata/MetadataDAO.java
@@ -34,7 +34,7 @@ import javax.inject.Inject;
 
 import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
 import org.apache.james.blob.api.BucketName;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.model.MessageId;
 
 import com.datastax.driver.core.PreparedStatement;
@@ -103,34 +103,34 @@ public class MetadataDAO {
                 .setString(PAYLOAD, payload)));
     }
 
-    Flux<DeletedMessageWithStorageInformation> retrieveMetadata(BucketName bucketName, User user) {
+    Flux<DeletedMessageWithStorageInformation> retrieveMetadata(BucketName bucketName, Username username) {
         return cassandraAsyncExecutor.executeRows(
             readStatement.bind()
                 .setString(BUCKET_NAME, bucketName.asString())
-                .setString(OWNER, user.asString()))
+                .setString(OWNER, username.asString()))
             .map(row -> row.getString(PAYLOAD))
             .flatMap(metadataSerializer::deserialize);
     }
 
-    Flux<MessageId> retrieveMessageIds(BucketName bucketName, User user) {
+    Flux<MessageId> retrieveMessageIds(BucketName bucketName, Username username) {
         return cassandraAsyncExecutor.executeRows(
             readMessageIdStatement.bind()
                 .setString(BUCKET_NAME, bucketName.asString())
-                .setString(OWNER, user.asString()))
+                .setString(OWNER, username.asString()))
             .map(row -> row.getString(MESSAGE_ID))
             .map(messageIdFactory::fromString);
     }
 
-    Mono<Void> deleteMessage(BucketName bucketName, User user, MessageId messageId) {
+    Mono<Void> deleteMessage(BucketName bucketName, Username username, MessageId messageId) {
         return cassandraAsyncExecutor.executeVoid(removeStatement.bind()
             .setString(BUCKET_NAME, bucketName.asString())
-            .setString(OWNER, user.asString())
+            .setString(OWNER, username.asString())
             .setString(MESSAGE_ID, messageId.serialize()));
     }
 
-    Mono<Void> deleteInBucket(BucketName bucketName, User user) {
+    Mono<Void> deleteInBucket(BucketName bucketName, Username username) {
         return cassandraAsyncExecutor.executeVoid(removeAllStatement.bind()
             .setString(BUCKET_NAME, bucketName.asString())
-            .setString(OWNER, user.asString()));
+            .setString(OWNER, username.asString()));
     }
 }
diff --git a/mailbox/plugin/deleted-messages-vault-cassandra/src/main/java/org/apache/james/vault/metadata/StorageInformationDAO.java b/mailbox/plugin/deleted-messages-vault-cassandra/src/main/java/org/apache/james/vault/metadata/StorageInformationDAO.java
index 380633d..07ae377 100644
--- a/mailbox/plugin/deleted-messages-vault-cassandra/src/main/java/org/apache/james/vault/metadata/StorageInformationDAO.java
+++ b/mailbox/plugin/deleted-messages-vault-cassandra/src/main/java/org/apache/james/vault/metadata/StorageInformationDAO.java
@@ -35,7 +35,7 @@ import javax.inject.Inject;
 import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
 import org.apache.james.blob.api.BlobId;
 import org.apache.james.blob.api.BucketName;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.model.MessageId;
 
 import com.datastax.driver.core.PreparedStatement;
@@ -80,23 +80,23 @@ public class StorageInformationDAO {
             .value(BLOB_ID, bindMarker(BLOB_ID)));
     }
 
-    Mono<Void> referenceStorageInformation(User user, MessageId messageId, StorageInformation storageInformation) {
+    Mono<Void> referenceStorageInformation(Username username, MessageId messageId, StorageInformation storageInformation) {
         return cassandraAsyncExecutor.executeVoid(addStatement.bind()
-            .setString(OWNER, user.asString())
+            .setString(OWNER, username.asString())
             .setString(MESSAGE_ID, messageId.serialize())
             .setString(BUCKET_NAME, storageInformation.getBucketName().asString())
             .setString(BLOB_ID, storageInformation.getBlobId().asString()));
     }
 
-    Mono<Void> deleteStorageInformation(User user, MessageId messageId) {
+    Mono<Void> deleteStorageInformation(Username username, MessageId messageId) {
         return cassandraAsyncExecutor.executeVoid(removeStatement.bind()
-            .setString(OWNER, user.asString())
+            .setString(OWNER, username.asString())
             .setString(MESSAGE_ID, messageId.serialize()));
     }
 
-    Mono<StorageInformation> retrieveStorageInformation(User user, MessageId messageId) {
+    Mono<StorageInformation> retrieveStorageInformation(Username username, MessageId messageId) {
         return cassandraAsyncExecutor.executeSingleRow(readStatement.bind()
-            .setString(OWNER, user.asString())
+            .setString(OWNER, username.asString())
             .setString(MESSAGE_ID, messageId.serialize()))
             .map(row -> StorageInformation.builder()
                     .bucketName(BucketName.of(row.getString(BUCKET_NAME)))
diff --git a/mailbox/plugin/deleted-messages-vault-cassandra/src/main/java/org/apache/james/vault/metadata/UserPerBucketDAO.java b/mailbox/plugin/deleted-messages-vault-cassandra/src/main/java/org/apache/james/vault/metadata/UserPerBucketDAO.java
index 25e8537..1fb65a5 100644
--- a/mailbox/plugin/deleted-messages-vault-cassandra/src/main/java/org/apache/james/vault/metadata/UserPerBucketDAO.java
+++ b/mailbox/plugin/deleted-messages-vault-cassandra/src/main/java/org/apache/james/vault/metadata/UserPerBucketDAO.java
@@ -32,7 +32,7 @@ import javax.inject.Inject;
 
 import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
 import org.apache.james.blob.api.BucketName;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 
 import com.datastax.driver.core.PreparedStatement;
 import com.datastax.driver.core.Session;
@@ -76,11 +76,11 @@ public class UserPerBucketDAO {
         return session.prepare(select(BUCKET_NAME).from(TABLE).perPartitionLimit(1));
     }
 
-    Flux<User> retrieveUsers(BucketName bucketName) {
+    Flux<Username> retrieveUsers(BucketName bucketName) {
         return cassandraAsyncExecutor.executeRows(listStatement.bind()
             .setString(BUCKET_NAME, bucketName.asString()))
             .map(row -> row.getString(USER))
-            .map(User::fromUsername);
+            .map(Username::fromUsername);
     }
 
     Flux<BucketName> retrieveBuckets() {
@@ -89,10 +89,10 @@ public class UserPerBucketDAO {
             .map(BucketName::of);
     }
 
-    Mono<Void> addUser(BucketName bucketName, User user) {
+    Mono<Void> addUser(BucketName bucketName, Username username) {
         return cassandraAsyncExecutor.executeVoid(addStatement.bind()
             .setString(BUCKET_NAME, bucketName.asString())
-            .setString(USER, user.asString()));
+            .setString(USER, username.asString()));
     }
 
     Mono<Void> deleteBucket(BucketName bucketName) {
diff --git a/mailbox/plugin/deleted-messages-vault-cassandra/src/test/java/org/apache/james/vault/metadata/CassandraDeletedMessageMetadataVaultTest.java b/mailbox/plugin/deleted-messages-vault-cassandra/src/test/java/org/apache/james/vault/metadata/CassandraDeletedMessageMetadataVaultTest.java
index bb4cd53..543646a 100644
--- a/mailbox/plugin/deleted-messages-vault-cassandra/src/test/java/org/apache/james/vault/metadata/CassandraDeletedMessageMetadataVaultTest.java
+++ b/mailbox/plugin/deleted-messages-vault-cassandra/src/test/java/org/apache/james/vault/metadata/CassandraDeletedMessageMetadataVaultTest.java
@@ -20,7 +20,7 @@
 package org.apache.james.vault.metadata;
 
 import static org.apache.james.vault.DeletedMessageFixture.MESSAGE_ID;
-import static org.apache.james.vault.DeletedMessageFixture.USER;
+import static org.apache.james.vault.DeletedMessageFixture.USERNAME;
 import static org.apache.james.vault.metadata.DeletedMessageMetadataModule.MODULE;
 import static org.apache.james.vault.metadata.DeletedMessageVaultMetadataFixture.BUCKET_NAME;
 import static org.apache.james.vault.metadata.DeletedMessageVaultMetadataFixture.DELETED_MESSAGE;
@@ -77,7 +77,7 @@ public class CassandraDeletedMessageMetadataVaultTest implements DeletedMessageM
 
     @Test
     void listShouldNotReturnMessagesWhenStorageDAOFailed() {
-        when(storageInformationDAO.referenceStorageInformation(USER, MESSAGE_ID, STORAGE_INFORMATION))
+        when(storageInformationDAO.referenceStorageInformation(USERNAME, MESSAGE_ID, STORAGE_INFORMATION))
             .thenReturn(Mono.error(new RuntimeException()));
 
         try {
@@ -86,7 +86,7 @@ public class CassandraDeletedMessageMetadataVaultTest implements DeletedMessageM
             // ignored
         }
 
-        Stream<DeletedMessageWithStorageInformation> messages = Flux.from(metadataVault().listMessages(BUCKET_NAME, USER)).toStream();
+        Stream<DeletedMessageWithStorageInformation> messages = Flux.from(metadataVault().listMessages(BUCKET_NAME, USERNAME)).toStream();
         assertThat(messages).isEmpty();
     }
 
@@ -101,13 +101,13 @@ public class CassandraDeletedMessageMetadataVaultTest implements DeletedMessageM
             // ignored
         }
 
-        Stream<DeletedMessageWithStorageInformation> messages = Flux.from(metadataVault().listMessages(BUCKET_NAME, USER)).toStream();
+        Stream<DeletedMessageWithStorageInformation> messages = Flux.from(metadataVault().listMessages(BUCKET_NAME, USERNAME)).toStream();
         assertThat(messages).isEmpty();
     }
 
     @Test
     void listShouldReturnMessagesWhenUserPerBucketDAOFailed() {
-        when(userPerBucketDAO.addUser(BUCKET_NAME, USER))
+        when(userPerBucketDAO.addUser(BUCKET_NAME, USERNAME))
             .thenReturn(Mono.error(new RuntimeException()));
 
         try {
@@ -116,13 +116,13 @@ public class CassandraDeletedMessageMetadataVaultTest implements DeletedMessageM
             // ignored
         }
 
-        Stream<DeletedMessageWithStorageInformation> messages = Flux.from(metadataVault().listMessages(BUCKET_NAME, USER)).toStream();
+        Stream<DeletedMessageWithStorageInformation> messages = Flux.from(metadataVault().listMessages(BUCKET_NAME, USERNAME)).toStream();
         assertThat(messages).contains(DELETED_MESSAGE);
     }
 
     @Test
     void retrieveStorageInformationShouldReturnMetadataWhenUserPerBucketDAOStoreFailed() {
-        when(userPerBucketDAO.addUser(BUCKET_NAME, USER))
+        when(userPerBucketDAO.addUser(BUCKET_NAME, USERNAME))
             .thenReturn(Mono.error(new RuntimeException()));
 
         try {
@@ -141,7 +141,7 @@ public class CassandraDeletedMessageMetadataVaultTest implements DeletedMessageM
         "metadata referenced for this user")
     @Test
     void removingBucketShouldCleanUpInvalidStateForList() {
-        when(userPerBucketDAO.addUser(BUCKET_NAME, USER))
+        when(userPerBucketDAO.addUser(BUCKET_NAME, USERNAME))
             .thenReturn(Mono.error(new RuntimeException()));
 
         try {
@@ -152,7 +152,7 @@ public class CassandraDeletedMessageMetadataVaultTest implements DeletedMessageM
 
         Mono.from(testee.removeMetadataRelatedToBucket(BUCKET_NAME)).block();
 
-        Stream<DeletedMessageWithStorageInformation> messages = Flux.from(metadataVault().listMessages(BUCKET_NAME, USER)).toStream();
+        Stream<DeletedMessageWithStorageInformation> messages = Flux.from(metadataVault().listMessages(BUCKET_NAME, USERNAME)).toStream();
         assertThat(messages).isEmpty();
     }
 
@@ -160,7 +160,7 @@ public class CassandraDeletedMessageMetadataVaultTest implements DeletedMessageM
         "metadata referenced for this user")
     @Test
     void removingBucketShouldCleanUpInvalidStateForRetrievingMetadata() {
-        when(userPerBucketDAO.addUser(BUCKET_NAME, USER))
+        when(userPerBucketDAO.addUser(BUCKET_NAME, USERNAME))
             .thenReturn(Mono.error(new RuntimeException()));
 
         try {
@@ -179,7 +179,7 @@ public class CassandraDeletedMessageMetadataVaultTest implements DeletedMessageM
 
     @Test
     void removingBucketShouldBeEventuallyConsistentForList() {
-        when(userPerBucketDAO.addUser(BUCKET_NAME, USER))
+        when(userPerBucketDAO.addUser(BUCKET_NAME, USERNAME))
             .thenReturn(Mono.error(new RuntimeException()));
 
         try {
@@ -192,13 +192,13 @@ public class CassandraDeletedMessageMetadataVaultTest implements DeletedMessageM
 
         Mono.from(testee.removeMetadataRelatedToBucket(BUCKET_NAME)).block();
 
-        Stream<DeletedMessageWithStorageInformation> messages = Flux.from(metadataVault().listMessages(BUCKET_NAME, USER)).toStream();
+        Stream<DeletedMessageWithStorageInformation> messages = Flux.from(metadataVault().listMessages(BUCKET_NAME, USERNAME)).toStream();
         assertThat(messages).isEmpty();
     }
 
     @Test
     void removingBucketShouldBeEventuallyConsistentForMetadata() {
-        when(userPerBucketDAO.addUser(BUCKET_NAME, USER))
+        when(userPerBucketDAO.addUser(BUCKET_NAME, USERNAME))
             .thenReturn(Mono.error(new RuntimeException()));
 
         try {
@@ -219,7 +219,7 @@ public class CassandraDeletedMessageMetadataVaultTest implements DeletedMessageM
 
     @Test
     void directDeletionShouldCleanUpInvalidStateForList() {
-        when(userPerBucketDAO.addUser(BUCKET_NAME, USER))
+        when(userPerBucketDAO.addUser(BUCKET_NAME, USERNAME))
             .thenReturn(Mono.error(new RuntimeException()));
 
         try {
@@ -233,13 +233,13 @@ public class CassandraDeletedMessageMetadataVaultTest implements DeletedMessageM
             DELETED_MESSAGE.getDeletedMessage().getMessageId()))
             .block();
 
-        Stream<DeletedMessageWithStorageInformation> messages = Flux.from(metadataVault().listMessages(BUCKET_NAME, USER)).toStream();
+        Stream<DeletedMessageWithStorageInformation> messages = Flux.from(metadataVault().listMessages(BUCKET_NAME, USERNAME)).toStream();
         assertThat(messages).isEmpty();
     }
 
     @Test
     void directDeletionShouldCleanUpInvalidStateForRetrievingMetadata() {
-        when(userPerBucketDAO.addUser(BUCKET_NAME, USER))
+        when(userPerBucketDAO.addUser(BUCKET_NAME, USERNAME))
             .thenReturn(Mono.error(new RuntimeException()));
 
         try {
@@ -275,7 +275,7 @@ public class CassandraDeletedMessageMetadataVaultTest implements DeletedMessageM
         reset(userPerBucketDAO);
         Mono.from(testee.removeMetadataRelatedToBucket(BUCKET_NAME)).block();
 
-        Stream<DeletedMessageWithStorageInformation> messages = Flux.from(metadataVault().listMessages(BUCKET_NAME, USER)).toStream();
+        Stream<DeletedMessageWithStorageInformation> messages = Flux.from(metadataVault().listMessages(BUCKET_NAME, USERNAME)).toStream();
         assertThat(messages).isEmpty();
     }
 
@@ -283,7 +283,7 @@ public class CassandraDeletedMessageMetadataVaultTest implements DeletedMessageM
     void retentionShouldBeRetriableWhenMetadataDAOFails() {
         Mono.from(testee.store(DELETED_MESSAGE)).block();
 
-        when(metadataDAO.deleteInBucket(BUCKET_NAME, USER))
+        when(metadataDAO.deleteInBucket(BUCKET_NAME, USERNAME))
             .thenReturn(Mono.error(new RuntimeException()));
 
         try {
@@ -295,7 +295,7 @@ public class CassandraDeletedMessageMetadataVaultTest implements DeletedMessageM
         reset(metadataDAO);
         Mono.from(testee.removeMetadataRelatedToBucket(BUCKET_NAME)).block();
 
-        Stream<DeletedMessageWithStorageInformation> messages = Flux.from(metadataVault().listMessages(BUCKET_NAME, USER)).toStream();
+        Stream<DeletedMessageWithStorageInformation> messages = Flux.from(metadataVault().listMessages(BUCKET_NAME, USERNAME)).toStream();
         assertThat(messages).isEmpty();
     }
 
@@ -303,7 +303,7 @@ public class CassandraDeletedMessageMetadataVaultTest implements DeletedMessageM
     void retentionShouldBeRetriableWhenStorageInformationDAOFails() {
         Mono.from(testee.store(DELETED_MESSAGE)).block();
 
-        when(storageInformationDAO.deleteStorageInformation(USER, MESSAGE_ID))
+        when(storageInformationDAO.deleteStorageInformation(USERNAME, MESSAGE_ID))
             .thenReturn(Mono.error(new RuntimeException()));
 
         try {
@@ -315,7 +315,7 @@ public class CassandraDeletedMessageMetadataVaultTest implements DeletedMessageM
         reset(storageInformationDAO);
         Mono.from(testee.removeMetadataRelatedToBucket(BUCKET_NAME)).block();
 
-        Stream<DeletedMessageWithStorageInformation> messages = Flux.from(metadataVault().listMessages(BUCKET_NAME, USER)).toStream();
+        Stream<DeletedMessageWithStorageInformation> messages = Flux.from(metadataVault().listMessages(BUCKET_NAME, USERNAME)).toStream();
         assertThat(messages).isEmpty();
     }
 }
\ No newline at end of file
diff --git a/mailbox/plugin/deleted-messages-vault-cassandra/src/test/java/org/apache/james/vault/metadata/MetadataDAOTest.java b/mailbox/plugin/deleted-messages-vault-cassandra/src/test/java/org/apache/james/vault/metadata/MetadataDAOTest.java
index c333ff6..49e0a5d 100644
--- a/mailbox/plugin/deleted-messages-vault-cassandra/src/test/java/org/apache/james/vault/metadata/MetadataDAOTest.java
+++ b/mailbox/plugin/deleted-messages-vault-cassandra/src/test/java/org/apache/james/vault/metadata/MetadataDAOTest.java
@@ -20,7 +20,7 @@
 package org.apache.james.vault.metadata;
 
 import static org.apache.james.vault.DeletedMessageFixture.MESSAGE_ID;
-import static org.apache.james.vault.DeletedMessageFixture.USER;
+import static org.apache.james.vault.DeletedMessageFixture.USERNAME;
 import static org.apache.james.vault.metadata.DeletedMessageMetadataModule.MODULE;
 import static org.apache.james.vault.metadata.DeletedMessageVaultMetadataFixture.BUCKET_NAME;
 import static org.apache.james.vault.metadata.DeletedMessageVaultMetadataFixture.DELETED_MESSAGE;
@@ -57,7 +57,7 @@ class MetadataDAOTest {
 
     @Test
     void retrieveMessageIdsShouldReturnEmptyWhenNone() {
-        Stream<MessageId> messageIds = testee.retrieveMessageIds(BUCKET_NAME, USER).toStream();
+        Stream<MessageId> messageIds = testee.retrieveMessageIds(BUCKET_NAME, USERNAME).toStream();
         assertThat(messageIds).isEmpty();
     }
 
@@ -65,7 +65,7 @@ class MetadataDAOTest {
     void retrieveMessageIdsShouldReturnStoredMessageId() {
         testee.store(DELETED_MESSAGE).block();
 
-        Stream<MessageId> messageIds = testee.retrieveMessageIds(BUCKET_NAME, USER).toStream();
+        Stream<MessageId> messageIds = testee.retrieveMessageIds(BUCKET_NAME, USERNAME).toStream();
         assertThat(messageIds).containsExactly(DELETED_MESSAGE.getDeletedMessage().getMessageId());
     }
 
@@ -73,9 +73,9 @@ class MetadataDAOTest {
     void retrieveMessageIdsShouldNotReturnDeletedMessages() {
         testee.store(DELETED_MESSAGE).block();
 
-        testee.deleteInBucket(BUCKET_NAME, USER).block();
+        testee.deleteInBucket(BUCKET_NAME, USERNAME).block();
 
-        Stream<MessageId> messageIds = testee.retrieveMessageIds(BUCKET_NAME, USER).toStream();
+        Stream<MessageId> messageIds = testee.retrieveMessageIds(BUCKET_NAME, USERNAME).toStream();
         assertThat(messageIds).isEmpty();
     }
 
@@ -84,9 +84,9 @@ class MetadataDAOTest {
         testee.store(DELETED_MESSAGE).block();
         testee.store(DELETED_MESSAGE_2).block();
 
-        testee.deleteInBucket(BUCKET_NAME, USER).block();
+        testee.deleteInBucket(BUCKET_NAME, USERNAME).block();
 
-        Stream<MessageId> messageIds = testee.retrieveMessageIds(BUCKET_NAME, USER).toStream();
+        Stream<MessageId> messageIds = testee.retrieveMessageIds(BUCKET_NAME, USERNAME).toStream();
         assertThat(messageIds).isEmpty();
     }
 
@@ -95,7 +95,7 @@ class MetadataDAOTest {
         testee.store(DELETED_MESSAGE).block();
         testee.store(DELETED_MESSAGE_2).block();
 
-        Stream<MessageId> messageIds = testee.retrieveMessageIds(BUCKET_NAME, USER).toStream();
+        Stream<MessageId> messageIds = testee.retrieveMessageIds(BUCKET_NAME, USERNAME).toStream();
         assertThat(messageIds).containsExactlyInAnyOrder(
             DELETED_MESSAGE.getDeletedMessage().getMessageId(),
             DELETED_MESSAGE_2.getDeletedMessage().getMessageId());
@@ -103,7 +103,7 @@ class MetadataDAOTest {
 
     @Test
     void retrieveMetadataShouldReturnEmptyWhenNone() {
-        Stream<DeletedMessageWithStorageInformation> messageIds = testee.retrieveMetadata(BUCKET_NAME, USER).toStream();
+        Stream<DeletedMessageWithStorageInformation> messageIds = testee.retrieveMetadata(BUCKET_NAME, USERNAME).toStream();
         assertThat(messageIds).isEmpty();
     }
 
@@ -111,7 +111,7 @@ class MetadataDAOTest {
     void retrieveMetadataShouldReturnStoredMetadata() {
         testee.store(DELETED_MESSAGE).block();
 
-        Stream<DeletedMessageWithStorageInformation> messageIds = testee.retrieveMetadata(BUCKET_NAME, USER).toStream();
+        Stream<DeletedMessageWithStorageInformation> messageIds = testee.retrieveMetadata(BUCKET_NAME, USERNAME).toStream();
         assertThat(messageIds).containsExactly(DELETED_MESSAGE);
     }
 
@@ -119,9 +119,9 @@ class MetadataDAOTest {
     void retrieveMetadataShouldNotReturnDeletedMessages() {
         testee.store(DELETED_MESSAGE).block();
 
-        testee.deleteInBucket(BUCKET_NAME, USER).block();
+        testee.deleteInBucket(BUCKET_NAME, USERNAME).block();
 
-        Stream<DeletedMessageWithStorageInformation> messageIds = testee.retrieveMetadata(BUCKET_NAME, USER).toStream();
+        Stream<DeletedMessageWithStorageInformation> messageIds = testee.retrieveMetadata(BUCKET_NAME, USERNAME).toStream();
         assertThat(messageIds).isEmpty();
     }
 
@@ -130,7 +130,7 @@ class MetadataDAOTest {
         testee.store(DELETED_MESSAGE).block();
         testee.store(DELETED_MESSAGE_2).block();
 
-        Stream<DeletedMessageWithStorageInformation> messageIds = testee.retrieveMetadata(BUCKET_NAME, USER).toStream();
+        Stream<DeletedMessageWithStorageInformation> messageIds = testee.retrieveMetadata(BUCKET_NAME, USERNAME).toStream();
         assertThat(messageIds).containsExactlyInAnyOrder(DELETED_MESSAGE, DELETED_MESSAGE_2);
     }
 
@@ -139,9 +139,9 @@ class MetadataDAOTest {
         testee.store(DELETED_MESSAGE).block();
         testee.store(DELETED_MESSAGE_2).block();
 
-        testee.deleteMessage(BUCKET_NAME, USER, MESSAGE_ID).block();
+        testee.deleteMessage(BUCKET_NAME, USERNAME, MESSAGE_ID).block();
 
-        Stream<DeletedMessageWithStorageInformation> messageIds = testee.retrieveMetadata(BUCKET_NAME, USER).toStream();
+        Stream<DeletedMessageWithStorageInformation> messageIds = testee.retrieveMetadata(BUCKET_NAME, USERNAME).toStream();
         assertThat(messageIds).containsExactlyInAnyOrder(DELETED_MESSAGE_2);
     }
 
@@ -149,9 +149,9 @@ class MetadataDAOTest {
     void retrieveMetadataShouldNotReturnDeletedMetadata() {
         testee.store(DELETED_MESSAGE).block();
 
-        testee.deleteMessage(BUCKET_NAME, USER, MESSAGE_ID).block();
+        testee.deleteMessage(BUCKET_NAME, USERNAME, MESSAGE_ID).block();
 
-        Stream<DeletedMessageWithStorageInformation> messageIds = testee.retrieveMetadata(BUCKET_NAME, USER).toStream();
+        Stream<DeletedMessageWithStorageInformation> messageIds = testee.retrieveMetadata(BUCKET_NAME, USERNAME).toStream();
         assertThat(messageIds).isEmpty();
     }
 }
\ No newline at end of file
diff --git a/mailbox/plugin/deleted-messages-vault-cassandra/src/test/java/org/apache/james/vault/metadata/StorageInformationDAOTest.java b/mailbox/plugin/deleted-messages-vault-cassandra/src/test/java/org/apache/james/vault/metadata/StorageInformationDAOTest.java
index 3a80502..86a1bf2 100644
--- a/mailbox/plugin/deleted-messages-vault-cassandra/src/test/java/org/apache/james/vault/metadata/StorageInformationDAOTest.java
+++ b/mailbox/plugin/deleted-messages-vault-cassandra/src/test/java/org/apache/james/vault/metadata/StorageInformationDAOTest.java
@@ -30,7 +30,7 @@ import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.blob.api.BlobId;
 import org.apache.james.blob.api.BucketName;
 import org.apache.james.blob.api.HashBlobId;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.model.TestMessageId;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -40,7 +40,7 @@ class StorageInformationDAOTest {
     private static final BucketName BUCKET_NAME = BucketName.of("deletedMessages-2019-06-01");
     private static final BucketName BUCKET_NAME_2 = BucketName.of("deletedMessages-2019-07-01");
     private static final HashBlobId.Factory BLOB_ID_FACTORY = new HashBlobId.Factory();
-    private static final User OWNER = User.fromUsername("owner");
+    private static final Username OWNER = Username.fromUsername("owner");
     private static final TestMessageId MESSAGE_ID = TestMessageId.of(36);
     private static final BlobId BLOB_ID = new HashBlobId.Factory().from("05dcb33b-8382-4744-923a-bc593ad84d23");
     private static final BlobId BLOB_ID_2 = new HashBlobId.Factory().from("05dcb33b-8382-4744-923a-bc593ad84d24");
diff --git a/mailbox/plugin/deleted-messages-vault-cassandra/src/test/java/org/apache/james/vault/metadata/UserPerBucketDAOTest.java b/mailbox/plugin/deleted-messages-vault-cassandra/src/test/java/org/apache/james/vault/metadata/UserPerBucketDAOTest.java
index aedeeb9..f04c219 100644
--- a/mailbox/plugin/deleted-messages-vault-cassandra/src/test/java/org/apache/james/vault/metadata/UserPerBucketDAOTest.java
+++ b/mailbox/plugin/deleted-messages-vault-cassandra/src/test/java/org/apache/james/vault/metadata/UserPerBucketDAOTest.java
@@ -26,7 +26,8 @@ import static org.assertj.core.api.Assertions.assertThatCode;
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.blob.api.BucketName;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
+
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
@@ -34,8 +35,8 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 class UserPerBucketDAOTest {
     private static final BucketName BUCKET_NAME = BucketName.of("deletedMessages-2019-06-01");
     private static final BucketName BUCKET_NAME_2 = BucketName.of("deletedMessages-2019-07-01");
-    private static final User OWNER = User.fromUsername("owner");
-    private static final User OWNER_2 = User.fromUsername("owner2");
+    private static final Username OWNER = Username.fromUsername("owner");
+    private static final Username OWNER_2 = Username.fromUsername("owner2");
 
     @RegisterExtension
     static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(MODULE);
diff --git a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessage.java b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessage.java
index 0f549cc..a884537 100644
--- a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessage.java
+++ b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessage.java
@@ -27,7 +27,7 @@ import java.util.Optional;
 
 import org.apache.james.core.MailAddress;
 import org.apache.james.core.MaybeSender;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.vault.DeletedMessage.Builder.FinalStage;
@@ -46,7 +46,7 @@ public class DeletedMessage {
 
         @FunctionalInterface
         public interface RequireUser<T> {
-            T user(User user);
+            T user(Username username);
         }
 
         @FunctionalInterface
@@ -113,7 +113,7 @@ public class DeletedMessage {
         public static class FinalStage {
             private final MessageId messageId;
             private final List<MailboxId> originMailboxes;
-            private final User owner;
+            private final Username owner;
             private final ZonedDateTime deliveryDate;
             private final ZonedDateTime deletionDate;
             private final MaybeSender sender;
@@ -122,7 +122,7 @@ public class DeletedMessage {
             private final long size;
             private Optional<String> subject;
 
-            FinalStage(MessageId messageId, List<MailboxId> originMailboxes, User owner, ZonedDateTime deliveryDate,
+            FinalStage(MessageId messageId, List<MailboxId> originMailboxes, Username owner, ZonedDateTime deliveryDate,
                        ZonedDateTime deletionDate, MaybeSender sender, List<MailAddress> recipients, boolean hasAttachment, long size) {
                 this.messageId = messageId;
                 this.originMailboxes = originMailboxes;
@@ -160,7 +160,7 @@ public class DeletedMessage {
 
     private final MessageId messageId;
     private final List<MailboxId> originMailboxes;
-    private final User owner;
+    private final Username owner;
     private final ZonedDateTime deliveryDate;
     private final ZonedDateTime deletionDate;
     private final MaybeSender sender;
@@ -169,7 +169,7 @@ public class DeletedMessage {
     private final boolean hasAttachment;
     private final long size;
 
-    public DeletedMessage(MessageId messageId, List<MailboxId> originMailboxes, User owner,
+    public DeletedMessage(MessageId messageId, List<MailboxId> originMailboxes, Username owner,
                           ZonedDateTime deliveryDate, ZonedDateTime deletionDate, MaybeSender sender, List<MailAddress> recipients,
                           Optional<String> subject, boolean hasAttachment, long size) {
         Preconditions.checkArgument(size > 0, "'size' is required to be a strictly positive number");
@@ -194,7 +194,7 @@ public class DeletedMessage {
         return originMailboxes;
     }
 
-    public User getOwner() {
+    public Username getOwner() {
         return owner;
     }
 
diff --git a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageContentNotFoundException.java b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageContentNotFoundException.java
index f8d5cd7..f687212 100644
--- a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageContentNotFoundException.java
+++ b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageContentNotFoundException.java
@@ -19,13 +19,13 @@
 
 package org.apache.james.vault;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.model.MessageId;
 
 public class DeletedMessageContentNotFoundException extends RuntimeException {
 
-    public DeletedMessageContentNotFoundException(User user, MessageId messageId) {
-        this("cannot find mime message associated with id " + messageId.serialize() + " and user " + user.asString());
+    public DeletedMessageContentNotFoundException(Username username, MessageId messageId) {
+        this("cannot find mime message associated with id " + messageId.serialize() + " and user " + username.asString());
     }
 
     public DeletedMessageContentNotFoundException(String message) {
diff --git a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageConverter.java b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageConverter.java
index af03284..d12c61c 100644
--- a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageConverter.java
+++ b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageConverter.java
@@ -28,7 +28,7 @@ import java.util.Set;
 
 import org.apache.james.core.MailAddress;
 import org.apache.james.core.MaybeSender;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mime4j.MimeIOException;
 import org.apache.james.mime4j.codec.DecodeMonitor;
 import org.apache.james.mime4j.dom.Message;
@@ -78,7 +78,7 @@ class DeletedMessageConverter {
         }
     }
 
-    private User retrieveOwner(DeletedMessageVaultHook.DeletedMessageMailboxContext deletedMessageMailboxContext) {
+    private Username retrieveOwner(DeletedMessageVaultHook.DeletedMessageMailboxContext deletedMessageMailboxContext) {
         Preconditions.checkNotNull(deletedMessageMailboxContext.getOwner(), "Deleted mail is missing owner");
         return deletedMessageMailboxContext.getOwner();
     }
diff --git a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageVault.java b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageVault.java
index 26e6a45..ec5a6ee 100644
--- a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageVault.java
+++ b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageVault.java
@@ -21,7 +21,7 @@ package org.apache.james.vault;
 
 import java.io.InputStream;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.task.Task;
 import org.apache.james.vault.search.Query;
@@ -30,11 +30,11 @@ import org.reactivestreams.Publisher;
 public interface DeletedMessageVault {
     Publisher<Void> append(DeletedMessage deletedMessage, InputStream mimeMessage);
 
-    Publisher<InputStream> loadMimeMessage(User user, MessageId messageId);
+    Publisher<InputStream> loadMimeMessage(Username username, MessageId messageId);
 
-    Publisher<Void> delete(User user, MessageId messageId);
+    Publisher<Void> delete(Username username, MessageId messageId);
 
-    Publisher<DeletedMessage> search(User user, Query query);
+    Publisher<DeletedMessage> search(Username username, Query query);
 
     Task deleteExpiredMessagesTask();
 }
diff --git a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageVaultHook.java b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageVaultHook.java
index 162e4ad..37eec5d 100644
--- a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageVaultHook.java
+++ b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageVaultHook.java
@@ -29,7 +29,7 @@ import java.util.Optional;
 import javax.inject.Inject;
 
 import org.apache.commons.lang3.tuple.Pair;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MetadataWithMailboxId;
 import org.apache.james.mailbox.exception.MailboxException;
@@ -66,10 +66,10 @@ public class DeletedMessageVaultHook implements PreDeletionHook {
         }
 
         private final MessageId messageId;
-        private final User owner;
+        private final Username owner;
         private final List<MailboxId> ownerMailboxes;
 
-        DeletedMessageMailboxContext(MessageId messageId, User owner, List<MailboxId> ownerMailboxes) {
+        DeletedMessageMailboxContext(MessageId messageId, Username owner, List<MailboxId> ownerMailboxes) {
             this.messageId = messageId;
             this.owner = owner;
             this.ownerMailboxes = ownerMailboxes;
@@ -79,7 +79,7 @@ public class DeletedMessageVaultHook implements PreDeletionHook {
             return messageId;
         }
 
-        User getOwner() {
+        Username getOwner() {
             return owner;
         }
 
@@ -155,16 +155,16 @@ public class DeletedMessageVaultHook implements PreDeletionHook {
     }
 
     private Publisher<DeletedMessageMailboxContext> addOwnerToMetadata(GroupedFlux<MailboxId, MetadataWithMailboxId> groupedFlux) throws MailboxException {
-        User owner = retrieveMailboxUser(groupedFlux.key());
+        Username owner = retrieveMailboxUser(groupedFlux.key());
         return groupedFlux.map(metadata -> new DeletedMessageMailboxContext(metadata.getMessageMetaData().getMessageId(), owner, ImmutableList.of(metadata.getMailboxId())));
     }
 
-    private Pair<MessageId, User> toMessageIdUserPair(DeletedMessageMailboxContext deletedMessageMetadata) {
+    private Pair<MessageId, Username> toMessageIdUserPair(DeletedMessageMailboxContext deletedMessageMetadata) {
         return Pair.of(deletedMessageMetadata.getMessageId(), deletedMessageMetadata.getOwner());
     }
 
-    private User retrieveMailboxUser(MailboxId mailboxId) throws MailboxException {
-        return User.fromUsername(mapperFactory.getMailboxMapper(session)
+    private Username retrieveMailboxUser(MailboxId mailboxId) throws MailboxException {
+        return Username.fromUsername(mapperFactory.getMailboxMapper(session)
             .findMailboxById(mailboxId)
             .getUser());
     }
diff --git a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/blob/BlobStoreDeletedMessageVault.java b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/blob/BlobStoreDeletedMessageVault.java
index 766bea6..71115f8 100644
--- a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/blob/BlobStoreDeletedMessageVault.java
+++ b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/blob/BlobStoreDeletedMessageVault.java
@@ -29,7 +29,7 @@ import javax.inject.Inject;
 import org.apache.james.blob.api.BlobStore;
 import org.apache.james.blob.api.BucketName;
 import org.apache.james.blob.api.ObjectNotFoundException;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.metrics.api.MetricFactory;
 import org.apache.james.task.Task;
@@ -105,53 +105,53 @@ public class BlobStoreDeletedMessageVault implements DeletedMessageVault {
     }
 
     @Override
-    public Publisher<InputStream> loadMimeMessage(User user, MessageId messageId) {
-        Preconditions.checkNotNull(user);
+    public Publisher<InputStream> loadMimeMessage(Username username, MessageId messageId) {
+        Preconditions.checkNotNull(username);
         Preconditions.checkNotNull(messageId);
 
         return metricFactory.runPublishingTimerMetric(
             LOAD_MIME_MESSAGE_METRIC_NAME,
-            Mono.from(messageMetadataVault.retrieveStorageInformation(user, messageId))
-                .flatMap(storageInformation -> loadMimeMessage(storageInformation, user, messageId)));
+            Mono.from(messageMetadataVault.retrieveStorageInformation(username, messageId))
+                .flatMap(storageInformation -> loadMimeMessage(storageInformation, username, messageId)));
     }
 
-    private Mono<InputStream> loadMimeMessage(StorageInformation storageInformation, User user, MessageId messageId) {
+    private Mono<InputStream> loadMimeMessage(StorageInformation storageInformation, Username username, MessageId messageId) {
         return Mono.fromSupplier(() -> blobStore.read(storageInformation.getBucketName(), storageInformation.getBlobId()))
             .onErrorResume(
                 ObjectNotFoundException.class,
-                ex -> Mono.error(new DeletedMessageContentNotFoundException(user, messageId)));
+                ex -> Mono.error(new DeletedMessageContentNotFoundException(username, messageId)));
     }
 
     @Override
-    public Publisher<DeletedMessage> search(User user, Query query) {
-        Preconditions.checkNotNull(user);
+    public Publisher<DeletedMessage> search(Username username, Query query) {
+        Preconditions.checkNotNull(username);
         Preconditions.checkNotNull(query);
 
         return metricFactory.runPublishingTimerMetric(
             SEARCH_METRIC_NAME,
-            searchOn(user, query));
+            searchOn(username, query));
     }
 
-    private Flux<DeletedMessage> searchOn(User user, Query query) {
+    private Flux<DeletedMessage> searchOn(Username username, Query query) {
         return Flux.from(messageMetadataVault.listRelatedBuckets())
-            .concatMap(bucketName -> Flux.from(messageMetadataVault.listMessages(bucketName, user)))
+            .concatMap(bucketName -> Flux.from(messageMetadataVault.listMessages(bucketName, username)))
             .map(DeletedMessageWithStorageInformation::getDeletedMessage)
             .filter(query.toPredicate());
     }
 
     @Override
-    public Publisher<Void> delete(User user, MessageId messageId) {
-        Preconditions.checkNotNull(user);
+    public Publisher<Void> delete(Username username, MessageId messageId) {
+        Preconditions.checkNotNull(username);
         Preconditions.checkNotNull(messageId);
 
         return metricFactory.runPublishingTimerMetric(
             DELETE_METRIC_NAME,
-            deleteMessage(user, messageId));
+            deleteMessage(username, messageId));
     }
 
-    private Mono<Void> deleteMessage(User user, MessageId messageId) {
-        return Mono.from(messageMetadataVault.retrieveStorageInformation(user, messageId))
-            .flatMap(storageInformation -> Mono.from(messageMetadataVault.remove(storageInformation.getBucketName(), user, messageId))
+    private Mono<Void> deleteMessage(Username username, MessageId messageId) {
+        return Mono.from(messageMetadataVault.retrieveStorageInformation(username, messageId))
+            .flatMap(storageInformation -> Mono.from(messageMetadataVault.remove(storageInformation.getBucketName(), username, messageId))
                 .thenReturn(storageInformation))
             .flatMap(storageInformation -> blobStore.delete(storageInformation.getBucketName(), storageInformation.getBlobId()))
             .subscribeOn(Schedulers.boundedElastic());
diff --git a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/dto/DeletedMessageWithStorageInformationConverter.java b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/dto/DeletedMessageWithStorageInformationConverter.java
index 2d22960..d21e7e5 100644
--- a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/dto/DeletedMessageWithStorageInformationConverter.java
+++ b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/dto/DeletedMessageWithStorageInformationConverter.java
@@ -29,7 +29,7 @@ import org.apache.james.blob.api.BlobId;
 import org.apache.james.blob.api.BucketName;
 import org.apache.james.core.MailAddress;
 import org.apache.james.core.MaybeSender;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.vault.DeletedMessage;
@@ -64,7 +64,7 @@ public class DeletedMessageWithStorageInformationConverter {
         return DeletedMessage.builder()
             .messageId(messageIdFactory.fromString(deletedMessageDTO.getMessageId()))
             .originMailboxes(deserializeOriginMailboxes(deletedMessageDTO.getOriginMailboxes()))
-            .user(User.fromUsername(deletedMessageDTO.getOwner()))
+            .user(Username.fromUsername(deletedMessageDTO.getOwner()))
             .deliveryDate(ZonedDateTime.parse(deletedMessageDTO.getDeliveryDate()))
             .deletionDate(ZonedDateTime.parse(deletedMessageDTO.getDeletionDate()))
             .sender(MaybeSender.getMailSender(deletedMessageDTO.getSender()))
diff --git a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/memory/metadata/MemoryDeletedMessageMetadataVault.java b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/memory/metadata/MemoryDeletedMessageMetadataVault.java
index 59ede6d..da1930b 100644
--- a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/memory/metadata/MemoryDeletedMessageMetadataVault.java
+++ b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/memory/metadata/MemoryDeletedMessageMetadataVault.java
@@ -24,7 +24,7 @@ import java.util.Map;
 import java.util.Optional;
 
 import org.apache.james.blob.api.BucketName;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.vault.metadata.DeletedMessageMetadataVault;
 import org.apache.james.vault.metadata.DeletedMessageWithStorageInformation;
@@ -40,7 +40,7 @@ import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
 
 public class MemoryDeletedMessageMetadataVault implements DeletedMessageMetadataVault {
-    private final Table<BucketName, User, Map<MessageId, DeletedMessageWithStorageInformation>> table;
+    private final Table<BucketName, Username, Map<MessageId, DeletedMessageWithStorageInformation>> table;
 
     public MemoryDeletedMessageMetadataVault() {
         table = HashBasedTable.create();
@@ -49,7 +49,7 @@ public class MemoryDeletedMessageMetadataVault implements DeletedMessageMetadata
     @Override
     public Publisher<Void> store(DeletedMessageWithStorageInformation deletedMessage) {
         BucketName bucketName = deletedMessage.getStorageInformation().getBucketName();
-        User owner = deletedMessage.getDeletedMessage().getOwner();
+        Username owner = deletedMessage.getDeletedMessage().getOwner();
         MessageId messageId = deletedMessage.getDeletedMessage().getMessageId();
 
         return Mono.fromRunnable(() -> {
@@ -71,20 +71,20 @@ public class MemoryDeletedMessageMetadataVault implements DeletedMessageMetadata
     }
 
     @Override
-    public Publisher<Void> remove(BucketName bucketName, User user, MessageId messageId) {
+    public Publisher<Void> remove(BucketName bucketName, Username username, MessageId messageId) {
         return Mono.fromRunnable(() -> {
             synchronized (table) {
-                userVault(bucketName, user).remove(messageId);
+                userVault(bucketName, username).remove(messageId);
             }
         });
     }
 
     @Override
-    public Publisher<StorageInformation> retrieveStorageInformation(User user, MessageId messageId) {
+    public Publisher<StorageInformation> retrieveStorageInformation(Username username, MessageId messageId) {
         return Flux.from(listRelatedBuckets())
             .concatMap(bucket -> {
                 synchronized (table) {
-                    return Mono.justOrEmpty(userVault(bucket, user).get(messageId));
+                    return Mono.justOrEmpty(userVault(bucket, username).get(messageId));
                 }
             })
             .map(DeletedMessageWithStorageInformation::getStorageInformation)
@@ -92,9 +92,9 @@ public class MemoryDeletedMessageMetadataVault implements DeletedMessageMetadata
     }
 
     @Override
-    public Publisher<DeletedMessageWithStorageInformation> listMessages(BucketName bucketName, User user) {
+    public Publisher<DeletedMessageWithStorageInformation> listMessages(BucketName bucketName, Username username) {
         synchronized (table) {
-            return Flux.fromIterable(Optional.ofNullable(table.get(bucketName, user))
+            return Flux.fromIterable(Optional.ofNullable(table.get(bucketName, username))
                 .map(Map::values)
                 .map(ImmutableList::copyOf)
                 .orElse(ImmutableList.of()));
@@ -108,7 +108,7 @@ public class MemoryDeletedMessageMetadataVault implements DeletedMessageMetadata
         }
     }
 
-    private Map<MessageId, DeletedMessageWithStorageInformation> userVault(BucketName bucketName, User owner) {
+    private Map<MessageId, DeletedMessageWithStorageInformation> userVault(BucketName bucketName, Username owner) {
         return Optional.ofNullable(table.get(bucketName, owner))
             .orElse(new HashMap<>());
     }
diff --git a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/metadata/DeletedMessageMetadataVault.java b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/metadata/DeletedMessageMetadataVault.java
index 3aab7aa..fae0eb0 100644
--- a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/metadata/DeletedMessageMetadataVault.java
+++ b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/metadata/DeletedMessageMetadataVault.java
@@ -20,7 +20,7 @@
 package org.apache.james.vault.metadata;
 
 import org.apache.james.blob.api.BucketName;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.model.MessageId;
 import org.reactivestreams.Publisher;
 
@@ -29,11 +29,11 @@ public interface DeletedMessageMetadataVault {
 
     Publisher<Void> removeMetadataRelatedToBucket(BucketName bucketName);
 
-    Publisher<Void> remove(BucketName bucketName, User user, MessageId messageId);
+    Publisher<Void> remove(BucketName bucketName, Username username, MessageId messageId);
 
-    Publisher<StorageInformation> retrieveStorageInformation(User user, MessageId messageId);
+    Publisher<StorageInformation> retrieveStorageInformation(Username username, MessageId messageId);
 
-    Publisher<DeletedMessageWithStorageInformation> listMessages(BucketName bucketName, User user);
+    Publisher<DeletedMessageWithStorageInformation> listMessages(BucketName bucketName, Username username);
 
     Publisher<BucketName> listRelatedBuckets();
 }
diff --git a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageConverterTest.java b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageConverterTest.java
index ee1c501..a3af37b 100644
--- a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageConverterTest.java
+++ b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageConverterTest.java
@@ -28,7 +28,7 @@ import static org.apache.james.vault.DeletedMessageFixture.MAILBOX_ID_1;
 import static org.apache.james.vault.DeletedMessageFixture.MAILBOX_ID_2;
 import static org.apache.james.vault.DeletedMessageFixture.MESSAGE_ID;
 import static org.apache.james.vault.DeletedMessageFixture.SUBJECT;
-import static org.apache.james.vault.DeletedMessageFixture.USER;
+import static org.apache.james.vault.DeletedMessageFixture.USERNAME;
 import static org.apache.mailet.base.MailAddressFixture.RECIPIENT1;
 import static org.apache.mailet.base.MailAddressFixture.RECIPIENT2;
 import static org.apache.mailet.base.MailAddressFixture.SENDER;
@@ -41,7 +41,7 @@ import java.util.Date;
 import java.util.List;
 
 import org.apache.james.core.MaybeSender;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.model.Attachment;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageAttachment;
@@ -65,10 +65,10 @@ class DeletedMessageConverterTest {
     private static final List<MailboxId> ORIGIN_MAILBOXES = ImmutableList.of(MAILBOX_ID_1, MAILBOX_ID_2);
     private static final DeletedMessageVaultHook.DeletedMessageMailboxContext DELETED_MESSAGE_MAILBOX_CONTEXT = new DeletedMessageVaultHook.DeletedMessageMailboxContext(
         DeletedMessageFixture.MESSAGE_ID,
-        USER,
+        USERNAME,
         ORIGIN_MAILBOXES);
 
-    private static final User EMPTY_OWNER = null;
+    private static final Username EMPTY_OWNER = null;
 
     private static final Collection<MessageAttachment> NO_ATTACHMENT = ImmutableList.of();
     private static final Collection<MessageAttachment> ATTACHMENTS = ImmutableList.of(MessageAttachment.builder()
diff --git a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageFixture.java b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageFixture.java
index a48bc08..a42d266 100644
--- a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageFixture.java
+++ b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageFixture.java
@@ -30,7 +30,7 @@ import java.util.function.Function;
 import java.util.function.Supplier;
 
 import org.apache.james.core.MaybeSender;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.inmemory.InMemoryId;
 import org.apache.james.mailbox.inmemory.InMemoryMessageId;
 
@@ -41,8 +41,8 @@ public interface DeletedMessageFixture {
     InMemoryId MAILBOX_ID_1 = InMemoryId.of(43);
     InMemoryId MAILBOX_ID_2 = InMemoryId.of(44);
     InMemoryId MAILBOX_ID_3 = InMemoryId.of(45);
-    User USER = User.fromUsername("bob@apache.org");
-    User USER_2 = User.fromUsername("dimitri@apache.org");
+    Username USERNAME = Username.fromUsername("bob@apache.org");
+    Username USERNAME_2 = Username.fromUsername("dimitri@apache.org");
     ZonedDateTime DELIVERY_DATE = ZonedDateTime.parse("2014-10-30T14:12:00Z");
     ZonedDateTime DELETION_DATE = ZonedDateTime.parse("2015-10-30T14:12:00Z");
     ZonedDateTime NOW = ZonedDateTime.parse("2015-10-30T16:12:00Z");
@@ -55,7 +55,7 @@ public interface DeletedMessageFixture {
     Function<Long, DeletedMessage> DELETED_MESSAGE_GENERATOR = i -> DeletedMessage.builder()
         .messageId(InMemoryMessageId.of(i))
         .originMailboxes(MAILBOX_ID_1, MAILBOX_ID_2)
-        .user(USER)
+        .user(USERNAME)
         .deliveryDate(DELIVERY_DATE)
         .deletionDate(DELETION_DATE)
         .sender(MaybeSender.of(SENDER))
@@ -66,7 +66,7 @@ public interface DeletedMessageFixture {
     DeletedMessage.Builder.RequireSize<DeletedMessage.Builder.FinalStage> SIZE_STAGE = DeletedMessage.builder()
         .messageId(MESSAGE_ID)
         .originMailboxes(MAILBOX_ID_1, MAILBOX_ID_2)
-        .user(USER)
+        .user(USERNAME)
         .deliveryDate(DELIVERY_DATE)
         .deletionDate(DELETION_DATE)
         .sender(MaybeSender.of(SENDER))
@@ -81,7 +81,7 @@ public interface DeletedMessageFixture {
     DeletedMessage OLD_DELETED_MESSAGE = DeletedMessage.builder()
         .messageId(OLD_MESSAGE_ID)
         .originMailboxes(MAILBOX_ID_1, MAILBOX_ID_2)
-        .user(USER)
+        .user(USERNAME)
         .deliveryDate(OLD_DELIVERY_DATE)
         .deletionDate(OLD_DELETION_DATE)
         .sender(MaybeSender.of(SENDER))
@@ -94,7 +94,7 @@ public interface DeletedMessageFixture {
     DeletedMessage DELETED_MESSAGE_OTHER_USER = DeletedMessage.builder()
         .messageId(InMemoryMessageId.of(48))
         .originMailboxes(MAILBOX_ID_1, MAILBOX_ID_2)
-        .user(USER_2)
+        .user(USERNAME_2)
         .deliveryDate(DELIVERY_DATE)
         .deletionDate(DELETION_DATE)
         .sender(MaybeSender.of(SENDER))
diff --git a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageTest.java b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageTest.java
index 57880e4..60e872f 100644
--- a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageTest.java
+++ b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageTest.java
@@ -29,7 +29,7 @@ import static org.apache.james.vault.DeletedMessageFixture.MAILBOX_ID_2;
 import static org.apache.james.vault.DeletedMessageFixture.MESSAGE_ID;
 import static org.apache.james.vault.DeletedMessageFixture.SIZE_STAGE;
 import static org.apache.james.vault.DeletedMessageFixture.SUBJECT;
-import static org.apache.james.vault.DeletedMessageFixture.USER;
+import static org.apache.james.vault.DeletedMessageFixture.USERNAME;
 import static org.apache.mailet.base.MailAddressFixture.RECIPIENT1;
 import static org.apache.mailet.base.MailAddressFixture.RECIPIENT2;
 import static org.apache.mailet.base.MailAddressFixture.SENDER;
@@ -55,7 +55,7 @@ class DeletedMessageTest {
             soft -> {
                 soft.assertThat(DELETED_MESSAGE.getMessageId()).isEqualTo(MESSAGE_ID);
                 soft.assertThat(DELETED_MESSAGE.getOriginMailboxes()).containsOnly(MAILBOX_ID_1, MAILBOX_ID_2);
-                soft.assertThat(DELETED_MESSAGE.getOwner()).isEqualTo(USER);
+                soft.assertThat(DELETED_MESSAGE.getOwner()).isEqualTo(USERNAME);
                 soft.assertThat(DELETED_MESSAGE.getDeliveryDate()).isEqualTo(DELIVERY_DATE);
                 soft.assertThat(DELETED_MESSAGE.getDeletionDate()).isEqualTo(DELETION_DATE);
                 soft.assertThat(DELETED_MESSAGE.getSender()).isEqualTo(MaybeSender.of(SENDER));
diff --git a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultContract.java b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultContract.java
index a7eae46..7d3e9d9 100644
--- a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultContract.java
+++ b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultContract.java
@@ -28,8 +28,8 @@ import static org.apache.james.vault.DeletedMessageFixture.MESSAGE_ID;
 import static org.apache.james.vault.DeletedMessageFixture.NOW;
 import static org.apache.james.vault.DeletedMessageFixture.OLD_DELETED_MESSAGE;
 import static org.apache.james.vault.DeletedMessageFixture.SUBJECT;
-import static org.apache.james.vault.DeletedMessageFixture.USER;
-import static org.apache.james.vault.DeletedMessageFixture.USER_2;
+import static org.apache.james.vault.DeletedMessageFixture.USERNAME;
+import static org.apache.james.vault.DeletedMessageFixture.USERNAME_2;
 import static org.apache.james.vault.search.Query.ALL;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
@@ -64,7 +64,7 @@ public interface DeletedMessageVaultContract {
 
     @Test
     default void searchAllShouldThrowOnNullQuery() {
-       assertThatThrownBy(() -> getVault().search(USER, null))
+       assertThatThrownBy(() -> getVault().search(USERNAME, null))
            .isInstanceOf(NullPointerException.class);
     }
 
@@ -88,7 +88,7 @@ public interface DeletedMessageVaultContract {
 
     @Test
     default void deleteShouldThrowOnNullUser() {
-       assertThatThrownBy(() -> getVault().delete(USER, null))
+       assertThatThrownBy(() -> getVault().delete(USERNAME, null))
            .isInstanceOf(NullPointerException.class);
     }
 
@@ -100,13 +100,13 @@ public interface DeletedMessageVaultContract {
 
     @Test
     default void loadMimeMessageShouldThrowOnNullUser() {
-       assertThatThrownBy(() -> getVault().loadMimeMessage(USER, null))
+       assertThatThrownBy(() -> getVault().loadMimeMessage(USERNAME, null))
            .isInstanceOf(NullPointerException.class);
     }
 
     @Test
     default void searchAllShouldReturnEmptyWhenNoItem() {
-        assertThat(Flux.from(getVault().search(USER, ALL)).collectList().block())
+        assertThat(Flux.from(getVault().search(USERNAME, ALL)).collectList().block())
             .isEmpty();
     }
 
@@ -114,7 +114,7 @@ public interface DeletedMessageVaultContract {
     default void searchAllShouldReturnContainedItems() {
         Mono.from(getVault().append(DELETED_MESSAGE, new ByteArrayInputStream(CONTENT))).block();
 
-        assertThat(Flux.from(getVault().search(USER, ALL)).collectList().block())
+        assertThat(Flux.from(getVault().search(USERNAME, ALL)).collectList().block())
             .containsOnly(DELETED_MESSAGE);
     }
 
@@ -123,7 +123,7 @@ public interface DeletedMessageVaultContract {
         Mono.from(getVault().append(DELETED_MESSAGE, new ByteArrayInputStream(CONTENT))).block();
         Mono.from(getVault().append(DELETED_MESSAGE_2, new ByteArrayInputStream(CONTENT))).block();
 
-        assertThat(Flux.from(getVault().search(USER, ALL)).collectList().block())
+        assertThat(Flux.from(getVault().search(USERNAME, ALL)).collectList().block())
             .containsOnly(DELETED_MESSAGE, DELETED_MESSAGE_2);
     }
 
@@ -133,7 +133,7 @@ public interface DeletedMessageVaultContract {
         Mono.from(getVault().append(DELETED_MESSAGE_WITH_SUBJECT, new ByteArrayInputStream(CONTENT))).block();
 
         assertThat(
-            Flux.from(getVault().search(USER,
+            Flux.from(getVault().search(USERNAME,
                 Query.of(CriterionFactory.subject().containsIgnoreCase(SUBJECT))))
                 .collectList().block())
             .containsOnly(DELETED_MESSAGE_WITH_SUBJECT);
@@ -143,7 +143,7 @@ public interface DeletedMessageVaultContract {
     default void vaultShouldBePartitionnedByUser() {
         Mono.from(getVault().append(DELETED_MESSAGE, new ByteArrayInputStream(CONTENT))).block();
 
-        assertThat(Flux.from(getVault().search(USER_2, ALL)).collectList().block())
+        assertThat(Flux.from(getVault().search(USERNAME_2, ALL)).collectList().block())
             .isEmpty();
     }
 
@@ -151,15 +151,15 @@ public interface DeletedMessageVaultContract {
     default void searchAllShouldNotReturnDeletedItems() {
         Mono.from(getVault().append(DELETED_MESSAGE, new ByteArrayInputStream(CONTENT))).block();
 
-        Mono.from(getVault().delete(USER, MESSAGE_ID)).block();
+        Mono.from(getVault().delete(USERNAME, MESSAGE_ID)).block();
 
-        assertThat(Flux.from(getVault().search(USER, ALL)).collectList().block())
+        assertThat(Flux.from(getVault().search(USERNAME, ALL)).collectList().block())
             .isEmpty();
     }
 
     @Test
     default void loadMimeMessageShouldReturnEmptyWhenNone() {
-        assertThat(Mono.from(getVault().loadMimeMessage(USER, MESSAGE_ID)).blockOptional())
+        assertThat(Mono.from(getVault().loadMimeMessage(USERNAME, MESSAGE_ID)).blockOptional())
             .isEmpty();
     }
 
@@ -167,7 +167,7 @@ public interface DeletedMessageVaultContract {
     default void loadMimeMessageShouldReturnStoredValue() {
         Mono.from(getVault().append(DELETED_MESSAGE, new ByteArrayInputStream(CONTENT))).block();
 
-        assertThat(Mono.from(getVault().loadMimeMessage(USER, MESSAGE_ID)).blockOptional())
+        assertThat(Mono.from(getVault().loadMimeMessage(USERNAME, MESSAGE_ID)).blockOptional())
             .isNotEmpty()
             .satisfies(maybeContent -> assertThat(maybeContent.get()).hasSameContentAs(new ByteArrayInputStream(CONTENT)));
     }
@@ -176,9 +176,9 @@ public interface DeletedMessageVaultContract {
     default void loadMimeMessageShouldReturnEmptyWhenDeleted() {
         Mono.from(getVault().append(DELETED_MESSAGE, new ByteArrayInputStream(CONTENT))).block();
 
-        Mono.from(getVault().delete(USER, MESSAGE_ID)).block();
+        Mono.from(getVault().delete(USERNAME, MESSAGE_ID)).block();
 
-        assertThat(Mono.from(getVault().loadMimeMessage(USER, MESSAGE_ID)).blockOptional())
+        assertThat(Mono.from(getVault().loadMimeMessage(USERNAME, MESSAGE_ID)).blockOptional())
             .isEmpty();
     }
 
@@ -194,7 +194,7 @@ public interface DeletedMessageVaultContract {
             .operationCount(operationCount)
             .runSuccessfullyWithin(Duration.ofMinutes(1));
 
-        assertThat(Flux.from(getVault().search(USER, ALL)).collectList().block())
+        assertThat(Flux.from(getVault().search(USERNAME, ALL)).collectList().block())
             .hasSize(threadCount * operationCount);
     }
 
@@ -209,12 +209,12 @@ public interface DeletedMessageVaultContract {
             .blockLast();
 
         ConcurrentTestRunner.builder()
-            .operation((a, b) -> Mono.from(getVault().delete(USER, InMemoryMessageId.of(a * threadCount + b))).block())
+            .operation((a, b) -> Mono.from(getVault().delete(USERNAME, InMemoryMessageId.of(a * threadCount + b))).block())
             .threadCount(threadCount)
             .operationCount(operationCount)
             .runSuccessfullyWithin(Duration.ofMinutes(1));
 
-        assertThat(Flux.from(getVault().search(USER, ALL)).collectList().block())
+        assertThat(Flux.from(getVault().search(USERNAME, ALL)).collectList().block())
             .isEmpty();
     }
 
@@ -228,7 +228,7 @@ public interface DeletedMessageVaultContract {
     @Test
     default void deleteExpiredMessagesTaskShouldCompleteWhenAllMailsDeleted() throws InterruptedException {
         Mono.from(getVault().append(DELETED_MESSAGE, new ByteArrayInputStream(CONTENT))).block();
-        Mono.from(getVault().delete(USER, DELETED_MESSAGE.getMessageId())).block();
+        Mono.from(getVault().delete(USERNAME, DELETED_MESSAGE.getMessageId())).block();
 
         Task.Result result = getVault().deleteExpiredMessagesTask().run();
 
@@ -257,7 +257,7 @@ public interface DeletedMessageVaultContract {
     default void deleteExpiredMessagesTaskShouldDoNothingWhenEmpty() throws InterruptedException {
         getVault().deleteExpiredMessagesTask().run();
 
-        assertThat(Flux.from(getVault().search(USER, ALL)).collectList().block())
+        assertThat(Flux.from(getVault().search(USERNAME, ALL)).collectList().block())
             .isEmpty();
     }
 
@@ -267,7 +267,7 @@ public interface DeletedMessageVaultContract {
 
         getVault().deleteExpiredMessagesTask().run();
 
-        assertThat(Flux.from(getVault().search(USER, ALL)).collectList().block())
+        assertThat(Flux.from(getVault().search(USERNAME, ALL)).collectList().block())
             .containsOnly(DELETED_MESSAGE);
     }
 
@@ -278,7 +278,7 @@ public interface DeletedMessageVaultContract {
         getClock().setInstant(NOW.plusYears(2).toInstant());
         getVault().deleteExpiredMessagesTask().run();
 
-        assertThat(Flux.from(getVault().search(USER, ALL)).collectList().block())
+        assertThat(Flux.from(getVault().search(USERNAME, ALL)).collectList().block())
             .isEmpty();
     }
 
@@ -292,9 +292,9 @@ public interface DeletedMessageVaultContract {
         getClock().setInstant(NOW.plusYears(4).toInstant());
         getVault().deleteExpiredMessagesTask().run();
 
-        assertThat(Flux.from(getVault().search(USER, ALL)).collectList().block())
+        assertThat(Flux.from(getVault().search(USERNAME, ALL)).collectList().block())
             .isEmpty();
-        assertThat(Flux.from(getVault().search(USER_2, ALL)).collectList().block())
+        assertThat(Flux.from(getVault().search(USERNAME_2, ALL)).collectList().block())
             .isEmpty();
     }
 }
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 65d7efc..9504b5a 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
@@ -33,7 +33,7 @@ import org.apache.james.blob.api.HashBlobId;
 import org.apache.james.blob.memory.MemoryBlobStore;
 import org.apache.james.core.MailAddress;
 import org.apache.james.core.MaybeSender;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageIdManager;
@@ -67,8 +67,8 @@ class DeletedMessageVaultHookTest {
     private static final String ALICE_ADDRESS = "alice@james.com";
     private static final String BOB_ADDRESS = "bob@james.com";
     private static final String TEST_ADDRESS = "test@james.com";
-    private static final User ALICE = User.fromUsername(ALICE_ADDRESS);
-    private static final User BOB = User.fromUsername(BOB_ADDRESS);
+    private static final Username ALICE = Username.fromUsername(ALICE_ADDRESS);
+    private static final Username BOB = Username.fromUsername(BOB_ADDRESS);
     private static final String MESSAGE_BODY = "testmail";
 
     private static final MailboxPath MAILBOX_ALICE_ONE = MailboxPath.forUser(ALICE_ADDRESS, "ALICE_ONE");
@@ -83,11 +83,11 @@ class DeletedMessageVaultHookTest {
     private MailboxSession bobSession;
     private SearchQuery searchQuery;
 
-    private DeletedMessage buildDeletedMessage(List<MailboxId> mailboxIds, MessageId messageId, User user, long messageSize) throws Exception {
+    private DeletedMessage buildDeletedMessage(List<MailboxId> mailboxIds, MessageId messageId, Username username, long messageSize) throws Exception {
         return DeletedMessage.builder()
             .messageId(messageId)
             .originMailboxes(mailboxIds)
-            .user(user)
+            .user(username)
             .deliveryDate(DELIVERY_DATE)
             .deletionDate(DELETION_DATE)
             .sender(MaybeSender.getMailSender(ALICE_ADDRESS))
diff --git a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultSearchContract.java b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultSearchContract.java
index 3962d93..e1bc520 100644
--- a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultSearchContract.java
+++ b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultSearchContract.java
@@ -29,7 +29,7 @@ import static org.apache.james.vault.DeletedMessageFixture.MAILBOX_ID_1;
 import static org.apache.james.vault.DeletedMessageFixture.MAILBOX_ID_2;
 import static org.apache.james.vault.DeletedMessageFixture.MAILBOX_ID_3;
 import static org.apache.james.vault.DeletedMessageFixture.SUBJECT;
-import static org.apache.james.vault.DeletedMessageFixture.USER;
+import static org.apache.james.vault.DeletedMessageFixture.USERNAME;
 import static org.apache.mailet.base.MailAddressFixture.RECIPIENT1;
 import static org.apache.mailet.base.MailAddressFixture.RECIPIENT2;
 import static org.apache.mailet.base.MailAddressFixture.RECIPIENT3;
@@ -46,7 +46,7 @@ import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.james.core.MailAddress;
 import org.apache.james.core.MaybeSender;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.inmemory.InMemoryMessageId;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.vault.search.CriterionFactory;
@@ -511,7 +511,7 @@ public interface DeletedMessageVaultSearchContract {
             DeletedMessage message2 = storeDeletedMessage(DELETED_MESSAGE_2);
             storeDeletedMessage(DELETED_MESSAGE_OTHER_USER);
 
-            assertThat(search(USER, Query.ALL))
+            assertThat(search(USERNAME, Query.ALL))
                 .containsOnly(message1, message2);
         }
     }
@@ -535,11 +535,11 @@ public interface DeletedMessageVaultSearchContract {
     AtomicLong MESSAGE_ID_GENERATOR = new AtomicLong(0);
 
     default List<DeletedMessage> search(Query query) {
-        return search(USER, query);
+        return search(USERNAME, query);
     }
 
-    default List<DeletedMessage> search(User user, Query query) {
-        return Flux.from(getVault().search(user, query)).collectList().block();
+    default List<DeletedMessage> search(Username username, Query query) {
+        return Flux.from(getVault().search(username, query)).collectList().block();
     }
 
     default DeletedMessage storeMessageWithDeliveryDate(ZonedDateTime deliveryDate) {
@@ -560,7 +560,7 @@ public interface DeletedMessageVaultSearchContract {
         DeletedMessage deletedMessage = DeletedMessage.builder()
             .messageId(InMemoryMessageId.of(MESSAGE_ID_GENERATOR.incrementAndGet()))
             .originMailboxes(MAILBOX_ID_1)
-            .user(USER)
+            .user(USERNAME)
             .deliveryDate(DELIVERY_DATE)
             .deletionDate(DELETION_DATE)
             .sender(MaybeSender.of(SENDER))
@@ -576,7 +576,7 @@ public interface DeletedMessageVaultSearchContract {
         DeletedMessage deletedMessage = DeletedMessage.builder()
             .messageId(InMemoryMessageId.of(MESSAGE_ID_GENERATOR.incrementAndGet()))
             .originMailboxes(MAILBOX_ID_1)
-            .user(USER)
+            .user(USERNAME)
             .deliveryDate(DELIVERY_DATE)
             .deletionDate(DELETION_DATE)
             .sender(sender)
@@ -592,7 +592,7 @@ public interface DeletedMessageVaultSearchContract {
         DeletedMessage deletedMessage = DeletedMessage.builder()
             .messageId(InMemoryMessageId.of(MESSAGE_ID_GENERATOR.incrementAndGet()))
             .originMailboxes(MAILBOX_ID_1)
-            .user(USER)
+            .user(USERNAME)
             .deliveryDate(DELIVERY_DATE)
             .deletionDate(DELETION_DATE)
             .sender(MaybeSender.of(SENDER))
@@ -608,7 +608,7 @@ public interface DeletedMessageVaultSearchContract {
         DeletedMessage deletedMessage = DeletedMessage.builder()
             .messageId(InMemoryMessageId.of(MESSAGE_ID_GENERATOR.incrementAndGet()))
             .originMailboxes(originMailboxIds)
-            .user(USER)
+            .user(USERNAME)
             .deliveryDate(DELIVERY_DATE)
             .deletionDate(DELETION_DATE)
             .sender(MaybeSender.of(SENDER))
@@ -653,7 +653,7 @@ public interface DeletedMessageVaultSearchContract {
         return DeletedMessage.builder()
             .messageId(InMemoryMessageId.of(MESSAGE_ID_GENERATOR.incrementAndGet()))
             .originMailboxes(MAILBOX_ID_1)
-            .user(USER)
+            .user(USERNAME)
             .deliveryDate(deliveryDate)
             .deletionDate(deletionDate)
             .sender(MaybeSender.of(SENDER))
diff --git a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/blob/BlobStoreDeletedMessageVaultTest.java b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/blob/BlobStoreDeletedMessageVaultTest.java
index a98bf1f..cf09ffb 100644
--- a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/blob/BlobStoreDeletedMessageVaultTest.java
+++ b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/blob/BlobStoreDeletedMessageVaultTest.java
@@ -25,7 +25,7 @@ import static org.apache.james.vault.DeletedMessageFixture.DELETED_MESSAGE_2;
 import static org.apache.james.vault.DeletedMessageFixture.MESSAGE_ID;
 import static org.apache.james.vault.DeletedMessageFixture.NOW;
 import static org.apache.james.vault.DeletedMessageFixture.OLD_DELETED_MESSAGE;
-import static org.apache.james.vault.DeletedMessageFixture.USER;
+import static org.apache.james.vault.DeletedMessageFixture.USERNAME;
 import static org.apache.james.vault.blob.BlobStoreDeletedMessageVault.APPEND_METRIC_NAME;
 import static org.apache.james.vault.blob.BlobStoreDeletedMessageVault.DELETE_METRIC_NAME;
 import static org.apache.james.vault.blob.BlobStoreDeletedMessageVault.LOAD_MIME_MESSAGE_METRIC_NAME;
@@ -116,9 +116,9 @@ class BlobStoreDeletedMessageVaultTest implements DeletedMessageVaultContract, D
 
     @Test
     void searchShouldPublishSearchTimerMetrics() {
-        Mono.from(messageVault.search(USER, ALL))
+        Mono.from(messageVault.search(USERNAME, ALL))
             .block();
-        Mono.from(messageVault.search(USER, ALL))
+        Mono.from(messageVault.search(USERNAME, ALL))
             .block();
 
         assertThat(metricFactory.executionTimesFor(SEARCH_METRIC_NAME))
@@ -127,9 +127,9 @@ class BlobStoreDeletedMessageVaultTest implements DeletedMessageVaultContract, D
 
     @Test
     void loadMimeMessageShouldPublishLoadMimeMessageTimerMetrics() {
-        Mono.from(messageVault.loadMimeMessage(USER, MESSAGE_ID))
+        Mono.from(messageVault.loadMimeMessage(USERNAME, MESSAGE_ID))
             .block();
-        Mono.from(messageVault.loadMimeMessage(USER, MESSAGE_ID))
+        Mono.from(messageVault.loadMimeMessage(USERNAME, MESSAGE_ID))
             .block();
 
         assertThat(metricFactory.executionTimesFor(LOAD_MIME_MESSAGE_METRIC_NAME))
@@ -138,9 +138,9 @@ class BlobStoreDeletedMessageVaultTest implements DeletedMessageVaultContract, D
 
     @Test
     void deleteShouldPublishDeleteTimerMetrics() {
-        Mono.from(messageVault.delete(USER, MESSAGE_ID))
+        Mono.from(messageVault.delete(USERNAME, MESSAGE_ID))
             .block();
-        Mono.from(messageVault.delete(USER, MESSAGE_ID))
+        Mono.from(messageVault.delete(USERNAME, MESSAGE_ID))
             .block();
 
         assertThat(metricFactory.executionTimesFor(DELETE_METRIC_NAME))
@@ -150,7 +150,7 @@ class BlobStoreDeletedMessageVaultTest implements DeletedMessageVaultContract, D
     @Test
     void deleteExpiredMessagesTaskShouldPublishRetentionTimerMetrics() throws Exception {
         Mono.from(getVault().append(DELETED_MESSAGE, new ByteArrayInputStream(CONTENT))).block();
-        Mono.from(getVault().delete(USER, DELETED_MESSAGE.getMessageId())).block();
+        Mono.from(getVault().delete(USERNAME, DELETED_MESSAGE.getMessageId())).block();
 
         getVault().deleteExpiredMessagesTask().run();
 
diff --git a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/metadata/DeletedMessageMetadataVaultContract.java b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/metadata/DeletedMessageMetadataVaultContract.java
index c27d31d..2070cf5 100644
--- a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/metadata/DeletedMessageMetadataVaultContract.java
+++ b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/metadata/DeletedMessageMetadataVaultContract.java
@@ -19,7 +19,7 @@
 
 package org.apache.james.vault.metadata;
 
-import static org.apache.james.vault.DeletedMessageFixture.USER;
+import static org.apache.james.vault.DeletedMessageFixture.USERNAME;
 import static org.apache.james.vault.metadata.DeletedMessageVaultMetadataFixture.BUCKET_NAME;
 import static org.apache.james.vault.metadata.DeletedMessageVaultMetadataFixture.DELETED_MESSAGE;
 import static org.apache.james.vault.metadata.DeletedMessageVaultMetadataFixture.DELETED_MESSAGE_2;
@@ -43,7 +43,7 @@ public interface DeletedMessageMetadataVaultContract {
 
     @Test
     default void listMessagesShouldBeEmptyWhenNoMessageInserted() {
-        Stream<DeletedMessageWithStorageInformation> messages = Flux.from(metadataVault().listMessages(BUCKET_NAME, USER)).toStream();
+        Stream<DeletedMessageWithStorageInformation> messages = Flux.from(metadataVault().listMessages(BUCKET_NAME, USERNAME)).toStream();
         assertThat(messages).isEmpty();
     }
 
@@ -51,7 +51,7 @@ public interface DeletedMessageMetadataVaultContract {
     default void listMessagesShouldContainPreviouslyInsertedMessage() {
         Mono.from(metadataVault().store(DELETED_MESSAGE)).block();
 
-        Stream<DeletedMessageWithStorageInformation> messages = Flux.from(metadataVault().listMessages(BUCKET_NAME, USER)).toStream();
+        Stream<DeletedMessageWithStorageInformation> messages = Flux.from(metadataVault().listMessages(BUCKET_NAME, USERNAME)).toStream();
         assertThat(messages).containsOnly(DELETED_MESSAGE);
     }
 
@@ -60,7 +60,7 @@ public interface DeletedMessageMetadataVaultContract {
         Mono.from(metadataVault().store(DELETED_MESSAGE)).block();
         Mono.from(metadataVault().store(DELETED_MESSAGE_2)).block();
 
-        Stream<DeletedMessageWithStorageInformation> messages = Flux.from(metadataVault().listMessages(BUCKET_NAME, USER)).toStream();
+        Stream<DeletedMessageWithStorageInformation> messages = Flux.from(metadataVault().listMessages(BUCKET_NAME, USERNAME)).toStream();
         assertThat(messages).containsOnly(DELETED_MESSAGE, DELETED_MESSAGE_2);
     }
 
@@ -69,7 +69,7 @@ public interface DeletedMessageMetadataVaultContract {
         Mono.from(metadataVault().store(DELETED_MESSAGE)).block();
         Mono.from(metadataVault().store(DELETED_MESSAGE_2_OTHER_BUCKET)).block();
 
-        Stream<DeletedMessageWithStorageInformation> messages = Flux.from(metadataVault().listMessages(BUCKET_NAME, USER)).toStream();
+        Stream<DeletedMessageWithStorageInformation> messages = Flux.from(metadataVault().listMessages(BUCKET_NAME, USERNAME)).toStream();
         assertThat(messages).containsOnly(DELETED_MESSAGE);
     }
 
@@ -126,7 +126,7 @@ public interface DeletedMessageMetadataVaultContract {
 
         Mono.from(metadataVault().removeMetadataRelatedToBucket(BUCKET_NAME)).block();
 
-        Stream<DeletedMessageWithStorageInformation> messages = Flux.from(metadataVault().listMessages(OTHER_BUCKET_NAME, USER)).toStream();
+        Stream<DeletedMessageWithStorageInformation> messages = Flux.from(metadataVault().listMessages(OTHER_BUCKET_NAME, USERNAME)).toStream();
         assertThat(messages).containsOnly(DELETED_MESSAGE_2_OTHER_BUCKET);
     }
 
@@ -137,7 +137,7 @@ public interface DeletedMessageMetadataVaultContract {
 
         Mono.from(metadataVault().removeMetadataRelatedToBucket(BUCKET_NAME)).block();
 
-        Stream<DeletedMessageWithStorageInformation> messages = Flux.from(metadataVault().listMessages(BUCKET_NAME, USER)).toStream();
+        Stream<DeletedMessageWithStorageInformation> messages = Flux.from(metadataVault().listMessages(BUCKET_NAME, USERNAME)).toStream();
         assertThat(messages).isEmpty();
     }
 
@@ -146,9 +146,9 @@ public interface DeletedMessageMetadataVaultContract {
         Mono.from(metadataVault().store(DELETED_MESSAGE)).block();
         Mono.from(metadataVault().store(DELETED_MESSAGE_2)).block();
 
-        Mono.from(metadataVault().remove(BUCKET_NAME, USER, DELETED_MESSAGE.getDeletedMessage().getMessageId())).block();
+        Mono.from(metadataVault().remove(BUCKET_NAME, USERNAME, DELETED_MESSAGE.getDeletedMessage().getMessageId())).block();
 
-        Stream<DeletedMessageWithStorageInformation> messages = Flux.from(metadataVault().listMessages(BUCKET_NAME, USER)).toStream();
+        Stream<DeletedMessageWithStorageInformation> messages = Flux.from(metadataVault().listMessages(BUCKET_NAME, USERNAME)).toStream();
         assertThat(messages).containsExactly(DELETED_MESSAGE_2);
     }
 
@@ -157,7 +157,7 @@ public interface DeletedMessageMetadataVaultContract {
         Mono.from(metadataVault().store(DELETED_MESSAGE_2)).block();
 
         assertThatCode(() -> Mono.from(metadataVault()
-                .remove(BUCKET_NAME, USER, DELETED_MESSAGE.getDeletedMessage().getMessageId()))
+                .remove(BUCKET_NAME, USERNAME, DELETED_MESSAGE.getDeletedMessage().getMessageId()))
                 .block())
             .doesNotThrowAnyException();
     }
@@ -167,7 +167,7 @@ public interface DeletedMessageMetadataVaultContract {
         Mono.from(metadataVault().store(DELETED_MESSAGE)).block();
 
         StorageInformation storageInformation = Mono.from(metadataVault()
-            .retrieveStorageInformation(USER, DELETED_MESSAGE.getDeletedMessage().getMessageId()))
+            .retrieveStorageInformation(USERNAME, DELETED_MESSAGE.getDeletedMessage().getMessageId()))
             .block();
 
         assertThat(storageInformation).isEqualTo(DELETED_MESSAGE.getStorageInformation());
@@ -178,7 +178,7 @@ public interface DeletedMessageMetadataVaultContract {
         Mono.from(metadataVault().store(DELETED_MESSAGE_2)).block();
 
         Optional<StorageInformation> storageInformation = Mono.from(metadataVault()
-            .retrieveStorageInformation(USER, DELETED_MESSAGE.getDeletedMessage().getMessageId()))
+            .retrieveStorageInformation(USERNAME, DELETED_MESSAGE.getDeletedMessage().getMessageId()))
             .blockOptional();
 
         assertThat(storageInformation).isEmpty();
@@ -187,7 +187,7 @@ public interface DeletedMessageMetadataVaultContract {
     @Test
     default void retrieveStorageInformationShouldReturnEmptyWhenUserVaultIsEmpty() {
         Optional<StorageInformation> storageInformation = Mono.from(metadataVault()
-            .retrieveStorageInformation(USER, DELETED_MESSAGE.getDeletedMessage().getMessageId()))
+            .retrieveStorageInformation(USERNAME, DELETED_MESSAGE.getDeletedMessage().getMessageId()))
             .blockOptional();
 
         assertThat(storageInformation).isEmpty();
diff --git a/mailbox/plugin/quota-mailing-cassandra/src/test/java/org/apache/james/mailbox/quota/cassandra/dto/DTOTest.java b/mailbox/plugin/quota-mailing-cassandra/src/test/java/org/apache/james/mailbox/quota/cassandra/dto/DTOTest.java
index e644f97..81ec037 100644
--- a/mailbox/plugin/quota-mailing-cassandra/src/test/java/org/apache/james/mailbox/quota/cassandra/dto/DTOTest.java
+++ b/mailbox/plugin/quota-mailing-cassandra/src/test/java/org/apache/james/mailbox/quota/cassandra/dto/DTOTest.java
@@ -26,7 +26,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import java.time.Instant;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.core.quota.QuotaCount;
 import org.apache.james.core.quota.QuotaSize;
 import org.apache.james.eventsourcing.EventId;
@@ -56,14 +56,14 @@ class DTOTest {
         HistoryEvolution.noChanges(),
         SIZE_QUOTA,
         COUNT_QUOTA,
-        UserQuotaThresholds.Id.from(User.fromUsername("foo@bar.com"), DEFAULT_LISTENER_NAME));
+        UserQuotaThresholds.Id.from(Username.fromUsername("foo@bar.com"), DEFAULT_LISTENER_NAME));
     static final QuotaThresholdChangedEvent EVENT_2 = new QuotaThresholdChangedEvent(
         EventId.first(),
         HistoryEvolution.lowerThresholdReached(new QuotaThresholdChange(_75, INSTANT)),
         HistoryEvolution.noChanges(),
         SIZE_QUOTA,
         Quota.<QuotaCount>builder().used(QuotaCount.count(12)).computedLimit(QuotaCount.unlimited()).build(),
-        UserQuotaThresholds.Id.from(User.fromUsername("foo@bar.com"), DEFAULT_LISTENER_NAME));
+        UserQuotaThresholds.Id.from(Username.fromUsername("foo@bar.com"), DEFAULT_LISTENER_NAME));
     static final QuotaThresholdChangedEvent EVENT_3 = new QuotaThresholdChangedEvent(
         EventId.first(),
         HistoryEvolution.lowerThresholdReached(new QuotaThresholdChange(_75, INSTANT)),
@@ -71,7 +71,7 @@ class DTOTest {
             HistoryEvolution.HighestThresholdRecentness.NotAlreadyReachedDuringGracePeriod),
         SIZE_QUOTA,
         Quota.<QuotaCount>builder().used(QuotaCount.count(12)).computedLimit(QuotaCount.unlimited()).build(),
-        UserQuotaThresholds.Id.from(User.fromUsername("foo@bar.com"), DEFAULT_LISTENER_NAME));
+        UserQuotaThresholds.Id.from(Username.fromUsername("foo@bar.com"), DEFAULT_LISTENER_NAME));
     static final QuotaThresholdChangedEvent EVENT_4 = new QuotaThresholdChangedEvent(
         EventId.first(),
         HistoryEvolution.lowerThresholdReached(new QuotaThresholdChange(_75, INSTANT)),
@@ -79,7 +79,7 @@ class DTOTest {
             HistoryEvolution.HighestThresholdRecentness.AlreadyReachedDuringGracePeriod),
         SIZE_QUOTA,
         Quota.<QuotaCount>builder().used(QuotaCount.count(12)).computedLimit(QuotaCount.unlimited()).build(),
-        UserQuotaThresholds.Id.from(User.fromUsername("foo@bar.com"), DEFAULT_LISTENER_NAME));
+        UserQuotaThresholds.Id.from(Username.fromUsername("foo@bar.com"), DEFAULT_LISTENER_NAME));
 
     static final String EVENT_JSON = ClassLoaderUtils.getSystemResourceAsString("json/event.json");
     static final String EVENT_JSON_2 = ClassLoaderUtils.getSystemResourceAsString("json/event2.json");
diff --git a/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/aggregates/UserQuotaThresholds.java b/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/aggregates/UserQuotaThresholds.java
index 9b09e13..7e3a4e8 100644
--- a/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/aggregates/UserQuotaThresholds.java
+++ b/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/aggregates/UserQuotaThresholds.java
@@ -25,7 +25,7 @@ import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.core.quota.QuotaCount;
 import org.apache.james.core.quota.QuotaSize;
 import org.apache.james.eventsourcing.AggregateId;
@@ -62,30 +62,30 @@ public class UserQuotaThresholds {
             if (keyParts.size() != 3 || !keyParts.get(PREFIX_INDEX).equals(PREFIX)) {
                 throw new IllegalArgumentException();
             }
-            return new Id(User.fromUsername(keyParts.get(USER_INDEX)), keyParts.get(NAME_INDEX));
+            return new Id(Username.fromUsername(keyParts.get(USER_INDEX)), keyParts.get(NAME_INDEX));
         }
 
-        public static Id from(User user, String name) {
-            return new Id(user, name);
+        public static Id from(Username username, String name) {
+            return new Id(username, name);
         }
 
-        private final User user;
+        private final Username username;
         private final String name;
 
-        private Id(User user, String name) {
-            Preconditions.checkArgument(!user.asString().contains(SEPARATOR));
+        private Id(Username username, String name) {
+            Preconditions.checkArgument(!username.asString().contains(SEPARATOR));
             Preconditions.checkArgument(!name.contains(SEPARATOR));
-            this.user = user;
+            this.username = username;
             this.name = name;
         }
 
-        public User getUser() {
-            return user;
+        public Username getUsername() {
+            return username;
         }
 
         @Override
         public String asAggregateKey() {
-            return Joiner.on(SEPARATOR).join(PREFIX, name, user.asString());
+            return Joiner.on(SEPARATOR).join(PREFIX, name, username.asString());
         }
 
         @Override
@@ -93,7 +93,7 @@ public class UserQuotaThresholds {
             if (o instanceof Id) {
                 Id id = (Id) o;
 
-                return Objects.equals(this.user, id.user)
+                return Objects.equals(this.username, id.username)
                     && Objects.equals(this.name, id.name);
             }
             return false;
@@ -101,13 +101,13 @@ public class UserQuotaThresholds {
 
         @Override
         public final int hashCode() {
-            return Objects.hash(user, name);
+            return Objects.hash(username, name);
         }
 
         @Override
         public String toString() {
             return MoreObjects.toStringHelper(this)
-                .add("user", user)
+                .add("user", username)
                 .add("name", name)
                 .toString();
         }
diff --git a/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/commands/DetectThresholdCrossing.java b/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/commands/DetectThresholdCrossing.java
index 2f9547a..833388d 100644
--- a/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/commands/DetectThresholdCrossing.java
+++ b/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/commands/DetectThresholdCrossing.java
@@ -22,7 +22,7 @@ package org.apache.james.mailbox.quota.mailing.commands;
 import java.time.Instant;
 import java.util.Objects;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.core.quota.QuotaCount;
 import org.apache.james.core.quota.QuotaSize;
 import org.apache.james.eventsourcing.Command;
@@ -30,20 +30,20 @@ import org.apache.james.mailbox.model.Quota;
 
 public class DetectThresholdCrossing implements Command {
 
-    private final User user;
+    private final Username username;
     private final Quota<QuotaCount> countQuota;
     private final Quota<QuotaSize> sizeQuota;
     private final Instant instant;
 
-    public DetectThresholdCrossing(User user, Quota<QuotaCount> countQuota, Quota<QuotaSize> sizeQuota, Instant instant) {
-        this.user = user;
+    public DetectThresholdCrossing(Username username, Quota<QuotaCount> countQuota, Quota<QuotaSize> sizeQuota, Instant instant) {
+        this.username = username;
         this.countQuota = countQuota;
         this.sizeQuota = sizeQuota;
         this.instant = instant;
     }
 
-    public User getUser() {
-        return user;
+    public Username getUsername() {
+        return username;
     }
 
     public Quota<QuotaCount> getCountQuota() {
@@ -63,7 +63,7 @@ public class DetectThresholdCrossing implements Command {
         if (o instanceof DetectThresholdCrossing) {
             DetectThresholdCrossing that = (DetectThresholdCrossing) o;
 
-            return Objects.equals(this.user, that.user)
+            return Objects.equals(this.username, that.username)
                 && Objects.equals(this.countQuota, that.countQuota)
                 && Objects.equals(this.sizeQuota, that.sizeQuota);
         }
@@ -72,6 +72,6 @@ public class DetectThresholdCrossing implements Command {
 
     @Override
     public final int hashCode() {
-        return Objects.hash(user, countQuota, sizeQuota);
+        return Objects.hash(username, countQuota, sizeQuota);
     }
 }
diff --git a/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/commands/DetectThresholdCrossingHandler.java b/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/commands/DetectThresholdCrossingHandler.java
index 54a9db3..be2a518 100644
--- a/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/commands/DetectThresholdCrossingHandler.java
+++ b/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/commands/DetectThresholdCrossingHandler.java
@@ -47,7 +47,7 @@ public class DetectThresholdCrossingHandler implements CommandHandler<DetectThre
     }
 
     private UserQuotaThresholds loadAggregate(DetectThresholdCrossing command) {
-        UserQuotaThresholds.Id aggregateId = UserQuotaThresholds.Id.from(command.getUser(), listenerName);
+        UserQuotaThresholds.Id aggregateId = UserQuotaThresholds.Id.from(command.getUsername(), listenerName);
         History history = eventStore.getEventsOfAggregate(aggregateId);
         return UserQuotaThresholds.fromEvents(aggregateId, history);
     }
diff --git a/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdCrossingListener.java b/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdCrossingListener.java
index 8016f58..886e49f 100644
--- a/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdCrossingListener.java
+++ b/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdCrossingListener.java
@@ -23,7 +23,7 @@ import javax.inject.Inject;
 
 import org.apache.commons.configuration2.HierarchicalConfiguration;
 import org.apache.commons.configuration2.tree.ImmutableNode;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.eventsourcing.CommandHandler;
 import org.apache.james.eventsourcing.EventSourcingSystem;
 import org.apache.james.eventsourcing.Subscriber;
@@ -73,12 +73,12 @@ public class QuotaThresholdCrossingListener implements MailboxListener.GroupMail
     @Override
     public void event(Event event) {
         if (event instanceof QuotaUsageUpdatedEvent) {
-            handleEvent(event.getUser(), (QuotaUsageUpdatedEvent) event);
+            handleEvent(event.getUsername(), (QuotaUsageUpdatedEvent) event);
         }
     }
 
-    private void handleEvent(User user, QuotaUsageUpdatedEvent event) {
+    private void handleEvent(Username username, QuotaUsageUpdatedEvent event) {
         eventSourcingSystem.dispatch(
-            new DetectThresholdCrossing(user, event.getCountQuota(), event.getSizeQuota(), event.getInstant()));
+            new DetectThresholdCrossing(username, event.getCountQuota(), event.getSizeQuota(), event.getInstant()));
     }
 }
diff --git a/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/subscribers/QuotaThresholdMailer.java b/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/subscribers/QuotaThresholdMailer.java
index 54cb1b9..ddd06ff 100644
--- a/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/subscribers/QuotaThresholdMailer.java
+++ b/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/subscribers/QuotaThresholdMailer.java
@@ -25,7 +25,7 @@ import java.util.Optional;
 import javax.mail.MessagingException;
 
 import org.apache.james.core.MailAddress;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.eventsourcing.Event;
 import org.apache.james.eventsourcing.Subscriber;
 import org.apache.james.filesystem.api.FileSystem;
@@ -67,12 +67,12 @@ public class QuotaThresholdMailer implements Subscriber {
             .withConfiguration(configuration)
             .build();
 
-        maybeNotice.ifPresent(Throwing.consumer(notice -> sendNotice(notice, event.getAggregateId().getUser())));
+        maybeNotice.ifPresent(Throwing.consumer(notice -> sendNotice(notice, event.getAggregateId().getUsername())));
     }
 
-    private void sendNotice(QuotaThresholdNotice notice, User user) throws UsersRepositoryException, MessagingException, IOException {
+    private void sendNotice(QuotaThresholdNotice notice, Username username) throws UsersRepositoryException, MessagingException, IOException {
         MailAddress sender = mailetContext.getPostmaster();
-        MailAddress recipient = usersRepository.getMailAddressFor(user);
+        MailAddress recipient = usersRepository.getMailAddressFor(username);
 
         mailetContext.sendMail(sender, ImmutableList.of(recipient),
             notice.generateMimeMessage(fileSystem)
diff --git a/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/aggregates/UserQuotaThresholdsTest.java b/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/aggregates/UserQuotaThresholdsTest.java
index bc1390a..80c672c 100644
--- a/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/aggregates/UserQuotaThresholdsTest.java
+++ b/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/aggregates/UserQuotaThresholdsTest.java
@@ -22,14 +22,14 @@ package org.apache.james.mailbox.quota.mailing.aggregates;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.junit.jupiter.api.Test;
 
 import nl.jqno.equalsverifier.EqualsVerifier;
 
 public class UserQuotaThresholdsTest {
 
-    public static final User BOB = User.fromUsername("bob@domain");
+    public static final Username BOB = Username.fromUsername("bob@domain");
 
     @Test
     public void aggregateShouldMatchBeanContract() {
@@ -46,13 +46,13 @@ public class UserQuotaThresholdsTest {
 
     @Test
     public void fromShouldThrowWhenUserWithSlash() {
-        assertThatThrownBy(() -> UserQuotaThresholds.Id.from(User.fromUsername("foo/bar@domain"), "listenerName"))
+        assertThatThrownBy(() -> UserQuotaThresholds.Id.from(Username.fromUsername("foo/bar@domain"), "listenerName"))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
     public void fromShouldThrowWhenDomainWithSlash() {
-        assertThatThrownBy(() -> UserQuotaThresholds.Id.from(User.fromUsername("foo.bar@dom/ain"), "listenerName"))
+        assertThatThrownBy(() -> UserQuotaThresholds.Id.from(Username.fromUsername("foo.bar@dom/ain"), "listenerName"))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
diff --git a/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdConfigurationChangesTest.java b/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdConfigurationChangesTest.java
index 03127e5..1691454 100644
--- a/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdConfigurationChangesTest.java
+++ b/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdConfigurationChangesTest.java
@@ -19,7 +19,7 @@
 
 package org.apache.james.mailbox.quota.mailing.listeners;
 
-import static org.apache.james.mailbox.quota.model.QuotaThresholdFixture.TestConstants.BOB_USER;
+import static org.apache.james.mailbox.quota.model.QuotaThresholdFixture.TestConstants.BOB_USERNAME;
 import static org.apache.james.mailbox.quota.model.QuotaThresholdFixture.TestConstants.GRACE_PERIOD;
 import static org.apache.james.mailbox.quota.model.QuotaThresholdFixture.TestConstants.NOW;
 import static org.apache.james.mailbox.quota.model.QuotaThresholdFixture.TestConstants.QUOTAROOT;
@@ -56,7 +56,7 @@ public interface QuotaThresholdConfigurationChangesTest {
     static EventFactory.RequireQuotaCount<EventFactory.RequireQuotaSize<EventFactory.RequireInstant<EventFactory.QuotaUsageUpdatedFinalStage>>> eventBase() {
         return EventFactory.quotaUpdated()
             .eventId(EVENT_ID)
-            .user(BOB_USER)
+            .user(BOB_USERNAME)
             .quotaRoot(QUOTAROOT);
     }
 
diff --git a/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdMailingIntegrationTest.java b/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdMailingIntegrationTest.java
index 9213051..ff891eb 100644
--- a/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdMailingIntegrationTest.java
+++ b/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/listeners/QuotaThresholdMailingIntegrationTest.java
@@ -19,7 +19,7 @@
 
 package org.apache.james.mailbox.quota.mailing.listeners;
 
-import static org.apache.james.mailbox.quota.model.QuotaThresholdFixture.TestConstants.BOB_USER;
+import static org.apache.james.mailbox.quota.model.QuotaThresholdFixture.TestConstants.BOB_USERNAME;
 import static org.apache.james.mailbox.quota.model.QuotaThresholdFixture.TestConstants.DEFAULT_CONFIGURATION;
 import static org.apache.james.mailbox.quota.model.QuotaThresholdFixture.TestConstants.GRACE_PERIOD;
 import static org.apache.james.mailbox.quota.model.QuotaThresholdFixture.TestConstants.NOW;
@@ -53,7 +53,7 @@ public interface QuotaThresholdMailingIntegrationTest {
     static EventFactory.RequireQuotaCount<EventFactory.RequireQuotaSize<EventFactory.RequireInstant<EventFactory.QuotaUsageUpdatedFinalStage>>> eventBase() {
         return EventFactory.quotaUpdated()
             .eventId(EVENT_ID)
-            .user(BOB_USER)
+            .user(BOB_USERNAME)
             .quotaRoot(QUOTAROOT);
     }
 
diff --git a/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/model/QuotaThresholdFixture.java b/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/model/QuotaThresholdFixture.java
index 01f1e0a..885c8f7 100644
--- a/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/model/QuotaThresholdFixture.java
+++ b/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/model/QuotaThresholdFixture.java
@@ -23,7 +23,7 @@ import java.time.Duration;
 import java.time.Instant;
 import java.util.Optional;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.model.QuotaRoot;
 import org.apache.james.mailbox.quota.mailing.QuotaMailingListenerConfiguration;
 import org.apache.mailet.base.MailAddressFixture;
@@ -45,7 +45,7 @@ public interface QuotaThresholdFixture {
             .gracePeriod(GRACE_PERIOD)
             .build();
         String BOB = "bob@domain";
-        User BOB_USER = User.fromUsername(BOB);
+        Username BOB_USERNAME = Username.fromUsername(BOB);
         Instant NOW = Instant.now();
         QuotaRoot QUOTAROOT = QuotaRoot.quotaRoot("any", Optional.empty());
         Instant ONE_HOUR_AGO = NOW.minus(Duration.ofHours(1));
diff --git a/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearcher.java b/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearcher.java
index 1a7e314..8994210 100644
--- a/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearcher.java
+++ b/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearcher.java
@@ -30,7 +30,7 @@ import org.apache.james.backends.es.AliasName;
 import org.apache.james.backends.es.NodeMappingFactory;
 import org.apache.james.backends.es.ReadAliasName;
 import org.apache.james.backends.es.search.ScrolledSearch;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.quota.search.QuotaQuery;
 import org.apache.james.quota.search.QuotaSearcher;
 import org.elasticsearch.action.search.SearchRequest;
@@ -58,12 +58,12 @@ public class ElasticSearchQuotaSearcher implements QuotaSearcher {
     }
 
     @Override
-    public List<User> search(QuotaQuery query) {
+    public List<Username> search(QuotaQuery query) {
         try {
             try (Stream<SearchHit> searchHits = searchHits(query)) {
                 return searchHits
                     .map(SearchHit::getId)
-                    .map(User::fromUsername)
+                    .map(Username::fromUsername)
                     .collect(Guavate.toImmutableList());
             }
         } catch (IOException e) {
diff --git a/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/UserRoutingKeyFactory.java b/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/UserRoutingKeyFactory.java
index 46abf86..c4ee0ce 100644
--- a/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/UserRoutingKeyFactory.java
+++ b/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/UserRoutingKeyFactory.java
@@ -20,11 +20,11 @@
 package org.apache.james.quota.search.elasticsearch;
 
 import org.apache.james.backends.es.RoutingKey;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 
-public class UserRoutingKeyFactory implements RoutingKey.Factory<User> {
+public class UserRoutingKeyFactory implements RoutingKey.Factory<Username> {
     @Override
-    public RoutingKey from(User user) {
+    public RoutingKey from(Username user) {
         return RoutingKey.fromString(user.asString());
     }
 }
diff --git a/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListener.java b/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListener.java
index c03a4f8..b124c18 100644
--- a/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListener.java
+++ b/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListener.java
@@ -26,7 +26,7 @@ import javax.inject.Named;
 import org.apache.james.backends.es.DocumentId;
 import org.apache.james.backends.es.ElasticSearchIndexer;
 import org.apache.james.backends.es.RoutingKey;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.events.Event;
 import org.apache.james.mailbox.events.Group;
 import org.apache.james.mailbox.events.MailboxListener;
@@ -42,12 +42,12 @@ public class ElasticSearchQuotaMailboxListener implements MailboxListener.GroupM
 
     private final ElasticSearchIndexer indexer;
     private final QuotaRatioToElasticSearchJson quotaRatioToElasticSearchJson;
-    private final RoutingKey.Factory<User> routingKeyFactory;
+    private final RoutingKey.Factory<Username> routingKeyFactory;
 
     @Inject
     public ElasticSearchQuotaMailboxListener(@Named(QuotaRatioElasticSearchConstants.InjectionNames.QUOTA_RATIO) ElasticSearchIndexer indexer,
                                              QuotaRatioToElasticSearchJson quotaRatioToElasticSearchJson,
-                                             RoutingKey.Factory<User> routingKeyFactory) {
+                                             RoutingKey.Factory<Username> routingKeyFactory) {
         this.indexer = indexer;
         this.quotaRatioToElasticSearchJson = quotaRatioToElasticSearchJson;
         this.routingKeyFactory = routingKeyFactory;
@@ -69,13 +69,13 @@ public class ElasticSearchQuotaMailboxListener implements MailboxListener.GroupM
     }
 
     private void handleEvent(QuotaUsageUpdatedEvent event) throws IOException {
-        User user = event.getUser();
+        Username user = event.getUsername();
         indexer.index(toDocumentId(user),
             quotaRatioToElasticSearchJson.convertToJson(event),
             routingKeyFactory.from(user));
     }
 
-    private DocumentId toDocumentId(User user) {
+    private DocumentId toDocumentId(Username user) {
         return DocumentId.fromString(user.asString());
     }
 }
diff --git a/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioToElasticSearchJson.java b/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioToElasticSearchJson.java
index b9b0937..7bbe25c 100644
--- a/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioToElasticSearchJson.java
+++ b/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioToElasticSearchJson.java
@@ -41,7 +41,7 @@ public class QuotaRatioToElasticSearchJson {
 
     public String convertToJson(QuotaUsageUpdatedEvent event) throws JsonProcessingException {
         return mapper.writeValueAsString(QuotaRatioAsJson.builder()
-                .user(event.getUser().asString())
+                .user(event.getUsername().asString())
                 .domain(event.getQuotaRoot().getDomain().map(Domain::asString))
                 .quotaRatio(QuotaRatio.from(event.getSizeQuota(), event.getCountQuota()))
                 .build());
diff --git a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearcherTest.java b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearcherTest.java
index 8c41989..0209a3b 100644
--- a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearcherTest.java
+++ b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearcherTest.java
@@ -24,7 +24,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import java.util.stream.IntStream;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.core.quota.QuotaSize;
 import org.apache.james.quota.search.Limit;
 import org.apache.james.quota.search.Offset;
@@ -44,7 +44,7 @@ class ElasticSearchQuotaSearcherTest implements QuotaSearcherContract {
 
         IntStream.range(0, userCount)
             .boxed()
-            .map(i -> User.fromLocalPartWithDomain("user" + i, SIMPSON_COM))
+            .map(i -> Username.fromLocalPartWithDomain("user" + i, SIMPSON_COM))
             .forEach(user -> provisionUser(testSystem, user));
         testSystem.await();
 
@@ -64,7 +64,7 @@ class ElasticSearchQuotaSearcherTest implements QuotaSearcherContract {
 
         IntStream.range(0, userCount)
             .boxed()
-            .map(i -> User.fromLocalPartWithDomain("user" + i, SIMPSON_COM))
+            .map(i -> Username.fromLocalPartWithDomain("user" + i, SIMPSON_COM))
             .forEach(user -> provisionUser(testSystem, user));
         testSystem.await();
 
@@ -77,10 +77,10 @@ class ElasticSearchQuotaSearcherTest implements QuotaSearcherContract {
             .hasSize(userCount - 1);
     }
 
-    private void provisionUser(QuotaSearchTestSystem testSystem, User user) {
+    private void provisionUser(QuotaSearchTestSystem testSystem, Username username) {
         try {
-            testSystem.getUsersRepository().addUser(user.asString(), PASSWORD);
-            appendMessage(testSystem, user, withSize(49));
+            testSystem.getUsersRepository().addUser(username.asString(), PASSWORD);
+            appendMessage(testSystem, username, withSize(49));
         } catch (Exception e) {
             throw new RuntimeException(e);
         }
diff --git a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/UserRoutingKeyFactoryTest.java b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/UserRoutingKeyFactoryTest.java
index c1a2102..d1b3cd4 100644
--- a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/UserRoutingKeyFactoryTest.java
+++ b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/UserRoutingKeyFactoryTest.java
@@ -22,13 +22,14 @@ package org.apache.james.quota.search.elasticsearch;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import org.apache.james.backends.es.RoutingKey;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
+
 import org.junit.jupiter.api.Test;
 
 class UserRoutingKeyFactoryTest {
     @Test
     void fromShouldRelyOnUsername() {
-        assertThat(new UserRoutingKeyFactory().from(User.fromUsername("bob")))
+        assertThat(new UserRoutingKeyFactory().from(Username.fromUsername("bob")))
             .isEqualTo(RoutingKey.fromString("bob"));
     }
 }
\ No newline at end of file
diff --git a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListenerTest.java b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListenerTest.java
index 9cdd817..1d1ca3c 100644
--- a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListenerTest.java
+++ b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/events/ElasticSearchQuotaMailboxListenerTest.java
@@ -19,7 +19,7 @@
 
 package org.apache.james.quota.search.elasticsearch.events;
 
-import static org.apache.james.quota.search.QuotaSearchFixture.TestConstants.BOB_USER;
+import static org.apache.james.quota.search.QuotaSearchFixture.TestConstants.BOB_USERNAME;
 import static org.apache.james.quota.search.QuotaSearchFixture.TestConstants.NOW;
 import static org.apache.james.quota.search.QuotaSearchFixture.TestConstants.QUOTAROOT;
 import static org.assertj.core.api.Assertions.assertThat;
@@ -90,7 +90,7 @@ public class ElasticSearchQuotaMailboxListenerTest {
     public void eventShouldIndexEventWhenQuotaEvent() throws Exception {
         quotaMailboxListener.event(EventFactory.quotaUpdated()
             .eventId(EVENT_ID)
-            .user(BOB_USER)
+            .user(BOB_USERNAME)
             .quotaRoot(QUOTAROOT)
             .quotaCount(Counts._52_PERCENT)
             .quotaSize(Sizes._55_PERCENT)
diff --git a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioToElasticSearchJsonTest.java b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioToElasticSearchJsonTest.java
index df9cd7a..7bc1425 100644
--- a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioToElasticSearchJsonTest.java
+++ b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioToElasticSearchJsonTest.java
@@ -26,7 +26,7 @@ import java.time.Instant;
 import java.util.Optional;
 
 import org.apache.james.core.Domain;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.events.Event;
 import org.apache.james.mailbox.events.MailboxListener.QuotaUsageUpdatedEvent;
 import org.apache.james.mailbox.model.QuotaRoot;
@@ -43,7 +43,7 @@ class QuotaRatioToElasticSearchJsonTest {
         String user = "user@domain.org";
         QuotaUsageUpdatedEvent event = EventFactory.quotaUpdated()
             .eventId(EVENT_ID)
-            .user(User.fromUsername(user))
+            .user(Username.fromUsername(user))
             .quotaRoot(QuotaRoot.quotaRoot(user, Optional.of(Domain.of("domain.org"))))
             .quotaCount(QuotaFixture.Counts._52_PERCENT)
             .quotaSize(QuotaFixture.Sizes._55_PERCENT)
@@ -62,7 +62,7 @@ class QuotaRatioToElasticSearchJsonTest {
         String user = "user";
         QuotaUsageUpdatedEvent event = EventFactory.quotaUpdated()
             .eventId(EVENT_ID)
-            .user(User.fromUsername(user))
+            .user(Username.fromUsername(user))
             .quotaRoot(QuotaRoot.quotaRoot(user, Optional.empty()))
             .quotaCount(QuotaFixture.Counts._52_PERCENT)
             .quotaSize(QuotaFixture.Sizes._55_PERCENT)
diff --git a/mailbox/plugin/quota-search-scanning/src/main/java/org/apache/james/quota/search/scanning/ClauseConverter.java b/mailbox/plugin/quota-search-scanning/src/main/java/org/apache/james/quota/search/scanning/ClauseConverter.java
index 8fad3b9..0a9105a 100644
--- a/mailbox/plugin/quota-search-scanning/src/main/java/org/apache/james/quota/search/scanning/ClauseConverter.java
+++ b/mailbox/plugin/quota-search-scanning/src/main/java/org/apache/james/quota/search/scanning/ClauseConverter.java
@@ -25,7 +25,7 @@ import java.util.function.Predicate;
 
 import javax.inject.Inject;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.core.quota.QuotaCount;
 import org.apache.james.core.quota.QuotaSize;
 import org.apache.james.mailbox.exception.MailboxException;
@@ -42,7 +42,7 @@ public class ClauseConverter {
 
     private final UserQuotaRootResolver quotaRootResolver;
     private final QuotaManager quotaManager;
-    private final Map<Class<? extends QuotaClause>, Function<QuotaClause, Predicate<User>>> toPredicates;
+    private final Map<Class<? extends QuotaClause>, Function<QuotaClause, Predicate<Username>>> toPredicates;
 
     @Inject
     public ClauseConverter(UserQuotaRootResolver quotaRootResolver, QuotaManager quotaManager) {
@@ -55,7 +55,7 @@ public class ClauseConverter {
             QuotaClause.HasDomain.class, this::hasDomainToPredicate);
     }
 
-    public Predicate<User> andToPredicate(QuotaClause.And and) {
+    public Predicate<Username> andToPredicate(QuotaClause.And and) {
         return and.getClauses()
             .stream()
             .map(this::toPredicate)
@@ -63,36 +63,36 @@ public class ClauseConverter {
             .orElse(user -> true);
     }
 
-    private Predicate<User> toPredicate(QuotaClause clause) {
+    private Predicate<Username> toPredicate(QuotaClause clause) {
         return toPredicates.get(clause.getClass())
             .apply(clause);
     }
 
-    private Predicate<User> moreThanToPredicate(QuotaClause clause) {
+    private Predicate<Username> moreThanToPredicate(QuotaClause clause) {
         QuotaClause.MoreThan moreThan = (QuotaClause.MoreThan) clause;
         return user -> retrieveUserRatio(user) >= moreThan.getQuotaBoundary().getRatio();
     }
 
-    private Predicate<User> lessThanToPredicate(QuotaClause clause) {
+    private Predicate<Username> lessThanToPredicate(QuotaClause clause) {
         QuotaClause.LessThan lessThan = (QuotaClause.LessThan) clause;
         return user -> retrieveUserRatio(user) <= lessThan.getQuotaBoundary().getRatio();
     }
 
-    private Predicate<User> hasDomainToPredicate(QuotaClause clause) {
+    private Predicate<Username> hasDomainToPredicate(QuotaClause clause) {
         QuotaClause.HasDomain hasDomain = (QuotaClause.HasDomain) clause;
         return user -> user.getDomainPart()
             .map(hasDomain.getDomain()::equals)
             .orElse(false);
     }
 
-    private Predicate<User> andToPredicate(QuotaClause clause) {
+    private Predicate<Username> andToPredicate(QuotaClause clause) {
         QuotaClause.And and = (QuotaClause.And) clause;
         return andToPredicate(and);
     }
 
-    private double retrieveUserRatio(User user) {
+    private double retrieveUserRatio(Username username) {
         try {
-            QuotaRoot quotaRoot = quotaRootResolver.forUser(user);
+            QuotaRoot quotaRoot = quotaRootResolver.forUser(username);
             Quota<QuotaSize> storageQuota = quotaManager.getStorageQuota(quotaRoot);
             Quota<QuotaCount> messageQuota = quotaManager.getMessageQuota(quotaRoot);
 
diff --git a/mailbox/plugin/quota-search-scanning/src/main/java/org/apache/james/quota/search/scanning/ScanningQuotaSearcher.java b/mailbox/plugin/quota-search-scanning/src/main/java/org/apache/james/quota/search/scanning/ScanningQuotaSearcher.java
index 9aaf2c2..53f87ad 100644
--- a/mailbox/plugin/quota-search-scanning/src/main/java/org/apache/james/quota/search/scanning/ScanningQuotaSearcher.java
+++ b/mailbox/plugin/quota-search-scanning/src/main/java/org/apache/james/quota/search/scanning/ScanningQuotaSearcher.java
@@ -26,7 +26,7 @@ import java.util.stream.Stream;
 
 import javax.inject.Inject;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.quota.search.Limit;
 import org.apache.james.quota.search.QuotaQuery;
 import org.apache.james.quota.search.QuotaSearcher;
@@ -47,18 +47,18 @@ public class ScanningQuotaSearcher implements QuotaSearcher {
     }
 
     @Override
-    public List<User> search(QuotaQuery query) {
-        Stream<User> results = Iterators.toStream(listUsers())
-            .map(User::fromUsername)
+    public List<Username> search(QuotaQuery query) {
+        Stream<Username> results = Iterators.toStream(listUsers())
+            .map(Username::fromUsername)
             .filter(clauseConverter.andToPredicate(query.getClause()))
-            .sorted(Comparator.comparing(User::asString))
+            .sorted(Comparator.comparing(Username::asString))
             .skip(query.getOffset().getValue());
 
         return limit(results, query.getLimit())
             .collect(Guavate.toImmutableList());
     }
 
-    private Stream<User> limit(Stream<User> results, Limit limit) {
+    private Stream<Username> limit(Stream<Username> results, Limit limit) {
         return limit.getValue()
             .map(results::limit)
             .orElse(results);
diff --git a/mailbox/plugin/quota-search/src/main/java/org/apache/james/quota/search/QuotaSearcher.java b/mailbox/plugin/quota-search/src/main/java/org/apache/james/quota/search/QuotaSearcher.java
index 63322db..0492754 100644
--- a/mailbox/plugin/quota-search/src/main/java/org/apache/james/quota/search/QuotaSearcher.java
+++ b/mailbox/plugin/quota-search/src/main/java/org/apache/james/quota/search/QuotaSearcher.java
@@ -20,12 +20,12 @@ package org.apache.james.quota.search;
 
 import java.util.List;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 
 public interface QuotaSearcher {
-    List<User> search(QuotaQuery query);
+    List<Username> search(QuotaQuery query);
 
-    default List<User> search(QuotaQuery.Builder query) {
+    default List<Username> search(QuotaQuery.Builder query) {
         return search(query.build());
     }
 }
diff --git a/mailbox/plugin/quota-search/src/test/java/org/apache/james/quota/search/QuotaSearchFixture.java b/mailbox/plugin/quota-search/src/test/java/org/apache/james/quota/search/QuotaSearchFixture.java
index c291bfa..54b97fd 100644
--- a/mailbox/plugin/quota-search/src/test/java/org/apache/james/quota/search/QuotaSearchFixture.java
+++ b/mailbox/plugin/quota-search/src/test/java/org/apache/james/quota/search/QuotaSearchFixture.java
@@ -22,14 +22,14 @@ package org.apache.james.quota.search;
 import java.time.Instant;
 import java.util.Optional;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.model.QuotaRoot;
 
 public interface QuotaSearchFixture {
 
     interface TestConstants {
         String BOB = "bob@domain";
-        User BOB_USER = User.fromUsername(BOB);
+        Username BOB_USERNAME = Username.fromUsername(BOB);
         Instant NOW = Instant.now();
         QuotaRoot QUOTAROOT = QuotaRoot.quotaRoot("any", Optional.empty());
     }
diff --git a/mailbox/plugin/quota-search/src/test/java/org/apache/james/quota/search/QuotaSearcherContract.java b/mailbox/plugin/quota-search/src/test/java/org/apache/james/quota/search/QuotaSearcherContract.java
index 5463f65..a79a7f3 100644
--- a/mailbox/plugin/quota-search/src/test/java/org/apache/james/quota/search/QuotaSearcherContract.java
+++ b/mailbox/plugin/quota-search/src/test/java/org/apache/james/quota/search/QuotaSearcherContract.java
@@ -31,7 +31,7 @@ import java.nio.charset.StandardCharsets;
 
 import org.apache.james.core.CoreFixture.Users.Alphabet;
 import org.apache.james.core.CoreFixture.Users.Simpson;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.core.quota.QuotaSize;
 import org.apache.james.domainlist.api.DomainListException;
 import org.apache.james.mailbox.MailboxManager;
@@ -264,9 +264,9 @@ public interface QuotaSearcherContract {
             .containsExactly(Alphabet.ABA, Alphabet.ABB);
     }
 
-    default void appendMessage(QuotaSearchTestSystem testSystem, User user, MessageManager.AppendCommand appendCommand) throws MailboxException, UsersRepositoryException, DomainListException {
+    default void appendMessage(QuotaSearchTestSystem testSystem, Username username, MessageManager.AppendCommand appendCommand) throws MailboxException, UsersRepositoryException, DomainListException {
         MailboxManager mailboxManager = testSystem.getMailboxManager();
-        MailboxSession session = mailboxManager.createSystemSession(user.asString());
+        MailboxSession session = mailboxManager.createSystemSession(username.asString());
 
         MailboxPath mailboxPath = MailboxPath.inbox(session);
         mailboxManager.createMailbox(mailboxPath, session);
diff --git a/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassin.java b/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassin.java
index a654666..ec03b1f 100644
--- a/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassin.java
+++ b/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassin.java
@@ -23,7 +23,7 @@ import java.util.List;
 
 import javax.inject.Inject;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.metrics.api.MetricFactory;
 import org.apache.james.spamassassin.SpamAssassinInvoker;
 import org.apache.james.util.Host;
@@ -41,21 +41,21 @@ public class SpamAssassin {
         this.spamAssassinConfiguration = spamAssassinConfiguration;
     }
 
-    public void learnSpam(List<InputStream> messages, User user) {
+    public void learnSpam(List<InputStream> messages, Username username) {
         if (spamAssassinConfiguration.isEnable()) {
             Host host = spamAssassinConfiguration.getHost().get();
             SpamAssassinInvoker invoker = new SpamAssassinInvoker(metricFactory, host.getHostName(), host.getPort());
             messages
-                .forEach(Throwing.consumer(message -> invoker.learnAsSpam(message, user)));
+                .forEach(Throwing.consumer(message -> invoker.learnAsSpam(message, username)));
         }
     }
 
-    public void learnHam(List<InputStream> messages, User user) {
+    public void learnHam(List<InputStream> messages, Username username) {
         if (spamAssassinConfiguration.isEnable()) {
             Host host = spamAssassinConfiguration.getHost().get();
             SpamAssassinInvoker invoker = new SpamAssassinInvoker(metricFactory, host.getHostName(), host.getPort());
             messages
-                .forEach(Throwing.consumer(message -> invoker.learnAsHam(message, user)));
+                .forEach(Throwing.consumer(message -> invoker.learnAsHam(message, username)));
         }
     }
 }
diff --git a/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassinListener.java b/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassinListener.java
index 5801253..45a1685 100644
--- a/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassinListener.java
+++ b/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassinListener.java
@@ -110,7 +110,7 @@ public class SpamAssassinListener implements SpamEventListener {
                 .flatMap(range -> retrieveMessages(messageMapper, mailbox, range))
                 .map(Throwing.function(MailboxMessage::getFullContent))
                 .collect(Guavate.toImmutableList());
-            spamAssassin.learnHam(contents, event.getUser());
+            spamAssassin.learnHam(contents, event.getUsername());
         }
     }
 
@@ -118,11 +118,11 @@ public class SpamAssassinListener implements SpamEventListener {
         if (isMessageMovedToSpamMailbox(messageMoveEvent)) {
             LOGGER.debug("Spam event detected");
             ImmutableList<InputStream> messages = retrieveMessages(messageMoveEvent, session);
-            spamAssassin.learnSpam(messages, event.getUser());
+            spamAssassin.learnSpam(messages, event.getUsername());
         }
         if (isMessageMovedOutOfSpamMailbox(messageMoveEvent)) {
             ImmutableList<InputStream> messages = retrieveMessages(messageMoveEvent, session);
-            spamAssassin.learnHam(messages, event.getUser());
+            spamAssassin.learnHam(messages, event.getUsername());
         }
     }
 
@@ -137,7 +137,7 @@ public class SpamAssassinListener implements SpamEventListener {
 
     private boolean isAppendedToInbox(Added addedEvent) {
         try {
-            return systemMailboxesProvider.findMailbox(Role.INBOX, addedEvent.getUser())
+            return systemMailboxesProvider.findMailbox(Role.INBOX, addedEvent.getUsername())
                 .getId().equals(addedEvent.getMailboxId());
         } catch (MailboxException e) {
             LOGGER.warn("Could not resolve Inbox mailbox", e);
@@ -156,7 +156,7 @@ public class SpamAssassinListener implements SpamEventListener {
     @VisibleForTesting
     boolean isMessageMovedToSpamMailbox(MessageMoveEvent event) {
         try {
-            MailboxId spamMailboxId = systemMailboxesProvider.findMailbox(Role.SPAM, event.getUser()).getId();
+            MailboxId spamMailboxId = systemMailboxesProvider.findMailbox(Role.SPAM, event.getUsername()).getId();
 
             return event.getMessageMoves().addedMailboxIds().contains(spamMailboxId);
         } catch (MailboxException e) {
@@ -168,8 +168,8 @@ public class SpamAssassinListener implements SpamEventListener {
     @VisibleForTesting
     boolean isMessageMovedOutOfSpamMailbox(MessageMoveEvent event) {
         try {
-            MailboxId spamMailboxId = systemMailboxesProvider.findMailbox(Role.SPAM, event.getUser()).getId();
-            MailboxId trashMailboxId = systemMailboxesProvider.findMailbox(Role.TRASH, event.getUser()).getId();
+            MailboxId spamMailboxId = systemMailboxesProvider.findMailbox(Role.SPAM, event.getUsername()).getId();
+            MailboxId trashMailboxId = systemMailboxesProvider.findMailbox(Role.TRASH, event.getUsername()).getId();
 
             return event.getMessageMoves().removedMailboxIds().contains(spamMailboxId)
                 && !event.getMessageMoves().addedMailboxIds().contains(trashMailboxId);
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreAttachmentManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreAttachmentManager.java
index 3fbb36c..ea0902b 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreAttachmentManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreAttachmentManager.java
@@ -24,7 +24,7 @@ import java.util.List;
 
 import javax.inject.Inject;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.AttachmentManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageIdManager;
@@ -34,7 +34,7 @@ import org.apache.james.mailbox.model.Attachment;
 import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.store.mail.AttachmentMapperFactory;
-import org.apache.james.mailbox.store.mail.model.Username;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -77,7 +77,7 @@ public class StoreAttachmentManager implements AttachmentManager {
     @Override
     public void storeAttachment(Attachment attachment, MailboxSession mailboxSession) throws MailboxException {
         attachmentMapperFactory.getAttachmentMapper(mailboxSession)
-            .storeAttachmentForOwner(attachment, Username.fromMailboxSession(mailboxSession));
+            .storeAttachmentForOwner(attachment, org.apache.james.mailbox.store.mail.model.Username.fromMailboxSession(mailboxSession));
     }
 
     @Override
@@ -103,10 +103,10 @@ public class StoreAttachmentManager implements AttachmentManager {
     }
 
     private boolean isExplicitlyAOwner(AttachmentId attachmentId, MailboxSession mailboxSession) throws MailboxException {
-        Collection<Username> explicitOwners = attachmentMapperFactory.getAttachmentMapper(mailboxSession)
+        Collection<org.apache.james.mailbox.store.mail.model.Username> explicitOwners = attachmentMapperFactory.getAttachmentMapper(mailboxSession)
             .getOwners(attachmentId);
         return explicitOwners.stream()
-            .anyMatch(username -> mailboxSession.getUser().equals(User.fromUsername(username.getValue())));
+            .anyMatch(username -> mailboxSession.getUser().equals(Username.fromUsername(username.getValue())));
     }
 
     private Collection<MessageId> getRelatedMessageIds(AttachmentId attachmentId, MailboxSession mailboxSession) throws MailboxException {
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreRightManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreRightManager.java
index 78a4bfd..d5340b8 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreRightManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreRightManager.java
@@ -26,7 +26,7 @@ import javax.inject.Inject;
 import javax.mail.Flags;
 
 import org.apache.james.core.Domain;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.RightManager;
 import org.apache.james.mailbox.acl.ACLDiff;
@@ -101,12 +101,12 @@ public class StoreRightManager implements RightManager {
     }
 
     public Rfc4314Rights myRights(Mailbox mailbox, MailboxSession session) throws UnsupportedRightException {
-        User user = session.getUser();
+        Username username = session.getUser();
 
-        return Optional.ofNullable(user)
+        return Optional.ofNullable(username)
             .map(Throwing.function(value ->
                 aclResolver.resolveRights(
-                    user.asString(),
+                    username.asString(),
                     groupMembershipResolver,
                     mailbox.getACL(),
                     mailbox.getUser(),
@@ -217,8 +217,8 @@ public class StoreRightManager implements RightManager {
 
     @VisibleForTesting
     boolean areDomainsDifferent(String user, String otherUser) {
-        Optional<Domain> domain = User.fromUsername(user).getDomainPart();
-        Optional<Domain> otherDomain = User.fromUsername(otherUser).getDomainPart();
+        Optional<Domain> domain = Username.fromUsername(user).getDomainPart();
+        Optional<Domain> otherDomain = Username.fromUsername(otherUser).getDomainPart();
         return !domain.equals(otherDomain);
     }
 
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/SystemMailboxesProviderImpl.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/SystemMailboxesProviderImpl.java
index 977a63a..9cbc59c 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/SystemMailboxesProviderImpl.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/SystemMailboxesProviderImpl.java
@@ -23,7 +23,7 @@ import java.util.stream.Stream;
 
 import javax.inject.Inject;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
@@ -51,13 +51,13 @@ public class SystemMailboxesProviderImpl implements SystemMailboxesProvider {
     }
 
     @Override
-    public Stream<MessageManager> getMailboxByRole(Role aRole, User user) throws MailboxException {
-        MailboxSession session = mailboxManager.createSystemSession(user.asString());
-        MailboxPath mailboxPath = MailboxPath.forUser(user.asString(), aRole.getDefaultMailbox());
+    public Stream<MessageManager> getMailboxByRole(Role aRole, Username username) throws MailboxException {
+        MailboxSession session = mailboxManager.createSystemSession(username.asString());
+        MailboxPath mailboxPath = MailboxPath.forUser(username.asString(), aRole.getDefaultMailbox());
         try {
             return Stream.of(mailboxManager.getMailbox(mailboxPath, session));
         } catch (MailboxNotFoundException e) {
-            return searchMessageManagerByMailboxRole(aRole, user);
+            return searchMessageManagerByMailboxRole(aRole, username);
         }
     }
 
@@ -67,8 +67,8 @@ public class SystemMailboxesProviderImpl implements SystemMailboxesProvider {
             .orElse(false);
     }
 
-    private Stream<MessageManager> searchMessageManagerByMailboxRole(Role aRole, User user) throws MailboxException {
-        MailboxSession session = mailboxManager.createSystemSession(user.asString());
+    private Stream<MessageManager> searchMessageManagerByMailboxRole(Role aRole, Username username) throws MailboxException {
+        MailboxSession session = mailboxManager.createSystemSession(username.asString());
         ThrowingFunction<MailboxPath, MessageManager> loadMailbox = path -> mailboxManager.getMailbox(path, session);
         MailboxQuery mailboxQuery = MailboxQuery.privateMailboxesBuilder(session)
             .expression(new PrefixedWildcard(aRole.getDefaultMailbox()))
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/EventFactory.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/EventFactory.java
index 28969e8..e2dd560 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/EventFactory.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/EventFactory.java
@@ -24,7 +24,7 @@ import java.util.Iterator;
 import java.util.Map;
 import java.util.SortedMap;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.core.quota.QuotaCount;
 import org.apache.james.core.quota.QuotaSize;
 import org.apache.james.mailbox.MailboxSession;
@@ -59,7 +59,7 @@ public class EventFactory {
 
     @FunctionalInterface
     public interface RequireUser<T> {
-        T user(User user);
+        T user(Username username);
     }
 
     @FunctionalInterface
@@ -184,24 +184,24 @@ public class EventFactory {
         private final Event.EventId eventId;
         private final MailboxPath path;
         private final MailboxId mailboxId;
-        private final User user;
+        private final Username username;
         private final MailboxSession.SessionId sessionId;
 
-        MailboxAddedFinalStage(Event.EventId eventId, MailboxPath path, MailboxId mailboxId, User user, MailboxSession.SessionId sessionId) {
+        MailboxAddedFinalStage(Event.EventId eventId, MailboxPath path, MailboxId mailboxId, Username username, MailboxSession.SessionId sessionId) {
             this.eventId = eventId;
             this.path = path;
             this.mailboxId = mailboxId;
-            this.user = user;
+            this.username = username;
             this.sessionId = sessionId;
         }
 
         public MailboxListener.MailboxAdded build() {
             Preconditions.checkNotNull(path);
             Preconditions.checkNotNull(mailboxId);
-            Preconditions.checkNotNull(user);
+            Preconditions.checkNotNull(username);
             Preconditions.checkNotNull(sessionId);
 
-            return new MailboxListener.MailboxAdded(sessionId, user, path, mailboxId, eventId);
+            return new MailboxListener.MailboxAdded(sessionId, username, path, mailboxId, eventId);
         }
     }
 
@@ -209,15 +209,15 @@ public class EventFactory {
         private final Event.EventId eventId;
         private final MailboxPath path;
         private final MailboxId mailboxId;
-        private final User user;
+        private final Username username;
         private final MailboxSession.SessionId sessionId;
         private final ImmutableSortedMap<MessageUid, MessageMetaData> metaData;
 
-        AddedFinalStage(Event.EventId eventId, MailboxPath path, MailboxId mailboxId, User user, MailboxSession.SessionId sessionId, Map<MessageUid, MessageMetaData> metaData) {
+        AddedFinalStage(Event.EventId eventId, MailboxPath path, MailboxId mailboxId, Username username, MailboxSession.SessionId sessionId, Map<MessageUid, MessageMetaData> metaData) {
             this.eventId = eventId;
             this.path = path;
             this.mailboxId = mailboxId;
-            this.user = user;
+            this.username = username;
             this.sessionId = sessionId;
             this.metaData = ImmutableSortedMap.copyOf(metaData);
         }
@@ -225,11 +225,11 @@ public class EventFactory {
         public MailboxListener.Added build() {
             Preconditions.checkNotNull(path);
             Preconditions.checkNotNull(mailboxId);
-            Preconditions.checkNotNull(user);
+            Preconditions.checkNotNull(username);
             Preconditions.checkNotNull(sessionId);
             Preconditions.checkNotNull(metaData);
 
-            return new MailboxListener.Added(sessionId, user, path, mailboxId, metaData, eventId);
+            return new MailboxListener.Added(sessionId, username, path, mailboxId, metaData, eventId);
         }
     }
 
@@ -237,15 +237,15 @@ public class EventFactory {
         private final Event.EventId eventId;
         private final MailboxPath path;
         private final MailboxId mailboxId;
-        private final User user;
+        private final Username username;
         private final MailboxSession.SessionId sessionId;
         private final ImmutableSortedMap<MessageUid, MessageMetaData> metaData;
 
-        ExpungedFinalStage(Event.EventId eventId, MailboxPath path, MailboxId mailboxId, User user, MailboxSession.SessionId sessionId, Map<MessageUid, MessageMetaData> metaData) {
+        ExpungedFinalStage(Event.EventId eventId, MailboxPath path, MailboxId mailboxId, Username username, MailboxSession.SessionId sessionId, Map<MessageUid, MessageMetaData> metaData) {
             this.eventId = eventId;
             this.path = path;
             this.mailboxId = mailboxId;
-            this.user = user;
+            this.username = username;
             this.sessionId = sessionId;
             this.metaData = ImmutableSortedMap.copyOf(metaData);
         }
@@ -253,11 +253,11 @@ public class EventFactory {
         public MailboxListener.Expunged build() {
             Preconditions.checkNotNull(path);
             Preconditions.checkNotNull(mailboxId);
-            Preconditions.checkNotNull(user);
+            Preconditions.checkNotNull(username);
             Preconditions.checkNotNull(sessionId);
             Preconditions.checkNotNull(metaData);
 
-            return new MailboxListener.Expunged(sessionId, user, path, mailboxId, metaData, eventId);
+            return new MailboxListener.Expunged(sessionId, username, path, mailboxId, metaData, eventId);
         }
     }
 
@@ -265,15 +265,15 @@ public class EventFactory {
         private final Event.EventId eventId;
         private final MailboxPath path;
         private final MailboxId mailboxId;
-        private final User user;
+        private final Username username;
         private final MailboxSession.SessionId sessionId;
         private final ACLDiff aclDiff;
 
-        MailboxAclUpdatedFinalStage(Event.EventId eventId, MailboxPath path, MailboxId mailboxId, User user, MailboxSession.SessionId sessionId, ACLDiff aclDiff) {
+        MailboxAclUpdatedFinalStage(Event.EventId eventId, MailboxPath path, MailboxId mailboxId, Username username, MailboxSession.SessionId sessionId, ACLDiff aclDiff) {
             this.eventId = eventId;
             this.path = path;
             this.mailboxId = mailboxId;
-            this.user = user;
+            this.username = username;
             this.sessionId = sessionId;
             this.aclDiff = aclDiff;
         }
@@ -281,11 +281,11 @@ public class EventFactory {
         public MailboxListener.MailboxACLUpdated build() {
             Preconditions.checkNotNull(path);
             Preconditions.checkNotNull(mailboxId);
-            Preconditions.checkNotNull(user);
+            Preconditions.checkNotNull(username);
             Preconditions.checkNotNull(sessionId);
             Preconditions.checkNotNull(aclDiff);
 
-            return new MailboxListener.MailboxACLUpdated(sessionId, user, path, aclDiff, mailboxId, eventId);
+            return new MailboxListener.MailboxACLUpdated(sessionId, username, path, aclDiff, mailboxId, eventId);
         }
     }
 
@@ -293,17 +293,17 @@ public class EventFactory {
         private final Event.EventId eventId;
         private final MailboxPath path;
         private final MailboxId mailboxId;
-        private final User user;
+        private final Username username;
         private final MailboxSession.SessionId sessionId;
         private final QuotaRoot quotaRoot;
         private final QuotaCount deletedMessageCount;
         private final QuotaSize totalDeletedSize;
 
-        MailboxDeletionFinalStage(Event.EventId eventId, MailboxPath path, MailboxId mailboxId, User user, MailboxSession.SessionId sessionId, QuotaRoot quotaRoot, QuotaCount deletedMessageCount, QuotaSize totalDeletedSize) {
+        MailboxDeletionFinalStage(Event.EventId eventId, MailboxPath path, MailboxId mailboxId, Username username, MailboxSession.SessionId sessionId, QuotaRoot quotaRoot, QuotaCount deletedMessageCount, QuotaSize totalDeletedSize) {
             this.eventId = eventId;
             this.path = path;
             this.mailboxId = mailboxId;
-            this.user = user;
+            this.username = username;
             this.sessionId = sessionId;
             this.quotaRoot = quotaRoot;
             this.deletedMessageCount = deletedMessageCount;
@@ -313,13 +313,13 @@ public class EventFactory {
         public MailboxListener.MailboxDeletion build() {
             Preconditions.checkNotNull(path);
             Preconditions.checkNotNull(mailboxId);
-            Preconditions.checkNotNull(user);
+            Preconditions.checkNotNull(username);
             Preconditions.checkNotNull(sessionId);
             Preconditions.checkNotNull(quotaRoot);
             Preconditions.checkNotNull(deletedMessageCount);
             Preconditions.checkNotNull(totalDeletedSize);
 
-            return new MailboxListener.MailboxDeletion(sessionId, user, path, quotaRoot, deletedMessageCount, totalDeletedSize, mailboxId, eventId);
+            return new MailboxListener.MailboxDeletion(sessionId, username, path, quotaRoot, deletedMessageCount, totalDeletedSize, mailboxId, eventId);
         }
     }
 
@@ -327,15 +327,15 @@ public class EventFactory {
         private final Event.EventId eventId;
         private final MailboxPath oldPath;
         private final MailboxId mailboxId;
-        private final User user;
+        private final Username username;
         private final MailboxSession.SessionId sessionId;
         private final MailboxPath newPath;
 
-        MailboxRenamedFinalStage(Event.EventId eventId, MailboxPath oldPath, MailboxId mailboxId, User user, MailboxSession.SessionId sessionId, MailboxPath newPath) {
+        MailboxRenamedFinalStage(Event.EventId eventId, MailboxPath oldPath, MailboxId mailboxId, Username username, MailboxSession.SessionId sessionId, MailboxPath newPath) {
             this.eventId = eventId;
             this.oldPath = oldPath;
             this.mailboxId = mailboxId;
-            this.user = user;
+            this.username = username;
             this.sessionId = sessionId;
             this.newPath = newPath;
         }
@@ -345,10 +345,10 @@ public class EventFactory {
             Preconditions.checkNotNull(oldPath);
             Preconditions.checkNotNull(newPath);
             Preconditions.checkNotNull(mailboxId);
-            Preconditions.checkNotNull(user);
+            Preconditions.checkNotNull(username);
             Preconditions.checkNotNull(sessionId);
 
-            return new MailboxListener.MailboxRenamed(sessionId, user, oldPath, mailboxId, newPath, eventId);
+            return new MailboxListener.MailboxRenamed(sessionId, username, oldPath, mailboxId, newPath, eventId);
         }
     }
 
@@ -356,15 +356,15 @@ public class EventFactory {
         private final Event.EventId eventId;
         private final MailboxPath path;
         private final MailboxId mailboxId;
-        private final User user;
+        private final Username username;
         private final MailboxSession.SessionId sessionId;
         private final ImmutableList<UpdatedFlags> updatedFlags;
 
-        FlagsUpdatedFinalStage(Event.EventId eventId, MailboxPath path, MailboxId mailboxId, User user, MailboxSession.SessionId sessionId, ImmutableList<UpdatedFlags> updatedFlags) {
+        FlagsUpdatedFinalStage(Event.EventId eventId, MailboxPath path, MailboxId mailboxId, Username username, MailboxSession.SessionId sessionId, ImmutableList<UpdatedFlags> updatedFlags) {
             this.eventId = eventId;
             this.path = path;
             this.mailboxId = mailboxId;
-            this.user = user;
+            this.username = username;
             this.sessionId = sessionId;
             this.updatedFlags = updatedFlags;
         }
@@ -373,25 +373,25 @@ public class EventFactory {
         public MailboxListener.FlagsUpdated build() {
             Preconditions.checkNotNull(path);
             Preconditions.checkNotNull(mailboxId);
-            Preconditions.checkNotNull(user);
+            Preconditions.checkNotNull(username);
             Preconditions.checkNotNull(sessionId);
             Preconditions.checkNotNull(updatedFlags);
 
-            return new MailboxListener.FlagsUpdated(sessionId, user, path, mailboxId, updatedFlags, eventId);
+            return new MailboxListener.FlagsUpdated(sessionId, username, path, mailboxId, updatedFlags, eventId);
         }
     }
 
     public static final class QuotaUsageUpdatedFinalStage {
         private final Event.EventId eventId;
-        private final User user;
+        private final Username username;
         private final QuotaRoot quotaRoot;
         private final Quota<QuotaCount> countQuota;
         private final Quota<QuotaSize> sizeQuota;
         private final Instant instant;
 
-        QuotaUsageUpdatedFinalStage(Event.EventId eventId, User user, QuotaRoot quotaRoot, Quota<QuotaCount> countQuota, Quota<QuotaSize> sizeQuota, Instant instant) {
+        QuotaUsageUpdatedFinalStage(Event.EventId eventId, Username username, QuotaRoot quotaRoot, Quota<QuotaCount> countQuota, Quota<QuotaSize> sizeQuota, Instant instant) {
             this.eventId = eventId;
-            this.user = user;
+            this.username = username;
             this.quotaRoot = quotaRoot;
             this.countQuota = countQuota;
             this.sizeQuota = sizeQuota;
@@ -399,7 +399,7 @@ public class EventFactory {
         }
 
         public MailboxListener.QuotaUsageUpdatedEvent build() {
-            return new MailboxListener.QuotaUsageUpdatedEvent(eventId, user, quotaRoot, countQuota, sizeQuota, instant);
+            return new MailboxListener.QuotaUsageUpdatedEvent(eventId, username, quotaRoot, countQuota, sizeQuota, instant);
         }
     }
 
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxAnnotationListener.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxAnnotationListener.java
index bbc5302..1b6cd37 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxAnnotationListener.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxAnnotationListener.java
@@ -57,7 +57,7 @@ public class MailboxAnnotationListener implements MailboxListener.GroupMailboxLi
     @Override
     public void event(Event event) throws MailboxException {
         if (event instanceof MailboxDeletion) {
-            MailboxSession mailboxSession = sessionProvider.createSystemSession(event.getUser().asString());
+            MailboxSession mailboxSession = sessionProvider.createSystemSession(event.getUsername().asString());
             AnnotationMapper annotationMapper = mailboxSessionMapperFactory.getAnnotationMapper(mailboxSession);
             MailboxId mailboxId = ((MailboxDeletion) event).getMailboxId();
 
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolver.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolver.java
index 3dcb7af..747a5c5 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolver.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolver.java
@@ -24,7 +24,7 @@ import java.util.Optional;
 
 import javax.inject.Inject;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.Mailbox;
@@ -47,9 +47,9 @@ public class DefaultUserQuotaRootResolver implements UserQuotaRootResolver {
         @Override
         public QuotaRoot fromString(String serializedQuotaRoot) throws MailboxException {
             List<String> parts = toParts(serializedQuotaRoot);
-            User user = User.fromUsername(parts.get(1));
+            Username username = Username.fromUsername(parts.get(1));
 
-            return QuotaRoot.quotaRoot(serializedQuotaRoot, user.getDomainPart());
+            return QuotaRoot.quotaRoot(serializedQuotaRoot, username.getDomainPart());
         }
 
         private List<String> toParts(String serializedQuotaRoot) throws MailboxException {
@@ -74,9 +74,9 @@ public class DefaultUserQuotaRootResolver implements UserQuotaRootResolver {
     }
 
     @Override
-    public QuotaRoot forUser(User user) {
-        return QuotaRoot.quotaRoot(MailboxConstants.USER_NAMESPACE + SEPARATOR + user.asString(),
-            user.getDomainPart());
+    public QuotaRoot forUser(Username username) {
+        return QuotaRoot.quotaRoot(MailboxConstants.USER_NAMESPACE + SEPARATOR + username.asString(),
+            username.getDomainPart());
     }
 
     @Override
@@ -85,7 +85,7 @@ public class DefaultUserQuotaRootResolver implements UserQuotaRootResolver {
         return Optional.ofNullable(mailboxPath.getUser())
                 .map(user -> {
                     Preconditions.checkArgument(!mailboxPath.getUser().contains(SEPARATOR), "Username should not contain " + SEPARATOR);
-                    return User.fromUsername(mailboxPath.getUser());
+                    return Username.fromUsername(mailboxPath.getUser());
                 })
                 .map(user -> QuotaRoot.quotaRoot(mailboxPath.getNamespace() + SEPARATOR + user.asString(), user.getDomainPart()))
                 .orElseGet(() -> QuotaRoot.quotaRoot(mailboxPath.getNamespace(), Optional.empty()));
@@ -94,13 +94,13 @@ public class DefaultUserQuotaRootResolver implements UserQuotaRootResolver {
     @Override
     public QuotaRoot getQuotaRoot(MailboxId mailboxId) throws MailboxException {
         MailboxSession session = sessionProvider.createSystemSession("DefaultUserQuotaRootResolver");
-        User user = User.fromUsername(
+        Username username = Username.fromUsername(
             factory.getMailboxMapper(session)
                 .findMailboxById(mailboxId)
                 .generateAssociatedPath()
                 .getUser());
 
-        return forUser(user);
+        return forUser(username);
     }
 
     @Override
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdater.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdater.java
index 0180284..13171cb 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdater.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdater.java
@@ -92,7 +92,7 @@ public class ListeningCurrentQuotaUpdater implements MailboxListener.GroupMailbo
         eventBus.dispatch(
             EventFactory.quotaUpdated()
                 .randomEventId()
-                .user(expunged.getUser())
+                .user(expunged.getUsername())
                 .quotaRoot(quotaRoot)
                 .quotaCount(quotaManager.getMessageQuota(quotaRoot))
                 .quotaSize(quotaManager.getStorageQuota(quotaRoot))
@@ -111,7 +111,7 @@ public class ListeningCurrentQuotaUpdater implements MailboxListener.GroupMailbo
         eventBus.dispatch(
             EventFactory.quotaUpdated()
                 .randomEventId()
-                .user(added.getUser())
+                .user(added.getUsername())
                 .quotaRoot(quotaRoot)
                 .quotaCount(quotaManager.getMessageQuota(quotaRoot))
                 .quotaSize(quotaManager.getStorageQuota(quotaRoot))
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java
index 77fa42c..06dfecf 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java
@@ -70,7 +70,7 @@ public abstract class ListeningMessageSearchIndex implements MessageSearchIndex,
     @Override
     public void event(Event event) throws Exception {
         handleMailboxEvent(event,
-            sessionProvider.createSystemSession(event.getUser().asString()),
+            sessionProvider.createSystemSession(event.getUsername().asString()),
             (MailboxEvent) event);
     }
 
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/MailboxAnnotationListenerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/MailboxAnnotationListenerTest.java
index c189ff5..0f97e65 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/MailboxAnnotationListenerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/MailboxAnnotationListenerTest.java
@@ -91,7 +91,7 @@ public class MailboxAnnotationListenerTest {
             .quotaSize(QuotaSize.size(456))
             .build();
 
-        when(sessionProvider.createSystemSession(deleteEvent.getUser().asString()))
+        when(sessionProvider.createSystemSession(deleteEvent.getUsername().asString()))
             .thenReturn(mailboxSession);
         when(mailboxSessionMapperFactory.getAnnotationMapper(eq(mailboxSession))).thenReturn(annotationMapper);
     }
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdaterTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdaterTest.java
index 1ab9ee1..b52655f 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdaterTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdaterTest.java
@@ -34,7 +34,7 @@ import java.util.Optional;
 
 import javax.mail.Flags;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.core.quota.QuotaCount;
 import org.apache.james.core.quota.QuotaSize;
 import org.apache.james.mailbox.MessageUid;
@@ -61,7 +61,7 @@ public class ListeningCurrentQuotaUpdaterTest {
     private static final int SIZE = 45;
     private static final MailboxId MAILBOX_ID = TestId.of(42);
     private static final String BENWA = "benwa";
-    private static final User USER_BENWA = User.fromUsername(BENWA);
+    private static final Username USERNAME_BENWA = Username.fromUsername(BENWA);
     private static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot(BENWA, Optional.empty());
 
     private StoreCurrentQuotaManager mockedCurrentQuotaManager;
@@ -91,7 +91,7 @@ public class ListeningCurrentQuotaUpdaterTest {
         when(added.getMetaData(MessageUid.of(36))).thenReturn(new MessageMetaData(MessageUid.of(36),0,new Flags(), SIZE, new Date(), new DefaultMessageId()));
         when(added.getMetaData(MessageUid.of(38))).thenReturn(new MessageMetaData(MessageUid.of(38),0,new Flags(), SIZE, new Date(), new DefaultMessageId()));
         when(added.getUids()).thenReturn(Lists.newArrayList(MessageUid.of(36), MessageUid.of(38)));
-        when(added.getUser()).thenReturn(USER_BENWA);
+        when(added.getUsername()).thenReturn(USERNAME_BENWA);
         when(mockedQuotaRootResolver.getQuotaRoot(eq(MAILBOX_ID))).thenReturn(QUOTA_ROOT);
 
         testee.event(added);
@@ -106,7 +106,7 @@ public class ListeningCurrentQuotaUpdaterTest {
         when(expunged.getMetaData(MessageUid.of(38))).thenReturn(new MessageMetaData(MessageUid.of(38),0,new Flags(), SIZE, new Date(), new DefaultMessageId()));
         when(expunged.getUids()).thenReturn(Lists.newArrayList(MessageUid.of(36), MessageUid.of(38)));
         when(expunged.getMailboxId()).thenReturn(MAILBOX_ID);
-        when(expunged.getUser()).thenReturn(USER_BENWA);
+        when(expunged.getUsername()).thenReturn(USERNAME_BENWA);
         when(mockedQuotaRootResolver.getQuotaRoot(eq(MAILBOX_ID))).thenReturn(QUOTA_ROOT);
 
         testee.event(expunged);
@@ -119,7 +119,7 @@ public class ListeningCurrentQuotaUpdaterTest {
         MailboxListener.Expunged expunged = mock(MailboxListener.Expunged.class);
         when(expunged.getUids()).thenReturn(Lists.<MessageUid>newArrayList());
         when(expunged.getMailboxId()).thenReturn(MAILBOX_ID);
-        when(expunged.getUser()).thenReturn(USER_BENWA);
+        when(expunged.getUsername()).thenReturn(USERNAME_BENWA);
         when(mockedQuotaRootResolver.getQuotaRoot(eq(MAILBOX_ID))).thenReturn(QUOTA_ROOT);
 
         testee.event(expunged);
@@ -132,7 +132,7 @@ public class ListeningCurrentQuotaUpdaterTest {
         MailboxListener.Added added = mock(MailboxListener.Added.class);
         when(added.getUids()).thenReturn(Lists.<MessageUid>newArrayList());
         when(added.getMailboxId()).thenReturn(MAILBOX_ID);
-        when(added.getUser()).thenReturn(USER_BENWA);
+        when(added.getUsername()).thenReturn(USERNAME_BENWA);
         when(mockedQuotaRootResolver.getQuotaRoot(eq(MAILBOX_ID))).thenReturn(QUOTA_ROOT);
 
         testee.event(added);
@@ -147,7 +147,7 @@ public class ListeningCurrentQuotaUpdaterTest {
         when(deletion.getDeletedMessageCount()).thenReturn(QuotaCount.count(10));
         when(deletion.getTotalDeletedSize()).thenReturn(QuotaSize.size(5));
         when(deletion.getMailboxId()).thenReturn(MAILBOX_ID);
-        when(deletion.getUser()).thenReturn(USER_BENWA);
+        when(deletion.getUsername()).thenReturn(USERNAME_BENWA);
         when(mockedQuotaRootResolver.getQuotaRoot(eq(MAILBOX_ID))).thenReturn(QUOTA_ROOT);
 
         testee.event(deletion);
@@ -162,7 +162,7 @@ public class ListeningCurrentQuotaUpdaterTest {
         when(deletion.getDeletedMessageCount()).thenReturn(QuotaCount.count(0));
         when(deletion.getTotalDeletedSize()).thenReturn(QuotaSize.size(0));
         when(deletion.getMailboxId()).thenReturn(MAILBOX_ID);
-        when(deletion.getUser()).thenReturn(USER_BENWA);
+        when(deletion.getUsername()).thenReturn(USERNAME_BENWA);
         when(mockedQuotaRootResolver.getQuotaRoot(eq(MAILBOX_ID))).thenReturn(QUOTA_ROOT);
 
         testee.event(deletion);
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerImpl.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerImpl.java
index 9244b91..f2b57cb 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerImpl.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerImpl.java
@@ -21,7 +21,7 @@ package org.apache.mailbox.tools.indexer;
 
 import javax.inject.Inject;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
@@ -77,8 +77,8 @@ public class ReIndexerImpl implements ReIndexer {
     }
 
     @Override
-    public Task reIndex(User user) {
-        return new UserReindexingTask(reIndexerPerformer, user);
+    public Task reIndex(Username username) {
+        return new UserReindexingTask(reIndexerPerformer, username);
     }
 
     @Override
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerPerformer.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerPerformer.java
index 4caf1c7..d1a0941 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerPerformer.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerPerformer.java
@@ -24,7 +24,7 @@ import java.util.stream.Stream;
 
 import javax.inject.Inject;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
@@ -121,9 +121,9 @@ public class ReIndexerPerformer {
         }
     }
 
-    Task.Result reIndex(User user, ReprocessingContext reprocessingContext) throws MailboxException {
-        MailboxSession mailboxSession = mailboxManager.createSystemSession(user.asString());
-        LOGGER.info("Starting a reindex for user {}", user.asString());
+    Task.Result reIndex(Username username, ReprocessingContext reprocessingContext) throws MailboxException {
+        MailboxSession mailboxSession = mailboxManager.createSystemSession(username.asString());
+        LOGGER.info("Starting a reindex for user {}", username.asString());
 
         Stream<MailboxId> mailboxIds = mailboxManager.search(MailboxQuery.privateMailboxesBuilder(mailboxSession).build(), mailboxSession)
             .stream()
@@ -132,7 +132,7 @@ public class ReIndexerPerformer {
         try {
             return reIndex(mailboxIds, reprocessingContext);
         } finally {
-            LOGGER.info("User {} reindex finished", user.asString());
+            LOGGER.info("User {} reindex finished", username.asString());
         }
     }
 
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ThrowsReIndexer.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ThrowsReIndexer.java
index 99f2d3d..1d17fcf 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ThrowsReIndexer.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ThrowsReIndexer.java
@@ -19,7 +19,7 @@
 
 package org.apache.mailbox.tools.indexer;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.indexer.ReIndexer;
@@ -45,7 +45,7 @@ public class ThrowsReIndexer implements ReIndexer {
     }
 
     @Override
-    public Task reIndex(User user) throws MailboxException {
+    public Task reIndex(Username username) throws MailboxException {
         throw new MailboxException("Not implemented");
     }
 
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTask.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTask.java
index ecba050..0a338d9 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTask.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTask.java
@@ -25,7 +25,7 @@ import java.util.Optional;
 
 import javax.inject.Inject;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.indexer.ReIndexingExecutionFailures;
 import org.apache.james.task.Task;
@@ -37,27 +37,27 @@ public class UserReindexingTask implements Task {
     public static final TaskType USER_RE_INDEXING = TaskType.of("user-reindexing");
 
     public static class AdditionalInformation extends ReprocessingContextInformation {
-        private final User user;
+        private final Username username;
 
-        AdditionalInformation(User user, int successfullyReprocessedMailCount, int failedReprocessedMailCount, ReIndexingExecutionFailures failures, Instant timestamp) {
+        AdditionalInformation(Username username, int successfullyReprocessedMailCount, int failedReprocessedMailCount, ReIndexingExecutionFailures failures, Instant timestamp) {
             super(successfullyReprocessedMailCount, failedReprocessedMailCount, failures, timestamp);
-            this.user = user;
+            this.username = username;
         }
 
-        public String getUser() {
-            return user.asString();
+        public String getUsername() {
+            return username.asString();
         }
 
     }
 
     private final ReIndexerPerformer reIndexerPerformer;
-    private final User user;
+    private final Username username;
     private final ReprocessingContext reprocessingContext;
 
     @Inject
-    public UserReindexingTask(ReIndexerPerformer reIndexerPerformer, User user) {
+    public UserReindexingTask(ReIndexerPerformer reIndexerPerformer, Username username) {
         this.reIndexerPerformer = reIndexerPerformer;
-        this.user = user;
+        this.username = username;
         this.reprocessingContext = new ReprocessingContext();
     }
 
@@ -71,22 +71,22 @@ public class UserReindexingTask implements Task {
         }
 
         public UserReindexingTask create(UserReindexingTaskDTO dto) {
-            User user = User.fromUsername(dto.getUsername());
-            return new UserReindexingTask(reIndexerPerformer, user);
+            Username username = Username.fromUsername(dto.getUsername());
+            return new UserReindexingTask(reIndexerPerformer, username);
         }
     }
 
     @Override
     public Result run() {
         try {
-            return reIndexerPerformer.reIndex(user, reprocessingContext);
+            return reIndexerPerformer.reIndex(username, reprocessingContext);
         } catch (MailboxException e) {
             return Result.PARTIAL;
         }
     }
 
-    public User getUser() {
-        return user;
+    public Username getUsername() {
+        return username;
     }
 
     @Override
@@ -96,7 +96,7 @@ public class UserReindexingTask implements Task {
 
     @Override
     public Optional<TaskExecutionDetails.AdditionalInformation> details() {
-        return Optional.of(new UserReindexingTask.AdditionalInformation(user,
+        return Optional.of(new UserReindexingTask.AdditionalInformation(username,
             reprocessingContext.successfullyReprocessedMailCount(),
             reprocessingContext.failedReprocessingMailCount(),
             reprocessingContext.failures(),
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTaskAdditionalInformationDTO.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTaskAdditionalInformationDTO.java
index 38aa0ee..eabb356 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTaskAdditionalInformationDTO.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTaskAdditionalInformationDTO.java
@@ -21,7 +21,7 @@ package org.apache.mailbox.tools.indexer;
 import java.time.Instant;
 import java.util.List;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.json.DTOModule;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
@@ -35,14 +35,14 @@ public class UserReindexingTaskAdditionalInformationDTO implements AdditionalInf
     public static AdditionalInformationDTOModule<UserReindexingTask.AdditionalInformation, UserReindexingTaskAdditionalInformationDTO> serializationModule(MailboxId.Factory factory) {
         return DTOModule.forDomainObject(UserReindexingTask.AdditionalInformation.class)
             .convertToDTO(UserReindexingTaskAdditionalInformationDTO.class)
-            .toDomainObjectConverter(dto -> new UserReindexingTask.AdditionalInformation(User.fromUsername(dto.getUser()),
+            .toDomainObjectConverter(dto -> new UserReindexingTask.AdditionalInformation(Username.fromUsername(dto.getUser()),
                 dto.getSuccessfullyReprocessedMailCount(),
                 dto.getFailedReprocessedMailCount(),
                 ReprocessingContextInformationDTO.deserializeFailures(factory, dto.getFailures()),
                 dto.getTimestamp()))
             .toDTOConverter((details, type) -> new UserReindexingTaskAdditionalInformationDTO(
                 type,
-                details.getUser(),
+                details.getUsername(),
                 details.getSuccessfullyReprocessedMailCount(),
                 details.getFailedReprocessedMailCount(),
                 ReprocessingContextInformationDTO.serializeFailures(details.failures()),
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTaskDTO.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTaskDTO.java
index f38589c..ac3a4ca 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTaskDTO.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTaskDTO.java
@@ -37,7 +37,7 @@ public class UserReindexingTaskDTO implements TaskDTO {
     }
 
     public static UserReindexingTaskDTO of(UserReindexingTask task, String type) {
-        return new UserReindexingTaskDTO(type, task.getUser().asString());
+        return new UserReindexingTaskDTO(type, task.getUsername().asString());
     }
 
     private final String type;
diff --git a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/ReIndexerImplTest.java b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/ReIndexerImplTest.java
index da02b95..7f74c9e 100644
--- a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/ReIndexerImplTest.java
+++ b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/ReIndexerImplTest.java
@@ -26,7 +26,7 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageUid;
@@ -126,7 +126,7 @@ public class ReIndexerImplTest {
                 MessageManager.AppendCommand.builder().build("header: value\r\n\r\nbody"),
                 systemSession);
 
-        reIndexer.reIndex(User.fromUsername(USERNAME)).run();
+        reIndexer.reIndex(Username.fromUsername(USERNAME)).run();
         ArgumentCaptor<MailboxMessage> messageCaptor = ArgumentCaptor.forClass(MailboxMessage.class);
         ArgumentCaptor<MailboxId> mailboxCaptor1 = ArgumentCaptor.forClass(MailboxId.class);
         ArgumentCaptor<Mailbox> mailboxCaptor2 = ArgumentCaptor.forClass(Mailbox.class);
diff --git a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/UserReindexingTaskSerializationTest.java b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/UserReindexingTaskSerializationTest.java
index 41443d4..b8534e8 100644
--- a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/UserReindexingTaskSerializationTest.java
+++ b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/UserReindexingTaskSerializationTest.java
@@ -26,7 +26,7 @@ import java.io.IOException;
 import java.time.Instant;
 import java.util.List;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.indexer.ReIndexingExecutionFailures;
 import org.apache.james.mailbox.model.TestId;
@@ -46,7 +46,7 @@ class UserReindexingTaskSerializationTest {
     private JsonTaskSerializer taskSerializer;
     private JsonTaskAdditionalInformationSerializer jsonAdditionalInformationSerializer;
 
-    private final User user = User.fromUsername("foo@apache.org");
+    private final Username username = Username.fromUsername("foo@apache.org");
     private final int successfullyReprocessedMailCount = 42;
     private final int failedReprocessedMailCount = 2;
     private ReIndexingExecutionFailures reIndexingExecutionFailures;
@@ -79,8 +79,8 @@ class UserReindexingTaskSerializationTest {
 
     @Test
     void userReindexingShouldBeSerializable() throws JsonProcessingException {
-        User user = User.fromUsername("foo@apache.org");
-        UserReindexingTask task = new UserReindexingTask(reIndexerPerformer, user);
+        Username username = Username.fromUsername("foo@apache.org");
+        UserReindexingTask task = new UserReindexingTask(reIndexerPerformer, username);
 
         assertThatJson(taskSerializer.serialize(task))
             .isEqualTo(serializedUserReindexingTask);
@@ -88,8 +88,8 @@ class UserReindexingTaskSerializationTest {
 
     @Test
     void userReindexingShouldBeDeserializable() throws IOException {
-        User user = User.fromUsername("foo@apache.org");
-        UserReindexingTask task = new UserReindexingTask(reIndexerPerformer, user);
+        Username username = Username.fromUsername("foo@apache.org");
+        UserReindexingTask task = new UserReindexingTask(reIndexerPerformer, username);
 
         assertThat(taskSerializer.deserialize(serializedUserReindexingTask))
             .isEqualToComparingOnlyGivenFields(task, "reIndexerPerformer");
@@ -98,13 +98,13 @@ class UserReindexingTaskSerializationTest {
 
     @Test
     void additionalInformationShouldBeSerializable() throws JsonProcessingException {
-        UserReindexingTask.AdditionalInformation details = new UserReindexingTask.AdditionalInformation(user, successfullyReprocessedMailCount, failedReprocessedMailCount, reIndexingExecutionFailures, TIMESTAMP);
+        UserReindexingTask.AdditionalInformation details = new UserReindexingTask.AdditionalInformation(username, successfullyReprocessedMailCount, failedReprocessedMailCount, reIndexingExecutionFailures, TIMESTAMP);
         assertThatJson(jsonAdditionalInformationSerializer.serialize(details)).isEqualTo(SERIALIZED_ADDITIONAL_INFORMATION);
     }
 
     @Test
     void additionalInformationShouldBeDeserializable() throws IOException {
-        UserReindexingTask.AdditionalInformation details = new UserReindexingTask.AdditionalInformation(user, successfullyReprocessedMailCount, failedReprocessedMailCount, reIndexingExecutionFailures, TIMESTAMP);
+        UserReindexingTask.AdditionalInformation details = new UserReindexingTask.AdditionalInformation(username, successfullyReprocessedMailCount, failedReprocessedMailCount, reIndexingExecutionFailures, TIMESTAMP);
         assertThat(jsonAdditionalInformationSerializer.deserialize(SERIALIZED_ADDITIONAL_INFORMATION))
             .isEqualToComparingFieldByField(details);
     }
diff --git a/mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/host/JamesManageSieveHostSystem.java b/mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/host/JamesManageSieveHostSystem.java
index df33cbc..0dbfe6a 100644
--- a/mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/host/JamesManageSieveHostSystem.java
+++ b/mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/host/JamesManageSieveHostSystem.java
@@ -19,7 +19,7 @@
 
 package org.apache.james.mpt.host;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.core.quota.QuotaSize;
 import org.apache.james.managesieve.core.CoreProcessor;
 import org.apache.james.managesieve.jsieve.Parser;
@@ -60,7 +60,7 @@ public abstract class JamesManageSieveHostSystem implements ManageSieveHostSyste
 
     @Override
     public void setMaxQuota(String user, long value) throws Exception {
-        sieveRepository.setQuota(User.fromUsername(user), QuotaSize.size(value));
+        sieveRepository.setQuota(Username.fromUsername(user), QuotaSize.size(value));
     }
 
     @Override
diff --git a/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/SmtpTestRule.java b/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/SmtpTestRule.java
index 1056c0f..bb72d30 100644
--- a/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/SmtpTestRule.java
+++ b/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/SmtpTestRule.java
@@ -22,7 +22,7 @@ import java.util.Optional;
 
 import org.apache.james.GuiceJamesServer;
 import org.apache.james.core.Domain;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.dnsservice.api.DNSService;
 import org.apache.james.dnsservice.api.InMemoryDNSService;
 import org.apache.james.modules.protocols.ProtocolHandlerModule;
@@ -83,7 +83,7 @@ public class SmtpTestRule implements TestRule, SmtpHostSystem {
 
     @Override
     public boolean addUser(String userAtDomain, String password) throws Exception {
-        Optional<Domain> domain = User.fromUsername(userAtDomain).getDomainPart();
+        Optional<Domain> domain = Username.fromUsername(userAtDomain).getDomainPart();
         Preconditions.checkArgument(domain.isPresent(), "The 'user' should contain the 'domain'");
         createDomainIfNeeded(domain.get().asString());
         jamesServer.getProbe(DataProbeImpl.class).addUser(userAtDomain, password);
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/CopyProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/CopyProcessorTest.java
index fc17daa..b3f582b 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/CopyProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/CopyProcessorTest.java
@@ -27,7 +27,7 @@ import static org.mockito.Mockito.when;
 
 import java.util.Optional;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapSessionState;
@@ -58,8 +58,7 @@ import com.google.common.collect.Lists;
 
 public class CopyProcessorTest {
     public static final String TAG = "TAG";
-    private static final String USERNAME = "username";
-    private static final User USER = User.fromUsername(USERNAME);
+    private static final Username USERNAME = Username.fromUsername("username");
 
     private CopyProcessor testee;
     private ImapProcessor mockNextProcessor;
@@ -76,7 +75,7 @@ public class CopyProcessorTest {
         mockStatusResponseFactory = mock(StatusResponseFactory.class);
         mockResponder = mock(ImapProcessor.Responder.class);
         mockImapSession = mock(ImapSession.class);
-        mailboxSession = MailboxSessionUtil.create(USER.asString());
+        mailboxSession = MailboxSessionUtil.create(USERNAME.asString());
 
         testee = new CopyProcessor(mockNextProcessor, mockMailboxManager, mockStatusResponseFactory, new NoopMetricFactory());
     }
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/MoveProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/MoveProcessorTest.java
index 359ff60..98f2325 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/MoveProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/MoveProcessorTest.java
@@ -29,7 +29,7 @@ import static org.mockito.Mockito.when;
 
 import java.util.Optional;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapSessionState;
@@ -61,7 +61,7 @@ import com.google.common.collect.Lists;
 
 public class MoveProcessorTest {
     public static final String TAG = "TAG";
-    private static final User USER = User.fromUsername("username");
+    private static final Username USERNAME = Username.fromUsername("username");
 
     private MoveProcessor testee;
     private ImapProcessor mockNextProcessor;
@@ -78,7 +78,7 @@ public class MoveProcessorTest {
         mockStatusResponseFactory = mock(StatusResponseFactory.class);
         mockResponder = mock(ImapProcessor.Responder.class);
         mockImapSession = mock(ImapSession.class);
-        mailboxSession = MailboxSessionUtil.create(USER.asString());
+        mailboxSession = MailboxSessionUtil.create(USERNAME.asString());
 
         when(mockMailboxManager.hasCapability(eq(MailboxCapabilities.Move))).thenReturn(true);
         testee = new MoveProcessor(mockNextProcessor, mockMailboxManager, mockStatusResponseFactory, new NoopMetricFactory());
diff --git a/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/CoreProcessor.java b/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/CoreProcessor.java
index 9998fa3..967800f 100644
--- a/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/CoreProcessor.java
+++ b/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/CoreProcessor.java
@@ -30,7 +30,7 @@ import java.util.Map;
 import javax.inject.Inject;
 
 import org.apache.commons.io.IOUtils;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.managesieve.api.AuthenticationException;
 import org.apache.james.managesieve.api.AuthenticationProcessor;
 import org.apache.james.managesieve.api.AuthenticationRequiredException;
@@ -131,7 +131,7 @@ public class CoreProcessor implements CoreCommands {
     public String deleteScript(Session session, String name) {
         return handleCommandExecution(() -> {
             authenticationCheck(session);
-            sieveRepository.deleteScript(User.fromUsername(session.getUser()), new ScriptName(name));
+            sieveRepository.deleteScript(Username.fromUsername(session.getUser()), new ScriptName(name));
             return "OK";
         }, session);
     }
@@ -140,7 +140,7 @@ public class CoreProcessor implements CoreCommands {
     public String getScript(Session session, String name) {
         return handleCommandExecution(() -> {
             authenticationCheck(session);
-            String scriptContent = IOUtils.toString(sieveRepository.getScript(User.fromUsername(session.getUser()), new ScriptName(name)), StandardCharsets.UTF_8);
+            String scriptContent = IOUtils.toString(sieveRepository.getScript(Username.fromUsername(session.getUser()), new ScriptName(name)), StandardCharsets.UTF_8);
             return "{" + scriptContent.length() + "}" + "\r\n" + scriptContent + "\r\nOK";
         }, session);
     }
@@ -149,7 +149,7 @@ public class CoreProcessor implements CoreCommands {
     public String haveSpace(Session session, String name, long size) {
         return handleCommandExecution(() -> {
             authenticationCheck(session);
-            sieveRepository.haveSpace(User.fromUsername(session.getUser()), new ScriptName(name), size);
+            sieveRepository.haveSpace(Username.fromUsername(session.getUser()), new ScriptName(name), size);
             return "OK";
         }, session);
     }
@@ -162,7 +162,7 @@ public class CoreProcessor implements CoreCommands {
     private String listScriptsInternals(Session session) throws AuthenticationRequiredException, StorageException {
         authenticationCheck(session);
         String list = Joiner.on("\r\n").join(
-            Iterables.transform(sieveRepository.listScripts(User.fromUsername(session.getUser())),
+            Iterables.transform(sieveRepository.listScripts(Username.fromUsername(session.getUser())),
                 scriptSummary -> '"' + scriptSummary.getName().getValue() + '"' + (scriptSummary.isActive() ? " ACTIVE" : "")));
         if (Strings.isNullOrEmpty(list)) {
             return "OK";
@@ -175,7 +175,7 @@ public class CoreProcessor implements CoreCommands {
     public String putScript(Session session, String name, String content) {
         return handleCommandExecution(() -> {
             authenticationCheck(session);
-            sieveRepository.putScript(User.fromUsername(session.getUser()), new ScriptName(name), new ScriptContent(content));
+            sieveRepository.putScript(Username.fromUsername(session.getUser()), new ScriptName(name), new ScriptContent(content));
             return manageWarnings(parser.parse(content));
         }, session);
     }
@@ -184,7 +184,7 @@ public class CoreProcessor implements CoreCommands {
     public String renameScript(Session session, String oldName, String newName) {
         return handleCommandExecution(() -> {
             authenticationCheck(session);
-            sieveRepository.renameScript(User.fromUsername(session.getUser()), new ScriptName(oldName), new ScriptName(newName));
+            sieveRepository.renameScript(Username.fromUsername(session.getUser()), new ScriptName(oldName), new ScriptName(newName));
             return "OK";
         }, session);
     }
@@ -193,7 +193,7 @@ public class CoreProcessor implements CoreCommands {
     public String setActive(Session session, String name) {
         return handleCommandExecution(() -> {
             authenticationCheck(session);
-            sieveRepository.setActive(User.fromUsername(session.getUser()), new ScriptName(name));
+            sieveRepository.setActive(Username.fromUsername(session.getUser()), new ScriptName(name));
             return "OK";
         }, session);
     }
diff --git a/server/container/guice/protocols/managedsieve/src/main/java/org/apache/james/modules/protocols/SieveProbeImpl.java b/server/container/guice/protocols/managedsieve/src/main/java/org/apache/james/modules/protocols/SieveProbeImpl.java
index 2d28493..844f2c4 100644
--- a/server/container/guice/protocols/managedsieve/src/main/java/org/apache/james/modules/protocols/SieveProbeImpl.java
+++ b/server/container/guice/protocols/managedsieve/src/main/java/org/apache/james/modules/protocols/SieveProbeImpl.java
@@ -24,7 +24,7 @@ import java.nio.charset.StandardCharsets;
 import javax.inject.Inject;
 
 import org.apache.commons.io.IOUtils;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.core.quota.QuotaSize;
 import org.apache.james.probe.SieveProbe;
 import org.apache.james.sieverepository.api.ScriptContent;
@@ -59,24 +59,24 @@ public class SieveProbeImpl implements GuiceProbe, SieveProbe {
 
     @Override
     public long getSieveQuota(String user) throws Exception {
-        return sieveRepository.getQuota(User.fromUsername(user)).asLong();
+        return sieveRepository.getQuota(Username.fromUsername(user)).asLong();
     }
 
     @Override
     public void setSieveQuota(String user, long quota) throws Exception {
-        sieveRepository.setQuota(User.fromUsername(user), QuotaSize.size(quota));
+        sieveRepository.setQuota(Username.fromUsername(user), QuotaSize.size(quota));
     }
 
     @Override
     public void removeSieveQuota(String user) throws Exception {
-        sieveRepository.removeQuota(User.fromUsername(user));
+        sieveRepository.removeQuota(Username.fromUsername(user));
     }
 
     @Override
     public void addActiveSieveScript(String userName, String name, String script) throws Exception {
-        User user = User.fromUsername(userName);
-        sieveRepository.putScript(user, new ScriptName(name), new ScriptContent(script));
-        sieveRepository.setActive(user, new ScriptName(name));
+        Username username = Username.fromUsername(userName);
+        sieveRepository.putScript(username, new ScriptName(name), new ScriptContent(script));
+        sieveRepository.setActive(username, new ScriptName(name));
     }
 
     @Override
diff --git a/server/data/data-api/src/main/java/org/apache/james/rrt/lib/Mapping.java b/server/data/data-api/src/main/java/org/apache/james/rrt/lib/Mapping.java
index b87b228..9630c4d 100644
--- a/server/data/data-api/src/main/java/org/apache/james/rrt/lib/Mapping.java
+++ b/server/data/data-api/src/main/java/org/apache/james/rrt/lib/Mapping.java
@@ -30,7 +30,7 @@ import javax.mail.internet.AddressException;
 
 import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.rrt.api.RecipientRewriteTable;
 import org.apache.james.rrt.api.RecipientRewriteTableException;
 
@@ -252,8 +252,8 @@ public interface Mapping {
         }
 
         @Override
-        public Optional<User> rewriteUser(User user) throws AddressException, RecipientRewriteTable.ErrorMappingException {
-            return rewriter.rewrite(user);
+        public Optional<Username> rewriteUser(Username username) throws AddressException, RecipientRewriteTable.ErrorMappingException {
+            return rewriter.rewrite(username);
         }
 
         @Override
@@ -306,6 +306,6 @@ public interface Mapping {
 
     String getErrorMessage();
 
-    Optional<User> rewriteUser(User user) throws AddressException, RecipientRewriteTable.ErrorMappingException;
+    Optional<Username> rewriteUser(Username username) throws AddressException, RecipientRewriteTable.ErrorMappingException;
 
 }
\ No newline at end of file
diff --git a/server/data/data-api/src/main/java/org/apache/james/rrt/lib/MappingSource.java b/server/data/data-api/src/main/java/org/apache/james/rrt/lib/MappingSource.java
index 0955256..df66a9d 100644
--- a/server/data/data-api/src/main/java/org/apache/james/rrt/lib/MappingSource.java
+++ b/server/data/data-api/src/main/java/org/apache/james/rrt/lib/MappingSource.java
@@ -27,7 +27,7 @@ import javax.mail.internet.AddressException;
 
 import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.util.OptionalUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -49,7 +49,7 @@ public class MappingSource implements Serializable {
     }
 
     public static MappingSource fromMailAddress(MailAddress address) {
-        return fromUser(User.fromMailAddress(address));
+        return fromUser(Username.fromMailAddress(address));
     }
 
     public static MappingSource fromUser(String localPart, String domain) {
@@ -57,15 +57,15 @@ public class MappingSource implements Serializable {
     }
 
     public static MappingSource fromUser(String localPart, Domain domain) {
-        User user = User.fromLocalPartWithDomain(localPart, domain);
-        return fromUser(user);
+        Username username = Username.fromLocalPartWithDomain(localPart, domain);
+        return fromUser(username);
     }
 
-    public static MappingSource fromUser(User user) {
-        if (user.getLocalPart().equals(WILDCARD)) {
-            return MappingSource.fromDomain(user.getDomainPart().get());
+    public static MappingSource fromUser(Username username) {
+        if (username.getLocalPart().equals(WILDCARD)) {
+            return MappingSource.fromDomain(username.getDomainPart().get());
         }
-        return new MappingSource(Optional.empty(), Optional.of(user), Optional.empty());
+        return new MappingSource(Optional.empty(), Optional.of(username), Optional.empty());
     }
 
     public static MappingSource wildCard() {
@@ -80,15 +80,15 @@ public class MappingSource implements Serializable {
                 if (mappingSource.startsWith(WILDCARD + "@")) {
                     return fromDomain(Domain.of(mappingSource.substring(2, mappingSource.length())));
                 }
-                return fromUser(User.fromUsername(mappingSource));
+                return fromUser(Username.fromUsername(mappingSource));
         }
     }
 
     private final Optional<Domain> domain;
-    private final Optional<User> user;
+    private final Optional<Username> user;
     private final Optional<WildCard> wildcard;
 
-    private MappingSource(Optional<Domain> domain, Optional<User> user, Optional<WildCard> wildcard) {
+    private MappingSource(Optional<Domain> domain, Optional<Username> user, Optional<WildCard> wildcard) {
         this.domain = domain;
         this.user = user;
         this.wildcard = wildcard;
@@ -112,13 +112,13 @@ public class MappingSource implements Serializable {
     public String asString() {
         return OptionalUtils.orSuppliers(
                 () -> wildcard.map(x -> "*"),
-                () -> user.map(User::asString),
+                () -> user.map(Username::asString),
                 () -> domain.map(Domain::asString))
             .orElseThrow(IllegalStateException::new);
     }
 
     public String getFixedUser() {
-        return user.map(User::getLocalPart)
+        return user.map(Username::getLocalPart)
             .orElse(WILDCARD);
     }
 
@@ -130,7 +130,7 @@ public class MappingSource implements Serializable {
 
     public Optional<Domain> availableDomain() {
         return OptionalUtils.or(
-            user.flatMap(User::getDomainPart),
+            user.flatMap(Username::getDomainPart),
             domain);
     }
 
diff --git a/server/data/data-api/src/main/java/org/apache/james/rrt/lib/UserRewritter.java b/server/data/data-api/src/main/java/org/apache/james/rrt/lib/UserRewritter.java
index 58950e5..9a05900 100644
--- a/server/data/data-api/src/main/java/org/apache/james/rrt/lib/UserRewritter.java
+++ b/server/data/data-api/src/main/java/org/apache/james/rrt/lib/UserRewritter.java
@@ -31,7 +31,7 @@ import javax.mail.internet.AddressException;
 
 import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.rrt.api.RecipientRewriteTable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -43,7 +43,7 @@ import com.google.common.collect.ImmutableList;
 @FunctionalInterface
 public interface UserRewritter extends Serializable {
 
-    Optional<User> rewrite(User user) throws AddressException, RecipientRewriteTable.ErrorMappingException;
+    Optional<Username> rewrite(Username username) throws AddressException, RecipientRewriteTable.ErrorMappingException;
 
     interface MappingUserRewriter {
         UserRewritter generateUserRewriter(String mapping);
@@ -54,7 +54,7 @@ public interface UserRewritter extends Serializable {
         public UserRewritter generateUserRewriter(String mapping) {
             Domain newDomain = Domain.of(mapping);
             return oldUser -> Optional.of(
-                User.fromLocalPartWithDomain(
+                Username.fromLocalPartWithDomain(
                     oldUser.getLocalPart(),
                     newDomain));
         }
@@ -63,7 +63,7 @@ public interface UserRewritter extends Serializable {
     class ReplaceRewriter implements MappingUserRewriter {
         @Override
         public UserRewritter generateUserRewriter(String mapping) {
-            return oldUser -> Optional.of(User.fromUsername(mapping));
+            return oldUser -> Optional.of(Username.fromUsername(mapping));
         }
     }
 
@@ -87,10 +87,10 @@ public interface UserRewritter extends Serializable {
             return oldUser -> {
                 try {
                     return regexMap(oldUser.asMailAddress(), mapping)
-                        .map(User::fromUsername);
+                        .map(Username::fromUsername);
                 } catch (PatternSyntaxException e) {
                     LOGGER.error("Exception during regexMap processing: ", e);
-                    return Optional.of(User.fromUsername(Mapping.Type.Regex.asPrefix() + mapping));
+                    return Optional.of(Username.fromUsername(Mapping.Type.Regex.asPrefix() + mapping));
                 }
             };
         }
diff --git a/server/data/data-api/src/main/java/org/apache/james/sieverepository/api/SieveQuotaRepository.java b/server/data/data-api/src/main/java/org/apache/james/sieverepository/api/SieveQuotaRepository.java
index 4866b01..f712bcf 100644
--- a/server/data/data-api/src/main/java/org/apache/james/sieverepository/api/SieveQuotaRepository.java
+++ b/server/data/data-api/src/main/java/org/apache/james/sieverepository/api/SieveQuotaRepository.java
@@ -20,7 +20,7 @@
 
 package org.apache.james.sieverepository.api;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.core.quota.QuotaSize;
 import org.apache.james.sieverepository.api.exception.QuotaNotFoundException;
 import org.apache.james.sieverepository.api.exception.StorageException;
@@ -38,11 +38,11 @@ public interface SieveQuotaRepository {
 
     void removeQuota() throws QuotaNotFoundException, StorageException;
 
-    boolean hasQuota(User user) throws StorageException;
+    boolean hasQuota(Username username) throws StorageException;
 
-    QuotaSize getQuota(User user) throws QuotaNotFoundException, StorageException;
+    QuotaSize getQuota(Username username) throws QuotaNotFoundException, StorageException;
 
-    void setQuota(User user, QuotaSize quota) throws StorageException;
+    void setQuota(Username username, QuotaSize quota) throws StorageException;
 
-    void removeQuota(User user) throws QuotaNotFoundException, StorageException;
+    void removeQuota(Username username) throws QuotaNotFoundException, StorageException;
 }
diff --git a/server/data/data-api/src/main/java/org/apache/james/sieverepository/api/SieveRepository.java b/server/data/data-api/src/main/java/org/apache/james/sieverepository/api/SieveRepository.java
index f9d8c0b..e08af0e 100644
--- a/server/data/data-api/src/main/java/org/apache/james/sieverepository/api/SieveRepository.java
+++ b/server/data/data-api/src/main/java/org/apache/james/sieverepository/api/SieveRepository.java
@@ -24,7 +24,7 @@ import java.io.InputStream;
 import java.time.ZonedDateTime;
 import java.util.List;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.sieverepository.api.exception.DuplicateException;
 import org.apache.james.sieverepository.api.exception.IsActiveException;
 import org.apache.james.sieverepository.api.exception.QuotaExceededException;
@@ -39,33 +39,33 @@ public interface SieveRepository extends SieveQuotaRepository {
 
     ScriptName NO_SCRIPT_NAME = new ScriptName("");
 
-    void haveSpace(User user, ScriptName name, long size) throws QuotaExceededException, StorageException;
+    void haveSpace(Username username, ScriptName name, long size) throws QuotaExceededException, StorageException;
     
     /**
      * PutScript.
      *
      * <p><strong>Note:</strong> It is the responsibility of the caller to validate the script to be put.
      *
-     * @param user
+     * @param username
      * @param name
      * @param content
      * @throws StorageException
      * @throws QuotaExceededException
      */
-    void putScript(User user, ScriptName name, ScriptContent content) throws StorageException, QuotaExceededException;
+    void putScript(Username username, ScriptName name, ScriptContent content) throws StorageException, QuotaExceededException;
     
-    List<ScriptSummary> listScripts(User user) throws StorageException;
+    List<ScriptSummary> listScripts(Username username) throws StorageException;
 
-    ZonedDateTime getActivationDateForActiveScript(User user) throws StorageException, ScriptNotFoundException;
+    ZonedDateTime getActivationDateForActiveScript(Username username) throws StorageException, ScriptNotFoundException;
 
-    InputStream getActive(User user) throws ScriptNotFoundException, StorageException;
+    InputStream getActive(Username username) throws ScriptNotFoundException, StorageException;
     
-    void setActive(User user, ScriptName name) throws ScriptNotFoundException, StorageException;
+    void setActive(Username username, ScriptName name) throws ScriptNotFoundException, StorageException;
     
-    InputStream getScript(User user, ScriptName name) throws ScriptNotFoundException, StorageException;
+    InputStream getScript(Username username, ScriptName name) throws ScriptNotFoundException, StorageException;
     
-    void deleteScript(User user, ScriptName name) throws ScriptNotFoundException, IsActiveException, StorageException;
+    void deleteScript(Username username, ScriptName name) throws ScriptNotFoundException, IsActiveException, StorageException;
     
-    void renameScript(User user, ScriptName oldName, ScriptName newName) throws ScriptNotFoundException, DuplicateException, StorageException;
+    void renameScript(Username username, ScriptName oldName, ScriptName newName) throws ScriptNotFoundException, DuplicateException, StorageException;
 
 }
diff --git a/server/data/data-api/src/main/java/org/apache/james/user/api/UsersRepository.java b/server/data/data-api/src/main/java/org/apache/james/user/api/UsersRepository.java
index cfc9c8f..8956cf8 100644
--- a/server/data/data-api/src/main/java/org/apache/james/user/api/UsersRepository.java
+++ b/server/data/data-api/src/main/java/org/apache/james/user/api/UsersRepository.java
@@ -22,6 +22,7 @@ package org.apache.james.user.api;
 import java.util.Iterator;
 
 import org.apache.james.core.MailAddress;
+import org.apache.james.core.Username;
 import org.apache.james.user.api.model.User;
 
 /**
@@ -142,7 +143,7 @@ public interface UsersRepository {
      *
      * This makes sense as it handles virtual-hosting logic.
      */
-    MailAddress getMailAddressFor(org.apache.james.core.User user) throws UsersRepositoryException;
+    MailAddress getMailAddressFor(Username username) throws UsersRepositoryException;
     
     /**
      * Return true if the user is an admin for this repository
diff --git a/server/data/data-api/src/main/java/org/apache/james/user/api/model/User.java b/server/data/data-api/src/main/java/org/apache/james/user/api/model/User.java
index fe92c3e..dd04bbb 100644
--- a/server/data/data-api/src/main/java/org/apache/james/user/api/model/User.java
+++ b/server/data/data-api/src/main/java/org/apache/james/user/api/model/User.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.user.api.model;
 
+import org.apache.james.core.Username;
+
 /**
  * Interface for objects representing users.
  */
@@ -51,9 +53,9 @@ public interface User {
     boolean setPassword(String newPass);
 
     default boolean hasUsername(String username) {
-        org.apache.james.core.User thisUser = org.apache.james.core.User.fromUsername(getUserName());
-        org.apache.james.core.User thatUser = org.apache.james.core.User.fromUsername(username);
+        Username thisUsername = Username.fromUsername(getUserName());
+        Username thatUsername = Username.fromUsername(username);
 
-        return thisUser.equals(thatUser);
+        return thisUsername.equals(thatUsername);
     }
 }
diff --git a/server/data/data-api/src/test/java/org/apache/james/rrt/lib/DomainRewriterTest.java b/server/data/data-api/src/test/java/org/apache/james/rrt/lib/DomainRewriterTest.java
index 73300f4..f6e369a 100644
--- a/server/data/data-api/src/test/java/org/apache/james/rrt/lib/DomainRewriterTest.java
+++ b/server/data/data-api/src/test/java/org/apache/james/rrt/lib/DomainRewriterTest.java
@@ -21,7 +21,8 @@ package org.apache.james.rrt.lib;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
+
 import org.junit.jupiter.api.Test;
 
 public class DomainRewriterTest {
@@ -30,8 +31,8 @@ public class DomainRewriterTest {
         assertThat(
             new UserRewritter.DomainRewriter()
                 .generateUserRewriter("newdomain.com")
-                .rewrite(User.fromUsername("toto@olddomain.com")))
-            .contains(User.fromUsername("toto@newdomain.com"));
+                .rewrite(Username.fromUsername("toto@olddomain.com")))
+            .contains(Username.fromUsername("toto@newdomain.com"));
     }
 
     @Test
@@ -39,7 +40,7 @@ public class DomainRewriterTest {
         assertThat(
             new UserRewritter.DomainRewriter()
                 .generateUserRewriter("newdomain.com")
-                .rewrite(User.fromUsername("toto")))
-            .contains(User.fromUsername("toto@newdomain.com"));
+                .rewrite(Username.fromUsername("toto")))
+            .contains(Username.fromUsername("toto@newdomain.com"));
     }
 }
diff --git a/server/data/data-api/src/test/java/org/apache/james/rrt/lib/MappingSourceTest.java b/server/data/data-api/src/test/java/org/apache/james/rrt/lib/MappingSourceTest.java
index 4dba3c5..f65f794 100644
--- a/server/data/data-api/src/test/java/org/apache/james/rrt/lib/MappingSourceTest.java
+++ b/server/data/data-api/src/test/java/org/apache/james/rrt/lib/MappingSourceTest.java
@@ -23,7 +23,8 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
+
 import org.junit.jupiter.api.Test;
 
 import nl.jqno.equalsverifier.EqualsVerifier;
@@ -63,7 +64,7 @@ class MappingSourceTest {
 
     @Test
     void asMailAddressStringShouldSerializeUserWithoutDomain() {
-        MappingSource mappingSource = MappingSource.fromUser(User.fromUsername(USER));
+        MappingSource mappingSource = MappingSource.fromUser(Username.fromUsername(USER));
 
         assertThat(mappingSource.asMailAddressString()).isEqualTo(USER + "@*");
     }
diff --git a/server/data/data-api/src/test/java/org/apache/james/rrt/lib/ReplaceRewriterTest.java b/server/data/data-api/src/test/java/org/apache/james/rrt/lib/ReplaceRewriterTest.java
index d231d2c..fbc0d37 100644
--- a/server/data/data-api/src/test/java/org/apache/james/rrt/lib/ReplaceRewriterTest.java
+++ b/server/data/data-api/src/test/java/org/apache/james/rrt/lib/ReplaceRewriterTest.java
@@ -21,7 +21,8 @@ package org.apache.james.rrt.lib;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
+
 import org.junit.jupiter.api.Test;
 
 public class ReplaceRewriterTest {
@@ -31,8 +32,8 @@ public class ReplaceRewriterTest {
         assertThat(
             new UserRewritter.ReplaceRewriter()
                 .generateUserRewriter(newAddress)
-                .rewrite(User.fromUsername("old@passed")))
-            .contains(User.fromUsername(newAddress));
+                .rewrite(Username.fromUsername("old@passed")))
+            .contains(Username.fromUsername(newAddress));
     }
     
     @Test
@@ -41,8 +42,8 @@ public class ReplaceRewriterTest {
         assertThat(
             new UserRewritter.ReplaceRewriter()
                 .generateUserRewriter(newAddress)
-                .rewrite(User.fromUsername("old")))
-            .contains(User.fromUsername(newAddress));
+                .rewrite(Username.fromUsername("old")))
+            .contains(Username.fromUsername(newAddress));
     }
 
     @Test
@@ -51,7 +52,7 @@ public class ReplaceRewriterTest {
         assertThat(
             new UserRewritter.ReplaceRewriter()
                 .generateUserRewriter(newAddress)
-                .rewrite(User.fromUsername("old@passed")))
-            .contains(User.fromUsername(newAddress));
+                .rewrite(Username.fromUsername("old@passed")))
+            .contains(Username.fromUsername(newAddress));
     }
 }
diff --git a/server/data/data-api/src/test/java/org/apache/james/rrt/lib/ThrowingRewriterTest.java b/server/data/data-api/src/test/java/org/apache/james/rrt/lib/ThrowingRewriterTest.java
index c3d3af5..bd806d4 100644
--- a/server/data/data-api/src/test/java/org/apache/james/rrt/lib/ThrowingRewriterTest.java
+++ b/server/data/data-api/src/test/java/org/apache/james/rrt/lib/ThrowingRewriterTest.java
@@ -21,7 +21,7 @@ package org.apache.james.rrt.lib;
 
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.rrt.api.RecipientRewriteTable;
 import org.junit.jupiter.api.Test;
 
@@ -31,7 +31,7 @@ public class ThrowingRewriterTest {
         assertThatThrownBy(() ->
             new UserRewritter.ThrowingRewriter()
                 .generateUserRewriter("any")
-                .rewrite(User.fromUsername("any")))
+                .rewrite(Username.fromUsername("any")))
             .isInstanceOf(RecipientRewriteTable.ErrorMappingException.class);
     }
 }
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraActiveScriptDAO.java b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraActiveScriptDAO.java
index 26bf3c3..f9288fe 100644
--- a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraActiveScriptDAO.java
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraActiveScriptDAO.java
@@ -36,7 +36,7 @@ import java.util.Date;
 import javax.inject.Inject;
 
 import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.sieve.cassandra.model.ActiveScriptInfo;
 import org.apache.james.sieverepository.api.ScriptName;
 
@@ -65,25 +65,25 @@ public class CassandraActiveScriptDAO {
             .where(eq(USER_NAME, bindMarker(USER_NAME))));
     }
 
-    public Mono<ActiveScriptInfo> getActiveSctiptInfo(User user) {
+    public Mono<ActiveScriptInfo> getActiveSctiptInfo(Username username) {
         return cassandraAsyncExecutor.executeSingleRow(
             selectActiveName.bind()
-                .setString(USER_NAME, user.asString()))
+                .setString(USER_NAME, username.asString()))
             .map(row -> new ActiveScriptInfo(
                 new ScriptName(row.getString(SCRIPT_NAME)),
                 ZonedDateTime.ofInstant(row.getTimestamp(DATE).toInstant(), ZoneOffset.UTC)));
     }
 
-    public Mono<Void> unactivate(User user) {
+    public Mono<Void> unactivate(Username username) {
         return cassandraAsyncExecutor.executeVoid(
             deleteActive.bind()
-                .setString(USER_NAME, user.asString()));
+                .setString(USER_NAME, username.asString()));
     }
 
-    public Mono<Void> activate(User user, ScriptName scriptName) {
+    public Mono<Void> activate(Username username, ScriptName scriptName) {
         return cassandraAsyncExecutor.executeVoid(
             insertActive.bind()
-                .setString(USER_NAME, user.asString())
+                .setString(USER_NAME, username.asString())
                 .setString(SCRIPT_NAME, scriptName.getValue())
                 .setTimestamp(DATE, new Date()));
     }
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveDAO.java b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveDAO.java
index de1f5ac..9a18265 100644
--- a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveDAO.java
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveDAO.java
@@ -36,7 +36,7 @@ import static org.apache.james.sieve.cassandra.tables.CassandraSieveTable.USER_N
 import javax.inject.Inject;
 
 import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.sieve.cassandra.model.Script;
 import org.apache.james.sieverepository.api.ScriptName;
 import org.apache.james.sieverepository.api.ScriptSummary;
@@ -95,35 +95,35 @@ public class CassandraSieveDAO {
             .where(eq(USER_NAME, bindMarker(USER_NAME)));
     }
 
-    public Mono<Void> insertScript(User user, Script script) {
+    public Mono<Void> insertScript(Username username, Script script) {
         return cassandraAsyncExecutor.executeVoid(
             insertScriptStatement.bind()
-                .setString(USER_NAME, user.asString())
+                .setString(USER_NAME, username.asString())
                 .setString(SCRIPT_NAME, script.getName().getValue())
                 .setString(SCRIPT_CONTENT, script.getContent().getValue())
                 .setBool(IS_ACTIVE, script.isActive())
                 .setLong(SIZE, script.getSize()));
     }
 
-    public Flux<ScriptSummary> listScripts(User user) {
+    public Flux<ScriptSummary> listScripts(Username username) {
         return cassandraAsyncExecutor.executeRows(
                 selectScriptsStatement.bind()
-                    .setString(USER_NAME, user.asString()))
+                    .setString(USER_NAME, username.asString()))
             .map(row -> new ScriptSummary(
                     new ScriptName(row.getString(SCRIPT_NAME)),
                     row.getBool(IS_ACTIVE)));
     }
 
-    public Mono<Boolean> updateScriptActivation(User user, ScriptName scriptName, boolean active) {
+    public Mono<Boolean> updateScriptActivation(Username username, ScriptName scriptName, boolean active) {
         return cassandraAsyncExecutor.executeReturnApplied(
             updateScriptActivationStatement.bind()
-                .setString(USER_NAME, user.asString())
+                .setString(USER_NAME, username.asString())
                 .setString(SCRIPT_NAME, scriptName.getValue())
                 .setBool(IS_ACTIVE, active));
     }
 
-    public Mono<Script> getScript(User user, ScriptName name) {
-        return getScriptRow(user, name).map(row -> Script.builder()
+    public Mono<Script> getScript(Username username, ScriptName name) {
+        return getScriptRow(username, name).map(row -> Script.builder()
                 .content(row.getString(SCRIPT_CONTENT))
                 .isActive(row.getBool(IS_ACTIVE))
                 .name(name)
@@ -131,17 +131,17 @@ public class CassandraSieveDAO {
                 .build());
     }
 
-    public Mono<Boolean> deleteScriptInCassandra(User user, ScriptName name) {
+    public Mono<Boolean> deleteScriptInCassandra(Username username, ScriptName name) {
         return cassandraAsyncExecutor.executeReturnApplied(
             deleteScriptStatement.bind()
-                .setString(USER_NAME, user.asString())
+                .setString(USER_NAME, username.asString())
                 .setString(SCRIPT_NAME, name.getValue()));
     }
 
-    private Mono<Row> getScriptRow(User user, ScriptName name) {
+    private Mono<Row> getScriptRow(Username username, ScriptName name) {
         return cassandraAsyncExecutor.executeSingleRow(
             selectScriptStatement.bind()
-                .setString(USER_NAME, user.asString())
+                .setString(USER_NAME, username.asString())
                 .setString(SCRIPT_NAME, name.getValue()));
     }
 
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAO.java b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAO.java
index c24f032..d8b140e 100644
--- a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAO.java
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAO.java
@@ -32,7 +32,7 @@ import java.util.Optional;
 import javax.inject.Inject;
 
 import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.core.quota.QuotaSize;
 import org.apache.james.sieve.cassandra.tables.CassandraSieveClusterQuotaTable;
 import org.apache.james.sieve.cassandra.tables.CassandraSieveQuotaTable;
@@ -99,19 +99,19 @@ public class CassandraSieveQuotaDAO {
                 .where(eq(CassandraSieveQuotaTable.USER_NAME, bindMarker(CassandraSieveQuotaTable.USER_NAME))));
     }
 
-    public Mono<Long> spaceUsedBy(User user) {
+    public Mono<Long> spaceUsedBy(Username username) {
         return cassandraAsyncExecutor.executeSingleRowOptional(
             selectSpaceUsedByUserStatement.bind()
-                .setString(CassandraSieveSpaceTable.USER_NAME, user.asString()))
+                .setString(CassandraSieveSpaceTable.USER_NAME, username.asString()))
             .map(optional -> optional.map(row -> row.getLong(CassandraSieveSpaceTable.SPACE_USED))
                 .orElse(0L));
     }
 
-    public Mono<Void> updateSpaceUsed(User user, long spaceUsed) {
+    public Mono<Void> updateSpaceUsed(Username username, long spaceUsed) {
         return cassandraAsyncExecutor.executeVoid(
             updateSpaceUsedStatement.bind()
                 .setLong(CassandraSieveSpaceTable.SPACE_USED, spaceUsed)
-                .setString(CassandraSieveSpaceTable.USER_NAME, user.asString()));
+                .setString(CassandraSieveSpaceTable.USER_NAME, username.asString()));
     }
 
     public Mono<Optional<QuotaSize>> getQuota() {
@@ -135,25 +135,25 @@ public class CassandraSieveQuotaDAO {
                 .setString(CassandraSieveClusterQuotaTable.NAME, CassandraSieveClusterQuotaTable.DEFAULT_NAME));
     }
 
-    public Mono<Optional<QuotaSize>> getQuota(User user) {
+    public Mono<Optional<QuotaSize>> getQuota(Username username) {
         return cassandraAsyncExecutor.executeSingleRowOptional(
             selectUserQuotaStatement.bind()
-                .setString(CassandraSieveQuotaTable.USER_NAME, user.asString()))
+                .setString(CassandraSieveQuotaTable.USER_NAME, username.asString()))
             .map(optional -> optional.map(row ->
                 QuotaSize.size(row.getLong(CassandraSieveQuotaTable.QUOTA))));
     }
 
-    public Mono<Void> setQuota(User user, QuotaSize quota) {
+    public Mono<Void> setQuota(Username username, QuotaSize quota) {
         return cassandraAsyncExecutor.executeVoid(
             updateUserQuotaStatement.bind()
                 .setLong(CassandraSieveQuotaTable.QUOTA, quota.asLong())
-                .setString(CassandraSieveQuotaTable.USER_NAME, user.asString()));
+                .setString(CassandraSieveQuotaTable.USER_NAME, username.asString()));
     }
 
-    public Mono<Void> removeQuota(User user)  {
+    public Mono<Void> removeQuota(Username username)  {
         return cassandraAsyncExecutor.executeVoid(
             deleteUserQuotaStatement.bind()
-                .setString(CassandraSieveQuotaTable.USER_NAME, user.asString()));
+                .setString(CassandraSieveQuotaTable.USER_NAME, username.asString()));
     }
 
 }
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveRepository.java b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveRepository.java
index 2c866ba..7cbc029 100644
--- a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveRepository.java
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveRepository.java
@@ -29,7 +29,7 @@ import java.util.function.Function;
 import javax.inject.Inject;
 
 import org.apache.commons.io.IOUtils;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.core.quota.QuotaSize;
 import org.apache.james.sieve.cassandra.model.ActiveScriptInfo;
 import org.apache.james.sieve.cassandra.model.Script;
@@ -64,25 +64,25 @@ public class CassandraSieveRepository implements SieveRepository {
     }
 
     @Override
-    public ZonedDateTime getActivationDateForActiveScript(User user) throws ScriptNotFoundException {
-        return cassandraActiveScriptDAO.getActiveSctiptInfo(user)
+    public ZonedDateTime getActivationDateForActiveScript(Username username) throws ScriptNotFoundException {
+        return cassandraActiveScriptDAO.getActiveSctiptInfo(username)
             .blockOptional()
             .orElseThrow(ScriptNotFoundException::new)
             .getActivationDate();
     }
 
     @Override
-    public void haveSpace(User user, ScriptName name, long newSize) throws QuotaExceededException {
+    public void haveSpace(Username username, ScriptName name, long newSize) throws QuotaExceededException {
         reThrowQuotaExceededException(() ->
-            spaceThatWillBeUsedByNewScript(user, name, newSize)
-                .flatMap(sizeDifference -> throwOnOverQuota(user, sizeDifference))
+            spaceThatWillBeUsedByNewScript(username, name, newSize)
+                .flatMap(sizeDifference -> throwOnOverQuota(username, sizeDifference))
                 .block());
     }
 
-    private Mono<Void> throwOnOverQuota(User user, Long sizeDifference) {
-        Mono<Optional<QuotaSize>> userQuotaMono = cassandraSieveQuotaDAO.getQuota(user);
+    private Mono<Void> throwOnOverQuota(Username username, Long sizeDifference) {
+        Mono<Optional<QuotaSize>> userQuotaMono = cassandraSieveQuotaDAO.getQuota(username);
         Mono<Optional<QuotaSize>> globalQuotaMono = cassandraSieveQuotaDAO.getQuota();
-        Mono<Long> spaceUsedMono = cassandraSieveQuotaDAO.spaceUsedBy(user);
+        Mono<Long> spaceUsedMono = cassandraSieveQuotaDAO.spaceUsedBy(username);
 
         return limitToUse(userQuotaMono, globalQuotaMono).zipWith(spaceUsedMono)
             .flatMap(pair -> checkOverQuotaUponModification(sizeDifference, pair.getT2(), pair.getT1()));
@@ -98,8 +98,8 @@ public class CassandraSieveRepository implements SieveRepository {
         }
     }
 
-    private Mono<Long> spaceThatWillBeUsedByNewScript(User user, ScriptName name, long scriptSize) {
-        return cassandraSieveDAO.getScript(user, name)
+    private Mono<Long> spaceThatWillBeUsedByNewScript(Username username, ScriptName name, long scriptSize) {
+        return cassandraSieveDAO.getScript(username, name)
             .map(Script::getSize)
             .switchIfEmpty(Mono.just(0L))
             .map(sizeOfStoredScript -> scriptSize - sizeOfStoredScript);
@@ -112,10 +112,10 @@ public class CassandraSieveRepository implements SieveRepository {
     }
 
     @Override
-    public void putScript(User user, ScriptName name, ScriptContent content) throws QuotaExceededException {
+    public void putScript(Username username, ScriptName name, ScriptContent content) throws QuotaExceededException {
         Function<Long, Mono<Void>> updateAndInsert = spaceUsed -> Flux.merge(
-                updateSpaceUsed(user, spaceUsed),
-                cassandraSieveDAO.insertScript(user,
+                updateSpaceUsed(username, spaceUsed),
+                cassandraSieveDAO.insertScript(username,
                         Script.builder()
                                 .name(name)
                                 .content(content)
@@ -124,8 +124,8 @@ public class CassandraSieveRepository implements SieveRepository {
                 .then();
 
         reThrowQuotaExceededException(() ->
-            spaceThatWillBeUsedByNewScript(user, name, content.length())
-                .flatMap(spaceUsed -> throwOnOverQuota(user, spaceUsed)
+            spaceThatWillBeUsedByNewScript(username, name, content.length())
+                .flatMap(spaceUsed -> throwOnOverQuota(username, spaceUsed)
                         .thenEmpty(updateAndInsert.apply(spaceUsed)))
                 .block());
     }
@@ -140,23 +140,23 @@ public class CassandraSieveRepository implements SieveRepository {
        }
     }
 
-    private Mono<Void> updateSpaceUsed(User user, long spaceUsed) {
+    private Mono<Void> updateSpaceUsed(Username username, long spaceUsed) {
         if (spaceUsed == 0) {
             return Mono.empty();
         }
-        return cassandraSieveQuotaDAO.updateSpaceUsed(user, spaceUsed);
+        return cassandraSieveQuotaDAO.updateSpaceUsed(username, spaceUsed);
     }
 
     @Override
-    public List<ScriptSummary> listScripts(User user) {
-        return cassandraSieveDAO.listScripts(user).collect(Guavate.toImmutableList()).block();
+    public List<ScriptSummary> listScripts(Username username) {
+        return cassandraSieveDAO.listScripts(username).collect(Guavate.toImmutableList()).block();
     }
 
     @Override
-    public InputStream getActive(User user) throws ScriptNotFoundException {
+    public InputStream getActive(Username username) throws ScriptNotFoundException {
         return IOUtils.toInputStream(
-            cassandraActiveScriptDAO.getActiveSctiptInfo(user)
-                .flatMap(activeScriptInfo -> cassandraSieveDAO.getScript(user, activeScriptInfo.getName()))
+            cassandraActiveScriptDAO.getActiveSctiptInfo(username)
+                .flatMap(activeScriptInfo -> cassandraSieveDAO.getScript(username, activeScriptInfo.getName()))
                 .blockOptional()
                 .orElseThrow(ScriptNotFoundException::new)
                 .getContent()
@@ -164,85 +164,85 @@ public class CassandraSieveRepository implements SieveRepository {
     }
 
     @Override
-    public void setActive(User user, ScriptName name) throws ScriptNotFoundException {
+    public void setActive(Username username, ScriptName name) throws ScriptNotFoundException {
         Mono<Boolean> activateNewScript =
-            unactivateOldScript(user)
-                .then(updateScriptActivation(user, name, true))
+            unactivateOldScript(username)
+                .then(updateScriptActivation(username, name, true))
                 .filter(FunctionalUtils.identityPredicate())
-                .flatMap(any -> cassandraActiveScriptDAO.activate(user, name).thenReturn(any));
+                .flatMap(any -> cassandraActiveScriptDAO.activate(username, name).thenReturn(any));
 
         if (!activateNewScript.blockOptional().isPresent()) {
             throw new ScriptNotFoundException();
         }
     }
 
-    private Mono<Void> unactivateOldScript(User user) {
-        return cassandraActiveScriptDAO.getActiveSctiptInfo(user)
-            .flatMap(activeScriptInfo -> updateScriptActivation(user, activeScriptInfo.getName(), false).then());
+    private Mono<Void> unactivateOldScript(Username username) {
+        return cassandraActiveScriptDAO.getActiveSctiptInfo(username)
+            .flatMap(activeScriptInfo -> updateScriptActivation(username, activeScriptInfo.getName(), false).then());
     }
 
-    private Mono<Boolean> updateScriptActivation(User user, ScriptName scriptName, boolean active) {
+    private Mono<Boolean> updateScriptActivation(Username username, ScriptName scriptName, boolean active) {
         if (!scriptName.equals(SieveRepository.NO_SCRIPT_NAME)) {
-            return cassandraSieveDAO.updateScriptActivation(user, scriptName, active);
+            return cassandraSieveDAO.updateScriptActivation(username, scriptName, active);
         }
-        return cassandraActiveScriptDAO.unactivate(user).thenReturn(true);
+        return cassandraActiveScriptDAO.unactivate(username).thenReturn(true);
     }
 
     @Override
-    public InputStream getScript(User user, ScriptName name) throws ScriptNotFoundException {
-        return  cassandraSieveDAO.getScript(user, name)
+    public InputStream getScript(Username username, ScriptName name) throws ScriptNotFoundException {
+        return  cassandraSieveDAO.getScript(username, name)
             .blockOptional()
             .map(script -> IOUtils.toInputStream(script.getContent().getValue(), StandardCharsets.UTF_8))
             .orElseThrow(ScriptNotFoundException::new);
     }
 
     @Override
-    public void deleteScript(User user, ScriptName name) throws ScriptNotFoundException, IsActiveException {
-        ensureIsNotActive(user, name);
-        if (!cassandraSieveDAO.deleteScriptInCassandra(user, name).switchIfEmpty(Mono.just(false)).block()) {
+    public void deleteScript(Username username, ScriptName name) throws ScriptNotFoundException, IsActiveException {
+        ensureIsNotActive(username, name);
+        if (!cassandraSieveDAO.deleteScriptInCassandra(username, name).switchIfEmpty(Mono.just(false)).block()) {
             throw new ScriptNotFoundException();
         }
     }
 
-    private void ensureIsNotActive(User user, ScriptName name) throws IsActiveException {
-        Optional<ScriptName> activeName = cassandraActiveScriptDAO.getActiveSctiptInfo(user).blockOptional().map(ActiveScriptInfo::getName);
+    private void ensureIsNotActive(Username username, ScriptName name) throws IsActiveException {
+        Optional<ScriptName> activeName = cassandraActiveScriptDAO.getActiveSctiptInfo(username).blockOptional().map(ActiveScriptInfo::getName);
         if (activeName.isPresent() && name.equals(activeName.get())) {
             throw new IsActiveException();
         }
     }
 
     @Override
-    public void renameScript(User user, ScriptName oldName, ScriptName newName) throws ScriptNotFoundException, DuplicateException {
-        Mono<Script> oldScript = cassandraSieveDAO.getScript(user, oldName).cache();
-        Mono<Boolean> newScriptExists = cassandraSieveDAO.getScript(user, newName).hasElement();
+    public void renameScript(Username username, ScriptName oldName, ScriptName newName) throws ScriptNotFoundException, DuplicateException {
+        Mono<Script> oldScript = cassandraSieveDAO.getScript(username, oldName).cache();
+        Mono<Boolean> newScriptExists = cassandraSieveDAO.getScript(username, newName).hasElement();
 
         oldScript.block();
         if (newScriptExists.block()) {
             throw new DuplicateException();
         }
 
-        performScriptRename(user,
+        performScriptRename(username,
             newName,
             oldScript.blockOptional().orElseThrow(ScriptNotFoundException::new));
     }
 
-    private void performScriptRename(User user, ScriptName newName, Script oldScript) {
+    private void performScriptRename(Username username, ScriptName newName, Script oldScript) {
         Flux.merge(
-            cassandraSieveDAO.insertScript(user,
+            cassandraSieveDAO.insertScript(username,
                 Script.builder()
                     .copyOf(oldScript)
                     .name(newName)
                     .build()),
-            cassandraSieveDAO.deleteScriptInCassandra(user, oldScript.getName()),
-            performActiveScriptRename(user, oldScript.getName(), newName))
+            cassandraSieveDAO.deleteScriptInCassandra(username, oldScript.getName()),
+            performActiveScriptRename(username, oldScript.getName(), newName))
             .then()
             .block();
     }
 
-    private Mono<Void> performActiveScriptRename(User user, ScriptName oldName, ScriptName newName) {
-        return cassandraActiveScriptDAO.getActiveSctiptInfo(user)
+    private Mono<Void> performActiveScriptRename(Username username, ScriptName oldName, ScriptName newName) {
+        return cassandraActiveScriptDAO.getActiveSctiptInfo(username)
             .filter(activeScriptInfo -> activeScriptInfo.getName().equals(oldName))
-            .flatMap(name -> cassandraActiveScriptDAO.activate(user, newName));
+            .flatMap(name -> cassandraActiveScriptDAO.activate(username, newName));
     }
 
     @Override
@@ -270,8 +270,8 @@ public class CassandraSieveRepository implements SieveRepository {
     }
 
     @Override
-    public boolean hasQuota(User user) {
-        Mono<Boolean> hasUserQuota = cassandraSieveQuotaDAO.getQuota(user).map(Optional::isPresent);
+    public boolean hasQuota(Username username) {
+        Mono<Boolean> hasUserQuota = cassandraSieveQuotaDAO.getQuota(username).map(Optional::isPresent);
         Mono<Boolean> hasGlobalQuota = cassandraSieveQuotaDAO.getQuota().map(Optional::isPresent);
 
         return hasUserQuota.zipWith(hasGlobalQuota, (a, b) -> a || b)
@@ -279,20 +279,20 @@ public class CassandraSieveRepository implements SieveRepository {
     }
 
     @Override
-    public QuotaSize getQuota(User user) throws QuotaNotFoundException {
-        return cassandraSieveQuotaDAO.getQuota(user)
+    public QuotaSize getQuota(Username username) throws QuotaNotFoundException {
+        return cassandraSieveQuotaDAO.getQuota(username)
             .block()
             .orElseThrow(QuotaNotFoundException::new);
     }
 
     @Override
-    public void setQuota(User user, QuotaSize quota) {
-        cassandraSieveQuotaDAO.setQuota(user, quota).block();
+    public void setQuota(Username username, QuotaSize quota) {
+        cassandraSieveQuotaDAO.setQuota(username, quota).block();
     }
 
     @Override
-    public void removeQuota(User user) {
-        cassandraSieveQuotaDAO.removeQuota(user).block();
+    public void removeQuota(Username username) {
+        cassandraSieveQuotaDAO.removeQuota(username).block();
     }
 
 }
diff --git a/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraActiveScriptDAOTest.java b/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraActiveScriptDAOTest.java
index df5dccc..8c6dba1 100644
--- a/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraActiveScriptDAOTest.java
+++ b/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraActiveScriptDAOTest.java
@@ -25,7 +25,7 @@ import java.util.Optional;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.sieve.cassandra.model.ActiveScriptInfo;
 import org.apache.james.sieverepository.api.ScriptName;
 import org.junit.jupiter.api.BeforeEach;
@@ -33,7 +33,7 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 class CassandraActiveScriptDAOTest {
-    private static final User USER = User.fromUsername("user");
+    private static final Username USERNAME = Username.fromUsername("user");
     private static final ScriptName SCRIPT_NAME = new ScriptName("sciptName");
     private static final ScriptName NEW_SCRIPT_NAME = new ScriptName("newScriptName");
 
@@ -49,15 +49,15 @@ class CassandraActiveScriptDAOTest {
 
     @Test
     void getActiveSctiptInfoShouldReturnEmptyByDefault() {
-        assertThat(activeScriptDAO.getActiveSctiptInfo(USER).blockOptional().isPresent())
+        assertThat(activeScriptDAO.getActiveSctiptInfo(USERNAME).blockOptional().isPresent())
             .isFalse();
     }
 
     @Test
     void getActiveSctiptInfoShouldReturnStoredName() {
-        activeScriptDAO.activate(USER, SCRIPT_NAME).block();
+        activeScriptDAO.activate(USERNAME, SCRIPT_NAME).block();
 
-        Optional<ActiveScriptInfo> actual = activeScriptDAO.getActiveSctiptInfo(USER).blockOptional();
+        Optional<ActiveScriptInfo> actual = activeScriptDAO.getActiveSctiptInfo(USERNAME).blockOptional();
 
         assertThat(actual.isPresent()).isTrue();
         assertThat(actual.get().getName()).isEqualTo(SCRIPT_NAME);
@@ -65,30 +65,30 @@ class CassandraActiveScriptDAOTest {
 
     @Test
     void activateShouldAllowRename() {
-        activeScriptDAO.activate(USER, SCRIPT_NAME).block();
+        activeScriptDAO.activate(USERNAME, SCRIPT_NAME).block();
 
-        activeScriptDAO.activate(USER, NEW_SCRIPT_NAME).block();
+        activeScriptDAO.activate(USERNAME, NEW_SCRIPT_NAME).block();
 
-        Optional<ActiveScriptInfo> actual = activeScriptDAO.getActiveSctiptInfo(USER).blockOptional();
+        Optional<ActiveScriptInfo> actual = activeScriptDAO.getActiveSctiptInfo(USERNAME).blockOptional();
         assertThat(actual.isPresent()).isTrue();
         assertThat(actual.get().getName()).isEqualTo(NEW_SCRIPT_NAME);
     }
 
     @Test
     void unactivateShouldAllowRemovingActiveScript() {
-        activeScriptDAO.activate(USER, SCRIPT_NAME).block();
+        activeScriptDAO.activate(USERNAME, SCRIPT_NAME).block();
 
-        activeScriptDAO.unactivate(USER).block();
+        activeScriptDAO.unactivate(USERNAME).block();
 
-        Optional<ActiveScriptInfo> actual = activeScriptDAO.getActiveSctiptInfo(USER).blockOptional();
+        Optional<ActiveScriptInfo> actual = activeScriptDAO.getActiveSctiptInfo(USERNAME).blockOptional();
         assertThat(actual.isPresent()).isFalse();
     }
 
     @Test
     void unactivateShouldWorkWhenNoneStore() {
-        activeScriptDAO.unactivate(USER).block();
+        activeScriptDAO.unactivate(USERNAME).block();
 
-        Optional<ActiveScriptInfo> actual = activeScriptDAO.getActiveSctiptInfo(USER).blockOptional();
+        Optional<ActiveScriptInfo> actual = activeScriptDAO.getActiveSctiptInfo(USERNAME).blockOptional();
         assertThat(actual.isPresent()).isFalse();
     }
 }
diff --git a/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveDAOTest.java b/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveDAOTest.java
index b7c216c..32adb6d 100644
--- a/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveDAOTest.java
+++ b/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveDAOTest.java
@@ -25,7 +25,7 @@ import java.util.Optional;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.sieve.cassandra.model.Script;
 import org.apache.james.sieverepository.api.ScriptName;
 import org.junit.jupiter.api.BeforeEach;
@@ -34,7 +34,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 
 class CassandraSieveDAOTest {
 
-    private static final User USER = User.fromUsername("user");
+    private static final Username USERNAME = Username.fromUsername("user");
     private static final ScriptName SCRIPT_NAME = new ScriptName("scriptName");
     private static final ScriptName SCRIPT_NAME2 = new ScriptName("scriptName2");
     private static final Script SCRIPT = Script.builder()
@@ -68,68 +68,68 @@ class CassandraSieveDAOTest {
     
      @Test
     void getScriptShouldReturnEmptyByDefault() {
-        assertThat(sieveDAO.getScript(USER, SCRIPT_NAME).blockOptional())
+        assertThat(sieveDAO.getScript(USERNAME, SCRIPT_NAME).blockOptional())
             .isEmpty();
     }
 
     @Test
     void getScriptShouldReturnStoredScript() {
-        sieveDAO.insertScript(USER, SCRIPT).block();
+        sieveDAO.insertScript(USERNAME, SCRIPT).block();
 
-        Optional<Script> actual = sieveDAO.getScript(USER, SCRIPT_NAME).blockOptional();
+        Optional<Script> actual = sieveDAO.getScript(USERNAME, SCRIPT_NAME).blockOptional();
 
         assertThat(actual).contains(SCRIPT);
     }
 
     @Test
     void insertScriptShouldUpdateContent() {
-        sieveDAO.insertScript(USER, SCRIPT).block();
+        sieveDAO.insertScript(USERNAME, SCRIPT).block();
 
-        sieveDAO.insertScript(USER, SCRIPT_NEW_CONTENT).block();
+        sieveDAO.insertScript(USERNAME, SCRIPT_NEW_CONTENT).block();
 
-        Optional<Script> actual = sieveDAO.getScript(USER, SCRIPT_NAME).blockOptional();
+        Optional<Script> actual = sieveDAO.getScript(USERNAME, SCRIPT_NAME).blockOptional();
         assertThat(actual).contains(SCRIPT_NEW_CONTENT);
     }
 
     @Test
     void insertScriptShouldUpdateActivate() {
-        sieveDAO.insertScript(USER, SCRIPT).block();
+        sieveDAO.insertScript(USERNAME, SCRIPT).block();
 
-        sieveDAO.insertScript(USER, ACTIVE_SCRIPT).block();
+        sieveDAO.insertScript(USERNAME, ACTIVE_SCRIPT).block();
 
-        Optional<Script> actual = sieveDAO.getScript(USER, SCRIPT_NAME).blockOptional();
+        Optional<Script> actual = sieveDAO.getScript(USERNAME, SCRIPT_NAME).blockOptional();
         assertThat(actual).contains(ACTIVE_SCRIPT);
     }
 
     @Test
     void deleteScriptInCassandraShouldWork() {
-        sieveDAO.insertScript(USER, SCRIPT).block();
+        sieveDAO.insertScript(USERNAME, SCRIPT).block();
 
-        sieveDAO.deleteScriptInCassandra(USER, SCRIPT_NAME).block();
+        sieveDAO.deleteScriptInCassandra(USERNAME, SCRIPT_NAME).block();
 
-        Optional<Script> actual = sieveDAO.getScript(USER, SCRIPT_NAME).blockOptional();
+        Optional<Script> actual = sieveDAO.getScript(USERNAME, SCRIPT_NAME).blockOptional();
         assertThat(actual).isEmpty();
     }
 
     @Test
     void deleteScriptInCassandraShouldWorkWhenNoneStore() {
-        sieveDAO.deleteScriptInCassandra(USER, SCRIPT_NAME).block();
+        sieveDAO.deleteScriptInCassandra(USERNAME, SCRIPT_NAME).block();
 
-        Optional<Script> actual = sieveDAO.getScript(USER, SCRIPT_NAME).blockOptional();
+        Optional<Script> actual = sieveDAO.getScript(USERNAME, SCRIPT_NAME).blockOptional();
         assertThat(actual).isEmpty();
     }
 
     @Test
     void listScriptsShouldReturnEmpty() {
-        assertThat(sieveDAO.listScripts(USER).toIterable()).isEmpty();
+        assertThat(sieveDAO.listScripts(USERNAME).toIterable()).isEmpty();
     }
 
     @Test
     void listScriptsShouldReturnSingleStoredValue() {
-        sieveDAO.insertScript(USER, SCRIPT).block();
-        sieveDAO.insertScript(USER, SCRIPT2).block();
+        sieveDAO.insertScript(USERNAME, SCRIPT).block();
+        sieveDAO.insertScript(USERNAME, SCRIPT2).block();
 
-        assertThat(sieveDAO.listScripts(USER).toIterable())
+        assertThat(sieveDAO.listScripts(USERNAME).toIterable())
             .containsOnly(SCRIPT.toSummary(), SCRIPT2.toSummary());
     }
 }
diff --git a/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAOTest.java b/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAOTest.java
index 845cc9e..4839e80 100644
--- a/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAOTest.java
+++ b/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAOTest.java
@@ -23,14 +23,14 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.core.quota.QuotaSize;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 class CassandraSieveQuotaDAOTest {
-    private static final User USER = User.fromUsername("user");
+    private static final Username USERNAME = Username.fromUsername("user");
     private static final QuotaSize QUOTA_SIZE = QuotaSize.size(15L);
 
     @RegisterExtension
@@ -51,7 +51,7 @@ class CassandraSieveQuotaDAOTest {
 
     @Test
     void getQuotaUserShouldReturnEmptyByDefault() {
-        assertThat(sieveQuotaDAO.getQuota(USER).block())
+        assertThat(sieveQuotaDAO.getQuota(USERNAME).block())
             .isEmpty();
     }
 
@@ -65,9 +65,9 @@ class CassandraSieveQuotaDAOTest {
 
     @Test
     void getQuotaUserShouldReturnStoredValue() {
-        sieveQuotaDAO.setQuota(USER, QUOTA_SIZE).block();
+        sieveQuotaDAO.setQuota(USERNAME, QUOTA_SIZE).block();
 
-        assertThat(sieveQuotaDAO.getQuota(USER).block())
+        assertThat(sieveQuotaDAO.getQuota(USERNAME).block())
             .contains(QUOTA_SIZE);
     }
 
@@ -83,11 +83,11 @@ class CassandraSieveQuotaDAOTest {
 
     @Test
     void removeQuotaUserShouldDeleteQuotaUser() {
-        sieveQuotaDAO.setQuota(USER, QUOTA_SIZE).block();
+        sieveQuotaDAO.setQuota(USERNAME, QUOTA_SIZE).block();
 
-        sieveQuotaDAO.removeQuota(USER).block();
+        sieveQuotaDAO.removeQuota(USERNAME).block();
 
-        assertThat(sieveQuotaDAO.getQuota(USER).block())
+        assertThat(sieveQuotaDAO.getQuota(USERNAME).block())
             .isEmpty();
     }
 
@@ -101,43 +101,43 @@ class CassandraSieveQuotaDAOTest {
 
     @Test
     void removeQuotaUserShouldWorkWhenNoneStore() {
-        sieveQuotaDAO.removeQuota(USER).block();
+        sieveQuotaDAO.removeQuota(USERNAME).block();
 
-        assertThat(sieveQuotaDAO.getQuota(USER).block())
+        assertThat(sieveQuotaDAO.getQuota(USERNAME).block())
             .isEmpty();
     }
 
     @Test
     void spaceUsedByShouldReturnZeroByDefault() {
-        assertThat(sieveQuotaDAO.spaceUsedBy(USER).block()).isEqualTo(0);
+        assertThat(sieveQuotaDAO.spaceUsedBy(USERNAME).block()).isEqualTo(0);
     }
 
     @Test
     void spaceUsedByShouldReturnStoredValue() {
         long spaceUsed = 18L;
 
-        sieveQuotaDAO.updateSpaceUsed(USER, spaceUsed).block();
+        sieveQuotaDAO.updateSpaceUsed(USERNAME, spaceUsed).block();
 
-        assertThat(sieveQuotaDAO.spaceUsedBy(USER).block()).isEqualTo(spaceUsed);
+        assertThat(sieveQuotaDAO.spaceUsedBy(USERNAME).block()).isEqualTo(spaceUsed);
     }
 
     @Test
     void updateSpaceUsedShouldBeAdditive() {
         long spaceUsed = 18L;
 
-        sieveQuotaDAO.updateSpaceUsed(USER, spaceUsed).block();
-        sieveQuotaDAO.updateSpaceUsed(USER, spaceUsed).block();
+        sieveQuotaDAO.updateSpaceUsed(USERNAME, spaceUsed).block();
+        sieveQuotaDAO.updateSpaceUsed(USERNAME, spaceUsed).block();
 
-        assertThat(sieveQuotaDAO.spaceUsedBy(USER).block()).isEqualTo(2 * spaceUsed);
+        assertThat(sieveQuotaDAO.spaceUsedBy(USERNAME).block()).isEqualTo(2 * spaceUsed);
     }
 
     @Test
     void updateSpaceUsedShouldWorkWithNegativeValues() {
         long spaceUsed = 18L;
 
-        sieveQuotaDAO.updateSpaceUsed(USER, spaceUsed).block();
-        sieveQuotaDAO.updateSpaceUsed(USER, -1 * spaceUsed).block();
+        sieveQuotaDAO.updateSpaceUsed(USERNAME, spaceUsed).block();
+        sieveQuotaDAO.updateSpaceUsed(USERNAME, -1 * spaceUsed).block();
 
-        assertThat(sieveQuotaDAO.spaceUsedBy(USER).block()).isEqualTo(0L);
+        assertThat(sieveQuotaDAO.spaceUsedBy(USERNAME).block()).isEqualTo(0L);
     }
 }
diff --git a/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveFileRepository.java b/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveFileRepository.java
index 56e5a98..2d549e8 100644
--- a/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveFileRepository.java
+++ b/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveFileRepository.java
@@ -41,7 +41,7 @@ import java.util.Scanner;
 import javax.inject.Inject;
 
 import org.apache.commons.io.FileUtils;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.core.quota.QuotaSize;
 import org.apache.james.filesystem.api.FileSystem;
 import org.apache.james.sieverepository.api.ScriptContent;
@@ -141,11 +141,11 @@ public class SieveFileRepository implements SieveRepository {
     }
 
     @Override
-    public void deleteScript(User user, ScriptName name) throws ScriptNotFoundException, IsActiveException, StorageException {
+    public void deleteScript(Username username, ScriptName name) throws ScriptNotFoundException, IsActiveException, StorageException {
         synchronized (lock) {
-            File file = getScriptFile(user, name);
-            if (isActiveFile(user, file)) {
-                throw new IsActiveException("User: " + user.asString() + "Script: " + name);
+            File file = getScriptFile(username, name);
+            if (isActiveFile(username, file)) {
+                throw new IsActiveException("User: " + username.asString() + "Script: " + name);
             }
             try {
                 FileUtils.forceDelete(file);
@@ -156,10 +156,10 @@ public class SieveFileRepository implements SieveRepository {
     }
 
     @Override
-    public InputStream getScript(User user, ScriptName name) throws ScriptNotFoundException, StorageException {
+    public InputStream getScript(Username username, ScriptName name) throws ScriptNotFoundException, StorageException {
         InputStream script;
         try {
-            script = new FileInputStream(getScriptFile(user, name));
+            script = new FileInputStream(getScriptFile(username, name));
         } catch (FileNotFoundException ex) {
             throw new ScriptNotFoundException(ex);
         }
@@ -173,14 +173,14 @@ public class SieveFileRepository implements SieveRepository {
      * The '.quota' file contains a single positive integer value representing the quota in octets.
      */
     @Override
-    public void haveSpace(User user, ScriptName name, long size) throws QuotaExceededException, StorageException {
-        long usedSpace = Arrays.stream(getUserDirectory(user).listFiles())
+    public void haveSpace(Username username, ScriptName name, long size) throws QuotaExceededException, StorageException {
+        long usedSpace = Arrays.stream(getUserDirectory(username).listFiles())
             .filter(file -> !(file.getName().equals(name.getValue()) || SYSTEM_FILES.contains(file.getName())))
             .mapToLong(File::length)
             .sum();
 
         long quota = Long.MAX_VALUE;
-        File file = getQuotaFile(user);
+        File file = getQuotaFile(username);
         if (!file.exists()) {
             file = getQuotaFile();
         }
@@ -198,12 +198,12 @@ public class SieveFileRepository implements SieveRepository {
     }
 
     @Override
-    public List<ScriptSummary> listScripts(User user) throws StorageException {
-        File[] files = getUserDirectory(user).listFiles();
+    public List<ScriptSummary> listScripts(Username username) throws StorageException {
+        File[] files = getUserDirectory(username).listFiles();
         List<ScriptSummary> summaries = new ArrayList<>(files.length);
         File activeFile = null;
         try {
-            activeFile = getActiveFile(user);
+            activeFile = getActiveFile(username);
         } catch (ScriptNotFoundException ex) {
             // no op
         }
@@ -221,27 +221,27 @@ public class SieveFileRepository implements SieveRepository {
     }
 
     @Override
-    public void putScript(User user, ScriptName name, ScriptContent content) throws StorageException, QuotaExceededException {
+    public void putScript(Username username, ScriptName name, ScriptContent content) throws StorageException, QuotaExceededException {
         synchronized (lock) {
-            File file = new File(getUserDirectory(user), name.getValue());
-            haveSpace(user, name, content.length());
+            File file = new File(getUserDirectory(username), name.getValue());
+            haveSpace(username, name, content.length());
             toFile(file, content.getValue());
         }
     }
 
     @Override
-    public void renameScript(User user, ScriptName oldName, ScriptName newName)
+    public void renameScript(Username username, ScriptName oldName, ScriptName newName)
             throws ScriptNotFoundException, DuplicateException, StorageException {
         synchronized (lock) {
-            File oldFile = getScriptFile(user, oldName);
-            File newFile = new File(getUserDirectory(user), newName.getValue());
+            File oldFile = getScriptFile(username, oldName);
+            File newFile = new File(getUserDirectory(username), newName.getValue());
             if (newFile.exists()) {
-                throw new DuplicateException("User: " + user.asString() + "Script: " + newName);
+                throw new DuplicateException("User: " + username.asString() + "Script: " + newName);
             }
             try {
                 FileUtils.copyFile(oldFile, newFile);
-                if (isActiveFile(user, oldFile)) {
-                    setActiveFile(newFile, user, true);
+                if (isActiveFile(username, oldFile)) {
+                    setActiveFile(newFile, username, true);
                 }
                 FileUtils.forceDelete(oldFile);
             } catch (IOException ex) {
@@ -251,10 +251,10 @@ public class SieveFileRepository implements SieveRepository {
     }
 
     @Override
-    public InputStream getActive(User user) throws ScriptNotFoundException, StorageException {
+    public InputStream getActive(Username username) throws ScriptNotFoundException, StorageException {
         InputStream script;
         try {
-            script = new FileInputStream(getActiveFile(user));
+            script = new FileInputStream(getActiveFile(username));
         } catch (FileNotFoundException ex) {
             throw new ScriptNotFoundException(ex);
         }
@@ -262,18 +262,18 @@ public class SieveFileRepository implements SieveRepository {
     }
 
     @Override
-    public ZonedDateTime getActivationDateForActiveScript(User user) throws StorageException, ScriptNotFoundException {
-        return ZonedDateTime.ofInstant(Instant.ofEpochMilli(getActiveFile(user).lastModified()), ZoneOffset.UTC);
+    public ZonedDateTime getActivationDateForActiveScript(Username username) throws StorageException, ScriptNotFoundException {
+        return ZonedDateTime.ofInstant(Instant.ofEpochMilli(getActiveFile(username).lastModified()), ZoneOffset.UTC);
     }
 
     @Override
-    public void setActive(User user, ScriptName scriptName) throws ScriptNotFoundException, StorageException {
+    public void setActive(Username username, ScriptName scriptName) throws ScriptNotFoundException, StorageException {
         synchronized (lock) {
             // Turn off currently active script, if any
             File oldActive = null;
             try {
-                oldActive = getActiveFile(user);
-                setActiveFile(oldActive, user, false);
+                oldActive = getActiveFile(username);
+                setActiveFile(oldActive, username, false);
             } catch (ScriptNotFoundException ex) {
                 // This is permissible
             }
@@ -281,10 +281,10 @@ public class SieveFileRepository implements SieveRepository {
             String name = scriptName.getValue();
             if ((null != name) && (!name.trim().isEmpty())) {
                 try {
-                    setActiveFile(getScriptFile(user, new ScriptName(name)), user, true);
+                    setActiveFile(getScriptFile(username, new ScriptName(name)), username, true);
                 } catch (ScriptNotFoundException ex) {
                     if (null != oldActive) {
-                        setActiveFile(oldActive, user, true);
+                        setActiveFile(oldActive, username, true);
                     }
                     throw ex;
                 }
@@ -300,38 +300,38 @@ public class SieveFileRepository implements SieveRepository {
         }
     }
 
-    protected File getUserDirectory(User user) throws StorageException {
-        File file = getUserDirectoryFile(user);
+    protected File getUserDirectory(Username username) throws StorageException {
+        File file = getUserDirectoryFile(username);
         if (!file.exists()) {
-            ensureUser(user);
+            ensureUser(username);
         }
         return file;
     }
 
-    protected File getUserDirectoryFile(User user) throws StorageException {
-        return new File(getSieveRootDirectory(), user.asString() + '/');
+    protected File getUserDirectoryFile(Username username) throws StorageException {
+        return new File(getSieveRootDirectory(), username.asString() + '/');
     }
 
-    protected File getActiveFile(User user) throws ScriptNotFoundException, StorageException {
-        File dir = getUserDirectory(user);
+    protected File getActiveFile(Username username) throws ScriptNotFoundException, StorageException {
+        File dir = getUserDirectory(username);
         String content;
         try {
             content = toString(new File(dir, FILE_NAME_ACTIVE), UTF_8);
         } catch (FileNotFoundException ex) {
-            throw new ScriptNotFoundException("There is no active script for user " + user.asString());
+            throw new ScriptNotFoundException("There is no active script for user " + username.asString());
         }
         return new File(dir, content);
     }
 
-    protected boolean isActiveFile(User user, File file) throws StorageException {
+    protected boolean isActiveFile(Username username, File file) throws StorageException {
         try {
-            return 0 == getActiveFile(user).compareTo(file);
+            return 0 == getActiveFile(username).compareTo(file);
         } catch (ScriptNotFoundException ex) {
             return false;
         }
     }
 
-    protected void setActiveFile(File scriptToBeActivated, User userName, boolean isActive) throws StorageException {
+    protected void setActiveFile(File scriptToBeActivated, Username userName, boolean isActive) throws StorageException {
         File personalScriptDirectory = scriptToBeActivated.getParentFile();
         File sieveBaseDirectory = personalScriptDirectory.getParentFile();
         File activeScriptPersistenceFile = new File(personalScriptDirectory, FILE_NAME_ACTIVE);
@@ -353,20 +353,20 @@ public class SieveFileRepository implements SieveRepository {
         }
     }
 
-    protected File getScriptFile(User user, ScriptName name) throws ScriptNotFoundException, StorageException {
-        File file = new File(getUserDirectory(user), name.getValue());
+    protected File getScriptFile(Username username, ScriptName name) throws ScriptNotFoundException, StorageException {
+        File file = new File(getUserDirectory(username), name.getValue());
         if (!file.exists()) {
-            throw new ScriptNotFoundException("User: " + user + "Script: " + name);
+            throw new ScriptNotFoundException("User: " + username + "Script: " + name);
         }
         return file;
     }
 
-    public void ensureUser(User user) throws StorageException {
+    public void ensureUser(Username username) throws StorageException {
         synchronized (lock) {
             try {
-                FileUtils.forceMkdir(getUserDirectoryFile(user));
+                FileUtils.forceMkdir(getUserDirectoryFile(username));
             } catch (IOException e) {
-                throw new StorageException("Error while creating directory for " + user, e);
+                throw new StorageException("Error while creating directory for " + username, e);
             }
         }
     }
@@ -417,19 +417,19 @@ public class SieveFileRepository implements SieveRepository {
         toFile(file, content);
     }
 
-    protected File getQuotaFile(User user) throws StorageException {
-        return new File(getUserDirectory(user), FILE_NAME_QUOTA);
+    protected File getQuotaFile(Username username) throws StorageException {
+        return new File(getUserDirectory(username), FILE_NAME_QUOTA);
     }
 
     @Override
-    public boolean hasQuota(User user) throws StorageException {
-        return getQuotaFile(user).exists();
+    public boolean hasQuota(Username username) throws StorageException {
+        return getQuotaFile(username).exists();
     }
 
     @Override
-    public QuotaSize getQuota(User user) throws QuotaNotFoundException, StorageException {
+    public QuotaSize getQuota(Username username) throws QuotaNotFoundException, StorageException {
         Long quota = null;
-        File file = getQuotaFile(user);
+        File file = getQuotaFile(username);
         if (file.exists()) {
             try (Scanner scanner = new Scanner(file, UTF_8)) {
                 quota = scanner.nextLong();
@@ -438,15 +438,15 @@ public class SieveFileRepository implements SieveRepository {
             }
         }
         if (null == quota) {
-            throw new QuotaNotFoundException("No quota for user: " + user.asString());
+            throw new QuotaNotFoundException("No quota for user: " + username.asString());
         }
         return QuotaSize.size(quota);
     }
 
     @Override
-    public void removeQuota(User user) throws QuotaNotFoundException, StorageException {
+    public void removeQuota(Username username) throws QuotaNotFoundException, StorageException {
         synchronized (lock) {
-            File file = getQuotaFile(user);
+            File file = getQuotaFile(username);
             if (!file.exists()) {
                 return;
             }
@@ -459,9 +459,9 @@ public class SieveFileRepository implements SieveRepository {
     }
 
     @Override
-    public void setQuota(User user, QuotaSize quota) throws StorageException {
+    public void setQuota(Username username, QuotaSize quota) throws StorageException {
         synchronized (lock) {
-            File file = getQuotaFile(user);
+            File file = getQuotaFile(username);
             String content = Long.toString(quota.asLong());
             toFile(file, content);
         }
diff --git a/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/filtering/DTOTest.java b/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/filtering/DTOTest.java
index 17c2092..9c4e95f 100644
--- a/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/filtering/DTOTest.java
+++ b/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/filtering/DTOTest.java
@@ -28,7 +28,7 @@ import static org.apache.james.jmap.api.filtering.RuleFixture.RULE_SUBJECT;
 import static org.apache.james.jmap.api.filtering.RuleFixture.RULE_TO;
 import static org.assertj.core.api.Assertions.assertThat;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.eventsourcing.EventId;
 import org.apache.james.jmap.api.filtering.impl.FilteringAggregateId;
 import org.apache.james.jmap.api.filtering.impl.RuleSetDefined;
@@ -47,17 +47,17 @@ public class DTOTest {
     static final String EVENT_COMPLEX_JSON = ClassLoaderUtils.getSystemResourceAsString("json/eventComplex.json");
     static final FilteringRuleSetDefinedDTO SIMPLE_DTO = FilteringRuleSetDefinedDTO.from(
             new RuleSetDefined(
-                    new FilteringAggregateId(User.fromUsername("Bart")),
+                    new FilteringAggregateId(Username.fromUsername("Bart")),
                     EventId.first(),
                     ImmutableList.of(RULE_1, RULE_2)));
     static final FilteringRuleSetDefinedDTO EMPTY_DTO = FilteringRuleSetDefinedDTO.from(
             new RuleSetDefined(
-                    new FilteringAggregateId(User.fromUsername("Bart")),
+                    new FilteringAggregateId(Username.fromUsername("Bart")),
                     EventId.first(),
                     ImmutableList.of()));
     static final FilteringRuleSetDefinedDTO COMPLEX_DTO = FilteringRuleSetDefinedDTO.from(
             new RuleSetDefined(
-                    new FilteringAggregateId(User.fromUsername("Bart")),
+                    new FilteringAggregateId(Username.fromUsername("Bart")),
                     EventId.first(),
                     ImmutableList.of(RULE_FROM, RULE_RECIPIENT, RULE_SUBJECT, RULE_TO)));
 
diff --git a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/FilteringManagement.java b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/FilteringManagement.java
index b39f691..c8aec6a 100644
--- a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/FilteringManagement.java
+++ b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/FilteringManagement.java
@@ -22,22 +22,22 @@ package org.apache.james.jmap.api.filtering;
 import java.util.Arrays;
 import java.util.List;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 
 import com.google.common.collect.ImmutableList;
 
 public interface FilteringManagement {
 
-    void defineRulesForUser(User user, List<Rule> rules);
+    void defineRulesForUser(Username username, List<Rule> rules);
 
-    default void defineRulesForUser(User user, Rule... rules) {
-        defineRulesForUser(user, Arrays.asList(rules));
+    default void defineRulesForUser(Username username, Rule... rules) {
+        defineRulesForUser(username, Arrays.asList(rules));
     }
 
-    default void clearRulesForUser(User user) {
-        defineRulesForUser(user, ImmutableList.of());
+    default void clearRulesForUser(Username username) {
+        defineRulesForUser(username, ImmutableList.of());
     }
 
-    List<Rule> listRulesForUser(User user);
+    List<Rule> listRulesForUser(Username username);
 
 }
diff --git a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/impl/DefineRulesCommand.java b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/impl/DefineRulesCommand.java
index 0cd256c..c52fc7e 100644
--- a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/impl/DefineRulesCommand.java
+++ b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/impl/DefineRulesCommand.java
@@ -22,7 +22,7 @@ package org.apache.james.jmap.api.filtering.impl;
 import java.util.List;
 import java.util.Objects;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.eventsourcing.Command;
 import org.apache.james.jmap.api.filtering.Rule;
 
@@ -31,14 +31,14 @@ import com.google.common.base.Preconditions;
 
 public class DefineRulesCommand implements Command {
 
-    private final User user;
+    private final Username username;
     private final List<Rule> rules;
 
-    public DefineRulesCommand(User user, List<Rule> rules) {
-        Preconditions.checkNotNull(user);
+    public DefineRulesCommand(Username username, List<Rule> rules) {
+        Preconditions.checkNotNull(username);
         Preconditions.checkNotNull(rules);
 
-        this.user = user;
+        this.username = username;
         this.rules = rules;
     }
 
@@ -46,8 +46,8 @@ public class DefineRulesCommand implements Command {
         return rules;
     }
 
-    public User getUser() {
-        return user;
+    public Username getUsername() {
+        return username;
     }
 
     @Override
@@ -55,7 +55,7 @@ public class DefineRulesCommand implements Command {
         if (o instanceof DefineRulesCommand) {
             DefineRulesCommand that = (DefineRulesCommand) o;
 
-            return Objects.equals(this.user, that.user)
+            return Objects.equals(this.username, that.username)
                 && Objects.equals(this.rules, that.rules);
         }
         return false;
@@ -63,13 +63,13 @@ public class DefineRulesCommand implements Command {
 
     @Override
     public final int hashCode() {
-        return Objects.hash(user, rules);
+        return Objects.hash(username, rules);
     }
 
     @Override
     public String toString() {
         return MoreObjects.toStringHelper(this)
-            .add("user", user)
+            .add("user", username)
             .add("rules", rules)
             .toString();
     }
diff --git a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/impl/DefineRulesCommandHandler.java b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/impl/DefineRulesCommandHandler.java
index a613893..9bc82be 100644
--- a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/impl/DefineRulesCommandHandler.java
+++ b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/impl/DefineRulesCommandHandler.java
@@ -40,7 +40,7 @@ public class DefineRulesCommandHandler implements CommandHandler<DefineRulesComm
 
     @Override
     public List<? extends Event> handle(DefineRulesCommand storeCommand) {
-        FilteringAggregateId aggregateId = new FilteringAggregateId(storeCommand.getUser());
+        FilteringAggregateId aggregateId = new FilteringAggregateId(storeCommand.getUsername());
 
         return FilteringAggregate
             .load(
diff --git a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/impl/EventSourcingFilteringManagement.java b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/impl/EventSourcingFilteringManagement.java
index 2fbba65..fadd7a0 100644
--- a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/impl/EventSourcingFilteringManagement.java
+++ b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/impl/EventSourcingFilteringManagement.java
@@ -23,7 +23,7 @@ import java.util.List;
 
 import javax.inject.Inject;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.eventsourcing.EventSourcingSystem;
 import org.apache.james.eventsourcing.Subscriber;
 import org.apache.james.eventsourcing.eventstore.EventStore;
@@ -50,15 +50,15 @@ public class EventSourcingFilteringManagement implements FilteringManagement {
     }
 
     @Override
-    public void defineRulesForUser(User user, List<Rule> rules) {
-        eventSourcingSystem.dispatch(new DefineRulesCommand(user, rules));
+    public void defineRulesForUser(Username username, List<Rule> rules) {
+        eventSourcingSystem.dispatch(new DefineRulesCommand(username, rules));
     }
 
     @Override
-    public List<Rule> listRulesForUser(User user) {
-        Preconditions.checkNotNull(user);
+    public List<Rule> listRulesForUser(Username username) {
+        Preconditions.checkNotNull(username);
 
-        FilteringAggregateId aggregateId = new FilteringAggregateId(user);
+        FilteringAggregateId aggregateId = new FilteringAggregateId(username);
 
         return FilteringAggregate
             .load(
diff --git a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/impl/FilteringAggregateId.java b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/impl/FilteringAggregateId.java
index 635f045..bd13288 100644
--- a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/impl/FilteringAggregateId.java
+++ b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/impl/FilteringAggregateId.java
@@ -21,7 +21,7 @@ package org.apache.james.jmap.api.filtering.impl;
 
 import java.util.Objects;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.eventsourcing.AggregateId;
 
 import com.google.common.base.MoreObjects;
@@ -33,20 +33,20 @@ public class FilteringAggregateId implements AggregateId {
 
     public static final FilteringAggregateId parse(String rawString) {
         Preconditions.checkArgument(rawString.startsWith(PREFIX + SEPARATOR));
-        return new FilteringAggregateId(User.fromUsername(rawString.substring(PREFIX.length() + SEPARATOR.length())));
+        return new FilteringAggregateId(Username.fromUsername(rawString.substring(PREFIX.length() + SEPARATOR.length())));
     }
 
-    private final User user;
+    private final Username username;
 
-    public FilteringAggregateId(User user) {
-        Preconditions.checkNotNull(user);
+    public FilteringAggregateId(Username username) {
+        Preconditions.checkNotNull(username);
 
-        this.user = user;
+        this.username = username;
     }
 
     @Override
     public String asAggregateKey() {
-        return PREFIX + SEPARATOR + user.asString();
+        return PREFIX + SEPARATOR + username.asString();
     }
 
     @Override
@@ -54,20 +54,20 @@ public class FilteringAggregateId implements AggregateId {
         if (o instanceof FilteringAggregateId) {
             FilteringAggregateId that = (FilteringAggregateId) o;
 
-            return Objects.equals(this.user, that.user);
+            return Objects.equals(this.username, that.username);
         }
         return false;
     }
 
     @Override
     public final int hashCode() {
-        return Objects.hash(user);
+        return Objects.hash(username);
     }
 
     @Override
     public String toString() {
         return MoreObjects.toStringHelper(this)
-            .add("user", user)
+            .add("user", username)
             .toString();
     }
 }
diff --git a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/FilteringAggregateIdTest.java b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/FilteringAggregateIdTest.java
index 8588938..b856bf8 100644
--- a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/FilteringAggregateIdTest.java
+++ b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/FilteringAggregateIdTest.java
@@ -21,7 +21,7 @@ package org.apache.james.jmap.api.filtering;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 
 import org.apache.james.jmap.api.filtering.impl.FilteringAggregateId;
 import org.junit.jupiter.api.Test;
@@ -43,7 +43,7 @@ class FilteringAggregateIdTest {
 
     @Test
     void asAggregateKeyShouldReturnAStringContainingThePrefixAndTheDomain() {
-        assertThat(new FilteringAggregateId(User.fromUsername("foo@bar.space")).asAggregateKey())
+        assertThat(new FilteringAggregateId(Username.fromUsername("foo@bar.space")).asAggregateKey())
             .isEqualTo("FilteringRule/foo@bar.space");
     }
 
diff --git a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/FilteringManagementContract.java b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/FilteringManagementContract.java
index 57f8b9a..2d393f9 100644
--- a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/FilteringManagementContract.java
+++ b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/FilteringManagementContract.java
@@ -30,7 +30,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.util.List;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.eventsourcing.eventstore.EventStore;
 import org.apache.james.jmap.api.filtering.impl.EventSourcingFilteringManagement;
 import org.junit.jupiter.api.Test;
@@ -38,7 +38,7 @@ import org.junit.jupiter.api.Test;
 public interface FilteringManagementContract {
 
     String BART_SIMPSON_CARTOON = "bart@simpson.cartoon";
-    User USER = User.fromUsername(BART_SIMPSON_CARTOON);
+    Username USERNAME = Username.fromUsername(BART_SIMPSON_CARTOON);
 
     default FilteringManagement instantiateFilteringManagement(EventStore eventStore) {
         return new EventSourcingFilteringManagement(eventStore);
@@ -46,14 +46,14 @@ public interface FilteringManagementContract {
 
     @Test
     default void listingRulesForUnknownUserShouldReturnEmptyList(EventStore eventStore) {
-        assertThat(instantiateFilteringManagement(eventStore).listRulesForUser(USER))
+        assertThat(instantiateFilteringManagement(eventStore).listRulesForUser(USERNAME))
             .isEmpty();
     }
 
     @Test
     default void listingRulesShouldThrowWhenNullUser(EventStore eventStore) {
-        User user = null;
-        assertThatThrownBy(() -> instantiateFilteringManagement(eventStore).listRulesForUser(user))
+        Username username = null;
+        assertThatThrownBy(() -> instantiateFilteringManagement(eventStore).listRulesForUser(username))
             .isInstanceOf(NullPointerException.class);
     }
 
@@ -61,9 +61,9 @@ public interface FilteringManagementContract {
     default void listingRulesShouldReturnDefinedRules(EventStore eventStore) {
         FilteringManagement testee = instantiateFilteringManagement(eventStore);
 
-        testee.defineRulesForUser(USER, RULE_1, RULE_2);
+        testee.defineRulesForUser(USERNAME, RULE_1, RULE_2);
 
-        assertThat(testee.listRulesForUser(USER))
+        assertThat(testee.listRulesForUser(USERNAME))
             .containsExactly(RULE_1, RULE_2);
     }
 
@@ -71,10 +71,10 @@ public interface FilteringManagementContract {
     default void listingRulesShouldReturnLastDefinedRules(EventStore eventStore) {
         FilteringManagement testee = instantiateFilteringManagement(eventStore);
 
-        testee.defineRulesForUser(USER, RULE_1, RULE_2);
-        testee.defineRulesForUser(USER, RULE_2, RULE_1);
+        testee.defineRulesForUser(USERNAME, RULE_1, RULE_2);
+        testee.defineRulesForUser(USERNAME, RULE_2, RULE_1);
 
-        assertThat(testee.listRulesForUser(USER))
+        assertThat(testee.listRulesForUser(USERNAME))
             .containsExactly(RULE_2, RULE_1);
     }
 
@@ -82,7 +82,7 @@ public interface FilteringManagementContract {
     default void definingRulesShouldThrowWhenDuplicateRules(EventStore eventStore) {
         FilteringManagement testee = instantiateFilteringManagement(eventStore);
 
-        assertThatThrownBy(() -> testee.defineRulesForUser(USER, RULE_1, RULE_1))
+        assertThatThrownBy(() -> testee.defineRulesForUser(USERNAME, RULE_1, RULE_1))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
@@ -99,16 +99,16 @@ public interface FilteringManagementContract {
         FilteringManagement testee = instantiateFilteringManagement(eventStore);
 
         List<Rule> rules = null;
-        assertThatThrownBy(() -> testee.defineRulesForUser(USER, rules))
+        assertThatThrownBy(() -> testee.defineRulesForUser(USERNAME, rules))
             .isInstanceOf(NullPointerException.class);
     }
 
     @Test
     default void definingRulesShouldKeepOrdering(EventStore eventStore) {
         FilteringManagement testee = instantiateFilteringManagement(eventStore);
-        testee.defineRulesForUser(USER, RULE_3, RULE_2, RULE_1);
+        testee.defineRulesForUser(USERNAME, RULE_3, RULE_2, RULE_1);
 
-        assertThat(testee.listRulesForUser(USER))
+        assertThat(testee.listRulesForUser(USERNAME))
             .containsExactly(RULE_3, RULE_2, RULE_1);
     }
 
@@ -116,19 +116,19 @@ public interface FilteringManagementContract {
     default void definingEmptyRuleListShouldRemoveExistingRules(EventStore eventStore) {
         FilteringManagement testee = instantiateFilteringManagement(eventStore);
 
-        testee.defineRulesForUser(USER, RULE_3, RULE_2, RULE_1);
-        testee.clearRulesForUser(USER);
+        testee.defineRulesForUser(USERNAME, RULE_3, RULE_2, RULE_1);
+        testee.clearRulesForUser(USERNAME);
 
-        assertThat(testee.listRulesForUser(USER)).isEmpty();
+        assertThat(testee.listRulesForUser(USERNAME)).isEmpty();
     }
 
     @Test
     default void allFieldsAndComparatorShouldWellBeStored(EventStore eventStore) {
         FilteringManagement testee = instantiateFilteringManagement(eventStore);
 
-        testee.defineRulesForUser(USER, RULE_FROM, RULE_RECIPIENT, RULE_SUBJECT, RULE_TO, RULE_1);
+        testee.defineRulesForUser(USERNAME, RULE_FROM, RULE_RECIPIENT, RULE_SUBJECT, RULE_TO, RULE_1);
 
-        assertThat(testee.listRulesForUser(USER))
+        assertThat(testee.listRulesForUser(USERNAME))
             .containsExactly(RULE_FROM, RULE_RECIPIENT, RULE_SUBJECT, RULE_TO, RULE_1);
     }
 
diff --git a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/impl/DefineRulesCommandTest.java b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/impl/DefineRulesCommandTest.java
index 2fa75c0..cbd01d3 100644
--- a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/impl/DefineRulesCommandTest.java
+++ b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/impl/DefineRulesCommandTest.java
@@ -23,7 +23,7 @@ import static org.apache.james.jmap.api.filtering.RuleFixture.RULE_1;
 import static org.apache.james.jmap.api.filtering.RuleFixture.RULE_2;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.junit.jupiter.api.Test;
 
 import com.google.common.collect.ImmutableList;
@@ -46,7 +46,7 @@ class DefineRulesCommandTest {
 
     @Test
     void constructorShouldThrowWhenNullRuleList() {
-        assertThatThrownBy(() -> new DefineRulesCommand(User.fromUsername("adam@james.org"), null))
+        assertThatThrownBy(() -> new DefineRulesCommand(Username.fromUsername("adam@james.org"), null))
             .isInstanceOf(NullPointerException.class);
     }
 }
\ No newline at end of file
diff --git a/server/data/data-jpa/src/main/java/org/apache/james/sieve/jpa/JPASieveRepository.java b/server/data/data-jpa/src/main/java/org/apache/james/sieve/jpa/JPASieveRepository.java
index 31c634a..c9bbb05 100644
--- a/server/data/data-jpa/src/main/java/org/apache/james/sieve/jpa/JPASieveRepository.java
+++ b/server/data/data-jpa/src/main/java/org/apache/james/sieve/jpa/JPASieveRepository.java
@@ -35,7 +35,7 @@ import javax.persistence.PersistenceException;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.james.backends.jpa.TransactionRunner;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.core.quota.QuotaSize;
 import org.apache.james.sieve.jpa.model.JPASieveQuota;
 import org.apache.james.sieve.jpa.model.JPASieveScript;
@@ -69,21 +69,21 @@ public class JPASieveRepository implements SieveRepository {
     }
 
     @Override
-    public void haveSpace(User user, ScriptName name, long size) throws QuotaExceededException, StorageException {
-        long usedSpace = findAllSieveScriptsForUser(user).stream()
+    public void haveSpace(Username username, ScriptName name, long size) throws QuotaExceededException, StorageException {
+        long usedSpace = findAllSieveScriptsForUser(username).stream()
                 .filter(sieveScript -> !sieveScript.getScriptName().equals(name.getValue()))
                 .mapToLong(JPASieveScript::getScriptSize)
                 .sum();
 
-        QuotaSize quota = limitToUser(user);
+        QuotaSize quota = limitToUser(username);
         if (overQuotaAfterModification(usedSpace, size, quota)) {
             throw new QuotaExceededException();
         }
     }
 
-    private QuotaSize limitToUser(User user) throws StorageException {
+    private QuotaSize limitToUser(Username username) throws StorageException {
         return OptionalUtils.orSuppliers(
-                Throwing.supplier(() -> findQuotaForUser(user.asString())).sneakyThrow(),
+                Throwing.supplier(() -> findQuotaForUser(username.asString())).sneakyThrow(),
                 Throwing.supplier(() -> findQuotaForUser(DEFAULT_SIEVE_QUOTA_USERNAME)).sneakyThrow())
                 .map(JPASieveQuota::toQuotaSize)
                 .orElse(QuotaSize.unlimited());
@@ -96,12 +96,12 @@ public class JPASieveRepository implements SieveRepository {
     }
 
     @Override
-    public void putScript(User user, ScriptName name, ScriptContent content) throws StorageException, QuotaExceededException {
+    public void putScript(Username username, ScriptName name, ScriptContent content) throws StorageException, QuotaExceededException {
         transactionRunner.runAndHandleException(Throwing.<EntityManager>consumer(entityManager -> {
             try {
-                haveSpace(user, name, content.length());
+                haveSpace(username, name, content.length());
                 JPASieveScript jpaSieveScript = JPASieveScript.builder()
-                        .username(user.asString())
+                        .username(username.asString())
                         .scriptName(name.getValue())
                         .scriptContent(content)
                         .build();
@@ -110,142 +110,142 @@ public class JPASieveRepository implements SieveRepository {
                 rollbackTransactionIfActive(entityManager.getTransaction());
                 throw e;
             }
-        }).sneakyThrow(), throwStorageException("Unable to put script for user " + user.asString()));
+        }).sneakyThrow(), throwStorageException("Unable to put script for user " + username.asString()));
     }
 
     @Override
-    public List<ScriptSummary> listScripts(User user) throws StorageException {
-        return findAllSieveScriptsForUser(user).stream()
+    public List<ScriptSummary> listScripts(Username username) throws StorageException {
+        return findAllSieveScriptsForUser(username).stream()
                 .map(JPASieveScript::toSummary)
                 .collect(ImmutableList.toImmutableList());
     }
 
-    private List<JPASieveScript> findAllSieveScriptsForUser(User user) throws StorageException {
+    private List<JPASieveScript> findAllSieveScriptsForUser(Username username) throws StorageException {
         return transactionRunner.runAndRetrieveResult(entityManager -> {
             List<JPASieveScript> sieveScripts = entityManager.createNamedQuery("findAllByUsername", JPASieveScript.class)
-                    .setParameter("username", user.asString()).getResultList();
+                    .setParameter("username", username.asString()).getResultList();
             return Optional.ofNullable(sieveScripts).orElse(ImmutableList.of());
-        }, throwStorageException("Unable to list scripts for user " + user.asString()));
+        }, throwStorageException("Unable to list scripts for user " + username.asString()));
     }
 
     @Override
-    public ZonedDateTime getActivationDateForActiveScript(User user) throws StorageException, ScriptNotFoundException {
-        Optional<JPASieveScript> script = findActiveSieveScript(user);
-        JPASieveScript activeSieveScript = script.orElseThrow(() -> new ScriptNotFoundException("Unable to find active script for user " + user.asString()));
+    public ZonedDateTime getActivationDateForActiveScript(Username username) throws StorageException, ScriptNotFoundException {
+        Optional<JPASieveScript> script = findActiveSieveScript(username);
+        JPASieveScript activeSieveScript = script.orElseThrow(() -> new ScriptNotFoundException("Unable to find active script for user " + username.asString()));
         return activeSieveScript.getActivationDateTime().toZonedDateTime();
     }
 
     @Override
-    public InputStream getActive(User user) throws ScriptNotFoundException, StorageException {
-        Optional<JPASieveScript> script = findActiveSieveScript(user);
-        JPASieveScript activeSieveScript = script.orElseThrow(() -> new ScriptNotFoundException("Unable to find active script for user " + user.asString()));
+    public InputStream getActive(Username username) throws ScriptNotFoundException, StorageException {
+        Optional<JPASieveScript> script = findActiveSieveScript(username);
+        JPASieveScript activeSieveScript = script.orElseThrow(() -> new ScriptNotFoundException("Unable to find active script for user " + username.asString()));
         return IOUtils.toInputStream(activeSieveScript.getScriptContent(), StandardCharsets.UTF_8);
     }
 
-    private Optional<JPASieveScript> findActiveSieveScript(User user) throws StorageException {
+    private Optional<JPASieveScript> findActiveSieveScript(Username username) throws StorageException {
         return transactionRunner.runAndRetrieveResult(
-                Throwing.<EntityManager, Optional<JPASieveScript>>function(entityManager -> findActiveSieveScript(user, entityManager)).sneakyThrow(),
-                throwStorageException("Unable to find active script for user " + user.asString()));
+                Throwing.<EntityManager, Optional<JPASieveScript>>function(entityManager -> findActiveSieveScript(username, entityManager)).sneakyThrow(),
+                throwStorageException("Unable to find active script for user " + username.asString()));
     }
 
-    private Optional<JPASieveScript> findActiveSieveScript(User user, EntityManager entityManager) throws StorageException {
+    private Optional<JPASieveScript> findActiveSieveScript(Username username, EntityManager entityManager) throws StorageException {
         try {
             JPASieveScript activeSieveScript = entityManager.createNamedQuery("findActiveByUsername", JPASieveScript.class)
-                    .setParameter("username", user.asString()).getSingleResult();
+                    .setParameter("username", username.asString()).getSingleResult();
             return Optional.ofNullable(activeSieveScript);
         } catch (NoResultException e) {
-            LOGGER.debug("Sieve script not found for user {}", user.asString());
+            LOGGER.debug("Sieve script not found for user {}", username.asString());
             return Optional.empty();
         }
     }
 
     @Override
-    public void setActive(User user, ScriptName name) throws ScriptNotFoundException, StorageException {
+    public void setActive(Username username, ScriptName name) throws ScriptNotFoundException, StorageException {
         transactionRunner.runAndHandleException(Throwing.<EntityManager>consumer(entityManager -> {
             try {
                 if (SieveRepository.NO_SCRIPT_NAME.equals(name)) {
-                    switchOffActiveScript(user, entityManager);
+                    switchOffActiveScript(username, entityManager);
                 } else {
-                    setActiveScript(user, name, entityManager);
+                    setActiveScript(username, name, entityManager);
                 }
             } catch (StorageException | ScriptNotFoundException e) {
                 rollbackTransactionIfActive(entityManager.getTransaction());
                 throw e;
             }
-        }).sneakyThrow(), throwStorageException("Unable to set active script " + name.getValue() + " for user " + user.asString()));
+        }).sneakyThrow(), throwStorageException("Unable to set active script " + name.getValue() + " for user " + username.asString()));
     }
 
-    private void switchOffActiveScript(User user, EntityManager entityManager) throws StorageException {
-        Optional<JPASieveScript> activeSieveScript = findActiveSieveScript(user, entityManager);
+    private void switchOffActiveScript(Username username, EntityManager entityManager) throws StorageException {
+        Optional<JPASieveScript> activeSieveScript = findActiveSieveScript(username, entityManager);
         activeSieveScript.ifPresent(JPASieveScript::deactivate);
     }
 
-    private void setActiveScript(User user, ScriptName name, EntityManager entityManager) throws StorageException, ScriptNotFoundException {
-        JPASieveScript sieveScript = findSieveScript(user, name, entityManager)
-                .orElseThrow(() -> new ScriptNotFoundException("Unable to find script " + name.getValue() + " for user " + user.asString()));
-        findActiveSieveScript(user, entityManager).ifPresent(JPASieveScript::deactivate);
+    private void setActiveScript(Username username, ScriptName name, EntityManager entityManager) throws StorageException, ScriptNotFoundException {
+        JPASieveScript sieveScript = findSieveScript(username, name, entityManager)
+                .orElseThrow(() -> new ScriptNotFoundException("Unable to find script " + name.getValue() + " for user " + username.asString()));
+        findActiveSieveScript(username, entityManager).ifPresent(JPASieveScript::deactivate);
         sieveScript.activate();
     }
 
     @Override
-    public InputStream getScript(User user, ScriptName name) throws ScriptNotFoundException, StorageException {
-        Optional<JPASieveScript> script = findSieveScript(user, name);
-        JPASieveScript sieveScript = script.orElseThrow(() -> new ScriptNotFoundException("Unable to find script " + name.getValue() + " for user " + user.asString()));
+    public InputStream getScript(Username username, ScriptName name) throws ScriptNotFoundException, StorageException {
+        Optional<JPASieveScript> script = findSieveScript(username, name);
+        JPASieveScript sieveScript = script.orElseThrow(() -> new ScriptNotFoundException("Unable to find script " + name.getValue() + " for user " + username.asString()));
         return IOUtils.toInputStream(sieveScript.getScriptContent(), StandardCharsets.UTF_8);
     }
 
-    private Optional<JPASieveScript> findSieveScript(User user, ScriptName scriptName) throws StorageException {
-        return transactionRunner.runAndRetrieveResult(entityManager -> findSieveScript(user, scriptName, entityManager),
-                throwStorageException("Unable to find script " + scriptName.getValue() + " for user " + user.asString()));
+    private Optional<JPASieveScript> findSieveScript(Username username, ScriptName scriptName) throws StorageException {
+        return transactionRunner.runAndRetrieveResult(entityManager -> findSieveScript(username, scriptName, entityManager),
+                throwStorageException("Unable to find script " + scriptName.getValue() + " for user " + username.asString()));
     }
 
-    private Optional<JPASieveScript> findSieveScript(User user, ScriptName scriptName, EntityManager entityManager) {
+    private Optional<JPASieveScript> findSieveScript(Username username, ScriptName scriptName, EntityManager entityManager) {
         try {
             JPASieveScript sieveScript = entityManager.createNamedQuery("findSieveScript", JPASieveScript.class)
-                    .setParameter("username", user.asString())
+                    .setParameter("username", username.asString())
                     .setParameter("scriptName", scriptName.getValue()).getSingleResult();
             return Optional.ofNullable(sieveScript);
         } catch (NoResultException e) {
-            LOGGER.debug("Sieve script not found for user {}", user.asString());
+            LOGGER.debug("Sieve script not found for user {}", username.asString());
             return Optional.empty();
         }
     }
 
     @Override
-    public void deleteScript(User user, ScriptName name) throws ScriptNotFoundException, IsActiveException, StorageException {
+    public void deleteScript(Username username, ScriptName name) throws ScriptNotFoundException, IsActiveException, StorageException {
         transactionRunner.runAndHandleException(Throwing.<EntityManager>consumer(entityManager -> {
-            Optional<JPASieveScript> sieveScript = findSieveScript(user, name, entityManager);
+            Optional<JPASieveScript> sieveScript = findSieveScript(username, name, entityManager);
             if (!sieveScript.isPresent()) {
                 rollbackTransactionIfActive(entityManager.getTransaction());
-                throw new ScriptNotFoundException("Unable to find script " + name.getValue() + " for user " + user.asString());
+                throw new ScriptNotFoundException("Unable to find script " + name.getValue() + " for user " + username.asString());
             }
             JPASieveScript sieveScriptToRemove = sieveScript.get();
             if (sieveScriptToRemove.isActive()) {
                 rollbackTransactionIfActive(entityManager.getTransaction());
-                throw new IsActiveException("Unable to delete active script " + name.getValue() + " for user " + user.asString());
+                throw new IsActiveException("Unable to delete active script " + name.getValue() + " for user " + username.asString());
             }
             entityManager.remove(sieveScriptToRemove);
-        }).sneakyThrow(), throwStorageException("Unable to delete script " + name.getValue() + " for user " + user.asString()));
+        }).sneakyThrow(), throwStorageException("Unable to delete script " + name.getValue() + " for user " + username.asString()));
     }
 
     @Override
-    public void renameScript(User user, ScriptName oldName, ScriptName newName) throws ScriptNotFoundException, DuplicateException, StorageException {
+    public void renameScript(Username username, ScriptName oldName, ScriptName newName) throws ScriptNotFoundException, DuplicateException, StorageException {
         transactionRunner.runAndHandleException(Throwing.<EntityManager>consumer(entityManager -> {
-            Optional<JPASieveScript> sieveScript = findSieveScript(user, oldName, entityManager);
+            Optional<JPASieveScript> sieveScript = findSieveScript(username, oldName, entityManager);
             if (!sieveScript.isPresent()) {
                 rollbackTransactionIfActive(entityManager.getTransaction());
-                throw new ScriptNotFoundException("Unable to find script " + oldName.getValue() + " for user " + user.asString());
+                throw new ScriptNotFoundException("Unable to find script " + oldName.getValue() + " for user " + username.asString());
             }
 
-            Optional<JPASieveScript> duplicatedSieveScript = findSieveScript(user, newName, entityManager);
+            Optional<JPASieveScript> duplicatedSieveScript = findSieveScript(username, newName, entityManager);
             if (duplicatedSieveScript.isPresent()) {
                 rollbackTransactionIfActive(entityManager.getTransaction());
-                throw new DuplicateException("Unable to rename script. Duplicate found " + newName.getValue() + " for user " + user.asString());
+                throw new DuplicateException("Unable to rename script. Duplicate found " + newName.getValue() + " for user " + username.asString());
             }
 
             JPASieveScript sieveScriptToRename = sieveScript.get();
             sieveScriptToRename.renameTo(newName);
-        }).sneakyThrow(), throwStorageException("Unable to rename script " + oldName.getValue() + " for user " + user.asString()));
+        }).sneakyThrow(), throwStorageException("Unable to rename script " + oldName.getValue() + " for user " + username.asString()));
     }
 
     private void rollbackTransactionIfActive(EntityTransaction transaction) {
@@ -278,26 +278,26 @@ public class JPASieveRepository implements SieveRepository {
     }
 
     @Override
-    public boolean hasQuota(User user) throws StorageException {
-        Optional<JPASieveQuota> quotaForUser = findQuotaForUser(user.asString());
+    public boolean hasQuota(Username username) throws StorageException {
+        Optional<JPASieveQuota> quotaForUser = findQuotaForUser(username.asString());
         return quotaForUser.isPresent();
     }
 
     @Override
-    public QuotaSize getQuota(User user) throws QuotaNotFoundException, StorageException {
-        JPASieveQuota jpaSieveQuota = findQuotaForUser(user.asString())
-                .orElseThrow(() -> new QuotaNotFoundException("Unable to find quota for user " + user.asString()));
+    public QuotaSize getQuota(Username username) throws QuotaNotFoundException, StorageException {
+        JPASieveQuota jpaSieveQuota = findQuotaForUser(username.asString())
+                .orElseThrow(() -> new QuotaNotFoundException("Unable to find quota for user " + username.asString()));
         return QuotaSize.size(jpaSieveQuota.getSize());
     }
 
     @Override
-    public void setQuota(User user, QuotaSize quota) throws StorageException {
-        setQuotaForUser(user.asString(), quota);
+    public void setQuota(Username username, QuotaSize quota) throws StorageException {
+        setQuotaForUser(username.asString(), quota);
     }
 
     @Override
-    public void removeQuota(User user) throws QuotaNotFoundException, StorageException {
-        removeQuotaForUser(user.asString());
+    public void removeQuota(Username username) throws QuotaNotFoundException, StorageException {
+        removeQuotaForUser(username.asString());
     }
 
     private Optional<JPASieveQuota> findQuotaForUser(String username) throws StorageException {
diff --git a/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepository.java b/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepository.java
index 9eab245..b3093bc 100644
--- a/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepository.java
+++ b/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepository.java
@@ -47,6 +47,7 @@ import org.apache.commons.configuration2.tree.ImmutableNode;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.directory.api.ldap.model.filter.FilterEncoder;
 import org.apache.james.core.MailAddress;
+import org.apache.james.core.Username;
 import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.lifecycle.api.Configurable;
 import org.apache.james.user.api.UsersRepository;
@@ -681,12 +682,12 @@ public class ReadOnlyUsersLDAPRepository implements UsersRepository, Configurabl
 
 
     @Override
-    public MailAddress getMailAddressFor(org.apache.james.core.User user) throws UsersRepositoryException {
+    public MailAddress getMailAddressFor(Username username) throws UsersRepositoryException {
         try {
             if (supportVirtualHosting()) {
-                return new MailAddress(user.asString());
+                return new MailAddress(username.asString());
             }
-            return new MailAddress(user.getLocalPart(), domainList.getDefaultDomain());
+            return new MailAddress(username.getLocalPart(), domainList.getDefaultDomain());
         } catch (Exception e) {
             throw new UsersRepositoryException("Failed to compute mail address associated with the user", e);
         }
diff --git a/server/data/data-library/src/main/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTable.java b/server/data/data-library/src/main/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTable.java
index cad00b7..a43900f 100644
--- a/server/data/data-library/src/main/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTable.java
+++ b/server/data/data-library/src/main/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTable.java
@@ -32,7 +32,7 @@ import org.apache.commons.configuration2.HierarchicalConfiguration;
 import org.apache.commons.configuration2.ex.ConfigurationException;
 import org.apache.commons.configuration2.tree.ImmutableNode;
 import org.apache.james.core.Domain;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.domainlist.api.DomainListException;
 import org.apache.james.lifecycle.api.Configurable;
@@ -102,10 +102,10 @@ public abstract class AbstractRecipientRewriteTable implements RecipientRewriteT
 
     @Override
     public Mappings getResolvedMappings(String user, Domain domain) throws ErrorMappingException, RecipientRewriteTableException {
-        return getMappings(User.fromLocalPartWithDomain(user, domain), mappingLimit);
+        return getMappings(Username.fromLocalPartWithDomain(user, domain), mappingLimit);
     }
 
-    private Mappings getMappings(User user, int mappingLimit) throws ErrorMappingException, RecipientRewriteTableException {
+    private Mappings getMappings(Username username, int mappingLimit) throws ErrorMappingException, RecipientRewriteTableException {
 
         // We have to much mappings throw ErrorMappingException to avoid
         // infinity loop
@@ -113,49 +113,49 @@ public abstract class AbstractRecipientRewriteTable implements RecipientRewriteT
             throw new TooManyMappingException("554 Too many mappings to process");
         }
 
-        Mappings targetMappings = mapAddress(user.getLocalPart(), user.getDomainPart().get());
+        Mappings targetMappings = mapAddress(username.getLocalPart(), username.getDomainPart().get());
 
 
         try {
             return MappingsImpl.fromMappings(
                 targetMappings.asStream()
-                    .flatMap(Throwing.function((Mapping target) -> convertAndRecurseMapping(user, target, mappingLimit)).sneakyThrow()));
+                    .flatMap(Throwing.function((Mapping target) -> convertAndRecurseMapping(username, target, mappingLimit)).sneakyThrow()));
         } catch (SkipMappingProcessingException e) {
             return MappingsImpl.empty();
         }
     }
 
-    private Stream<Mapping> convertAndRecurseMapping(User originalUser, Mapping associatedMapping, int remainingLoops) throws ErrorMappingException, RecipientRewriteTableException, SkipMappingProcessingException, AddressException {
+    private Stream<Mapping> convertAndRecurseMapping(Username originalUsername, Mapping associatedMapping, int remainingLoops) throws ErrorMappingException, RecipientRewriteTableException, SkipMappingProcessingException, AddressException {
 
-        Function<User, Stream<Mapping>> convertAndRecurseMapping =
+        Function<Username, Stream<Mapping>> convertAndRecurseMapping =
             Throwing
-                .function((User rewrittenUser) -> convertAndRecurseMapping(associatedMapping, originalUser, rewrittenUser, remainingLoops))
+                .function((Username rewrittenUser) -> convertAndRecurseMapping(associatedMapping, originalUsername, rewrittenUser, remainingLoops))
                 .sneakyThrow();
 
-        return associatedMapping.rewriteUser(originalUser)
-            .map(rewrittenUser -> rewrittenUser.withDefaultDomainFromUser(originalUser))
+        return associatedMapping.rewriteUser(originalUsername)
+            .map(rewrittenUser -> rewrittenUser.withDefaultDomainFromUser(originalUsername))
             .map(convertAndRecurseMapping)
             .orElse(Stream.empty());
     }
 
-    private Stream<Mapping> convertAndRecurseMapping(Mapping mapping, User originalUser, User rewrittenUser, int remainingLoops) throws ErrorMappingException, RecipientRewriteTableException {
-        LOGGER.debug("Valid virtual user mapping {} to {}", originalUser.asString(), rewrittenUser.asString());
+    private Stream<Mapping> convertAndRecurseMapping(Mapping mapping, Username originalUsername, Username rewrittenUsername, int remainingLoops) throws ErrorMappingException, RecipientRewriteTableException {
+        LOGGER.debug("Valid virtual user mapping {} to {}", originalUsername.asString(), rewrittenUsername.asString());
 
-        Stream<Mapping> nonRecursiveResult = Stream.of(toMapping(rewrittenUser, mapping.getType()));
+        Stream<Mapping> nonRecursiveResult = Stream.of(toMapping(rewrittenUsername, mapping.getType()));
         if (!recursive) {
             return nonRecursiveResult;
         }
 
         // Check if the returned mapping is the same as the input. If so we need to handle identity to avoid loops.
-        if (originalUser.equals(rewrittenUser)) {
+        if (originalUsername.equals(rewrittenUsername)) {
             return mapping.handleIdentity(nonRecursiveResult);
         } else {
-            return recurseMapping(nonRecursiveResult, rewrittenUser, remainingLoops);
+            return recurseMapping(nonRecursiveResult, rewrittenUsername, remainingLoops);
         }
     }
 
-    private Stream<Mapping> recurseMapping(Stream<Mapping> nonRecursiveResult, User targetUser, int remainingLoops) throws ErrorMappingException, RecipientRewriteTableException {
-        Mappings childMappings = getMappings(targetUser, remainingLoops - 1);
+    private Stream<Mapping> recurseMapping(Stream<Mapping> nonRecursiveResult, Username targetUsername, int remainingLoops) throws ErrorMappingException, RecipientRewriteTableException {
+        Mappings childMappings = getMappings(targetUsername, remainingLoops - 1);
 
         if (childMappings.isEmpty()) {
             return nonRecursiveResult;
@@ -164,17 +164,17 @@ public abstract class AbstractRecipientRewriteTable implements RecipientRewriteT
         }
     }
 
-    private Mapping toMapping(User rewrittenUser, Type type) {
+    private Mapping toMapping(Username rewrittenUsername, Type type) {
         switch (type) {
             case Forward:
             case Group:
             case Alias:
-                return Mapping.of(type, rewrittenUser.asString());
+                return Mapping.of(type, rewrittenUsername.asString());
             case Regex:
             case Domain:
             case Error:
             case Address:
-                return Mapping.address(rewrittenUser.asString());
+                return Mapping.address(rewrittenUsername.asString());
         }
         throw new IllegalArgumentException("unhandled enum type");
     }
diff --git a/server/data/data-library/src/main/java/org/apache/james/sieverepository/lib/SieveRepositoryManagement.java b/server/data/data-library/src/main/java/org/apache/james/sieverepository/lib/SieveRepositoryManagement.java
index f8a0b25..ff42345 100644
--- a/server/data/data-library/src/main/java/org/apache/james/sieverepository/lib/SieveRepositoryManagement.java
+++ b/server/data/data-library/src/main/java/org/apache/james/sieverepository/lib/SieveRepositoryManagement.java
@@ -30,7 +30,7 @@ import javax.management.NotCompliantMBeanException;
 import javax.management.StandardMBean;
 
 import org.apache.commons.io.IOUtils;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.core.quota.QuotaSize;
 import org.apache.james.sieverepository.api.ScriptContent;
 import org.apache.james.sieverepository.api.ScriptName;
@@ -71,24 +71,24 @@ public class SieveRepositoryManagement extends StandardMBean implements SieveRep
 
     @Override
     public long getQuota(String user) throws SieveRepositoryException {
-        return sieveRepository.getQuota(User.fromUsername(user)).asLong();
+        return sieveRepository.getQuota(Username.fromUsername(user)).asLong();
     }
 
     @Override
     public void setQuota(String user, long quota) throws SieveRepositoryException {
-        sieveRepository.setQuota(User.fromUsername(user), QuotaSize.size(quota));
+        sieveRepository.setQuota(Username.fromUsername(user), QuotaSize.size(quota));
     }
 
     @Override
     public void removeQuota(String user) throws SieveRepositoryException {
-        sieveRepository.removeQuota(User.fromUsername(user));
+        sieveRepository.removeQuota(Username.fromUsername(user));
     }
 
     @Override
     public void addActiveSieveScript(String userName, String scriptName, String script) throws SieveRepositoryException {
-        User user = User.fromUsername(userName);
-        sieveRepository.putScript(user, new ScriptName(scriptName), new ScriptContent(script));
-        sieveRepository.setActive(user, new ScriptName(scriptName));
+        Username username = Username.fromUsername(userName);
+        sieveRepository.putScript(username, new ScriptName(scriptName), new ScriptContent(script));
+        sieveRepository.setActive(username, new ScriptName(scriptName));
     }
 
     @Override
diff --git a/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractJamesUsersRepository.java b/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractJamesUsersRepository.java
index 7beb8eb..f19b3df 100644
--- a/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractJamesUsersRepository.java
+++ b/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractJamesUsersRepository.java
@@ -27,6 +27,7 @@ import org.apache.commons.configuration2.HierarchicalConfiguration;
 import org.apache.commons.configuration2.ex.ConfigurationException;
 import org.apache.commons.configuration2.tree.ImmutableNode;
 import org.apache.james.core.Domain;
+import org.apache.james.core.Username;
 import org.apache.james.rrt.api.RecipientRewriteTable;
 import org.apache.james.rrt.api.RecipientRewriteTableException;
 import org.apache.james.rrt.lib.Mapping;
@@ -192,7 +193,7 @@ public abstract class AbstractJamesUsersRepository extends AbstractUsersReposito
                         domain = Domain.LOCALHOST;
                     }
                     try {
-                        MappingSource source = MappingSource.fromUser(org.apache.james.core.User.fromUsername(user));
+                        MappingSource source = MappingSource.fromUser(Username.fromUsername(user));
                         mappings.put(source, getResolvedMappings(username, domain));
                     } catch (ErrorMappingException e) {
                         // shold never happen here
diff --git a/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractUsersRepository.java b/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractUsersRepository.java
index 538b453..10ccaaa 100644
--- a/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractUsersRepository.java
+++ b/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractUsersRepository.java
@@ -28,7 +28,7 @@ import org.apache.commons.configuration2.ex.ConfigurationException;
 import org.apache.commons.configuration2.tree.ImmutableNode;
 import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.domainlist.api.DomainListException;
 import org.apache.james.lifecycle.api.Configurable;
@@ -70,7 +70,7 @@ public abstract class AbstractUsersRepository implements UsersRepository, Config
     }
 
     protected void isValidUsername(String username) throws UsersRepositoryException {
-        User user = User.fromUsername(username);
+        Username user = Username.fromUsername(username);
         if (supportVirtualHosting()) {
             // need a @ in the username
             if (!user.hasDomainPart()) {
@@ -147,12 +147,12 @@ public abstract class AbstractUsersRepository implements UsersRepository, Config
     }
 
     @Override
-    public MailAddress getMailAddressFor(User user) throws UsersRepositoryException {
+    public MailAddress getMailAddressFor(Username username) throws UsersRepositoryException {
         try {
             if (supportVirtualHosting()) {
-                return new MailAddress(user.asString());
+                return new MailAddress(username.asString());
             }
-            return new MailAddress(user.getLocalPart(), domainList.getDefaultDomain());
+            return new MailAddress(username.getLocalPart(), domainList.getDefaultDomain());
         } catch (Exception e) {
             throw new UsersRepositoryException("Failed to compute mail address associated with the user", e);
         }
diff --git a/server/data/data-library/src/test/java/org/apache/james/sieverepository/lib/AbstractSieveRepositoryTest.java b/server/data/data-library/src/test/java/org/apache/james/sieverepository/lib/AbstractSieveRepositoryTest.java
index eaf9746..ba6e8b0 100644
--- a/server/data/data-library/src/test/java/org/apache/james/sieverepository/lib/AbstractSieveRepositoryTest.java
+++ b/server/data/data-library/src/test/java/org/apache/james/sieverepository/lib/AbstractSieveRepositoryTest.java
@@ -28,7 +28,7 @@ import java.time.ZoneOffset;
 import java.time.ZonedDateTime;
 
 import org.apache.commons.io.IOUtils;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.core.quota.QuotaSize;
 import org.apache.james.sieverepository.api.ScriptContent;
 import org.apache.james.sieverepository.api.ScriptName;
@@ -43,7 +43,7 @@ import org.junit.Test;
 
 public abstract class AbstractSieveRepositoryTest {
 
-    protected static final User USER = User.fromUsername("test");
+    protected static final Username USERNAME = Username.fromUsername("test");
     protected static final ScriptName SCRIPT_NAME = new ScriptName("script");
     protected static final ScriptContent SCRIPT_CONTENT = new ScriptContent("Hello World");
 
@@ -60,206 +60,206 @@ public abstract class AbstractSieveRepositoryTest {
 
     @Test(expected = ScriptNotFoundException.class)
     public void getScriptShouldThrowIfUnableToFindScript() throws Exception {
-        sieveRepository.getScript(USER, SCRIPT_NAME);
+        sieveRepository.getScript(USERNAME, SCRIPT_NAME);
     }
 
     @Test
     public void getScriptShouldReturnCorrectContent() throws Exception {
-        sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
-        assertThat(getScriptContent(sieveRepository.getScript(USER, SCRIPT_NAME))).isEqualTo(SCRIPT_CONTENT);
+        sieveRepository.putScript(USERNAME, SCRIPT_NAME, SCRIPT_CONTENT);
+        assertThat(getScriptContent(sieveRepository.getScript(USERNAME, SCRIPT_NAME))).isEqualTo(SCRIPT_CONTENT);
     }
 
     @Test
     public void getActivationDateForActiveScriptShouldReturnNonNullAndNonZeroResult() throws Exception {
-        sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
-        sieveRepository.setActive(USER, SCRIPT_NAME);
-        assertThat(sieveRepository.getActivationDateForActiveScript(USER)).isNotNull();
-        assertThat(sieveRepository.getActivationDateForActiveScript(USER)).isNotEqualTo(ZonedDateTime.ofInstant(Instant.ofEpochMilli(0L), ZoneOffset.UTC));
+        sieveRepository.putScript(USERNAME, SCRIPT_NAME, SCRIPT_CONTENT);
+        sieveRepository.setActive(USERNAME, SCRIPT_NAME);
+        assertThat(sieveRepository.getActivationDateForActiveScript(USERNAME)).isNotNull();
+        assertThat(sieveRepository.getActivationDateForActiveScript(USERNAME)).isNotEqualTo(ZonedDateTime.ofInstant(Instant.ofEpochMilli(0L), ZoneOffset.UTC));
     }
 
     @Test(expected = ScriptNotFoundException.class)
     public void getActivationDateForActiveScriptShouldThrowOnMissingActiveScript() throws Exception {
-        sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
-        sieveRepository.getActivationDateForActiveScript(USER);
+        sieveRepository.putScript(USERNAME, SCRIPT_NAME, SCRIPT_CONTENT);
+        sieveRepository.getActivationDateForActiveScript(USERNAME);
     }
 
     @Test
     public void haveSpaceShouldNotThrowWhenUserDoesNotHaveQuota() throws Exception {
-        sieveRepository.haveSpace(USER, SCRIPT_NAME, DEFAULT_QUOTA.asLong() + 1L);
+        sieveRepository.haveSpace(USERNAME, SCRIPT_NAME, DEFAULT_QUOTA.asLong() + 1L);
     }
 
     @Test
     public void haveSpaceShouldNotThrowWhenQuotaIsNotReached() throws Exception {
         sieveRepository.setDefaultQuota(DEFAULT_QUOTA);
-        sieveRepository.haveSpace(USER, SCRIPT_NAME, DEFAULT_QUOTA.asLong());
+        sieveRepository.haveSpace(USERNAME, SCRIPT_NAME, DEFAULT_QUOTA.asLong());
     }
 
     @Test(expected = QuotaExceededException.class)
     public void haveSpaceShouldThrowWhenQuotaIsExceed() throws Exception {
         sieveRepository.setDefaultQuota(DEFAULT_QUOTA);
-        sieveRepository.haveSpace(USER, SCRIPT_NAME, DEFAULT_QUOTA.asLong() + 1);
+        sieveRepository.haveSpace(USERNAME, SCRIPT_NAME, DEFAULT_QUOTA.asLong() + 1);
     }
 
     @Test
     public void haveSpaceShouldNotThrowWhenAttemptToReplaceOtherScript() throws Exception {
-        sieveRepository.setQuota(USER, USER_QUOTA);
-        sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
-        sieveRepository.haveSpace(USER, SCRIPT_NAME, USER_QUOTA.asLong());
+        sieveRepository.setQuota(USERNAME, USER_QUOTA);
+        sieveRepository.putScript(USERNAME, SCRIPT_NAME, SCRIPT_CONTENT);
+        sieveRepository.haveSpace(USERNAME, SCRIPT_NAME, USER_QUOTA.asLong());
     }
 
     @Test(expected = QuotaExceededException.class)
     public void haveSpaceShouldThrowWhenAttemptToReplaceOtherScriptWithTooLargeScript() throws Exception {
-        sieveRepository.setQuota(USER, USER_QUOTA);
-        sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
-        sieveRepository.haveSpace(USER, SCRIPT_NAME, USER_QUOTA.asLong() + 1);
+        sieveRepository.setQuota(USERNAME, USER_QUOTA);
+        sieveRepository.putScript(USERNAME, SCRIPT_NAME, SCRIPT_CONTENT);
+        sieveRepository.haveSpace(USERNAME, SCRIPT_NAME, USER_QUOTA.asLong() + 1);
     }
 
     @Test(expected = QuotaExceededException.class)
     public void haveSpaceShouldTakeAlreadyExistingScriptsIntoAccount() throws Exception {
-        sieveRepository.setQuota(USER, USER_QUOTA);
-        sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
-        sieveRepository.haveSpace(USER, OTHER_SCRIPT_NAME, USER_QUOTA.asLong() - 1);
+        sieveRepository.setQuota(USERNAME, USER_QUOTA);
+        sieveRepository.putScript(USERNAME, SCRIPT_NAME, SCRIPT_CONTENT);
+        sieveRepository.haveSpace(USERNAME, OTHER_SCRIPT_NAME, USER_QUOTA.asLong() - 1);
     }
 
     @Test
     public void haveSpaceShouldNotThrowAfterActivatingAScript() throws Exception {
-        sieveRepository.setQuota(USER, USER_QUOTA);
-        sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
-        sieveRepository.setActive(USER, SCRIPT_NAME);
-        sieveRepository.haveSpace(USER, SCRIPT_NAME, USER_QUOTA.asLong());
+        sieveRepository.setQuota(USERNAME, USER_QUOTA);
+        sieveRepository.putScript(USERNAME, SCRIPT_NAME, SCRIPT_CONTENT);
+        sieveRepository.setActive(USERNAME, SCRIPT_NAME);
+        sieveRepository.haveSpace(USERNAME, SCRIPT_NAME, USER_QUOTA.asLong());
     }
 
     @Test
     public void listScriptsShouldThrowIfUserNotFound() throws Exception {
-        assertThat(sieveRepository.listScripts(USER)).isEmpty();
+        assertThat(sieveRepository.listScripts(USERNAME)).isEmpty();
     }
 
     @Test
     public void listScriptsShouldReturnEmptyListWhenThereIsNoScript() throws Exception {
-        assertThat(sieveRepository.listScripts(USER)).isEmpty();
+        assertThat(sieveRepository.listScripts(USERNAME)).isEmpty();
     }
 
     @Test
     public void putScriptShouldWork() throws Exception {
-        sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
-        assertThat(sieveRepository.listScripts(USER)).containsOnly(new ScriptSummary(SCRIPT_NAME, false));
+        sieveRepository.putScript(USERNAME, SCRIPT_NAME, SCRIPT_CONTENT);
+        assertThat(sieveRepository.listScripts(USERNAME)).containsOnly(new ScriptSummary(SCRIPT_NAME, false));
     }
 
     @Test
     public void setActiveShouldWork() throws Exception {
-        sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
-        sieveRepository.setActive(USER, SCRIPT_NAME);
-        assertThat(sieveRepository.listScripts(USER)).containsOnly(new ScriptSummary(SCRIPT_NAME, true));
+        sieveRepository.putScript(USERNAME, SCRIPT_NAME, SCRIPT_CONTENT);
+        sieveRepository.setActive(USERNAME, SCRIPT_NAME);
+        assertThat(sieveRepository.listScripts(USERNAME)).containsOnly(new ScriptSummary(SCRIPT_NAME, true));
     }
 
     @Test
     public void listScriptShouldCombineActiveAndPassiveScripts() throws Exception {
-        sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
-        sieveRepository.setActive(USER, SCRIPT_NAME);
-        sieveRepository.putScript(USER, OTHER_SCRIPT_NAME, OTHER_SCRIPT_CONTENT);
-        assertThat(sieveRepository.listScripts(USER)).containsOnly(new ScriptSummary(SCRIPT_NAME, true), new ScriptSummary(OTHER_SCRIPT_NAME, false));
+        sieveRepository.putScript(USERNAME, SCRIPT_NAME, SCRIPT_CONTENT);
+        sieveRepository.setActive(USERNAME, SCRIPT_NAME);
+        sieveRepository.putScript(USERNAME, OTHER_SCRIPT_NAME, OTHER_SCRIPT_CONTENT);
+        assertThat(sieveRepository.listScripts(USERNAME)).containsOnly(new ScriptSummary(SCRIPT_NAME, true), new ScriptSummary(OTHER_SCRIPT_NAME, false));
     }
 
     @Test(expected = QuotaExceededException.class)
     public void putScriptShouldThrowWhenScriptTooBig() throws Exception {
         sieveRepository.setDefaultQuota(QuotaSize.size(SCRIPT_CONTENT.length() - 1));
-        sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
+        sieveRepository.putScript(USERNAME, SCRIPT_NAME, SCRIPT_CONTENT);
     }
 
     @Test(expected = QuotaExceededException.class)
     public void putScriptShouldThrowWhenQuotaChangedInBetween() throws Exception {
         sieveRepository.setDefaultQuota(QuotaSize.size(SCRIPT_CONTENT.length()));
-        sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
+        sieveRepository.putScript(USERNAME, SCRIPT_NAME, SCRIPT_CONTENT);
         sieveRepository.setDefaultQuota(QuotaSize.size(SCRIPT_CONTENT.length() - 1));
-        sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
+        sieveRepository.putScript(USERNAME, SCRIPT_NAME, SCRIPT_CONTENT);
     }
 
     @Test(expected = ScriptNotFoundException.class)
     public void setActiveScriptShouldThrowOnNonExistentScript() throws Exception {
-        sieveRepository.setActive(USER, SCRIPT_NAME);
+        sieveRepository.setActive(USERNAME, SCRIPT_NAME);
     }
 
     @Test
     public void setActiveScriptShouldWork() throws Exception {
-        sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
-        sieveRepository.setActive(USER, SCRIPT_NAME);
-        assertThat(getScriptContent(sieveRepository.getActive(USER))).isEqualTo(SCRIPT_CONTENT);
+        sieveRepository.putScript(USERNAME, SCRIPT_NAME, SCRIPT_CONTENT);
+        sieveRepository.setActive(USERNAME, SCRIPT_NAME);
+        assertThat(getScriptContent(sieveRepository.getActive(USERNAME))).isEqualTo(SCRIPT_CONTENT);
     }
 
     @Test
     public void setActiveSwitchScriptShouldWork() throws Exception {
-        sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
-        sieveRepository.setActive(USER, SCRIPT_NAME);
-        sieveRepository.putScript(USER, OTHER_SCRIPT_NAME, OTHER_SCRIPT_CONTENT);
-        sieveRepository.setActive(USER, OTHER_SCRIPT_NAME);
-        assertThat(getScriptContent(sieveRepository.getActive(USER))).isEqualTo(OTHER_SCRIPT_CONTENT);
+        sieveRepository.putScript(USERNAME, SCRIPT_NAME, SCRIPT_CONTENT);
+        sieveRepository.setActive(USERNAME, SCRIPT_NAME);
+        sieveRepository.putScript(USERNAME, OTHER_SCRIPT_NAME, OTHER_SCRIPT_CONTENT);
+        sieveRepository.setActive(USERNAME, OTHER_SCRIPT_NAME);
+        assertThat(getScriptContent(sieveRepository.getActive(USERNAME))).isEqualTo(OTHER_SCRIPT_CONTENT);
     }
 
     @Test(expected = ScriptNotFoundException.class)
     public void switchOffActiveScriptShouldWork() throws Exception {
-        sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
-        sieveRepository.setActive(USER, SCRIPT_NAME);
-        sieveRepository.setActive(USER, SieveRepository.NO_SCRIPT_NAME);
-        sieveRepository.getActive(USER);
+        sieveRepository.putScript(USERNAME, SCRIPT_NAME, SCRIPT_CONTENT);
+        sieveRepository.setActive(USERNAME, SCRIPT_NAME);
+        sieveRepository.setActive(USERNAME, SieveRepository.NO_SCRIPT_NAME);
+        sieveRepository.getActive(USERNAME);
     }
 
     @Test
     public void switchOffActiveScriptShouldNotThrow() throws Exception {
-        sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
-        sieveRepository.setActive(USER, SCRIPT_NAME);
-        sieveRepository.setActive(USER, SieveRepository.NO_SCRIPT_NAME);
+        sieveRepository.putScript(USERNAME, SCRIPT_NAME, SCRIPT_CONTENT);
+        sieveRepository.setActive(USERNAME, SCRIPT_NAME);
+        sieveRepository.setActive(USERNAME, SieveRepository.NO_SCRIPT_NAME);
     }
 
     @Test(expected = ScriptNotFoundException.class)
     public void getActiveShouldThrowWhenNoActiveScript() throws Exception {
-        sieveRepository.getActive(USER);
+        sieveRepository.getActive(USERNAME);
     }
 
     @Test(expected = ScriptNotFoundException.class)
     public void deleteActiveScriptShouldThrowIfScriptDoNotExist() throws Exception {
-        sieveRepository.deleteScript(USER, SCRIPT_NAME);
+        sieveRepository.deleteScript(USERNAME, SCRIPT_NAME);
     }
 
     @Test(expected = IsActiveException.class)
     public void deleteActiveScriptShouldThrow() throws Exception {
-        sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
-        sieveRepository.setActive(USER, SCRIPT_NAME);
-        sieveRepository.deleteScript(USER, SCRIPT_NAME);
+        sieveRepository.putScript(USERNAME, SCRIPT_NAME, SCRIPT_CONTENT);
+        sieveRepository.setActive(USERNAME, SCRIPT_NAME);
+        sieveRepository.deleteScript(USERNAME, SCRIPT_NAME);
     }
 
     @Test(expected = IsActiveException.class)
     public void deleteScriptShouldWork() throws Exception {
-        sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
-        sieveRepository.setActive(USER, SCRIPT_NAME);
-        sieveRepository.deleteScript(USER, SCRIPT_NAME);
-        sieveRepository.getScript(USER, SCRIPT_NAME);
+        sieveRepository.putScript(USERNAME, SCRIPT_NAME, SCRIPT_CONTENT);
+        sieveRepository.setActive(USERNAME, SCRIPT_NAME);
+        sieveRepository.deleteScript(USERNAME, SCRIPT_NAME);
+        sieveRepository.getScript(USERNAME, SCRIPT_NAME);
     }
 
     @Test(expected = ScriptNotFoundException.class)
     public void renameScriptShouldThrowIfScriptNotFound() throws Exception {
-        sieveRepository.renameScript(USER, SCRIPT_NAME, OTHER_SCRIPT_NAME);
+        sieveRepository.renameScript(USERNAME, SCRIPT_NAME, OTHER_SCRIPT_NAME);
     }
 
     @Test
     public void renameScriptShouldWork() throws Exception {
-        sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
-        sieveRepository.renameScript(USER, SCRIPT_NAME, OTHER_SCRIPT_NAME);
-        assertThat(getScriptContent(sieveRepository.getScript(USER, OTHER_SCRIPT_NAME))).isEqualTo(SCRIPT_CONTENT);
+        sieveRepository.putScript(USERNAME, SCRIPT_NAME, SCRIPT_CONTENT);
+        sieveRepository.renameScript(USERNAME, SCRIPT_NAME, OTHER_SCRIPT_NAME);
+        assertThat(getScriptContent(sieveRepository.getScript(USERNAME, OTHER_SCRIPT_NAME))).isEqualTo(SCRIPT_CONTENT);
     }
 
     @Test
     public void renameScriptShouldPropagateActiveScript() throws Exception {
-        sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
-        sieveRepository.setActive(USER, SCRIPT_NAME);
-        sieveRepository.renameScript(USER, SCRIPT_NAME, OTHER_SCRIPT_NAME);
-        assertThat(getScriptContent(sieveRepository.getActive(USER))).isEqualTo(SCRIPT_CONTENT);
+        sieveRepository.putScript(USERNAME, SCRIPT_NAME, SCRIPT_CONTENT);
+        sieveRepository.setActive(USERNAME, SCRIPT_NAME);
+        sieveRepository.renameScript(USERNAME, SCRIPT_NAME, OTHER_SCRIPT_NAME);
+        assertThat(getScriptContent(sieveRepository.getActive(USERNAME))).isEqualTo(SCRIPT_CONTENT);
     }
 
     @Test(expected = DuplicateException.class)
     public void renameScriptShouldNotOverwriteExistingScript() throws Exception {
-        sieveRepository.putScript(USER, SCRIPT_NAME, SCRIPT_CONTENT);
-        sieveRepository.putScript(USER, OTHER_SCRIPT_NAME, OTHER_SCRIPT_CONTENT);
-        sieveRepository.renameScript(USER, SCRIPT_NAME, OTHER_SCRIPT_NAME);
+        sieveRepository.putScript(USERNAME, SCRIPT_NAME, SCRIPT_CONTENT);
+        sieveRepository.putScript(USERNAME, OTHER_SCRIPT_NAME, OTHER_SCRIPT_CONTENT);
+        sieveRepository.renameScript(USERNAME, SCRIPT_NAME, OTHER_SCRIPT_NAME);
     }
 
     @Test(expected = QuotaNotFoundException.class)
@@ -275,8 +275,8 @@ public abstract class AbstractSieveRepositoryTest {
 
     @Test
     public void getQuotaShouldWorkOnUsers() throws Exception {
-        sieveRepository.setQuota(USER, USER_QUOTA);
-        assertThat(sieveRepository.getQuota(USER)).isEqualTo(USER_QUOTA);
+        sieveRepository.setQuota(USERNAME, USER_QUOTA);
+        assertThat(sieveRepository.getQuota(USERNAME)).isEqualTo(USER_QUOTA);
     }
 
     @Test
@@ -297,8 +297,8 @@ public abstract class AbstractSieveRepositoryTest {
 
     @Test
     public void hasQuotaShouldReturnTrueWhenUserHaveQuota() throws Exception {
-        sieveRepository.setQuota(USER, DEFAULT_QUOTA);
-        assertThat(sieveRepository.hasQuota(USER)).isTrue();
+        sieveRepository.setQuota(USERNAME, DEFAULT_QUOTA);
+        assertThat(sieveRepository.hasQuota(USERNAME)).isTrue();
     }
 
     @Test
@@ -308,7 +308,7 @@ public abstract class AbstractSieveRepositoryTest {
 
     @Test
     public void removeUserQuotaShouldNotThrowWhenAbsent() throws Exception {
-        sieveRepository.removeQuota(USER);
+        sieveRepository.removeQuota(USERNAME);
     }
 
     @Test
@@ -320,17 +320,17 @@ public abstract class AbstractSieveRepositoryTest {
 
     @Test
     public void removeQuotaShouldWorkOnUsers() throws Exception {
-        sieveRepository.setQuota(USER, USER_QUOTA);
-        sieveRepository.removeQuota(USER);
-        assertThat(sieveRepository.hasQuota(USER)).isFalse();
+        sieveRepository.setQuota(USERNAME, USER_QUOTA);
+        sieveRepository.removeQuota(USERNAME);
+        assertThat(sieveRepository.hasQuota(USERNAME)).isFalse();
     }
 
     @Test(expected = QuotaNotFoundException.class)
     public void removeQuotaShouldWorkOnUsersWithGlobalQuota() throws Exception {
         sieveRepository.setDefaultQuota(DEFAULT_QUOTA);
-        sieveRepository.setQuota(USER, USER_QUOTA);
-        sieveRepository.removeQuota(USER);
-        sieveRepository.getQuota(USER);
+        sieveRepository.setQuota(USERNAME, USER_QUOTA);
+        sieveRepository.removeQuota(USERNAME);
+        sieveRepository.getQuota(USERNAME);
     }
 
     @Test
@@ -341,15 +341,15 @@ public abstract class AbstractSieveRepositoryTest {
 
     @Test
     public void setQuotaShouldWorkOnUsers() throws Exception {
-        sieveRepository.setQuota(USER, DEFAULT_QUOTA);
-        assertThat(sieveRepository.getQuota(USER)).isEqualTo(DEFAULT_QUOTA);
+        sieveRepository.setQuota(USERNAME, DEFAULT_QUOTA);
+        assertThat(sieveRepository.getQuota(USERNAME)).isEqualTo(DEFAULT_QUOTA);
     }
 
     @Test
     public void setQuotaShouldOverrideExistingQuota() throws Exception {
-        sieveRepository.setQuota(USER, USER_QUOTA);
-        sieveRepository.setQuota(USER, QuotaSize.size(USER_QUOTA.asLong() - 1));
-        assertThat(sieveRepository.getQuota(USER)).isEqualTo(QuotaSize.size(USER_QUOTA.asLong() - 1));
+        sieveRepository.setQuota(USERNAME, USER_QUOTA);
+        sieveRepository.setQuota(USERNAME, QuotaSize.size(USER_QUOTA.asLong() - 1));
+        assertThat(sieveRepository.getQuota(USERNAME)).isEqualTo(QuotaSize.size(USER_QUOTA.asLong() - 1));
     }
 
     protected ScriptContent getScriptContent(InputStream inputStream) throws IOException {
diff --git a/server/data/data-library/src/test/java/org/apache/james/sieverepository/lib/SieveRepositoryManagementTest.java b/server/data/data-library/src/test/java/org/apache/james/sieverepository/lib/SieveRepositoryManagementTest.java
index 0f80edc..e50c1c5 100644
--- a/server/data/data-library/src/test/java/org/apache/james/sieverepository/lib/SieveRepositoryManagementTest.java
+++ b/server/data/data-library/src/test/java/org/apache/james/sieverepository/lib/SieveRepositoryManagementTest.java
@@ -25,7 +25,7 @@ import java.net.URL;
 import java.nio.charset.StandardCharsets;
 
 import org.apache.commons.io.IOUtils;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.sieverepository.api.ScriptContent;
 import org.apache.james.sieverepository.api.ScriptName;
 import org.apache.james.sieverepository.api.SieveRepository;
@@ -55,15 +55,15 @@ public class SieveRepositoryManagementTest {
         String script = "user_script";
         URL sieveResource = ClassLoader.getSystemResource("sieve/my_sieve");
 
-        User user = User.fromUsername(userName);
+        Username username = Username.fromUsername(userName);
         ScriptName scriptName = new ScriptName(script);
         String sieveContent = IOUtils.toString(sieveResource, StandardCharsets.UTF_8);
         ScriptContent scriptContent = new ScriptContent(sieveContent);
 
         sieveRepositoryManagement.addActiveSieveScriptFromFile(userName, script, sieveResource.getFile());
 
-        verify(sieveRepository, times(1)).putScript(user, scriptName, scriptContent);
-        verify(sieveRepository, times(1)).setActive(user, scriptName);
+        verify(sieveRepository, times(1)).putScript(username, scriptName, scriptContent);
+        verify(sieveRepository, times(1)).setActive(username, scriptName);
     }
 
     @Test
@@ -72,13 +72,13 @@ public class SieveRepositoryManagementTest {
         String script = "user_script";
         URL sieveResource = ClassLoader.getSystemResource("sieve/my_sieve");
 
-        User user = User.fromUsername(userName);
+        Username username = Username.fromUsername(userName);
         ScriptName scriptName = new ScriptName(script);
         String sieveContent = IOUtils.toString(sieveResource, StandardCharsets.UTF_8);
         ScriptContent scriptContent = new ScriptContent(sieveContent);
 
         sieveRepositoryManagement.addActiveSieveScriptFromFile(userName, script, "wrong_path/" + sieveResource.getFile());
-        verify(sieveRepository, times(0)).putScript(user, scriptName, scriptContent);
-        verify(sieveRepository, times(0)).setActive(user, scriptName);
+        verify(sieveRepository, times(0)).putScript(username, scriptName, scriptContent);
+        verify(sieveRepository, times(0)).setActive(username, scriptName);
     }
 }
\ No newline at end of file
diff --git a/server/data/data-library/src/test/java/org/apache/james/user/lib/AbstractUsersRepositoryTest.java b/server/data/data-library/src/test/java/org/apache/james/user/lib/AbstractUsersRepositoryTest.java
index e6c2a16..ae0fded 100644
--- a/server/data/data-library/src/test/java/org/apache/james/user/lib/AbstractUsersRepositoryTest.java
+++ b/server/data/data-library/src/test/java/org/apache/james/user/lib/AbstractUsersRepositoryTest.java
@@ -26,6 +26,7 @@ import java.util.Optional;
 
 import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
+import org.apache.james.core.Username;
 import org.apache.james.domainlist.api.mock.SimpleDomainList;
 import org.apache.james.lifecycle.api.LifecycleUtil;
 import org.apache.james.user.api.AlreadyExistInUsersRepositoryException;
@@ -373,7 +374,7 @@ public abstract class AbstractUsersRepositoryTest {
         Assume.assumeTrue(usersRepository.supportVirtualHosting());
 
         String username = "user@domain";
-        assertThat(usersRepository.getMailAddressFor(org.apache.james.core.User.fromUsername(username)))
+        assertThat(usersRepository.getMailAddressFor(Username.fromUsername(username)))
             .isEqualTo(username);
     }
 
@@ -386,7 +387,7 @@ public abstract class AbstractUsersRepositoryTest {
         Assume.assumeFalse(usersRepository.supportVirtualHosting());
 
         String username = "user";
-        assertThat(usersRepository.getMailAddressFor(org.apache.james.core.User.fromUsername(username)))
+        assertThat(usersRepository.getMailAddressFor(Username.fromUsername(username)))
             .isEqualTo(new MailAddress(username, domainList.getDefaultDomain()));
     }
 }
diff --git a/server/data/data-memory/src/main/java/org/apache/james/rrt/memory/MemoryRecipientRewriteTable.java b/server/data/data-memory/src/main/java/org/apache/james/rrt/memory/MemoryRecipientRewriteTable.java
index 7b782eb..3c4a282 100644
--- a/server/data/data-memory/src/main/java/org/apache/james/rrt/memory/MemoryRecipientRewriteTable.java
+++ b/server/data/data-memory/src/main/java/org/apache/james/rrt/memory/MemoryRecipientRewriteTable.java
@@ -28,7 +28,7 @@ import java.util.stream.Stream;
 
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.james.core.Domain;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.rrt.lib.AbstractRecipientRewriteTable;
 import org.apache.james.rrt.lib.Mapping;
 import org.apache.james.rrt.lib.MappingSource;
@@ -102,7 +102,7 @@ public class MemoryRecipientRewriteTable extends AbstractRecipientRewriteTable {
     @Override
     protected Mappings mapAddress(String user, Domain domain) {
         return OptionalUtils.orSuppliers(
-            () -> retrieveMappings(MappingSource.fromUser(User.fromLocalPartWithDomain(user, domain))),
+            () -> retrieveMappings(MappingSource.fromUser(Username.fromLocalPartWithDomain(user, domain))),
             () -> retrieveMappings(MappingSource.fromDomain(domain)))
             .orElse(MappingsImpl.empty());
     }
diff --git a/server/data/data-memory/src/main/java/org/apache/james/sieverepository/memory/InMemorySieveQuotaRepository.java b/server/data/data-memory/src/main/java/org/apache/james/sieverepository/memory/InMemorySieveQuotaRepository.java
index 0ed13b0..c6e51e1 100644
--- a/server/data/data-memory/src/main/java/org/apache/james/sieverepository/memory/InMemorySieveQuotaRepository.java
+++ b/server/data/data-memory/src/main/java/org/apache/james/sieverepository/memory/InMemorySieveQuotaRepository.java
@@ -23,7 +23,7 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.core.quota.QuotaSize;
 import org.apache.james.sieverepository.api.SieveQuotaRepository;
 import org.apache.james.sieverepository.api.exception.QuotaNotFoundException;
@@ -32,7 +32,7 @@ public class InMemorySieveQuotaRepository implements SieveQuotaRepository {
 
     private Optional<QuotaSize> globalQuota = Optional.empty();
 
-    private Map<User, QuotaSize> userQuota = new ConcurrentHashMap<>();
+    private Map<Username, QuotaSize> userQuota = new ConcurrentHashMap<>();
 
     @Override
     public synchronized boolean hasDefaultQuota() {
@@ -58,27 +58,27 @@ public class InMemorySieveQuotaRepository implements SieveQuotaRepository {
     }
 
     @Override
-    public synchronized boolean hasQuota(User user) {
-        return userQuota.containsKey(user);
+    public synchronized boolean hasQuota(Username username) {
+        return userQuota.containsKey(username);
     }
 
     @Override
-    public QuotaSize getQuota(User user) throws QuotaNotFoundException {
-        return Optional.ofNullable(userQuota.get(user))
+    public QuotaSize getQuota(Username username) throws QuotaNotFoundException {
+        return Optional.ofNullable(userQuota.get(username))
             .orElseThrow(QuotaNotFoundException::new);
     }
 
     @Override
-    public synchronized void setQuota(User user, QuotaSize quota) {
-        userQuota.put(user, quota);
+    public synchronized void setQuota(Username username, QuotaSize quota) {
+        userQuota.put(username, quota);
     }
 
     @Override
-    public synchronized void removeQuota(User user) throws QuotaNotFoundException {
-        Optional<QuotaSize> quotaValue = Optional.ofNullable(userQuota.get(user));
+    public synchronized void removeQuota(Username username) throws QuotaNotFoundException {
+        Optional<QuotaSize> quotaValue = Optional.ofNullable(userQuota.get(username));
         if (!quotaValue.isPresent()) {
             throw new QuotaNotFoundException();
         }
-        userQuota.remove(user);
+        userQuota.remove(username);
     }
 }
diff --git a/server/data/data-memory/src/main/java/org/apache/james/user/memory/MemoryUsersRepository.java b/server/data/data-memory/src/main/java/org/apache/james/user/memory/MemoryUsersRepository.java
index 2922f9c..231f836 100644
--- a/server/data/data-memory/src/main/java/org/apache/james/user/memory/MemoryUsersRepository.java
+++ b/server/data/data-memory/src/main/java/org/apache/james/user/memory/MemoryUsersRepository.java
@@ -28,6 +28,7 @@ import java.util.Optional;
 import org.apache.commons.configuration2.HierarchicalConfiguration;
 import org.apache.commons.configuration2.ex.ConfigurationException;
 import org.apache.commons.configuration2.tree.ImmutableNode;
+import org.apache.james.core.Username;
 import org.apache.james.user.api.UsersRepositoryException;
 import org.apache.james.user.api.model.User;
 import org.apache.james.user.lib.AbstractUsersRepository;
@@ -103,7 +104,7 @@ public class MemoryUsersRepository extends AbstractUsersRepository {
 
     @Override
     public boolean test(String name, final String password) throws UsersRepositoryException {
-        return Optional.ofNullable(userByName.get(org.apache.james.core.User.fromUsername(name).asString()))
+        return Optional.ofNullable(userByName.get(Username.fromUsername(name).asString()))
             .map(user -> user.verifyPassword(password))
             .orElse(false);
     }
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RandomStoring.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RandomStoring.java
index eabcf60..6a0f565 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RandomStoring.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RandomStoring.java
@@ -30,7 +30,7 @@ import javax.inject.Inject;
 import javax.mail.MessagingException;
 
 import org.apache.james.core.MailAddress;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.transport.mailets.delivery.MailStore;
@@ -104,20 +104,20 @@ public class RandomStoring extends GenericMailet {
 
     private List<ReroutingInfos> retrieveReroutingInfos() throws UsersRepositoryException {
         return Streams.stream(usersRepository.list())
-            .map(User::fromUsername)
+            .map(Username::fromUsername)
             .flatMap(this::buildReRoutingInfos)
             .collect(Guavate.toImmutableList());
     }
 
-    private Stream<ReroutingInfos> buildReRoutingInfos(User user) {
+    private Stream<ReroutingInfos> buildReRoutingInfos(Username username) {
         try {
-            MailAddress mailAddress = usersRepository.getMailAddressFor(user);
+            MailAddress mailAddress = usersRepository.getMailAddressFor(username);
 
-            MailboxSession session = mailboxManager.createSystemSession(user.asString());
+            MailboxSession session = mailboxManager.createSystemSession(username.asString());
             return mailboxManager
                 .list(session)
                 .stream()
-                .map(mailboxPath -> new ReroutingInfos(mailAddress, mailboxPath.getName(), user.asString()));
+                .map(mailboxPath -> new ReroutingInfos(mailAddress, mailboxPath.getName(), username.asString()));
         } catch (Exception e) {
             throw new RuntimeException(e);
         }
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java
index c69e4ad..4e3539b 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java
@@ -26,7 +26,7 @@ import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
 
 import org.apache.james.core.MailAddress;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.metrics.api.MetricFactory;
 import org.apache.james.spamassassin.SpamAssassinInvoker;
 import org.apache.james.spamassassin.SpamAssassinResult;
@@ -108,7 +108,7 @@ public class SpamAssassin extends GenericMailet {
     }
 
     private void querySpamAssassin(Mail mail, MimeMessage message, SpamAssassinInvoker sa, MailAddress recipient) throws MessagingException, UsersRepositoryException {
-        SpamAssassinResult result = sa.scanMail(message, User.fromUsername(usersRepository.getUser(recipient)));
+        SpamAssassinResult result = sa.scanMail(message, Username.fromUsername(usersRepository.getUser(recipient)));
 
         // Add headers per recipient to mail object
         for (Attribute attribute : result.getHeadersAsAttributes()) {
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/ResourceLocator.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/ResourceLocator.java
index 68c306b..61113b5 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/ResourceLocator.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/ResourceLocator.java
@@ -22,7 +22,7 @@ import java.io.InputStream;
 import java.time.ZonedDateTime;
 
 import org.apache.james.core.MailAddress;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.sieverepository.api.SieveRepository;
 import org.apache.james.user.api.UsersRepository;
 import org.apache.james.user.api.UsersRepositoryException;
@@ -62,15 +62,15 @@ public class ResourceLocator {
     }
 
     public UserSieveInformation get(MailAddress mailAddress) throws Exception {
-        User username = retrieveUsername(mailAddress);
+        Username username = retrieveUsername(mailAddress);
         return new UserSieveInformation(sieveRepository.getActivationDateForActiveScript(username), ZonedDateTime.now(), sieveRepository.getActive(username));
     }
 
-    private User retrieveUsername(MailAddress mailAddress) {
+    private Username retrieveUsername(MailAddress mailAddress) {
         try {
-            return User.fromUsername(usersRepository.getUser(mailAddress));
+            return Username.fromUsername(usersRepository.getUser(mailAddress));
         } catch (UsersRepositoryException e) {
-            return User.fromMailAddress(mailAddress);
+            return Username.fromMailAddress(mailAddress);
         }
     }
 
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/ResourceLocatorTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/ResourceLocatorTest.java
index 12ff8d3..c485a8c 100644
--- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/ResourceLocatorTest.java
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/ResourceLocatorTest.java
@@ -27,7 +27,7 @@ import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 
 import org.apache.james.core.MailAddress;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.sieverepository.api.SieveRepository;
 import org.apache.james.sieverepository.api.exception.ScriptNotFoundException;
 import org.apache.james.transport.mailets.jsieve.ResourceLocator;
@@ -38,7 +38,7 @@ import org.junit.Test;
 public class ResourceLocatorTest {
 
     public static final String RECEIVER_LOCALHOST = "receiver@localhost";
-    public static final User USER = User.fromUsername(RECEIVER_LOCALHOST);
+    public static final Username USERNAME = Username.fromUsername(RECEIVER_LOCALHOST);
     private SieveRepository sieveRepository;
     private ResourceLocator resourceLocator;
     private MailAddress mailAddress;
@@ -54,7 +54,7 @@ public class ResourceLocatorTest {
 
     @Test(expected = ScriptNotFoundException.class)
     public void resourceLocatorImplShouldPropagateScriptNotFound() throws Exception {
-        when(sieveRepository.getActive(USER)).thenThrow(new ScriptNotFoundException());
+        when(sieveRepository.getActive(USERNAME)).thenThrow(new ScriptNotFoundException());
         when(usersRepository.getUser(mailAddress)).thenReturn(RECEIVER_LOCALHOST);
 
         resourceLocator.get(mailAddress);
@@ -63,7 +63,7 @@ public class ResourceLocatorTest {
     @Test
     public void resourceLocatorImplShouldWork() throws Exception {
         InputStream inputStream = new ByteArrayInputStream(new byte[0]);
-        when(sieveRepository.getActive(USER)).thenReturn(inputStream);
+        when(sieveRepository.getActive(USERNAME)).thenReturn(inputStream);
         when(usersRepository.getUser(mailAddress)).thenReturn(RECEIVER_LOCALHOST);
 
         assertThat(resourceLocator.get(mailAddress).getScriptContent()).isEqualTo(inputStream);
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/LocalDeliveryTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/LocalDeliveryTest.java
index 30816cc..db4b62a 100644
--- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/LocalDeliveryTest.java
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/LocalDeliveryTest.java
@@ -31,7 +31,7 @@ import javax.mail.MessagingException;
 import javax.mail.internet.MimeBodyPart;
 
 import org.apache.james.core.MailAddress;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.core.builder.MimeMessageBuilder;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
@@ -87,7 +87,7 @@ public class LocalDeliveryTest {
         when(usersRepository.supportVirtualHosting()).thenReturn(true);
         when(usersRepository.getUser(new MailAddress(username))).thenReturn(username);
         when(mailboxManager.getMailbox(eq(inbox), any(MailboxSession.class))).thenReturn(messageManager);
-        when(session.getUser()).thenReturn(User.fromUsername(username));
+        when(session.getUser()).thenReturn(Username.fromUsername(username));
 
         // When
         Mail mail = createMail();
@@ -108,7 +108,7 @@ public class LocalDeliveryTest {
         when(usersRepository.getUser(new MailAddress("receiver@localhost"))).thenReturn(username);
         when(usersRepository.getUser(new MailAddress(RECEIVER_DOMAIN_COM))).thenReturn(username);
         when(mailboxManager.getMailbox(eq(inbox), any(MailboxSession.class))).thenReturn(messageManager);
-        when(session.getUser()).thenReturn(User.fromUsername(username));
+        when(session.getUser()).thenReturn(Username.fromUsername(username));
 
         // When
         Mail mail = createMail();
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/ToRecipientFolderTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/ToRecipientFolderTest.java
index f87e12c..5431ff4 100644
--- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/ToRecipientFolderTest.java
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/ToRecipientFolderTest.java
@@ -32,7 +32,7 @@ import javax.mail.MessagingException;
 import javax.mail.internet.MimeBodyPart;
 
 import org.apache.james.core.MailAddress;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.core.builder.MimeMessageBuilder;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
@@ -86,7 +86,7 @@ public class ToRecipientFolderTest {
         } catch (MailboxException e) {
             throw new RuntimeException(e);
         }
-        when(session.getUser()).thenReturn(User.fromUsername(USER));
+        when(session.getUser()).thenReturn(Username.fromUsername(USER));
     }
 
     @Test
@@ -164,7 +164,7 @@ public class ToRecipientFolderTest {
         when(usersRepository.getUser(new MailAddress(USER_LOCAL_PART + "@localhost"))).thenReturn(USER_LOCAL_PART);
         when(usersRepository.getUser(new MailAddress(USER))).thenReturn(USER_LOCAL_PART);
         when(mailboxManager.getMailbox(eq(JUNK), any(MailboxSession.class))).thenReturn(messageManager);
-        when(session.getUser()).thenReturn(User.fromUsername(USER_LOCAL_PART));
+        when(session.getUser()).thenReturn(Username.fromUsername(USER_LOCAL_PART));
 
         testee.init(FakeMailetConfig.builder()
             .mailetName(MAILET_NAME)
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailetTestCase.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailetTestCase.java
index aaf5c90..0d3020c 100644
--- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailetTestCase.java
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailetTestCase.java
@@ -39,7 +39,7 @@ import javax.mail.internet.MimeMultipart;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.james.core.MailAddress;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.core.builder.MimeMessageBuilder;
 import org.apache.james.managesieve.api.SieveParser;
 import org.apache.james.managesieve.api.SyntaxException;
@@ -62,7 +62,7 @@ import com.google.common.collect.Lists;
 
 public class ManageSieveMailetTestCase {
 
-    public static final User USER = User.fromUsername("test@localhost");
+    public static final Username USERNAME = Username.fromUsername("test@localhost");
     public static final ScriptName SCRIPT_NAME = new ScriptName("scriptName");
     public static final ScriptContent SCRIPT_CONTENT = new ScriptContent("scriptContent");
     public static final String SYNTAX_EXCEPTION = "SyntaxException";
@@ -82,7 +82,7 @@ public class ManageSieveMailetTestCase {
         sieveParser = mock(SieveParser.class);
         usersRepository = mock(UsersRepository.class);
         initializeMailet();
-        when(usersRepository.contains(USER.asString())).thenReturn(true);
+        when(usersRepository.contains(USERNAME.asString())).thenReturn(true);
     }
 
     @Test
@@ -195,10 +195,10 @@ public class ManageSieveMailetTestCase {
 
     @Test
     public final void testGetScript() throws Exception {
-        when(sieveRepository.getScript(USER, SCRIPT_NAME)).thenReturn(new ByteArrayInputStream(SCRIPT_CONTENT.getValue().getBytes(StandardCharsets.UTF_8)));
+        when(sieveRepository.getScript(USERNAME, SCRIPT_NAME)).thenReturn(new ByteArrayInputStream(SCRIPT_CONTENT.getValue().getBytes(StandardCharsets.UTF_8)));
         MimeMessage message = prepareMimeMessage("GETSCRIPT \"" + SCRIPT_NAME.getValue() + "\"");
         Mail mail = createUnauthenticatedMail(message);
-        mail.setAttribute(new Attribute(Mail.SMTP_AUTH_USER, AttributeValue.of(USER.asString())));
+        mail.setAttribute(new Attribute(Mail.SMTP_AUTH_USER, AttributeValue.of(USERNAME.asString())));
         mailet.service(mail);
         ensureResponse("Re: GETSCRIPT \"" + SCRIPT_NAME.getValue() + "\"", "{13}\r\n" + SCRIPT_CONTENT.getValue() + "\r\nOK");
     }
@@ -213,10 +213,10 @@ public class ManageSieveMailetTestCase {
 
     @Test
     public final void testGetScriptNoScript() throws Exception {
-        doThrow(new ScriptNotFoundException()).when(sieveRepository).getScript(USER, SCRIPT_NAME);
+        doThrow(new ScriptNotFoundException()).when(sieveRepository).getScript(USERNAME, SCRIPT_NAME);
         MimeMessage message = prepareMimeMessage("GETSCRIPT \"" + SCRIPT_NAME.getValue() + "\"");
         Mail mail = createUnauthenticatedMail(message);
-        mail.setAttribute(new Attribute(Mail.SMTP_AUTH_USER, AttributeValue.of(USER.asString())));
+        mail.setAttribute(new Attribute(Mail.SMTP_AUTH_USER, AttributeValue.of(USERNAME.asString())));
         mailet.service(mail);
         ensureResponse("Re: GETSCRIPT \"" + SCRIPT_NAME.getValue() + "\"", "NO (NONEXISTENT) \"There is no script by that name\"");
     }
@@ -224,11 +224,11 @@ public class ManageSieveMailetTestCase {
     @Test
     public final void testGetScriptNoScriptName() throws Exception {
         ScriptContent scriptContent = new ScriptContent("line1\r\nline2");
-        sieveRepository.putScript(USER, SCRIPT_NAME, scriptContent);
+        sieveRepository.putScript(USERNAME, SCRIPT_NAME, scriptContent);
         MimeMessage message = prepareMimeMessage("GETSCRIPT");
         Mail mail = createUnauthenticatedMail(message);
 
-        mail.setAttribute(new Attribute(Mail.SMTP_AUTH_USER, AttributeValue.of(USER.asString())));
+        mail.setAttribute(new Attribute(Mail.SMTP_AUTH_USER, AttributeValue.of(USERNAME.asString())));
         mailet.service(mail);
         ensureResponse("Re: GETSCRIPT", "NO \"Missing argument: script name\"");
     }
@@ -373,7 +373,7 @@ public class ManageSieveMailetTestCase {
 
     @Test
     public final void testListScripts() throws Exception {
-        when(sieveRepository.listScripts(USER)).thenReturn(Lists.newArrayList(new ScriptSummary(new ScriptName("scriptName2"), true), new ScriptSummary(new ScriptName("scriptName1"), false)));
+        when(sieveRepository.listScripts(USERNAME)).thenReturn(Lists.newArrayList(new ScriptSummary(new ScriptName("scriptName2"), true), new ScriptSummary(new ScriptName("scriptName1"), false)));
         MimeMessage message = prepareMimeMessage("LISTSCRIPTS");
         Mail mail = createAuthentificatedMail(message);
         mailet.service(mail);
@@ -390,7 +390,7 @@ public class ManageSieveMailetTestCase {
 
     @Test
     public final void testRenameScriptsUnauthorised() throws Exception {
-        sieveRepository.putScript(USER, OLD_SCRIPT_NAME, SCRIPT_CONTENT);
+        sieveRepository.putScript(USERNAME, OLD_SCRIPT_NAME, SCRIPT_CONTENT);
         MimeMessage message = prepareMimeMessage("RENAMESCRIPT \"" + OLD_SCRIPT_NAME + "\" \"" + NEW_SCRIPT_NAME + "\"");
         Mail mail = createUnauthenticatedMail(message);
         mailet.service(mail);
@@ -399,7 +399,7 @@ public class ManageSieveMailetTestCase {
 
     @Test
     public final void testRenameScripts() throws Exception {
-        sieveRepository.putScript(USER, OLD_SCRIPT_NAME, SCRIPT_CONTENT);
+        sieveRepository.putScript(USERNAME, OLD_SCRIPT_NAME, SCRIPT_CONTENT);
         MimeMessage message = prepareMimeMessage("RENAMESCRIPT \"" + OLD_SCRIPT_NAME + "\" \"" + NEW_SCRIPT_NAME + "\"");
         Mail mail = createAuthentificatedMail(message);
         mailet.service(mail);
@@ -408,7 +408,7 @@ public class ManageSieveMailetTestCase {
 
     @Test
     public final void testRenameScriptsExtraArgs() throws Exception {
-        sieveRepository.putScript(USER, OLD_SCRIPT_NAME, SCRIPT_CONTENT);
+        sieveRepository.putScript(USERNAME, OLD_SCRIPT_NAME, SCRIPT_CONTENT);
         MimeMessage message = prepareMimeMessage("RENAMESCRIPT \"" + OLD_SCRIPT_NAME + "\" \"" + NEW_SCRIPT_NAME + "\" extra");
         Mail mail = createUnauthenticatedMail(message);
         mailet.service(mail);
@@ -417,7 +417,7 @@ public class ManageSieveMailetTestCase {
 
     @Test
     public final void testRenameScriptsNoScriptName() throws Exception {
-        sieveRepository.putScript(USER, OLD_SCRIPT_NAME, SCRIPT_CONTENT);
+        sieveRepository.putScript(USERNAME, OLD_SCRIPT_NAME, SCRIPT_CONTENT);
         MimeMessage message = prepareMimeMessage("RENAMESCRIPT");
         Mail mail = createUnauthenticatedMail(message);
         mailet.service(mail);
@@ -426,7 +426,7 @@ public class ManageSieveMailetTestCase {
 
     @Test
     public final void testRenameScriptsNoNewScriptName() throws Exception {
-        sieveRepository.putScript(USER, OLD_SCRIPT_NAME, SCRIPT_CONTENT);
+        sieveRepository.putScript(USERNAME, OLD_SCRIPT_NAME, SCRIPT_CONTENT);
         MimeMessage message = prepareMimeMessage("RENAMESCRIPT \"" + OLD_SCRIPT_NAME + "\"");
         Mail mail = createUnauthenticatedMail(message);
         mailet.service(mail);
@@ -512,7 +512,7 @@ public class ManageSieveMailetTestCase {
         return FakeMail.builder()
                 .name("name")
                 .mimeMessage(message)
-                .sender(USER.asString())
+                .sender(USERNAME.asString())
                 .recipient(SIEVE_LOCALHOST)
                 .build();
     }
@@ -527,7 +527,7 @@ public class ManageSieveMailetTestCase {
         return MimeMessageBuilder.mimeMessageBuilder()
             .setSubject(subject)
             .addToRecipient(SIEVE_LOCALHOST)
-            .setSender(USER.asString())
+            .setSender(USERNAME.asString())
             .build();
     }
 
@@ -539,7 +539,7 @@ public class ManageSieveMailetTestCase {
         return MimeMessageBuilder.mimeMessageBuilder()
             .setSubject(subject)
             .addToRecipient(SIEVE_LOCALHOST)
-            .setSender(USER.asString())
+            .setSender(USERNAME.asString())
             .setMultipartWithBodyParts(
                 MimeMessageBuilder.bodyPartBuilder()
                     .data(scriptContent)
@@ -570,14 +570,14 @@ public class ManageSieveMailetTestCase {
 
     private MimeMessage verifyHeaders(String subject) throws MessagingException {
         FakeMailContext.SentMail sentMail = FakeMailContext.sentMailBuilder()
-            .recipient(new MailAddress(USER.asString()))
+            .recipient(new MailAddress(USERNAME.asString()))
             .sender(new MailAddress(SIEVE_LOCALHOST))
             .fromMailet()
             .build();
         assertThat(fakeMailContext.getSentMails()).containsOnly(sentMail);
         MimeMessage result = fakeMailContext.getSentMails().get(0).getMsg();
         assertThat(result.getSubject()).isEqualTo(subject);
-        assertThat(result.getRecipients(RecipientType.TO)).containsOnly(new InternetAddress(USER.asString()));
+        assertThat(result.getRecipients(RecipientType.TO)).containsOnly(new InternetAddress(USERNAME.asString()));
         return result;
     }
 }
\ No newline at end of file
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/DefaultMailboxesProvisioningFilter.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/DefaultMailboxesProvisioningFilter.java
index 7f6b58c..45d8dee 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/DefaultMailboxesProvisioningFilter.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/DefaultMailboxesProvisioningFilter.java
@@ -30,7 +30,7 @@ import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.DefaultMailboxes;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
@@ -78,8 +78,8 @@ public class DefaultMailboxesProvisioningFilter implements Filter {
     void createMailboxesIfNeeded(MailboxSession session) {
         TimeMetric timeMetric = metricFactory.timer("JMAP-mailboxes-provisioning");
         try {
-            User user = session.getUser();
-            createDefaultMailboxes(user);
+            Username username = session.getUser();
+            createDefaultMailboxes(username);
         } catch (MailboxException e) {
             throw new RuntimeException(e);
         } finally {
@@ -87,8 +87,8 @@ public class DefaultMailboxesProvisioningFilter implements Filter {
         }
     }
 
-    private void createDefaultMailboxes(User user) throws MailboxException {
-        MailboxSession session = mailboxManager.createSystemSession(user.asString());
+    private void createDefaultMailboxes(Username username) throws MailboxException {
+        MailboxSession session = mailboxManager.createSystemSession(username.asString());
         DefaultMailboxes.DEFAULT_MAILBOXES.stream()
             .map(toMailboxPath(session))
             .filter(mailboxPath -> mailboxDoesntExist(mailboxPath, session))
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/UserProvisioningFilter.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/UserProvisioningFilter.java
index 52e93aa..0e998c3 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/UserProvisioningFilter.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/UserProvisioningFilter.java
@@ -31,7 +31,7 @@ import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.metrics.api.MetricFactory;
 import org.apache.james.metrics.api.TimeMetric;
@@ -69,9 +69,9 @@ public class UserProvisioningFilter implements Filter {
     void createAccountIfNeeded(MailboxSession session) {
         TimeMetric timeMetric = metricFactory.timer("JMAP-user-provisioning");
         try {
-            User user = session.getUser();
-            if (needsAccountCreation(user)) {
-                createAccount(user);
+            Username username = session.getUser();
+            if (needsAccountCreation(username)) {
+                createAccount(username);
             }
         } catch (AlreadyExistInUsersRepositoryException e) {
             // Ignore
@@ -82,19 +82,19 @@ public class UserProvisioningFilter implements Filter {
         }
     }
 
-    private void createAccount(User user) throws UsersRepositoryException {
-        usersRepository.addUser(getUsername(user), generatePassword());
+    private void createAccount(Username username) throws UsersRepositoryException {
+        usersRepository.addUser(getUsername(username), generatePassword());
     }
 
-    private boolean needsAccountCreation(User user) throws UsersRepositoryException {
-        return !usersRepository.contains(getUsername(user));
+    private boolean needsAccountCreation(Username username) throws UsersRepositoryException {
+        return !usersRepository.contains(getUsername(username));
     }
 
-    private String getUsername(User user) throws UsersRepositoryException {
+    private String getUsername(Username username) throws UsersRepositoryException {
         try {
-            return usersRepository.getUser(user.asMailAddress());
+            return usersRepository.getUser(username.asMailAddress());
         } catch (IllegalStateException | AddressException e) {
-            return user.asString();
+            return username.asString();
         }
     }
     
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/GetFilterMethod.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/GetFilterMethod.java
index a597f15..441cb3e 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/GetFilterMethod.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/GetFilterMethod.java
@@ -24,7 +24,7 @@ import java.util.stream.Stream;
 
 import javax.inject.Inject;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.jmap.api.filtering.FilteringManagement;
 import org.apache.james.jmap.api.filtering.Rule;
 import org.apache.james.jmap.draft.model.GetFilterRequest;
@@ -89,8 +89,8 @@ public class GetFilterMethod implements Method {
         }
     }
 
-    private Stream<JmapResponse> retrieveFilter(MethodCallId methodCallId, User user) {
-        List<Rule> rules = filteringManagement.listRulesForUser(user);
+    private Stream<JmapResponse> retrieveFilter(MethodCallId methodCallId, Username username) {
+        List<Rule> rules = filteringManagement.listRulesForUser(username);
 
         GetFilterResponse getFilterResponse = GetFilterResponse.builder()
             .rules(rules)
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/RequestHandler.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/RequestHandler.java
index d8075f8..7d0426b 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/RequestHandler.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/RequestHandler.java
@@ -30,7 +30,7 @@ import java.util.stream.Stream;
 
 import javax.inject.Inject;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.jmap.draft.JmapFieldNotSupportedException;
 import org.apache.james.jmap.draft.model.AuthenticatedRequest;
 import org.apache.james.jmap.draft.model.InvocationResponse;
@@ -59,7 +59,7 @@ public class RequestHandler {
         Optional<MailboxSession> mailboxSession = Optional.ofNullable(request.getMailboxSession());
         try (Closeable closeable =
                  MDCBuilder.create()
-                     .addContext(MDCBuilder.USER, mailboxSession.map(MailboxSession::getUser).map(User::asString))
+                     .addContext(MDCBuilder.USER, mailboxSession.map(MailboxSession::getUser).map(Username::asString))
                      .addContext(MDCBuilder.SESSION_ID, mailboxSession.map(MailboxSession::getSessionId))
                      .addContext(MDCBuilder.ACTION, request.getMethodName().getName())
                      .build()) {
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetFilterMethod.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetFilterMethod.java
index 35a2a89..57f1352 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetFilterMethod.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetFilterMethod.java
@@ -27,7 +27,7 @@ import java.util.stream.Stream;
 
 import javax.inject.Inject;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.jmap.api.filtering.FilteringManagement;
 import org.apache.james.jmap.api.filtering.Rule;
 import org.apache.james.jmap.draft.model.JmapRuleDTO;
@@ -134,7 +134,7 @@ public class SetFilterMethod implements Method {
         }
     }
 
-    private Stream<JmapResponse> updateFilter(MethodCallId methodCallId, SetFilterRequest request, User user) throws DuplicatedRuleException, MultipleMailboxIdException {
+    private Stream<JmapResponse> updateFilter(MethodCallId methodCallId, SetFilterRequest request, Username username) throws DuplicatedRuleException, MultipleMailboxIdException {
         ImmutableList<Rule> rules = request.getSingleton().stream()
             .map(JmapRuleDTO::toRule)
             .collect(ImmutableList.toImmutableList());
@@ -142,7 +142,7 @@ public class SetFilterMethod implements Method {
         ensureNoDuplicatedRules(rules);
         ensureNoMultipleMailboxesRules(rules);
 
-        filteringManagement.defineRulesForUser(user, rules);
+        filteringManagement.defineRulesForUser(username, rules);
 
         return Stream.of(JmapResponse.builder()
             .methodCallId(methodCallId)
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessor.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessor.java
index 1c4f877..eabed22 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessor.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessor.java
@@ -29,7 +29,7 @@ import java.util.stream.Collectors;
 import javax.inject.Inject;
 import javax.mail.MessagingException;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.jmap.draft.exceptions.AttachmentsNotFoundException;
 import org.apache.james.jmap.draft.exceptions.InvalidDraftKeywordsException;
 import org.apache.james.jmap.draft.exceptions.InvalidMailboxForCreationException;
@@ -285,7 +285,7 @@ public class SetMessagesCreationProcessor implements SetMessagesProcessor {
 
     private void assertUserIsSender(MailboxSession session, Optional<DraftEmailer> from) throws MailboxSendingNotAllowedException {
         if (!from.flatMap(DraftEmailer::getEmail)
-                .filter(email -> session.getUser().equals(User.fromUsername(email)))
+                .filter(email -> session.getUser().equals(Username.fromUsername(email)))
                 .isPresent()) {
             String allowedSender = session.getUser().asString();
             throw new MailboxSendingNotAllowedException(allowedSender);
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 83fa67e..331acd2 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
@@ -36,7 +36,7 @@ import javax.mail.Session;
 import javax.mail.internet.MimeMessage;
 
 import org.apache.james.core.MailAddress;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.jmap.draft.exceptions.DraftMessageMailboxUpdateException;
 import org.apache.james.jmap.draft.exceptions.InvalidOutboxMoveException;
 import org.apache.james.jmap.draft.model.Keyword;
@@ -191,7 +191,7 @@ public class SetMessagesUpdateProcessor implements SetMessagesProcessor {
     }
 
     private void assertUserIsSender(MailboxSession session, Optional<MailAddress> sender) throws MailboxSendingNotAllowedException {
-        boolean userIsSender = sender.map(address -> session.getUser().equals(User.fromMailAddress(address)))
+        boolean userIsSender = sender.map(address -> session.getUser().equals(Username.fromMailAddress(address)))
             .orElse(false);
 
         if (!userIsSender) {
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/JmapMDN.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/JmapMDN.java
index 0cd8b76..ecc6429 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/JmapMDN.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/JmapMDN.java
@@ -25,7 +25,7 @@ import java.util.Optional;
 import java.util.stream.Stream;
 
 import org.apache.james.core.Domain;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.jmap.draft.exceptions.InvalidOriginMessageForMDNException;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.model.MessageId;
@@ -142,7 +142,7 @@ public class JmapMDN {
 
     public Message generateMDNMessage(Message originalMessage, MailboxSession mailboxSession) throws ParseException, IOException, InvalidOriginMessageForMDNException {
 
-        User user = mailboxSession.getUser();
+        Username username = mailboxSession.getUser();
 
         return MDN.builder()
             .report(generateReport(originalMessage, mailboxSession))
@@ -150,9 +150,9 @@ public class JmapMDN {
             .build()
         .asMime4JMessageBuilder()
             .setTo(getSenderAddress(originalMessage))
-            .setFrom(user.asString())
+            .setFrom(username.asString())
             .setSubject(subject)
-            .setMessageId(MimeUtil.createUniqueMessageId(user.getDomainPart().map(Domain::name).orElse(null)))
+            .setMessageId(MimeUtil.createUniqueMessageId(username.getDomainPart().map(Domain::name).orElse(null)))
             .build();
     }
 
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/event/PropagateLookupRightListener.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/event/PropagateLookupRightListener.java
index cf9a51e..97e2abb 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/event/PropagateLookupRightListener.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/event/PropagateLookupRightListener.java
@@ -76,7 +76,7 @@ public class PropagateLookupRightListener implements MailboxListener.GroupMailbo
     }
 
     private MailboxSession createMailboxSession(Event event) throws MailboxException {
-        return mailboxManager.createSystemSession(event.getUser().asString());
+        return mailboxManager.createSystemSession(event.getUsername().asString());
     }
 
     private void updateLookupRightOnParent(MailboxSession session, MailboxPath path) throws MailboxException {
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/mailet/filter/ActionApplier.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/mailet/filter/ActionApplier.java
index 8c2e63e..f76252b 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/mailet/filter/ActionApplier.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/mailet/filter/ActionApplier.java
@@ -23,7 +23,7 @@ import java.util.stream.Stream;
 
 import javax.inject.Inject;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.jmap.api.filtering.Rule;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
@@ -63,8 +63,8 @@ public class ActionApplier {
                 this.mail = mail;
             }
 
-            public ActionApplier forUser(User user) {
-                return new ActionApplier(mailboxManager, mailboxIdFactory, mail, user);
+            public ActionApplier forUser(Username username) {
+                return new ActionApplier(mailboxManager, mailboxIdFactory, mail, username);
             }
         }
     }
@@ -72,18 +72,18 @@ public class ActionApplier {
     private final MailboxManager mailboxManager;
     private final MailboxId.Factory mailboxIdFactory;
     private final Mail mail;
-    private final User user;
+    private final Username username;
 
     @VisibleForTesting
     public static Factory factory(MailboxManager mailboxManager, MailboxId.Factory mailboxIdFactory) {
         return new Factory(mailboxManager, mailboxIdFactory);
     }
 
-    private ActionApplier(MailboxManager mailboxManager, MailboxId.Factory mailboxIdFactory, Mail mail, User user) {
+    private ActionApplier(MailboxManager mailboxManager, MailboxId.Factory mailboxIdFactory, Mail mail, Username username) {
         this.mailboxManager = mailboxManager;
         this.mailboxIdFactory = mailboxIdFactory;
         this.mail = mail;
-        this.user = user;
+        this.username = username;
     }
 
     public void apply(Stream<Rule.Action> actions) {
@@ -94,11 +94,11 @@ public class ActionApplier {
 
     private void addStorageDirective(MailboxId mailboxId) {
         try {
-            MailboxSession mailboxSession = mailboxManager.createSystemSession(user.asString());
+            MailboxSession mailboxSession = mailboxManager.createSystemSession(username.asString());
             MessageManager messageManager = mailboxManager.getMailbox(mailboxId, mailboxSession);
 
             String mailboxName = messageManager.getMailboxPath().getName();
-            String attributeNameForUser = DELIVERY_PATH_PREFIX + user.asString();
+            String attributeNameForUser = DELIVERY_PATH_PREFIX + username.asString();
             mail.setAttribute(Attribute.convertToAttribute(attributeNameForUser, mailboxName));
         } catch (MailboxNotFoundException e) {
             LOGGER.info("Mailbox {} does not exist, but it was mentioned in a JMAP filtering rule", mailboxId, e);
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/mailet/filter/JMAPFiltering.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/mailet/filter/JMAPFiltering.java
index 0a71376..fa2924d 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/mailet/filter/JMAPFiltering.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/mailet/filter/JMAPFiltering.java
@@ -26,7 +26,7 @@ import java.util.stream.Stream;
 import javax.inject.Inject;
 
 import org.apache.james.core.MailAddress;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.jmap.api.filtering.FilteringManagement;
 import org.apache.james.jmap.api.filtering.Rule;
 import org.apache.james.user.api.UsersRepository;
@@ -71,24 +71,24 @@ public class JMAPFiltering extends GenericMailet {
     }
 
     private void filteringForRecipient(Mail mail, MailAddress recipient) {
-        Optional<User> maybeUser = retrieveUser(recipient);
+        Optional<Username> maybeUser = retrieveUser(recipient);
         maybeUser
             .ifPresent(user -> findFirstApplicableRule(user, mail));
     }
 
-    private void findFirstApplicableRule(User user, Mail mail) {
-        List<Rule> filteringRules = filteringManagement.listRulesForUser(user);
+    private void findFirstApplicableRule(Username username, Mail mail) {
+        List<Rule> filteringRules = filteringManagement.listRulesForUser(username);
         RuleMatcher ruleMatcher = new RuleMatcher(filteringRules);
         Stream<Rule> matchingRules = ruleMatcher.findApplicableRules(mail);
 
         actionApplierFactory.forMail(mail)
-            .forUser(user)
+            .forUser(username)
             .apply(matchingRules.map(Rule::getAction));
     }
 
-    private Optional<User> retrieveUser(MailAddress recipient) {
+    private Optional<Username> retrieveUser(MailAddress recipient) {
         try {
-            return Optional.ofNullable(User.fromUsername(usersRepository.getUser(recipient)));
+            return Optional.ofNullable(Username.fromUsername(usersRepository.getUser(recipient)));
         } catch (UsersRepositoryException e) {
             logger.error("cannot retrieve user " + recipient.asString(), e);
             return Optional.empty();
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/GetMessagesMethodTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/GetMessagesMethodTest.java
index 6107ce0..39dcc6e 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/GetMessagesMethodTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/GetMessagesMethodTest.java
@@ -35,7 +35,7 @@ import javax.mail.Flags;
 import javax.mail.Flags.Flag;
 
 import org.apache.commons.lang3.NotImplementedException;
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.jmap.draft.model.MethodCallId;
 import org.apache.james.jmap.draft.model.GetMessagesRequest;
 import org.apache.james.jmap.draft.model.GetMessagesResponse;
@@ -82,7 +82,7 @@ import com.jayway.jsonpath.JsonPath;
 
 public class GetMessagesMethodTest {
     private static final String FORWARDED = "forwarded";
-    private static final User ROBERT = User.fromUsername("robert");
+    private static final Username ROBERT = Username.fromUsername("robert");
 
     private MessageIdManager messageIdManager;
     private org.apache.james.mime4j.dom.Message messageContent1;
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/GetVacationResponseMethodTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/GetVacationResponseMethodTest.java
index 7f28778..4e306d2 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/GetVacationResponseMethodTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/GetVacationResponseMethodTest.java
@@ -27,7 +27,7 @@ import java.time.ZonedDateTime;
 import java.util.Optional;
 import java.util.stream.Stream;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.jmap.api.vacation.AccountId;
 import org.apache.james.jmap.api.vacation.Vacation;
 import org.apache.james.jmap.api.vacation.VacationRepository;
@@ -55,7 +55,7 @@ public class GetVacationResponseMethodTest {
     private GetVacationResponseMethod testee;
     private VacationRepository vacationRepository;
     private MailboxSession mailboxSession;
-    private User user;
+    private Username username;
     private ZonedDateTimeProvider zonedDateTimeProvider;
 
     @Before
@@ -63,7 +63,7 @@ public class GetVacationResponseMethodTest {
         zonedDateTimeProvider = mock(ZonedDateTimeProvider.class);
         vacationRepository = mock(VacationRepository.class);
         mailboxSession = mock(MailboxSession.class);
-        user = User.fromUsername(USERNAME);
+        username = Username.fromUsername(USERNAME);
         testee = new GetVacationResponseMethod(vacationRepository, zonedDateTimeProvider, new DefaultMetricFactory());
 
         when(zonedDateTimeProvider.get()).thenReturn(DATE_2014);
@@ -100,7 +100,7 @@ public class GetVacationResponseMethodTest {
             .toDate(Optional.of(DATE_2016))
             .build();
         when(vacationRepository.retrieveVacation(AccountId.fromString(USERNAME))).thenReturn(Mono.just(vacation));
-        when(mailboxSession.getUser()).thenReturn(user);
+        when(mailboxSession.getUser()).thenReturn(username);
         when(zonedDateTimeProvider.get()).thenReturn(DATE_2015);
 
         GetVacationRequest getVacationRequest = GetVacationRequest.builder().build();
@@ -132,7 +132,7 @@ public class GetVacationResponseMethodTest {
             .toDate(Optional.of(DATE_2016))
             .build();
         when(vacationRepository.retrieveVacation(AccountId.fromString(USERNAME))).thenReturn(Mono.just(vacation));
-        when(mailboxSession.getUser()).thenReturn(user);
+        when(mailboxSession.getUser()).thenReturn(username);
         when(zonedDateTimeProvider.get()).thenReturn(DATE_2014);
 
         GetVacationRequest getVacationRequest = GetVacationRequest.builder().build();
@@ -166,7 +166,7 @@ public class GetVacationResponseMethodTest {
             .toDate(Optional.of(DATE_2015))
             .build();
         when(vacationRepository.retrieveVacation(AccountId.fromString(USERNAME))).thenReturn(Mono.just(vacation));
-        when(mailboxSession.getUser()).thenReturn(user);
+        when(mailboxSession.getUser()).thenReturn(username);
         when(zonedDateTimeProvider.get()).thenReturn(DATE_2016);
 
         GetVacationRequest getVacationRequest = GetVacationRequest.builder().build();
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessorTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessorTest.java
index 16ab3fb..cb3e8f0 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessorTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessorTest.java
@@ -32,7 +32,7 @@ import java.util.Optional;
 import java.util.function.Supplier;
 import java.util.stream.Stream;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.jmap.draft.exceptions.MailboxNotOwnedException;
 import org.apache.james.jmap.draft.model.CreationMessage;
 import org.apache.james.jmap.draft.model.CreationMessage.DraftEmailer;
@@ -381,7 +381,7 @@ public class SetMessagesCreationProcessorTest {
         }
 
         @Override
-        public Stream<MessageManager> getMailboxByRole(Role aRole, User user) {
+        public Stream<MessageManager> getMailboxByRole(Role aRole, Username username) {
             if (aRole.equals(Role.OUTBOX)) {
                 return OptionalUtils.toStream(outboxSupplier.get());
             } else if (aRole.equals(Role.DRAFTS)) {
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/SetVacationResponseMethodTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/SetVacationResponseMethodTest.java
index 0364dc3..c359bec 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/SetVacationResponseMethodTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/SetVacationResponseMethodTest.java
@@ -30,7 +30,7 @@ import static org.mockito.Mockito.when;
 import java.util.Optional;
 import java.util.stream.Stream;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.jmap.api.vacation.AccountId;
 import org.apache.james.jmap.api.vacation.NotificationRegistry;
 import org.apache.james.jmap.api.vacation.Vacation;
@@ -53,8 +53,7 @@ import reactor.core.publisher.Mono;
 public class SetVacationResponseMethodTest {
     private static final String WRONG_ID = "WrongId";
     private static final String TEXT_BODY = "Text body";
-    private static final String USERNAME = "username";
-    private static final User USER = User.fromUsername(USERNAME);
+    private static final Username USERNAME = Username.fromUsername("username");
     private static final String SUBJECT = "subject";
 
     private SetVacationResponseMethod testee;
@@ -172,9 +171,9 @@ public class SetVacationResponseMethodTest {
                     .subject(Optional.of(SUBJECT))
                     .build()))
             .build();
-        AccountId accountId = AccountId.fromString(USERNAME);
+        AccountId accountId = AccountId.fromString(USERNAME.asString());
 
-        when(mailboxSession.getUser()).thenReturn(USER);
+        when(mailboxSession.getUser()).thenReturn(USERNAME);
         when(vacationRepository.modifyVacation(eq(accountId), any())).thenReturn(Mono.empty());
         when(notificationRegistry.flush(any()))
             .thenReturn(Mono.empty());
@@ -204,7 +203,7 @@ public class SetVacationResponseMethodTest {
                 .enabled(false)
                 .build()))
             .build();
-        when(mailboxSession.getUser()).thenReturn(USER);
+        when(mailboxSession.getUser()).thenReturn(USERNAME);
 
         Stream<JmapResponse> result = testee.process(setVacationRequest, methodCallId, mailboxSession);
 
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/mailet/filter/JMAPFilteringExtension.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/mailet/filter/JMAPFilteringExtension.java
index 4517a42..eba4f79 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/mailet/filter/JMAPFilteringExtension.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/mailet/filter/JMAPFilteringExtension.java
@@ -30,7 +30,7 @@ import java.util.concurrent.atomic.AtomicInteger;
 
 import javax.mail.MessagingException;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.core.builder.MimeMessageBuilder;
 import org.apache.james.eventsourcing.eventstore.memory.InMemoryEventStore;
 import org.apache.james.jmap.api.filtering.FilteringManagement;
@@ -112,7 +112,7 @@ public class JMAPFilteringExtension implements BeforeEachCallback, ParameterReso
                     .build())
                 .collect(ImmutableList.toImmutableList());
 
-            testSystem.getFilteringManagement().defineRulesForUser(User.fromUsername(RECIPIENT_1_USERNAME), rules);
+            testSystem.getFilteringManagement().defineRulesForUser(Username.fromUsername(RECIPIENT_1_USERNAME), rules);
         }
 
         public FakeMail asMail(MimeMessageBuilder mimeMessageBuilder) throws MessagingException {
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/mailet/filter/JMAPFilteringTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/mailet/filter/JMAPFilteringTest.java
index beae898..e91aaed 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/mailet/filter/JMAPFilteringTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/mailet/filter/JMAPFilteringTest.java
@@ -57,7 +57,7 @@ import java.util.Locale;
 import java.util.Optional;
 import java.util.stream.Stream;
 
-import org.apache.james.core.User;
+import org.apache.james.core.Username;
 import org.apache.james.core.builder.MimeMessageBuilder;
 import org.apache.james.jmap.api.filtering.Rule;
 import org.apache.james.jmap.api.filtering.Rule.Condition.Field;
@@ -692,7 +692,7 @@ class JMAPFilteringTest {
             MailboxId mailbox2Id = testSystem.createMailbox(RECIPIENT_1_USERNAME, "RECIPIENT_1_MAILBOX_2");
             MailboxId mailbox3Id = testSystem.createMailbox(RECIPIENT_1_USERNAME, "RECIPIENT_1_MAILBOX_3");
 
-            testSystem.getFilteringManagement().defineRulesForUser(User.fromUsername(RECIPIENT_1_USERNAME),
+            testSystem.getFilteringManagement().defineRulesForUser(Username.fromUsername(RECIPIENT_1_USERNAME),
                 Rule.builder()
                     .id(Rule.Id.of("1"))
                     .name("rule 1")
@@ -729,7 +729,7 @@ class JMAPFilteringTest {
             MailboxId mailbox2Id = testSystem.createMailbox(RECIPIENT_1_USERNAME, "RECIPIENT_1_MAILBOX_2");
             MailboxId mailbox3Id = testSystem.createMailbox(RECIPIENT_1_USERNAME, "RECIPIENT_1_MAILBOX_3");
 
-            testSystem.getFilteringManagement().defineRulesForUser(User.fromUsername(RECIPIENT_1_USERNAME),
+            testSystem.getFilteringManagement().defineRulesForUser(Username.fromUsername(RECIPIENT_1_USERNAME),
                 Rule.builder()
                     .id(Rule.Id.of("1"))
                     .name("rule 1")
@@ -753,7 +753,7 @@ class JMAPFilteringTest {
         void rulesWithEmptyMailboxIdsShouldBeSkept(JMAPFilteringTestSystem testSystem) throws Exception {
             MailboxId mailbox1Id = testSystem.createMailbox(RECIPIENT_1_USERNAME, "RECIPIENT_1_MAILBOX_1");
 
-            testSystem.getFilteringManagement().defineRulesForUser(User.fromUsername(RECIPIENT_1_USERNAME),
+            testSystem.getFilteringManagement().defineRulesForUser(Username.fromUsername(RECIPIENT_1_USERNAME),
                 Rule.builder()
                     .id(Rule.Id.of("1"))
                     .name("rule 1")
@@ -822,7 +822,7 @@ class JMAPFilteringTest {
         @Test
         void serviceShouldNotThrowWhenUnknownMailboxId(JMAPFilteringTestSystem testSystem) throws Exception {
             String unknownMailboxId = "4242";
-            testSystem.getFilteringManagement().defineRulesForUser(User.fromUsername(RECIPIENT_1_USERNAME),
+            testSystem.getFilteringManagement().defineRulesForUser(Username.fromUsername(RECIPIENT_1_USERNAME),
                 Rule.builder()
                     .id(Rule.Id.of("1"))
                     .name("rule 1")
@@ -840,7 +840,7 @@ class JMAPFilteringTest {
         @Test
         void mailDirectiveShouldNotBeSetWhenUnknownMailboxId(JMAPFilteringTestSystem testSystem) throws Exception {
             String unknownMailboxId = "4242";
-            testSystem.getFilteringManagement().defineRulesForUser(User.fromUsername(RECIPIENT_1_USERNAME),
+            testSystem.getFilteringManagement().defineRulesForUser(Username.fromUsername(RECIPIENT_1_USERNAME),
                 Rule.builder()
                     .id(Rule.Id.of("1"))
                     .name("rule 1")
@@ -860,7 +860,7 @@ class JMAPFilteringTest {
         @Test
         void rulesWithInvalidMailboxIdsShouldBeSkept(JMAPFilteringTestSystem testSystem) throws Exception {
             String unknownMailboxId = "4242";
-            testSystem.getFilteringManagement().defineRulesForUser(User.fromUsername(RECIPIENT_1_USERNAME),
+            testSystem.getFilteringManagement().defineRulesForUser(Username.fromUsername(RECIPIENT_1_USERNAME),
... 2542 lines suppressed ...


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


[james-project] 02/02: JAMES-2949 Rename Username.fromUsername to Username.of

Posted by ro...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit f48dc2d59db1f84df98dcd7ef408a24dc317325f
Author: Raphael Ouazana <ra...@linagora.com>
AuthorDate: Wed Oct 30 17:45:57 2019 +0100

    JAMES-2949 Rename Username.fromUsername to Username.of
---
 .../main/java/org/apache/james/core/Username.java  |  2 +-
 .../java/org/apache/james/core/UsernameTest.java   | 50 +++++++++++-----------
 .../org/apache/james/mailbox/MailboxSession.java   |  2 +-
 .../james/mailbox/model/search/MailboxQuery.java   |  2 +-
 .../apache/james/mailbox/MailboxListenerTest.java  |  2 +-
 .../apache/james/mailbox/MessageMoveEventTest.java |  2 +-
 .../james/mailbox/events/EventBusTestFixture.java  |  2 +-
 .../mailbox/events/EventDeadLettersContract.java   |  2 +-
 .../apache/james/mailbox/events/GroupContract.java |  4 +-
 .../apache/james/mailbox/events/KeyContract.java   |  2 +-
 .../mailbox/backup/MailboxMessageFixture.java      |  4 +-
 .../json/MessageToElasticSearchJsonTest.java       |  4 +-
 .../apache/james/event/json/EventSerializer.scala  |  2 +-
 .../james/event/json/AddedSerializationTest.java   |  2 +-
 .../event/json/ExpungedSerializationTest.java      |  2 +-
 .../event/json/FlagsUpdatedSerializationTest.java  |  2 +-
 .../MailboxACLUpdatedEventSerializationTest.java   |  2 +-
 .../event/json/MailboxAddedSerializationTest.java  |  2 +-
 .../json/MailboxDeletionSerializationTest.java     |  2 +-
 .../json/MailboxRenamedSerializationTest.java      |  2 +-
 .../json/MessageMoveEventSerializationTest.java    |  8 ++--
 .../QuotaUsageUpdatedEventSerializationTest.java   |  2 +-
 .../org/apache/james/event/json/dtos/UserTest.java |  8 ++--
 .../james/vault/metadata/UserPerBucketDAO.java     |  2 +-
 .../vault/metadata/StorageInformationDAOTest.java  |  2 +-
 .../james/vault/metadata/UserPerBucketDAOTest.java |  4 +-
 .../james/vault/DeletedMessageVaultHook.java       |  2 +-
 ...etedMessageWithStorageInformationConverter.java |  2 +-
 .../apache/james/vault/DeletedMessageFixture.java  |  4 +-
 .../james/vault/DeletedMessageVaultHookTest.java   |  4 +-
 .../james/mailbox/quota/cassandra/dto/DTOTest.java |  8 ++--
 .../mailing/aggregates/UserQuotaThresholds.java    |  2 +-
 .../aggregates/UserQuotaThresholdsTest.java        |  6 +--
 .../mailbox/quota/model/QuotaThresholdFixture.java |  2 +-
 .../elasticsearch/ElasticSearchQuotaSearcher.java  |  2 +-
 .../elasticsearch/UserRoutingKeyFactoryTest.java   |  2 +-
 .../json/QuotaRatioToElasticSearchJsonTest.java    |  4 +-
 .../search/scanning/ScanningQuotaSearcher.java     |  2 +-
 .../james/quota/search/QuotaSearchFixture.java     |  2 +-
 .../mailbox/store/StoreAttachmentManager.java      |  2 +-
 .../james/mailbox/store/StoreRightManager.java     |  4 +-
 .../store/quota/DefaultUserQuotaRootResolver.java  |  6 +--
 .../quota/ListeningCurrentQuotaUpdaterTest.java    |  2 +-
 .../mailbox/tools/indexer/UserReindexingTask.java  |  2 +-
 ...UserReindexingTaskAdditionalInformationDTO.java |  2 +-
 .../mailbox/tools/indexer/ReIndexerImplTest.java   |  2 +-
 .../UserReindexingTaskSerializationTest.java       |  6 +--
 .../james/mpt/host/JamesManageSieveHostSystem.java |  2 +-
 .../org/apache/james/mpt/smtp/SmtpTestRule.java    |  2 +-
 .../james/imap/processor/CopyProcessorTest.java    |  2 +-
 .../james/imap/processor/MoveProcessorTest.java    |  2 +-
 .../james/managesieve/core/CoreProcessor.java      | 14 +++---
 .../james/modules/protocols/SieveProbeImpl.java    |  8 ++--
 .../org/apache/james/rrt/lib/MappingSource.java    |  2 +-
 .../org/apache/james/rrt/lib/UserRewritter.java    |  6 +--
 .../java/org/apache/james/user/api/model/User.java |  4 +-
 .../apache/james/rrt/lib/DomainRewriterTest.java   |  8 ++--
 .../apache/james/rrt/lib/MappingSourceTest.java    |  2 +-
 .../apache/james/rrt/lib/ReplaceRewriterTest.java  | 12 +++---
 .../apache/james/rrt/lib/ThrowingRewriterTest.java |  2 +-
 .../cassandra/CassandraActiveScriptDAOTest.java    |  2 +-
 .../sieve/cassandra/CassandraSieveDAOTest.java     |  2 +-
 .../cassandra/CassandraSieveQuotaDAOTest.java      |  2 +-
 .../james/jmap/cassandra/filtering/DTOTest.java    |  6 +--
 .../api/filtering/impl/FilteringAggregateId.java   |  2 +-
 .../api/filtering/FilteringAggregateIdTest.java    |  2 +-
 .../api/filtering/FilteringManagementContract.java |  2 +-
 .../api/filtering/impl/DefineRulesCommandTest.java |  2 +-
 .../lib/SieveRepositoryManagement.java             |  8 ++--
 .../user/lib/AbstractJamesUsersRepository.java     |  2 +-
 .../james/user/lib/AbstractUsersRepository.java    |  2 +-
 .../lib/AbstractSieveRepositoryTest.java           |  2 +-
 .../lib/SieveRepositoryManagementTest.java         |  4 +-
 .../user/lib/AbstractUsersRepositoryTest.java      |  4 +-
 .../james/user/memory/MemoryUsersRepository.java   |  2 +-
 .../james/transport/mailets/RandomStoring.java     |  2 +-
 .../james/transport/mailets/SpamAssassin.java      |  2 +-
 .../transport/mailets/jsieve/ResourceLocator.java  |  2 +-
 .../transport/mailets/ResourceLocatorTest.java     |  2 +-
 .../mailets/delivery/LocalDeliveryTest.java        |  4 +-
 .../mailets/delivery/ToRecipientFolderTest.java    |  4 +-
 .../managesieve/ManageSieveMailetTestCase.java     |  2 +-
 .../methods/SetMessagesCreationProcessor.java      |  2 +-
 .../james/jmap/mailet/filter/JMAPFiltering.java    |  2 +-
 .../jmap/draft/methods/GetMessagesMethodTest.java  |  2 +-
 .../methods/GetVacationResponseMethodTest.java     |  2 +-
 .../methods/SetVacationResponseMethodTest.java     |  2 +-
 .../jmap/mailet/filter/JMAPFilteringExtension.java |  2 +-
 .../jmap/mailet/filter/JMAPFilteringTest.java      | 14 +++---
 ...dminServerTaskSerializationIntegrationTest.java |  4 +-
 .../james/webadmin/routes/MappingRoutes.java       |  2 +-
 .../james/webadmin/routes/RegexMappingRoutes.java  |  2 +-
 .../james/webadmin/routes/SieveQuotaRoutes.java    |  2 +-
 .../james/webadmin/routes/SieveScriptRoutes.java   |  2 +-
 .../apache/james/webadmin/service/UserService.java |  2 +-
 .../james/webadmin/routes/GroupsRoutesTest.java    |  2 +-
 .../james/webadmin/routes/MappingRoutesTest.java   | 48 ++++++++++-----------
 .../webadmin/routes/RegexMappingRoutesTest.java    | 14 +++---
 .../webadmin/routes/SieveScriptRoutesTest.java     |  8 ++--
 .../routes/DeletedMessagesVaultDeleteTask.java     |  2 +-
 ...gesVaultDeleteTaskAdditionalInformationDTO.java |  2 +-
 ...gesVaultExportTaskAdditionalInformationDTO.java |  2 +-
 .../routes/DeletedMessagesVaultExportTaskDTO.java  |  2 +-
 ...esVaultRestoreTaskAdditionalInformationDTO.java |  2 +-
 .../routes/DeletedMessagesVaultRestoreTaskDTO.java |  2 +-
 .../vault/routes/DeletedMessagesVaultRoutes.java   |  2 +-
 ...edMessagesVaultDeleteTaskSerializationTest.java |  2 +-
 ...edMessagesVaultExportTaskSerializationTest.java |  2 +-
 ...dMessagesVaultRestoreTaskSerializationTest.java |  2 +-
 .../james/webadmin/routes/ReindexingRoutes.java    |  2 +-
 .../james/webadmin/routes/UserQuotaRoutes.java     |  2 +-
 .../webadmin/dto/UsersQuotaDetailsDTOTest.java     |  4 +-
 .../routes/EventDeadLettersRoutesTest.java         |  4 +-
 .../james/webadmin/routes/UserQuotaRoutesTest.java | 10 ++---
 .../spamassassin/SpamAssassinInvokerTest.java      |  2 +-
 115 files changed, 236 insertions(+), 236 deletions(-)

diff --git a/core/src/main/java/org/apache/james/core/Username.java b/core/src/main/java/org/apache/james/core/Username.java
index 7049dbf..3c3d5dd 100644
--- a/core/src/main/java/org/apache/james/core/Username.java
+++ b/core/src/main/java/org/apache/james/core/Username.java
@@ -34,7 +34,7 @@ import com.google.common.collect.ImmutableList;
 public class Username {
     public static final int MAXIMUM_MAIL_ADDRESS_LENGTH = 255;
 
-    public static Username fromUsername(String username) {
+    public static Username of(String username) {
         Preconditions.checkArgument(!Strings.isNullOrEmpty(username));
         Preconditions.checkArgument(username.length() <= MAXIMUM_MAIL_ADDRESS_LENGTH);
 
diff --git a/core/src/test/java/org/apache/james/core/UsernameTest.java b/core/src/test/java/org/apache/james/core/UsernameTest.java
index 7ce0136..9a8a3a2 100644
--- a/core/src/test/java/org/apache/james/core/UsernameTest.java
+++ b/core/src/test/java/org/apache/james/core/UsernameTest.java
@@ -117,57 +117,57 @@ public class UsernameTest {
 
     @Test
     public void fromUsernameShouldThrowOnNull() {
-        assertThatThrownBy(() -> Username.fromUsername(null))
+        assertThatThrownBy(() -> Username.of(null))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
     public void fromUsernameShouldThrowOnEmpty() {
-        assertThatThrownBy(() -> Username.fromUsername(""))
+        assertThatThrownBy(() -> Username.of(""))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
     public void fromUsernameShouldAllow255LongUsername() {
         String tail = "@a";
-        assertThat(Username.fromUsername(StringUtils.repeat('j', 255 - tail.length()) + tail).asString())
+        assertThat(Username.of(StringUtils.repeat('j', 255 - tail.length()) + tail).asString())
             .hasSize(255);
     }
 
     @Test
     public void fromUsernameShouldThrowWhenTooLong() {
         String tail = "@a";
-        assertThatThrownBy(() -> Username.fromUsername(StringUtils.repeat('j', 255 - tail.length() + 1) + tail))
+        assertThatThrownBy(() -> Username.of(StringUtils.repeat('j', 255 - tail.length() + 1) + tail))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
     public void fromUsernameShouldThrowWhenMultipleDomainDelimiter() {
-        assertThatThrownBy(() -> Username.fromUsername("aa@aa@aa"))
+        assertThatThrownBy(() -> Username.of("aa@aa@aa"))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
     public void fromUsernameShouldThrowWhenEndsWithDomainDelimiter() {
-        assertThatThrownBy(() -> Username.fromUsername("aa@"))
+        assertThatThrownBy(() -> Username.of("aa@"))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
     public void fromUsernameShouldThrowWhenStartsWithDomainDelimiter() {
-        assertThatThrownBy(() -> Username.fromUsername("@aa"))
+        assertThatThrownBy(() -> Username.of("@aa"))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
     public void fromUsernameShouldParseUsernameWithDomain() {
-        assertThat(Username.fromUsername("aa@bb"))
+        assertThat(Username.of("aa@bb"))
             .isEqualTo(Username.from("aa", Optional.of("bb")));
     }
 
     @Test
     public void fromUsernameShouldParseUsernameWithoutDomain() {
-        assertThat(Username.fromUsername("aa"))
+        assertThat(Username.of("aa"))
             .isEqualTo(Username.from("aa", Optional.empty()));
     }
 
@@ -197,50 +197,50 @@ public class UsernameTest {
 
     @Test
     public void withDefaultDomainShouldAppendDefaultDomainWhenNone() {
-        assertThat(Username.fromUsername("user")
+        assertThat(Username.of("user")
             .withDefaultDomain(Domain.LOCALHOST))
             .isEqualTo(Username.fromLocalPartWithDomain("user", Domain.LOCALHOST));
     }
 
     @Test
     public void withDefaultDomainShouldNotAppendDefaultDomainWhenDomainIsPresent() {
-        assertThat(Username.fromUsername("user@domain")
+        assertThat(Username.of("user@domain")
             .withDefaultDomain(Domain.LOCALHOST))
-            .isEqualTo(Username.fromUsername("user@domain"));
+            .isEqualTo(Username.of("user@domain"));
     }
 
     @Test
     public void withDefaultDomainShouldNotThrowUponEmptyDomain() {
-        assertThat(Username.fromUsername("user")
+        assertThat(Username.of("user")
             .withDefaultDomain(Optional.empty()))
-            .isEqualTo(Username.fromUsername("user"));
+            .isEqualTo(Username.of("user"));
     }
 
     @Test
     public void withDefaultDomainShouldNotThrowUponEmptyDomainWhenUsersHadADomain() {
-        assertThat(Username.fromUsername("user@domain")
+        assertThat(Username.of("user@domain")
             .withDefaultDomain(Optional.empty()))
-            .isEqualTo(Username.fromUsername("user@domain"));
+            .isEqualTo(Username.of("user@domain"));
     }
 
     @Test
     public void withDefaultDomainFromUserShouldPreserveUserWhenAlreadyHasADomain() {
-        assertThat(Username.fromUsername("user@domain")
-            .withDefaultDomainFromUser(Username.fromUsername("bob@tld")))
-            .isEqualTo(Username.fromUsername("user@domain"));
+        assertThat(Username.of("user@domain")
+            .withDefaultDomainFromUser(Username.of("bob@tld")))
+            .isEqualTo(Username.of("user@domain"));
     }
 
     @Test
     public void withDefaultDomainFromUserShouldAppendOtherUserDomainWhenNone() {
-        assertThat(Username.fromUsername("user")
-            .withDefaultDomainFromUser(Username.fromUsername("bob@tld")))
-            .isEqualTo(Username.fromUsername("user@tld"));
+        assertThat(Username.of("user")
+            .withDefaultDomainFromUser(Username.of("bob@tld")))
+            .isEqualTo(Username.of("user@tld"));
     }
 
     @Test
     public void withDefaultDomainFromUserShouldNotThrowUponNoDomain() {
-        assertThat(Username.fromUsername("user")
-            .withDefaultDomainFromUser(Username.fromUsername("bob")))
-            .isEqualTo(Username.fromUsername("user"));
+        assertThat(Username.of("user")
+            .withDefaultDomainFromUser(Username.of("bob")))
+            .isEqualTo(Username.of("user"));
     }
 }
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxSession.java b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxSession.java
index dfd8eb7..e4302d7 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxSession.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxSession.java
@@ -167,7 +167,7 @@ public class MailboxSession {
      * @return not null
      */
     public Username getUser() {
-        return Username.fromUsername(userName);
+        return Username.of(userName);
     }
 
     /**
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxQuery.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxQuery.java
index d5ea66a..4767f17 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxQuery.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxQuery.java
@@ -145,7 +145,7 @@ public final class MailboxQuery {
     public boolean isPrivateMailboxes(MailboxSession session) {
         Username sessionUsername = session.getUser();
         return namespace.map(MailboxConstants.USER_NAMESPACE::equals).orElse(false)
-            && user.map(Username::fromUsername).map(sessionUsername::equals).orElse(false);
+            && user.map(Username::of).map(sessionUsername::equals).orElse(false);
     }
 
     @VisibleForTesting
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxListenerTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxListenerTest.java
index a80f066..29f5b3e 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxListenerTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxListenerTest.java
@@ -52,7 +52,7 @@ import nl.jqno.equalsverifier.EqualsVerifier;
 class MailboxListenerTest {
     private static final MailboxPath PATH = MailboxPath.forUser("bob", "mailbox");
     private static final MailboxPath OTHER_PATH = MailboxPath.forUser("bob", "mailbox.other");
-    private static final Username BOB = Username.fromUsername("bob");
+    private static final Username BOB = Username.of("bob");
     private static final MailboxSession.SessionId SESSION_ID = MailboxSession.SessionId.of(42);
     private static final TestId MAILBOX_ID = TestId.of(18);
     private static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("bob", Optional.empty());
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/MessageMoveEventTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/MessageMoveEventTest.java
index 6a3b92d..02688da 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/MessageMoveEventTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/MessageMoveEventTest.java
@@ -102,7 +102,7 @@ public class MessageMoveEventTest {
             .messageId(messageId)
             .build();
 
-        softly.assertThat(event.getUsername()).isEqualTo(Username.fromUsername(username));
+        softly.assertThat(event.getUsername()).isEqualTo(Username.of(username));
         softly.assertThat(event.getMessageMoves()).isEqualTo(messageMoves);
         softly.assertThat(event.getMessageIds()).containsExactly(messageId);
     }
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventBusTestFixture.java b/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventBusTestFixture.java
index 26d12e0..a106367 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventBusTestFixture.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventBusTestFixture.java
@@ -93,7 +93,7 @@ public interface EventBusTestFixture {
     }
 
     MailboxSession.SessionId SESSION_ID = MailboxSession.SessionId.of(42);
-    Username USERNAME = Username.fromUsername("user");
+    Username USERNAME = Username.of("user");
     MailboxPath MAILBOX_PATH = new MailboxPath(MailboxConstants.USER_NAMESPACE, "user", "mailboxName");
     TestId TEST_ID = TestId.of(18);
     Event.EventId EVENT_ID = Event.EventId.of("6e0dd59d-660e-4d9b-b22f-0354479f47b4");
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersContract.java b/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersContract.java
index 845c5fb..b1508f0 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersContract.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/events/EventDeadLettersContract.java
@@ -103,7 +103,7 @@ interface EventDeadLettersContract {
     int OPERATION_COUNT = 50;
 
     MailboxPath MAILBOX_PATH = new MailboxPath(MailboxConstants.USER_NAMESPACE, "user", "mailboxName");
-    Username USERNAME = Username.fromUsername("user");
+    Username USERNAME = Username.of("user");
     MailboxSession.SessionId SESSION_ID = MailboxSession.SessionId.of(235);
     TestId MAILBOX_ID = TestId.of(563);
     Event.EventId EVENT_ID_1 = Event.EventId.of("6e0dd59d-660e-4d9b-b22f-0354479f47b4");
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/events/GroupContract.java b/mailbox/api/src/test/java/org/apache/james/mailbox/events/GroupContract.java
index 8cc0482..48952cf 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/events/GroupContract.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/events/GroupContract.java
@@ -141,7 +141,7 @@ public interface GroupContract {
 
             eventBus().register(listener, GROUP_A);
 
-            MailboxListener.Added noopEvent = new MailboxListener.Added(MailboxSession.SessionId.of(18), Username.fromUsername("bob"), MailboxPath.forUser("bob", "mailbox"), TestId.of(58), ImmutableSortedMap.of(), Event.EventId.random());
+            MailboxListener.Added noopEvent = new MailboxListener.Added(MailboxSession.SessionId.of(18), Username.of("bob"), MailboxPath.forUser("bob", "mailbox"), TestId.of(58), ImmutableSortedMap.of(), Event.EventId.random());
             eventBus().dispatch(noopEvent, NO_KEYS).block();
 
             verify(listener, after(FIVE_HUNDRED_MS.toMillis()).never())
@@ -351,7 +351,7 @@ public interface GroupContract {
 
             eventBus().register(listener, GROUP_A);
 
-            MailboxListener.Added noopEvent = new MailboxListener.Added(MailboxSession.SessionId.of(18), Username.fromUsername("bob"), MailboxPath.forUser("bob", "mailbox"), TestId.of(58), ImmutableSortedMap.of(), Event.EventId.random());
+            MailboxListener.Added noopEvent = new MailboxListener.Added(MailboxSession.SessionId.of(18), Username.of("bob"), MailboxPath.forUser("bob", "mailbox"), TestId.of(58), ImmutableSortedMap.of(), Event.EventId.random());
             eventBus().reDeliver(GROUP_A, noopEvent).block();
 
             verify(listener, after(FIVE_HUNDRED_MS.toMillis()).never()).event(any());
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/events/KeyContract.java b/mailbox/api/src/test/java/org/apache/james/mailbox/events/KeyContract.java
index 82ec64e..4ce11b5 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/events/KeyContract.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/events/KeyContract.java
@@ -90,7 +90,7 @@ public interface KeyContract extends EventBusContract {
 
             eventBus().register(listener, KEY_1);
 
-            MailboxListener.Added noopEvent = new MailboxListener.Added(MailboxSession.SessionId.of(18), Username.fromUsername("bob"), MailboxPath.forUser("bob", "mailbox"), TestId.of(58), ImmutableSortedMap.of(), Event.EventId.random());
+            MailboxListener.Added noopEvent = new MailboxListener.Added(MailboxSession.SessionId.of(18), Username.of("bob"), MailboxPath.forUser("bob", "mailbox"), TestId.of(58), ImmutableSortedMap.of(), Event.EventId.random());
             eventBus().dispatch(noopEvent, KEY_1).block();
 
             verify(listener, after(FIVE_HUNDRED_MS.toMillis()).never())
diff --git a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/MailboxMessageFixture.java b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/MailboxMessageFixture.java
index 34cad7b..fb70c2d 100644
--- a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/MailboxMessageFixture.java
+++ b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/MailboxMessageFixture.java
@@ -50,8 +50,8 @@ public interface MailboxMessageFixture {
     String USER = "user";
     String OTHER_USER = "otherUser";
 
-    Username USERNAME_1 = Username.fromUsername(USER);
-    Username USERNAME_2 = Username.fromUsername(OTHER_USER);
+    Username USERNAME_1 = Username.of(USER);
+    Username USERNAME_2 = Username.of(OTHER_USER);
 
     String DATE_STRING_1 = "2018-02-15T15:54:02Z";
     String DATE_STRING_2 = "2018-03-15T15:54:02Z";
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJsonTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJsonTest.java
index 0f23394..30cddf8 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJsonTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJsonTest.java
@@ -63,7 +63,7 @@ public class MessageToElasticSearchJsonTest {
     private static final MessageId MESSAGE_ID = TestMessageId.of(184L);
     private static final long MOD_SEQ = 42L;
     private static final MessageUid UID = MessageUid.of(25);
-    private static final Username USERNAME = Username.fromUsername("username");
+    private static final Username USERNAME = Username.of("username");
 
     private TextExtractor textExtractor;
 
@@ -165,7 +165,7 @@ public class MessageToElasticSearchJsonTest {
         mail.setModSeq(MOD_SEQ);
         mail.setUid(UID);
         assertThatJson(messageToElasticSearchJson.convertToJson(mail,
-                ImmutableList.of(Username.fromUsername("user1"), Username.fromUsername("user2"))))
+                ImmutableList.of(Username.of("user1"), Username.of("user2"))))
             .when(IGNORING_ARRAY_ORDER).when(IGNORING_VALUES)
             .isEqualTo(ClassLoaderUtils.getSystemResourceAsString("eml/mail.json"));
     }
diff --git a/mailbox/event/json/src/main/scala/org/apache/james/event/json/EventSerializer.scala b/mailbox/event/json/src/main/scala/org/apache/james/event/json/EventSerializer.scala
index ac343a5..bc9831f 100644
--- a/mailbox/event/json/src/main/scala/org/apache/james/event/json/EventSerializer.scala
+++ b/mailbox/event/json/src/main/scala/org/apache/james/event/json/EventSerializer.scala
@@ -261,7 +261,7 @@ class JsonSerialize(mailboxIdFactory: MailboxId.Factory, messageIdFactory: Messa
     case _ => JsError()
   }
   implicit val userReads: Reads[Username] = {
-    case JsString(userAsString) => JsSuccess(Username.fromUsername(userAsString))
+    case JsString(userAsString) => JsSuccess(Username.of(userAsString))
     case _ => JsError()
   }
   implicit val messageIdReads: Reads[MessageId] = {
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/AddedSerializationTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/AddedSerializationTest.java
index f7efce4..087bf37 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/AddedSerializationTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/AddedSerializationTest.java
@@ -50,7 +50,7 @@ import com.google.common.collect.ImmutableSortedMap;
 
 class AddedSerializationTest {
 
-    private static final Username USERNAME = Username.fromUsername("user");
+    private static final Username USERNAME = Username.of("user");
     private static final MailboxSession.SessionId SESSION_ID = MailboxSession.SessionId.of(42);
     private static final MailboxId MAILBOX_ID = TestId.of(18);
     private static final String MAILBOX_NAME = "mailboxName";
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/ExpungedSerializationTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/ExpungedSerializationTest.java
index eefd5f1..4b190a2 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/ExpungedSerializationTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/ExpungedSerializationTest.java
@@ -50,7 +50,7 @@ import com.google.common.collect.ImmutableMap;
 
 class ExpungedSerializationTest {
 
-    private static final Username USERNAME = Username.fromUsername("user");
+    private static final Username USERNAME = Username.of("user");
     private static final MailboxSession.SessionId SESSION_ID = MailboxSession.SessionId.of(42);
     private static final MailboxId MAILBOX_ID = TestId.of(18);
     private static final String MAILBOX_NAME = "mailboxName";
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/FlagsUpdatedSerializationTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/FlagsUpdatedSerializationTest.java
index de4f5fb..90e5aa9 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/FlagsUpdatedSerializationTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/FlagsUpdatedSerializationTest.java
@@ -49,7 +49,7 @@ import net.javacrumbs.jsonunit.core.Option;
 
 class FlagsUpdatedSerializationTest {
 
-    private static final Username USERNAME = Username.fromUsername("user");
+    private static final Username USERNAME = Username.of("user");
     private static final MailboxSession.SessionId SESSION_ID = MailboxSession.SessionId.of(42);
     private static final MailboxId MAILBOX_ID = TestId.of(18);
     private static final String MAILBOX_NAME = "mailboxName";
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxACLUpdatedEventSerializationTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxACLUpdatedEventSerializationTest.java
index 75c0f58..85768d3 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxACLUpdatedEventSerializationTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxACLUpdatedEventSerializationTest.java
@@ -40,7 +40,7 @@ import org.junit.jupiter.api.Test;
 
 class MailboxACLUpdatedEventSerializationTest {
 
-    private static final Username USERNAME = Username.fromUsername("user");
+    private static final Username USERNAME = Username.of("user");
     private static final MailboxACL.EntryKey ENTRY_KEY = org.apache.james.mailbox.model.MailboxACL.EntryKey.createGroupEntryKey("any", false);
     private static final MailboxACL.Rfc4314Rights RIGHTS = new MailboxACL.Rfc4314Rights(MailboxACL.Right.Administer, MailboxACL.Right.Read);
     private static final MailboxACL MAILBOX_ACL = new MailboxACL(
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxAddedSerializationTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxAddedSerializationTest.java
index 020b944..ae77ee5 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxAddedSerializationTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxAddedSerializationTest.java
@@ -37,7 +37,7 @@ import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 
 class MailboxAddedSerializationTest {
-    private static final Username USERNAME = Username.fromUsername("user");
+    private static final Username USERNAME = Username.of("user");
     private static final MailboxListener.MailboxAdded EVENT_1 = new MailboxListener.MailboxAdded(
         MailboxSession.SessionId.of(42),
         USERNAME,
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxDeletionSerializationTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxDeletionSerializationTest.java
index 2948d1e..00ac67d 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxDeletionSerializationTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxDeletionSerializationTest.java
@@ -45,7 +45,7 @@ import org.junit.jupiter.api.Test;
 class MailboxDeletionSerializationTest {
 
     private static final MailboxSession.SessionId SESSION_ID = MailboxSession.SessionId.of(3652);
-    private static final Username USERNAME = Username.fromUsername("user");
+    private static final Username USERNAME = Username.of("user");
     private static final MailboxPath MAILBOX_PATH = new MailboxPath(USER_NAMESPACE, USERNAME.asString(), "mailboxName");
     private static final MailboxId MAILBOX_ID = TestId.of(789);
     private static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("#private&user@domain", Optional.of(Domain.of("domain")));
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxRenamedSerializationTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxRenamedSerializationTest.java
index 3f3a0f5..4565fa1 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxRenamedSerializationTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxRenamedSerializationTest.java
@@ -39,7 +39,7 @@ import org.junit.jupiter.api.Test;
 
 class MailboxRenamedSerializationTest {
 
-    private static final Username DEFAULT_USERNAME = Username.fromUsername("user");
+    private static final Username DEFAULT_USERNAME = Username.of("user");
     private static final String OLD_MAILBOX_NAME = "oldMailboxName";
     private static final MailboxPath DEFAULT_OLD_MAILBOX_PATH = new MailboxPath(USER_NAMESPACE, DEFAULT_USERNAME.asString(), OLD_MAILBOX_NAME);
     private static final String NEW_MAILBOX_NAME = "newMailboxName";
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/MessageMoveEventSerializationTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/MessageMoveEventSerializationTest.java
index e80a7ae..68a32a2 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/MessageMoveEventSerializationTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/MessageMoveEventSerializationTest.java
@@ -39,7 +39,7 @@ import org.junit.jupiter.api.Test;
 class MessageMoveEventSerializationTest {
     private static final Event EVENT = MessageMoveEvent.builder()
         .eventId(EVENT_ID)
-        .user(Username.fromUsername("bob@domain.tld"))
+        .user(Username.of("bob@domain.tld"))
         .messageId(TestMessageId.of(42))
         .messageMoves(
             MessageMoves.builder()
@@ -75,7 +75,7 @@ class MessageMoveEventSerializationTest {
         class EmptyTargetMailboxIds {
             private final Event event = MessageMoveEvent.builder()
                 .eventId(EVENT_ID)
-                .user(Username.fromUsername("bob"))
+                .user(Username.of("bob"))
                 .messageId(TestMessageId.of(42))
                 .messageMoves(
                     MessageMoves.builder()
@@ -109,7 +109,7 @@ class MessageMoveEventSerializationTest {
         class EmptyPreviousMailboxIds {
             private final Event event = MessageMoveEvent.builder()
                 .eventId(EVENT_ID)
-                .user(Username.fromUsername("bob"))
+                .user(Username.of("bob"))
                 .messageId(TestMessageId.of(42))
                 .messageMoves(
                     MessageMoves.builder()
@@ -143,7 +143,7 @@ class MessageMoveEventSerializationTest {
         class EmptyMessagesIds {
             private final Event event = MessageMoveEvent.builder()
                 .eventId(EVENT_ID)
-                .user(Username.fromUsername("bob"))
+                .user(Username.of("bob"))
                 .messageMoves(
                     MessageMoves.builder()
                         .previousMailboxIds(TestId.of(18), TestId.of(24))
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/QuotaUsageUpdatedEventSerializationTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/QuotaUsageUpdatedEventSerializationTest.java
index c67930b..5753b70 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/QuotaUsageUpdatedEventSerializationTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/QuotaUsageUpdatedEventSerializationTest.java
@@ -50,7 +50,7 @@ class QuotaUsageUpdatedEventSerializationTest {
     private static final Instant INSTANT = Instant.parse("2018-11-13T12:00:55Z");
     private final MailboxListener.QuotaUsageUpdatedEvent eventWithUserContainsUsername = new MailboxListener.QuotaUsageUpdatedEvent(
         EVENT_ID,
-        Username.fromUsername("onlyUsername"),
+        Username.of("onlyUsername"),
         QUOTA_ROOT,
         QUOTA_COUNT,
         QUOTA_SIZE,
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/UserTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/UserTest.java
index cb4066a..55347ad 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/UserTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/UserTest.java
@@ -36,26 +36,26 @@ import scala.math.BigDecimal;
 class UserTest {
     @Test
     void userShouldBeWellSerialized() {
-        assertThat(DTO_JSON_SERIALIZE.userWriters().writes(Username.fromUsername("bob")))
+        assertThat(DTO_JSON_SERIALIZE.userWriters().writes(Username.of("bob")))
             .isEqualTo(new JsString("bob"));
     }
 
     @Test
     void userShouldBeWellDeSerialized() {
         assertThat(DTO_JSON_SERIALIZE.userReads().reads(new JsString("bob")).get())
-            .isEqualTo(Username.fromUsername("bob"));
+            .isEqualTo(Username.of("bob"));
     }
 
     @Test
     void userShouldBeWellSerializedWhenVirtualHosting() {
-        assertThat(DTO_JSON_SERIALIZE.userWriters().writes(Username.fromUsername("bob@domain")))
+        assertThat(DTO_JSON_SERIALIZE.userWriters().writes(Username.of("bob@domain")))
             .isEqualTo(new JsString("bob@domain"));
     }
 
     @Test
     void userShouldBeWellDeSerializedWhenVirtualHosting() {
         assertThat(DTO_JSON_SERIALIZE.userReads().reads(new JsString("bob@domain")).get())
-            .isEqualTo(Username.fromUsername("bob@domain"));
+            .isEqualTo(Username.of("bob@domain"));
     }
 
     @Test
diff --git a/mailbox/plugin/deleted-messages-vault-cassandra/src/main/java/org/apache/james/vault/metadata/UserPerBucketDAO.java b/mailbox/plugin/deleted-messages-vault-cassandra/src/main/java/org/apache/james/vault/metadata/UserPerBucketDAO.java
index 1fb65a5..231e9bb 100644
--- a/mailbox/plugin/deleted-messages-vault-cassandra/src/main/java/org/apache/james/vault/metadata/UserPerBucketDAO.java
+++ b/mailbox/plugin/deleted-messages-vault-cassandra/src/main/java/org/apache/james/vault/metadata/UserPerBucketDAO.java
@@ -80,7 +80,7 @@ public class UserPerBucketDAO {
         return cassandraAsyncExecutor.executeRows(listStatement.bind()
             .setString(BUCKET_NAME, bucketName.asString()))
             .map(row -> row.getString(USER))
-            .map(Username::fromUsername);
+            .map(Username::of);
     }
 
     Flux<BucketName> retrieveBuckets() {
diff --git a/mailbox/plugin/deleted-messages-vault-cassandra/src/test/java/org/apache/james/vault/metadata/StorageInformationDAOTest.java b/mailbox/plugin/deleted-messages-vault-cassandra/src/test/java/org/apache/james/vault/metadata/StorageInformationDAOTest.java
index 86a1bf2..0fdd327 100644
--- a/mailbox/plugin/deleted-messages-vault-cassandra/src/test/java/org/apache/james/vault/metadata/StorageInformationDAOTest.java
+++ b/mailbox/plugin/deleted-messages-vault-cassandra/src/test/java/org/apache/james/vault/metadata/StorageInformationDAOTest.java
@@ -40,7 +40,7 @@ class StorageInformationDAOTest {
     private static final BucketName BUCKET_NAME = BucketName.of("deletedMessages-2019-06-01");
     private static final BucketName BUCKET_NAME_2 = BucketName.of("deletedMessages-2019-07-01");
     private static final HashBlobId.Factory BLOB_ID_FACTORY = new HashBlobId.Factory();
-    private static final Username OWNER = Username.fromUsername("owner");
+    private static final Username OWNER = Username.of("owner");
     private static final TestMessageId MESSAGE_ID = TestMessageId.of(36);
     private static final BlobId BLOB_ID = new HashBlobId.Factory().from("05dcb33b-8382-4744-923a-bc593ad84d23");
     private static final BlobId BLOB_ID_2 = new HashBlobId.Factory().from("05dcb33b-8382-4744-923a-bc593ad84d24");
diff --git a/mailbox/plugin/deleted-messages-vault-cassandra/src/test/java/org/apache/james/vault/metadata/UserPerBucketDAOTest.java b/mailbox/plugin/deleted-messages-vault-cassandra/src/test/java/org/apache/james/vault/metadata/UserPerBucketDAOTest.java
index f04c219..673fdd2 100644
--- a/mailbox/plugin/deleted-messages-vault-cassandra/src/test/java/org/apache/james/vault/metadata/UserPerBucketDAOTest.java
+++ b/mailbox/plugin/deleted-messages-vault-cassandra/src/test/java/org/apache/james/vault/metadata/UserPerBucketDAOTest.java
@@ -35,8 +35,8 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 class UserPerBucketDAOTest {
     private static final BucketName BUCKET_NAME = BucketName.of("deletedMessages-2019-06-01");
     private static final BucketName BUCKET_NAME_2 = BucketName.of("deletedMessages-2019-07-01");
-    private static final Username OWNER = Username.fromUsername("owner");
-    private static final Username OWNER_2 = Username.fromUsername("owner2");
+    private static final Username OWNER = Username.of("owner");
+    private static final Username OWNER_2 = Username.of("owner2");
 
     @RegisterExtension
     static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(MODULE);
diff --git a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageVaultHook.java b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageVaultHook.java
index 37eec5d..43b5910 100644
--- a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageVaultHook.java
+++ b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageVaultHook.java
@@ -164,7 +164,7 @@ public class DeletedMessageVaultHook implements PreDeletionHook {
     }
 
     private Username retrieveMailboxUser(MailboxId mailboxId) throws MailboxException {
-        return Username.fromUsername(mapperFactory.getMailboxMapper(session)
+        return Username.of(mapperFactory.getMailboxMapper(session)
             .findMailboxById(mailboxId)
             .getUser());
     }
diff --git a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/dto/DeletedMessageWithStorageInformationConverter.java b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/dto/DeletedMessageWithStorageInformationConverter.java
index d21e7e5..5541a15 100644
--- a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/dto/DeletedMessageWithStorageInformationConverter.java
+++ b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/dto/DeletedMessageWithStorageInformationConverter.java
@@ -64,7 +64,7 @@ public class DeletedMessageWithStorageInformationConverter {
         return DeletedMessage.builder()
             .messageId(messageIdFactory.fromString(deletedMessageDTO.getMessageId()))
             .originMailboxes(deserializeOriginMailboxes(deletedMessageDTO.getOriginMailboxes()))
-            .user(Username.fromUsername(deletedMessageDTO.getOwner()))
+            .user(Username.of(deletedMessageDTO.getOwner()))
             .deliveryDate(ZonedDateTime.parse(deletedMessageDTO.getDeliveryDate()))
             .deletionDate(ZonedDateTime.parse(deletedMessageDTO.getDeletionDate()))
             .sender(MaybeSender.getMailSender(deletedMessageDTO.getSender()))
diff --git a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageFixture.java b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageFixture.java
index a42d266..a0a7f9c 100644
--- a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageFixture.java
+++ b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageFixture.java
@@ -41,8 +41,8 @@ public interface DeletedMessageFixture {
     InMemoryId MAILBOX_ID_1 = InMemoryId.of(43);
     InMemoryId MAILBOX_ID_2 = InMemoryId.of(44);
     InMemoryId MAILBOX_ID_3 = InMemoryId.of(45);
-    Username USERNAME = Username.fromUsername("bob@apache.org");
-    Username USERNAME_2 = Username.fromUsername("dimitri@apache.org");
+    Username USERNAME = Username.of("bob@apache.org");
+    Username USERNAME_2 = Username.of("dimitri@apache.org");
     ZonedDateTime DELIVERY_DATE = ZonedDateTime.parse("2014-10-30T14:12:00Z");
     ZonedDateTime DELETION_DATE = ZonedDateTime.parse("2015-10-30T14:12:00Z");
     ZonedDateTime NOW = ZonedDateTime.parse("2015-10-30T16:12:00Z");
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 9504b5a..bbabc89 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
@@ -67,8 +67,8 @@ class DeletedMessageVaultHookTest {
     private static final String ALICE_ADDRESS = "alice@james.com";
     private static final String BOB_ADDRESS = "bob@james.com";
     private static final String TEST_ADDRESS = "test@james.com";
-    private static final Username ALICE = Username.fromUsername(ALICE_ADDRESS);
-    private static final Username BOB = Username.fromUsername(BOB_ADDRESS);
+    private static final Username ALICE = Username.of(ALICE_ADDRESS);
+    private static final Username BOB = Username.of(BOB_ADDRESS);
     private static final String MESSAGE_BODY = "testmail";
 
     private static final MailboxPath MAILBOX_ALICE_ONE = MailboxPath.forUser(ALICE_ADDRESS, "ALICE_ONE");
diff --git a/mailbox/plugin/quota-mailing-cassandra/src/test/java/org/apache/james/mailbox/quota/cassandra/dto/DTOTest.java b/mailbox/plugin/quota-mailing-cassandra/src/test/java/org/apache/james/mailbox/quota/cassandra/dto/DTOTest.java
index 81ec037..a239520 100644
--- a/mailbox/plugin/quota-mailing-cassandra/src/test/java/org/apache/james/mailbox/quota/cassandra/dto/DTOTest.java
+++ b/mailbox/plugin/quota-mailing-cassandra/src/test/java/org/apache/james/mailbox/quota/cassandra/dto/DTOTest.java
@@ -56,14 +56,14 @@ class DTOTest {
         HistoryEvolution.noChanges(),
         SIZE_QUOTA,
         COUNT_QUOTA,
-        UserQuotaThresholds.Id.from(Username.fromUsername("foo@bar.com"), DEFAULT_LISTENER_NAME));
+        UserQuotaThresholds.Id.from(Username.of("foo@bar.com"), DEFAULT_LISTENER_NAME));
     static final QuotaThresholdChangedEvent EVENT_2 = new QuotaThresholdChangedEvent(
         EventId.first(),
         HistoryEvolution.lowerThresholdReached(new QuotaThresholdChange(_75, INSTANT)),
         HistoryEvolution.noChanges(),
         SIZE_QUOTA,
         Quota.<QuotaCount>builder().used(QuotaCount.count(12)).computedLimit(QuotaCount.unlimited()).build(),
-        UserQuotaThresholds.Id.from(Username.fromUsername("foo@bar.com"), DEFAULT_LISTENER_NAME));
+        UserQuotaThresholds.Id.from(Username.of("foo@bar.com"), DEFAULT_LISTENER_NAME));
     static final QuotaThresholdChangedEvent EVENT_3 = new QuotaThresholdChangedEvent(
         EventId.first(),
         HistoryEvolution.lowerThresholdReached(new QuotaThresholdChange(_75, INSTANT)),
@@ -71,7 +71,7 @@ class DTOTest {
             HistoryEvolution.HighestThresholdRecentness.NotAlreadyReachedDuringGracePeriod),
         SIZE_QUOTA,
         Quota.<QuotaCount>builder().used(QuotaCount.count(12)).computedLimit(QuotaCount.unlimited()).build(),
-        UserQuotaThresholds.Id.from(Username.fromUsername("foo@bar.com"), DEFAULT_LISTENER_NAME));
+        UserQuotaThresholds.Id.from(Username.of("foo@bar.com"), DEFAULT_LISTENER_NAME));
     static final QuotaThresholdChangedEvent EVENT_4 = new QuotaThresholdChangedEvent(
         EventId.first(),
         HistoryEvolution.lowerThresholdReached(new QuotaThresholdChange(_75, INSTANT)),
@@ -79,7 +79,7 @@ class DTOTest {
             HistoryEvolution.HighestThresholdRecentness.AlreadyReachedDuringGracePeriod),
         SIZE_QUOTA,
         Quota.<QuotaCount>builder().used(QuotaCount.count(12)).computedLimit(QuotaCount.unlimited()).build(),
-        UserQuotaThresholds.Id.from(Username.fromUsername("foo@bar.com"), DEFAULT_LISTENER_NAME));
+        UserQuotaThresholds.Id.from(Username.of("foo@bar.com"), DEFAULT_LISTENER_NAME));
 
     static final String EVENT_JSON = ClassLoaderUtils.getSystemResourceAsString("json/event.json");
     static final String EVENT_JSON_2 = ClassLoaderUtils.getSystemResourceAsString("json/event2.json");
diff --git a/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/aggregates/UserQuotaThresholds.java b/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/aggregates/UserQuotaThresholds.java
index 7e3a4e8..7203a7a 100644
--- a/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/aggregates/UserQuotaThresholds.java
+++ b/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/aggregates/UserQuotaThresholds.java
@@ -62,7 +62,7 @@ public class UserQuotaThresholds {
             if (keyParts.size() != 3 || !keyParts.get(PREFIX_INDEX).equals(PREFIX)) {
                 throw new IllegalArgumentException();
             }
-            return new Id(Username.fromUsername(keyParts.get(USER_INDEX)), keyParts.get(NAME_INDEX));
+            return new Id(Username.of(keyParts.get(USER_INDEX)), keyParts.get(NAME_INDEX));
         }
 
         public static Id from(Username username, String name) {
diff --git a/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/aggregates/UserQuotaThresholdsTest.java b/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/aggregates/UserQuotaThresholdsTest.java
index 80c672c..0b7a316 100644
--- a/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/aggregates/UserQuotaThresholdsTest.java
+++ b/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/aggregates/UserQuotaThresholdsTest.java
@@ -29,7 +29,7 @@ import nl.jqno.equalsverifier.EqualsVerifier;
 
 public class UserQuotaThresholdsTest {
 
-    public static final Username BOB = Username.fromUsername("bob@domain");
+    public static final Username BOB = Username.of("bob@domain");
 
     @Test
     public void aggregateShouldMatchBeanContract() {
@@ -46,13 +46,13 @@ public class UserQuotaThresholdsTest {
 
     @Test
     public void fromShouldThrowWhenUserWithSlash() {
-        assertThatThrownBy(() -> UserQuotaThresholds.Id.from(Username.fromUsername("foo/bar@domain"), "listenerName"))
+        assertThatThrownBy(() -> UserQuotaThresholds.Id.from(Username.of("foo/bar@domain"), "listenerName"))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
     public void fromShouldThrowWhenDomainWithSlash() {
-        assertThatThrownBy(() -> UserQuotaThresholds.Id.from(Username.fromUsername("foo.bar@dom/ain"), "listenerName"))
+        assertThatThrownBy(() -> UserQuotaThresholds.Id.from(Username.of("foo.bar@dom/ain"), "listenerName"))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
diff --git a/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/model/QuotaThresholdFixture.java b/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/model/QuotaThresholdFixture.java
index 885c8f7..cecc4c2 100644
--- a/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/model/QuotaThresholdFixture.java
+++ b/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/model/QuotaThresholdFixture.java
@@ -45,7 +45,7 @@ public interface QuotaThresholdFixture {
             .gracePeriod(GRACE_PERIOD)
             .build();
         String BOB = "bob@domain";
-        Username BOB_USERNAME = Username.fromUsername(BOB);
+        Username BOB_USERNAME = Username.of(BOB);
         Instant NOW = Instant.now();
         QuotaRoot QUOTAROOT = QuotaRoot.quotaRoot("any", Optional.empty());
         Instant ONE_HOUR_AGO = NOW.minus(Duration.ofHours(1));
diff --git a/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearcher.java b/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearcher.java
index 8994210..0a1e082 100644
--- a/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearcher.java
+++ b/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearcher.java
@@ -63,7 +63,7 @@ public class ElasticSearchQuotaSearcher implements QuotaSearcher {
             try (Stream<SearchHit> searchHits = searchHits(query)) {
                 return searchHits
                     .map(SearchHit::getId)
-                    .map(Username::fromUsername)
+                    .map(Username::of)
                     .collect(Guavate.toImmutableList());
             }
         } catch (IOException e) {
diff --git a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/UserRoutingKeyFactoryTest.java b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/UserRoutingKeyFactoryTest.java
index d1b3cd4..ede4cb5 100644
--- a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/UserRoutingKeyFactoryTest.java
+++ b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/UserRoutingKeyFactoryTest.java
@@ -29,7 +29,7 @@ import org.junit.jupiter.api.Test;
 class UserRoutingKeyFactoryTest {
     @Test
     void fromShouldRelyOnUsername() {
-        assertThat(new UserRoutingKeyFactory().from(Username.fromUsername("bob")))
+        assertThat(new UserRoutingKeyFactory().from(Username.of("bob")))
             .isEqualTo(RoutingKey.fromString("bob"));
     }
 }
\ No newline at end of file
diff --git a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioToElasticSearchJsonTest.java b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioToElasticSearchJsonTest.java
index 7bc1425..7b13256 100644
--- a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioToElasticSearchJsonTest.java
+++ b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioToElasticSearchJsonTest.java
@@ -43,7 +43,7 @@ class QuotaRatioToElasticSearchJsonTest {
         String user = "user@domain.org";
         QuotaUsageUpdatedEvent event = EventFactory.quotaUpdated()
             .eventId(EVENT_ID)
-            .user(Username.fromUsername(user))
+            .user(Username.of(user))
             .quotaRoot(QuotaRoot.quotaRoot(user, Optional.of(Domain.of("domain.org"))))
             .quotaCount(QuotaFixture.Counts._52_PERCENT)
             .quotaSize(QuotaFixture.Sizes._55_PERCENT)
@@ -62,7 +62,7 @@ class QuotaRatioToElasticSearchJsonTest {
         String user = "user";
         QuotaUsageUpdatedEvent event = EventFactory.quotaUpdated()
             .eventId(EVENT_ID)
-            .user(Username.fromUsername(user))
+            .user(Username.of(user))
             .quotaRoot(QuotaRoot.quotaRoot(user, Optional.empty()))
             .quotaCount(QuotaFixture.Counts._52_PERCENT)
             .quotaSize(QuotaFixture.Sizes._55_PERCENT)
diff --git a/mailbox/plugin/quota-search-scanning/src/main/java/org/apache/james/quota/search/scanning/ScanningQuotaSearcher.java b/mailbox/plugin/quota-search-scanning/src/main/java/org/apache/james/quota/search/scanning/ScanningQuotaSearcher.java
index 53f87ad..6d49985 100644
--- a/mailbox/plugin/quota-search-scanning/src/main/java/org/apache/james/quota/search/scanning/ScanningQuotaSearcher.java
+++ b/mailbox/plugin/quota-search-scanning/src/main/java/org/apache/james/quota/search/scanning/ScanningQuotaSearcher.java
@@ -49,7 +49,7 @@ public class ScanningQuotaSearcher implements QuotaSearcher {
     @Override
     public List<Username> search(QuotaQuery query) {
         Stream<Username> results = Iterators.toStream(listUsers())
-            .map(Username::fromUsername)
+            .map(Username::of)
             .filter(clauseConverter.andToPredicate(query.getClause()))
             .sorted(Comparator.comparing(Username::asString))
             .skip(query.getOffset().getValue());
diff --git a/mailbox/plugin/quota-search/src/test/java/org/apache/james/quota/search/QuotaSearchFixture.java b/mailbox/plugin/quota-search/src/test/java/org/apache/james/quota/search/QuotaSearchFixture.java
index 54b97fd..43b9bf5 100644
--- a/mailbox/plugin/quota-search/src/test/java/org/apache/james/quota/search/QuotaSearchFixture.java
+++ b/mailbox/plugin/quota-search/src/test/java/org/apache/james/quota/search/QuotaSearchFixture.java
@@ -29,7 +29,7 @@ public interface QuotaSearchFixture {
 
     interface TestConstants {
         String BOB = "bob@domain";
-        Username BOB_USERNAME = Username.fromUsername(BOB);
+        Username BOB_USERNAME = Username.of(BOB);
         Instant NOW = Instant.now();
         QuotaRoot QUOTAROOT = QuotaRoot.quotaRoot("any", Optional.empty());
     }
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreAttachmentManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreAttachmentManager.java
index ea0902b..db73f37 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreAttachmentManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreAttachmentManager.java
@@ -106,7 +106,7 @@ public class StoreAttachmentManager implements AttachmentManager {
         Collection<org.apache.james.mailbox.store.mail.model.Username> explicitOwners = attachmentMapperFactory.getAttachmentMapper(mailboxSession)
             .getOwners(attachmentId);
         return explicitOwners.stream()
-            .anyMatch(username -> mailboxSession.getUser().equals(Username.fromUsername(username.getValue())));
+            .anyMatch(username -> mailboxSession.getUser().equals(Username.of(username.getValue())));
     }
 
     private Collection<MessageId> getRelatedMessageIds(AttachmentId attachmentId, MailboxSession mailboxSession) throws MailboxException {
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreRightManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreRightManager.java
index d5340b8..4ad2342 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreRightManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreRightManager.java
@@ -217,8 +217,8 @@ public class StoreRightManager implements RightManager {
 
     @VisibleForTesting
     boolean areDomainsDifferent(String user, String otherUser) {
-        Optional<Domain> domain = Username.fromUsername(user).getDomainPart();
-        Optional<Domain> otherDomain = Username.fromUsername(otherUser).getDomainPart();
+        Optional<Domain> domain = Username.of(user).getDomainPart();
+        Optional<Domain> otherDomain = Username.of(otherUser).getDomainPart();
         return !domain.equals(otherDomain);
     }
 
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolver.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolver.java
index 747a5c5..0b420c4 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolver.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolver.java
@@ -47,7 +47,7 @@ public class DefaultUserQuotaRootResolver implements UserQuotaRootResolver {
         @Override
         public QuotaRoot fromString(String serializedQuotaRoot) throws MailboxException {
             List<String> parts = toParts(serializedQuotaRoot);
-            Username username = Username.fromUsername(parts.get(1));
+            Username username = Username.of(parts.get(1));
 
             return QuotaRoot.quotaRoot(serializedQuotaRoot, username.getDomainPart());
         }
@@ -85,7 +85,7 @@ public class DefaultUserQuotaRootResolver implements UserQuotaRootResolver {
         return Optional.ofNullable(mailboxPath.getUser())
                 .map(user -> {
                     Preconditions.checkArgument(!mailboxPath.getUser().contains(SEPARATOR), "Username should not contain " + SEPARATOR);
-                    return Username.fromUsername(mailboxPath.getUser());
+                    return Username.of(mailboxPath.getUser());
                 })
                 .map(user -> QuotaRoot.quotaRoot(mailboxPath.getNamespace() + SEPARATOR + user.asString(), user.getDomainPart()))
                 .orElseGet(() -> QuotaRoot.quotaRoot(mailboxPath.getNamespace(), Optional.empty()));
@@ -94,7 +94,7 @@ public class DefaultUserQuotaRootResolver implements UserQuotaRootResolver {
     @Override
     public QuotaRoot getQuotaRoot(MailboxId mailboxId) throws MailboxException {
         MailboxSession session = sessionProvider.createSystemSession("DefaultUserQuotaRootResolver");
-        Username username = Username.fromUsername(
+        Username username = Username.of(
             factory.getMailboxMapper(session)
                 .findMailboxById(mailboxId)
                 .generateAssociatedPath()
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdaterTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdaterTest.java
index b52655f..917165d 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdaterTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdaterTest.java
@@ -61,7 +61,7 @@ public class ListeningCurrentQuotaUpdaterTest {
     private static final int SIZE = 45;
     private static final MailboxId MAILBOX_ID = TestId.of(42);
     private static final String BENWA = "benwa";
-    private static final Username USERNAME_BENWA = Username.fromUsername(BENWA);
+    private static final Username USERNAME_BENWA = Username.of(BENWA);
     private static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot(BENWA, Optional.empty());
 
     private StoreCurrentQuotaManager mockedCurrentQuotaManager;
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTask.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTask.java
index 0a338d9..9a7a863 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTask.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTask.java
@@ -71,7 +71,7 @@ public class UserReindexingTask implements Task {
         }
 
         public UserReindexingTask create(UserReindexingTaskDTO dto) {
-            Username username = Username.fromUsername(dto.getUsername());
+            Username username = Username.of(dto.getUsername());
             return new UserReindexingTask(reIndexerPerformer, username);
         }
     }
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTaskAdditionalInformationDTO.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTaskAdditionalInformationDTO.java
index eabb356..15e78ef 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTaskAdditionalInformationDTO.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTaskAdditionalInformationDTO.java
@@ -35,7 +35,7 @@ public class UserReindexingTaskAdditionalInformationDTO implements AdditionalInf
     public static AdditionalInformationDTOModule<UserReindexingTask.AdditionalInformation, UserReindexingTaskAdditionalInformationDTO> serializationModule(MailboxId.Factory factory) {
         return DTOModule.forDomainObject(UserReindexingTask.AdditionalInformation.class)
             .convertToDTO(UserReindexingTaskAdditionalInformationDTO.class)
-            .toDomainObjectConverter(dto -> new UserReindexingTask.AdditionalInformation(Username.fromUsername(dto.getUser()),
+            .toDomainObjectConverter(dto -> new UserReindexingTask.AdditionalInformation(Username.of(dto.getUser()),
                 dto.getSuccessfullyReprocessedMailCount(),
                 dto.getFailedReprocessedMailCount(),
                 ReprocessingContextInformationDTO.deserializeFailures(factory, dto.getFailures()),
diff --git a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/ReIndexerImplTest.java b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/ReIndexerImplTest.java
index 7f74c9e..07fd1a4 100644
--- a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/ReIndexerImplTest.java
+++ b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/ReIndexerImplTest.java
@@ -126,7 +126,7 @@ public class ReIndexerImplTest {
                 MessageManager.AppendCommand.builder().build("header: value\r\n\r\nbody"),
                 systemSession);
 
-        reIndexer.reIndex(Username.fromUsername(USERNAME)).run();
+        reIndexer.reIndex(Username.of(USERNAME)).run();
         ArgumentCaptor<MailboxMessage> messageCaptor = ArgumentCaptor.forClass(MailboxMessage.class);
         ArgumentCaptor<MailboxId> mailboxCaptor1 = ArgumentCaptor.forClass(MailboxId.class);
         ArgumentCaptor<Mailbox> mailboxCaptor2 = ArgumentCaptor.forClass(Mailbox.class);
diff --git a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/UserReindexingTaskSerializationTest.java b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/UserReindexingTaskSerializationTest.java
index b8534e8..701c131 100644
--- a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/UserReindexingTaskSerializationTest.java
+++ b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/UserReindexingTaskSerializationTest.java
@@ -46,7 +46,7 @@ class UserReindexingTaskSerializationTest {
     private JsonTaskSerializer taskSerializer;
     private JsonTaskAdditionalInformationSerializer jsonAdditionalInformationSerializer;
 
-    private final Username username = Username.fromUsername("foo@apache.org");
+    private final Username username = Username.of("foo@apache.org");
     private final int successfullyReprocessedMailCount = 42;
     private final int failedReprocessedMailCount = 2;
     private ReIndexingExecutionFailures reIndexingExecutionFailures;
@@ -79,7 +79,7 @@ class UserReindexingTaskSerializationTest {
 
     @Test
     void userReindexingShouldBeSerializable() throws JsonProcessingException {
-        Username username = Username.fromUsername("foo@apache.org");
+        Username username = Username.of("foo@apache.org");
         UserReindexingTask task = new UserReindexingTask(reIndexerPerformer, username);
 
         assertThatJson(taskSerializer.serialize(task))
@@ -88,7 +88,7 @@ class UserReindexingTaskSerializationTest {
 
     @Test
     void userReindexingShouldBeDeserializable() throws IOException {
-        Username username = Username.fromUsername("foo@apache.org");
+        Username username = Username.of("foo@apache.org");
         UserReindexingTask task = new UserReindexingTask(reIndexerPerformer, username);
 
         assertThat(taskSerializer.deserialize(serializedUserReindexingTask))
diff --git a/mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/host/JamesManageSieveHostSystem.java b/mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/host/JamesManageSieveHostSystem.java
index 0dbfe6a..857bf99 100644
--- a/mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/host/JamesManageSieveHostSystem.java
+++ b/mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/host/JamesManageSieveHostSystem.java
@@ -60,7 +60,7 @@ public abstract class JamesManageSieveHostSystem implements ManageSieveHostSyste
 
     @Override
     public void setMaxQuota(String user, long value) throws Exception {
-        sieveRepository.setQuota(Username.fromUsername(user), QuotaSize.size(value));
+        sieveRepository.setQuota(Username.of(user), QuotaSize.size(value));
     }
 
     @Override
diff --git a/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/SmtpTestRule.java b/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/SmtpTestRule.java
index bb72d30..245ee74 100644
--- a/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/SmtpTestRule.java
+++ b/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/SmtpTestRule.java
@@ -83,7 +83,7 @@ public class SmtpTestRule implements TestRule, SmtpHostSystem {
 
     @Override
     public boolean addUser(String userAtDomain, String password) throws Exception {
-        Optional<Domain> domain = Username.fromUsername(userAtDomain).getDomainPart();
+        Optional<Domain> domain = Username.of(userAtDomain).getDomainPart();
         Preconditions.checkArgument(domain.isPresent(), "The 'user' should contain the 'domain'");
         createDomainIfNeeded(domain.get().asString());
         jamesServer.getProbe(DataProbeImpl.class).addUser(userAtDomain, password);
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/CopyProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/CopyProcessorTest.java
index b3f582b..1fa4868 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/CopyProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/CopyProcessorTest.java
@@ -58,7 +58,7 @@ import com.google.common.collect.Lists;
 
 public class CopyProcessorTest {
     public static final String TAG = "TAG";
-    private static final Username USERNAME = Username.fromUsername("username");
+    private static final Username USERNAME = Username.of("username");
 
     private CopyProcessor testee;
     private ImapProcessor mockNextProcessor;
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/MoveProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/MoveProcessorTest.java
index 98f2325..b8bd59e 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/MoveProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/MoveProcessorTest.java
@@ -61,7 +61,7 @@ import com.google.common.collect.Lists;
 
 public class MoveProcessorTest {
     public static final String TAG = "TAG";
-    private static final Username USERNAME = Username.fromUsername("username");
+    private static final Username USERNAME = Username.of("username");
 
     private MoveProcessor testee;
     private ImapProcessor mockNextProcessor;
diff --git a/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/CoreProcessor.java b/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/CoreProcessor.java
index 967800f..6a75d32 100644
--- a/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/CoreProcessor.java
+++ b/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/CoreProcessor.java
@@ -131,7 +131,7 @@ public class CoreProcessor implements CoreCommands {
     public String deleteScript(Session session, String name) {
         return handleCommandExecution(() -> {
             authenticationCheck(session);
-            sieveRepository.deleteScript(Username.fromUsername(session.getUser()), new ScriptName(name));
+            sieveRepository.deleteScript(Username.of(session.getUser()), new ScriptName(name));
             return "OK";
         }, session);
     }
@@ -140,7 +140,7 @@ public class CoreProcessor implements CoreCommands {
     public String getScript(Session session, String name) {
         return handleCommandExecution(() -> {
             authenticationCheck(session);
-            String scriptContent = IOUtils.toString(sieveRepository.getScript(Username.fromUsername(session.getUser()), new ScriptName(name)), StandardCharsets.UTF_8);
+            String scriptContent = IOUtils.toString(sieveRepository.getScript(Username.of(session.getUser()), new ScriptName(name)), StandardCharsets.UTF_8);
             return "{" + scriptContent.length() + "}" + "\r\n" + scriptContent + "\r\nOK";
         }, session);
     }
@@ -149,7 +149,7 @@ public class CoreProcessor implements CoreCommands {
     public String haveSpace(Session session, String name, long size) {
         return handleCommandExecution(() -> {
             authenticationCheck(session);
-            sieveRepository.haveSpace(Username.fromUsername(session.getUser()), new ScriptName(name), size);
+            sieveRepository.haveSpace(Username.of(session.getUser()), new ScriptName(name), size);
             return "OK";
         }, session);
     }
@@ -162,7 +162,7 @@ public class CoreProcessor implements CoreCommands {
     private String listScriptsInternals(Session session) throws AuthenticationRequiredException, StorageException {
         authenticationCheck(session);
         String list = Joiner.on("\r\n").join(
-            Iterables.transform(sieveRepository.listScripts(Username.fromUsername(session.getUser())),
+            Iterables.transform(sieveRepository.listScripts(Username.of(session.getUser())),
                 scriptSummary -> '"' + scriptSummary.getName().getValue() + '"' + (scriptSummary.isActive() ? " ACTIVE" : "")));
         if (Strings.isNullOrEmpty(list)) {
             return "OK";
@@ -175,7 +175,7 @@ public class CoreProcessor implements CoreCommands {
     public String putScript(Session session, String name, String content) {
         return handleCommandExecution(() -> {
             authenticationCheck(session);
-            sieveRepository.putScript(Username.fromUsername(session.getUser()), new ScriptName(name), new ScriptContent(content));
+            sieveRepository.putScript(Username.of(session.getUser()), new ScriptName(name), new ScriptContent(content));
             return manageWarnings(parser.parse(content));
         }, session);
     }
@@ -184,7 +184,7 @@ public class CoreProcessor implements CoreCommands {
     public String renameScript(Session session, String oldName, String newName) {
         return handleCommandExecution(() -> {
             authenticationCheck(session);
-            sieveRepository.renameScript(Username.fromUsername(session.getUser()), new ScriptName(oldName), new ScriptName(newName));
+            sieveRepository.renameScript(Username.of(session.getUser()), new ScriptName(oldName), new ScriptName(newName));
             return "OK";
         }, session);
     }
@@ -193,7 +193,7 @@ public class CoreProcessor implements CoreCommands {
     public String setActive(Session session, String name) {
         return handleCommandExecution(() -> {
             authenticationCheck(session);
-            sieveRepository.setActive(Username.fromUsername(session.getUser()), new ScriptName(name));
+            sieveRepository.setActive(Username.of(session.getUser()), new ScriptName(name));
             return "OK";
         }, session);
     }
diff --git a/server/container/guice/protocols/managedsieve/src/main/java/org/apache/james/modules/protocols/SieveProbeImpl.java b/server/container/guice/protocols/managedsieve/src/main/java/org/apache/james/modules/protocols/SieveProbeImpl.java
index 844f2c4..a1929ef 100644
--- a/server/container/guice/protocols/managedsieve/src/main/java/org/apache/james/modules/protocols/SieveProbeImpl.java
+++ b/server/container/guice/protocols/managedsieve/src/main/java/org/apache/james/modules/protocols/SieveProbeImpl.java
@@ -59,22 +59,22 @@ public class SieveProbeImpl implements GuiceProbe, SieveProbe {
 
     @Override
     public long getSieveQuota(String user) throws Exception {
-        return sieveRepository.getQuota(Username.fromUsername(user)).asLong();
+        return sieveRepository.getQuota(Username.of(user)).asLong();
     }
 
     @Override
     public void setSieveQuota(String user, long quota) throws Exception {
-        sieveRepository.setQuota(Username.fromUsername(user), QuotaSize.size(quota));
+        sieveRepository.setQuota(Username.of(user), QuotaSize.size(quota));
     }
 
     @Override
     public void removeSieveQuota(String user) throws Exception {
-        sieveRepository.removeQuota(Username.fromUsername(user));
+        sieveRepository.removeQuota(Username.of(user));
     }
 
     @Override
     public void addActiveSieveScript(String userName, String name, String script) throws Exception {
-        Username username = Username.fromUsername(userName);
+        Username username = Username.of(userName);
         sieveRepository.putScript(username, new ScriptName(name), new ScriptContent(script));
         sieveRepository.setActive(username, new ScriptName(name));
     }
diff --git a/server/data/data-api/src/main/java/org/apache/james/rrt/lib/MappingSource.java b/server/data/data-api/src/main/java/org/apache/james/rrt/lib/MappingSource.java
index df66a9d..178823b 100644
--- a/server/data/data-api/src/main/java/org/apache/james/rrt/lib/MappingSource.java
+++ b/server/data/data-api/src/main/java/org/apache/james/rrt/lib/MappingSource.java
@@ -80,7 +80,7 @@ public class MappingSource implements Serializable {
                 if (mappingSource.startsWith(WILDCARD + "@")) {
                     return fromDomain(Domain.of(mappingSource.substring(2, mappingSource.length())));
                 }
-                return fromUser(Username.fromUsername(mappingSource));
+                return fromUser(Username.of(mappingSource));
         }
     }
 
diff --git a/server/data/data-api/src/main/java/org/apache/james/rrt/lib/UserRewritter.java b/server/data/data-api/src/main/java/org/apache/james/rrt/lib/UserRewritter.java
index 9a05900..e21dde6 100644
--- a/server/data/data-api/src/main/java/org/apache/james/rrt/lib/UserRewritter.java
+++ b/server/data/data-api/src/main/java/org/apache/james/rrt/lib/UserRewritter.java
@@ -63,7 +63,7 @@ public interface UserRewritter extends Serializable {
     class ReplaceRewriter implements MappingUserRewriter {
         @Override
         public UserRewritter generateUserRewriter(String mapping) {
-            return oldUser -> Optional.of(Username.fromUsername(mapping));
+            return oldUser -> Optional.of(Username.of(mapping));
         }
     }
 
@@ -87,10 +87,10 @@ public interface UserRewritter extends Serializable {
             return oldUser -> {
                 try {
                     return regexMap(oldUser.asMailAddress(), mapping)
-                        .map(Username::fromUsername);
+                        .map(Username::of);
                 } catch (PatternSyntaxException e) {
                     LOGGER.error("Exception during regexMap processing: ", e);
-                    return Optional.of(Username.fromUsername(Mapping.Type.Regex.asPrefix() + mapping));
+                    return Optional.of(Username.of(Mapping.Type.Regex.asPrefix() + mapping));
                 }
             };
         }
diff --git a/server/data/data-api/src/main/java/org/apache/james/user/api/model/User.java b/server/data/data-api/src/main/java/org/apache/james/user/api/model/User.java
index dd04bbb..7aa04a8 100644
--- a/server/data/data-api/src/main/java/org/apache/james/user/api/model/User.java
+++ b/server/data/data-api/src/main/java/org/apache/james/user/api/model/User.java
@@ -53,8 +53,8 @@ public interface User {
     boolean setPassword(String newPass);
 
     default boolean hasUsername(String username) {
-        Username thisUsername = Username.fromUsername(getUserName());
-        Username thatUsername = Username.fromUsername(username);
+        Username thisUsername = Username.of(getUserName());
+        Username thatUsername = Username.of(username);
 
         return thisUsername.equals(thatUsername);
     }
diff --git a/server/data/data-api/src/test/java/org/apache/james/rrt/lib/DomainRewriterTest.java b/server/data/data-api/src/test/java/org/apache/james/rrt/lib/DomainRewriterTest.java
index f6e369a..d0a5215 100644
--- a/server/data/data-api/src/test/java/org/apache/james/rrt/lib/DomainRewriterTest.java
+++ b/server/data/data-api/src/test/java/org/apache/james/rrt/lib/DomainRewriterTest.java
@@ -31,8 +31,8 @@ public class DomainRewriterTest {
         assertThat(
             new UserRewritter.DomainRewriter()
                 .generateUserRewriter("newdomain.com")
-                .rewrite(Username.fromUsername("toto@olddomain.com")))
-            .contains(Username.fromUsername("toto@newdomain.com"));
+                .rewrite(Username.of("toto@olddomain.com")))
+            .contains(Username.of("toto@newdomain.com"));
     }
 
     @Test
@@ -40,7 +40,7 @@ public class DomainRewriterTest {
         assertThat(
             new UserRewritter.DomainRewriter()
                 .generateUserRewriter("newdomain.com")
-                .rewrite(Username.fromUsername("toto")))
-            .contains(Username.fromUsername("toto@newdomain.com"));
+                .rewrite(Username.of("toto")))
+            .contains(Username.of("toto@newdomain.com"));
     }
 }
diff --git a/server/data/data-api/src/test/java/org/apache/james/rrt/lib/MappingSourceTest.java b/server/data/data-api/src/test/java/org/apache/james/rrt/lib/MappingSourceTest.java
index f65f794..a56839c 100644
--- a/server/data/data-api/src/test/java/org/apache/james/rrt/lib/MappingSourceTest.java
+++ b/server/data/data-api/src/test/java/org/apache/james/rrt/lib/MappingSourceTest.java
@@ -64,7 +64,7 @@ class MappingSourceTest {
 
     @Test
     void asMailAddressStringShouldSerializeUserWithoutDomain() {
-        MappingSource mappingSource = MappingSource.fromUser(Username.fromUsername(USER));
+        MappingSource mappingSource = MappingSource.fromUser(Username.of(USER));
 
         assertThat(mappingSource.asMailAddressString()).isEqualTo(USER + "@*");
     }
diff --git a/server/data/data-api/src/test/java/org/apache/james/rrt/lib/ReplaceRewriterTest.java b/server/data/data-api/src/test/java/org/apache/james/rrt/lib/ReplaceRewriterTest.java
index fbc0d37..d2ce54d 100644
--- a/server/data/data-api/src/test/java/org/apache/james/rrt/lib/ReplaceRewriterTest.java
+++ b/server/data/data-api/src/test/java/org/apache/james/rrt/lib/ReplaceRewriterTest.java
@@ -32,8 +32,8 @@ public class ReplaceRewriterTest {
         assertThat(
             new UserRewritter.ReplaceRewriter()
                 .generateUserRewriter(newAddress)
-                .rewrite(Username.fromUsername("old@passed")))
-            .contains(Username.fromUsername(newAddress));
+                .rewrite(Username.of("old@passed")))
+            .contains(Username.of(newAddress));
     }
     
     @Test
@@ -42,8 +42,8 @@ public class ReplaceRewriterTest {
         assertThat(
             new UserRewritter.ReplaceRewriter()
                 .generateUserRewriter(newAddress)
-                .rewrite(Username.fromUsername("old")))
-            .contains(Username.fromUsername(newAddress));
+                .rewrite(Username.of("old")))
+            .contains(Username.of(newAddress));
     }
 
     @Test
@@ -52,7 +52,7 @@ public class ReplaceRewriterTest {
         assertThat(
             new UserRewritter.ReplaceRewriter()
                 .generateUserRewriter(newAddress)
-                .rewrite(Username.fromUsername("old@passed")))
-            .contains(Username.fromUsername(newAddress));
+                .rewrite(Username.of("old@passed")))
+            .contains(Username.of(newAddress));
     }
 }
diff --git a/server/data/data-api/src/test/java/org/apache/james/rrt/lib/ThrowingRewriterTest.java b/server/data/data-api/src/test/java/org/apache/james/rrt/lib/ThrowingRewriterTest.java
index bd806d4..db52435 100644
--- a/server/data/data-api/src/test/java/org/apache/james/rrt/lib/ThrowingRewriterTest.java
+++ b/server/data/data-api/src/test/java/org/apache/james/rrt/lib/ThrowingRewriterTest.java
@@ -31,7 +31,7 @@ public class ThrowingRewriterTest {
         assertThatThrownBy(() ->
             new UserRewritter.ThrowingRewriter()
                 .generateUserRewriter("any")
-                .rewrite(Username.fromUsername("any")))
+                .rewrite(Username.of("any")))
             .isInstanceOf(RecipientRewriteTable.ErrorMappingException.class);
     }
 }
diff --git a/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraActiveScriptDAOTest.java b/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraActiveScriptDAOTest.java
index 8c6dba1..24fd417 100644
--- a/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraActiveScriptDAOTest.java
+++ b/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraActiveScriptDAOTest.java
@@ -33,7 +33,7 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 class CassandraActiveScriptDAOTest {
-    private static final Username USERNAME = Username.fromUsername("user");
+    private static final Username USERNAME = Username.of("user");
     private static final ScriptName SCRIPT_NAME = new ScriptName("sciptName");
     private static final ScriptName NEW_SCRIPT_NAME = new ScriptName("newScriptName");
 
diff --git a/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveDAOTest.java b/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveDAOTest.java
index 32adb6d..cc312d6 100644
--- a/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveDAOTest.java
+++ b/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveDAOTest.java
@@ -34,7 +34,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 
 class CassandraSieveDAOTest {
 
-    private static final Username USERNAME = Username.fromUsername("user");
+    private static final Username USERNAME = Username.of("user");
     private static final ScriptName SCRIPT_NAME = new ScriptName("scriptName");
     private static final ScriptName SCRIPT_NAME2 = new ScriptName("scriptName2");
     private static final Script SCRIPT = Script.builder()
diff --git a/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAOTest.java b/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAOTest.java
index 4839e80..895fa37 100644
--- a/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAOTest.java
+++ b/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAOTest.java
@@ -30,7 +30,7 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 class CassandraSieveQuotaDAOTest {
-    private static final Username USERNAME = Username.fromUsername("user");
+    private static final Username USERNAME = Username.of("user");
     private static final QuotaSize QUOTA_SIZE = QuotaSize.size(15L);
 
     @RegisterExtension
diff --git a/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/filtering/DTOTest.java b/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/filtering/DTOTest.java
index 9c4e95f..fbfddb9 100644
--- a/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/filtering/DTOTest.java
+++ b/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/filtering/DTOTest.java
@@ -47,17 +47,17 @@ public class DTOTest {
     static final String EVENT_COMPLEX_JSON = ClassLoaderUtils.getSystemResourceAsString("json/eventComplex.json");
     static final FilteringRuleSetDefinedDTO SIMPLE_DTO = FilteringRuleSetDefinedDTO.from(
             new RuleSetDefined(
-                    new FilteringAggregateId(Username.fromUsername("Bart")),
+                    new FilteringAggregateId(Username.of("Bart")),
                     EventId.first(),
                     ImmutableList.of(RULE_1, RULE_2)));
     static final FilteringRuleSetDefinedDTO EMPTY_DTO = FilteringRuleSetDefinedDTO.from(
             new RuleSetDefined(
-                    new FilteringAggregateId(Username.fromUsername("Bart")),
+                    new FilteringAggregateId(Username.of("Bart")),
                     EventId.first(),
                     ImmutableList.of()));
     static final FilteringRuleSetDefinedDTO COMPLEX_DTO = FilteringRuleSetDefinedDTO.from(
             new RuleSetDefined(
-                    new FilteringAggregateId(Username.fromUsername("Bart")),
+                    new FilteringAggregateId(Username.of("Bart")),
                     EventId.first(),
                     ImmutableList.of(RULE_FROM, RULE_RECIPIENT, RULE_SUBJECT, RULE_TO)));
 
diff --git a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/impl/FilteringAggregateId.java b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/impl/FilteringAggregateId.java
index bd13288..0a75f73 100644
--- a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/impl/FilteringAggregateId.java
+++ b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/impl/FilteringAggregateId.java
@@ -33,7 +33,7 @@ public class FilteringAggregateId implements AggregateId {
 
     public static final FilteringAggregateId parse(String rawString) {
         Preconditions.checkArgument(rawString.startsWith(PREFIX + SEPARATOR));
-        return new FilteringAggregateId(Username.fromUsername(rawString.substring(PREFIX.length() + SEPARATOR.length())));
+        return new FilteringAggregateId(Username.of(rawString.substring(PREFIX.length() + SEPARATOR.length())));
     }
 
     private final Username username;
diff --git a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/FilteringAggregateIdTest.java b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/FilteringAggregateIdTest.java
index b856bf8..f6da805 100644
--- a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/FilteringAggregateIdTest.java
+++ b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/FilteringAggregateIdTest.java
@@ -43,7 +43,7 @@ class FilteringAggregateIdTest {
 
     @Test
     void asAggregateKeyShouldReturnAStringContainingThePrefixAndTheDomain() {
-        assertThat(new FilteringAggregateId(Username.fromUsername("foo@bar.space")).asAggregateKey())
+        assertThat(new FilteringAggregateId(Username.of("foo@bar.space")).asAggregateKey())
             .isEqualTo("FilteringRule/foo@bar.space");
     }
 
diff --git a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/FilteringManagementContract.java b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/FilteringManagementContract.java
index 2d393f9..d959f23 100644
--- a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/FilteringManagementContract.java
+++ b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/FilteringManagementContract.java
@@ -38,7 +38,7 @@ import org.junit.jupiter.api.Test;
 public interface FilteringManagementContract {
 
     String BART_SIMPSON_CARTOON = "bart@simpson.cartoon";
-    Username USERNAME = Username.fromUsername(BART_SIMPSON_CARTOON);
+    Username USERNAME = Username.of(BART_SIMPSON_CARTOON);
 
     default FilteringManagement instantiateFilteringManagement(EventStore eventStore) {
         return new EventSourcingFilteringManagement(eventStore);
diff --git a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/impl/DefineRulesCommandTest.java b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/impl/DefineRulesCommandTest.java
index cbd01d3..3f261ff 100644
--- a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/impl/DefineRulesCommandTest.java
+++ b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/impl/DefineRulesCommandTest.java
@@ -46,7 +46,7 @@ class DefineRulesCommandTest {
 
     @Test
     void constructorShouldThrowWhenNullRuleList() {
-        assertThatThrownBy(() -> new DefineRulesCommand(Username.fromUsername("adam@james.org"), null))
+        assertThatThrownBy(() -> new DefineRulesCommand(Username.of("adam@james.org"), null))
             .isInstanceOf(NullPointerException.class);
     }
 }
\ No newline at end of file
diff --git a/server/data/data-library/src/main/java/org/apache/james/sieverepository/lib/SieveRepositoryManagement.java b/server/data/data-library/src/main/java/org/apache/james/sieverepository/lib/SieveRepositoryManagement.java
index ff42345..6765dee 100644
--- a/server/data/data-library/src/main/java/org/apache/james/sieverepository/lib/SieveRepositoryManagement.java
+++ b/server/data/data-library/src/main/java/org/apache/james/sieverepository/lib/SieveRepositoryManagement.java
@@ -71,22 +71,22 @@ public class SieveRepositoryManagement extends StandardMBean implements SieveRep
 
     @Override
     public long getQuota(String user) throws SieveRepositoryException {
-        return sieveRepository.getQuota(Username.fromUsername(user)).asLong();
+        return sieveRepository.getQuota(Username.of(user)).asLong();
     }
 
     @Override
     public void setQuota(String user, long quota) throws SieveRepositoryException {
-        sieveRepository.setQuota(Username.fromUsername(user), QuotaSize.size(quota));
+        sieveRepository.setQuota(Username.of(user), QuotaSize.size(quota));
     }
 
     @Override
     public void removeQuota(String user) throws SieveRepositoryException {
-        sieveRepository.removeQuota(Username.fromUsername(user));
+        sieveRepository.removeQuota(Username.of(user));
     }
 
     @Override
     public void addActiveSieveScript(String userName, String scriptName, String script) throws SieveRepositoryException {
-        Username username = Username.fromUsername(userName);
+        Username username = Username.of(userName);
         sieveRepository.putScript(username, new ScriptName(scriptName), new ScriptContent(script));
         sieveRepository.setActive(username, new ScriptName(scriptName));
     }
diff --git a/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractJamesUsersRepository.java b/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractJamesUsersRepository.java
index f19b3df..3eee4fb 100644
--- a/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractJamesUsersRepository.java
+++ b/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractJamesUsersRepository.java
@@ -193,7 +193,7 @@ public abstract class AbstractJamesUsersRepository extends AbstractUsersReposito
                         domain = Domain.LOCALHOST;
                     }
                     try {
-                        MappingSource source = MappingSource.fromUser(Username.fromUsername(user));
+                        MappingSource source = MappingSource.fromUser(Username.of(user));
                         mappings.put(source, getResolvedMappings(username, domain));
                     } catch (ErrorMappingException e) {
                         // shold never happen here
diff --git a/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractUsersRepository.java b/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractUsersRepository.java
index 10ccaaa..c73e9e0 100644
--- a/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractUsersRepository.java
+++ b/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractUsersRepository.java
@@ -70,7 +70,7 @@ public abstract class AbstractUsersRepository implements UsersRepository, Config
     }
 
     protected void isValidUsername(String username) throws UsersRepositoryException {
-        Username user = Username.fromUsername(username);
+        Username user = Username.of(username);
         if (supportVirtualHosting()) {
             // need a @ in the username
             if (!user.hasDomainPart()) {
diff --git a/server/data/data-library/src/test/java/org/apache/james/sieverepository/lib/AbstractSieveRepositoryTest.java b/server/data/data-library/src/test/java/org/apache/james/sieverepository/lib/AbstractSieveRepositoryTest.java
index ba6e8b0..5e5f3fe 100644
--- a/server/data/data-library/src/test/java/org/apache/james/sieverepository/lib/AbstractSieveRepositoryTest.java
+++ b/server/data/data-library/src/test/java/org/apache/james/sieverepository/lib/AbstractSieveRepositoryTest.java
@@ -43,7 +43,7 @@ import org.junit.Test;
 
 public abstract class AbstractSieveRepositoryTest {
 
-    protected static final Username USERNAME = Username.fromUsername("test");
+    protected static final Username USERNAME = Username.of("test");
     protected static final ScriptName SCRIPT_NAME = new ScriptName("script");
     protected static final ScriptContent SCRIPT_CONTENT = new ScriptContent("Hello World");
 
diff --git a/server/data/data-library/src/test/java/org/apache/james/sieverepository/lib/SieveRepositoryManagementTest.java b/server/data/data-library/src/test/java/org/apache/james/sieverepository/lib/SieveRepositoryManagementTest.java
index e50c1c5..94597a4 100644
--- a/server/data/data-library/src/test/java/org/apache/james/sieverepository/lib/SieveRepositoryManagementTest.java
+++ b/server/data/data-library/src/test/java/org/apache/james/sieverepository/lib/SieveRepositoryManagementTest.java
@@ -55,7 +55,7 @@ public class SieveRepositoryManagementTest {
         String script = "user_script";
         URL sieveResource = ClassLoader.getSystemResource("sieve/my_sieve");
 
-        Username username = Username.fromUsername(userName);
+        Username username = Username.of(userName);
         ScriptName scriptName = new ScriptName(script);
         String sieveContent = IOUtils.toString(sieveResource, StandardCharsets.UTF_8);
         ScriptContent scriptContent = new ScriptContent(sieveContent);
@@ -72,7 +72,7 @@ public class SieveRepositoryManagementTest {
         String script = "user_script";
         URL sieveResource = ClassLoader.getSystemResource("sieve/my_sieve");
 
-        Username username = Username.fromUsername(userName);
+        Username username = Username.of(userName);
         ScriptName scriptName = new ScriptName(script);
         String sieveContent = IOUtils.toString(sieveResource, StandardCharsets.UTF_8);
         ScriptContent scriptContent = new ScriptContent(sieveContent);
diff --git a/server/data/data-library/src/test/java/org/apache/james/user/lib/AbstractUsersRepositoryTest.java b/server/data/data-library/src/test/java/org/apache/james/user/lib/AbstractUsersRepositoryTest.java
index ae0fded..34763f9 100644
--- a/server/data/data-library/src/test/java/org/apache/james/user/lib/AbstractUsersRepositoryTest.java
+++ b/server/data/data-library/src/test/java/org/apache/james/user/lib/AbstractUsersRepositoryTest.java
@@ -374,7 +374,7 @@ public abstract class AbstractUsersRepositoryTest {
         Assume.assumeTrue(usersRepository.supportVirtualHosting());
 
         String username = "user@domain";
-        assertThat(usersRepository.getMailAddressFor(Username.fromUsername(username)))
+        assertThat(usersRepository.getMailAddressFor(Username.of(username)))
             .isEqualTo(username);
     }
 
@@ -387,7 +387,7 @@ public abstract class AbstractUsersRepositoryTest {
         Assume.assumeFalse(usersRepository.supportVirtualHosting());
 
         String username = "user";
-        assertThat(usersRepository.getMailAddressFor(Username.fromUsername(username)))
+        assertThat(usersRepository.getMailAddressFor(Username.of(username)))
             .isEqualTo(new MailAddress(username, domainList.getDefaultDomain()));
     }
 }
diff --git a/server/data/data-memory/src/main/java/org/apache/james/user/memory/MemoryUsersRepository.java b/server/data/data-memory/src/main/java/org/apache/james/user/memory/MemoryUsersRepository.java
index 231f836..f10f6b3 100644
--- a/server/data/data-memory/src/main/java/org/apache/james/user/memory/MemoryUsersRepository.java
+++ b/server/data/data-memory/src/main/java/org/apache/james/user/memory/MemoryUsersRepository.java
@@ -104,7 +104,7 @@ public class MemoryUsersRepository extends AbstractUsersRepository {
 
     @Override
     public boolean test(String name, final String password) throws UsersRepositoryException {
-        return Optional.ofNullable(userByName.get(Username.fromUsername(name).asString()))
+        return Optional.ofNullable(userByName.get(Username.of(name).asString()))
             .map(user -> user.verifyPassword(password))
             .orElse(false);
     }
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RandomStoring.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RandomStoring.java
index 6a0f565..8115a23 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RandomStoring.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RandomStoring.java
@@ -104,7 +104,7 @@ public class RandomStoring extends GenericMailet {
 
     private List<ReroutingInfos> retrieveReroutingInfos() throws UsersRepositoryException {
         return Streams.stream(usersRepository.list())
-            .map(Username::fromUsername)
+            .map(Username::of)
             .flatMap(this::buildReRoutingInfos)
             .collect(Guavate.toImmutableList());
     }
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java
index 4e3539b..ed21488 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/SpamAssassin.java
@@ -108,7 +108,7 @@ public class SpamAssassin extends GenericMailet {
     }
 
     private void querySpamAssassin(Mail mail, MimeMessage message, SpamAssassinInvoker sa, MailAddress recipient) throws MessagingException, UsersRepositoryException {
-        SpamAssassinResult result = sa.scanMail(message, Username.fromUsername(usersRepository.getUser(recipient)));
+        SpamAssassinResult result = sa.scanMail(message, Username.of(usersRepository.getUser(recipient)));
 
         // Add headers per recipient to mail object
         for (Attribute attribute : result.getHeadersAsAttributes()) {
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/ResourceLocator.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/ResourceLocator.java
index 61113b5..4719b72 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/ResourceLocator.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/jsieve/ResourceLocator.java
@@ -68,7 +68,7 @@ public class ResourceLocator {
 
     private Username retrieveUsername(MailAddress mailAddress) {
         try {
-            return Username.fromUsername(usersRepository.getUser(mailAddress));
+            return Username.of(usersRepository.getUser(mailAddress));
         } catch (UsersRepositoryException e) {
             return Username.fromMailAddress(mailAddress);
         }
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/ResourceLocatorTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/ResourceLocatorTest.java
index c485a8c..dd5c4e0 100644
--- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/ResourceLocatorTest.java
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/ResourceLocatorTest.java
@@ -38,7 +38,7 @@ import org.junit.Test;
 public class ResourceLocatorTest {
 
     public static final String RECEIVER_LOCALHOST = "receiver@localhost";
-    public static final Username USERNAME = Username.fromUsername(RECEIVER_LOCALHOST);
+    public static final Username USERNAME = Username.of(RECEIVER_LOCALHOST);
     private SieveRepository sieveRepository;
     private ResourceLocator resourceLocator;
     private MailAddress mailAddress;
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/LocalDeliveryTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/LocalDeliveryTest.java
index db4b62a..07a28fd 100644
--- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/LocalDeliveryTest.java
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/LocalDeliveryTest.java
@@ -87,7 +87,7 @@ public class LocalDeliveryTest {
         when(usersRepository.supportVirtualHosting()).thenReturn(true);
         when(usersRepository.getUser(new MailAddress(username))).thenReturn(username);
         when(mailboxManager.getMailbox(eq(inbox), any(MailboxSession.class))).thenReturn(messageManager);
-        when(session.getUser()).thenReturn(Username.fromUsername(username));
+        when(session.getUser()).thenReturn(Username.of(username));
 
         // When
         Mail mail = createMail();
@@ -108,7 +108,7 @@ public class LocalDeliveryTest {
         when(usersRepository.getUser(new MailAddress("receiver@localhost"))).thenReturn(username);
         when(usersRepository.getUser(new MailAddress(RECEIVER_DOMAIN_COM))).thenReturn(username);
         when(mailboxManager.getMailbox(eq(inbox), any(MailboxSession.class))).thenReturn(messageManager);
-        when(session.getUser()).thenReturn(Username.fromUsername(username));
+        when(session.getUser()).thenReturn(Username.of(username));
 
         // When
         Mail mail = createMail();
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/ToRecipientFolderTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/ToRecipientFolderTest.java
index 5431ff4..c3ae81d 100644
--- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/ToRecipientFolderTest.java
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/ToRecipientFolderTest.java
@@ -86,7 +86,7 @@ public class ToRecipientFolderTest {
         } catch (MailboxException e) {
             throw new RuntimeException(e);
         }
-        when(session.getUser()).thenReturn(Username.fromUsername(USER));
+        when(session.getUser()).thenReturn(Username.of(USER));
     }
 
     @Test
@@ -164,7 +164,7 @@ public class ToRecipientFolderTest {
         when(usersRepository.getUser(new MailAddress(USER_LOCAL_PART + "@localhost"))).thenReturn(USER_LOCAL_PART);
         when(usersRepository.getUser(new MailAddress(USER))).thenReturn(USER_LOCAL_PART);
         when(mailboxManager.getMailbox(eq(JUNK), any(MailboxSession.class))).thenReturn(messageManager);
-        when(session.getUser()).thenReturn(Username.fromUsername(USER_LOCAL_PART));
+        when(session.getUser()).thenReturn(Username.of(USER_LOCAL_PART));
 
         testee.init(FakeMailetConfig.builder()
             .mailetName(MAILET_NAME)
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailetTestCase.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailetTestCase.java
index 0d3020c..ef673e0 100644
--- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailetTestCase.java
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailetTestCase.java
@@ -62,7 +62,7 @@ import com.google.common.collect.Lists;
 
 public class ManageSieveMailetTestCase {
 
-    public static final Username USERNAME = Username.fromUsername("test@localhost");
+    public static final Username USERNAME = Username.of("test@localhost");
     public static final ScriptName SCRIPT_NAME = new ScriptName("scriptName");
     public static final ScriptContent SCRIPT_CONTENT = new ScriptContent("scriptContent");
     public static final String SYNTAX_EXCEPTION = "SyntaxException";
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessor.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessor.java
index eabed22..90e4dfb 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessor.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessor.java
@@ -285,7 +285,7 @@ public class SetMessagesCreationProcessor implements SetMessagesProcessor {
 
     private void assertUserIsSender(MailboxSession session, Optional<DraftEmailer> from) throws MailboxSendingNotAllowedException {
         if (!from.flatMap(DraftEmailer::getEmail)
-                .filter(email -> session.getUser().equals(Username.fromUsername(email)))
+                .filter(email -> session.getUser().equals(Username.of(email)))
                 .isPresent()) {
             String allowedSender = session.getUser().asString();
             throw new MailboxSendingNotAllowedException(allowedSender);
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/mailet/filter/JMAPFiltering.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/mailet/filter/JMAPFiltering.java
index fa2924d..90c47a8 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/mailet/filter/JMAPFiltering.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/mailet/filter/JMAPFiltering.java
@@ -88,7 +88,7 @@ public class JMAPFiltering extends GenericMailet {
 
     private Optional<Username> retrieveUser(MailAddress recipient) {
         try {
-            return Optional.ofNullable(Username.fromUsername(usersRepository.getUser(recipient)));
+            return Optional.ofNullable(Username.of(usersRepository.getUser(recipient)));
         } catch (UsersRepositoryException e) {
             logger.error("cannot retrieve user " + recipient.asString(), e);
             return Optional.empty();
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/GetMessagesMethodTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/GetMessagesMethodTest.java
index 39dcc6e..9db231c 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/GetMessagesMethodTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/GetMessagesMethodTest.java
@@ -82,7 +82,7 @@ import com.jayway.jsonpath.JsonPath;
 
 public class GetMessagesMethodTest {
     private static final String FORWARDED = "forwarded";
-    private static final Username ROBERT = Username.fromUsername("robert");
+    private static final Username ROBERT = Username.of("robert");
 
     private MessageIdManager messageIdManager;
     private org.apache.james.mime4j.dom.Message messageContent1;
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/GetVacationResponseMethodTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/GetVacationResponseMethodTest.java
index 4e306d2..9b41160 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/GetVacationResponseMethodTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/GetVacationResponseMethodTest.java
@@ -63,7 +63,7 @@ public class GetVacationResponseMethodTest {
         zonedDateTimeProvider = mock(ZonedDateTimeProvider.class);
         vacationRepository = mock(VacationRepository.class);
         mailboxSession = mock(MailboxSession.class);
-        username = Username.fromUsername(USERNAME);
+        username = Username.of(USERNAME);
         testee = new GetVacationResponseMethod(vacationRepository, zonedDateTimeProvider, new DefaultMetricFactory());
 
         when(zonedDateTimeProvider.get()).thenReturn(DATE_2014);
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/SetVacationResponseMethodTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/SetVacationResponseMethodTest.java
index c359bec..696e0e3 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/SetVacationResponseMethodTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/SetVacationResponseMethodTest.java
@@ -53,7 +53,7 @@ import reactor.core.publisher.Mono;
 public class SetVacationResponseMethodTest {
     private static final String WRONG_ID = "WrongId";
     private static final String TEXT_BODY = "Text body";
-    private static final Username USERNAME = Username.fromUsername("username");
+    private static final Username USERNAME = Username.of("username");
     private static final String SUBJECT = "subject";
 
     private SetVacationResponseMethod testee;
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/mailet/filter/JMAPFilteringExtension.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/mailet/filter/JMAPFilteringExtension.java
index eba4f79..354102c 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/mailet/filter/JMAPFilteringExtension.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/mailet/filter/JMAPFilteringExtension.java
@@ -112,7 +112,7 @@ public class JMAPFilteringExtension implements BeforeEachCallback, ParameterReso
                     .build())
                 .collect(ImmutableList.toImmutableList());
 
-            testSystem.getFilteringManagement().defineRulesForUser(Username.fromUsername(RECIPIENT_1_USERNAME), rules);
+            testSystem.getFilteringManagement().defineRulesForUser(Username.of(RECIPIENT_1_USERNAME), rules);
         }
 
         public FakeMail asMail(MimeMessageBuilder mimeMessageBuilder) throws MessagingException {
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/mailet/filter/JMAPFilteringTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/mailet/filter/JMAPFilteringTest.java
index e91aaed..a8ab531 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/mailet/filter/JMAPFilteringTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/mailet/filter/JMAPFilteringTest.java
@@ -692,7 +692,7 @@ class JMAPFilteringTest {
             MailboxId mailbox2Id = testSystem.createMailbox(RECIPIENT_1_USERNAME, "RECIPIENT_1_MAILBOX_2");
             MailboxId mailbox3Id = testSystem.createMailbox(RECIPIENT_1_USERNAME, "RECIPIENT_1_MAILBOX_3");
 
-            testSystem.getFilteringManagement().defineRulesForUser(Username.fromUsername(RECIPIENT_1_USERNAME),
+            testSystem.getFilteringManagement().defineRulesForUser(Username.of(RECIPIENT_1_USERNAME),
                 Rule.builder()
                     .id(Rule.Id.of("1"))
                     .name("rule 1")
@@ -729,7 +729,7 @@ class JMAPFilteringTest {
             MailboxId mailbox2Id = testSystem.createMailbox(RECIPIENT_1_USERNAME, "RECIPIENT_1_MAILBOX_2");
             MailboxId mailbox3Id = testSystem.createMailbox(RECIPIENT_1_USERNAME, "RECIPIENT_1_MAILBOX_3");
 
-            testSystem.getFilteringManagement().defineRulesForUser(Username.fromUsername(RECIPIENT_1_USERNAME),
+            testSystem.getFilteringManagement().defineRulesForUser(Username.of(RECIPIENT_1_USERNAME),
                 Rule.builder()
                     .id(Rule.Id.of("1"))
                     .name("rule 1")
@@ -753,7 +753,7 @@ class JMAPFilteringTest {
         void rulesWithEmptyMailboxIdsShouldBeSkept(JMAPFilteringTestSystem testSystem) throws Exception {
             MailboxId mailbox1Id = testSystem.createMailbox(RECIPIENT_1_USERNAME, "RECIPIENT_1_MAILBOX_1");
 
-            testSystem.getFilteringManagement().defineRulesForUser(Username.fromUsername(RECIPIENT_1_USERNAME),
+            testSystem.getFilteringManagement().defineRulesForUser(Username.of(RECIPIENT_1_USERNAME),
                 Rule.builder()
                     .id(Rule.Id.of("1"))
                     .name("rule 1")
@@ -822,7 +822,7 @@ class JMAPFilteringTest {
         @Test
         void serviceShouldNotThrowWhenUnknownMailboxId(JMAPFilteringTestSystem testSystem) throws Exception {
             String unknownMailboxId = "4242";
-            testSystem.getFilteringManagement().defineRulesForUser(Username.fromUsername(RECIPIENT_1_USERNAME),
+            testSystem.getFilteringManagement().defineRulesForUser(Username.of(RECIPIENT_1_USERNAME),
                 Rule.builder()
                     .id(Rule.Id.of("1"))
                     .name("rule 1")
@@ -840,7 +840,7 @@ class JMAPFilteringTest {
         @Test
         void mailDirectiveShouldNotBeSetWhenUnknownMailboxId(JMAPFilteringTestSystem testSystem) throws Exception {
             String unknownMailboxId = "4242";
-            testSystem.getFilteringManagement().defineRulesForUser(Username.fromUsername(RECIPIENT_1_USERNAME),
+            testSystem.getFilteringManagement().defineRulesForUser(Username.of(RECIPIENT_1_USERNAME),
                 Rule.builder()
                     .id(Rule.Id.of("1"))
                     .name("rule 1")
@@ -860,7 +860,7 @@ class JMAPFilteringTest {
         @Test
         void rulesWithInvalidMailboxIdsShouldBeSkept(JMAPFilteringTestSystem testSystem) throws Exception {
             String unknownMailboxId = "4242";
-            testSystem.getFilteringManagement().defineRulesForUser(Username.fromUsername(RECIPIENT_1_USERNAME),
+            testSystem.getFilteringManagement().defineRulesForUser(Username.of(RECIPIENT_1_USERNAME),
                 Rule.builder()
                     .id(Rule.Id.of("1"))
                     .name("rule 1")
@@ -888,7 +888,7 @@ class JMAPFilteringTest {
         void rulesWithMultipleMailboxIdsShouldFallbackWhenInvalidFirstMailboxId(JMAPFilteringTestSystem testSystem) throws Exception {
             String unknownMailboxId = "4242";
 
-            testSystem.getFilteringManagement().defineRulesForUser(Username.fromUsername(RECIPIENT_1_USERNAME),
+            testSystem.getFilteringManagement().defineRulesForUser(Username.of(RECIPIENT_1_USERNAME),
                 Rule.builder()
                     .id(Rule.Id.of("1"))
                     .name("rule 1")
diff --git a/server/protocols/webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/WebAdminServerTaskSerializationIntegrationTest.java b/server/protocols/webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/WebAdminServerTaskSerializationIntegrationTest.java
index 9e2f801..665e0f0 100644
--- a/server/protocols/webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/WebAdminServerTaskSerializationIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/WebAdminServerTaskSerializationIntegrationTest.java
@@ -463,7 +463,7 @@ public class WebAdminServerTaskSerializationIntegrationTest {
         EventDeadLetters.InsertionId insertionId = EventDeadLetters.InsertionId.of(insertionUuid);
         MailboxListener.MailboxAdded event = EventFactory.mailboxAdded()
             .eventId(Event.EventId.of(uuid))
-            .user(Username.fromUsername(USERNAME))
+            .user(Username.of(USERNAME))
             .sessionId(MailboxSession.SessionId.of(452))
             .mailboxId(InMemoryId.of(453))
             .mailboxPath(MailboxPath.forUser(USERNAME, "Important-mailbox"))
@@ -505,7 +505,7 @@ public class WebAdminServerTaskSerializationIntegrationTest {
         EventDeadLetters.InsertionId insertionId = EventDeadLetters.InsertionId.of(insertionUuid);
         MailboxListener.MailboxAdded event = EventFactory.mailboxAdded()
             .eventId(Event.EventId.of(uuid))
-            .user(Username.fromUsername(USERNAME))
+            .user(Username.of(USERNAME))
             .sessionId(MailboxSession.SessionId.of(452))
             .mailboxId(InMemoryId.of(453))
             .mailboxPath(MailboxPath.forUser(USERNAME, "Important-mailbox"))
diff --git a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/MappingRoutes.java b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/MappingRoutes.java
index e4638ea..afec681 100644
--- a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/MappingRoutes.java
+++ b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/MappingRoutes.java
@@ -111,7 +111,7 @@ public class MappingRoutes implements Routes {
         @ApiResponse(code = HttpStatus.BAD_REQUEST_400, message = "Invalid user parameter values.")
     })
     private List<MappingValueDTO> getUserMappings(Request request, Response response) throws RecipientRewriteTableException {
-        Username username = Username.fromUsername(request.params(USER).toLowerCase());
+        Username username = Username.of(request.params(USER).toLowerCase());
 
         return recipientRewriteTable.getStoredMappings(MappingSource.fromUser(username))
             .asStream()
diff --git a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/RegexMappingRoutes.java b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/RegexMappingRoutes.java
index d76f8c9..9e4700e 100644
--- a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/RegexMappingRoutes.java
+++ b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/RegexMappingRoutes.java
@@ -131,7 +131,7 @@ public class RegexMappingRoutes implements Routes {
     private MappingSource extractMappingSource(Request request) {
         try {
             return MappingSource
-                .fromUser(Username.fromUsername(request.params(MAPPING_SOURCE_PARAM)));
+                .fromUser(Username.of(request.params(MAPPING_SOURCE_PARAM)));
         } catch (IllegalArgumentException e) {
             throw ErrorResponder.builder()
                 .statusCode(HttpStatus.BAD_REQUEST_400)
diff --git a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/SieveQuotaRoutes.java b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/SieveQuotaRoutes.java
index 53de5c9..a97c5b8 100644
--- a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/SieveQuotaRoutes.java
+++ b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/SieveQuotaRoutes.java
@@ -243,6 +243,6 @@ public class SieveQuotaRoutes implements Routes {
                 .message("User " + username + " does not exist")
                 .haltError();
         }
-        return Username.fromUsername(username);
+        return Username.of(username);
     }
 }
diff --git a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/SieveScriptRoutes.java b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/SieveScriptRoutes.java
index 73bd6de..a0377ea 100644
--- a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/SieveScriptRoutes.java
+++ b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/SieveScriptRoutes.java
@@ -143,7 +143,7 @@ public class SieveScriptRoutes implements Routes {
         if (!usersRepository.contains(userName)) {
             throw404("User not found");
         }
-        return Username.fromUsername(userName);
+        return Username.of(userName);
     }
 
     private ScriptName extractScriptName(Request request) {
diff --git a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/UserService.java b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/UserService.java
index f195f02..9673d3f 100644
--- a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/UserService.java
+++ b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/UserService.java
@@ -86,7 +86,7 @@ public class UserService {
 
     private void usernamePreconditions(String username) {
         try {
-            Username.fromUsername(username);
+            Username.of(username);
         } catch (IllegalArgumentException e) {
             throw new InvalidUsername(e);
         }
diff --git a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/GroupsRoutesTest.java b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/GroupsRoutesTest.java
index 1d2e0c1..5ec575d 100644
--- a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/GroupsRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/GroupsRoutesTest.java
@@ -127,7 +127,7 @@ class GroupsRoutesTest {
         void getShouldNotResolveRecurseGroups() throws Exception {
             when().put(GROUP1 + SEPARATOR + USER_A);
 
-            memoryRecipientRewriteTable.addForwardMapping(MappingSource.fromUser(Username.fromUsername(USER_A)),
+            memoryRecipientRewriteTable.addForwardMapping(MappingSource.fromUser(Username.of(USER_A)),
                 "b@" + DOMAIN.name());
 
             List<String> addresses =
diff --git a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/MappingRoutesTest.java b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/MappingRoutesTest.java
index 3332cac..22b4e93 100644
--- a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/MappingRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/MappingRoutesTest.java
@@ -100,7 +100,7 @@ class MappingRoutesTest {
 
     @Test
     void getMappingsShouldReturnAliasMappings() throws RecipientRewriteTableException {
-        Username aliasDomain = Username.fromUsername("alias@domain.tld");
+        Username aliasDomain = Username.of("alias@domain.tld");
 
         recipientRewriteTable.addAliasMapping(
             MappingSource.fromUser(aliasDomain),
@@ -240,7 +240,7 @@ class MappingRoutesTest {
 
     @Test
     void getMappingsShouldReturnForwardMappings() throws RecipientRewriteTableException {
-        Username forwardUsername = Username.fromUsername("forwarduser@domain.tld");
+        Username forwardUsername = Username.of("forwarduser@domain.tld");
 
         recipientRewriteTable.addForwardMapping(
             MappingSource.fromUser(forwardUsername), "person1@domain.tld");
@@ -274,7 +274,7 @@ class MappingRoutesTest {
 
     @Test
     void getMappingsShouldReturnRegexMappings() throws RecipientRewriteTableException {
-        Username regexUsername = Username.fromUsername("regex@domain.tld");
+        Username regexUsername = Username.of("regex@domain.tld");
 
         recipientRewriteTable.addRegexMapping(
             MappingSource.fromUser(regexUsername), "abc");
@@ -308,7 +308,7 @@ class MappingRoutesTest {
 
     @Test
     void getMappingsShouldReturnErrorMappings() throws RecipientRewriteTableException {
-        Username errorUsername = Username.fromUsername("error@domain.tld");
+        Username errorUsername = Username.of("error@domain.tld");
 
         recipientRewriteTable.addErrorMapping(
             MappingSource.fromUser(errorUsername), "Error 123");
@@ -345,7 +345,7 @@ class MappingRoutesTest {
         MailAddress mailAddress = new MailAddress("address@domain.tld");
 
         recipientRewriteTable.addAliasMapping(
-            MappingSource.fromUser(Username.fromUsername("alias@domain.tld")),
+            MappingSource.fromUser(Username.of("alias@domain.tld")),
             "user@domain.tld");
 
         recipientRewriteTable.addAliasDomainMapping(
@@ -356,18 +356,18 @@ class MappingRoutesTest {
             MappingSource.fromMailAddress(mailAddress), "user@domain.tld");
 
         recipientRewriteTable.addGroupMapping(
-            MappingSource.fromUser(Username.fromUsername("group@domain.tld")),
+            MappingSource.fromUser(Username.of("group@domain.tld")),
                 "member1@domain.tld");
 
         recipientRewriteTable.addForwardMapping(
-            MappingSource.fromUser(Username.fromUsername("forward@domain.tld")),
+            MappingSource.fromUser(Username.of("forward@domain.tld")),
                 "abc@domain.tld");
 
         recipientRewriteTable.addRegexMapping(
-            MappingSource.fromUser(Username.fromUsername("regex@domain.tld")), "abc");
+            MappingSource.fromUser(Username.of("regex@domain.tld")), "abc");
 
         recipientRewriteTable.addErrorMapping(
-            MappingSource.fromUser(Username.fromUsername("error@domain.tld")), "Error 456");
+            MappingSource.fromUser(Username.of("error@domain.tld")), "Error 456");
 
         String jsonBody = when()
                 .get()
@@ -448,18 +448,18 @@ class MappingRoutesTest {
     @Test
     void getUserMappingsShouldReturnCorrespondingMappingsFromUsername() throws Exception {
         recipientRewriteTable.addAddressMapping(
-            MappingSource.fromUser(Username.fromUsername(ALICE_ADDRESS)), ALICE_USER);
+            MappingSource.fromUser(Username.of(ALICE_ADDRESS)), ALICE_USER);
         recipientRewriteTable.addAliasMapping(
-            MappingSource.fromUser(Username.fromUsername(ALICE_ADDRESS)), ALICE_ALIAS);
+            MappingSource.fromUser(Username.of(ALICE_ADDRESS)), ALICE_ALIAS);
         recipientRewriteTable.addGroupMapping(
-            MappingSource.fromUser(Username.fromUsername(ALICE_ADDRESS)), ALICE_GROUP);
+            MappingSource.fromUser(Username.of(ALICE_ADDRESS)), ALICE_GROUP);
 
         recipientRewriteTable.addAddressMapping(
-            MappingSource.fromUser(Username.fromUsername(BOB_ADDRESS)), BOB_USER);
+            MappingSource.fromUser(Username.of(BOB_ADDRESS)), BOB_USER);
         recipientRewriteTable.addAliasMapping(
-            MappingSource.fromUser(Username.fromUsername(BOB_ADDRESS)), BOB_ALIAS);
+            MappingSource.fromUser(Username.of(BOB_ADDRESS)), BOB_ALIAS);
         recipientRewriteTable.addGroupMapping(
-            MappingSource.fromUser(Username.fromUsername(BOB_ADDRESS)), BOB_GROUP);
+            MappingSource.fromUser(Username.of(BOB_ADDRESS)), BOB_GROUP);
 
         String jsonBody = when()
                 .get("/user/alice123@domain.tld")
@@ -491,18 +491,18 @@ class MappingRoutesTest {
     @Test
     void getUserMappingsShouldReturnSameMappingsWhenParametersInUpperCase() throws RecipientRewriteTableException {
         recipientRewriteTable.addAddressMapping(
-            MappingSource.fromUser(Username.fromUsername(ALICE_ADDRESS)), ALICE_USER);
+            MappingSource.fromUser(Username.of(ALICE_ADDRESS)), ALICE_USER);
         recipientRewriteTable.addAliasMapping(
-            MappingSource.fromUser(Username.fromUsername(ALICE_ADDRESS)), ALICE_ALIAS);
+            MappingSource.fromUser(Username.of(ALICE_ADDRESS)), ALICE_ALIAS);
         recipientRewriteTable.addGroupMapping(
-            MappingSource.fromUser(Username.fromUsername(ALICE_ADDRESS)), ALICE_GROUP);
+            MappingSource.fromUser(Username.of(ALICE_ADDRESS)), ALICE_GROUP);
 
         recipientRewriteTable.addAddressMapping(
-            MappingSource.fromUser(Username.fromUsername(BOB_ADDRESS)), BOB_USER);
+            MappingSource.fromUser(Username.of(BOB_ADDRESS)), BOB_USER);
         recipientRewriteTable.addAliasMapping(
-            MappingSource.fromUser(Username.fromUsername(BOB_ADDRESS)), BOB_ALIAS);
+            MappingSource.fromUser(Username.of(BOB_ADDRESS)), BOB_ALIAS);
         recipientRewriteTable.addGroupMapping(
-            MappingSource.fromUser(Username.fromUsername(BOB_ADDRESS)), BOB_GROUP);
+            MappingSource.fromUser(Username.of(BOB_ADDRESS)), BOB_GROUP);
 
         String jsonBody = when()
                 .get("/user/AliCE123@domain.tld")
@@ -547,11 +547,11 @@ class MappingRoutesTest {
     @Test
     void getUserMappingShouldReturnEmptyWhenNoDomainOnUserParameter() throws RecipientRewriteTableException {
         recipientRewriteTable.addAddressMapping(
-            MappingSource.fromUser(Username.fromUsername(ALICE_ADDRESS)), ALICE_USER);
+            MappingSource.fromUser(Username.of(ALICE_ADDRESS)), ALICE_USER);
         recipientRewriteTable.addAliasMapping(
-            MappingSource.fromUser(Username.fromUsername(ALICE_ADDRESS)), ALICE_ALIAS);
+            MappingSource.fromUser(Username.of(ALICE_ADDRESS)), ALICE_ALIAS);
         recipientRewriteTable.addGroupMapping(
-            MappingSource.fromUser(Username.fromUsername(ALICE_ADDRESS)), ALICE_GROUP);
+            MappingSource.fromUser(Username.of(ALICE_ADDRESS)), ALICE_GROUP);
 
         String jsonBody = when()
                 .get("/user/alice")
diff --git a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/RegexMappingRoutesTest.java b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/RegexMappingRoutesTest.java
index a63a24d..6afc8a4 100644
--- a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/RegexMappingRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/RegexMappingRoutesTest.java
@@ -79,7 +79,7 @@ class RegexMappingRoutesTest {
             .contentType(ContentType.JSON);
 
         assertThat(memoryRecipientRewriteTable
-            .getStoredMappings(MappingSource.fromUser(Username.fromUsername("james@domain.tld"))))
+            .getStoredMappings(MappingSource.fromUser(Username.of("james@domain.tld"))))
             .containsOnly(Mapping.regex("bis.*@apache.org"));
     }
 
@@ -92,7 +92,7 @@ class RegexMappingRoutesTest {
             .contentType(ContentType.JSON);
 
         assertThat(memoryRecipientRewriteTable
-            .getStoredMappings(MappingSource.fromUser(Username.fromUsername("jamesdomaintld"))))
+            .getStoredMappings(MappingSource.fromUser(Username.of("jamesdomaintld"))))
             .containsOnly(Mapping.regex("bis.*@apache.org"));
     }
 
@@ -153,13 +153,13 @@ class RegexMappingRoutesTest {
             .contentType(ContentType.JSON);
 
         assertThat(memoryRecipientRewriteTable
-            .getStoredMappings(MappingSource.fromUser(Username.fromUsername("james@domain.tld"))))
+            .getStoredMappings(MappingSource.fromUser(Username.of("james@domain.tld"))))
             .containsOnly(Mapping.regex("^[aei?ou].*james@domain.tld"));
     }
 
     @Test
     void removeRegexMappingShouldReturnNoContentWhenSuccess() throws Exception {
-        MappingSource mappingSource = MappingSource.fromUser(Username.fromUsername("abc@domain.tld"));
+        MappingSource mappingSource = MappingSource.fromUser(Username.of("abc@domain.tld"));
         memoryRecipientRewriteTable
             .addRegexMapping(mappingSource, "valar.*@apache.org");
 
@@ -175,7 +175,7 @@ class RegexMappingRoutesTest {
 
     @Test
     void removeRegexMappingShouldAllowUserWithoutDomain() throws Exception {
-        MappingSource mappingSource = MappingSource.fromUser(Username.fromUsername("abcdomaintld"));
+        MappingSource mappingSource = MappingSource.fromUser(Username.of("abcdomaintld"));
         memoryRecipientRewriteTable
             .addRegexMapping(mappingSource, "valar.*@apache.org");
 
@@ -227,7 +227,7 @@ class RegexMappingRoutesTest {
 
     @Test
     void removeRegexMappingShouldReturnNoContentWhenTwoSameRequestArrive() throws Exception {
-        MappingSource mappingSource = MappingSource.fromUser(Username.fromUsername("abc@domain.tld"));
+        MappingSource mappingSource = MappingSource.fromUser(Username.of("abc@domain.tld"));
         memoryRecipientRewriteTable
             .addRegexMapping(mappingSource, "valar.*@apache.org");
 
@@ -255,7 +255,7 @@ class RegexMappingRoutesTest {
             .statusCode(HttpStatus.NO_CONTENT_204)
             .contentType(ContentType.JSON);
 
-        MappingSource mappingSource = MappingSource.fromUser(Username.fromUsername("abc@domain.tld"));
+        MappingSource mappingSource = MappingSource.fromUser(Username.of("abc@domain.tld"));
         memoryRecipientRewriteTable
             .addRegexMapping(mappingSource, "valar.*@apache.org");
     }
diff --git a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/SieveScriptRoutesTest.java b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/SieveScriptRoutesTest.java
index c5e1381..6081708 100644
--- a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/SieveScriptRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/SieveScriptRoutesTest.java
@@ -178,7 +178,7 @@ class SieveScriptRoutesTest {
             .statusCode(HttpStatus.NO_CONTENT_204);
 
         assertThat(getScriptContent(sieveRepository
-            .getScript(Username.fromUsername("userA"), new ScriptName("scriptA"))))
+            .getScript(Username.of("userA"), new ScriptName("scriptA"))))
             .isEqualTo(new ScriptContent(" "));
     }
 
@@ -194,7 +194,7 @@ class SieveScriptRoutesTest {
             .statusCode(HttpStatus.NO_CONTENT_204);
 
         assertThat(getScriptContent(sieveRepository
-            .getScript(Username.fromUsername("userA"), new ScriptName("scriptA"))))
+            .getScript(Username.of("userA"), new ScriptName("scriptA"))))
             .isEqualTo(new ScriptContent(sieveContent));
     }
 
@@ -211,7 +211,7 @@ class SieveScriptRoutesTest {
             .statusCode(HttpStatus.NO_CONTENT_204);
 
         assertThat(getScriptContent(sieveRepository
-            .getActive(Username.fromUsername("userA"))))
+            .getActive(Username.of("userA"))))
             .isEqualTo(new ScriptContent(sieveContent));
     }
 
@@ -227,7 +227,7 @@ class SieveScriptRoutesTest {
         .then()
             .statusCode(HttpStatus.NO_CONTENT_204);
 
-        assertThatThrownBy(() -> sieveRepository.getActive(Username.fromUsername("userA")))
+        assertThatThrownBy(() -> sieveRepository.getActive(Username.of("userA")))
             .isInstanceOf(ScriptNotFoundException.class);
     }
 
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTask.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTask.java
index 8f49e58..3b732d3 100644
--- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTask.java
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTask.java
@@ -51,7 +51,7 @@ public class DeletedMessagesVaultDeleteTask implements Task {
 
         public DeletedMessagesVaultDeleteTask create(DeletedMessagesVaultDeleteTaskDTO dto) {
             MessageId messageId = messageIdFactory.fromString(dto.getMessageId());
-            Username username = Username.fromUsername(dto.getUserName());
+            Username username = Username.of(dto.getUserName());
             return new DeletedMessagesVaultDeleteTask(deletedMessageVault, username, messageId);
         }
     }
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTaskAdditionalInformationDTO.java
index 11b9e17..33c8bdf 100644
--- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTaskAdditionalInformationDTO.java
@@ -33,7 +33,7 @@ public class DeletedMessagesVaultDeleteTaskAdditionalInformationDTO implements A
     public static AdditionalInformationDTOModule<DeletedMessagesVaultDeleteTask.AdditionalInformation, DeletedMessagesVaultDeleteTaskAdditionalInformationDTO> serializationModule(MessageId.Factory factory) {
         return DTOModule.forDomainObject(DeletedMessagesVaultDeleteTask.AdditionalInformation.class)
             .convertToDTO(DeletedMessagesVaultDeleteTaskAdditionalInformationDTO.class)
-            .toDomainObjectConverter(dto -> new DeletedMessagesVaultDeleteTask.AdditionalInformation(Username.fromUsername(dto.userName), factory.fromString(dto.getMessageId()), dto.getTimestamp()))
+            .toDomainObjectConverter(dto -> new DeletedMessagesVaultDeleteTask.AdditionalInformation(Username.of(dto.userName), factory.fromString(dto.getMessageId()), dto.getTimestamp()))
             .toDTOConverter((details, type) -> new DeletedMessagesVaultDeleteTaskAdditionalInformationDTO(type, details.getUsername(), details.getDeleteMessageId(), details.timestamp()))
             .typeName(DeletedMessagesVaultDeleteTask.TYPE.asString())
             .withFactory(AdditionalInformationDTOModule::new);
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTaskAdditionalInformationDTO.java
index fe02086..f8a66ad 100644
--- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTaskAdditionalInformationDTO.java
@@ -86,7 +86,7 @@ public class DeletedMessagesVaultExportTaskAdditionalInformationDTO implements A
     DeletedMessagesVaultExportTask.AdditionalInformation toDomainObject() {
         try {
             return new DeletedMessagesVaultExportTask.AdditionalInformation(
-                Username.fromUsername(userExportFrom),
+                Username.of(userExportFrom),
                 new MailAddress(exportTo),
                 totalExportedMessages,
                 timestamp
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTaskDTO.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTaskDTO.java
index 2fde3fd..df42864 100644
--- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTaskDTO.java
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTaskDTO.java
@@ -64,7 +64,7 @@ public class DeletedMessagesVaultExportTaskDTO implements TaskDTO {
         }
 
         public DeletedMessagesVaultExportTask create(DeletedMessagesVaultExportTaskDTO dto) throws AddressException {
-            Username userExportFrom = Username.fromUsername(dto.userExportFrom);
+            Username userExportFrom = Username.of(dto.userExportFrom);
             Query exportQuery = queryTranslator.translate(dto.exportQuery);
             MailAddress exportTo = new MailAddress(dto.exportTo);
             return new DeletedMessagesVaultExportTask(exportService, userExportFrom, exportQuery, exportTo);
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTaskAdditionalInformationDTO.java
index aab941c..e93839b 100644
--- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTaskAdditionalInformationDTO.java
@@ -82,7 +82,7 @@ public class DeletedMessagesVaultRestoreTaskAdditionalInformationDTO implements
 
     DeletedMessagesVaultRestoreTask.AdditionalInformation toDomainObject() {
         return new DeletedMessagesVaultRestoreTask.AdditionalInformation(
-            Username.fromUsername(user),
+            Username.of(user),
             successfulRestoreCount,
             errorRestoreCount,
             timestamp
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTaskDTO.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTaskDTO.java
index 9bbff06..fe6a1d2 100644
--- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTaskDTO.java
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTaskDTO.java
@@ -46,7 +46,7 @@ public class DeletedMessagesVaultRestoreTaskDTO implements TaskDTO {
         }
 
         public DeletedMessagesVaultRestoreTask create(DeletedMessagesVaultRestoreTaskDTO dto) {
-            Username usernameToRestore = Username.fromUsername(dto.userToRestore);
+            Username usernameToRestore = Username.of(dto.userToRestore);
             Query query = queryTranslator.translate(dto.query);
             return new DeletedMessagesVaultRestoreTask(restoreService, usernameToRestore, query);
         }
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutes.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutes.java
index c68a2d8..79f2c5c 100644
--- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutes.java
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutes.java
@@ -373,7 +373,7 @@ public class DeletedMessagesVaultRoutes implements Routes {
 
     private Username extractUser(Request request) {
         try {
-            return Username.fromUsername(request.params(USER_PATH_PARAM));
+            return Username.of(request.params(USER_PATH_PARAM));
         } catch (IllegalArgumentException e) {
             throw ErrorResponder.builder()
                 .statusCode(HttpStatus.BAD_REQUEST_400)
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTaskSerializationTest.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTaskSerializationTest.java
index f9577ad..8706f96 100644
--- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTaskSerializationTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTaskSerializationTest.java
@@ -42,7 +42,7 @@ class DeletedMessagesVaultDeleteTaskSerializationTest {
 
     private DeletedMessageVault deletedMessageVault;
     private JsonTaskSerializer taskSerializer;
-    private final Username username = Username.fromUsername("james");
+    private final Username username = Username.of("james");
 
     private final TestMessageId.Factory messageIdFactory = new TestMessageId.Factory();
     private final MessageId messageId = messageIdFactory.generate();
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTaskSerializationTest.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTaskSerializationTest.java
index c007e77..65f0b0f 100644
--- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTaskSerializationTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTaskSerializationTest.java
@@ -54,7 +54,7 @@ class DeletedMessagesVaultExportTaskSerializationTest {
     private JsonTaskSerializer taskSerializer;
 
     private static final String username = "james";
-    private static final Username USERNAME_EXPORT_FROM = Username.fromUsername(username);
+    private static final Username USERNAME_EXPORT_FROM = Username.of(username);
     private static final Query QUERY = Query.of(CriterionFactory.hasAttachment(true));
     private static MailAddress exportTo;
     private static DeletedMessagesVaultExportTask.AdditionalInformation details;
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTaskSerializationTest.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTaskSerializationTest.java
index 6f9caeb..4bfa982 100644
--- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTaskSerializationTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTaskSerializationTest.java
@@ -49,7 +49,7 @@ class DeletedMessagesVaultRestoreTaskSerializationTest {
     private JsonTaskSerializer taskSerializer;
 
     private static final String USERNAME = "james";
-    private static final Username USERNAME_TO_RESTORE = Username.fromUsername(USERNAME);
+    private static final Username USERNAME_TO_RESTORE = Username.of(USERNAME);
     private static final Query QUERY = Query.of(CriterionFactory.hasAttachment(true));
     private static final DeletedMessagesVaultRestoreTask.AdditionalInformation DETAILS = new DeletedMessagesVaultRestoreTask.AdditionalInformation(USERNAME_TO_RESTORE,42, 10, TIMESTAMP);
 
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/ReindexingRoutes.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/ReindexingRoutes.java
index d39a2b4..d838339 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/ReindexingRoutes.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/ReindexingRoutes.java
@@ -288,7 +288,7 @@ public class ReindexingRoutes implements Routes {
 
     private Username extractUser(Request request) {
         try {
-            return Username.fromUsername(request.queryParams(USER_QUERY_PARAM));
+            return Username.of(request.queryParams(USER_QUERY_PARAM));
         } catch (Exception e) {
             throw ErrorResponder.builder()
                 .statusCode(HttpStatus.BAD_REQUEST_400)
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/UserQuotaRoutes.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/UserQuotaRoutes.java
index 55bdcba..3306acf 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/UserQuotaRoutes.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/UserQuotaRoutes.java
@@ -362,7 +362,7 @@ public class UserQuotaRoutes implements Routes {
                 .message("User not found")
                 .haltError();
         }
-        return Username.fromUsername(user);
+        return Username.of(user);
     }
 
     private QuotaDTO parseQuotaDTO(Request request) {
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/UsersQuotaDetailsDTOTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/UsersQuotaDetailsDTOTest.java
index 929cf05..c22d39d 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/UsersQuotaDetailsDTOTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/UsersQuotaDetailsDTOTest.java
@@ -40,14 +40,14 @@ public class UsersQuotaDetailsDTOTest {
     @Test
     public void builderShouldThrowWhenDetailIsNull() {
         assertThatThrownBy(() -> UsersQuotaDetailsDTO.builder()
-                .user(Username.fromUsername("user@domain.org"))
+                .user(Username.of("user@domain.org"))
                 .build())
             .isInstanceOf(NullPointerException.class);
     }
 
     @Test
     public void builderShouldWork() throws AddressException {
-        Username username = Username.fromUsername("user@domain.org");
+        Username username = Username.of("user@domain.org");
         QuotaDetailsDTO quotaDetailsDTO = QuotaDetailsDTO.builder()
                 .occupation(
                         Quota.<QuotaSize>builder().used(QuotaSize.size(1)).computedLimit(QuotaSize.size(12)).build(),
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/EventDeadLettersRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/EventDeadLettersRoutesTest.java
index 67314ca..5051bcf 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/EventDeadLettersRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/EventDeadLettersRoutesTest.java
@@ -83,14 +83,14 @@ class EventDeadLettersRoutesTest {
     private static final EventDeadLetters.InsertionId INSERTION_ID_3 = EventDeadLetters.InsertionId.of(INSERTION_UUID_3);
     private static final MailboxListener.MailboxAdded EVENT_1 = EventFactory.mailboxAdded()
         .eventId(Event.EventId.of(UUID_1))
-        .user(Username.fromUsername(BOB))
+        .user(Username.of(BOB))
         .sessionId(MailboxSession.SessionId.of(452))
         .mailboxId(InMemoryId.of(453))
         .mailboxPath(MailboxPath.forUser(BOB, "Important-mailbox"))
         .build();
     private static final MailboxListener.MailboxAdded EVENT_2 = EventFactory.mailboxAdded()
         .eventId(Event.EventId.of(UUID_2))
-        .user(Username.fromUsername(BOB))
+        .user(Username.of(BOB))
         .sessionId(MailboxSession.SessionId.of(455))
         .mailboxId(InMemoryId.of(456))
         .mailboxPath(MailboxPath.forUser(BOB, "project-3"))
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserQuotaRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserQuotaRoutesTest.java
index 2c828eb..c65e891 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserQuotaRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserQuotaRoutesTest.java
@@ -67,11 +67,11 @@ class UserQuotaRoutesTest {
     private static final String QUOTA_USERS = "/quota/users";
     private static final String PERDU_COM = "perdu.com";
     private static final String STRANGE_ORG = "strange.org";
-    private static final Username BOB = Username.fromUsername("bob@" + PERDU_COM);
-    private static final Username ESCAPED_BOB = Username.fromUsername("bob%40" + PERDU_COM);
-    private static final Username JOE = Username.fromUsername("joe@" + PERDU_COM);
-    private static final Username JACK = Username.fromUsername("jack@" + PERDU_COM);
-    private static final Username GUY_WITH_STRANGE_DOMAIN = Username.fromUsername("guy@" + STRANGE_ORG);
+    private static final Username BOB = Username.of("bob@" + PERDU_COM);
+    private static final Username ESCAPED_BOB = Username.of("bob%40" + PERDU_COM);
+    private static final Username JOE = Username.of("joe@" + PERDU_COM);
+    private static final Username JACK = Username.of("jack@" + PERDU_COM);
+    private static final Username GUY_WITH_STRANGE_DOMAIN = Username.of("guy@" + STRANGE_ORG);
     private static final String PASSWORD = "secret";
     private static final String COUNT = "count";
     private static final String SIZE = "size";
diff --git a/third-party/spamassassin/src/test/java/org/apache/james/spamassassin/SpamAssassinInvokerTest.java b/third-party/spamassassin/src/test/java/org/apache/james/spamassassin/SpamAssassinInvokerTest.java
index 009af68..7f4b3c2 100644
--- a/third-party/spamassassin/src/test/java/org/apache/james/spamassassin/SpamAssassinInvokerTest.java
+++ b/third-party/spamassassin/src/test/java/org/apache/james/spamassassin/SpamAssassinInvokerTest.java
@@ -39,7 +39,7 @@ import org.junit.jupiter.api.extension.ExtendWith;
 @ExtendWith(SpamAssassinExtension.class)
 public class SpamAssassinInvokerTest {
 
-    public static final Username USERNAME = Username.fromUsername("any@james");
+    public static final Username USERNAME = Username.of("any@james");
     private SpamAssassin spamAssassin;
     private SpamAssassinInvoker testee;
 


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