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

[james-project] 01/44: JAMES-2949 add strong typing in UsersRepository API and more generally on Username concept

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

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

commit 01411c50b62a8308d26980bb23d9a31fb7241cf9
Author: Raphael Ouazana <ra...@linagora.com>
AuthorDate: Thu Oct 31 12:04:59 2019 +0100

    JAMES-2949 add strong typing in UsersRepository API and more generally on Username concept
---
 .../listeners/SetCustomFlagOnBigMessages.java      |   2 +-
 .../listeners/SetCustomFlagOnBigMessagesTest.java  |   3 +-
 .../org/apache/james/mailbox/MailboxManager.java   |   9 +-
 .../org/apache/james/mailbox/MailboxSession.java   |  10 +-
 .../james/mailbox/acl/GroupMembershipResolver.java |   4 +-
 .../james/mailbox/acl/MailboxACLResolver.java      |   3 +-
 .../mailbox/acl/SimpleGroupMembershipResolver.java |  10 +-
 .../james/mailbox/acl/UnionMailboxACLResolver.java |   9 +-
 .../exception/UserDoesNotExistException.java       |  10 +-
 .../org/apache/james/mailbox/model/Mailbox.java    |   7 +-
 .../org/apache/james/mailbox/model/MailboxACL.java |  11 +-
 .../apache/james/mailbox/model/MailboxPath.java    |  13 +-
 .../james/mailbox/model/search/MailboxQuery.java   |  20 +-
 .../mailbox/AbstractSubscriptionManagerTest.java   |   3 +-
 .../apache/james/mailbox/MailboxListenerTest.java  |   8 +-
 .../james/mailbox/MailboxManagerStressTest.java    |   3 +-
 .../apache/james/mailbox/MailboxManagerTest.java   |   9 +-
 .../apache/james/mailbox/MailboxSessionUtil.java   |   5 +-
 .../apache/james/mailbox/MessageMoveEventTest.java |  20 +-
 .../james/mailbox/acl/PositiveUserACLDiffTest.java |   6 +-
 .../acl/SimpleGroupMembershipResolverTest.java     |  14 +-
 .../mailbox/acl/UnionMailboxACLResolverTest.java   | 373 +++++++--------
 .../james/mailbox/events/EventBusTestFixture.java  |   2 +-
 .../mailbox/events/EventDeadLettersContract.java   |   2 +-
 .../apache/james/mailbox/events/GroupContract.java |   8 +-
 .../apache/james/mailbox/events/KeyContract.java   |   3 +-
 .../james/mailbox/fixture/MailboxFixture.java      |   7 +-
 .../mailbox/manager/ManagerTestProvisionner.java   |   5 +-
 .../apache/james/mailbox/mock/DataProvisioner.java |   6 +-
 .../apache/james/mailbox/model/MailboxACLTest.java |  15 +-
 .../james/mailbox/model/MailboxAssertTests.java    |  27 +-
 .../james/mailbox/model/MailboxPathTest.java       |  88 ++--
 .../mailbox/model/search/MailboxQueryTest.java     |  19 +-
 .../james/mailbox/backup/DefaultMailboxBackup.java |   8 +-
 .../mailbox/backup/ZipMailArchiveRestorer.java     |   4 +-
 .../mailbox/backup/MailboxMessageFixture.java      |   8 +-
 .../cassandra/mail/CassandraAttachmentMapper.java  |   2 +-
 .../mail/CassandraAttachmentOwnerDAO.java          |   6 +-
 .../cassandra/mail/CassandraMailboxDAO.java        |   3 +-
 .../cassandra/mail/CassandraMailboxMapper.java     |   3 +-
 .../cassandra/mail/CassandraMailboxPathDAO.java    |   3 +-
 .../mail/CassandraMailboxPathDAOImpl.java          |   5 +-
 .../cassandra/mail/CassandraMailboxPathV2DAO.java  |   9 +-
 .../mail/CassandraUserMailboxRightsDAO.java        |   9 +-
 .../mail/task/MailboxMergingTaskRunner.java        |   3 +-
 .../cassandra/mail/utils/MailboxBaseTupleUtil.java |   5 +-
 .../mail/CassandraAttachmentOwnerDAOTest.java      |   9 +-
 .../mail/CassandraIndexTableHandlerTest.java       |   3 +-
 .../mail/CassandraMailboxCounterDAOTest.java       |   3 +-
 .../cassandra/mail/CassandraMailboxDAOTest.java    |   8 +-
 .../CassandraMailboxMapperConcurrencyTest.java     |   3 +-
 .../cassandra/mail/CassandraMailboxMapperTest.java |   3 +-
 .../mail/CassandraMailboxPathDAOTest.java          |   5 +-
 .../cassandra/mail/CassandraMapperProvider.java    |   3 +-
 .../mail/CassandraMessageIdMapperTest.java         |   3 +-
 .../mail/CassandraModSeqProviderTest.java          |   3 +-
 .../cassandra/mail/CassandraUidProviderTest.java   |   3 +-
 .../mail/CassandraUserMailboxRightsDAOTest.java    |   3 +-
 .../mail/migration/MailboxPathV2MigrationTest.java |   3 +-
 ...asticSearchListeningMessageSearchIndexTest.java |   3 +-
 .../scala/org/apache/james/event/json/DTOs.scala   |   3 +-
 .../james/event/json/AddedSerializationTest.java   |   2 +-
 .../event/json/ExpungedSerializationTest.java      |   2 +-
 .../event/json/FlagsUpdatedSerializationTest.java  |   2 +-
 .../MailboxACLUpdatedEventSerializationTest.java   |   4 +-
 .../event/json/MailboxAddedSerializationTest.java  |   2 +-
 .../json/MailboxDeletionSerializationTest.java     |   2 +-
 .../json/MailboxRenamedSerializationTest.java      |   4 +-
 .../james/event/json/dtos/MailboxPathTest.java     |  12 +-
 .../james/mailbox/jpa/mail/JPAMailboxMapper.java   |  18 +-
 .../james/mailbox/jpa/mail/model/JPAMailbox.java   |   5 +-
 .../james/mailbox/jpa/mail/JPAMapperProvider.java  |   3 +-
 .../jpa/mail/TransactionalMailboxMapper.java       |   3 +-
 .../LuceneMailboxMessageSearchIndexTest.java       |  10 +-
 .../apache/james/mailbox/maildir/MaildirStore.java |  17 +-
 .../mailbox/maildir/mail/MaildirMailboxMapper.java |   7 +-
 .../maildir/user/MaildirSubscriptionMapper.java    |   9 +-
 .../inmemory/mail/InMemoryAttachmentMapper.java    |   2 +-
 .../inmemory/mail/InMemoryMailboxMapper.java       |   5 +-
 .../quota/InMemoryCurrentQuotaManager.java         |   3 +-
 .../inmemory/mail/InMemoryMapperProvider.java      |   6 +-
 .../james/vault/DeletedMessageVaultHook.java       |   6 +-
 .../james/vault/DeletedMessageVaultHookTest.java   |  20 +-
 .../ElasticSearchQuotaSearcherTest.java            |   2 +-
 .../search/scanning/ScanningQuotaSearcher.java     |   3 +-
 .../james/quota/search/QuotaSearcherContract.java  |  72 +--
 .../mailbox/spamassassin/SpamAssassinListener.java |   6 +-
 .../spamassassin/SpamAssassinListenerTest.java     |   3 +-
 .../mailbox/spring/AnonymousAuthenticator.java     |   3 +-
 .../james/mailbox/spring/NoAuthorizator.java       |   3 +-
 .../apache/james/mailbox/store/Authenticator.java  |   3 +-
 .../apache/james/mailbox/store/Authorizator.java   |   3 +-
 .../james/mailbox/store/FakeAuthenticator.java     |  10 +-
 .../james/mailbox/store/FakeAuthorizator.java      |  12 +-
 .../james/mailbox/store/SessionProvider.java       |  11 +-
 .../mailbox/store/StoreAttachmentManager.java      |   6 +-
 .../james/mailbox/store/StoreMailboxManager.java   |  11 +-
 .../james/mailbox/store/StoreRightManager.java     |  16 +-
 .../mailbox/store/SystemMailboxesProviderImpl.java |   6 +-
 .../store/event/MailboxAnnotationListener.java     |   2 +-
 .../james/mailbox/store/mail/AttachmentMapper.java |   2 +-
 .../james/mailbox/store/mail/MailboxMapper.java    |   3 +-
 .../james/mailbox/store/mail/model/Username.java   |  74 ---
 .../store/quota/DefaultUserQuotaRootResolver.java  |  15 +-
 .../store/search/ListeningMessageSearchIndex.java  |   2 +-
 .../AbstractMailboxManagerAttachmentTest.java      |   3 +-
 .../store/AbstractMessageIdManagerStorageTest.java |   3 +-
 .../james/mailbox/store/StoreBlobManagerTest.java  |   3 +-
 .../store/StoreMailboxManagerAnnotationTest.java   |   3 +-
 .../mailbox/store/StoreMailboxManagerTest.java     |  25 +-
 .../james/mailbox/store/StoreRightManagerTest.java |  39 +-
 .../store/event/MailboxAnnotationListenerTest.java |  10 +-
 .../james/mailbox/store/mail/MessageUtilsTest.java |   3 +-
 .../store/mail/model/AttachmentMapperTest.java     |   5 +-
 .../store/mail/model/ListMailboxAssert.java        |   7 +-
 .../store/mail/model/ListMailboxAssertTest.java    |   3 +-
 .../store/mail/model/ListMessageAssertTest.java    |   3 +-
 .../store/mail/model/MailboxMapperACLTest.java     |  85 ++--
 .../store/mail/model/MailboxMapperTest.java        |  22 +-
 .../store/mail/model/MessageIdMapperTest.java      |  10 +-
 .../store/mail/model/MessageMapperTest.java        |   8 +-
 .../mailbox/store/mail/model/MessageMoveTest.java  |   6 +-
 .../model/MessageWithAttachmentMapperTest.java     |   3 +-
 .../mailbox/store/mail/model/UsernameTest.java     |  60 ---
 .../quota/DefaultUserQuotaRootResolverTest.java    |  12 +-
 .../mailbox/store/quota/QuotaCheckerTest.java      |   3 +-
 .../search/AbstractMessageSearchIndexTest.java     |   5 +-
 .../mailbox/tools/copier/MailboxCopierImpl.java    |   3 +-
 .../mailbox/tools/copier/MailboxCopierTest.java    |   3 +-
 .../mailbox/tools/indexer/ReIndexerImpl.java       |   2 +-
 .../mailbox/tools/indexer/ReIndexerPerformer.java  |  11 +-
 .../tools/indexer/CassandraReIndexerImplTest.java  |   3 +-
 .../tools/indexer/MessageIdReIndexerImplTest.java  |   3 +-
 .../mailbox/tools/indexer/ReIndexerImplTest.java   |   4 +-
 .../mailbox/store/mail/ZooUidProviderTest.java     |   6 +-
 .../james/transport/mailets/AbstractSign.java      |   7 +-
 .../apache/james/mpt/ant/MailProtocolTestTask.java |   3 +-
 .../java/org/apache/james/mpt/api/HostSystem.java  |   3 +-
 .../org/apache/james/mpt/api/ImapHostSystem.java   |   3 +-
 .../java/org/apache/james/mpt/api/UserAdder.java   |   4 +-
 .../apache/james/mpt/host/ExternalHostSystem.java  |   5 +-
 .../script/GenericSimpleScriptedTestProtocol.java  |  21 +-
 .../james/mpt/script/ImapScriptedTestProtocol.java |  13 +-
 .../apache/james/mpt/user/ScriptedUserAdder.java   |  11 +-
 .../apache/james/mpt/TestExternalHostSystem.java   |   3 +-
 .../apache/james/mpt/TestScriptedUserAdder.java    |   3 +-
 .../apache/james/mpt/host/JamesImapHostSystem.java |   9 +-
 .../james/mpt/imapmailbox/GrantRightsOnHost.java   |   3 +-
 .../james/mpt/imapmailbox/ImapTestConstants.java   |   4 +-
 .../james/mpt/imapmailbox/suite/ACLCommands.java   |   3 +-
 .../mpt/imapmailbox/suite/ACLIntegration.java      |   7 +-
 .../imapmailbox/suite/ACLScriptedTestProtocol.java |  18 +-
 .../mpt/imapmailbox/suite/AuthenticatePlain.java   |   5 +-
 .../mpt/imapmailbox/suite/AuthenticatedState.java  |  10 +-
 .../imapmailbox/suite/ListingWithSharingTest.java  |   3 +-
 .../imapmailbox/suite/base/BasicImapCommands.java  |   2 +-
 .../imapmailbox/cyrus/host/CyrusHostSystem.java    |   7 +-
 .../mpt/imapmailbox/cyrus/host/CyrusUserAdder.java |   5 +-
 .../cyrus/host/GrantRightsOnCyrusHost.java         |   5 +-
 .../DockerDeploymentValidationGuiceJPATest.java    |   3 +-
 .../DockerDeploymentValidationSpringJPATest.java   |   3 +-
 .../james/host/docker/CliProvisioningAPI.java      |   5 +-
 .../host/external/ExternalJamesImapHostSystem.java |   3 +-
 .../host/external/NoopDomainsAndUserAdder.java     |   3 +-
 .../james/mpt/host/JamesManageSieveHostSystem.java |   4 +-
 .../org/apache/james/mpt/smtp/SmtpTestRule.java    |   6 +-
 .../java/org/apache/james/mpt/maven/AddUser.java   |   7 +-
 protocols/api/pom.xml                              |   4 +
 .../james/protocols/api/ProtocolSession.java       |   7 +-
 .../james/protocols/api/ProtocolSessionImpl.java   |  11 +-
 .../apache/james/imap/api/ImapSessionUtils.java    |   5 +-
 .../org/apache/james/imap/main/PathConverter.java  |   5 +-
 .../imap/processor/AbstractAuthProcessor.java      |   7 +-
 .../imap/processor/AbstractMailboxProcessor.java   |   2 +-
 .../james/imap/api/ImapSessionUtilsTest.java       |   3 +-
 .../decode/parser/CreateCommandParserTest.java     |   3 +-
 .../apache/james/imap/main/PathConverterTest.java  |   3 +-
 .../james/imap/processor/CopyProcessorTest.java    |   2 +-
 .../imap/processor/DeleteACLProcessorTest.java     |   7 +-
 .../james/imap/processor/GetACLProcessorTest.java  |   3 +-
 .../imap/processor/GetAnnotationProcessorTest.java |   3 +-
 .../imap/processor/GetQuotaProcessorTest.java      |   6 +-
 .../imap/processor/GetQuotaRootProcessorTest.java  |   6 +-
 .../james/imap/processor/LSubProcessorTest.java    |   3 +-
 .../imap/processor/ListRightsProcessorTest.java    |   9 +-
 .../james/imap/processor/MoveProcessorTest.java    |   2 +-
 .../james/imap/processor/SearchProcessorTest.java  |  10 +-
 .../james/imap/processor/SetACLProcessorTest.java  |  12 +-
 .../imap/processor/SetAnnotationProcessorTest.java |   3 +-
 .../imap/processor/SetQuotaProcessorTest.java      |   3 +-
 .../processor/base/MailboxEventAnalyserTest.java   |   8 +-
 .../processor/base/SelectedMailboxImplTest.java    |   5 +-
 .../managesieve/api/AuthenticationProcessor.java   |   4 +-
 .../org/apache/james/managesieve/api/Session.java  |   5 +-
 .../james/managesieve/core/CoreProcessor.java      |  18 +-
 .../core/PlainAuthenticationProcessor.java         |   7 +-
 .../james/managesieve/util/SettableSession.java    |   7 +-
 .../james/protocols/netty/ProtocolMDCContext.java  |   2 +-
 .../pop3/core/AbstractApopCmdHandler.java          |  10 +-
 .../pop3/core/AbstractPassCmdHandler.java          |  16 +-
 .../james/protocols/pop3/core/UserCmdHandler.java  |   3 +-
 .../protocols/pop3/AbstractPOP3ServerTest.java     |   5 +-
 .../protocols/pop3/utils/TestPassCmdHandler.java   |   5 +-
 ...ractSenderAuthIdentifyVerificationRcptHook.java |  12 +-
 .../smtp/core/ReceivedDataLineFilter.java          |   2 +-
 .../protocols/smtp/core/esmtp/AuthCmdHandler.java  |  27 +-
 .../apache/james/protocols/smtp/hook/AuthHook.java |   3 +-
 .../fastfail/ResolvableEhloHeloHandlerTest.java    |   9 +-
 .../protocols/smtp/utils/BaseFakeSMTPSession.java  |   6 +-
 .../james/cli/ReindexCommandIntegrationTest.java   |   3 +-
 .../test/java/org/apache/james/ESReporterTest.java |   3 +-
 .../org/apache/james/FixingGhostMailboxTest.java   |   5 +-
 .../apache/james/CassandraLdapJamesServerTest.java |   4 +-
 .../CassandraRabbitMQLdapJmapJamesServerTest.java  |   2 +-
 .../java/org/apache/james/utils/DataProbeImpl.java |  12 +-
 .../org/apache/james/modules/ACLProbeImpl.java     |   5 +-
 .../org/apache/james/modules/MailboxProbeImpl.java |  26 +-
 .../org/apache/james/modules/QuotaProbesImpl.java  |   3 +-
 .../apache/james/jmap/draft/JmapGuiceProbe.java    |   3 +-
 .../apache/james/jmap/draft/MessageIdProbe.java    |   7 +-
 .../mailbox/store/UserRepositoryAuthenticator.java |   3 +-
 .../mailbox/store/UserRepositoryAuthorizator.java  |   3 +-
 .../store/UserRepositoryAuthenticatorTest.java     |   5 +-
 .../store/UserRepositoryAuthorizatorTest.java      |   5 +-
 .../adapter/mailbox/MailboxManagerManagement.java  |  20 +-
 .../james/adapter/mailbox/QuotaManagement.java     |   3 +-
 .../james/adapter/mailbox/ReIndexerManagement.java |   3 +-
 .../adapter/mailbox/MailboxManagementTest.java     |  43 +-
 .../adapter/mailbox/ReIndexerManagementTest.java   |   3 +-
 .../container/spring/tool/James23Importer.java     | 184 -------
 .../spring/tool/James23ImporterManagement.java     |  64 ---
 .../tool/James23ImporterManagementMBean.java       |  53 ---
 .../org/apache/james/user/api/UsersRepository.java |  20 +-
 .../user/api/UsersRepositoryManagementMBean.java   |  10 +-
 .../java/org/apache/james/user/api/model/User.java |   8 +-
 .../user/cassandra/CassandraUsersRepository.java   |  32 +-
 .../sieverepository/file/SieveFileRepository.java  |   2 +-
 .../cassandra/access/CassandraAccessTokenDAO.java  |  11 +-
 .../access/CassandraAccessTokenRepository.java     |   9 +-
 .../jmap/api/access/AccessTokenRepository.java     |   5 +-
 .../apache/james/jmap/api/vacation/AccountId.java  |   6 +
 .../memory/access/MemoryAccessTokenRepository.java |  10 +-
 .../jmap/api/access/AccessTokenRepositoryTest.java |  10 +-
 .../apache/james/user/jpa/JPAUsersRepository.java  |  47 +-
 .../org/apache/james/user/jpa/model/JPAUser.java   |   5 +-
 .../user/ldap/LdapRepositoryConfiguration.java     |   7 +-
 .../apache/james/user/ldap/ReadOnlyLDAPUser.java   |   7 +-
 .../user/ldap/ReadOnlyUsersLDAPRepository.java     |  32 +-
 .../james/user/ldap/DockerLdapSingleton.java       |   4 +-
 .../user/ldap/ReadOnlyUsersLDAPRepositoryTest.java |  12 +-
 .../james/user/lib/AbstractUsersRepository.java    |  28 +-
 .../james/user/lib/UsersRepositoryManagement.java  |  33 +-
 .../james/user/lib/model/DefaultJamesUser.java     |   5 +-
 .../apache/james/user/lib/model/DefaultUser.java   |   9 +-
 .../user/lib/AbstractUsersRepositoryTest.java      |  38 +-
 .../james/user/memory/MemoryUsersRepository.java   |  35 +-
 .../user/memory/UsersRepositoryManagementTest.java |  33 +-
 .../apache/james/smtp/SmtpRandomStoringTest.java   |   3 +-
 .../james/transport/mailets/AliasMappingTest.java  |   7 +-
 .../james/transport/mailets/DomainMappingTest.java |   5 +-
 .../james/transport/mailets/GroupMappingTest.java  |   5 +-
 .../impl/JamesMailetContextTest.java               |   9 +-
 .../james/transport/mailets/RandomStoring.java     |   3 +-
 .../james/transport/mailets/SpamAssassin.java      |   3 +-
 .../james/transport/mailets/ToSenderFolder.java    |   5 +-
 .../james/transport/mailets/WhiteListManager.java  |   3 +-
 .../transport/mailets/WithStorageDirective.java    |   2 +-
 .../mailets/delivery/MailboxAppender.java          |   7 +-
 .../mailets/delivery/SimpleMailStore.java          |  11 +-
 .../transport/mailets/jsieve/ResourceLocator.java  |   2 +-
 .../mailets/jsieve/delivery/SievePoster.java       |   5 +-
 .../mailets/managesieve/ManageSieveMailet.java     |   3 +-
 .../matchers/AbstractSQLWhitelistMatcher.java      |   3 +-
 .../james/transport/matchers/IsOverQuota.java      |   3 +-
 .../transport/mailets/ResourceLocatorTest.java     |   4 +-
 .../mailets/delivery/LocalDeliveryTest.java        |  13 +-
 .../mailets/delivery/MailboxAppenderTest.java      |   3 +-
 .../mailets/delivery/SieveIntegrationTest.java     |  20 +-
 .../mailets/delivery/SimpleMailStoreTest.java      |  11 +-
 .../mailets/delivery/ToRecipientFolderTest.java    |  18 +-
 .../managesieve/ManageSieveMailetTestCase.java     |   2 +-
 .../james/transport/matchers/IsOverQuotaTest.java  |  13 +-
 .../java/org/apache/james/fetchmail/FetchMail.java |   5 +-
 .../jmap/cassandra/CassandraBulkOperationTest.java |   7 +-
 .../apache/james/jmap/HttpJmapAuthentication.java  |   9 +-
 .../org/apache/james/jmap/MessageAppender.java     |   3 +-
 .../org/apache/james/jmap/ProvisioningTest.java    |   7 +-
 .../org/apache/james/jmap/TestingConstants.java    |   8 +-
 .../apache/james/jmap/VacationIntegrationTest.java |  41 +-
 .../integration/DeletedMessagesVaultTest.java      |   7 +-
 .../jmap/draft/methods/integration/FilterTest.java |   6 +-
 .../integration/ForwardIntegrationTest.java        |   6 +-
 .../integration/GetMailboxesMethodTest.java        | 136 +++---
 .../integration/GetMessageListMethodTest.java      | 529 ++++++++++-----------
 .../integration/GetVacationResponseTest.java       |  12 +-
 ...LinshareBlobExportMechanismIntegrationTest.java |   5 +-
 .../methods/integration/QuotaMailingTest.java      |  11 +-
 .../methods/integration/SendMDNMethodTest.java     |  15 +-
 .../integration/SetMailboxesMethodTest.java        | 175 +++----
 .../SetMessagesMethodReRoutingTest.java            |   5 +-
 .../methods/integration/SetMessagesMethodTest.java | 405 ++++++++--------
 .../SetMessagesOutboxFlagUpdateTest.java           |  13 +-
 .../integration/SetVacationResponseTest.java       |   3 +-
 .../methods/integration/SpamAssassinContract.java  |   3 +-
 .../integration/cucumber/DownloadStepdefs.java     |  15 +-
 .../cucumber/GetMessagesMethodStepdefs.java        |  11 +-
 .../cucumber/SetMailboxesMethodStepdefs.java       |   3 +-
 .../cucumber/SetMessagesMethodStepdefs.java        |   3 +-
 .../methods/integration/cucumber/UserStepdefs.java |   3 +-
 .../ReindexingWithEventDeadLettersTest.java        |   2 +-
 .../draft/AccessTokenAuthenticationStrategy.java   |   3 +-
 .../james/jmap/draft/AuthenticationServlet.java    |   7 +-
 .../draft/DefaultMailboxesProvisioningFilter.java  |   4 +-
 .../jmap/draft/JWTAuthenticationStrategy.java      |  10 +-
 ...ParameterAccessTokenAuthenticationStrategy.java |   4 +-
 .../james/jmap/draft/UserProvisioningFilter.java   |  13 +-
 .../james/jmap/draft/api/AccessTokenManager.java   |   5 +-
 .../jmap/draft/crypto/AccessTokenManagerImpl.java  |   7 +-
 .../james/jmap/draft/json/ObjectMapperFactory.java |  29 +-
 .../draft/methods/GetVacationResponseMethod.java   |   2 +-
 .../methods/SetMailboxesCreationProcessor.java     |   4 +-
 .../draft/methods/SetMailboxesUpdateProcessor.java |   5 +-
 .../draft/methods/SetVacationResponseMethod.java   |   2 +-
 .../james/jmap/draft/model/MailboxFactory.java     |   6 +-
 .../jmap/draft/model/mailbox/MailboxNamespace.java |  13 +-
 .../james/jmap/draft/model/mailbox/Rights.java     |  44 +-
 .../jmap/draft/send/PostDequeueDecorator.java      |   3 +-
 .../jmap/event/PropagateLookupRightListener.java   |   2 +-
 .../mailet/ExtractMDNOriginalJMAPMessageId.java    |  10 +-
 .../james/jmap/mailet/filter/ActionApplier.java    |   2 +-
 .../james/jmap/mailet/filter/JMAPFiltering.java    |   2 +-
 .../AccessTokenAuthenticationStrategyTest.java     |   8 +-
 .../james/jmap/draft/AuthenticationFilterTest.java |   8 +-
 .../DefaultMailboxesProvisioningFilterTest.java    |   3 +-
 ...faultMailboxesProvisioningFilterThreadTest.java |   3 +-
 .../james/jmap/draft/DownloadServletTest.java      |   3 +-
 .../jmap/draft/JWTAuthenticationStrategyTest.java  |   9 +-
 ...meterAccessTokenAuthenticationStrategyTest.java |   3 +-
 .../jmap/draft/UserProvisioningFilterTest.java     |  13 +-
 .../draft/UserProvisioningFilterThreadTest.java    |   3 +-
 .../draft/crypto/AccessTokenManagerImplTest.java   |  25 +-
 .../jmap/draft/json/ObjectMapperFactoryTest.java   |   9 +-
 .../jmap/draft/methods/AttachmentCheckerTest.java  |   3 +-
 .../jmap/draft/methods/GetMailboxesMethodTest.java |   7 +-
 .../jmap/draft/methods/GetMessagesMethodTest.java  |   2 +-
 .../methods/SetMessagesCreationProcessorTest.java  |   4 +-
 .../methods/SetVacationResponseMethodTest.java     |   2 +-
 .../apache/james/jmap/draft/model/JmapMDNTest.java |   3 +-
 .../james/jmap/draft/model/MailboxFactoryTest.java |   5 +-
 .../draft/model/mailbox/MailboxNamespaceTest.java  |   8 +-
 .../james/jmap/draft/model/mailbox/RightsTest.java |  21 +-
 .../jmap/draft/send/PostDequeueDecoratorTest.java  |   6 +-
 .../james/jmap/draft/utils/MailboxUtilsTest.java   |   5 +-
 .../event/PropagateLookupRightListenerTest.java    |   7 +-
 .../ExtractMDNOriginalJMAPMessageIdTest.java       |  10 +-
 .../jmap/mailet/filter/JMAPFilteringExtension.java |   4 +-
 .../jmap/mailet/filter/JMAPFilteringFixture.java   |   3 +-
 .../jmap/mailet/filter/JMAPFilteringTest.java      |  16 +-
 .../hook/MailboxDeliverToRecipientHandler.java     |   3 +-
 .../james/pop3server/core/PassCmdHandler.java      |   7 +-
 .../apache/james/pop3server/POP3ServerTest.java    |  45 +-
 .../AddDefaultAttributesMessageHook.java           |   4 +-
 .../SenderAuthIdentifyVerificationRcptHook.java    |   7 +-
 .../james/smtpserver/UsersRepositoryAuthHook.java  |   5 +-
 .../smtpserver/fastfail/ValidRcptHandler.java      |   5 +-
 .../apache/james/smtpserver/SMTPServerTest.java    |   9 +-
 .../james/smtpserver/ValidRcptHandlerTest.java     |   5 +-
 .../EventDeadLettersIntegrationTest.java           |   5 +-
 ...dminServerTaskSerializationIntegrationTest.java |  10 +-
 .../apache/james/webadmin/routes/AliasRoutes.java  |   2 +-
 .../james/webadmin/routes/ForwardRoutes.java       |   2 +-
 .../apache/james/webadmin/routes/GroupsRoutes.java |   2 +-
 .../james/webadmin/routes/SieveQuotaRoutes.java    |   5 +-
 .../james/webadmin/routes/SieveScriptRoutes.java   |   5 +-
 .../apache/james/webadmin/service/UserService.java |  10 +-
 .../james/webadmin/routes/AliasRoutesTest.java     |   7 +-
 .../james/webadmin/routes/ForwardRoutesTest.java   |   9 +-
 .../james/webadmin/routes/GroupsRoutesTest.java    |   2 +-
 .../webadmin/routes/SieveQuotaRoutesTest.java      |   2 +-
 .../webadmin/routes/SieveScriptRoutesTest.java     |   2 +-
 .../james/webadmin/routes/UsersRoutesTest.java     |   5 +-
 .../vault/routes/DeletedMessagesVaultRoutes.java   |   2 +-
 .../webadmin/vault/routes/RestoreService.java      |   4 +-
 .../routes/DeletedMessagesVaultRoutesTest.java     |  12 +-
 .../james/webadmin/routes/UserMailboxesRoutes.java |  16 +-
 .../james/webadmin/routes/UserQuotaRoutes.java     |   6 +-
 .../webadmin/service/UserMailboxesService.java     |  25 +-
 .../routes/EventDeadLettersRoutesTest.java         |   6 +-
 .../webadmin/routes/MalformedUrlRoutesTest.java    |   5 +-
 .../webadmin/routes/ReindexingRoutesTest.java      |  15 +-
 .../webadmin/routes/UserMailboxesRoutesTest.java   |   5 +-
 .../james/webadmin/routes/UserQuotaRoutesTest.java |   8 +-
 .../org/apache/james/utils/IMAPMessageReader.java  |   5 +
 393 files changed, 2574 insertions(+), 2646 deletions(-)

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 274ec02..1d1b08d 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.getUsername().asString());
+            MailboxSession session = mailboxManager.createSystemSession(addedEvent.getUsername());
             MessageManager messageManager = mailboxManager.getMailbox(addedEvent.getMailboxId(), session);
 
             messageManager.setFlags(
diff --git a/examples/custom-listeners/src/test/java/org/apache/james/examples/custom/listeners/SetCustomFlagOnBigMessagesTest.java b/examples/custom-listeners/src/test/java/org/apache/james/examples/custom/listeners/SetCustomFlagOnBigMessagesTest.java
index 7075759..b1ce0bd 100644
--- a/examples/custom-listeners/src/test/java/org/apache/james/examples/custom/listeners/SetCustomFlagOnBigMessagesTest.java
+++ b/examples/custom-listeners/src/test/java/org/apache/james/examples/custom/listeners/SetCustomFlagOnBigMessagesTest.java
@@ -28,6 +28,7 @@ import java.util.stream.Stream;
 
 import javax.mail.Flags;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.DefaultMailboxes;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
@@ -53,7 +54,7 @@ import com.google.common.collect.Streams;
 
 class SetCustomFlagOnBigMessagesTest {
 
-    private static final String USER = "user";
+    private static final Username USER = Username.of("user");
     private static final Event.EventId RANDOM_EVENT_ID = Event.EventId.random();
     private static final MailboxPath INBOX_PATH = MailboxPath.forUser(USER, DefaultMailboxes.INBOX);
 
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
index c298a8f..a69a60c 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
@@ -23,6 +23,7 @@ import java.util.EnumSet;
 import java.util.List;
 import java.util.Optional;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.BadCredentialsException;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MailboxExistsException;
@@ -262,7 +263,7 @@ public interface MailboxManager extends RequestAware, RightManager, MailboxAnnot
     /**
      * Creates a new system session.<br>
      * A system session is intended to be used for programmatic access.<br>
-     * Use {@link #login(String, String)} when accessing this API from a
+     * Use {@link #login(Username, String)} when accessing this API from a
      * protocol.
      * 
      * @param userName
@@ -273,7 +274,7 @@ public interface MailboxManager extends RequestAware, RightManager, MailboxAnnot
      * @throws MailboxException
      *            when the creation fails for other reasons
      */
-    MailboxSession createSystemSession(String userName) throws BadCredentialsException, MailboxException;
+    MailboxSession createSystemSession(Username userName) throws BadCredentialsException, MailboxException;
 
     /**
      * Autenticates the given user against the given password.<br>
@@ -290,7 +291,7 @@ public interface MailboxManager extends RequestAware, RightManager, MailboxAnnot
      * @throws MailboxException
      *            when the creation fails for other reasons
      */
-    MailboxSession login(String userid, String passwd) throws BadCredentialsException, MailboxException;
+    MailboxSession login(Username userid, String passwd) throws BadCredentialsException, MailboxException;
 
     /**
      * Autenticates the given administrator against the given password,
@@ -310,7 +311,7 @@ public interface MailboxManager extends RequestAware, RightManager, MailboxAnnot
      * @throws MailboxException
      *             when the creation fails for other reasons
      */
-    MailboxSession loginAsOtherUser(String adminUserId, String passwd, String otherUserId) throws BadCredentialsException, MailboxException;
+    MailboxSession loginAsOtherUser(Username adminUserId, String passwd, Username otherUserId) throws BadCredentialsException, MailboxException;
 
     /**
      * <p>
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 79770c6..25df2f4 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
@@ -97,20 +97,20 @@ public class MailboxSession {
     private final String otherUsersSpace;
     private final String personalSpace;
     private final SessionId sessionId;
-    private final String userName;
+    private final Username userName;
     private boolean open = true;
     private final List<Locale> localePreferences;
     private final Map<Object, Object> attributes;
     private final char pathSeparator;
     private final SessionType type;
 
-    public MailboxSession(SessionId sessionId, String userName,
+    public MailboxSession(SessionId sessionId, Username userName,
                                 List<Locale> localePreferences, char pathSeparator, SessionType type) {
         this(sessionId, userName, localePreferences, new ArrayList<>(), null, pathSeparator, type);
     }
 
-    public MailboxSession(SessionId sessionId, String userName,
-                                List<Locale> localePreferences, List<String> sharedSpaces, String otherUsersSpace, char pathSeparator, SessionType type) {
+    public MailboxSession(SessionId sessionId, Username userName,
+                          List<Locale> localePreferences, List<String> sharedSpaces, String otherUsersSpace, char pathSeparator, SessionType type) {
         this.sessionId = sessionId;
         this.userName = userName;
         this.otherUsersSpace = otherUsersSpace;
@@ -163,7 +163,7 @@ public class MailboxSession {
      * @return not null
      */
     public Username getUser() {
-        return Username.of(userName);
+        return userName;
     }
 
     /**
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/acl/GroupMembershipResolver.java b/mailbox/api/src/main/java/org/apache/james/mailbox/acl/GroupMembershipResolver.java
index 8f5a285..caab6d5 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/acl/GroupMembershipResolver.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/acl/GroupMembershipResolver.java
@@ -18,6 +18,8 @@
  ****************************************************************/
 package org.apache.james.mailbox.acl;
 
+import org.apache.james.core.Username;
+
 /**
  * An interface for querying group memberships.  
  */
@@ -26,6 +28,6 @@ public interface GroupMembershipResolver {
     /**
      * Tests if the given user is a member of the given group.
      */
-    boolean isMember(String user, String group);
+    boolean isMember(Username user, String group);
 
 }
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/acl/MailboxACLResolver.java b/mailbox/api/src/main/java/org/apache/james/mailbox/acl/MailboxACLResolver.java
index e913ba2..0677c99 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/acl/MailboxACLResolver.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/acl/MailboxACLResolver.java
@@ -20,6 +20,7 @@
 
 package org.apache.james.mailbox.acl;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.UnsupportedRightException;
 import org.apache.james.mailbox.model.MailboxACL;
 
@@ -91,6 +92,6 @@ public interface MailboxACLResolver {
      *            otherwise.
      * @return the rights applicable for the given user and resource.
      */
-    MailboxACL.Rfc4314Rights resolveRights(String requestUser, GroupMembershipResolver groupMembershipResolver, MailboxACL resourceACL, String resourceOwner, boolean resourceOwnerIsGroup) throws UnsupportedRightException;
+    MailboxACL.Rfc4314Rights resolveRights(Username requestUser, GroupMembershipResolver groupMembershipResolver, MailboxACL resourceACL, String resourceOwner, boolean resourceOwnerIsGroup) throws UnsupportedRightException;
 
 }
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/acl/SimpleGroupMembershipResolver.java b/mailbox/api/src/main/java/org/apache/james/mailbox/acl/SimpleGroupMembershipResolver.java
index 95890bf..0fd8659 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/acl/SimpleGroupMembershipResolver.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/acl/SimpleGroupMembershipResolver.java
@@ -23,6 +23,8 @@ package org.apache.james.mailbox.acl;
 import java.util.HashSet;
 import java.util.Set;
 
+import org.apache.james.core.Username;
+
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
 
@@ -34,9 +36,9 @@ public class SimpleGroupMembershipResolver implements GroupMembershipResolver {
 
     public static class Membership {
         private final String group;
-        private final String user;
+        private final Username user;
 
-        public Membership(String user, String group) {
+        public Membership(Username user, String group) {
             this.group = group;
             this.user = user;
         }
@@ -68,12 +70,12 @@ public class SimpleGroupMembershipResolver implements GroupMembershipResolver {
 
     private final Set<Membership> memberships = new HashSet<>(32);
 
-    public void addMembership(String group, String user) {
+    public void addMembership(String group, Username user) {
         memberships.add(new Membership(user, group));
     }
 
     @Override
-    public boolean isMember(String user, String group) {
+    public boolean isMember(Username user, String group) {
         return memberships.contains(new Membership(user, group));
     }
 
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/acl/UnionMailboxACLResolver.java b/mailbox/api/src/main/java/org/apache/james/mailbox/acl/UnionMailboxACLResolver.java
index 498686e..204381f 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/acl/UnionMailboxACLResolver.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/acl/UnionMailboxACLResolver.java
@@ -25,6 +25,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.UnsupportedRightException;
 import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MailboxACL.EntryKey;
@@ -144,7 +145,7 @@ public class UnionMailboxACLResolver implements MailboxACLResolver {
                         /* non null query user is viewed as authenticated */
                         return true;
                     } else if (SpecialName.owner.name().equals(aclKeyName)) {
-                        return (!resourceOwnerIsGroup && queryUserOrGroupName.equals(resourceOwner)) || (resourceOwnerIsGroup && groupMembershipResolver.isMember(queryUserOrGroupName, resourceOwner));
+                        return (!resourceOwnerIsGroup && queryUserOrGroupName.equals(resourceOwner)) || (resourceOwnerIsGroup && groupMembershipResolver.isMember(Username.of(queryUserOrGroupName), resourceOwner));
                     } else {
                         /* should not happen unless the parent if is changed */
                         throw new IllegalStateException("Unexpected " + SpecialName.class.getName() + "." + aclKeyName);
@@ -152,7 +153,7 @@ public class UnionMailboxACLResolver implements MailboxACLResolver {
                 case user:
                     return aclKeyName.equals(queryUserOrGroupName);
                 case group:
-                    return groupMembershipResolver.isMember(queryUserOrGroupName, aclKeyName);
+                    return groupMembershipResolver.isMember(Username.of(queryUserOrGroupName), aclKeyName);
                 default:
                     throw new IllegalStateException("Unexpected " + NameType.class.getName() + "." + aclKeyNameType);
                 }
@@ -290,9 +291,9 @@ public class UnionMailboxACLResolver implements MailboxACLResolver {
     }
 
     @Override
-    public Rfc4314Rights resolveRights(String requestUser, GroupMembershipResolver groupMembershipResolver, MailboxACL resourceACL, String resourceOwner, boolean resourceOwnerIsGroup) throws UnsupportedRightException {
+    public Rfc4314Rights resolveRights(Username requestUser, GroupMembershipResolver groupMembershipResolver, MailboxACL resourceACL, String resourceOwner, boolean resourceOwnerIsGroup) throws UnsupportedRightException {
         Rfc4314Rights[] positiveNegativePair = { MailboxACL.NO_RIGHTS, MailboxACL.NO_RIGHTS };
-        final EntryKey queryKey = requestUser == null ? null : new EntryKey(requestUser, NameType.user, false);
+        final EntryKey queryKey = requestUser == null ? null : EntryKey.createUserEntryKey(requestUser);
         MailboxACL userACL = resourceOwnerIsGroup ? groupGlobalACL : userGlobalACL;
         resolveRights(queryKey, groupMembershipResolver, userACL.getEntries(), resourceOwner, resourceOwnerIsGroup, positiveNegativePair);
 
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/exception/UserDoesNotExistException.java b/mailbox/api/src/main/java/org/apache/james/mailbox/exception/UserDoesNotExistException.java
index 0c5ddf2..1d7be1f 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/exception/UserDoesNotExistException.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/exception/UserDoesNotExistException.java
@@ -19,16 +19,18 @@
 
 package org.apache.james.mailbox.exception;
 
+import org.apache.james.core.Username;
+
 public class UserDoesNotExistException extends MailboxException {
 
-    private final String name;
+    private final Username name;
 
-    public UserDoesNotExistException(String name) {
-        super("User " + name + "does not exist");
+    public UserDoesNotExistException(Username name) {
+        super("User " + name.asString() + "does not exist");
         this.name = name;
     }
 
-    public String getName() {
+    public Username getName() {
         return name;
     }
 }
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/Mailbox.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/Mailbox.java
index 913a401..fef8088 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/Mailbox.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/Mailbox.java
@@ -18,6 +18,7 @@
  ****************************************************************/
 package org.apache.james.mailbox.model;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxUtil;
 
@@ -30,7 +31,7 @@ import com.google.common.base.Objects;
 public class Mailbox {
     private MailboxId id = null;
     private String namespace;
-    private String user;
+    private Username user;
     private String name;
     private final long uidValidity;
     private MailboxACL acl = MailboxACL.EMPTY;
@@ -84,7 +85,7 @@ public class Mailbox {
      * Gets the current user for this mailbox.
      * @return not null
      */
-    public String getUser() {
+    public Username getUser() {
         return user;
     }
 
@@ -92,7 +93,7 @@ public class Mailbox {
      * Sets the current user for this mailbox.
      * @param user not null
      */
-    public void setUser(String user) {
+    public void setUser(Username user) {
         this.user = user;
     }
 
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxACL.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxACL.java
index aceeada..e3f29fb 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxACL.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxACL.java
@@ -33,6 +33,7 @@ import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import org.apache.commons.lang3.tuple.Pair;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.UnsupportedRightException;
 
 import com.github.fge.lambdas.Throwing;
@@ -367,12 +368,12 @@ public class MailboxACL {
             return new EntryKey(name, NameType.group, negative);
         }
 
-        public static EntryKey createUserEntryKey(String name) {
-            return new EntryKey(name, NameType.user, false);
+        public static EntryKey createUserEntryKey(Username name) {
+            return new EntryKey(name.asString(), NameType.user, false);
         }
 
-        public static EntryKey createUserEntryKey(String name, boolean negative) {
-            return new EntryKey(name, NameType.user, negative);
+        public static EntryKey createUserEntryKey(Username name, boolean negative) {
+            return new EntryKey(name.asString(), NameType.user, negative);
         }
 
         private final String name;
@@ -520,7 +521,7 @@ public class MailboxACL {
             private Builder() {
             }
 
-            public Builder forUser(String user) {
+            public Builder forUser(Username user) {
                 key = EntryKey.createUserEntryKey(user);
                 return this;
             }
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxPath.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxPath.java
index 27051e3..5edc9b1 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxPath.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxPath.java
@@ -24,6 +24,7 @@ import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.DefaultMailboxes;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.exception.HasEmptyMailboxNameInHierarchyException;
@@ -42,13 +43,13 @@ public class MailboxPath {
      * session
      */
     public static MailboxPath inbox(MailboxSession session) {
-        return MailboxPath.forUser(session.getUser().asString(), MailboxConstants.INBOX);
+        return MailboxPath.forUser(session.getUser(), MailboxConstants.INBOX);
     }
 
     /**
      * Create a {@link MailboxPath} in the prive namespace of the specified user
      */
-    public static MailboxPath forUser(String username, String mailboxName) {
+    public static MailboxPath forUser(Username username, String mailboxName) {
         return new MailboxPath(MailboxConstants.USER_NAMESPACE, username, mailboxName);
     }
 
@@ -58,10 +59,10 @@ public class MailboxPath {
     public  static final int MAX_MAILBOX_NAME_LENGTH = 200;
 
     private final String namespace;
-    private final String user;
+    private final Username user;
     private final String name;
     
-    public MailboxPath(String namespace, String user, String name) {
+    public MailboxPath(String namespace, Username user, String name) {
         this.namespace = Optional.ofNullable(namespace)
             .filter(s -> !s.isEmpty())
             .orElse(MailboxConstants.USER_NAMESPACE);
@@ -87,7 +88,7 @@ public class MailboxPath {
     /**
      * Get the name of the user who owns the mailbox.
      */
-    public String getUser() {
+    public Username getUser() {
         return user;
     }
 
@@ -100,7 +101,7 @@ public class MailboxPath {
     }
 
     public boolean belongsTo(MailboxSession mailboxSession) {
-        return user.equalsIgnoreCase(mailboxSession.getUser().asString());
+        return user.asString().equalsIgnoreCase(mailboxSession.getUser().asString());//FIXME-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 f4ed134..a149d2e 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
@@ -45,14 +45,14 @@ public class MailboxQuery {
     public static Builder privateMailboxesBuilder(MailboxSession session) {
         return builder()
             .namespace(MailboxConstants.USER_NAMESPACE)
-            .username(session.getUser().asString())
+            .username(session.getUser())
             .matchesAllMailboxNames();
     }
 
     public static class Builder {
         private static final Wildcard DEFAULT_WILDCARD = Wildcard.INSTANCE;
 
-        Optional<String> username;
+        Optional<Username> username;
         Optional<String> namespace;
         Optional<MailboxNameExpression> mailboxNameExpression;
         
@@ -71,7 +71,7 @@ public class MailboxQuery {
             return this;
         }
 
-        public Builder username(String username) {
+        public Builder username(Username username) {
             Preconditions.checkState(!this.username.isPresent());
 
             this.username = Optional.of(username);
@@ -79,7 +79,7 @@ public class MailboxQuery {
         }
 
         public Builder user(Username username) {
-            this.username(username.asString());
+            this.username(username);
             return this;
         }
 
@@ -113,7 +113,7 @@ public class MailboxQuery {
     }
 
     public static class UserBound extends MailboxQuery {
-        private UserBound(String namespace, String user, MailboxNameExpression mailboxNameExpression) {
+        private UserBound(String namespace, Username user, MailboxNameExpression mailboxNameExpression) {
             super(Optional.of(namespace), Optional.of(user), mailboxNameExpression);
             Preconditions.checkNotNull(namespace);
             Preconditions.checkNotNull(user);
@@ -123,19 +123,19 @@ public class MailboxQuery {
             return namespace.get();
         }
 
-        public String getFixedUser() {
+        public Username getFixedUser() {
             return user.get();
         }
     }
 
     protected final Optional<String> namespace;
-    protected final Optional<String> user;
+    protected final Optional<Username> user;
     private final MailboxNameExpression mailboxNameExpression;
 
     /**
      * Constructs an expression determining a set of mailbox names.
      */
-    private MailboxQuery(Optional<String> namespace, Optional<String> user, MailboxNameExpression mailboxNameExpression) {
+    private MailboxQuery(Optional<String> namespace, Optional<Username> user, MailboxNameExpression mailboxNameExpression) {
         this.namespace = namespace;
         this.user = user;
         this.mailboxNameExpression = mailboxNameExpression;
@@ -145,7 +145,7 @@ public class MailboxQuery {
         return namespace;
     }
 
-    public Optional<String> getUser() {
+    public Optional<Username> getUser() {
         return user;
     }
 
@@ -156,7 +156,7 @@ public class MailboxQuery {
     public boolean isPrivateMailboxes(MailboxSession session) {
         Username sessionUsername = session.getUser();
         return namespace.map(MailboxConstants.USER_NAMESPACE::equals).orElse(false)
-            && user.map(Username::of).map(sessionUsername::equals).orElse(false);
+            && user.map(sessionUsername::equals).orElse(false);
     }
 
     @VisibleForTesting
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/AbstractSubscriptionManagerTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/AbstractSubscriptionManagerTest.java
index 8d76f06..f997204 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/AbstractSubscriptionManagerTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/AbstractSubscriptionManagerTest.java
@@ -20,6 +20,7 @@ package org.apache.james.mailbox;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.SubscriptionException;
 import org.junit.jupiter.api.Test;
 
@@ -30,7 +31,7 @@ import org.junit.jupiter.api.Test;
  */
 public abstract class AbstractSubscriptionManagerTest {
 
-    private static final String USER1 = "test";
+    private static final Username USER1 = Username.of("test");
     private static final String MAILBOX1 = "test1";
     private static final String MAILBOX2 = "test2";
     private SubscriptionManager manager;
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 29f5b3e..f58f049 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
@@ -50,8 +50,8 @@ import com.google.common.collect.ImmutableSortedMap;
 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 MailboxPath PATH = MailboxPath.forUser(Username.of("bob"), "mailbox");
+    private static final MailboxPath OTHER_PATH = MailboxPath.forUser(Username.of("bob"), "mailbox.other");
     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);
@@ -59,9 +59,9 @@ class MailboxListenerTest {
     private static final QuotaCount QUOTA_COUNT = QuotaCount.count(34);
     private static final QuotaSize QUOTA_SIZE = QuotaSize.size(48);
     private static final MailboxACL ACL_1 = new MailboxACL(
-        Pair.of(MailboxACL.EntryKey.createUserEntryKey("Bob"), new MailboxACL.Rfc4314Rights(MailboxACL.Right.Administer)));
+        Pair.of(MailboxACL.EntryKey.createUserEntryKey(Username.of("Bob")), new MailboxACL.Rfc4314Rights(MailboxACL.Right.Administer)));
     private static final MailboxACL ACL_2 = new MailboxACL(
-        Pair.of(MailboxACL.EntryKey.createUserEntryKey("Bob"), new MailboxACL.Rfc4314Rights(MailboxACL.Right.Read)));
+        Pair.of(MailboxACL.EntryKey.createUserEntryKey(Username.of("Bob")), new MailboxACL.Rfc4314Rights(MailboxACL.Right.Read)));
     private static final MessageUid UID = MessageUid.of(85);
     private static final MessageMetaData META_DATA = new MessageMetaData(UID, 45, new Flags(), 45, new Date(), TestMessageId.of(75));
 
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerStressTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerStressTest.java
index 92041e2..da25c06 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerStressTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerStressTest.java
@@ -31,6 +31,7 @@ import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.events.EventBus;
 import org.apache.james.mailbox.events.MailboxIdRegistrationKey;
 import org.apache.james.mailbox.events.MailboxListener;
@@ -65,7 +66,7 @@ public abstract class MailboxManagerStressTest<T extends MailboxManager> {
         CountDownLatch latch = new CountDownLatch(APPEND_OPERATIONS);
         ExecutorService pool = Executors.newFixedThreadPool(APPEND_OPERATIONS / 20, threadFactory);
         Collection<MessageUid> uList = new ConcurrentLinkedDeque<>();
-        String username = "username";
+        Username username = Username.of("username");
         MailboxSession session = mailboxManager.createSystemSession(username);
         mailboxManager.startProcessingRequest(session);
         MailboxPath path = MailboxPath.forUser(username, "INBOX");
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
index c68a380..c3a81a1 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
@@ -39,6 +39,7 @@ import java.util.concurrent.CountDownLatch;
 
 import javax.mail.Flags;
 
+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.MailboxManager.MailboxCapabilities;
@@ -98,8 +99,8 @@ import reactor.core.publisher.Mono;
  * 
  */
 public abstract class MailboxManagerTest<T extends MailboxManager> {
-    public static final String USER_1 = "USER_1";
-    public static final String USER_2 = "USER_2";
+    public static final Username USER_1 = Username.of("USER_1");
+    public static final Username USER_2 = Username.of("USER_2");
     private static final int DEFAULT_MAXIMUM_LIMIT = 256;
 
     private T mailboxManager;
@@ -1476,7 +1477,7 @@ public abstract class MailboxManagerTest<T extends MailboxManager> {
 
         @Test
         void listShouldReturnMailboxes() throws Exception {
-            session = mailboxManager.createSystemSession("manager");
+            session = mailboxManager.createSystemSession(Username.of("manager"));
             mailboxManager.startProcessingRequest(session);
 
             DataProvisioner.feedMailboxManager(mailboxManager);
@@ -1551,7 +1552,7 @@ public abstract class MailboxManagerTest<T extends MailboxManager> {
         void createUser1SystemSessionShouldReturnValidSession() throws Exception {
             session = mailboxManager.createSystemSession(USER_1);
 
-            assertThat(session.getUser().asString()).isEqualTo(USER_1);
+            assertThat(session.getUser()).isEqualTo(USER_1);
         }
 
         @Test
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxSessionUtil.java b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxSessionUtil.java
index 82e3013..7b9734f 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxSessionUtil.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxSessionUtil.java
@@ -23,17 +23,18 @@ import java.util.ArrayList;
 import java.util.Locale;
 import java.util.concurrent.ThreadLocalRandom;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.model.MailboxConstants;
 
 import com.google.common.annotations.VisibleForTesting;
 
 public class MailboxSessionUtil {
-    public static MailboxSession create(String username) {
+    public static MailboxSession create(Username username) {
         return create(username, MailboxSession.SessionId.of(ThreadLocalRandom.current().nextLong()));
     }
 
     @VisibleForTesting
-    public static MailboxSession create(String username, MailboxSession.SessionId sessionId) {
+    public static MailboxSession create(Username username, MailboxSession.SessionId sessionId) {
         ArrayList<Locale> locales = new ArrayList<>();
 
         return new MailboxSession(
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 4a591c3..0069e62 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
@@ -32,6 +32,7 @@ import org.junit.jupiter.api.Test;
 import nl.jqno.equalsverifier.EqualsVerifier;
 
 class MessageMoveEventTest {
+    private static final Username USER = Username.of("user@james.org");
 
     @Test
     void shouldRespectBeanContract() {
@@ -48,7 +49,7 @@ class MessageMoveEventTest {
     @Test
     void builderShouldThrowWhenMessageMovesIsNull() {
         assertThatThrownBy(() -> MessageMoveEvent.builder()
-                .session(MailboxSessionUtil.create("user@james.org"))
+                .session(MailboxSessionUtil.create(USER))
                 .build())
             .isInstanceOf(NullPointerException.class);
     }
@@ -56,7 +57,7 @@ class MessageMoveEventTest {
     @Test
     void builderShouldReturnNoopWhenMessagesIsEmpty() {
         assertThat(MessageMoveEvent.builder()
-                .session(MailboxSessionUtil.create("user@james.org"))
+                .session(MailboxSessionUtil.create(USER))
                 .messageMoves(MessageMoves.builder()
                     .previousMailboxIds(TestId.of(1))
                     .targetMailboxIds(TestId.of(2))
@@ -67,7 +68,7 @@ class MessageMoveEventTest {
 
     @Test
     void builderShouldNotBeNoopWhenFieldsAreGiven() {
-        MailboxSession session = MailboxSessionUtil.create("user@james.org");
+        MailboxSession session = MailboxSessionUtil.create(USER);
         MessageMoves messageMoves = MessageMoves.builder()
             .targetMailboxIds(TestId.of(2))
             .previousMailboxIds(TestId.of(1))
@@ -84,8 +85,7 @@ class MessageMoveEventTest {
 
     @Test
     void builderShouldBuildWhenFieldsAreGiven() {
-        String username = "user@james.org";
-        MailboxSession session = MailboxSessionUtil.create(username);
+        MailboxSession session = MailboxSessionUtil.create(USER);
         MessageMoves messageMoves = MessageMoves.builder()
             .targetMailboxIds(TestId.of(2))
             .previousMailboxIds(TestId.of(1))
@@ -99,7 +99,7 @@ class MessageMoveEventTest {
             .build();
 
         SoftAssertions.assertSoftly(softly -> {
-            softly.assertThat(event.getUsername()).isEqualTo(Username.of(username));
+            softly.assertThat(event.getUsername()).isEqualTo(USER);
             softly.assertThat(event.getMessageMoves()).isEqualTo(messageMoves);
             softly.assertThat(event.getMessageIds()).containsExactly(messageId);
         });
@@ -108,7 +108,7 @@ class MessageMoveEventTest {
     @Test
     void isMoveToShouldReturnFalseWhenMailboxIdIsNotInAddedMailboxIds() {
         MessageMoveEvent event = MessageMoveEvent.builder()
-            .session(MailboxSessionUtil.create("user@james.org"))
+            .session(MailboxSessionUtil.create(USER))
             .messageMoves(MessageMoves.builder()
                     .previousMailboxIds(TestId.of(1))
                     .targetMailboxIds(TestId.of(2))
@@ -122,7 +122,7 @@ class MessageMoveEventTest {
     void isMoveToShouldReturnTrueWhenMailboxIdIsInAddedMailboxIds() {
         TestId mailboxId = TestId.of(123);
         MessageMoveEvent event = MessageMoveEvent.builder()
-            .session(MailboxSessionUtil.create("user@james.org"))
+            .session(MailboxSessionUtil.create(USER))
             .messageMoves(MessageMoves.builder()
                 .previousMailboxIds(TestId.of(1))
                 .targetMailboxIds(TestId.of(2), mailboxId)
@@ -135,7 +135,7 @@ class MessageMoveEventTest {
     @Test
     void isMoveFromShouldReturnFalseWhenMailboxIdIsNotInRemovedMailboxIds() {
         MessageMoveEvent event = MessageMoveEvent.builder()
-            .session(MailboxSessionUtil.create("user@james.org"))
+            .session(MailboxSessionUtil.create(USER))
             .messageMoves(MessageMoves.builder()
                     .previousMailboxIds(TestId.of(1))
                     .targetMailboxIds(TestId.of(2))
@@ -149,7 +149,7 @@ class MessageMoveEventTest {
     void isMoveFromShouldReturnTrueWhenMailboxIdIsInRemovedMailboxIds() {
         TestId mailboxId = TestId.of(123);
         MessageMoveEvent event = MessageMoveEvent.builder()
-            .session(MailboxSessionUtil.create("user@james.org"))
+            .session(MailboxSessionUtil.create(USER))
             .messageMoves(MessageMoves.builder()
                 .previousMailboxIds(TestId.of(1), mailboxId)
                 .targetMailboxIds(TestId.of(2))
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/acl/PositiveUserACLDiffTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/acl/PositiveUserACLDiffTest.java
index 257a1a6..eaeef00 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/acl/PositiveUserACLDiffTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/acl/PositiveUserACLDiffTest.java
@@ -20,6 +20,7 @@ package org.apache.james.mailbox.acl;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.UnsupportedRightException;
 import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MailboxACL.Entry;
@@ -30,8 +31,9 @@ import org.junit.jupiter.api.Test;
 
 class PositiveUserACLDiffTest {
 
-    private static final EntryKey USER_ENTRY_KEY = EntryKey.createUserEntryKey("user");
-    private static final EntryKey NEGATIVE_USER_ENTRY_KEY = EntryKey.createUserEntryKey("user", true);
+    private static final Username USER = Username.of("user");
+    private static final EntryKey USER_ENTRY_KEY = EntryKey.createUserEntryKey(USER);
+    private static final EntryKey NEGATIVE_USER_ENTRY_KEY = EntryKey.createUserEntryKey(USER, true);
     private static final EntryKey GROUP_ENTRY_KEY = EntryKey.createGroupEntryKey("group");
     private static final Rfc4314Rights RIGHTS = new Rfc4314Rights(Right.Administer);
 
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/acl/SimpleGroupMembershipResolverTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/acl/SimpleGroupMembershipResolverTest.java
index ece7ff9..4a255b8 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/acl/SimpleGroupMembershipResolverTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/acl/SimpleGroupMembershipResolverTest.java
@@ -22,10 +22,12 @@ package org.apache.james.mailbox.acl;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
+import org.apache.james.core.Username;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
 class SimpleGroupMembershipResolverTest {
+    private static final Username USER = Username.of("user");
 
     private SimpleGroupMembershipResolver simpleGroupMembershipResolver;
 
@@ -37,7 +39,7 @@ class SimpleGroupMembershipResolverTest {
     @Test
     void isMemberShouldReturnFalseWhenEmptyResolver() {
         //When
-        boolean actual = simpleGroupMembershipResolver.isMember("user", "group");
+        boolean actual = simpleGroupMembershipResolver.isMember(USER, "group");
         //Then
         assertThat(actual).isFalse();
     }
@@ -45,9 +47,9 @@ class SimpleGroupMembershipResolverTest {
     @Test
     void isMemberShouldReturnTrueWhenTheSearchedMembershipIsPresent() {
         //Given
-        simpleGroupMembershipResolver.addMembership("group", "user");
+        simpleGroupMembershipResolver.addMembership("group", USER);
         //When
-        boolean actual = simpleGroupMembershipResolver.isMember("user", "group");
+        boolean actual = simpleGroupMembershipResolver.isMember(USER, "group");
         //Then
         assertThat(actual).isTrue();
     }
@@ -55,8 +57,8 @@ class SimpleGroupMembershipResolverTest {
     @Test
     void addMembershipShouldAddAMembershipWhenNonNullUser() {
         //When
-        simpleGroupMembershipResolver.addMembership("group", "user");
-        boolean actual = simpleGroupMembershipResolver.isMember("user", "group");
+        simpleGroupMembershipResolver.addMembership("group", USER);
+        boolean actual = simpleGroupMembershipResolver.isMember(USER, "group");
         //Then
         assertThat(actual).isTrue();
     }
@@ -64,7 +66,7 @@ class SimpleGroupMembershipResolverTest {
     @Test
     void addMembershipShouldAddAMembershipWithANullUser() {
         //Given
-        String userAdded = null;
+        Username userAdded = null;
         //When
         simpleGroupMembershipResolver.addMembership("group", userAdded);
         boolean actual = simpleGroupMembershipResolver.isMember(userAdded, "group");
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/acl/UnionMailboxACLResolverTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/acl/UnionMailboxACLResolverTest.java
index b133994..5961f87 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/acl/UnionMailboxACLResolverTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/acl/UnionMailboxACLResolverTest.java
@@ -22,6 +22,7 @@ package org.apache.james.mailbox.acl;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.UnsupportedRightException;
 import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MailboxACL.Entry;
@@ -36,8 +37,8 @@ class UnionMailboxACLResolverTest {
     private static final String GROUP_1 = "group1";
     private static final String GROUP_2 = "group2";
 
-    private static final String USER_1 = "user1";
-    private static final String USER_2 = "user2";
+    private static final Username USER_1 = Username.of("user1");
+    private static final Username USER_2 = Username.of("user2");
 
     private MailboxACL anybodyRead;
     private MailboxACL anybodyReadNegative;
@@ -101,34 +102,34 @@ class UnionMailboxACLResolverTest {
     @Test
     void testAppliesNullUser() throws UnsupportedRightException {
 
-        assertThat(UnionMailboxACLResolver.applies(user1Key, null, groupMembershipResolver, USER_1, false)).isFalse();
-        assertThat(UnionMailboxACLResolver.applies(user2Key, null, groupMembershipResolver, USER_1, false)).isFalse();
-        assertThat(UnionMailboxACLResolver.applies(group1Key, null, groupMembershipResolver, USER_1, false)).isFalse();
-        assertThat(UnionMailboxACLResolver.applies(group2Key, null, groupMembershipResolver, USER_1, false)).isFalse();
-        assertThat(UnionMailboxACLResolver.applies(MailboxACL.ANYBODY_KEY, null, groupMembershipResolver, USER_1, false)).isTrue();
-        assertThat(UnionMailboxACLResolver.applies(MailboxACL.AUTHENTICATED_KEY, null, groupMembershipResolver, USER_1, false)).isFalse();
-        assertThat(UnionMailboxACLResolver.applies(MailboxACL.OWNER_KEY, null, groupMembershipResolver, USER_1, false)).isFalse();
+        assertThat(UnionMailboxACLResolver.applies(user1Key, null, groupMembershipResolver, USER_1.asString(), false)).isFalse();
+        assertThat(UnionMailboxACLResolver.applies(user2Key, null, groupMembershipResolver, USER_1.asString(), false)).isFalse();
+        assertThat(UnionMailboxACLResolver.applies(group1Key, null, groupMembershipResolver, USER_1.asString(), false)).isFalse();
+        assertThat(UnionMailboxACLResolver.applies(group2Key, null, groupMembershipResolver, USER_1.asString(), false)).isFalse();
+        assertThat(UnionMailboxACLResolver.applies(MailboxACL.ANYBODY_KEY, null, groupMembershipResolver, USER_1.asString(), false)).isTrue();
+        assertThat(UnionMailboxACLResolver.applies(MailboxACL.AUTHENTICATED_KEY, null, groupMembershipResolver, USER_1.asString(), false)).isFalse();
+        assertThat(UnionMailboxACLResolver.applies(MailboxACL.OWNER_KEY, null, groupMembershipResolver, USER_1.asString(), false)).isFalse();
     }
 
     @Test
     void testAppliesUser() throws UnsupportedRightException {
         /* requester is the resource owner */
-        assertThat(UnionMailboxACLResolver.applies(user1Key, user1Key, groupMembershipResolver, USER_1, false)).isTrue();
-        assertThat(UnionMailboxACLResolver.applies(user2Key, user1Key, groupMembershipResolver, USER_1, false)).isFalse();
-        assertThat(UnionMailboxACLResolver.applies(group1Key, user1Key, groupMembershipResolver, USER_1, false)).isTrue();
-        assertThat(UnionMailboxACLResolver.applies(group2Key, user1Key, groupMembershipResolver, USER_1, false)).isFalse();
-        assertThat(UnionMailboxACLResolver.applies(MailboxACL.ANYBODY_KEY, user1Key, groupMembershipResolver, USER_1, false)).isTrue();
-        assertThat(UnionMailboxACLResolver.applies(MailboxACL.AUTHENTICATED_KEY, user1Key, groupMembershipResolver, USER_1, false)).isTrue();
-        assertThat(UnionMailboxACLResolver.applies(MailboxACL.OWNER_KEY, user1Key, groupMembershipResolver, USER_1, false)).isTrue();
+        assertThat(UnionMailboxACLResolver.applies(user1Key, user1Key, groupMembershipResolver, USER_1.asString(), false)).isTrue();
+        assertThat(UnionMailboxACLResolver.applies(user2Key, user1Key, groupMembershipResolver, USER_1.asString(), false)).isFalse();
+        assertThat(UnionMailboxACLResolver.applies(group1Key, user1Key, groupMembershipResolver, USER_1.asString(), false)).isTrue();
+        assertThat(UnionMailboxACLResolver.applies(group2Key, user1Key, groupMembershipResolver, USER_1.asString(), false)).isFalse();
+        assertThat(UnionMailboxACLResolver.applies(MailboxACL.ANYBODY_KEY, user1Key, groupMembershipResolver, USER_1.asString(), false)).isTrue();
+        assertThat(UnionMailboxACLResolver.applies(MailboxACL.AUTHENTICATED_KEY, user1Key, groupMembershipResolver, USER_1.asString(), false)).isTrue();
+        assertThat(UnionMailboxACLResolver.applies(MailboxACL.OWNER_KEY, user1Key, groupMembershipResolver, USER_1.asString(), false)).isTrue();
 
         /* requester is not the resource user */
-        assertThat(UnionMailboxACLResolver.applies(user1Key, user1Key, groupMembershipResolver, USER_2, false)).isTrue();
-        assertThat(UnionMailboxACLResolver.applies(user2Key, user1Key, groupMembershipResolver, USER_2, false)).isFalse();
-        assertThat(UnionMailboxACLResolver.applies(group1Key, user1Key, groupMembershipResolver, USER_2, false)).isTrue();
-        assertThat(UnionMailboxACLResolver.applies(group2Key, user1Key, groupMembershipResolver, USER_2, false)).isFalse();
-        assertThat(UnionMailboxACLResolver.applies(MailboxACL.ANYBODY_KEY, user1Key, groupMembershipResolver, USER_2, false)).isTrue();
-        assertThat(UnionMailboxACLResolver.applies(MailboxACL.AUTHENTICATED_KEY, user1Key, groupMembershipResolver, USER_2, false)).isTrue();
-        assertThat(UnionMailboxACLResolver.applies(MailboxACL.OWNER_KEY, user1Key, groupMembershipResolver, USER_2, false)).isFalse();
+        assertThat(UnionMailboxACLResolver.applies(user1Key, user1Key, groupMembershipResolver, USER_2.asString(), false)).isTrue();
+        assertThat(UnionMailboxACLResolver.applies(user2Key, user1Key, groupMembershipResolver, USER_2.asString(), false)).isFalse();
+        assertThat(UnionMailboxACLResolver.applies(group1Key, user1Key, groupMembershipResolver, USER_2.asString(), false)).isTrue();
+        assertThat(UnionMailboxACLResolver.applies(group2Key, user1Key, groupMembershipResolver, USER_2.asString(), false)).isFalse();
+        assertThat(UnionMailboxACLResolver.applies(MailboxACL.ANYBODY_KEY, user1Key, groupMembershipResolver, USER_2.asString(), false)).isTrue();
+        assertThat(UnionMailboxACLResolver.applies(MailboxACL.AUTHENTICATED_KEY, user1Key, groupMembershipResolver, USER_2.asString(), false)).isTrue();
+        assertThat(UnionMailboxACLResolver.applies(MailboxACL.OWNER_KEY, user1Key, groupMembershipResolver, USER_2.asString(), false)).isFalse();
 
         /* requester member of owner group */
         assertThat(UnionMailboxACLResolver.applies(user1Key, user1Key, groupMembershipResolver, GROUP_1, true)).isTrue();
@@ -149,13 +150,13 @@ class UnionMailboxACLResolverTest {
         assertThat(UnionMailboxACLResolver.applies(MailboxACL.OWNER_KEY, user1Key, groupMembershipResolver, GROUP_2, true)).isFalse();
 
         /* owner query */
-        assertThat(UnionMailboxACLResolver.applies(user1Key, MailboxACL.OWNER_KEY, groupMembershipResolver, USER_1, false)).isFalse();
-        assertThat(UnionMailboxACLResolver.applies(user2Key, MailboxACL.OWNER_KEY, groupMembershipResolver, USER_1, false)).isFalse();
-        assertThat(UnionMailboxACLResolver.applies(group1Key, MailboxACL.OWNER_KEY, groupMembershipResolver, USER_1, false)).isFalse();
-        assertThat(UnionMailboxACLResolver.applies(group2Key, MailboxACL.OWNER_KEY, groupMembershipResolver, USER_1, false)).isFalse();
-        assertThat(UnionMailboxACLResolver.applies(MailboxACL.ANYBODY_KEY, MailboxACL.OWNER_KEY, groupMembershipResolver, USER_1, false)).isTrue();
-        assertThat(UnionMailboxACLResolver.applies(MailboxACL.AUTHENTICATED_KEY, MailboxACL.OWNER_KEY, groupMembershipResolver, USER_1, false)).isTrue();
-        assertThat(UnionMailboxACLResolver.applies(MailboxACL.OWNER_KEY, MailboxACL.OWNER_KEY, groupMembershipResolver, USER_1, false)).isTrue();
+        assertThat(UnionMailboxACLResolver.applies(user1Key, MailboxACL.OWNER_KEY, groupMembershipResolver, USER_1.asString(), false)).isFalse();
+        assertThat(UnionMailboxACLResolver.applies(user2Key, MailboxACL.OWNER_KEY, groupMembershipResolver, USER_1.asString(), false)).isFalse();
+        assertThat(UnionMailboxACLResolver.applies(group1Key, MailboxACL.OWNER_KEY, groupMembershipResolver, USER_1.asString(), false)).isFalse();
+        assertThat(UnionMailboxACLResolver.applies(group2Key, MailboxACL.OWNER_KEY, groupMembershipResolver, USER_1.asString(), false)).isFalse();
+        assertThat(UnionMailboxACLResolver.applies(MailboxACL.ANYBODY_KEY, MailboxACL.OWNER_KEY, groupMembershipResolver, USER_1.asString(), false)).isTrue();
+        assertThat(UnionMailboxACLResolver.applies(MailboxACL.AUTHENTICATED_KEY, MailboxACL.OWNER_KEY, groupMembershipResolver, USER_1.asString(), false)).isTrue();
+        assertThat(UnionMailboxACLResolver.applies(MailboxACL.OWNER_KEY, MailboxACL.OWNER_KEY, groupMembershipResolver, USER_1.asString(), false)).isTrue();
 
     }
 
@@ -163,236 +164,236 @@ class UnionMailboxACLResolverTest {
     void testResolveRightsNullUser() throws UnsupportedRightException {
 
         assertThat(
-            anyoneReadListGlobal.resolveRights(null, groupMembershipResolver, user1Read, USER_1, false)
+            anyoneReadListGlobal.resolveRights(null, groupMembershipResolver, user1Read, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
 
         assertThat(
-            anyoneReadListGlobal.resolveRights(null, groupMembershipResolver, user1Read, USER_1, false)
+            anyoneReadListGlobal.resolveRights(null, groupMembershipResolver, user1Read, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            anyoneReadListGlobal.resolveRights(null, groupMembershipResolver, user1ReadNegative, USER_1, false)
+            anyoneReadListGlobal.resolveRights(null, groupMembershipResolver, user1ReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
 
         assertThat(
-            authenticatedReadListWriteGlobal.resolveRights(null, groupMembershipResolver, user1Read, USER_1, false)
+            authenticatedReadListWriteGlobal.resolveRights(null, groupMembershipResolver, user1Read, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
         assertThat(
-            authenticatedReadListWriteGlobal.resolveRights(null, groupMembershipResolver, user1ReadNegative, USER_1, false)
+            authenticatedReadListWriteGlobal.resolveRights(null, groupMembershipResolver, user1ReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            ownerFullGlobal.resolveRights(null, groupMembershipResolver, user1Read, USER_1, false)
+            ownerFullGlobal.resolveRights(null, groupMembershipResolver, user1Read, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
         assertThat(
-            ownerFullGlobal.resolveRights(null, groupMembershipResolver, user1ReadNegative, USER_1, false)
+            ownerFullGlobal.resolveRights(null, groupMembershipResolver, user1ReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            noGlobals.resolveRights(null, groupMembershipResolver, user1Read, USER_1, false)
+            noGlobals.resolveRights(null, groupMembershipResolver, user1Read, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
         assertThat(
-            noGlobals.resolveRights(null, groupMembershipResolver, user1ReadNegative, USER_1, false)
+            noGlobals.resolveRights(null, groupMembershipResolver, user1ReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            negativeGroup2FullGlobal.resolveRights(null, groupMembershipResolver, user1Read, USER_1, false)
+            negativeGroup2FullGlobal.resolveRights(null, groupMembershipResolver, user1Read, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
         assertThat(
-            negativeGroup2FullGlobal.resolveRights(null, groupMembershipResolver, user1ReadNegative, USER_1, false)
+            negativeGroup2FullGlobal.resolveRights(null, groupMembershipResolver, user1ReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
 
         assertThat(
-            anyoneReadListGlobal.resolveRights(null, groupMembershipResolver, group1Read, USER_1, false)
+            anyoneReadListGlobal.resolveRights(null, groupMembershipResolver, group1Read, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            anyoneReadListGlobal.resolveRights(null, groupMembershipResolver, group1ReadNegative, USER_1, false)
+            anyoneReadListGlobal.resolveRights(null, groupMembershipResolver, group1ReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
 
         assertThat(
-            authenticatedReadListWriteGlobal.resolveRights(null, groupMembershipResolver, group1Read, USER_1, false)
+            authenticatedReadListWriteGlobal.resolveRights(null, groupMembershipResolver, group1Read, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
         assertThat(
-            authenticatedReadListWriteGlobal.resolveRights(null, groupMembershipResolver, group1ReadNegative, USER_1, false)
+            authenticatedReadListWriteGlobal.resolveRights(null, groupMembershipResolver, group1ReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            ownerFullGlobal.resolveRights(null, groupMembershipResolver, group1Read, USER_1, false)
+            ownerFullGlobal.resolveRights(null, groupMembershipResolver, group1Read, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
         assertThat(
-            ownerFullGlobal.resolveRights(null, groupMembershipResolver, group1ReadNegative, USER_1, false)
+            ownerFullGlobal.resolveRights(null, groupMembershipResolver, group1ReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            noGlobals.resolveRights(null, groupMembershipResolver, group1Read, USER_1, false)
+            noGlobals.resolveRights(null, groupMembershipResolver, group1Read, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
         assertThat(
-            noGlobals.resolveRights(null, groupMembershipResolver, group1ReadNegative, USER_1, false)
+            noGlobals.resolveRights(null, groupMembershipResolver, group1ReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            negativeGroup2FullGlobal.resolveRights(null, groupMembershipResolver, group1Read, USER_1, false)
+            negativeGroup2FullGlobal.resolveRights(null, groupMembershipResolver, group1Read, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
         assertThat(
-            negativeGroup2FullGlobal.resolveRights(null, groupMembershipResolver, group1ReadNegative, USER_1, false)
+            negativeGroup2FullGlobal.resolveRights(null, groupMembershipResolver, group1ReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
 
         assertThat(
-            anyoneReadListGlobal.resolveRights(null, groupMembershipResolver, anybodyRead, USER_1, false)
+            anyoneReadListGlobal.resolveRights(null, groupMembershipResolver, anybodyRead, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            anyoneReadListGlobal.resolveRights(null, groupMembershipResolver, anybodyReadNegative, USER_1, false)
+            anyoneReadListGlobal.resolveRights(null, groupMembershipResolver, anybodyReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            authenticatedReadListWriteGlobal.resolveRights(null, groupMembershipResolver, anybodyRead, USER_1, false)
+            authenticatedReadListWriteGlobal.resolveRights(null, groupMembershipResolver, anybodyRead, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            authenticatedReadListWriteGlobal.resolveRights(null, groupMembershipResolver, anybodyReadNegative, USER_1, false)
+            authenticatedReadListWriteGlobal.resolveRights(null, groupMembershipResolver, anybodyReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            ownerFullGlobal.resolveRights(null, groupMembershipResolver, anybodyRead, USER_1, false)
+            ownerFullGlobal.resolveRights(null, groupMembershipResolver, anybodyRead, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            ownerFullGlobal.resolveRights(null, groupMembershipResolver, anybodyReadNegative, USER_1, false)
+            ownerFullGlobal.resolveRights(null, groupMembershipResolver, anybodyReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            noGlobals.resolveRights(null, groupMembershipResolver, anybodyRead, USER_1, false)
+            noGlobals.resolveRights(null, groupMembershipResolver, anybodyRead, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            noGlobals.resolveRights(null, groupMembershipResolver, anybodyReadNegative, USER_1, false)
+            noGlobals.resolveRights(null, groupMembershipResolver, anybodyReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            negativeGroup2FullGlobal.resolveRights(null, groupMembershipResolver, anybodyRead, USER_1, false)
+            negativeGroup2FullGlobal.resolveRights(null, groupMembershipResolver, anybodyRead, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            negativeGroup2FullGlobal.resolveRights(null, groupMembershipResolver, anybodyReadNegative, USER_1, false)
+            negativeGroup2FullGlobal.resolveRights(null, groupMembershipResolver, anybodyReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
 
         assertThat(
-            anyoneReadListGlobal.resolveRights(null, groupMembershipResolver, authenticatedRead, USER_1, false)
+            anyoneReadListGlobal.resolveRights(null, groupMembershipResolver, authenticatedRead, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            anyoneReadListGlobal.resolveRights(null, groupMembershipResolver, authenticatedReadNegative, USER_1, false)
+            anyoneReadListGlobal.resolveRights(null, groupMembershipResolver, authenticatedReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
 
         assertThat(
-            authenticatedReadListWriteGlobal.resolveRights(null, groupMembershipResolver, authenticatedRead, USER_1, false)
+            authenticatedReadListWriteGlobal.resolveRights(null, groupMembershipResolver, authenticatedRead, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
         assertThat(
-            authenticatedReadListWriteGlobal.resolveRights(null, groupMembershipResolver, authenticatedReadNegative, USER_1, false)
+            authenticatedReadListWriteGlobal.resolveRights(null, groupMembershipResolver, authenticatedReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            ownerFullGlobal.resolveRights(null, groupMembershipResolver, authenticatedRead, USER_1, false)
+            ownerFullGlobal.resolveRights(null, groupMembershipResolver, authenticatedRead, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
         assertThat(
-            ownerFullGlobal.resolveRights(null, groupMembershipResolver, authenticatedReadNegative, USER_1, false)
+            ownerFullGlobal.resolveRights(null, groupMembershipResolver, authenticatedReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            noGlobals.resolveRights(null, groupMembershipResolver, authenticatedRead, USER_1, false)
+            noGlobals.resolveRights(null, groupMembershipResolver, authenticatedRead, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
         assertThat(
-            noGlobals.resolveRights(null, groupMembershipResolver, authenticatedReadNegative, USER_1, false)
+            noGlobals.resolveRights(null, groupMembershipResolver, authenticatedReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            negativeGroup2FullGlobal.resolveRights(null, groupMembershipResolver, authenticatedRead, USER_1, false)
+            negativeGroup2FullGlobal.resolveRights(null, groupMembershipResolver, authenticatedRead, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
         assertThat(
-            negativeGroup2FullGlobal.resolveRights(null, groupMembershipResolver, authenticatedReadNegative, USER_1, false)
+            negativeGroup2FullGlobal.resolveRights(null, groupMembershipResolver, authenticatedReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
 
         assertThat(
-            anyoneReadListGlobal.resolveRights(null, groupMembershipResolver, ownerRead, USER_1, false)
+            anyoneReadListGlobal.resolveRights(null, groupMembershipResolver, ownerRead, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            anyoneReadListGlobal.resolveRights(null, groupMembershipResolver, ownerReadNegative, USER_1, false)
+            anyoneReadListGlobal.resolveRights(null, groupMembershipResolver, ownerReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
 
         assertThat(
-            authenticatedReadListWriteGlobal.resolveRights(null, groupMembershipResolver, ownerRead, USER_1, false)
+            authenticatedReadListWriteGlobal.resolveRights(null, groupMembershipResolver, ownerRead, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
         assertThat(
-            authenticatedReadListWriteGlobal.resolveRights(null, groupMembershipResolver, ownerReadNegative, USER_1, false)
+            authenticatedReadListWriteGlobal.resolveRights(null, groupMembershipResolver, ownerReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            ownerFullGlobal.resolveRights(null, groupMembershipResolver, ownerRead, USER_1, false)
+            ownerFullGlobal.resolveRights(null, groupMembershipResolver, ownerRead, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
         assertThat(
-            ownerFullGlobal.resolveRights(null, groupMembershipResolver, ownerReadNegative, USER_1, false)
+            ownerFullGlobal.resolveRights(null, groupMembershipResolver, ownerReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            noGlobals.resolveRights(null, groupMembershipResolver, ownerRead, USER_1, false)
+            noGlobals.resolveRights(null, groupMembershipResolver, ownerRead, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
         assertThat(
-            noGlobals.resolveRights(null, groupMembershipResolver, ownerReadNegative, USER_1, false)
+            noGlobals.resolveRights(null, groupMembershipResolver, ownerReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            negativeGroup2FullGlobal.resolveRights(null, groupMembershipResolver, ownerRead, USER_1, false)
+            negativeGroup2FullGlobal.resolveRights(null, groupMembershipResolver, ownerRead, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
         assertThat(
-            negativeGroup2FullGlobal.resolveRights(null, groupMembershipResolver, ownerReadNegative, USER_1, false)
+            negativeGroup2FullGlobal.resolveRights(null, groupMembershipResolver, ownerReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
@@ -401,23 +402,23 @@ class UnionMailboxACLResolverTest {
     @Test
     void testResolveRightsNullUserGlobals() throws UnsupportedRightException {
         assertThat(
-            anyoneReadListGlobal.resolveRights(null, groupMembershipResolver, user1Read, USER_2, false)
+            anyoneReadListGlobal.resolveRights(null, groupMembershipResolver, user1Read, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            authenticatedReadListWriteGlobal.resolveRights(null, groupMembershipResolver, MailboxACL.EMPTY, USER_2, false)
+            authenticatedReadListWriteGlobal.resolveRights(null, groupMembershipResolver, MailboxACL.EMPTY, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
         assertThat(
-            ownerFullGlobal.resolveRights(null, groupMembershipResolver, MailboxACL.EMPTY, USER_2, false)
+            ownerFullGlobal.resolveRights(null, groupMembershipResolver, MailboxACL.EMPTY, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
         assertThat(
-            noGlobals.resolveRights(null, groupMembershipResolver, MailboxACL.EMPTY, USER_2, false)
+            noGlobals.resolveRights(null, groupMembershipResolver, MailboxACL.EMPTY, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
         assertThat(
-            negativeGroup2FullGlobal.resolveRights(null, groupMembershipResolver, MailboxACL.EMPTY, USER_2, false)
+            negativeGroup2FullGlobal.resolveRights(null, groupMembershipResolver, MailboxACL.EMPTY, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
     }
@@ -427,231 +428,231 @@ class UnionMailboxACLResolverTest {
     void testResolveRightsUserSelfOwner() throws UnsupportedRightException {
 
         assertThat(
-            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, user1Read, USER_1, false)
+            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, user1Read, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, user1ReadNegative, USER_1, false)
+            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, user1ReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, user1Read, USER_1, false)
+            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, user1Read, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, user1ReadNegative, USER_1, false)
+            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, user1ReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, user1Read, USER_1, false)
+            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, user1Read, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, user1ReadNegative, USER_1, false)
+            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, user1ReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            noGlobals.resolveRights(USER_1, groupMembershipResolver, user1Read, USER_1, false)
+            noGlobals.resolveRights(USER_1, groupMembershipResolver, user1Read, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            noGlobals.resolveRights(USER_1, groupMembershipResolver, user1ReadNegative, USER_1, false)
+            noGlobals.resolveRights(USER_1, groupMembershipResolver, user1ReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, user1Read, USER_1, false)
+            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, user1Read, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, user1ReadNegative, USER_1, false)
+            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, user1ReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
 
         assertThat(
-            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, group1Read, USER_1, false)
+            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, group1Read, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, group1ReadNegative, USER_1, false)
+            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, group1ReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, group1Read, USER_1, false)
+            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, group1Read, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, group1ReadNegative, USER_1, false)
+            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, group1ReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, group1Read, USER_1, false)
+            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, group1Read, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, group1ReadNegative, USER_1, false)
+            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, group1ReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            noGlobals.resolveRights(USER_1, groupMembershipResolver, group1Read, USER_1, false)
+            noGlobals.resolveRights(USER_1, groupMembershipResolver, group1Read, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            noGlobals.resolveRights(USER_1, groupMembershipResolver, group1ReadNegative, USER_1, false)
+            noGlobals.resolveRights(USER_1, groupMembershipResolver, group1ReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, group1Read, USER_1, false)
+            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, group1Read, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, group1ReadNegative, USER_1, false)
+            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, group1ReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
 
         assertThat(
-            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, anybodyRead, USER_1, false)
+            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, anybodyRead, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, anybodyReadNegative, USER_1, false)
+            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, anybodyReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, anybodyRead, USER_1, false)
+            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, anybodyRead, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, anybodyReadNegative, USER_1, false)
+            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, anybodyReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, anybodyRead, USER_1, false)
+            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, anybodyRead, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, anybodyReadNegative, USER_1, false)
+            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, anybodyReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            noGlobals.resolveRights(USER_1, groupMembershipResolver, anybodyRead, USER_1, false)
+            noGlobals.resolveRights(USER_1, groupMembershipResolver, anybodyRead, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            noGlobals.resolveRights(USER_1, groupMembershipResolver, anybodyReadNegative, USER_1, false)
+            noGlobals.resolveRights(USER_1, groupMembershipResolver, anybodyReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, anybodyRead, USER_1, false)
+            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, anybodyRead, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, anybodyReadNegative, USER_1, false)
+            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, anybodyReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
 
         assertThat(
-            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, authenticatedRead, USER_1, false)
+            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, authenticatedRead, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, authenticatedReadNegative, USER_1, false)
+            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, authenticatedReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, authenticatedRead, USER_1, false)
+            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, authenticatedRead, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, authenticatedReadNegative, USER_1, false)
+            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, authenticatedReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, authenticatedRead, USER_1, false)
+            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, authenticatedRead, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, authenticatedReadNegative, USER_1, false)
+            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, authenticatedReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            noGlobals.resolveRights(USER_1, groupMembershipResolver, authenticatedRead, USER_1, false)
+            noGlobals.resolveRights(USER_1, groupMembershipResolver, authenticatedRead, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            noGlobals.resolveRights(USER_1, groupMembershipResolver, authenticatedReadNegative, USER_1, false)
+            noGlobals.resolveRights(USER_1, groupMembershipResolver, authenticatedReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, authenticatedRead, USER_1, false)
+            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, authenticatedRead, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, authenticatedReadNegative, USER_1, false)
+            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, authenticatedReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
 
         assertThat(
-            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, ownerRead, USER_1, false)
+            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, ownerRead, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, ownerReadNegative, USER_1, false)
+            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, ownerReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, ownerRead, USER_1, false)
+            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, ownerRead, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, ownerReadNegative, USER_1, false)
+            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, ownerReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, ownerRead, USER_1, false)
+            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, ownerRead, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, ownerReadNegative, USER_1, false)
+            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, ownerReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            noGlobals.resolveRights(USER_1, groupMembershipResolver, ownerRead, USER_1, false)
+            noGlobals.resolveRights(USER_1, groupMembershipResolver, ownerRead, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            noGlobals.resolveRights(USER_1, groupMembershipResolver, ownerReadNegative, USER_1, false)
+            noGlobals.resolveRights(USER_1, groupMembershipResolver, ownerReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, ownerRead, USER_1, false)
+            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, ownerRead, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, ownerReadNegative, USER_1, false)
+            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, ownerReadNegative, USER_1.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
@@ -662,231 +663,231 @@ class UnionMailboxACLResolverTest {
     void testResolveRightsUserNotOwner() throws UnsupportedRightException {
 
         assertThat(
-            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, user1Read, USER_2, false)
+            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, user1Read, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, user1ReadNegative, USER_2, false)
+            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, user1ReadNegative, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, user1Read, USER_2, false)
+            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, user1Read, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, user1ReadNegative, USER_2, false)
+            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, user1ReadNegative, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, user1Read, USER_2, false)
+            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, user1Read, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, user1ReadNegative, USER_2, false)
+            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, user1ReadNegative, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            noGlobals.resolveRights(USER_1, groupMembershipResolver, user1Read, USER_2, false)
+            noGlobals.resolveRights(USER_1, groupMembershipResolver, user1Read, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            noGlobals.resolveRights(USER_1, groupMembershipResolver, user1ReadNegative, USER_2, false)
+            noGlobals.resolveRights(USER_1, groupMembershipResolver, user1ReadNegative, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, user1Read, USER_2, false)
+            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, user1Read, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, user1ReadNegative, USER_2, false)
+            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, user1ReadNegative, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
 
         assertThat(
-            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, group1Read, USER_2, false)
+            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, group1Read, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, group1ReadNegative, USER_2, false)
+            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, group1ReadNegative, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, group1Read, USER_2, false)
+            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, group1Read, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, group1ReadNegative, USER_2, false)
+            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, group1ReadNegative, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, group1Read, USER_2, false)
+            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, group1Read, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, group1ReadNegative, USER_2, false)
+            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, group1ReadNegative, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            noGlobals.resolveRights(USER_1, groupMembershipResolver, group1Read, USER_2, false)
+            noGlobals.resolveRights(USER_1, groupMembershipResolver, group1Read, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            noGlobals.resolveRights(USER_1, groupMembershipResolver, group1ReadNegative, USER_2, false)
+            noGlobals.resolveRights(USER_1, groupMembershipResolver, group1ReadNegative, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, group1Read, USER_2, false)
+            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, group1Read, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, group1ReadNegative, USER_2, false)
+            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, group1ReadNegative, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
 
         assertThat(
-            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, anybodyRead, USER_2, false)
+            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, anybodyRead, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, anybodyReadNegative, USER_2, false)
+            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, anybodyReadNegative, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, anybodyRead, USER_2, false)
+            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, anybodyRead, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, anybodyReadNegative, USER_2, false)
+            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, anybodyReadNegative, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, anybodyRead, USER_2, false)
+            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, anybodyRead, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, anybodyReadNegative, USER_2, false)
+            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, anybodyReadNegative, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            noGlobals.resolveRights(USER_1, groupMembershipResolver, anybodyRead, USER_2, false)
+            noGlobals.resolveRights(USER_1, groupMembershipResolver, anybodyRead, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            noGlobals.resolveRights(USER_1, groupMembershipResolver, anybodyReadNegative, USER_2, false)
+            noGlobals.resolveRights(USER_1, groupMembershipResolver, anybodyReadNegative, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, anybodyRead, USER_2, false)
+            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, anybodyRead, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, anybodyReadNegative, USER_2, false)
+            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, anybodyReadNegative, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
 
         assertThat(
-            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, authenticatedRead, USER_2, false)
+            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, authenticatedRead, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, authenticatedReadNegative, USER_2, false)
+            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, authenticatedReadNegative, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, authenticatedRead, USER_2, false)
+            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, authenticatedRead, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, authenticatedReadNegative, USER_2, false)
+            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, authenticatedReadNegative, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, authenticatedRead, USER_2, false)
+            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, authenticatedRead, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, authenticatedReadNegative, USER_2, false)
+            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, authenticatedReadNegative, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            noGlobals.resolveRights(USER_1, groupMembershipResolver, authenticatedRead, USER_2, false)
+            noGlobals.resolveRights(USER_1, groupMembershipResolver, authenticatedRead, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            noGlobals.resolveRights(USER_1, groupMembershipResolver, authenticatedReadNegative, USER_2, false)
+            noGlobals.resolveRights(USER_1, groupMembershipResolver, authenticatedReadNegative, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, authenticatedRead, USER_2, false)
+            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, authenticatedRead, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, authenticatedReadNegative, USER_2, false)
+            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, authenticatedReadNegative, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
 
         assertThat(
-            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, ownerRead, USER_2, false)
+            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, ownerRead, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, ownerReadNegative, USER_2, false)
+            anyoneReadListGlobal.resolveRights(USER_1, groupMembershipResolver, ownerReadNegative, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
 
         assertThat(
-            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, ownerRead, USER_2, false)
+            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, ownerRead, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
         assertThat(
-            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, ownerReadNegative, USER_2, false)
+            authenticatedReadListWriteGlobal.resolveRights(USER_1, groupMembershipResolver, ownerReadNegative, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isTrue();
 
         assertThat(
-            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, ownerRead, USER_2, false)
+            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, ownerRead, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
         assertThat(
-            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, ownerReadNegative, USER_2, false)
+            ownerFullGlobal.resolveRights(USER_1, groupMembershipResolver, ownerReadNegative, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            noGlobals.resolveRights(USER_1, groupMembershipResolver, ownerRead, USER_2, false)
+            noGlobals.resolveRights(USER_1, groupMembershipResolver, ownerRead, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
         assertThat(
-            noGlobals.resolveRights(USER_1, groupMembershipResolver, ownerReadNegative, USER_2, false)
+            noGlobals.resolveRights(USER_1, groupMembershipResolver, ownerReadNegative, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
         assertThat(
-            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, ownerRead, USER_2, false)
+            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, ownerRead, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
         assertThat(
-            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, ownerReadNegative, USER_2, false)
+            negativeGroup2FullGlobal.resolveRights(USER_1, groupMembershipResolver, ownerReadNegative, USER_2.asString(), false)
                 .contains(MailboxACL.Right.Read))
             .isFalse();
 
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 a106367..a071583 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
@@ -94,7 +94,7 @@ public interface EventBusTestFixture {
 
     MailboxSession.SessionId SESSION_ID = MailboxSession.SessionId.of(42);
     Username USERNAME = Username.of("user");
-    MailboxPath MAILBOX_PATH = new MailboxPath(MailboxConstants.USER_NAMESPACE, "user", "mailboxName");
+    MailboxPath MAILBOX_PATH = new MailboxPath(MailboxConstants.USER_NAMESPACE, USERNAME, "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");
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 b1508f0..d218e8e 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
@@ -102,8 +102,8 @@ interface EventDeadLettersContract {
     int THREAD_COUNT = 10;
     int OPERATION_COUNT = 50;
 
-    MailboxPath MAILBOX_PATH = new MailboxPath(MailboxConstants.USER_NAMESPACE, "user", "mailboxName");
     Username USERNAME = Username.of("user");
+    MailboxPath MAILBOX_PATH = new MailboxPath(MailboxConstants.USER_NAMESPACE, USERNAME, "mailboxName");
     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 48952cf..a919e0f 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
@@ -50,10 +50,10 @@ 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;
-import org.junit.jupiter.api.Test;
 
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.ImmutableSortedMap;
+import org.junit.jupiter.api.Test;
 
 public interface GroupContract {
 
@@ -141,7 +141,8 @@ public interface GroupContract {
 
             eventBus().register(listener, GROUP_A);
 
-            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());
+            Username bob = Username.of("bob");
+            MailboxListener.Added noopEvent = new MailboxListener.Added(MailboxSession.SessionId.of(18), 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 +352,8 @@ public interface GroupContract {
 
             eventBus().register(listener, GROUP_A);
 
-            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());
+            Username bob = Username.of("bob");
+            MailboxListener.Added noopEvent = new MailboxListener.Added(MailboxSession.SessionId.of(18), 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 4ce11b5..6f2ab58 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,8 @@ public interface KeyContract extends EventBusContract {
 
             eventBus().register(listener, KEY_1);
 
-            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());
+            Username bob = Username.of("bob");
+            MailboxListener.Added noopEvent = new MailboxListener.Added(MailboxSession.SessionId.of(18), 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/api/src/test/java/org/apache/james/mailbox/fixture/MailboxFixture.java b/mailbox/api/src/test/java/org/apache/james/mailbox/fixture/MailboxFixture.java
index ea04390..7f164ba 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/fixture/MailboxFixture.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/fixture/MailboxFixture.java
@@ -19,12 +19,13 @@
 
 package org.apache.james.mailbox.fixture;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.model.MailboxPath;
 
 public class MailboxFixture {
-    public static final String ALICE = "alice";
-    public static final String BOB = "bob";
-    public static final String CEDRIC = "cedric";
+    public static final Username ALICE = Username.of("alice");
+    public static final Username BOB = Username.of("bob");
+    public static final Username CEDRIC = Username.of("cedric");
 
     public static final MailboxPath INBOX_ALICE = MailboxPath.forUser(ALICE, "INBOX");
     public static final MailboxPath OUTBOX_ALICE = MailboxPath.forUser(ALICE, "OUTBOX");
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/manager/ManagerTestProvisionner.java b/mailbox/api/src/test/java/org/apache/james/mailbox/manager/ManagerTestProvisionner.java
index 1d793bf..26d36af 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/manager/ManagerTestProvisionner.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/manager/ManagerTestProvisionner.java
@@ -26,6 +26,7 @@ import java.util.Calendar;
 
 import javax.mail.Flags;
 
+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.FlagsBuilder;
@@ -41,9 +42,9 @@ import org.apache.james.mailbox.quota.MaxQuotaManager;
  * Provide an initialized Mailbox environment where we can run managers tests
  */
 public class ManagerTestProvisionner {
-    public static final String USER = "user@domain.org";
+    public static final Username USER = Username.of("user@domain.org");
     public static final String USER_PASS = "pass";
-    public static final String OTHER_USER = "otherUser@domain.org";
+    public static final Username OTHER_USER = Username.of("otherUser@domain.org");
     public static final String OTHER_USER_PASS = "otherPass";
 
     private IntegrationResources<?> integrationResources;
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/mock/DataProvisioner.java b/mailbox/api/src/test/java/org/apache/james/mailbox/mock/DataProvisioner.java
index 674c324..ec59bee 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/mock/DataProvisioner.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/mock/DataProvisioner.java
@@ -22,6 +22,7 @@ import java.util.stream.IntStream;
 
 import javax.mail.Flags;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
@@ -79,10 +80,11 @@ public class DataProvisioner {
     public static void provisionDomain(MailboxManager mailboxManager, String domain) {
         IntStream.range(0, USER_COUNT)
             .mapToObj(i -> "user" + i + "@" + domain)
+            .map(Username::of)
             .forEach(Throwing.consumer(user -> provisionUser(mailboxManager, user)));
     }
 
-    private static void provisionUser(MailboxManager mailboxManager, String user) throws MailboxException {
+    private static void provisionUser(MailboxManager mailboxManager, Username user) throws MailboxException {
         MailboxSession mailboxSession = mailboxManager.createSystemSession(user);
         mailboxManager.startProcessingRequest(mailboxSession);
 
@@ -100,7 +102,7 @@ public class DataProvisioner {
     private static void createSubSubMailboxes(MailboxManager mailboxManager,MailboxSession mailboxSession, String subFolderName) {
         IntStream.range(0, SUB_SUB_MAILBOXES_COUNT)
             .mapToObj(i -> subFolderName + ".SUBSUB_FOLDER_" + i)
-            .forEach(name -> createMailbox(mailboxManager, mailboxSession, MailboxPath.forUser(mailboxSession.getUser().asString(), name)));
+            .forEach(name -> createMailbox(mailboxManager, mailboxSession, MailboxPath.forUser(mailboxSession.getUser(), name)));
 
     }
 
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxACLTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxACLTest.java
index 8282c9d..f299efa 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxACLTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxACLTest.java
@@ -26,6 +26,7 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Properties;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.UnsupportedRightException;
 import org.apache.james.mailbox.model.MailboxACL.Entry;
 import org.apache.james.mailbox.model.MailboxACL.EntryKey;
@@ -41,6 +42,8 @@ class MailboxACLTest {
 
     private static final String USER_1 = "user1";
     private static final String USER_2 = "user2";
+    private static final Username USERNAME_1 = Username.of("user1");
+    private static final Username USERNAME_2 = Username.of("user2");
     private static final boolean NEGATIVE = true;
 
     private static final String ae = "ae";
@@ -221,7 +224,7 @@ class MailboxACLTest {
     @Test
     void applyShouldNotThrowWhenRemovingANonExistingEntry() throws Exception {
         assertThat(MailboxACL.EMPTY
-            .apply(MailboxACL.command().forUser("bob").noRights().asReplacement()))
+            .apply(MailboxACL.command().forUser(Username.of("bob")).noRights().asReplacement()))
             .isEqualTo(MailboxACL.EMPTY);
     }
 
@@ -244,20 +247,20 @@ class MailboxACLTest {
     void usersACLShouldReturnOnlyUsersMapWhenSomeUserEntries() throws Exception {
         MailboxACL.Rfc4314Rights rights = MailboxACL.Rfc4314Rights.fromSerializedRfc4314Rights("aei");
         MailboxACL mailboxACL = new MailboxACL(
-            ImmutableMap.of(EntryKey.createUserEntryKey("user1"), MailboxACL.FULL_RIGHTS,
+            ImmutableMap.of(EntryKey.createUserEntryKey(USERNAME_1), MailboxACL.FULL_RIGHTS,
                 EntryKey.createGroupEntryKey("group"), MailboxACL.FULL_RIGHTS,
-                EntryKey.createUserEntryKey("user2"), rights,
+                EntryKey.createUserEntryKey(USERNAME_2), rights,
                 EntryKey.createGroupEntryKey("group2"), MailboxACL.NO_RIGHTS));
         assertThat(mailboxACL.ofPositiveNameType(NameType.user))
             .containsOnly(
-                MapEntry.entry(EntryKey.createUserEntryKey("user1"), MailboxACL.FULL_RIGHTS),
-                MapEntry.entry(EntryKey.createUserEntryKey("user2"), rights));
+                MapEntry.entry(EntryKey.createUserEntryKey(USERNAME_1), MailboxACL.FULL_RIGHTS),
+                MapEntry.entry(EntryKey.createUserEntryKey(USERNAME_2), rights));
     }
 
     @Test
     void ofPositiveNameTypeShouldFilterOutNegativeEntries() throws Exception {
         MailboxACL mailboxACL = new MailboxACL(
-            ImmutableMap.of(EntryKey.createUserEntryKey("user1", NEGATIVE), MailboxACL.FULL_RIGHTS));
+            ImmutableMap.of(EntryKey.createUserEntryKey(Username.of("user1"), NEGATIVE), MailboxACL.FULL_RIGHTS));
         assertThat(mailboxACL.ofPositiveNameType(NameType.user))
             .isEmpty();
     }
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxAssertTests.java b/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxAssertTests.java
index 62f8bae..b3d4ecf 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxAssertTests.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxAssertTests.java
@@ -21,17 +21,20 @@ package org.apache.james.mailbox.model;
 
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
+import org.apache.james.core.Username;
 import org.junit.jupiter.api.Test;
 
+
 class MailboxAssertTests {
+    private static final Username USER = Username.of("user");
 
     private static final long UID_VALIDITY = 42;
     private static final TestId MAILBOX_ID = TestId.of(24);
 
     @Test
     void isEqualToShouldNotFailWithEqualMailbox() {
-        Mailbox mailbox1 = new Mailbox(MailboxPath.forUser("user", "name"), UID_VALIDITY);
-        Mailbox mailbox2 = new Mailbox(MailboxPath.forUser("user", "name"), UID_VALIDITY);
+        Mailbox mailbox1 = new Mailbox(MailboxPath.forUser(USER, "name"), UID_VALIDITY);
+        Mailbox mailbox2 = new Mailbox(MailboxPath.forUser(USER, "name"), UID_VALIDITY);
         mailbox1.setMailboxId(MAILBOX_ID);
         mailbox2.setMailboxId(MAILBOX_ID);
 
@@ -40,8 +43,8 @@ class MailboxAssertTests {
 
     @Test
     void isEqualToShouldFailWithNotEqualNamespace() {
-        Mailbox mailbox1 = new Mailbox(MailboxPath.forUser("user", "name"), UID_VALIDITY);
-        Mailbox mailbox2 = new Mailbox(new MailboxPath("other_namespace", "user", "name"), UID_VALIDITY);
+        Mailbox mailbox1 = new Mailbox(MailboxPath.forUser(USER, "name"), UID_VALIDITY);
+        Mailbox mailbox2 = new Mailbox(new MailboxPath("other_namespace", USER, "name"), UID_VALIDITY);
         mailbox1.setMailboxId(MAILBOX_ID);
         mailbox2.setMailboxId(MAILBOX_ID);
 
@@ -51,8 +54,8 @@ class MailboxAssertTests {
 
     @Test
     void isEqualToShouldFailWithNotEqualUser() {
-        Mailbox mailbox1 = new Mailbox(MailboxPath.forUser("user", "name"), UID_VALIDITY);
-        Mailbox mailbox2 = new Mailbox(new MailboxPath("namespace", "other_user", "name"), UID_VALIDITY);
+        Mailbox mailbox1 = new Mailbox(MailboxPath.forUser(USER, "name"), UID_VALIDITY);
+        Mailbox mailbox2 = new Mailbox(new MailboxPath("namespace", Username.of("other_user"), "name"), UID_VALIDITY);
         mailbox1.setMailboxId(MAILBOX_ID);
         mailbox2.setMailboxId(MAILBOX_ID);
 
@@ -62,8 +65,8 @@ class MailboxAssertTests {
 
     @Test
     void isEqualToShouldFailWithNotEqualName() {
-        Mailbox mailbox1 = new Mailbox(MailboxPath.forUser("user", "name"), UID_VALIDITY);
-        Mailbox mailbox2 = new Mailbox(new MailboxPath("namespace", "user", "other_name"), UID_VALIDITY);
+        Mailbox mailbox1 = new Mailbox(MailboxPath.forUser(USER, "name"), UID_VALIDITY);
+        Mailbox mailbox2 = new Mailbox(new MailboxPath("namespace", USER, "other_name"), UID_VALIDITY);
         mailbox1.setMailboxId(MAILBOX_ID);
         mailbox2.setMailboxId(MAILBOX_ID);
 
@@ -73,8 +76,8 @@ class MailboxAssertTests {
 
     @Test
     void isEqualToShouldFailWithNotEqualId() {
-        Mailbox mailbox1 = new Mailbox(MailboxPath.forUser("user", "name"), UID_VALIDITY);
-        Mailbox mailbox2 = new Mailbox(MailboxPath.forUser("user", "name"), UID_VALIDITY);
+        Mailbox mailbox1 = new Mailbox(MailboxPath.forUser(USER, "name"), UID_VALIDITY);
+        Mailbox mailbox2 = new Mailbox(MailboxPath.forUser(USER, "name"), UID_VALIDITY);
         mailbox1.setMailboxId(MAILBOX_ID);
         mailbox2.setMailboxId(TestId.of(MAILBOX_ID.id + 1));
 
@@ -84,8 +87,8 @@ class MailboxAssertTests {
 
     @Test
     void isEqualToShouldFailWithNotEqualUidValidity() {
-        Mailbox mailbox1 = new Mailbox(MailboxPath.forUser("user", "name"), UID_VALIDITY);
-        Mailbox mailbox2 = new Mailbox(MailboxPath.forUser("user", "name"), UID_VALIDITY + 1);
+        Mailbox mailbox1 = new Mailbox(MailboxPath.forUser(USER, "name"), UID_VALIDITY);
+        Mailbox mailbox2 = new Mailbox(MailboxPath.forUser(USER, "name"), UID_VALIDITY + 1);
         mailbox1.setMailboxId(MAILBOX_ID);
         mailbox2.setMailboxId(MAILBOX_ID);
 
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxPathTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxPathTest.java
index 321f58f..0e5e887 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxPathTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxPathTest.java
@@ -24,17 +24,19 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatCode;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.DefaultMailboxes;
-import org.junit.jupiter.api.Test;
 import org.apache.james.mailbox.exception.HasEmptyMailboxNameInHierarchyException;
 import org.apache.james.mailbox.exception.MailboxNameException;
 import org.apache.james.mailbox.exception.TooLongMailboxNameException;
+import org.junit.jupiter.api.Test;
 
 import com.google.common.base.Strings;
 
 import nl.jqno.equalsverifier.EqualsVerifier;
 
 class MailboxPathTest {
+    private static final Username USER = Username.of("user");
 
     @Test
     void shouldMatchBeanContract() {
@@ -44,214 +46,214 @@ class MailboxPathTest {
 
     @Test
     void getHierarchyLevelsShouldBeOrdered() {
-        assertThat(MailboxPath.forUser("user", "inbox.folder.subfolder")
+        assertThat(MailboxPath.forUser(USER, "inbox.folder.subfolder")
             .getHierarchyLevels('.'))
             .containsExactly(
-                MailboxPath.forUser("user", "inbox"),
-                MailboxPath.forUser("user", "inbox.folder"),
-                MailboxPath.forUser("user", "inbox.folder.subfolder"));
+                MailboxPath.forUser(USER, "inbox"),
+                MailboxPath.forUser(USER, "inbox.folder"),
+                MailboxPath.forUser(USER, "inbox.folder.subfolder"));
     }
 
     @Test
     void getHierarchyLevelsShouldReturnPathWhenOneLevel() {
-        assertThat(MailboxPath.forUser("user", "inbox")
+        assertThat(MailboxPath.forUser(USER, "inbox")
             .getHierarchyLevels('.'))
             .containsExactly(
-                MailboxPath.forUser("user", "inbox"));
+                MailboxPath.forUser(USER, "inbox"));
     }
 
     @Test
     void getHierarchyLevelsShouldReturnPathWhenEmptyName() {
-        assertThat(MailboxPath.forUser("user", "")
+        assertThat(MailboxPath.forUser(USER, "")
             .getHierarchyLevels('.'))
             .containsExactly(
-                MailboxPath.forUser("user", ""));
+                MailboxPath.forUser(USER, ""));
     }
 
     @Test
     void getHierarchyLevelsShouldReturnPathWhenNullName() {
-        assertThat(MailboxPath.forUser("user", null)
+        assertThat(MailboxPath.forUser(USER, null)
             .getHierarchyLevels('.'))
             .containsExactly(
-                MailboxPath.forUser("user", null));
+                MailboxPath.forUser(USER, null));
     }
 
     @Test
     void sanitizeShouldNotThrowOnNullMailboxName() {
-        assertThat(MailboxPath.forUser("user", null)
+        assertThat(MailboxPath.forUser(USER, null)
             .sanitize('.'))
             .isEqualTo(
-                MailboxPath.forUser("user", null));
+                MailboxPath.forUser(USER, null));
     }
 
     @Test
     void sanitizeShouldReturnEmptyWhenEmpty() {
-        assertThat(MailboxPath.forUser("user", "")
+        assertThat(MailboxPath.forUser(USER, "")
             .sanitize('.'))
             .isEqualTo(
-                MailboxPath.forUser("user", ""));
+                MailboxPath.forUser(USER, ""));
     }
 
     @Test
     void sanitizeShouldRemoveMaximumOneTrailingDelimiterWhenAlone() {
-        assertThat(MailboxPath.forUser("user", ".")
+        assertThat(MailboxPath.forUser(USER, ".")
             .sanitize('.'))
             .isEqualTo(
-                MailboxPath.forUser("user", ""));
+                MailboxPath.forUser(USER, ""));
     }
 
     @Test
     void sanitizeShouldPreserveHeadingDelimiter() {
-        assertThat(MailboxPath.forUser("user", ".a")
+        assertThat(MailboxPath.forUser(USER, ".a")
             .sanitize('.'))
             .isEqualTo(
-                MailboxPath.forUser("user", ".a"));
+                MailboxPath.forUser(USER, ".a"));
     }
 
     @Test
     void sanitizeShouldRemoveTrailingDelimiter() {
-        assertThat(MailboxPath.forUser("user", "a.")
+        assertThat(MailboxPath.forUser(USER, "a.")
             .sanitize('.'))
             .isEqualTo(
-                MailboxPath.forUser("user", "a"));
+                MailboxPath.forUser(USER, "a"));
     }
 
     @Test
     void sanitizeShouldRemoveMaximumOneTrailingDelimiter() {
-        assertThat(MailboxPath.forUser("user", "a..")
+        assertThat(MailboxPath.forUser(USER, "a..")
             .sanitize('.'))
             .isEqualTo(
-                MailboxPath.forUser("user", "a."));
+                MailboxPath.forUser(USER, "a."));
     }
 
     @Test
     void sanitizeShouldPreserveRedundantDelimiters() {
-        assertThat(MailboxPath.forUser("user", "a..a")
+        assertThat(MailboxPath.forUser(USER, "a..a")
             .sanitize('.'))
             .isEqualTo(
-                MailboxPath.forUser("user", "a..a"));
+                MailboxPath.forUser(USER, "a..a"));
     }
 
     @Test
     void hasEmptyNameInHierarchyShouldBeFalseIfSingleLevelPath() {
-        assertThat(MailboxPath.forUser("user", "a")
+        assertThat(MailboxPath.forUser(USER, "a")
             .hasEmptyNameInHierarchy('.'))
             .isFalse();
     }
 
     @Test
     void hasEmptyNameInHierarchyShouldBeFalseIfNestedLevelWithNonEmptyNames() {
-        assertThat(MailboxPath.forUser("user", "a.b.c")
+        assertThat(MailboxPath.forUser(USER, "a.b.c")
             .hasEmptyNameInHierarchy('.'))
             .isFalse();
     }
 
     @Test
     void hasEmptyNameInHierarchyShouldBeTrueIfEmptyPath() {
-        assertThat(MailboxPath.forUser("user", "")
+        assertThat(MailboxPath.forUser(USER, "")
             .hasEmptyNameInHierarchy('.'))
             .isTrue();
     }
 
     @Test
     void hasEmptyNameInHierarchyShouldBeTrueIfPathWithTwoEmptyNames() {
-        assertThat(MailboxPath.forUser("user", ".")
+        assertThat(MailboxPath.forUser(USER, ".")
             .hasEmptyNameInHierarchy('.'))
             .isTrue();
     }
 
     @Test
     void hasEmptyNameInHierarchyShouldBeTrueIfPathWithAnEmptyNameBetweenTwoNames() {
-        assertThat(MailboxPath.forUser("user", "a..b")
+        assertThat(MailboxPath.forUser(USER, "a..b")
             .hasEmptyNameInHierarchy('.'))
             .isTrue();
     }
 
     @Test
     void hasEmptyNameInHierarchyShouldBeTrueIfPathWithHeadingEmptyNames() {
-        assertThat(MailboxPath.forUser("user", "..a")
+        assertThat(MailboxPath.forUser(USER, "..a")
             .hasEmptyNameInHierarchy('.'))
             .isTrue();
     }
 
     @Test
     void hasEmptyNameInHierarchyShouldBeTrueIfPathWithATrailingEmptyName() {
-        assertThat(MailboxPath.forUser("user", "a.")
+        assertThat(MailboxPath.forUser(USER, "a.")
             .hasEmptyNameInHierarchy('.'))
             .isTrue();
     }
 
     @Test
     void hasEmptyNameInHierarchyShouldBeTrueIfPathWithTrailingEmptyNames() {
-        assertThat(MailboxPath.forUser("user", "a..")
+        assertThat(MailboxPath.forUser(USER, "a..")
             .hasEmptyNameInHierarchy('.'))
             .isTrue();
     }
 
     @Test
     void assertAcceptableShouldThrowOnDoubleSeparator() {
-        assertThatThrownBy(() -> MailboxPath.forUser("user", "a..b")
+        assertThatThrownBy(() -> MailboxPath.forUser(USER, "a..b")
                 .assertAcceptable('.'))
             .isInstanceOf(HasEmptyMailboxNameInHierarchyException.class);
     }
 
     @Test
     void assertAcceptableShouldThrowOnAnd() {
-        assertThatThrownBy(() -> MailboxPath.forUser("user", "a&b")
+        assertThatThrownBy(() -> MailboxPath.forUser(USER, "a&b")
                 .assertAcceptable('.'))
             .isInstanceOf(MailboxNameException.class);
     }
 
     @Test
     void assertAcceptableShouldThrowOnSharp() {
-        assertThatThrownBy(() -> MailboxPath.forUser("user", "a#b")
+        assertThatThrownBy(() -> MailboxPath.forUser(USER, "a#b")
                 .assertAcceptable('.'))
             .isInstanceOf(MailboxNameException.class);
     }
 
     @Test
     void assertAcceptableShouldThrowOnPercent() {
-        assertThatThrownBy(() -> MailboxPath.forUser("user", "a%b")
+        assertThatThrownBy(() -> MailboxPath.forUser(USER, "a%b")
                 .assertAcceptable('.'))
             .isInstanceOf(MailboxNameException.class);
     }
 
     @Test
     void assertAcceptableShouldThrowOnWildcard() {
-        assertThatThrownBy(() -> MailboxPath.forUser("user", "a*b")
+        assertThatThrownBy(() -> MailboxPath.forUser(USER, "a*b")
                 .assertAcceptable('.'))
             .isInstanceOf(MailboxNameException.class);
     }
 
     @Test
     void assertAcceptableShouldThrowOnTooLongMailboxName() {
-        assertThatThrownBy(() -> MailboxPath.forUser("user", Strings.repeat("a", 201))
+        assertThatThrownBy(() -> MailboxPath.forUser(USER, Strings.repeat("a", 201))
                 .assertAcceptable('.'))
             .isInstanceOf(TooLongMailboxNameException.class);
     }
 
     @Test
     void assertAcceptableShouldNotThrowOnNotTooLongMailboxName() {
-        assertThatCode(() -> MailboxPath.forUser("user", Strings.repeat("a", 200))
+        assertThatCode(() -> MailboxPath.forUser(USER, Strings.repeat("a", 200))
                 .assertAcceptable('.'))
             .doesNotThrowAnyException();
     }
 
     @Test
     void isInboxShouldReturnTrueWhenINBOX() {
-        MailboxPath mailboxPath = new MailboxPath(MailboxConstants.USER_NAMESPACE, "user", DefaultMailboxes.INBOX);
+        MailboxPath mailboxPath = new MailboxPath(MailboxConstants.USER_NAMESPACE, USER, DefaultMailboxes.INBOX);
         assertThat(mailboxPath.isInbox()).isTrue();
     }
 
     @Test
     void isInboxShouldReturnTrueWhenINBOXWithOtherCase() {
-        MailboxPath mailboxPath = new MailboxPath(MailboxConstants.USER_NAMESPACE, "user", "InBoX");
+        MailboxPath mailboxPath = new MailboxPath(MailboxConstants.USER_NAMESPACE, USER, "InBoX");
         assertThat(mailboxPath.isInbox()).isTrue();
     }
 
     @Test
     void isInboxShouldReturnFalseWhenOtherThanInbox() {
-        MailboxPath mailboxPath = new MailboxPath(MailboxConstants.USER_NAMESPACE, "user", DefaultMailboxes.ARCHIVE);
+        MailboxPath mailboxPath = new MailboxPath(MailboxConstants.USER_NAMESPACE, USER, DefaultMailboxes.ARCHIVE);
         assertThat(mailboxPath.isInbox()).isFalse();
     }
 }
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/model/search/MailboxQueryTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/model/search/MailboxQueryTest.java
index 664fa4c..b3d6a89 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/model/search/MailboxQueryTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/model/search/MailboxQueryTest.java
@@ -24,6 +24,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatCode;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.search.MailboxQuery.Builder;
 import org.junit.jupiter.api.BeforeEach;
@@ -32,13 +33,13 @@ import org.junit.jupiter.api.Test;
 import nl.jqno.equalsverifier.EqualsVerifier;
 
 class MailboxQueryTest {
-    private static final String CURRENT_USER = "user";
+    private static final Username CURRENT_USER = Username.of("user");
 
     private MailboxPath mailboxPath;
 
     @BeforeEach
     void setUp() {
-        mailboxPath = new MailboxPath("namespace", "user", "name");
+        mailboxPath = new MailboxPath("namespace", CURRENT_USER, "name");
     }
 
     @Test
@@ -59,10 +60,10 @@ class MailboxQueryTest {
 
     @Test
     void buildShouldConstructMailboxPathWhenPrivateUserMailboxes() {
-        MailboxPath expected = MailboxPath.forUser("user", "");
+        MailboxPath expected = MailboxPath.forUser(CURRENT_USER, "");
 
         MailboxQuery actual = MailboxQuery.builder()
-                .username("user")
+                .username(CURRENT_USER)
                 .privateNamespace()
                 .build();
 
@@ -74,7 +75,7 @@ class MailboxQueryTest {
     @Test
     void buildShouldMatchAllValuesWhenPrivateUserMailboxes() {
         Builder testee = MailboxQuery.builder()
-                .username("user")
+                .username(CURRENT_USER)
                 .privateNamespace();
 
         MailboxQuery actual = testee.build();
@@ -95,7 +96,7 @@ class MailboxQueryTest {
     void builderShouldThrowWhenBaseAndUsernameGiven() {
         assertThatThrownBy(() -> MailboxQuery.builder()
                 .userAndNamespaceFrom(mailboxPath)
-                .username("user"))
+                .username(CURRENT_USER))
             .isInstanceOf(IllegalStateException.class);
     }
 
@@ -139,7 +140,7 @@ class MailboxQueryTest {
 
     @Test
     void belongsToNamespaceAndUserShouldReturnTrueWithIdenticalMailboxesWithNullNamespace() {
-        MailboxPath mailboxPath = new MailboxPath(null, "user", "name");
+        MailboxPath mailboxPath = new MailboxPath(null, CURRENT_USER, "name");
 
         MailboxQuery mailboxQuery = MailboxQuery.builder()
             .userAndNamespaceFrom(mailboxPath)
@@ -175,7 +176,7 @@ class MailboxQueryTest {
             .userAndNamespaceFrom(new MailboxPath("namespace", CURRENT_USER, "name"))
             .build();
 
-        assertThat(mailboxQuery.belongsToRequestedNamespaceAndUser(new MailboxPath("namespace", CURRENT_USER + "2", "name")))
+        assertThat(mailboxQuery.belongsToRequestedNamespaceAndUser(new MailboxPath("namespace", Username.of("user2"), "name")))
             .isFalse();
     }
 
@@ -185,7 +186,7 @@ class MailboxQueryTest {
             .userAndNamespaceFrom(new MailboxPath("namespace", CURRENT_USER, "name"))
             .build();
 
-        assertThat(mailboxQuery.belongsToRequestedNamespaceAndUser(new MailboxPath("namespace", "other", "name")))
+        assertThat(mailboxQuery.belongsToRequestedNamespaceAndUser(new MailboxPath("namespace", Username.of("other"), "name")))
             .isFalse();
     }
 }
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 8a5cf6d..61a699d 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
@@ -85,7 +85,7 @@ public class DefaultMailboxBackup implements MailboxBackup {
 
     @Override
     public void backupAccount(Username username, OutputStream destination) throws IOException, MailboxException {
-        MailboxSession session = mailboxManager.createSystemSession(username.asString());
+        MailboxSession session = mailboxManager.createSystemSession(username);
         List<MailAccountContent> accountContents = getAccountContentForUser(session);
         List<MailboxWithAnnotations> mailboxes = accountContents.stream()
             .map(MailAccountContent::getMailboxWithAnnotations)
@@ -96,7 +96,7 @@ public class DefaultMailboxBackup implements MailboxBackup {
     }
 
     private boolean isAccountNonEmpty(Username username) throws BadCredentialsException, MailboxException, IOException {
-        MailboxSession session = mailboxManager.createSystemSession(username.asString());
+        MailboxSession session = mailboxManager.createSystemSession(username);
         return getAccountContentForUser(session)
             .stream()
             .findFirst()
@@ -110,13 +110,13 @@ public class DefaultMailboxBackup implements MailboxBackup {
                 return Mono.just(BackupStatus.NON_EMPTY_RECEIVER_ACCOUNT);
             }
         } catch (Exception e) {
-            LOGGER.error("Error during account restoration for user : " + username, e);
+            LOGGER.error("Error during account restoration for user : " + username.asString(), e);
             return Mono.just(BackupStatus.FAILED);
         }
 
         return Mono.fromRunnable(Throwing.runnable(() -> archiveRestorer.restore(username, source)).sneakyThrow())
             .subscribeOn(Schedulers.boundedElastic())
-            .doOnError(e -> LOGGER.error("Error during account restoration for user : " + username, e))
+            .doOnError(e -> LOGGER.error("Error during account restoration for user : " + username.asString(), 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/ZipMailArchiveRestorer.java b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/ZipMailArchiveRestorer.java
index 3197fb4..07c0e82 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
@@ -54,7 +54,7 @@ public class ZipMailArchiveRestorer implements MailArchiveRestorer {
     }
 
     public void restore(Username username, InputStream source) throws MailboxException, IOException {
-        MailboxSession session = mailboxManager.createSystemSession(username.asString());
+        MailboxSession session = mailboxManager.createSystemSession(username);
         restoreEntries(source, session);
     }
 
@@ -95,7 +95,7 @@ public class ZipMailArchiveRestorer implements MailArchiveRestorer {
 
     private Optional<ImmutablePair<SerializedMailboxId, MessageManager>> restoreMailboxEntry(MailboxSession session,
                                                                                              MailboxWithAnnotationsArchiveEntry mailboxWithAnnotationsArchiveEntry) throws MailboxException {
-        MailboxPath mailboxPath = MailboxPath.forUser(session.getUser().asString(), mailboxWithAnnotationsArchiveEntry.getMailboxName());
+        MailboxPath mailboxPath = MailboxPath.forUser(session.getUser(), mailboxWithAnnotationsArchiveEntry.getMailboxName());
         Optional<MailboxId> newMailboxId = mailboxManager.createMailbox(mailboxPath, session);
         mailboxManager.updateAnnotations(mailboxPath, session, mailboxWithAnnotationsArchiveEntry.getAnnotations());
         return newMailboxId.map(Throwing.<MailboxId, ImmutablePair<SerializedMailboxId, MessageManager>>function(newId ->
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 fb70c2d..ec97990 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
@@ -47,11 +47,11 @@ import com.google.common.collect.ImmutableList;
 
 public interface MailboxMessageFixture {
 
-    String USER = "user";
-    String OTHER_USER = "otherUser";
+    Username USER = Username.of("user");
+    Username OTHER_USER = Username.of("otherUser");
 
-    Username USERNAME_1 = Username.of(USER);
-    Username USERNAME_2 = Username.of(OTHER_USER);
+    Username USERNAME_1 = USER;
+    Username USERNAME_2 = OTHER_USER;
 
     String DATE_STRING_1 = "2018-02-15T15:54:02Z";
     String DATE_STRING_2 = "2018-03-15T15:54:02Z";
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapper.java
index 449a639..fddf40f 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapper.java
@@ -25,6 +25,7 @@ import java.util.List;
 import javax.inject.Inject;
 
 import org.apache.james.blob.api.BlobStore;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentDAOV2.DAOAttachment;
 import org.apache.james.mailbox.exception.AttachmentNotFoundException;
 import org.apache.james.mailbox.exception.MailboxException;
@@ -32,7 +33,6 @@ 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.AttachmentMapper;
-import org.apache.james.mailbox.store.mail.model.Username;
 import org.apache.james.util.ReactorUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentOwnerDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentOwnerDAO.java
index d994881..8e94a2b 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentOwnerDAO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentOwnerDAO.java
@@ -31,8 +31,8 @@ import static org.apache.james.mailbox.cassandra.table.CassandraAttachmentOwnerT
 import javax.inject.Inject;
 
 import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.model.AttachmentId;
-import org.apache.james.mailbox.store.mail.model.Username;
 
 import com.datastax.driver.core.PreparedStatement;
 import com.datastax.driver.core.Row;
@@ -72,7 +72,7 @@ public class CassandraAttachmentOwnerDAO {
         return executor.executeVoid(
             addStatement.bind()
                 .setUUID(ID, attachmentId.asUUID())
-                .setString(OWNER, owner.getValue()));
+                .setString(OWNER, owner.asString()));
     }
 
     public Flux<Username> retrieveOwners(AttachmentId attachmentId) {
@@ -83,6 +83,6 @@ public class CassandraAttachmentOwnerDAO {
     }
 
     private Username toOwner(Row row) {
-        return Username.fromRawValue(row.getString(OWNER));
+        return Username.of(row.getString(OWNER));
     }
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAO.java
index daa9a9e..1fd07a7 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAO.java
@@ -37,6 +37,7 @@ import javax.inject.Inject;
 import org.apache.james.backends.cassandra.init.CassandraTypesProvider;
 import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.mail.utils.MailboxBaseTupleUtil;
 import org.apache.james.mailbox.cassandra.table.CassandraMailboxTable;
@@ -147,7 +148,7 @@ public class CassandraMailboxDAO {
         return new Mailbox(
             new MailboxPath(
                 row.getUDTValue(MAILBOX_BASE).getString(CassandraMailboxTable.MailboxBase.NAMESPACE),
-                row.getUDTValue(MAILBOX_BASE).getString(CassandraMailboxTable.MailboxBase.USER),
+                Username.of(row.getUDTValue(MAILBOX_BASE).getString(CassandraMailboxTable.MailboxBase.USER)),
                 row.getString(NAME)),
             row.getLong(UIDVALIDITY));
     }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
index 06d5246..56b32d3 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
@@ -29,6 +29,7 @@ import java.util.stream.Collectors;
 import javax.inject.Inject;
 
 import org.apache.commons.lang3.tuple.Pair;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.acl.ACLDiff;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.exception.MailboxException;
@@ -260,7 +261,7 @@ public class CassandraMailboxMapper implements MailboxMapper {
     }
 
     @Override
-    public List<Mailbox> findNonPersonalMailboxes(String userName, Right right) {
+    public List<Mailbox> findNonPersonalMailboxes(Username userName, Right right) {
         return userMailboxRightsDAO.listRightsForUser(userName)
             .filter(mailboxId -> authorizedMailbox(mailboxId.getRight(), right))
             .map(Pair::getLeft)
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAO.java
index 1eee863..72e7d78 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAO.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.mailbox.cassandra.mail;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.model.MailboxPath;
 
@@ -29,7 +30,7 @@ public interface CassandraMailboxPathDAO {
 
     Mono<CassandraIdAndPath> retrieveId(MailboxPath mailboxPath);
 
-    Flux<CassandraIdAndPath> listUserMailboxes(String namespace, String user);
+    Flux<CassandraIdAndPath> listUserMailboxes(String namespace, Username user);
 
     void logGhostMailboxSuccess(CassandraIdAndPath value);
 
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOImpl.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOImpl.java
index 48a245c..a10d94c 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOImpl.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOImpl.java
@@ -36,6 +36,7 @@ import javax.inject.Inject;
 import org.apache.james.backends.cassandra.init.CassandraTypesProvider;
 import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.cassandra.GhostMailbox;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.mail.utils.MailboxBaseTupleUtil;
@@ -134,7 +135,7 @@ public class CassandraMailboxPathDAOImpl implements CassandraMailboxPathDAO {
     }
 
     @Override
-    public Flux<CassandraIdAndPath> listUserMailboxes(String namespace, String user) {
+    public Flux<CassandraIdAndPath> listUserMailboxes(String namespace, Username user) {
         return cassandraAsyncExecutor.execute(
             selectAllForUser.bind()
                 .setUDTValue(NAMESPACE_AND_USER, mailboxBaseTupleUtil.createMailboxBaseUDT(namespace, user)))
@@ -181,7 +182,7 @@ public class CassandraMailboxPathDAOImpl implements CassandraMailboxPathDAO {
         return new CassandraIdAndPath(
             CassandraId.of(row.getUUID(MAILBOX_ID)),
             new MailboxPath(row.getUDTValue(NAMESPACE_AND_USER).getString(CassandraMailboxTable.MailboxBase.NAMESPACE),
-                row.getUDTValue(NAMESPACE_AND_USER).getString(CassandraMailboxTable.MailboxBase.USER),
+                Username.of(row.getUDTValue(NAMESPACE_AND_USER).getString(CassandraMailboxTable.MailboxBase.USER)),
                 row.getString(MAILBOX_NAME)));
     }
 
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathV2DAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathV2DAO.java
index eb47783..f736ef0 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathV2DAO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathV2DAO.java
@@ -35,6 +35,7 @@ import javax.inject.Inject;
 
 import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.cassandra.GhostMailbox;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.model.MailboxPath;
@@ -114,7 +115,7 @@ public class CassandraMailboxPathV2DAO implements CassandraMailboxPathDAO {
     }
 
     @Override
-    public Flux<CassandraIdAndPath> listUserMailboxes(String namespace, String user) {
+    public Flux<CassandraIdAndPath> listUserMailboxes(String namespace, Username user) {
         return cassandraAsyncExecutor.execute(
             selectAll.bind()
                 .setString(NAMESPACE, namespace)
@@ -161,7 +162,7 @@ public class CassandraMailboxPathV2DAO implements CassandraMailboxPathDAO {
         return new CassandraIdAndPath(
             CassandraId.of(row.getUUID(MAILBOX_ID)),
             new MailboxPath(row.getString(NAMESPACE),
-                row.getString(USER),
+                Username.of(row.getString(USER)),
                 row.getString(MAILBOX_NAME)));
     }
 
@@ -182,10 +183,10 @@ public class CassandraMailboxPathV2DAO implements CassandraMailboxPathDAO {
             .setString(MAILBOX_NAME, mailboxPath.getName()));
     }
 
-    private String sanitizeUser(String user) {
+    private String sanitizeUser(Username user) {
         if (user == null) {
             return "";
         }
-        return user;
+        return user.asString();
     }
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraUserMailboxRightsDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraUserMailboxRightsDAO.java
index ff54813..035fd9e 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraUserMailboxRightsDAO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraUserMailboxRightsDAO.java
@@ -35,6 +35,7 @@ import javax.inject.Inject;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.acl.ACLDiff;
 import org.apache.james.mailbox.acl.PositiveUserACLDiff;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
@@ -124,19 +125,19 @@ public class CassandraUserMailboxRightsDAO {
             .then();
     }
 
-    public Mono<Optional<Rfc4314Rights>> retrieve(String userName, CassandraId mailboxId) {
+    public Mono<Optional<Rfc4314Rights>> retrieve(Username userName, CassandraId mailboxId) {
         return cassandraAsyncExecutor.executeSingleRowOptional(
             select.bind()
-                .setString(USER_NAME, userName)
+                .setString(USER_NAME, userName.asString())
                 .setUUID(MAILBOX_ID, mailboxId.asUuid()))
             .map(rowOptional ->
                 rowOptional.map(Throwing.function(row -> Rfc4314Rights.fromSerializedRfc4314Rights(row.getString(RIGHTS)))));
     }
 
-    public Flux<Pair<CassandraId, Rfc4314Rights>> listRightsForUser(String userName) {
+    public Flux<Pair<CassandraId, Rfc4314Rights>> listRightsForUser(Username userName) {
         return cassandraAsyncExecutor.execute(
             selectUser.bind()
-                .setString(USER_NAME, userName))
+                .setString(USER_NAME, userName.asString()))
             .flatMapMany(cassandraUtils::convertToFlux)
             .map(Throwing.function(this::toPair));
     }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTaskRunner.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTaskRunner.java
index 4ce86ea..794c2e6 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTaskRunner.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTaskRunner.java
@@ -21,6 +21,7 @@ package org.apache.james.mailbox.cassandra.mail.task;
 
 import javax.inject.Inject;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.acl.ACLDiff;
@@ -51,7 +52,7 @@ public class MailboxMergingTaskRunner {
 
     @Inject
     public MailboxMergingTaskRunner(MailboxManager mailboxManager, StoreMessageIdManager messageIdManager, CassandraMessageIdDAO cassandraMessageIdDAO, CassandraMailboxDAO mailboxDAO, CassandraUserMailboxRightsDAO rightsDAO, CassandraACLMapper cassandraACLMapper) throws MailboxException {
-        this.mailboxSession = mailboxManager.createSystemSession("task");
+        this.mailboxSession = mailboxManager.createSystemSession(Username.of("task"));
         this.messageIdManager = messageIdManager;
         this.cassandraMessageIdDAO = cassandraMessageIdDAO;
         this.mailboxDAO = mailboxDAO;
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/utils/MailboxBaseTupleUtil.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/utils/MailboxBaseTupleUtil.java
index 3e65457..4a1bba8 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/utils/MailboxBaseTupleUtil.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/utils/MailboxBaseTupleUtil.java
@@ -20,6 +20,7 @@
 package org.apache.james.mailbox.cassandra.mail.utils;
 
 import org.apache.james.backends.cassandra.init.CassandraTypesProvider;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.cassandra.table.CassandraMailboxTable;
 
 import com.datastax.driver.core.UDTValue;
@@ -31,10 +32,10 @@ public class MailboxBaseTupleUtil {
         this.typesProvider = typesProvider;
     }
 
-    public UDTValue createMailboxBaseUDT(String namespace, String user) {
+    public UDTValue createMailboxBaseUDT(String namespace, Username user) {
         return typesProvider.getDefinedUserType(CassandraMailboxTable.MAILBOX_BASE)
             .newValue()
             .setString(CassandraMailboxTable.MailboxBase.NAMESPACE, namespace)
-            .setString(CassandraMailboxTable.MailboxBase.USER, user);
+            .setString(CassandraMailboxTable.MailboxBase.USER, user.asString());
     }
 }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentOwnerDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentOwnerDAOTest.java
index 1ae2c67..820fdd5 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentOwnerDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentOwnerDAOTest.java
@@ -24,9 +24,10 @@ 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.backends.cassandra.CassandraRestartExtension;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
 import org.apache.james.mailbox.model.AttachmentId;
-import org.apache.james.mailbox.store.mail.model.Username;
+
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
@@ -37,8 +38,8 @@ import reactor.core.publisher.Flux;
 @ExtendWith(CassandraRestartExtension.class)
 class CassandraAttachmentOwnerDAOTest {
     private static final AttachmentId ATTACHMENT_ID = AttachmentId.from("id1");
-    private static final Username OWNER_1 = Username.fromRawValue("owner1");
-    private static final Username OWNER_2 = Username.fromRawValue("owner2");
+    private static final Username OWNER_1 = Username.of("owner1");
+    private static final Username OWNER_2 = Username.of("owner2");
 
     @RegisterExtension
     static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraAttachmentModule.MODULE);
@@ -80,7 +81,7 @@ class CassandraAttachmentOwnerDAOTest {
         int referenceCountExceedingPaging = 5050;
 
         Flux.range(0, referenceCountExceedingPaging)
-            .flatMap(i -> testee.addOwner(ATTACHMENT_ID, Username.fromRawValue("owner" + i)), concurrency)
+            .flatMap(i -> testee.addOwner(ATTACHMENT_ID, Username.of("owner" + i)), concurrency)
             .blockLast();
 
         assertThat(testee.retrieveOwners(ATTACHMENT_ID).toIterable())
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandlerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandlerTest.java
index 3a1ddca..d7ff535 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandlerTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandlerTest.java
@@ -29,6 +29,7 @@ import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.FlagsBuilder;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
@@ -90,7 +91,7 @@ class CassandraIndexTableHandlerTest {
                                                 applicableFlagDAO,
                                                 deletedMessageDAO);
 
-        mailbox = new Mailbox(MailboxPath.forUser("user", "name"),
+        mailbox = new Mailbox(MailboxPath.forUser(Username.of("user"), "name"),
             UID_VALIDITY,
             MAILBOX_ID);
     }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAOTest.java
index 7aa56b1..a9fae36 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAOTest.java
@@ -24,6 +24,7 @@ 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.backends.cassandra.CassandraRestartExtension;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.modules.CassandraMailboxCounterModule;
 import org.apache.james.mailbox.model.Mailbox;
@@ -49,7 +50,7 @@ class CassandraMailboxCounterDAOTest {
     void setUp(CassandraCluster cassandra) {
         testee = new CassandraMailboxCounterDAO(cassandra.getConf());
 
-        mailbox = new Mailbox(MailboxPath.forUser("user", "name"), UID_VALIDITY, MAILBOX_ID);
+        mailbox = new Mailbox(MailboxPath.forUser(Username.of("user"), "name"), UID_VALIDITY, MAILBOX_ID);
     }
 
     @Test
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAOTest.java
index 738b564..7d8cf78 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAOTest.java
@@ -29,6 +29,7 @@ import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraMailboxModule;
@@ -43,7 +44,8 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 class CassandraMailboxDAOTest {
     private static final int UID_VALIDITY_1 = 145;
     private static final int UID_VALIDITY_2 = 147;
-    private static final MailboxPath NEW_MAILBOX_PATH = MailboxPath.forUser("user", "xyz");
+    private static final Username USER = Username.of("user");
+    private static final MailboxPath NEW_MAILBOX_PATH = MailboxPath.forUser(USER, "xyz");
     private static CassandraId CASSANDRA_ID_1 = CassandraId.timeBased();
     private static CassandraId CASSANDRA_ID_2 = CassandraId.timeBased();
 
@@ -63,10 +65,10 @@ class CassandraMailboxDAOTest {
     void setUp(CassandraCluster cassandra) {
         testee = new CassandraMailboxDAO(cassandra.getConf(), cassandra.getTypesProvider());
 
-        mailbox1 = new Mailbox(MailboxPath.forUser("user", "abcd"),
+        mailbox1 = new Mailbox(MailboxPath.forUser(USER, "abcd"),
             UID_VALIDITY_1,
             CASSANDRA_ID_1);
-        mailbox2 = new Mailbox(MailboxPath.forUser("user", "defg"),
+        mailbox2 = new Mailbox(MailboxPath.forUser(USER, "defg"),
             UID_VALIDITY_2,
             CASSANDRA_ID_2);
     }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperConcurrencyTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperConcurrencyTest.java
index 97d71cb..ddfd33a 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperConcurrencyTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperConcurrencyTest.java
@@ -29,6 +29,7 @@ import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.cassandra.mail.utils.GuiceUtils;
 import org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraMailboxModule;
@@ -44,7 +45,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 class CassandraMailboxMapperConcurrencyTest {
 
     private static final int UID_VALIDITY = 52;
-    private static final MailboxPath MAILBOX_PATH = MailboxPath.forUser("user", "name");
+    private static final MailboxPath MAILBOX_PATH = MailboxPath.forUser(Username.of("user"), "name");
     private static final int THREAD_COUNT = 10;
     private static final int OPERATION_COUNT = 10;
 
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperTest.java
index e408fb7..60e8036 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperTest.java
@@ -31,6 +31,7 @@ import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraMailboxModule;
@@ -49,7 +50,7 @@ import org.junit.Test;
 public class CassandraMailboxMapperTest {
     
     private static final int UID_VALIDITY = 52;
-    private static final String USER = "user";
+    private static final Username USER = Username.of("user");
     private static final CassandraId MAILBOX_ID = CassandraId.timeBased();
     private static final MailboxPath MAILBOX_PATH = MailboxPath.forUser(USER, "name");
     private static final Mailbox MAILBOX = new Mailbox(MAILBOX_PATH, UID_VALIDITY, MAILBOX_ID);
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOTest.java
index 61e4bc1..68b3351 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOTest.java
@@ -28,6 +28,7 @@ import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.modules.CassandraMailboxModule;
 import org.apache.james.mailbox.model.MailboxPath;
@@ -40,8 +41,8 @@ import nl.jqno.equalsverifier.EqualsVerifier;
 
 @ExtendWith(CassandraRestartExtension.class)
 public abstract class CassandraMailboxPathDAOTest {
-    private static final String USER = "user";
-    private static final String OTHER_USER = "other";
+    private static final Username USER = Username.of("user");
+    private static final Username OTHER_USER = Username.of("other");
 
     static final CassandraId INBOX_ID = CassandraId.timeBased();
     static final CassandraId OUTBOX_ID = CassandraId.timeBased();
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java
index d1934fd..0e3a48c 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java
@@ -22,6 +22,7 @@ import java.util.List;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.MessageUid;
@@ -49,7 +50,7 @@ public class CassandraMapperProvider implements MapperProvider {
     private final CassandraCluster cassandra;
     private final MessageUidProvider messageUidProvider;
     private final CassandraModSeqProvider cassandraModSeqProvider;
-    private final MailboxSession mailboxSession = MailboxSessionUtil.create("benwa");
+    private final MailboxSession mailboxSession = MailboxSessionUtil.create(Username.of("benwa"));
     private CassandraMailboxSessionMapperFactory mapperFactory;
 
     public CassandraMapperProvider(CassandraCluster cassandra) {
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapperTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapperTest.java
index 7222793..62ce79f 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapperTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapperTest.java
@@ -26,6 +26,7 @@ import java.util.List;
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.DockerCassandraRule;
 import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.cassandra.CassandraMailboxSessionMapperFactory;
@@ -44,7 +45,7 @@ import com.google.common.collect.ImmutableList;
 
 public class CassandraMessageIdMapperTest extends MessageIdMapperTest {
 
-    private static final MailboxSession MAILBOX_SESSION = MailboxSessionUtil.create("benwa");
+    private static final MailboxSession MAILBOX_SESSION = MailboxSessionUtil.create(Username.of("benwa"));
 
     @Rule public DockerCassandraRule cassandraServer = new DockerCassandraRule().allowRestart();
 
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProviderTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProviderTest.java
index 33c5d5f..f956fd3 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProviderTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProviderTest.java
@@ -29,6 +29,7 @@ import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.modules.CassandraModSeqModule;
 import org.apache.james.mailbox.model.Mailbox;
@@ -55,7 +56,7 @@ class CassandraModSeqProviderTest {
     @BeforeEach
     void setUp(CassandraCluster cassandra) {
         modSeqProvider = new CassandraModSeqProvider(cassandra.getConf(), CassandraConfiguration.DEFAULT_CONFIGURATION);
-        MailboxPath path = new MailboxPath("gsoc", "ieugen", "Trash");
+        MailboxPath path = new MailboxPath("gsoc", Username.of("ieugen"), "Trash");
         mailbox = new Mailbox(path, 1234);
         mailbox.setMailboxId(CASSANDRA_ID);
     }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraUidProviderTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraUidProviderTest.java
index 19586a6..8a3a6a5 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraUidProviderTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraUidProviderTest.java
@@ -30,6 +30,7 @@ import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.modules.CassandraUidModule;
@@ -56,7 +57,7 @@ class CassandraUidProviderTest {
     @BeforeEach
     void setUp(CassandraCluster cassandra) {
         uidProvider = new CassandraUidProvider(cassandra.getConf(), CassandraConfiguration.DEFAULT_CONFIGURATION);
-        MailboxPath path = new MailboxPath("gsoc", "ieugen", "Trash");
+        MailboxPath path = new MailboxPath("gsoc", Username.of("ieugen"), "Trash");
         mailbox = new Mailbox(path, 1234);
         mailbox.setMailboxId(CASSANDRA_ID);
     }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraUserMailboxRightsDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraUserMailboxRightsDAOTest.java
index a7fc2bd..167d352 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraUserMailboxRightsDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraUserMailboxRightsDAOTest.java
@@ -24,6 +24,7 @@ import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.acl.ACLDiff;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
@@ -39,7 +40,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 
 @ExtendWith(CassandraRestartExtension.class)
 class CassandraUserMailboxRightsDAOTest {
-    private static final String USER_NAME = "userName";
+    private static final Username USER_NAME = Username.of("userName");
     private static final EntryKey ENTRY_KEY = EntryKey.createUserEntryKey(USER_NAME);
     private static final CassandraId MAILBOX_ID = CassandraId.timeBased();
     private static final Rfc4314Rights RIGHTS = MailboxACL.FULL_RIGHTS;
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/MailboxPathV2MigrationTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/MailboxPathV2MigrationTest.java
index 6fce3c2..959fda3 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/MailboxPathV2MigrationTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/MailboxPathV2MigrationTest.java
@@ -28,6 +28,7 @@ import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.mail.CassandraACLMapper;
 import org.apache.james.mailbox.cassandra.mail.CassandraIdAndPath;
@@ -50,7 +51,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 @ExtendWith(CassandraRestartExtension.class)
 class MailboxPathV2MigrationTest {
 
-    private static final MailboxPath MAILBOX_PATH_1 = MailboxPath.forUser("bob", "Important");
+    private static final MailboxPath MAILBOX_PATH_1 = MailboxPath.forUser(Username.of("bob"), "Important");
     private static final int UID_VALIDITY_1 = 452;
     private static final Mailbox MAILBOX_1 = new Mailbox(MAILBOX_PATH_1, UID_VALIDITY_1);
     private static final CassandraId MAILBOX_ID_1 = CassandraId.timeBased();
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndexTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndexTest.java
index a126eb9..670177e 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndexTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndexTest.java
@@ -33,6 +33,7 @@ import javax.mail.util.SharedByteArrayInputStream;
 
 import org.apache.james.backends.es.DockerElasticSearchRule;
 import org.apache.james.backends.es.ElasticSearchIndexer;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.DefaultMailboxes;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
@@ -83,7 +84,7 @@ public class ElasticSearchListeningMessageSearchIndexTest {
     private static final int BODY_START_OCTET = 100;
     private static final TestId MAILBOX_ID = TestId.of(1L);
     private static final long MOD_SEQ = 42L;
-    private static final String USERNAME = "user";
+    private static final Username USERNAME = Username.of("user");
     private static final MessageUid MESSAGE_UID_1 = MessageUid.of(25);
     private static final MessageUid MESSAGE_UID_2 = MessageUid.of(26);
     private static final MessageUid MESSAGE_UID_3 = MessageUid.of(27);
diff --git a/mailbox/event/json/src/main/scala/org/apache/james/event/json/DTOs.scala b/mailbox/event/json/src/main/scala/org/apache/james/event/json/DTOs.scala
index ec8bea4..9917073 100644
--- a/mailbox/event/json/src/main/scala/org/apache/james/event/json/DTOs.scala
+++ b/mailbox/event/json/src/main/scala/org/apache/james/event/json/DTOs.scala
@@ -24,6 +24,7 @@ import java.util.Date
 
 import javax.mail.Flags.Flag
 import javax.mail.{Flags => JavaMailFlags}
+import org.apache.james.core.Username
 import org.apache.james.core.quota.QuotaValue
 import org.apache.james.event.json.DTOs.SystemFlag.SystemFlag
 import org.apache.james.mailbox.acl.{ACLDiff => JavaACLDiff}
@@ -59,7 +60,7 @@ object DTOs {
     def toJava: JavaACLDiff = new JavaACLDiff(new MailboxACL(oldACL.asJava), new MailboxACL(newACL.asJava))
   }
 
-  case class MailboxPath(namespace: Option[String], user: Option[String], name: String) {
+  case class MailboxPath(namespace: Option[String], user: Option[Username], name: String) {
     def toJava: JavaMailboxPath = new JavaMailboxPath(namespace.orNull, user.orNull, name)
   }
 
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 087bf37..0bad42a 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
@@ -54,7 +54,7 @@ class AddedSerializationTest {
     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";
-    private static final MailboxPath MAILBOX_PATH = new MailboxPath(MailboxConstants.USER_NAMESPACE, "user", MAILBOX_NAME);
+    private static final MailboxPath MAILBOX_PATH = new MailboxPath(MailboxConstants.USER_NAMESPACE, Username.of("user"), MAILBOX_NAME);
     private static final MessageUid MESSAGE_UID = MessageUid.of(123456);
     private static final Instant INSTANT = Instant.parse("2018-12-14T09:41:51.541Z");
     private static final TestMessageId MESSAGE_ID = TestMessageId.of(42);
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 4b190a2..921fd07 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
@@ -54,7 +54,7 @@ class ExpungedSerializationTest {
     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";
-    private static final MailboxPath MAILBOX_PATH = new MailboxPath(MailboxConstants.USER_NAMESPACE, "user", MAILBOX_NAME);
+    private static final MailboxPath MAILBOX_PATH = new MailboxPath(MailboxConstants.USER_NAMESPACE, Username.of("user"), MAILBOX_NAME);
     private static final MessageUid MESSAGE_UID = MessageUid.of(123456);
     private static final Instant INSTANT = Instant.parse("2018-12-14T09:41:51.541Z");
     private static final TestMessageId MESSAGE_ID = TestMessageId.of(42);
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 90e5aa9..3140c62 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
@@ -53,7 +53,7 @@ class FlagsUpdatedSerializationTest {
     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";
-    private static final MailboxPath MAILBOX_PATH = new MailboxPath(MailboxConstants.USER_NAMESPACE, "user", MAILBOX_NAME);
+    private static final MailboxPath MAILBOX_PATH = new MailboxPath(MailboxConstants.USER_NAMESPACE, Username.of("user"), MAILBOX_NAME);
     private static final MessageUid MESSAGE_UID_1 = MessageUid.of(123456);
     private static final MessageUid MESSAGE_UID_2 = MessageUid.of(654321);
 
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 85768d3..d80c0ec 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
@@ -45,13 +45,13 @@ class MailboxACLUpdatedEventSerializationTest {
     private static final MailboxACL.Rfc4314Rights RIGHTS = new MailboxACL.Rfc4314Rights(MailboxACL.Right.Administer, MailboxACL.Right.Read);
     private static final MailboxACL MAILBOX_ACL = new MailboxACL(
         new MailboxACL.Entry(ENTRY_KEY, RIGHTS),
-        new MailboxACL.Entry(MailboxACL.EntryKey.createUserEntryKey("alice", true),
+        new MailboxACL.Entry(MailboxACL.EntryKey.createUserEntryKey(Username.of("alice"), true),
             new MailboxACL.Rfc4314Rights(MailboxACL.Right.Insert)));
 
     private static final MailboxListener.MailboxACLUpdated MAILBOX_ACL_UPDATED = new MailboxListener.MailboxACLUpdated(
                 MailboxSession.SessionId.of(6),
         USERNAME,
-                new MailboxPath(MailboxConstants.USER_NAMESPACE, "bob", "mailboxName"),
+                new MailboxPath(MailboxConstants.USER_NAMESPACE, Username.of("bob"), "mailboxName"),
                 ACLDiff.computeDiff(MailboxACL.EMPTY, MAILBOX_ACL),
                 TestId.of(23),
                 EVENT_ID);
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 ae77ee5..082237d 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
@@ -41,7 +41,7 @@ class MailboxAddedSerializationTest {
     private static final MailboxListener.MailboxAdded EVENT_1 = new MailboxListener.MailboxAdded(
         MailboxSession.SessionId.of(42),
         USERNAME,
-        new MailboxPath(MailboxConstants.USER_NAMESPACE, "bob", "mailboxName"),
+        new MailboxPath(MailboxConstants.USER_NAMESPACE, Username.of("bob"), "mailboxName"),
         TestId.of(18),
         EVENT_ID);
     private static final String JSON_1 = "{" +
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 00ac67d..e5d0e95 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
@@ -46,7 +46,7 @@ class MailboxDeletionSerializationTest {
 
     private static final MailboxSession.SessionId SESSION_ID = MailboxSession.SessionId.of(3652);
     private static final Username USERNAME = Username.of("user");
-    private static final MailboxPath MAILBOX_PATH = new MailboxPath(USER_NAMESPACE, USERNAME.asString(), "mailboxName");
+    private static final MailboxPath MAILBOX_PATH = new MailboxPath(USER_NAMESPACE, USERNAME, "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);
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 4565fa1..4de9225 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
@@ -41,9 +41,9 @@ class MailboxRenamedSerializationTest {
 
     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 MailboxPath DEFAULT_OLD_MAILBOX_PATH = new MailboxPath(USER_NAMESPACE, DEFAULT_USERNAME, OLD_MAILBOX_NAME);
     private static final String NEW_MAILBOX_NAME = "newMailboxName";
-    private static final MailboxPath DEFAULT_NEW_MAILBOX_PATH = new MailboxPath(USER_NAMESPACE, DEFAULT_USERNAME.asString(), NEW_MAILBOX_NAME);
+    private static final MailboxPath DEFAULT_NEW_MAILBOX_PATH = new MailboxPath(USER_NAMESPACE, DEFAULT_USERNAME, 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(
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/MailboxPathTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/MailboxPathTest.java
index a35e664..33d28ed 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/MailboxPathTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/MailboxPathTest.java
@@ -23,6 +23,7 @@ import static net.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson;
 import static org.apache.james.event.json.SerializerFixture.DTO_JSON_SERIALIZE;
 import static org.assertj.core.api.Assertions.assertThat;
 
+import org.apache.james.core.Username;
 import org.apache.james.event.json.DTOs;
 import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MailboxPath;
@@ -33,7 +34,8 @@ import play.api.libs.json.Json;
 
 class MailboxPathTest {
     private static final String MAILBOX_NAME = "mailboxName";
-    private static final MailboxPath MAILBOX_PATH = new MailboxPath(MailboxConstants.USER_NAMESPACE, "user", MAILBOX_NAME);
+    public static final Username USER = Username.of("user");
+    private static final MailboxPath MAILBOX_PATH = new MailboxPath(MailboxConstants.USER_NAMESPACE, USER, MAILBOX_NAME);
 
     @Test
     void mailboxPathShouldBeWellSerialized() {
@@ -49,7 +51,7 @@ class MailboxPathTest {
     @Test
     void mailboxPathWithEmptyNamespaceShouldBeWellSerialized() {
         assertThatJson(DTO_JSON_SERIALIZE.mailboxPathWrites().writes(DTOs.MailboxPath$.MODULE$.fromJava(
-            new MailboxPath("", "user", MAILBOX_NAME))).toString())
+            new MailboxPath("", USER, MAILBOX_NAME))).toString())
             .isEqualTo(
                 "{" +
                 "  \"namespace\":\"#private\"," +
@@ -66,7 +68,7 @@ class MailboxPathTest {
             "  \"name\":\"mailboxName\"" +
             "}")).get())
             .isEqualTo(DTOs.MailboxPath$.MODULE$.fromJava(
-                new MailboxPath(MailboxConstants.USER_NAMESPACE, "user", MAILBOX_NAME)));
+                new MailboxPath(MailboxConstants.USER_NAMESPACE, USER, MAILBOX_NAME)));
     }
 
     @Test
@@ -76,7 +78,7 @@ class MailboxPathTest {
             "  \"name\":\"mailboxName\"" +
             "}"))
             .get().toJava())
-            .isEqualTo(new MailboxPath(MailboxConstants.USER_NAMESPACE, "user", MAILBOX_NAME));
+            .isEqualTo(new MailboxPath(MailboxConstants.USER_NAMESPACE, USER, MAILBOX_NAME));
     }
 
     @Test
@@ -87,7 +89,7 @@ class MailboxPathTest {
             "  \"name\":\"mailboxName\"" +
             "}"))
             .get().toJava())
-            .isEqualTo(new MailboxPath(MailboxConstants.USER_NAMESPACE, "user", MAILBOX_NAME));
+            .isEqualTo(new MailboxPath(MailboxConstants.USER_NAMESPACE, USER, MAILBOX_NAME));
     }
 
     @Test
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java
index 43a9295..29114b5 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java
@@ -28,6 +28,7 @@ import javax.persistence.PersistenceException;
 import javax.persistence.RollbackException;
 import javax.persistence.TypedQuery;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.acl.ACLDiff;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MailboxExistsException;
@@ -107,7 +108,7 @@ public class JPAMailboxMapper extends JPATransactionalMapper implements MailboxM
         try {
             JPAMailbox result = loadJpaMailbox(mailbox.getMailboxId());
             result.setNamespace(mailbox.getNamespace());
-            result.setUser(mailbox.getUser());
+            result.setUser(mailbox.getUser().asString());
             result.setName(mailbox.getName());
             return result;
         } catch (MailboxNotFoundException e) {
@@ -205,11 +206,11 @@ public class JPAMailboxMapper extends JPATransactionalMapper implements MailboxM
         }
     }
 
-    private TypedQuery<JPAMailbox> findMailboxWithPathLikeTypedQuery(String namespace, String user, String pathLike) {
+    private TypedQuery<JPAMailbox> findMailboxWithPathLikeTypedQuery(String namespace, Username username, String pathLike) {
         return getEntityManager().createNamedQuery("findMailboxWithNameLikeWithUser", JPAMailbox.class)
             .setParameter("nameParam", pathLike)
             .setParameter("namespaceParam", namespace)
-            .setParameter("userParam", user);
+            .setParameter("userParam", username.asString());
     }
 
     public void deleteAllMemberships() throws MailboxException {
@@ -232,7 +233,14 @@ public class JPAMailboxMapper extends JPATransactionalMapper implements MailboxM
     public boolean hasChildren(Mailbox mailbox, char delimiter) throws MailboxException, MailboxNotFoundException {
         final String name = mailbox.getName() + delimiter + SQL_WILDCARD_CHAR; 
         final Long numberOfChildMailboxes;
-        numberOfChildMailboxes = (Long) getEntityManager().createNamedQuery("countMailboxesWithNameLikeWithUser").setParameter("nameParam", name).setParameter("namespaceParam", mailbox.getNamespace()).setParameter("userParam", mailbox.getUser()).getSingleResult();
+
+        numberOfChildMailboxes = (Long) getEntityManager()
+            .createNamedQuery("countMailboxesWithNameLikeWithUser")
+            .setParameter("nameParam", name)
+            .setParameter("namespaceParam", mailbox.getNamespace())
+            .setParameter("userParam", mailbox.getUser().asString())
+            .getSingleResult();
+
         return numberOfChildMailboxes != null && numberOfChildMailboxes > 0;
     }
 
@@ -264,7 +272,7 @@ public class JPAMailboxMapper extends JPATransactionalMapper implements MailboxM
     }
 
     @Override
-    public List<Mailbox> findNonPersonalMailboxes(String userName, Right right) throws MailboxException {
+    public List<Mailbox> findNonPersonalMailboxes(Username userName, Right right) throws MailboxException {
         return ImmutableList.of();
     }
 }
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAMailbox.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAMailbox.java
index 7feb8e6..8ff4992 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAMailbox.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/JPAMailbox.java
@@ -27,6 +27,7 @@ import javax.persistence.NamedQueries;
 import javax.persistence.NamedQuery;
 import javax.persistence.Table;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.jpa.JPAId;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxId;
@@ -107,7 +108,7 @@ public class JPAMailbox {
     
     public JPAMailbox(MailboxPath path, long uidValidity) {
         this.name = path.getName();
-        this.user = path.getUser();
+        this.user = path.getUser().asString();
         this.namespace = path.getNamespace();
         this.uidValidity = uidValidity;
     }
@@ -137,7 +138,7 @@ public class JPAMailbox {
     }
 
     public MailboxPath generateAssociatedPath() {
-        return new MailboxPath(namespace, user, name);
+        return new MailboxPath(namespace, Username.of(user), name);
     }
 
     public void setMailboxId(long mailboxId) {
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JPAMapperProvider.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JPAMapperProvider.java
index 775dfc1..b35a402 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JPAMapperProvider.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JPAMapperProvider.java
@@ -26,6 +26,7 @@ import javax.persistence.EntityManagerFactory;
 
 import org.apache.commons.lang3.NotImplementedException;
 import org.apache.james.backends.jpa.JpaTestCluster;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
@@ -61,7 +62,7 @@ public class JPAMapperProvider implements MapperProvider {
         EntityManagerFactory entityManagerFactory = jpaTestCluster.getEntityManagerFactory();
         JVMMailboxPathLocker locker = new JVMMailboxPathLocker();
 
-        JPAMessageMapper messageMapper = new JPAMessageMapper(MailboxSessionUtil.create("benwa"),
+        JPAMessageMapper messageMapper = new JPAMessageMapper(MailboxSessionUtil.create(Username.of("benwa")),
             new JPAUidProvider(locker, entityManagerFactory), 
             new JPAModSeqProvider(locker, entityManagerFactory), 
             entityManagerFactory);
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMailboxMapper.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMailboxMapper.java
index 45c8706..4285f59 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMailboxMapper.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMailboxMapper.java
@@ -22,6 +22,7 @@ package org.apache.james.mailbox.jpa.mail;
 import java.util.List;
 
 import org.apache.commons.lang3.NotImplementedException;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.acl.ACLDiff;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MailboxNotFoundException;
@@ -97,7 +98,7 @@ public class TransactionalMailboxMapper implements MailboxMapper {
     }
 
     @Override
-    public List<Mailbox> findNonPersonalMailboxes(String userName, Right right) throws MailboxException {
+    public List<Mailbox> findNonPersonalMailboxes(Username userName, Right right) throws MailboxException {
         return wrapped.findNonPersonalMailboxes(userName, right);
     }
 
diff --git a/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMailboxMessageSearchIndexTest.java b/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMailboxMessageSearchIndexTest.java
index d407a8e..69e28c6 100644
--- a/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMailboxMessageSearchIndexTest.java
+++ b/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMailboxMessageSearchIndexTest.java
@@ -32,6 +32,7 @@ import java.util.stream.Stream;
 import javax.mail.Flags;
 import javax.mail.Flags.Flag;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.MessageUid;
@@ -57,11 +58,12 @@ import com.google.common.collect.ImmutableList;
 public class LuceneMailboxMessageSearchIndexTest {
 
     public static final long LIMIT = 100L;
+    private static final Username BOB = Username.of("bob");
     private LuceneMessageSearchIndex index;
     
-    private Mailbox mailbox = new Mailbox(MailboxPath.forUser("bob", "box"), 18, TestId.of(0));
-    private Mailbox mailbox2 = new Mailbox(MailboxPath.forUser("bob", "box"), 19, TestId.of(1));
-    private Mailbox mailbox3 = new Mailbox(MailboxPath.forUser("bob", "box"), 12, TestId.of(2));
+    private Mailbox mailbox = new Mailbox(MailboxPath.forUser(BOB, "box"), 18, TestId.of(0));
+    private Mailbox mailbox2 = new Mailbox(MailboxPath.forUser(BOB, "box"), 19, TestId.of(1));
+    private Mailbox mailbox3 = new Mailbox(MailboxPath.forUser(BOB, "box"), 12, TestId.of(2));
     private MailboxSession session;
 
     private static final String FROM_ADDRESS = "Harry <ha...@example.org>";
@@ -93,7 +95,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     
     @Before
     public void setUp() throws Exception {
-        session = MailboxSessionUtil.create("username");
+        session = MailboxSessionUtil.create(Username.of("username"));
         TestMessageId.Factory factory = new TestMessageId.Factory();
         id1 = factory.generate();
         id2 = factory.generate();
diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java
index b23f917..fe07f53 100644
--- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java
+++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java
@@ -24,6 +24,7 @@ import java.util.Locale;
 import java.util.Optional;
 
 import org.apache.commons.lang3.NotImplementedException;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxPathLocker;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
@@ -96,7 +97,7 @@ public class MaildirStore implements UidProvider, ModSeqProvider {
      * @return The Mailbox object populated with data from the file system
      * @throws MailboxException If the mailbox folder doesn't exist or can't be read
      */
-    public Mailbox loadMailbox(MailboxSession session, File root, String namespace, String user, String folderName) throws MailboxException {
+    public Mailbox loadMailbox(MailboxSession session, File root, String namespace, Username user, String folderName) throws MailboxException {
         String mailboxName = getMailboxNameFromFolderName(folderName);
         return loadMailbox(session, new File(root, folderName), new MailboxPath(namespace, user, mailboxName));
     }
@@ -143,10 +144,10 @@ public class MaildirStore implements UidProvider, ModSeqProvider {
      * @param user The user to get the root for.
      * @return The name of the folder which contains the specified user's mailbox
      */
-    public String userRoot(String user) {
-        String path = maildirLocation.replace(PATH_FULLUSER, user);
-        String[] userParts = user.split("@");
-        String userName = user;
+    public String userRoot(Username user) {
+        String userName = user.asString();
+        String path = maildirLocation.replace(PATH_FULLUSER, userName);
+        String[] userParts = userName.split("@");
         if (userParts.length == 2) {
             userName = userParts[0];
             // At least the domain part should not handled in a case-sensitive manner
@@ -163,7 +164,7 @@ public class MaildirStore implements UidProvider, ModSeqProvider {
      * @return A File object referencing the main maildir folder
      * @throws MailboxException If the folder does not exist or is no directory
      */
-    public File getMailboxRootForUser(String user) throws MailboxException {
+    public File getMailboxRootForUser(Username user) throws MailboxException {
         String path = userRoot(user);
         File root = new File(path);
         if (!root.isDirectory()) {
@@ -214,7 +215,7 @@ public class MaildirStore implements UidProvider, ModSeqProvider {
      * @param name The name of the mailbox
      * @return absolute name
      */
-    public String getFolderName(String namespace, String user, String name) {
+    public String getFolderName(String namespace, Username user, String name) {
         String root = userRoot(user);
         // if INBOX => location == maildirLocation
         if (name.equals(MailboxConstants.INBOX)) {
@@ -235,7 +236,7 @@ public class MaildirStore implements UidProvider, ModSeqProvider {
      * @return The absolute path to the folder containing the mailbox
      */
     public String getFolderName(Mailbox mailbox) {
-        return getFolderName(mailbox.getNamespace(), mailbox.getUser(), mailbox.getName());
+        return getFolderName(mailbox.generateAssociatedPath());
     }
     
     /**
diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
index fe75ff1..9e0510f 100644
--- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
+++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
@@ -27,6 +27,7 @@ import java.util.Optional;
 import java.util.regex.Pattern;
 
 import org.apache.commons.io.FileUtils;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.acl.ACLDiff;
 import org.apache.james.mailbox.exception.MailboxException;
@@ -292,7 +293,7 @@ public class MaildirMailboxMapper extends NonTransactionalMapper implements Mail
             }
             
             // Special case for INBOX: Let's use the user's folder.
-            MailboxPath inboxMailboxPath = MailboxPath.forUser(userName, MailboxConstants.INBOX);
+            MailboxPath inboxMailboxPath = MailboxPath.forUser(Username.of(userName), MailboxConstants.INBOX);
             mailboxList.add(maildirStore.loadMailbox(session, inboxMailboxPath));
             
             // List all INBOX sub folders.
@@ -303,7 +304,7 @@ public class MaildirMailboxMapper extends NonTransactionalMapper implements Mail
                
                 
                 MailboxPath mailboxPath = new MailboxPath(MailboxConstants.USER_NAMESPACE, 
-                        userName, 
+                        Username.of(userName),
                         mailbox.getName().substring(1));
                 mailboxList.add(maildirStore.loadMailbox(session, mailboxPath));
 
@@ -333,7 +334,7 @@ public class MaildirMailboxMapper extends NonTransactionalMapper implements Mail
     }
 
     @Override
-    public List<Mailbox> findNonPersonalMailboxes(String userName, Right right) throws MailboxException {
+    public List<Mailbox> findNonPersonalMailboxes(Username userName, Right right) throws MailboxException {
         return ImmutableList.of();
     }
 }
diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/user/MaildirSubscriptionMapper.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/user/MaildirSubscriptionMapper.java
index e06901a..55fceb3 100644
--- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/user/MaildirSubscriptionMapper.java
+++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/user/MaildirSubscriptionMapper.java
@@ -29,6 +29,7 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.SubscriptionException;
 import org.apache.james.mailbox.maildir.MaildirStore;
 import org.apache.james.mailbox.store.transaction.NonTransactionalMapper;
@@ -57,7 +58,7 @@ public class MaildirSubscriptionMapper extends NonTransactionalMapper implements
         boolean changed = subscriptionNames.size() != newSubscriptions.size();
         if (changed) {
             try {
-                writeSubscriptions(new File(store.userRoot(subscription.getUser())), newSubscriptions);
+                writeSubscriptions(new File(store.userRoot(Username.of(subscription.getUser()))), newSubscriptions);
             } catch (IOException e) {
                 throw new SubscriptionException(e);
             }
@@ -74,7 +75,7 @@ public class MaildirSubscriptionMapper extends NonTransactionalMapper implements
 
     @Override
     public Subscription findMailboxSubscriptionForUser(String user, String mailbox) throws SubscriptionException {
-        File userRoot = new File(store.userRoot(user));
+        File userRoot = new File(store.userRoot(Username.of(user)));
         Set<String> subscriptionNames;
         try {
             subscriptionNames = readSubscriptions(userRoot);
@@ -98,7 +99,7 @@ public class MaildirSubscriptionMapper extends NonTransactionalMapper implements
         boolean changed = subscriptionNames.size() != newSubscriptions.size();
         if (changed) {
             try {
-                writeSubscriptions(new File(store.userRoot(subscription.getUser())), newSubscriptions);
+                writeSubscriptions(new File(store.userRoot(Username.of(subscription.getUser()))), newSubscriptions);
             } catch (IOException e) {
                 throw new SubscriptionException(e);
             }
@@ -117,7 +118,7 @@ public class MaildirSubscriptionMapper extends NonTransactionalMapper implements
      * @return A Set of names of subscribed mailboxes of the user
      */
     private Set<String> readSubscriptionsForUser(String user) throws SubscriptionException { 
-        File userRoot = new File(store.userRoot(user));
+        File userRoot = new File(store.userRoot(Username.of(user)));
         try {
             return readSubscriptions(userRoot);
         } catch (IOException e) {
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryAttachmentMapper.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryAttachmentMapper.java
index e97e65f..54d040c 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryAttachmentMapper.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryAttachmentMapper.java
@@ -23,13 +23,13 @@ import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.AttachmentNotFoundException;
 import org.apache.james.mailbox.exception.MailboxException;
 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.AttachmentMapper;
-import org.apache.james.mailbox.store.mail.model.Username;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.HashMultimap;
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java
index 3c9fceb..748e0ff 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java
@@ -24,6 +24,7 @@ import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicLong;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.acl.ACLDiff;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MailboxExistsException;
@@ -155,14 +156,14 @@ public class InMemoryMailboxMapper implements MailboxMapper {
     }
 
     @Override
-    public List<Mailbox> findNonPersonalMailboxes(String userName, Right right) throws MailboxException {
+    public List<Mailbox> findNonPersonalMailboxes(Username userName, Right right) throws MailboxException {
         return mailboxesByPath.values()
             .stream()
             .filter(mailbox -> hasRightOn(mailbox, userName, right))
             .collect(Guavate.toImmutableList());
     }
 
-    private Boolean hasRightOn(Mailbox mailbox, String userName, Right right) {
+    private Boolean hasRightOn(Mailbox mailbox, Username userName, Right right) {
         return Optional.ofNullable(
             mailbox.getACL()
                 .ofPositiveNameType(NameType.user)
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManager.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManager.java
index 85d914d..02ef7b6 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManager.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManager.java
@@ -24,6 +24,7 @@ import java.util.concurrent.atomic.AtomicLong;
 
 import javax.inject.Inject;
 
+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;
@@ -46,7 +47,7 @@ public class InMemoryCurrentQuotaManager implements StoreCurrentQuotaManager {
         this.quotaCache = CacheBuilder.newBuilder().build(new CacheLoader<QuotaRoot, Entry>() {
             @Override
             public Entry load(QuotaRoot quotaRoot) throws Exception {
-                return new Entry(quotaCalculator.recalculateCurrentQuotas(quotaRoot, sessionProvider.createSystemSession(quotaRoot.getValue())));
+                return new Entry(quotaCalculator.recalculateCurrentQuotas(quotaRoot, sessionProvider.createSystemSession(Username.of(quotaRoot.getValue()))));
             }
         });
     }
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMapperProvider.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMapperProvider.java
index 765751c..a15ecd1 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMapperProvider.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMapperProvider.java
@@ -22,6 +22,7 @@ package org.apache.james.mailbox.inmemory.mail;
 import java.util.List;
 import java.util.concurrent.ThreadLocalRandom;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.MessageUid;
@@ -42,7 +43,8 @@ import com.google.common.collect.ImmutableList;
 
 public class InMemoryMapperProvider implements MapperProvider {
 
-    private static final MailboxSession MAILBOX_SESSION = MailboxSessionUtil.create("user");
+    private static final Username USER = Username.of("user");
+    private static final MailboxSession MAILBOX_SESSION = MailboxSessionUtil.create(USER);
 
     private final MessageId.Factory messageIdFactory;
     private final MessageUidProvider messageUidProvider;
@@ -62,7 +64,7 @@ public class InMemoryMapperProvider implements MapperProvider {
 
     @Override
     public MessageMapper createMessageMapper() throws MailboxException {
-        return inMemoryMailboxSessionMapperFactory.createMessageMapper(MailboxSessionUtil.create("user"));
+        return inMemoryMailboxSessionMapperFactory.createMessageMapper(MailboxSessionUtil.create(USER));
     }
 
     @Override
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 43b5910..36b60e9 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
@@ -117,7 +117,7 @@ public class DeletedMessageVaultHook implements PreDeletionHook {
                             DeletedMessageConverter deletedMessageConverter,
                             MailboxSessionMapperFactory mapperFactory,
                             Clock clock) {
-        this.session = sessionProvider.createSystemSession(getClass().getName());
+        this.session = sessionProvider.createSystemSession(Username.of(getClass().getName()));
         this.deletedMessageVault = deletedMessageVault;
         this.deletedMessageConverter = deletedMessageConverter;
         this.mapperFactory = mapperFactory;
@@ -164,8 +164,8 @@ public class DeletedMessageVaultHook implements PreDeletionHook {
     }
 
     private Username retrieveMailboxUser(MailboxId mailboxId) throws MailboxException {
-        return Username.of(mapperFactory.getMailboxMapper(session)
+        return mapperFactory.getMailboxMapper(session)
             .findMailboxById(mailboxId)
-            .getUser());
+            .getUser();
     }
 }
\ No newline at end of file
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 bbabc89..bfe285c 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
@@ -71,8 +71,8 @@ class DeletedMessageVaultHookTest {
     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");
-    private static final MailboxPath MAILBOX_BOB_ONE = MailboxPath.forUser(BOB_ADDRESS, "BOB_ONE");
+    private static final MailboxPath MAILBOX_ALICE_ONE = MailboxPath.forUser(ALICE, "ALICE_ONE");
+    private static final MailboxPath MAILBOX_BOB_ONE = MailboxPath.forUser(BOB, "BOB_ONE");
 
     private MailboxManager mailboxManager;
     private MessageIdManager messageIdManager;
@@ -138,8 +138,8 @@ class DeletedMessageVaultHookTest {
         searchQuery = new SearchQuery();
         searchQuery.andCriteria(SearchQuery.internalDateOn(INTERNAL_DATE, SearchQuery.DateResolution.Second));
 
-        aliceSession = mailboxManager.createSystemSession(ALICE_ADDRESS);
-        bobSession = mailboxManager.createSystemSession(BOB_ADDRESS);
+        aliceSession = mailboxManager.createSystemSession(ALICE);
+        bobSession = mailboxManager.createSystemSession(BOB);
     }
 
     @Test
@@ -164,7 +164,7 @@ class DeletedMessageVaultHookTest {
 
         mailboxManager.setRights(MAILBOX_ALICE_ONE,
             MailboxACL.EMPTY.apply(MailboxACL.command()
-                .forUser(BOB_ADDRESS)
+                .forUser(BOB)
                 .rights(MailboxACL.Right.Lookup, MailboxACL.Right.Read, MailboxACL.Right.DeleteMessages, MailboxACL.Right.PerformExpunge)
                 .asAddition()),
             aliceSession);
@@ -188,7 +188,7 @@ class DeletedMessageVaultHookTest {
 
         mailboxManager.setRights(MAILBOX_ALICE_ONE,
             MailboxACL.EMPTY.apply(MailboxACL.command()
-                .forUser(BOB_ADDRESS)
+                .forUser(BOB)
                 .rights(MailboxACL.Right.Lookup, MailboxACL.Right.Read, MailboxACL.Right.DeleteMessages, MailboxACL.Right.PerformExpunge)
                 .asAddition()),
             aliceSession);
@@ -213,7 +213,7 @@ class DeletedMessageVaultHookTest {
 
         mailboxManager.setRights(MAILBOX_ALICE_ONE,
             MailboxACL.EMPTY.apply(MailboxACL.command()
-                .forUser(BOB_ADDRESS)
+                .forUser(BOB)
                 .rights(MailboxACL.Right.Lookup, MailboxACL.Right.Read, MailboxACL.Right.DeleteMessages, MailboxACL.Right.PerformExpunge)
                 .asAddition()),
             aliceSession);
@@ -239,7 +239,7 @@ class DeletedMessageVaultHookTest {
 
         mailboxManager.setRights(MAILBOX_ALICE_ONE,
             MailboxACL.EMPTY.apply(MailboxACL.command()
-                .forUser(BOB_ADDRESS)
+                .forUser(BOB)
                 .rights(MailboxACL.Right.Lookup, MailboxACL.Right.Read, MailboxACL.Right.DeleteMessages, MailboxACL.Right.PerformExpunge)
                 .asAddition()),
             aliceSession);
@@ -263,7 +263,7 @@ class DeletedMessageVaultHookTest {
 
         mailboxManager.setRights(MAILBOX_ALICE_ONE,
             MailboxACL.EMPTY.apply(MailboxACL.command()
-                .forUser(BOB_ADDRESS)
+                .forUser(BOB)
                 .rights(MailboxACL.Right.Lookup, MailboxACL.Right.Read, MailboxACL.Right.DeleteMessages, MailboxACL.Right.PerformExpunge)
                 .asAddition()),
             aliceSession);
@@ -289,7 +289,7 @@ class DeletedMessageVaultHookTest {
 
         mailboxManager.setRights(MAILBOX_ALICE_ONE,
             MailboxACL.EMPTY.apply(MailboxACL.command()
-                .forUser(BOB_ADDRESS)
+                .forUser(BOB)
                 .rights(MailboxACL.Right.Lookup, MailboxACL.Right.Read, MailboxACL.Right.DeleteMessages, MailboxACL.Right.PerformExpunge)
                 .asAddition()),
             aliceSession);
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 0209a3b..373a069 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
@@ -79,7 +79,7 @@ class ElasticSearchQuotaSearcherTest implements QuotaSearcherContract {
 
     private void provisionUser(QuotaSearchTestSystem testSystem, Username username) {
         try {
-            testSystem.getUsersRepository().addUser(username.asString(), PASSWORD);
+            testSystem.getUsersRepository().addUser(username, PASSWORD);
             appendMessage(testSystem, username, withSize(49));
         } catch (Exception e) {
             throw new RuntimeException(e);
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 6d49985..1226302 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,6 @@ public class ScanningQuotaSearcher implements QuotaSearcher {
     @Override
     public List<Username> search(QuotaQuery query) {
         Stream<Username> results = Iterators.toStream(listUsers())
-            .map(Username::of)
             .filter(clauseConverter.andToPredicate(query.getClause()))
             .sorted(Comparator.comparing(Username::asString))
             .skip(query.getOffset().getValue());
@@ -64,7 +63,7 @@ public class ScanningQuotaSearcher implements QuotaSearcher {
             .orElse(results);
     }
 
-    private Iterator<String> listUsers() {
+    private Iterator<Username> listUsers() {
         try {
             return usersRepository.list();
         } catch (UsersRepositoryException e) {
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 a79a7f3..9fbac9a 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
@@ -51,9 +51,9 @@ public interface QuotaSearcherContract {
     @Test
     default void moreThanShouldFilterOutTooSmallValues(QuotaSearchTestSystem testSystem) throws Exception {
         testSystem.getDomainList().addDomain(SIMPSON_COM);
-        testSystem.getUsersRepository().addUser(Simpson.BART.asString(), PASSWORD);
-        testSystem.getUsersRepository().addUser(Simpson.HOMER.asString(), PASSWORD);
-        testSystem.getUsersRepository().addUser(Simpson.LISA.asString(), PASSWORD);
+        testSystem.getUsersRepository().addUser(Simpson.BART, PASSWORD);
+        testSystem.getUsersRepository().addUser(Simpson.HOMER, PASSWORD);
+        testSystem.getUsersRepository().addUser(Simpson.LISA, PASSWORD);
         testSystem.getMaxQuotaManager().setGlobalMaxStorage(QuotaSize.size(100));
 
         appendMessage(testSystem, Simpson.BART, withSize(49));
@@ -71,9 +71,9 @@ public interface QuotaSearcherContract {
     @Test
     default void lessThanShouldFilterOutTooBigValues(QuotaSearchTestSystem testSystem) throws Exception {
         testSystem.getDomainList().addDomain(SIMPSON_COM);
-        testSystem.getUsersRepository().addUser(Simpson.BART.asString(), PASSWORD);
-        testSystem.getUsersRepository().addUser(Simpson.HOMER.asString(), PASSWORD);
-        testSystem.getUsersRepository().addUser(Simpson.LISA.asString(), PASSWORD);
+        testSystem.getUsersRepository().addUser(Simpson.BART, PASSWORD);
+        testSystem.getUsersRepository().addUser(Simpson.HOMER, PASSWORD);
+        testSystem.getUsersRepository().addUser(Simpson.LISA, PASSWORD);
         testSystem.getMaxQuotaManager().setGlobalMaxStorage(QuotaSize.size(100));
 
         appendMessage(testSystem, Simpson.BART, withSize(49));
@@ -91,9 +91,9 @@ public interface QuotaSearcherContract {
     @Test
     default void rangeShouldFilterValuesOutOfRange(QuotaSearchTestSystem testSystem) throws Exception {
         testSystem.getDomainList().addDomain(SIMPSON_COM);
-        testSystem.getUsersRepository().addUser(Simpson.BART.asString(), PASSWORD);
-        testSystem.getUsersRepository().addUser(Simpson.HOMER.asString(), PASSWORD);
-        testSystem.getUsersRepository().addUser(Simpson.LISA.asString(), PASSWORD);
+        testSystem.getUsersRepository().addUser(Simpson.BART, PASSWORD);
+        testSystem.getUsersRepository().addUser(Simpson.HOMER, PASSWORD);
+        testSystem.getUsersRepository().addUser(Simpson.LISA, PASSWORD);
         testSystem.getMaxQuotaManager().setGlobalMaxStorage(QuotaSize.size(100));
 
         appendMessage(testSystem, Simpson.BART, withSize(40));
@@ -114,9 +114,9 @@ public interface QuotaSearcherContract {
     default void hasDomainShouldFilterOutValuesWithDifferentDomains(QuotaSearchTestSystem testSystem) throws Exception {
         testSystem.getDomainList().addDomain(SIMPSON_COM);
         testSystem.getDomainList().addDomain(DOMAIN_TLD);
-        testSystem.getUsersRepository().addUser(Simpson.BART.asString(), PASSWORD);
-        testSystem.getUsersRepository().addUser(Simpson.LISA.asString(), PASSWORD);
-        testSystem.getUsersRepository().addUser(BENOIT_AT_DOMAIN_TLD.asString(), PASSWORD);
+        testSystem.getUsersRepository().addUser(Simpson.BART, PASSWORD);
+        testSystem.getUsersRepository().addUser(Simpson.LISA, PASSWORD);
+        testSystem.getUsersRepository().addUser(BENOIT_AT_DOMAIN_TLD, PASSWORD);
         testSystem.getMaxQuotaManager().setGlobalMaxStorage(QuotaSize.size(100));
 
         appendMessage(testSystem, Simpson.BART, withSize(49));
@@ -135,9 +135,9 @@ public interface QuotaSearcherContract {
     default void andShouldCombineClauses(QuotaSearchTestSystem testSystem) throws Exception {
         testSystem.getDomainList().addDomain(SIMPSON_COM);
         testSystem.getDomainList().addDomain(DOMAIN_TLD);
-        testSystem.getUsersRepository().addUser(Simpson.BART.asString(), PASSWORD);
-        testSystem.getUsersRepository().addUser(Simpson.LISA.asString(), PASSWORD);
-        testSystem.getUsersRepository().addUser(BENOIT_AT_DOMAIN_TLD.asString(), PASSWORD);
+        testSystem.getUsersRepository().addUser(Simpson.BART, PASSWORD);
+        testSystem.getUsersRepository().addUser(Simpson.LISA, PASSWORD);
+        testSystem.getUsersRepository().addUser(BENOIT_AT_DOMAIN_TLD, PASSWORD);
         testSystem.getMaxQuotaManager().setGlobalMaxStorage(QuotaSize.size(100));
 
         appendMessage(testSystem, Simpson.BART, withSize(49));
@@ -156,10 +156,10 @@ public interface QuotaSearcherContract {
     @Test
     default void resultShouldBeAlphabeticallyOrdered(QuotaSearchTestSystem testSystem) throws Exception {
         testSystem.getDomainList().addDomain(ALPHABET_TLD);
-        testSystem.getUsersRepository().addUser(Alphabet.AAA.asString(), PASSWORD);
-        testSystem.getUsersRepository().addUser(Alphabet.ABA.asString(), PASSWORD);
-        testSystem.getUsersRepository().addUser(Alphabet.ABB.asString(), PASSWORD);
-        testSystem.getUsersRepository().addUser(Alphabet.ACB.asString(), PASSWORD);
+        testSystem.getUsersRepository().addUser(Alphabet.AAA, PASSWORD);
+        testSystem.getUsersRepository().addUser(Alphabet.ABA, PASSWORD);
+        testSystem.getUsersRepository().addUser(Alphabet.ABB, PASSWORD);
+        testSystem.getUsersRepository().addUser(Alphabet.ACB, PASSWORD);
         testSystem.getMaxQuotaManager().setGlobalMaxStorage(QuotaSize.size(100));
 
         appendMessage(testSystem, Alphabet.AAA, withSize(49));
@@ -177,10 +177,10 @@ public interface QuotaSearcherContract {
     @Test
     default void limitShouldBeTheMaximumValueOfReturnedResults(QuotaSearchTestSystem testSystem) throws Exception {
         testSystem.getDomainList().addDomain(ALPHABET_TLD);
-        testSystem.getUsersRepository().addUser(Alphabet.AAA.asString(), PASSWORD);
-        testSystem.getUsersRepository().addUser(Alphabet.ABA.asString(), PASSWORD);
-        testSystem.getUsersRepository().addUser(Alphabet.ABB.asString(), PASSWORD);
-        testSystem.getUsersRepository().addUser(Alphabet.ACB.asString(), PASSWORD);
+        testSystem.getUsersRepository().addUser(Alphabet.AAA, PASSWORD);
+        testSystem.getUsersRepository().addUser(Alphabet.ABA, PASSWORD);
+        testSystem.getUsersRepository().addUser(Alphabet.ABB, PASSWORD);
+        testSystem.getUsersRepository().addUser(Alphabet.ACB, PASSWORD);
         testSystem.getMaxQuotaManager().setGlobalMaxStorage(QuotaSize.size(100));
 
         appendMessage(testSystem, Alphabet.AAA, withSize(49));
@@ -199,10 +199,10 @@ public interface QuotaSearcherContract {
     @Test
     default void offsetShouldSkipSomeResults(QuotaSearchTestSystem testSystem) throws Exception {
         testSystem.getDomainList().addDomain(ALPHABET_TLD);
-        testSystem.getUsersRepository().addUser(Alphabet.AAA.asString(), PASSWORD);
-        testSystem.getUsersRepository().addUser(Alphabet.ABA.asString(), PASSWORD);
-        testSystem.getUsersRepository().addUser(Alphabet.ABB.asString(), PASSWORD);
-        testSystem.getUsersRepository().addUser(Alphabet.ACB.asString(), PASSWORD);
+        testSystem.getUsersRepository().addUser(Alphabet.AAA, PASSWORD);
+        testSystem.getUsersRepository().addUser(Alphabet.ABA, PASSWORD);
+        testSystem.getUsersRepository().addUser(Alphabet.ABB, PASSWORD);
+        testSystem.getUsersRepository().addUser(Alphabet.ACB, PASSWORD);
         testSystem.getMaxQuotaManager().setGlobalMaxStorage(QuotaSize.size(100));
 
         appendMessage(testSystem, Alphabet.AAA, withSize(49));
@@ -222,10 +222,10 @@ public interface QuotaSearcherContract {
     default void searchShouldReturnEmptyOnTooBigOffset(QuotaSearchTestSystem testSystem) throws Exception {
         testSystem.getDomainList().addDomain(SIMPSON_COM);
         testSystem.getDomainList().addDomain(DOMAIN_TLD);
-        testSystem.getUsersRepository().addUser(Simpson.BART.asString(), PASSWORD);
-        testSystem.getUsersRepository().addUser(Simpson.HOMER.asString(), PASSWORD);
-        testSystem.getUsersRepository().addUser(Simpson.LISA.asString(), PASSWORD);
-        testSystem.getUsersRepository().addUser(BENOIT_AT_DOMAIN_TLD.asString(), PASSWORD);
+        testSystem.getUsersRepository().addUser(Simpson.BART, PASSWORD);
+        testSystem.getUsersRepository().addUser(Simpson.HOMER, PASSWORD);
+        testSystem.getUsersRepository().addUser(Simpson.LISA, PASSWORD);
+        testSystem.getUsersRepository().addUser(BENOIT_AT_DOMAIN_TLD, PASSWORD);
         testSystem.getMaxQuotaManager().setGlobalMaxStorage(QuotaSize.size(100));
 
         appendMessage(testSystem, Simpson.BART, withSize(49));
@@ -244,10 +244,10 @@ public interface QuotaSearcherContract {
     @Test
     default void pagingShouldBeSupported(QuotaSearchTestSystem testSystem) throws Exception {
         testSystem.getDomainList().addDomain(ALPHABET_TLD);
-        testSystem.getUsersRepository().addUser(Alphabet.AAA.asString(), PASSWORD);
-        testSystem.getUsersRepository().addUser(Alphabet.ABA.asString(), PASSWORD);
-        testSystem.getUsersRepository().addUser(Alphabet.ABB.asString(), PASSWORD);
-        testSystem.getUsersRepository().addUser(Alphabet.ACB.asString(), PASSWORD);
+        testSystem.getUsersRepository().addUser(Alphabet.AAA, PASSWORD);
+        testSystem.getUsersRepository().addUser(Alphabet.ABA, PASSWORD);
+        testSystem.getUsersRepository().addUser(Alphabet.ABB, PASSWORD);
+        testSystem.getUsersRepository().addUser(Alphabet.ACB, PASSWORD);
         testSystem.getMaxQuotaManager().setGlobalMaxStorage(QuotaSize.size(100));
 
         appendMessage(testSystem, Alphabet.AAA, withSize(49));
@@ -266,7 +266,7 @@ public interface QuotaSearcherContract {
 
     default void appendMessage(QuotaSearchTestSystem testSystem, Username username, MessageManager.AppendCommand appendCommand) throws MailboxException, UsersRepositoryException, DomainListException {
         MailboxManager mailboxManager = testSystem.getMailboxManager();
-        MailboxSession session = mailboxManager.createSystemSession(username.asString());
+        MailboxSession session = mailboxManager.createSystemSession(username);
 
         MailboxPath mailboxPath = MailboxPath.inbox(session);
         mailboxManager.createMailbox(mailboxPath, session);
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 45a1685..cbaf551 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
@@ -24,6 +24,7 @@ import java.util.stream.Stream;
 
 import javax.inject.Inject;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.Role;
@@ -90,12 +91,13 @@ public class SpamAssassinListener implements SpamEventListener {
 
     @Override
     public void event(Event event) throws MailboxException {
+        Username username = Username.of(getClass().getCanonicalName());
         if (event instanceof MessageMoveEvent) {
-            MailboxSession session = mailboxManager.createSystemSession(getClass().getCanonicalName());
+            MailboxSession session = mailboxManager.createSystemSession(username);
             handleMessageMove(event, session, (MessageMoveEvent) event);
         }
         if (event instanceof Added) {
-            MailboxSession session = mailboxManager.createSystemSession(getClass().getCanonicalName());
+            MailboxSession session = mailboxManager.createSystemSession(username);
             handleAdded(event, session, (Added) event);
         }
     }
diff --git a/mailbox/plugin/spamassassin/src/test/java/org/apache/james/mailbox/spamassassin/SpamAssassinListenerTest.java b/mailbox/plugin/spamassassin/src/test/java/org/apache/james/mailbox/spamassassin/SpamAssassinListenerTest.java
index 72d8b39..245a8ec 100644
--- a/mailbox/plugin/spamassassin/src/test/java/org/apache/james/mailbox/spamassassin/SpamAssassinListenerTest.java
+++ b/mailbox/plugin/spamassassin/src/test/java/org/apache/james/mailbox/spamassassin/SpamAssassinListenerTest.java
@@ -32,6 +32,7 @@ import java.util.Date;
 import javax.mail.Flags;
 import javax.mail.util.SharedByteArrayInputStream;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.DefaultMailboxes;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
@@ -57,7 +58,7 @@ import org.junit.Before;
 import org.junit.Test;
 
 public class SpamAssassinListenerTest {
-    public static final String USER = "user";
+    public static final Username USER = Username.of("user");
     private static final MailboxSession MAILBOX_SESSION = MailboxSessionUtil.create(USER);
     private static final int UID_VALIDITY = 43;
     private static final TestMessageId MESSAGE_ID = TestMessageId.of(45);
diff --git a/mailbox/spring/src/main/java/org/apache/james/mailbox/spring/AnonymousAuthenticator.java b/mailbox/spring/src/main/java/org/apache/james/mailbox/spring/AnonymousAuthenticator.java
index 7706e72..4b99c0f 100644
--- a/mailbox/spring/src/main/java/org/apache/james/mailbox/spring/AnonymousAuthenticator.java
+++ b/mailbox/spring/src/main/java/org/apache/james/mailbox/spring/AnonymousAuthenticator.java
@@ -18,12 +18,13 @@
  ****************************************************************/
 package org.apache.james.mailbox.spring;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.store.Authenticator;
 
 public class AnonymousAuthenticator implements Authenticator {
 
     @Override
-    public boolean isAuthentic(String userid, CharSequence passwd) {
+    public boolean isAuthentic(Username userid, CharSequence passwd) {
         return true;
     }
 
diff --git a/mailbox/spring/src/main/java/org/apache/james/mailbox/spring/NoAuthorizator.java b/mailbox/spring/src/main/java/org/apache/james/mailbox/spring/NoAuthorizator.java
index f98e331..8418ece 100644
--- a/mailbox/spring/src/main/java/org/apache/james/mailbox/spring/NoAuthorizator.java
+++ b/mailbox/spring/src/main/java/org/apache/james/mailbox/spring/NoAuthorizator.java
@@ -18,12 +18,13 @@
  ****************************************************************/
 package org.apache.james.mailbox.spring;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.store.Authorizator;
 
 public class NoAuthorizator implements Authorizator {
 
     @Override
-    public AuthorizationState canLoginAsOtherUser(String userId, String otherUserId) {
+    public AuthorizationState canLoginAsOtherUser(Username userId, Username otherUserId) {
         return AuthorizationState.NOT_ADMIN;
     }
 
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/Authenticator.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/Authenticator.java
index f0587b3..1dd7857 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/Authenticator.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/Authenticator.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.mailbox.store;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.MailboxException;
 
 /**
@@ -34,5 +35,5 @@ public interface Authenticator {
      * @return true when the user is authentic,
      * false otherwise
      */
-    boolean isAuthentic(String userid, CharSequence passwd) throws MailboxException;
+    boolean isAuthentic(Username userid, CharSequence passwd) throws MailboxException;
 }
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/Authorizator.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/Authorizator.java
index 2b01aa8..f83ab06 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/Authorizator.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/Authorizator.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.mailbox.store;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.MailboxException;
 
 /**
@@ -32,6 +33,6 @@ public interface Authorizator {
         UNKNOWN_USER
     }
 
-    AuthorizationState canLoginAsOtherUser(String userId, String otherUserId) throws MailboxException;
+    AuthorizationState canLoginAsOtherUser(Username userId, Username otherUserId) throws MailboxException;
 }
 
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/FakeAuthenticator.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/FakeAuthenticator.java
index 79224c5..a5eefda 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/FakeAuthenticator.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/FakeAuthenticator.java
@@ -21,20 +21,22 @@ package org.apache.james.mailbox.store;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.james.core.Username;
+
 public class FakeAuthenticator implements Authenticator {
 
     private final Map<String, String> users = new HashMap<>();
 
     @Override
-    public boolean isAuthentic(String userid, CharSequence passwd) {
-        String pass = users.get(userid);
+    public boolean isAuthentic(Username userid, CharSequence passwd) {
+        String pass = users.get(userid.asString());
         if (pass != null) {
             return passwd.toString().equals(pass);
         }
         return false;
     }
     
-    public void addUser(String user, String password) {
-        users.put(user, password);
+    public void addUser(Username user, String password) {
+        users.put(user.asString(), password);
     }
 }
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/FakeAuthorizator.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/FakeAuthorizator.java
index 556affe..7bbc7f6 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/FakeAuthorizator.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/FakeAuthorizator.java
@@ -20,26 +20,28 @@ package org.apache.james.mailbox.store;
 
 import java.util.Optional;
 
+import org.apache.james.core.Username;
+
 public class FakeAuthorizator implements Authorizator {
 
     public static FakeAuthorizator defaultReject() {
         return new FakeAuthorizator(Optional.empty(), Optional.empty());
     }
 
-    public static FakeAuthorizator forUserAndAdmin(String admin, String user) {
+    public static FakeAuthorizator forUserAndAdmin(Username admin, Username user) {
         return new FakeAuthorizator(Optional.of(admin), Optional.of(user));
     }
 
-    private final Optional<String> adminId;
-    private final Optional<String> delegatedUserId;
+    private final Optional<Username> adminId;
+    private final Optional<Username> delegatedUserId;
 
-    private FakeAuthorizator(Optional<String> adminId, Optional<String> userId) {
+    private FakeAuthorizator(Optional<Username> adminId, Optional<Username> userId) {
         this.adminId = adminId;
         this.delegatedUserId = userId;
     }
 
     @Override
-    public AuthorizationState canLoginAsOtherUser(String userId, String otherUserId) {
+    public AuthorizationState canLoginAsOtherUser(Username userId, Username otherUserId) {
         if (!adminId.isPresent() || !this.delegatedUserId.isPresent()) {
             return AuthorizationState.NOT_ADMIN;
         }
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/SessionProvider.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/SessionProvider.java
index 992ad15..368f367 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/SessionProvider.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/SessionProvider.java
@@ -23,6 +23,7 @@ import java.util.ArrayList;
 
 import javax.inject.Inject;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionIdGenerator;
 import org.apache.james.mailbox.exception.BadCredentialsException;
@@ -47,11 +48,11 @@ public class SessionProvider {
         return MailboxConstants.DEFAULT_DELIMITER;
     }
 
-    public MailboxSession createSystemSession(String userName) {
+    public MailboxSession createSystemSession(Username userName) {
         return createSession(userName, MailboxSession.SessionType.System);
     }
 
-    public MailboxSession login(String userid, String passwd) throws MailboxException {
+    public MailboxSession login(Username userid, String passwd) throws MailboxException {
         if (isValidLogin(userid, passwd)) {
             return createSession(userid, MailboxSession.SessionType.User);
         } else {
@@ -59,7 +60,7 @@ public class SessionProvider {
         }
     }
 
-    public MailboxSession loginAsOtherUser(String adminUserid, String passwd, String otherUserId) throws MailboxException {
+    public MailboxSession loginAsOtherUser(Username adminUserid, String passwd, Username otherUserId) throws MailboxException {
         if (! isValidLogin(adminUserid, passwd)) {
             throw new BadCredentialsException();
         }
@@ -82,7 +83,7 @@ public class SessionProvider {
         }
     }
 
-    private MailboxSession createSession(String userName, MailboxSession.SessionType type) {
+    private MailboxSession createSession(Username userName, MailboxSession.SessionType type) {
         return new MailboxSession(newSessionId(), userName, new ArrayList<>(), getDelimiter(), type);
     }
 
@@ -101,7 +102,7 @@ public class SessionProvider {
      * @param passwd the password
      * @return success true if login success false otherwise
      */
-    private boolean isValidLogin(String userid, String passwd) throws MailboxException {
+    private boolean isValidLogin(Username userid, String passwd) throws MailboxException {
         return authenticator.isAuthentic(userid, passwd);
     }
 }
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 db73f37..0ac9959 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
@@ -77,7 +77,7 @@ public class StoreAttachmentManager implements AttachmentManager {
     @Override
     public void storeAttachment(Attachment attachment, MailboxSession mailboxSession) throws MailboxException {
         attachmentMapperFactory.getAttachmentMapper(mailboxSession)
-            .storeAttachmentForOwner(attachment, org.apache.james.mailbox.store.mail.model.Username.fromMailboxSession(mailboxSession));
+            .storeAttachmentForOwner(attachment, mailboxSession.getUser());
     }
 
     @Override
@@ -103,10 +103,10 @@ public class StoreAttachmentManager implements AttachmentManager {
     }
 
     private boolean isExplicitlyAOwner(AttachmentId attachmentId, MailboxSession mailboxSession) throws MailboxException {
-        Collection<org.apache.james.mailbox.store.mail.model.Username> explicitOwners = attachmentMapperFactory.getAttachmentMapper(mailboxSession)
+        Collection<Username> explicitOwners = attachmentMapperFactory.getAttachmentMapper(mailboxSession)
             .getOwners(attachmentId);
         return explicitOwners.stream()
-            .anyMatch(username -> mailboxSession.getUser().equals(Username.of(username.getValue())));
+            .anyMatch(username -> mailboxSession.getUser().equals(username));
     }
 
     private Collection<MessageId> getRelatedMessageIds(AttachmentId attachmentId, MailboxSession mailboxSession) throws MailboxException {
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
index d334fa2..2f3ae29 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
@@ -31,6 +31,7 @@ import java.util.stream.Stream;
 
 import javax.inject.Inject;
 
+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.MailboxAnnotationManager;
@@ -215,7 +216,7 @@ public class StoreMailboxManager implements MailboxManager {
     }
 
     @Override
-    public MailboxSession createSystemSession(String userName) {
+    public MailboxSession createSystemSession(Username userName) {
         return sessionProvider.createSystemSession(userName);
     }
 
@@ -225,12 +226,12 @@ public class StoreMailboxManager implements MailboxManager {
     }
 
     @Override
-    public MailboxSession login(String userid, String passwd) throws MailboxException {
+    public MailboxSession login(Username userid, String passwd) throws MailboxException {
         return sessionProvider.login(userid, passwd);
     }
 
     @Override
-    public MailboxSession loginAsOtherUser(String adminUserid, String passwd, String otherUserId) throws MailboxException {
+    public MailboxSession loginAsOtherUser(Username adminUserid, String passwd, Username otherUserId) throws MailboxException {
         return sessionProvider.loginAsOtherUser(adminUserid, passwd, otherUserId);
     }
 
@@ -582,7 +583,7 @@ public class StoreMailboxManager implements MailboxManager {
     public static MailboxQuery.UserBound toSingleUserQuery(MailboxQuery mailboxQuery, MailboxSession mailboxSession) {
         return MailboxQuery.builder()
             .namespace(mailboxQuery.getNamespace().orElse(MailboxConstants.USER_NAMESPACE))
-            .username(mailboxQuery.getUser().orElse(mailboxSession.getUser().asString()))
+            .username(mailboxQuery.getUser().orElse(mailboxSession.getUser()))
             .expression(mailboxQuery.getMailboxNameExpression()
                 .includeChildren())
             .build()
@@ -594,7 +595,7 @@ public class StoreMailboxManager implements MailboxManager {
         if (mailboxQuery.isPrivateMailboxes(session)) {
             return Stream.of();
         }
-        return mailboxMapper.findNonPersonalMailboxes(session.getUser().asString(), right).stream();
+        return mailboxMapper.findNonPersonalMailboxes(session.getUser(), right).stream();
     }
 
     private MailboxMetaData toMailboxMetadata(MailboxSession session, List<Mailbox> mailboxes, Mailbox mailbox) {
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 d109b3f..7db8dba 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
@@ -106,10 +106,10 @@ public class StoreRightManager implements RightManager {
         return Optional.ofNullable(username)
             .map(Throwing.function(value ->
                 aclResolver.resolveRights(
-                    username.asString(),
+                    username,
                     groupMembershipResolver,
                     mailbox.getACL(),
-                    mailbox.getUser(),
+                    mailbox.getUser().asString(),
                     !GROUP_FOLDER))
                 .sneakyThrow())
             .orElse(MailboxACL.NO_RIGHTS);
@@ -122,7 +122,7 @@ public class StoreRightManager implements RightManager {
 
         return aclResolver.listRights(key,
             groupMembershipResolver,
-            mailbox.getUser(),
+            mailbox.getUser().asString(),
             !GROUP_FOLDER);
     }
 
@@ -150,7 +150,7 @@ public class StoreRightManager implements RightManager {
             .block();
     }
 
-    private void assertSharesBelongsToUserDomain(String user, ACLCommand mailboxACLCommand) throws DifferentDomainException {
+    private void assertSharesBelongsToUserDomain(Username user, ACLCommand mailboxACLCommand) throws DifferentDomainException {
         assertSharesBelongsToUserDomain(user, ImmutableMap.of(mailboxACLCommand.getEntryKey(), mailboxACLCommand.getRights()));
     }
 
@@ -206,7 +206,7 @@ public class StoreRightManager implements RightManager {
     }
 
     @VisibleForTesting
-    void assertSharesBelongsToUserDomain(String user, Map<EntryKey, Rfc4314Rights> entries) throws DifferentDomainException {
+    void assertSharesBelongsToUserDomain(Username user, Map<EntryKey, Rfc4314Rights> entries) throws DifferentDomainException {
         if (entries.keySet().stream()
             .filter(entry -> !entry.getNameType().equals(NameType.special))
             .map(EntryKey::getName)
@@ -216,9 +216,9 @@ public class StoreRightManager implements RightManager {
     }
 
     @VisibleForTesting
-    boolean areDomainsDifferent(String user, String otherUser) {
+    boolean areDomainsDifferent(String user, Username otherUser) {
         Optional<Domain> domain = Username.of(user).getDomainPart();
-        Optional<Domain> otherDomain = Username.of(otherUser).getDomainPart();
+        Optional<Domain> otherDomain = otherUser.getDomainPart();
         return !domain.equals(otherDomain);
     }
 
@@ -260,7 +260,7 @@ public class StoreRightManager implements RightManager {
             return acl;
         }
 
-        MailboxACL.EntryKey userAsKey = MailboxACL.EntryKey.createUserEntryKey(mailboxSession.getUser().asString());
+        MailboxACL.EntryKey userAsKey = MailboxACL.EntryKey.createUserEntryKey(mailboxSession.getUser());
         Rfc4314Rights rights = acl.getEntries().getOrDefault(userAsKey, new Rfc4314Rights());
         if (rights.contains(MailboxACL.Right.Administer)) {
             return acl;
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 9cbc59c..235c04c 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
@@ -52,8 +52,8 @@ public class SystemMailboxesProviderImpl implements SystemMailboxesProvider {
 
     @Override
     public Stream<MessageManager> getMailboxByRole(Role aRole, Username username) throws MailboxException {
-        MailboxSession session = mailboxManager.createSystemSession(username.asString());
-        MailboxPath mailboxPath = MailboxPath.forUser(username.asString(), aRole.getDefaultMailbox());
+        MailboxSession session = mailboxManager.createSystemSession(username);
+        MailboxPath mailboxPath = MailboxPath.forUser(username, aRole.getDefaultMailbox());
         try {
             return Stream.of(mailboxManager.getMailbox(mailboxPath, session));
         } catch (MailboxNotFoundException e) {
@@ -68,7 +68,7 @@ public class SystemMailboxesProviderImpl implements SystemMailboxesProvider {
     }
 
     private Stream<MessageManager> searchMessageManagerByMailboxRole(Role aRole, Username username) throws MailboxException {
-        MailboxSession session = mailboxManager.createSystemSession(username.asString());
+        MailboxSession session = mailboxManager.createSystemSession(username);
         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/MailboxAnnotationListener.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/MailboxAnnotationListener.java
index 1b6cd37..a058294 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.getUsername().asString());
+            MailboxSession mailboxSession = sessionProvider.createSystemSession(event.getUsername());
             AnnotationMapper annotationMapper = mailboxSessionMapperFactory.getAnnotationMapper(mailboxSession);
             MailboxId mailboxId = ((MailboxDeletion) event).getMailboxId();
 
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AttachmentMapper.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AttachmentMapper.java
index 09b444d..8b411b3 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AttachmentMapper.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AttachmentMapper.java
@@ -21,12 +21,12 @@ package org.apache.james.mailbox.store.mail;
 import java.util.Collection;
 import java.util.List;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.AttachmentNotFoundException;
 import org.apache.james.mailbox.exception.MailboxException;
 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.model.Username;
 import org.apache.james.mailbox.store.transaction.Mapper;
 
 public interface AttachmentMapper extends Mapper {
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MailboxMapper.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MailboxMapper.java
index 6b73444..3ca9c5f 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MailboxMapper.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MailboxMapper.java
@@ -20,6 +20,7 @@ package org.apache.james.mailbox.store.mail;
 
 import java.util.List;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.acl.ACLDiff;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MailboxNotFoundException;
@@ -64,7 +65,7 @@ public interface MailboxMapper extends Mapper {
     /**
      * Return a List of {@link Mailbox} for the given userName and matching the right
      */
-    List<Mailbox> findNonPersonalMailboxes(String userName, Right right) throws MailboxException;
+    List<Mailbox> findNonPersonalMailboxes(Username userName, Right right) throws MailboxException;
 
     /**
      * Return a List of {@link Mailbox} which name is like the given name
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/Username.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/Username.java
deleted file mode 100644
index e2346d8..0000000
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/Username.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.mailbox.store.mail.model;
-
-import java.util.Objects;
-
-import org.apache.james.mailbox.MailboxSession;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Preconditions;
-
-public class Username {
-    public static Username fromMailboxSession(MailboxSession mailboxSession) {
-        Preconditions.checkNotNull(mailboxSession);
-        Preconditions.checkNotNull(mailboxSession.getUser());
-
-        return fromRawValue(mailboxSession.getUser().asString());
-    }
-
-    public static Username fromRawValue(String value) {
-        return new Username(value);
-    }
-
-    private final String value;
-
-    private Username(final String value) {
-        Preconditions.checkNotNull(value);
-
-        this.value = value;
-    }
-
-    public String getValue() {
-        return value;
-    }
-
-    @Override
-    public final boolean equals(final Object o) {
-        if (o instanceof Username) {
-            Username username = (Username) o;
-
-            return Objects.equals(this.value, username.value);
-        }
-        return false;
-    }
-
-    @Override
-    public final int hashCode() {
-        return Objects.hash(value);
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(this)
-            .add("value", value)
-            .toString();
-    }
-}
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 7bcd0e9..6f5ed08 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
@@ -84,8 +84,8 @@ public class DefaultUserQuotaRootResolver implements UserQuotaRootResolver {
         Preconditions.checkArgument(!mailboxPath.getNamespace().contains(SEPARATOR), "Namespace should not contain " + SEPARATOR);
         return Optional.ofNullable(mailboxPath.getUser())
                 .map(user -> {
-                    Preconditions.checkArgument(!mailboxPath.getUser().contains(SEPARATOR), "Username should not contain " + SEPARATOR);
-                    return Username.of(mailboxPath.getUser());
+                    Preconditions.checkArgument(!mailboxPath.getUser().asString().contains(SEPARATOR), "Username should not contain " + SEPARATOR);
+                    return mailboxPath.getUser();
                 })
                 .map(user -> QuotaRoot.quotaRoot(mailboxPath.getNamespace() + SEPARATOR + user.asString(), user.getDomainPart()))
                 .orElseGet(() -> QuotaRoot.quotaRoot(mailboxPath.getNamespace(), Optional.empty()));
@@ -93,12 +93,11 @@ public class DefaultUserQuotaRootResolver implements UserQuotaRootResolver {
 
     @Override
     public QuotaRoot getQuotaRoot(MailboxId mailboxId) throws MailboxException {
-        MailboxSession session = sessionProvider.createSystemSession("DefaultUserQuotaRootResolver");
-        Username username = Username.of(
-            factory.getMailboxMapper(session)
-                .findMailboxById(mailboxId)
-                .generateAssociatedPath()
-                .getUser());
+        MailboxSession session = sessionProvider.createSystemSession(Username.of("DefaultUserQuotaRootResolver"));
+        Username username = factory.getMailboxMapper(session)
+            .findMailboxById(mailboxId)
+            .generateAssociatedPath()
+            .getUser();
 
         return forUser(username);
     }
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 06dfecf..a04f94a 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.getUsername().asString()),
+            sessionProvider.createSystemSession(event.getUsername()),
             (MailboxEvent) event);
     }
 
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMailboxManagerAttachmentTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMailboxManagerAttachmentTest.java
index ec2d036..8727d45 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMailboxManagerAttachmentTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMailboxManagerAttachmentTest.java
@@ -29,6 +29,7 @@ import java.util.Optional;
 import java.util.stream.Stream;
 
 import org.apache.commons.io.IOUtils;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
@@ -50,7 +51,7 @@ import com.github.fge.lambdas.Throwing;
 import com.google.common.collect.ImmutableList;
 
 public abstract class AbstractMailboxManagerAttachmentTest {
-    private static final String USERNAME = "user@domain.tld";
+    private static final Username USERNAME = Username.of("user@domain.tld");
 
     private MailboxManager mailboxManager;
     private MessageMapper messageMapper;
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerStorageTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerStorageTest.java
index 661edb7..3ea3167 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerStorageTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerStorageTest.java
@@ -29,6 +29,7 @@ import java.util.function.Predicate;
 
 import javax.mail.Flags;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.MessageIdManager;
@@ -77,7 +78,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     public void setUp() throws Exception {
         aliceSession = MailboxSessionUtil.create(MailboxFixture.ALICE);
         bobSession = MailboxSessionUtil.create(MailboxFixture.BOB);
-        systemSession = MailboxSessionUtil.create("systemuser");
+        systemSession = MailboxSessionUtil.create(Username.of("systemuser"));
         testingData = createTestingData();
         messageIdManager = testingData.getMessageIdManager();
 
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreBlobManagerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreBlobManagerTest.java
index 7837d7e..33a3a32 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreBlobManagerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreBlobManagerTest.java
@@ -29,6 +29,7 @@ import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.AttachmentManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
@@ -67,7 +68,7 @@ public class StoreBlobManagerTest {
     public void setUp() {
         attachmentManager = mock(AttachmentManager.class);
         messageIdManager = mock(MessageIdManager.class);
-        session = MailboxSessionUtil.create("user");
+        session = MailboxSessionUtil.create(Username.of("user"));
 
         blobManager = new StoreBlobManager(attachmentManager, messageIdManager, new TestMessageId.Factory());
     }
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerAnnotationTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerAnnotationTest.java
index e22ac6e..2753748 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerAnnotationTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerAnnotationTest.java
@@ -32,6 +32,7 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.exception.MailboxException;
@@ -80,7 +81,7 @@ public class StoreMailboxManagerAnnotationTest {
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
 
-        session = MailboxSessionUtil.create("userName");
+        session = MailboxSessionUtil.create(Username.of("userName"));
 
         when(mailboxSessionMapperFactory.getMailboxMapper(eq(session))).thenReturn(mailboxMapper);
         when(mailboxSessionMapperFactory.getAnnotationMapper(eq(session))).thenReturn(annotationMapper);
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java
index 85834fd..45e922c 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java
@@ -24,6 +24,7 @@ import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.MessageManager;
@@ -57,12 +58,12 @@ import org.junit.Before;
 import org.junit.Test;
 
 public class StoreMailboxManagerTest {
-    private static final String CURRENT_USER = "user";
+    private static final Username CURRENT_USER = Username.of("user");
     private static final String CURRENT_USER_PASSWORD = "secret";
-    private static final String ADMIN = "admin";
+    private static final Username ADMIN = Username.of("admin");
     private static final String ADMIN_PASSWORD = "adminsecret";
     private static final MailboxId MAILBOX_ID = TestId.of(123);
-    private static final String UNKNOWN_USER = "otheruser";
+    private static final Username UNKNOWN_USER = Username.of("otheruser");
     private static final String BAD_PASSWORD = "badpassword";
     private static final String EMPTY_PREFIX = "";
 
@@ -122,7 +123,7 @@ public class StoreMailboxManagerTest {
     public void getMailboxShouldReturnMailboxManagerWhenKnownIdAndDifferentCaseUser() throws Exception {
         Mailbox mockedMailbox = mock(Mailbox.class);
         when(mockedMailbox.generateAssociatedPath())
-            .thenReturn(MailboxPath.forUser("uSEr", "mailboxName"));
+            .thenReturn(MailboxPath.forUser(Username.of("uSEr"), "mailboxName"));
         when(mockedMailbox.getMailboxId()).thenReturn(MAILBOX_ID);
         when(mockedMailboxMapper.findMailboxById(MAILBOX_ID)).thenReturn(mockedMailbox);
 
@@ -133,11 +134,13 @@ public class StoreMailboxManagerTest {
 
     @Test(expected = MailboxNotFoundException.class)
     public void getMailboxShouldThrowWhenMailboxDoesNotMatchUserWithoutRight() throws Exception {
+        Username otherUser = Username.of("other.user");
         Mailbox mockedMailbox = mock(Mailbox.class);
         when(mockedMailbox.getACL()).thenReturn(new MailboxACL());
         when(mockedMailbox.generateAssociatedPath())
-            .thenReturn(MailboxPath.forUser("other.user", "mailboxName"));
+            .thenReturn(MailboxPath.forUser(otherUser, "mailboxName"));
         when(mockedMailbox.getMailboxId()).thenReturn(MAILBOX_ID);
+        when(mockedMailbox.getUser()).thenReturn(otherUser);
         when(mockedMailboxMapper.findMailboxById(MAILBOX_ID)).thenReturn(mockedMailbox);
         when(mockedMailboxMapper.findMailboxByPath(any())).thenReturn(mockedMailbox);
 
@@ -150,7 +153,7 @@ public class StoreMailboxManagerTest {
     public void loginShouldCreateSessionWhenGoodPassword() throws Exception {
         MailboxSession expected = storeMailboxManager.login(CURRENT_USER, CURRENT_USER_PASSWORD);
 
-        assertThat(expected.getUser().asString()).isEqualTo(CURRENT_USER);
+        assertThat(expected.getUser()).isEqualTo(CURRENT_USER);
     }
 
     @Test(expected = BadCredentialsException.class)
@@ -192,13 +195,13 @@ public class StoreMailboxManagerTest {
     public void loginAsOtherUserShouldCreateUserSessionWhenAdminWithGoodPassword() throws Exception {
         MailboxSession expected = storeMailboxManager.loginAsOtherUser(ADMIN, ADMIN_PASSWORD, CURRENT_USER);
 
-        assertThat(expected.getUser().asString()).isEqualTo(CURRENT_USER);
+        assertThat(expected.getUser()).isEqualTo(CURRENT_USER);
     }
 
     @Test
     public void getPathLikeShouldReturnUserPathLikeWhenNoPrefixDefined() {
         //Given
-        MailboxSession session = MailboxSessionUtil.create("user");
+        MailboxSession session = MailboxSessionUtil.create(CURRENT_USER);
         MailboxQuery.Builder testee = MailboxQuery.builder()
             .expression(new PrefixedRegex(EMPTY_PREFIX, "abc", session.getPathDelimiter()));
         //When
@@ -207,7 +210,7 @@ public class StoreMailboxManagerTest {
         assertThat(StoreMailboxManager.toSingleUserQuery(mailboxQuery, session))
             .isEqualTo(MailboxQuery.builder()
                 .namespace(MailboxConstants.USER_NAMESPACE)
-                .username("user")
+                .username(Username.of("user"))
                 .expression(new PrefixedRegex(EMPTY_PREFIX, "abc*", session.getPathDelimiter()))
                 .build()
                 .asUserBound());
@@ -216,7 +219,7 @@ public class StoreMailboxManagerTest {
     @Test
     public void getPathLikeShouldReturnUserPathLikeWhenPrefixDefined() {
         //Given
-        MailboxSession session = MailboxSessionUtil.create("user");
+        MailboxSession session = MailboxSessionUtil.create(CURRENT_USER);
         MailboxQuery.Builder testee = MailboxQuery.builder()
             .expression(new PrefixedRegex("prefix.", "abc", session.getPathDelimiter()));
 
@@ -226,7 +229,7 @@ public class StoreMailboxManagerTest {
         assertThat(StoreMailboxManager.toSingleUserQuery(mailboxQuery, session))
             .isEqualTo(MailboxQuery.builder()
                 .namespace(MailboxConstants.USER_NAMESPACE)
-                .username("user")
+                .username(Username.of("user"))
                 .expression(new PrefixedRegex("prefix.", "abc*", session.getPathDelimiter()))
                 .build()
                 .asUserBound());
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreRightManagerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreRightManagerTest.java
index 7479b95..5de12a3 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreRightManagerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreRightManagerTest.java
@@ -30,6 +30,7 @@ import static org.mockito.Mockito.when;
 
 import javax.mail.Flags;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.acl.GroupMembershipResolver;
@@ -97,7 +98,7 @@ public class StoreRightManagerTest {
     @Test
     public void hasRightShouldReturnTrueWhenTheUserDoesNotOwnTheMailboxButHaveTheCorrectRightOnIt() throws MailboxException {
         Mailbox mailbox = new Mailbox(MailboxPath.forUser(BOB, MailboxConstants.INBOX), UID_VALIDITY);
-        mailbox.setACL(new MailboxACL(new MailboxACL.Entry(MailboxFixture.ALICE, Right.Write)));
+        mailbox.setACL(new MailboxACL(new MailboxACL.Entry(MailboxFixture.ALICE.asString(), Right.Write)));
 
         assertThat(storeRightManager.hasRight(mailbox, Right.Write, aliceSession))
             .isTrue();
@@ -106,7 +107,7 @@ public class StoreRightManagerTest {
     @Test
     public void hasRightShouldReturnTrueWhenTheUserDoesNotOwnTheMailboxButHasAtLeastTheCorrectRightOnIt() throws MailboxException {
         Mailbox mailbox = new Mailbox(MailboxPath.forUser(BOB, MailboxConstants.INBOX), UID_VALIDITY);
-        mailbox.setACL(new MailboxACL(new MailboxACL.Entry(MailboxFixture.ALICE, Right.Write, Right.Lookup)));
+        mailbox.setACL(new MailboxACL(new MailboxACL.Entry(MailboxFixture.ALICE.asString(), Right.Write, Right.Lookup)));
 
         assertThat(storeRightManager.hasRight(mailbox, Right.Write, aliceSession))
             .isTrue();
@@ -124,7 +125,7 @@ public class StoreRightManagerTest {
     public void isReadWriteShouldReturnTrueWhenUserHasInsertRightOnMailbox() throws Exception {
         Flags flags = new Flags();
         Mailbox mailbox = new Mailbox(MailboxPath.forUser(BOB, MailboxConstants.INBOX), UID_VALIDITY);
-        mailbox.setACL(new MailboxACL(new MailboxACL.Entry(MailboxFixture.ALICE, Right.Insert)));
+        mailbox.setACL(new MailboxACL(new MailboxACL.Entry(MailboxFixture.ALICE.asString(), Right.Insert)));
 
         assertThat(storeRightManager.isReadWrite(aliceSession, mailbox, flags))
             .isTrue();
@@ -134,7 +135,7 @@ public class StoreRightManagerTest {
     public void isReadWriteShouldReturnTrueWhenUserHasPerformExpungeRightOnMailbox() throws Exception {
         Flags flags = new Flags();
         Mailbox mailbox = new Mailbox(MailboxPath.forUser(BOB, MailboxConstants.INBOX), UID_VALIDITY);
-        mailbox.setACL(new MailboxACL(new MailboxACL.Entry(MailboxFixture.ALICE, Right.PerformExpunge)));
+        mailbox.setACL(new MailboxACL(new MailboxACL.Entry(MailboxFixture.ALICE.asString(), Right.PerformExpunge)));
 
         assertThat(storeRightManager.isReadWrite(aliceSession, mailbox, flags))
             .isTrue();
@@ -144,7 +145,7 @@ public class StoreRightManagerTest {
     public void isReadWriteShouldReturnTrueWhenUserHasDeleteMessagesRightOnMailboxAndFlagsContainDeletedFlag() throws Exception {
         Flags flags = new Flags(Flags.Flag.DELETED);
         Mailbox mailbox = new Mailbox(MailboxPath.forUser(BOB, MailboxConstants.INBOX), UID_VALIDITY);
-        mailbox.setACL(new MailboxACL(new MailboxACL.Entry(MailboxFixture.ALICE, Right.DeleteMessages)));
+        mailbox.setACL(new MailboxACL(new MailboxACL.Entry(MailboxFixture.ALICE.asString(), Right.DeleteMessages)));
 
         assertThat(storeRightManager.isReadWrite(aliceSession, mailbox, flags))
             .isTrue();
@@ -154,7 +155,7 @@ public class StoreRightManagerTest {
     public void isReadWriteShouldReturnFalseWhenUserHasDeleteMessagesRightOnMailboxButFlagsDoesNotContainDeletedFlag() throws Exception {
         Flags flags = new Flags();
         Mailbox mailbox = new Mailbox(MailboxPath.forUser(BOB, MailboxConstants.INBOX), UID_VALIDITY);
-        mailbox.setACL(new MailboxACL(new MailboxACL.Entry(MailboxFixture.ALICE, Right.DeleteMessages)));
+        mailbox.setACL(new MailboxACL(new MailboxACL.Entry(MailboxFixture.ALICE.asString(), Right.DeleteMessages)));
 
         assertThat(storeRightManager.isReadWrite(aliceSession, mailbox, flags))
             .isFalse();
@@ -164,7 +165,7 @@ public class StoreRightManagerTest {
     public void isReadWriteShouldReturnTrueWhenUserHasWriteSeenFlagRightOnMailboxAndFlagsContainSeenFlag() throws Exception {
         Flags flags = new Flags(Flags.Flag.SEEN);
         Mailbox mailbox = new Mailbox(MailboxPath.forUser(BOB, MailboxConstants.INBOX), UID_VALIDITY);
-        mailbox.setACL(new MailboxACL(new MailboxACL.Entry(MailboxFixture.ALICE, Right.WriteSeenFlag)));
+        mailbox.setACL(new MailboxACL(new MailboxACL.Entry(MailboxFixture.ALICE.asString(), Right.WriteSeenFlag)));
 
         assertThat(storeRightManager.isReadWrite(aliceSession, mailbox, flags))
             .isTrue();
@@ -174,7 +175,7 @@ public class StoreRightManagerTest {
     public void isReadWriteShouldReturnFalseWhenUserHasWriteSeenFlagRightOnMailboxAndFlagsDoesNotContainSeenFlag() throws Exception {
         Flags flags = new Flags();
         Mailbox mailbox = new Mailbox(MailboxPath.forUser(BOB, MailboxConstants.INBOX), UID_VALIDITY);
-        mailbox.setACL(new MailboxACL(new MailboxACL.Entry(MailboxFixture.ALICE, Right.WriteSeenFlag)));
+        mailbox.setACL(new MailboxACL(new MailboxACL.Entry(MailboxFixture.ALICE.asString(), Right.WriteSeenFlag)));
 
         assertThat(storeRightManager.isReadWrite(aliceSession, mailbox, flags))
             .isFalse();
@@ -184,7 +185,7 @@ public class StoreRightManagerTest {
     public void isReadWriteShouldReturnTrueWhenUserHasWriteRightOnMailboxAndFlagsContainAnsweredFlag() throws Exception {
         Flags flags = new Flags(Flags.Flag.ANSWERED);
         Mailbox mailbox = new Mailbox(MailboxPath.forUser(BOB, MailboxConstants.INBOX), UID_VALIDITY);
-        mailbox.setACL(new MailboxACL(new MailboxACL.Entry(MailboxFixture.ALICE, Right.Write)));
+        mailbox.setACL(new MailboxACL(new MailboxACL.Entry(MailboxFixture.ALICE.asString(), Right.Write)));
 
         assertThat(storeRightManager.isReadWrite(aliceSession, mailbox, flags))
             .isTrue();
@@ -193,7 +194,7 @@ public class StoreRightManagerTest {
     @Test
     public void isReadWriteShouldReturnFalseWhenUserDoesNotHaveInsertOrPerformExpungeRightOnMailboxAndNullFlag() throws Exception {
         Mailbox mailbox = new Mailbox(MailboxPath.forUser(BOB, MailboxConstants.INBOX), UID_VALIDITY);
-        mailbox.setACL(new MailboxACL(new MailboxACL.Entry(MailboxFixture.ALICE, Right.Administer)));
+        mailbox.setACL(new MailboxACL(new MailboxACL.Entry(MailboxFixture.ALICE.asString(), Right.Administer)));
 
         assertThat(storeRightManager.isReadWrite(aliceSession, mailbox, new Flags()))
             .isFalse();
@@ -231,27 +232,27 @@ public class StoreRightManagerTest {
 
     @Test
     public void areDomainsDifferentShouldReturnTrueWhenOneHasDomainNotTheOther() {
-        assertThat(storeRightManager.areDomainsDifferent("user@domain.org", "otherUser")).isTrue();
+        assertThat(storeRightManager.areDomainsDifferent("user@domain.org", Username.of("otherUser"))).isTrue();
     }
 
     @Test
     public void areDomainsDifferentShouldReturnTrueWhenOtherHasDomainNotTheOne() {
-        assertThat(storeRightManager.areDomainsDifferent("user", "otherUser@domain.org")).isTrue();
+        assertThat(storeRightManager.areDomainsDifferent("user", Username.of("otherUser@domain.org"))).isTrue();
     }
 
     @Test
     public void areDomainsDifferentShouldReturnFalseWhenNoDomain() {
-        assertThat(storeRightManager.areDomainsDifferent("user", "otherUser")).isFalse();
+        assertThat(storeRightManager.areDomainsDifferent("user", Username.of("otherUser"))).isFalse();
     }
 
     @Test
     public void areDomainsDifferentShouldReturnTrueWhenDomainsAreDifferent() {
-        assertThat(storeRightManager.areDomainsDifferent("user@domain.org", "otherUser@otherdomain.org")).isTrue();
+        assertThat(storeRightManager.areDomainsDifferent("user@domain.org", Username.of("otherUser@otherdomain.org"))).isTrue();
     }
 
     @Test
     public void areDomainsDifferentShouldReturnFalseWhenDomainsAreIdentical() {
-        assertThat(storeRightManager.areDomainsDifferent("user@domain.org", "otherUser@domain.org")).isFalse();
+        assertThat(storeRightManager.areDomainsDifferent("user@domain.org", Username.of("otherUser@domain.org"))).isFalse();
     }
 
     @Test
@@ -260,7 +261,7 @@ public class StoreRightManagerTest {
                 new MailboxACL.Entry("b@otherdomain.org", Right.Write), 
                 new MailboxACL.Entry("c@domain.org", Right.Write));
         
-        assertThatThrownBy(() -> storeRightManager.assertSharesBelongsToUserDomain("user@domain.org", mailboxACL.getEntries()))
+        assertThatThrownBy(() -> storeRightManager.assertSharesBelongsToUserDomain(Username.of("user@domain.org"), mailboxACL.getEntries()))
             .isInstanceOf(DifferentDomainException.class);
     }
 
@@ -270,14 +271,14 @@ public class StoreRightManagerTest {
                 new MailboxACL.Entry("b@domain.org", Right.Write), 
                 new MailboxACL.Entry("c@domain.org", Right.Write));
         
-        storeRightManager.assertSharesBelongsToUserDomain("user@domain.org", mailboxACL.getEntries());
+        storeRightManager.assertSharesBelongsToUserDomain(Username.of("user@domain.org"), mailboxACL.getEntries());
     }
 
     @Test
     public void applyRightsCommandShouldThrowWhenDomainsAreDifferent() {
-        MailboxPath mailboxPath = MailboxPath.forUser("user@domain.org", "mailbox");
+        MailboxPath mailboxPath = MailboxPath.forUser(Username.of("user@domain.org"), "mailbox");
         ACLCommand aclCommand = MailboxACL.command()
-            .forUser("otherUser@otherdomain.org")
+            .forUser(Username.of("otherUser@otherdomain.org"))
             .rights(MailboxACL.FULL_RIGHTS)
             .asAddition();
        
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 0f97e65..b7feb4d 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
@@ -30,6 +30,7 @@ import static org.mockito.Mockito.when;
 import java.util.List;
 import java.util.Optional;
 
+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;
@@ -54,7 +55,8 @@ import org.mockito.MockitoAnnotations;
 import com.google.common.collect.ImmutableList;
 
 public class MailboxAnnotationListenerTest {
-    private static final MailboxPath MAILBOX_PATH = new MailboxPath("namespace", "user", "name");
+    private static final Username USER = Username.of("user");
+    private static final MailboxPath MAILBOX_PATH = new MailboxPath("namespace", USER, "name");
 
     private static final MailboxAnnotationKey PRIVATE_KEY = new MailboxAnnotationKey("/private/comment");
     private static final MailboxAnnotationKey SHARED_KEY = new MailboxAnnotationKey("/shared/comment");
@@ -78,20 +80,20 @@ public class MailboxAnnotationListenerTest {
     @Before
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
-        mailboxSession = MailboxSessionUtil.create("test");
+        mailboxSession = MailboxSessionUtil.create(Username.of("test"));
         listener = new MailboxAnnotationListener(mailboxSessionMapperFactory, sessionProvider);
 
         deleteEvent = EventFactory.mailboxDeleted()
             .randomEventId()
             .mailboxSession(mailboxSession)
             .mailboxId(mailboxId)
-            .mailboxPath(MailboxPath.forUser("user", "name"))
+            .mailboxPath(MailboxPath.forUser(USER, "name"))
             .quotaRoot(QuotaRoot.quotaRoot("root", Optional.empty()))
             .quotaCount(QuotaCount.count(123))
             .quotaSize(QuotaSize.size(456))
             .build();
 
-        when(sessionProvider.createSystemSession(deleteEvent.getUsername().asString()))
+        when(sessionProvider.createSystemSession(deleteEvent.getUsername()))
             .thenReturn(mailboxSession);
         when(mailboxSessionMapperFactory.getAnnotationMapper(eq(mailboxSession))).thenReturn(annotationMapper);
     }
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/MessageUtilsTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/MessageUtilsTest.java
index bf1a65f..840890b 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/MessageUtilsTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/MessageUtilsTest.java
@@ -29,6 +29,7 @@ import java.util.Date;
 import javax.mail.Flags;
 import javax.mail.util.SharedByteArrayInputStream;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.MessageUid;
@@ -65,7 +66,7 @@ public class MessageUtilsTest {
     @Before
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
-        mailboxSession = MailboxSessionUtil.create("user");
+        mailboxSession = MailboxSessionUtil.create(Username.of("user"));
         messageUtils = new MessageUtils(mailboxSession, uidProvider, modSeqProvider);
         message = new SimpleMailboxMessage(MESSAGE_ID, new Date(), CONTENT.length(), BODY_START, new SharedByteArrayInputStream(CONTENT.getBytes()), new Flags(), new PropertyBuilder(), mailbox.getMailboxId());
     }
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AttachmentMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AttachmentMapperTest.java
index 63f50c2..7312bc7 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AttachmentMapperTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AttachmentMapperTest.java
@@ -25,6 +25,7 @@ import java.nio.charset.StandardCharsets;
 import java.util.Collection;
 import java.util.List;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.AttachmentNotFoundException;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.Attachment;
@@ -39,8 +40,8 @@ import com.google.common.collect.ImmutableList;
 
 public abstract class AttachmentMapperTest {
     private static final AttachmentId UNKNOWN_ATTACHMENT_ID = AttachmentId.from("unknown");
-    public static final Username OWNER = Username.fromRawValue("owner");
-    public static final Username ADDITIONAL_OWNER = Username.fromRawValue("additionalOwner");
+    public static final Username OWNER = Username.of("owner");
+    public static final Username ADDITIONAL_OWNER = Username.of("additionalOwner");
 
     private AttachmentMapper attachmentMapper;
 
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMailboxAssert.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMailboxAssert.java
index 334ee02..39842c5 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMailboxAssert.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMailboxAssert.java
@@ -23,6 +23,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import java.util.List;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxId;
 
@@ -55,11 +56,11 @@ public class ListMailboxAssert {
 
     private final class InnerMailbox {
         private final MailboxId id;
-        private final String user;
+        private final Username user;
         private final String name;
         private final String namespace;
 
-        public InnerMailbox(MailboxId id, String user, String name, String namespace) {
+        public InnerMailbox(MailboxId id, Username user, String name, String namespace) {
             this.id = id;
             this.user = user;
             this.name = name;
@@ -70,7 +71,7 @@ public class ListMailboxAssert {
             return id;
         }
 
-        public String getUser() {
+        public Username getUser() {
             return user;
         }
 
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMailboxAssertTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMailboxAssertTest.java
index 49082aa..ad4c5c0 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMailboxAssertTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMailboxAssertTest.java
@@ -24,6 +24,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import java.util.List;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.junit.Before;
@@ -34,7 +35,7 @@ import com.google.common.collect.ImmutableList;
 public class ListMailboxAssertTest {
     private static final String OTHER_NAMESPACE = "other_namespace";
     private static final String NAME = "name";
-    private static final String USER = "user";
+    private static final Username USER = Username.of("user");
     private static final String NAMESPACE = "namespace";
     private static final long UID_VALIDITY = 42;
     private static final Mailbox mailbox1 = new Mailbox(new MailboxPath(NAMESPACE, USER, NAME), UID_VALIDITY);
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMessageAssertTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMessageAssertTest.java
index ee42ac9..516f39e 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMessageAssertTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMessageAssertTest.java
@@ -29,6 +29,7 @@ import java.util.List;
 import javax.mail.Flags;
 import javax.mail.util.SharedByteArrayInputStream;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.model.ComposedMessageId;
 import org.apache.james.mailbox.model.ComposedMessageIdWithMetaData;
@@ -62,7 +63,7 @@ public class ListMessageAssertTest {
     
     @Before
     public void setUp() {
-        benwaInboxMailbox = createMailbox(MailboxPath.forUser("user", "INBOX"));
+        benwaInboxMailbox = createMailbox(MailboxPath.forUser(Username.of("user"), "INBOX"));
 
         message1 = createMessage(benwaInboxMailbox, MESSAGE_ID, BODY_CONTENT1, BODY_START, new PropertyBuilder());
         message2 = createMessage(benwaInboxMailbox, MESSAGE_ID, BODY_CONTENT2, BODY_START, new PropertyBuilder());
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperACLTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperACLTest.java
index 4989cf1..9e9d07a 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperACLTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperACLTest.java
@@ -21,12 +21,12 @@ package org.apache.james.mailbox.store.mail.model;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.acl.ACLDiff;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MailboxACL.EntryKey;
-import org.apache.james.mailbox.model.MailboxACL.NameType;
 import org.apache.james.mailbox.model.MailboxACL.Rfc4314Rights;
 import org.apache.james.mailbox.model.MailboxACL.Right;
 import org.apache.james.mailbox.model.MailboxId;
@@ -42,6 +42,9 @@ public abstract class MailboxMapperACLTest {
     private static final long UID_VALIDITY = 42;
     public static final boolean POSITIVE = true;
     public static final boolean NEGATIVE = !POSITIVE;
+    private static final Username USER = Username.of("user");
+    private static final Username USER_1 = Username.of("user1");
+    private static final Username USER_2 = Username.of("user2");
 
     private Mailbox benwaInboxMailbox;
 
@@ -56,7 +59,7 @@ public abstract class MailboxMapperACLTest {
 
     public void setUp() throws Exception {
         mailboxMapper = createMailboxMapper();
-        MailboxPath benwaInboxPath = MailboxPath.forUser("benwa", "INBOX");
+        MailboxPath benwaInboxPath = MailboxPath.forUser(Username.of("benwa"), "INBOX");
         benwaInboxMailbox = createMailbox(benwaInboxPath);
         mailboxMapper.save(benwaInboxMailbox);
     }
@@ -72,7 +75,7 @@ public abstract class MailboxMapperACLTest {
 
     @Test
     public void updateAclShouldSaveAclWhenReplace() throws MailboxException {
-        EntryKey key = new EntryKey("user", NameType.user, NEGATIVE);
+        EntryKey key = EntryKey.createUserEntryKey(USER);
         Rfc4314Rights rights = new Rfc4314Rights(Right.Administer, Right.PerformExpunge, Right.Write, Right.WriteSeenFlag);
         mailboxMapper.updateACL(benwaInboxMailbox, MailboxACL.command().key(key).rights(rights).asReplacement());
 
@@ -86,7 +89,7 @@ public abstract class MailboxMapperACLTest {
 
     @Test
     public void updateAclShouldOverwriteStoredAclWhenReplace() throws MailboxException {
-        EntryKey key = new EntryKey("user", NameType.user, NEGATIVE);
+        EntryKey key = EntryKey.createUserEntryKey(USER);
         Rfc4314Rights rights = new Rfc4314Rights(Right.Administer, Right.PerformExpunge, Right.Write, Right.WriteSeenFlag);
         Rfc4314Rights newRights = new Rfc4314Rights(Right.WriteSeenFlag, Right.CreateMailbox, Right.Administer, Right.PerformExpunge, Right.DeleteMessages);
 
@@ -103,8 +106,8 @@ public abstract class MailboxMapperACLTest {
 
     @Test
     public void updateAclShouldTreatNegativeAndPositiveRightSeparately() throws MailboxException {
-        EntryKey key1 = new EntryKey("user", NameType.user, NEGATIVE);
-        EntryKey key2 = new EntryKey("user", NameType.user, POSITIVE);
+        EntryKey key1 = EntryKey.createUserEntryKey(USER, NEGATIVE);
+        EntryKey key2 = EntryKey.createUserEntryKey(USER, POSITIVE);
         Rfc4314Rights rights = new Rfc4314Rights(Right.Administer, Right.PerformExpunge, Right.Write, Right.WriteSeenFlag);
         Rfc4314Rights newRights = new Rfc4314Rights(Right.WriteSeenFlag, Right.CreateMailbox, Right.Administer, Right.PerformExpunge, Right.DeleteMessages);
         mailboxMapper.updateACL(benwaInboxMailbox, MailboxACL.command().key(key1).rights(rights).asReplacement());
@@ -121,8 +124,8 @@ public abstract class MailboxMapperACLTest {
 
     @Test
     public void updateAclShouldTreatNameTypesRightSeparately() throws MailboxException {
-        EntryKey key1 = new EntryKey("user", NameType.user, NEGATIVE);
-        EntryKey key2 = new EntryKey("user", NameType.group, NEGATIVE);
+        EntryKey key1 = EntryKey.createUserEntryKey(USER);
+        EntryKey key2 = EntryKey.createGroupEntryKey(USER.asString());
         Rfc4314Rights rights = new Rfc4314Rights(Right.Administer, Right.PerformExpunge, Right.Write, Right.WriteSeenFlag);
         Rfc4314Rights newRights = new Rfc4314Rights(Right.WriteSeenFlag, Right.CreateMailbox, Right.Administer, Right.PerformExpunge, Right.DeleteMessages);
         mailboxMapper.updateACL(benwaInboxMailbox, MailboxACL.command().key(key1).rights(rights).asReplacement());
@@ -139,7 +142,7 @@ public abstract class MailboxMapperACLTest {
 
     @Test
     public void updateAclShouldCleanAclEntryWhenEmptyReplace() throws MailboxException {
-        EntryKey key = new EntryKey("user", NameType.user, NEGATIVE);
+        EntryKey key = EntryKey.createUserEntryKey(USER);
         Rfc4314Rights rights = new Rfc4314Rights(Right.Administer, Right.PerformExpunge, Right.Write, Right.WriteSeenFlag);
         Rfc4314Rights newRights = new Rfc4314Rights();
         mailboxMapper.updateACL(benwaInboxMailbox, MailboxACL.command().key(key).rights(rights).asReplacement());
@@ -154,7 +157,7 @@ public abstract class MailboxMapperACLTest {
 
     @Test
     public void updateAclShouldCombineStoredAclWhenAdd() throws MailboxException {
-        EntryKey key = new EntryKey("user", NameType.user, NEGATIVE);
+        EntryKey key = EntryKey.createUserEntryKey(USER);
         Rfc4314Rights rights = new Rfc4314Rights(Right.Administer, Right.PerformExpunge, Right.Write, Right.WriteSeenFlag);
         Rfc4314Rights newRights = new Rfc4314Rights(Right.WriteSeenFlag, Right.CreateMailbox, Right.Administer, Right.PerformExpunge, Right.DeleteMessages);
         Rfc4314Rights bothRights = new Rfc4314Rights(Right.Administer, Right.WriteSeenFlag, Right.PerformExpunge, Right.Write, Right.CreateMailbox, Right.DeleteMessages);
@@ -171,7 +174,7 @@ public abstract class MailboxMapperACLTest {
 
     @Test
     public void removeAclShouldRemoveSomeStoredAclWhenAdd() throws MailboxException {
-        EntryKey key = new EntryKey("user", NameType.user, NEGATIVE);
+        EntryKey key = EntryKey.createUserEntryKey(USER);
         Rfc4314Rights rights = new Rfc4314Rights(Right.Administer, Right.PerformExpunge, Right.Write, Right.WriteSeenFlag);
         Rfc4314Rights removedRights = new Rfc4314Rights(Right.WriteSeenFlag, Right.PerformExpunge);
         Rfc4314Rights finalRights = new Rfc4314Rights(Right.Administer, Right.Write);
@@ -188,7 +191,7 @@ public abstract class MailboxMapperACLTest {
 
     @Test
     public void removeAclShouldNotFailWhenRemovingNonExistingRight() throws MailboxException {
-        EntryKey key = new EntryKey("user", NameType.user, NEGATIVE);
+        EntryKey key = EntryKey.createUserEntryKey(USER);
         Rfc4314Rights rights = new Rfc4314Rights(Right.Administer, Right.PerformExpunge, Right.Write, Right.WriteSeenFlag);
         Rfc4314Rights removedRights = new Rfc4314Rights(Right.WriteSeenFlag, Right.PerformExpunge, Right.Lookup);
         Rfc4314Rights finalRights = new Rfc4314Rights(Right.Administer, Right.Write);
@@ -205,7 +208,7 @@ public abstract class MailboxMapperACLTest {
 
     @Test
     public void resetAclShouldReplaceStoredAcl() throws MailboxException {
-        EntryKey key = new EntryKey("user", NameType.user, NEGATIVE);
+        EntryKey key = EntryKey.createUserEntryKey(USER);
         Rfc4314Rights rights = new Rfc4314Rights(Right.Administer, Right.PerformExpunge, Right.Write, Right.WriteSeenFlag);
         Rfc4314Rights newRights = new Rfc4314Rights(Right.WriteSeenFlag, Right.CreateMailbox, Right.Administer, Right.PerformExpunge, Right.DeleteMessages);
         mailboxMapper.updateACL(benwaInboxMailbox, MailboxACL.command().key(key).rights(rights).asReplacement());
@@ -221,7 +224,7 @@ public abstract class MailboxMapperACLTest {
     
     @Test
     public void resetAclShouldInitializeStoredAcl() throws MailboxException {
-        EntryKey key = new EntryKey("user", NameType.user, NEGATIVE);
+        EntryKey key = EntryKey.createUserEntryKey(USER);
         Rfc4314Rights rights = new Rfc4314Rights(Right.WriteSeenFlag, Right.CreateMailbox, Right.Administer, Right.PerformExpunge, Right.DeleteMessages);
         mailboxMapper.setACL(benwaInboxMailbox,
             new MailboxACL(ImmutableMap.of(key, rights)));
@@ -242,12 +245,12 @@ public abstract class MailboxMapperACLTest {
 
     @Test
     public void findMailboxesShouldReturnEmptyWhenNone() throws MailboxException {
-        assertThat(mailboxMapper.findNonPersonalMailboxes("user", Right.Administer)).isEmpty();
+        assertThat(mailboxMapper.findNonPersonalMailboxes(USER, Right.Administer)).isEmpty();
     }
 
     @Test
     public void findMailboxesShouldReturnEmptyWhenRightDoesntMatch() throws MailboxException {
-        EntryKey key = EntryKey.createUserEntryKey("user");
+        EntryKey key = EntryKey.createUserEntryKey(USER);
         Rfc4314Rights rights = new Rfc4314Rights(Right.Administer);
         mailboxMapper.updateACL(benwaInboxMailbox,
             MailboxACL.command()
@@ -255,7 +258,7 @@ public abstract class MailboxMapperACLTest {
                 .rights(rights)
                 .asReplacement());
 
-        assertThat(mailboxMapper.findNonPersonalMailboxes("user", Right.Read)).isEmpty();
+        assertThat(mailboxMapper.findNonPersonalMailboxes(USER, Right.Read)).isEmpty();
     }
 
     @Test
@@ -263,17 +266,17 @@ public abstract class MailboxMapperACLTest {
         Rfc4314Rights rights = new Rfc4314Rights(Right.Administer, Right.PerformExpunge);
         mailboxMapper.updateACL(benwaInboxMailbox,
             MailboxACL.command()
-                .key(EntryKey.createUserEntryKey("user"))
+                .key(EntryKey.createUserEntryKey(USER))
                 .rights(rights)
                 .asAddition());
 
-        assertThat(mailboxMapper.findNonPersonalMailboxes("user", Right.Administer))
+        assertThat(mailboxMapper.findNonPersonalMailboxes(USER, Right.Administer))
             .containsOnly(benwaInboxMailbox);
     }
 
     @Test
     public void updateACLShouldOverwriteUsersRights() throws MailboxException {
-        EntryKey key = EntryKey.createUserEntryKey("user");
+        EntryKey key = EntryKey.createUserEntryKey(USER);
         Rfc4314Rights initialRights = new Rfc4314Rights(Right.Administer);
         mailboxMapper.updateACL(benwaInboxMailbox,
             MailboxACL.command()
@@ -287,16 +290,16 @@ public abstract class MailboxMapperACLTest {
                 .rights(newRights)
                 .asReplacement());
 
-        assertThat(mailboxMapper.findNonPersonalMailboxes("user", Right.Read))
+        assertThat(mailboxMapper.findNonPersonalMailboxes(USER, Right.Read))
             .containsOnly(benwaInboxMailbox);
 
-        assertThat(mailboxMapper.findNonPersonalMailboxes("user", Right.Administer))
+        assertThat(mailboxMapper.findNonPersonalMailboxes(USER, Right.Administer))
             .isEmpty();
     }
 
     @Test
     public void findMailboxesShouldNotReportDeletedACLViaReplace() throws MailboxException {
-        EntryKey key = EntryKey.createUserEntryKey("user");
+        EntryKey key = EntryKey.createUserEntryKey(USER);
         Rfc4314Rights initialRights = new Rfc4314Rights(Right.Administer);
         mailboxMapper.updateACL(benwaInboxMailbox,
             MailboxACL.command()
@@ -311,13 +314,13 @@ public abstract class MailboxMapperACLTest {
                 .rights(new Rfc4314Rights())
                 .build());
 
-        assertThat(mailboxMapper.findNonPersonalMailboxes("user", Right.Administer))
+        assertThat(mailboxMapper.findNonPersonalMailboxes(USER, Right.Administer))
             .isEmpty();
     }
 
     @Test
     public void findMailboxesShouldNotReportDeletedACLViaRemove() throws MailboxException {
-        EntryKey key = EntryKey.createUserEntryKey("user");
+        EntryKey key = EntryKey.createUserEntryKey(USER);
         Rfc4314Rights initialRights = new Rfc4314Rights(Right.Administer);
         mailboxMapper.updateACL(benwaInboxMailbox,
             MailboxACL.command()
@@ -330,13 +333,13 @@ public abstract class MailboxMapperACLTest {
                 .rights(initialRights)
                 .asRemoval());
 
-        assertThat(mailboxMapper.findNonPersonalMailboxes("user", Right.Administer))
+        assertThat(mailboxMapper.findNonPersonalMailboxes(USER, Right.Administer))
             .isEmpty();
     }
 
     @Test
     public void findMailboxesShouldNotReportDeletedMailboxes() throws MailboxException {
-        EntryKey key = EntryKey.createUserEntryKey("user");
+        EntryKey key = EntryKey.createUserEntryKey(USER);
         Rfc4314Rights initialRights = new Rfc4314Rights(Right.Administer);
         mailboxMapper.updateACL(benwaInboxMailbox,
             MailboxACL.command()
@@ -345,29 +348,29 @@ public abstract class MailboxMapperACLTest {
                 .asReplacement());
         mailboxMapper.delete(benwaInboxMailbox);
 
-        assertThat(mailboxMapper.findNonPersonalMailboxes("user", Right.Administer))
+        assertThat(mailboxMapper.findNonPersonalMailboxes(USER, Right.Administer))
             .isEmpty();
     }
 
     @Test
     public void setACLShouldStoreMultipleUsersRights() throws MailboxException {
-        EntryKey user1 = EntryKey.createUserEntryKey("user1");
-        EntryKey user2 = EntryKey.createUserEntryKey("user2");
+        EntryKey user1 = EntryKey.createUserEntryKey(USER_1);
+        EntryKey user2 = EntryKey.createUserEntryKey(USER_2);
 
         mailboxMapper.setACL(benwaInboxMailbox, new MailboxACL(
             new MailboxACL.Entry(user1, new Rfc4314Rights(Right.Administer)),
             new MailboxACL.Entry(user2, new Rfc4314Rights(Right.Read))));
 
-        assertThat(mailboxMapper.findNonPersonalMailboxes("user1", Right.Administer))
+        assertThat(mailboxMapper.findNonPersonalMailboxes(USER_1, Right.Administer))
             .containsOnly(benwaInboxMailbox);
-        assertThat(mailboxMapper.findNonPersonalMailboxes("user2", Right.Read))
+        assertThat(mailboxMapper.findNonPersonalMailboxes(USER_2, Right.Read))
             .containsOnly(benwaInboxMailbox);
     }
 
     @Test
     public void findMailboxesShouldNotReportRightsRemovedViaSetAcl() throws MailboxException {
-        EntryKey user1 = EntryKey.createUserEntryKey("user1");
-        EntryKey user2 = EntryKey.createUserEntryKey("user2");
+        EntryKey user1 = EntryKey.createUserEntryKey(USER_1);
+        EntryKey user2 = EntryKey.createUserEntryKey(USER_2);
 
         mailboxMapper.setACL(benwaInboxMailbox, new MailboxACL(
             new MailboxACL.Entry(user1, new Rfc4314Rights(Right.Administer)),
@@ -376,14 +379,14 @@ public abstract class MailboxMapperACLTest {
         mailboxMapper.setACL(benwaInboxMailbox, new MailboxACL(
             new MailboxACL.Entry(user2, new Rfc4314Rights(Right.Read))));
 
-        assertThat(mailboxMapper.findNonPersonalMailboxes("user1", Right.Administer))
+        assertThat(mailboxMapper.findNonPersonalMailboxes(USER_1, Right.Administer))
             .isEmpty();
     }
 
     @Test
     public void findMailboxesShouldReportRightsUpdatedViaSetAcl() throws MailboxException {
-        EntryKey user1 = EntryKey.createUserEntryKey("user1");
-        EntryKey user2 = EntryKey.createUserEntryKey("user2");
+        EntryKey user1 = EntryKey.createUserEntryKey(USER_1);
+        EntryKey user2 = EntryKey.createUserEntryKey(USER_2);
 
         mailboxMapper.setACL(benwaInboxMailbox, new MailboxACL(
             new MailboxACL.Entry(user1, new Rfc4314Rights(Right.Administer)),
@@ -392,13 +395,13 @@ public abstract class MailboxMapperACLTest {
         mailboxMapper.setACL(benwaInboxMailbox, new MailboxACL(
             new MailboxACL.Entry(user2, new Rfc4314Rights(Right.Write))));
 
-        assertThat(mailboxMapper.findNonPersonalMailboxes("user2", Right.Write))
+        assertThat(mailboxMapper.findNonPersonalMailboxes(USER_2, Right.Write))
             .containsOnly(benwaInboxMailbox);
     }
 
     @Test
     public void findMailboxByPathShouldReturnMailboxWithACL() throws MailboxException {
-        EntryKey key = EntryKey.createUserEntryKey("user");
+        EntryKey key = EntryKey.createUserEntryKey(USER);
         Rfc4314Rights rights = new Rfc4314Rights(Right.WriteSeenFlag, Right.CreateMailbox, Right.Administer, Right.PerformExpunge, Right.DeleteMessages);
         mailboxMapper.setACL(benwaInboxMailbox,
             new MailboxACL(ImmutableMap.of(key, rights)));
@@ -413,7 +416,7 @@ public abstract class MailboxMapperACLTest {
 
     @Test
     public void setACLShouldReturnACLDiff() throws MailboxException {
-        EntryKey key = EntryKey.createUserEntryKey("user");
+        EntryKey key = EntryKey.createUserEntryKey(USER);
         Rfc4314Rights rights = new Rfc4314Rights(Right.WriteSeenFlag, Right.CreateMailbox, Right.Administer, Right.PerformExpunge, Right.DeleteMessages);
 
         ACLDiff expectAclDiff = ACLDiff.computeDiff(MailboxACL.EMPTY, MailboxACL.EMPTY.apply(
@@ -428,7 +431,7 @@ public abstract class MailboxMapperACLTest {
 
     @Test
     public void updateACLShouldReturnACLDiff() throws MailboxException {
-        EntryKey key = EntryKey.createUserEntryKey("user");
+        EntryKey key = EntryKey.createUserEntryKey(USER);
         Rfc4314Rights rights = new Rfc4314Rights(Right.WriteSeenFlag, Right.CreateMailbox, Right.Administer, Right.PerformExpunge, Right.DeleteMessages);
 
         MailboxACL.ACLCommand aclCommand = MailboxACL.command()
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperTest.java
index 739d1bd..2c4efef 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperTest.java
@@ -25,6 +25,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.util.List;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MailboxExistsException;
 import org.apache.james.mailbox.exception.MailboxNotFoundException;
@@ -44,10 +45,11 @@ import org.junit.Test;
  * You then just need to instantiate your mailbox mapper and an IdGenerator.
  */
 public abstract class MailboxMapperTest {
-    
+
     private static final char DELIMITER = '.';
     private static final char WILDCARD = '%';
     private static final long UID_VALIDITY = 42;
+    private static final Username BENWA = Username.of("benwa");
 
     private MailboxPath benwaInboxPath;
     private Mailbox benwaInboxMailbox;
@@ -80,7 +82,7 @@ public abstract class MailboxMapperTest {
 
     @Test
     public void findMailboxByPathWhenAbsentShouldFail() throws MailboxException {
-        assertThatThrownBy(() -> mailboxMapper.findMailboxByPath(MailboxPath.forUser("benwa", "INBOX")))
+        assertThatThrownBy(() -> mailboxMapper.findMailboxByPath(MailboxPath.forUser(BENWA, "INBOX")))
             .isInstanceOf(MailboxNotFoundException.class);
     }
 
@@ -209,14 +211,14 @@ public abstract class MailboxMapperTest {
     }
 
     private void initData() {
-        benwaInboxPath = MailboxPath.forUser("benwa", "INBOX");
-        benwaWorkPath = MailboxPath.forUser("benwa", "INBOX" + DELIMITER + "work");
-        benwaWorkTodoPath = MailboxPath.forUser("benwa", "INBOX" + DELIMITER + "work" + DELIMITER + "todo");
-        benwaPersoPath = MailboxPath.forUser("benwa", "INBOX" + DELIMITER + "perso");
-        benwaWorkDonePath = MailboxPath.forUser("benwa", "INBOX" + DELIMITER + "work" + DELIMITER + "done");
-        bobInboxPath = MailboxPath.forUser("bob", "INBOX");
-        bobyMailboxPath = MailboxPath.forUser("boby", "INBOX.that.is.a.trick");
-        bobDifferentNamespacePath = new MailboxPath("#private_bob", "bob", "INBOX.bob");
+        benwaInboxPath = MailboxPath.forUser(BENWA, "INBOX");
+        benwaWorkPath = MailboxPath.forUser(BENWA, "INBOX" + DELIMITER + "work");
+        benwaWorkTodoPath = MailboxPath.forUser(BENWA, "INBOX" + DELIMITER + "work" + DELIMITER + "todo");
+        benwaPersoPath = MailboxPath.forUser(BENWA, "INBOX" + DELIMITER + "perso");
+        benwaWorkDonePath = MailboxPath.forUser(BENWA, "INBOX" + DELIMITER + "work" + DELIMITER + "done");
+        bobInboxPath = MailboxPath.forUser(Username.of("bob"), "INBOX");
+        bobyMailboxPath = MailboxPath.forUser(Username.of("boby"), "INBOX.that.is.a.trick");
+        bobDifferentNamespacePath = new MailboxPath("#private_bob", Username.of("bob"), "INBOX.bob");
 
         benwaInboxMailbox = createMailbox(benwaInboxPath);
         benwaWorkMailbox = createMailbox(benwaWorkPath);
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java
index 1144443..264f2bc 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java
@@ -31,6 +31,7 @@ import javax.mail.Flags.Flag;
 import javax.mail.util.SharedByteArrayInputStream;
 
 import org.apache.commons.lang3.tuple.Pair;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.FlagsBuilder;
 import org.apache.james.mailbox.MessageManager.FlagsUpdateMode;
 import org.apache.james.mailbox.exception.MailboxException;
@@ -58,6 +59,7 @@ import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMultimap;
 
 public abstract class MessageIdMapperTest {
+    private static final Username BENWA = Username.of("benwa");
 
     @Rule
     public ExpectedException expectedException = ExpectedException.none();
@@ -92,8 +94,8 @@ public abstract class MessageIdMapperTest {
         this.messageMapper = mapperProvider.createMessageMapper();
         this.mailboxMapper = mapperProvider.createMailboxMapper();
 
-        benwaInboxMailbox = createMailbox(MailboxPath.forUser("benwa", "INBOX"));
-        benwaWorkMailbox = createMailbox(MailboxPath.forUser("benwa", "INBOX" + DELIMITER + "work"));
+        benwaInboxMailbox = createMailbox(MailboxPath.forUser(BENWA, "INBOX"));
+        benwaWorkMailbox = createMailbox(MailboxPath.forUser(BENWA, "INBOX" + DELIMITER + "work"));
 
         message1 = createMessage(benwaInboxMailbox, "Subject: Test1 \n\nBody1\n.\n", BODY_START, new PropertyBuilder());
         message2 = createMessage(benwaInboxMailbox, "Subject: Test2 \n\nBody2\n.\n", BODY_START, new PropertyBuilder());
@@ -163,7 +165,7 @@ public abstract class MessageIdMapperTest {
 
     @Test
     public void saveShouldThrowWhenMailboxDoesntExist() throws Exception {
-        Mailbox notPersistedMailbox = new Mailbox(MailboxPath.forUser("benwa", "mybox"), UID_VALIDITY);
+        Mailbox notPersistedMailbox = new Mailbox(MailboxPath.forUser(BENWA, "mybox"), UID_VALIDITY);
         notPersistedMailbox.setMailboxId(mapperProvider.generateId());
         SimpleMailboxMessage message = createMessage(notPersistedMailbox, "Subject: Test \n\nBody\n.\n", BODY_START, new PropertyBuilder());
         message.setUid(mapperProvider.generateMessageUid());
@@ -208,7 +210,7 @@ public abstract class MessageIdMapperTest {
         message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
         sut.save(message1);
 
-        Mailbox notPersistedMailbox = new Mailbox(MailboxPath.forUser("benwa", "mybox"), UID_VALIDITY);
+        Mailbox notPersistedMailbox = new Mailbox(MailboxPath.forUser(BENWA, "mybox"), UID_VALIDITY);
         notPersistedMailbox.setMailboxId(mapperProvider.generateId());
 
         SimpleMailboxMessage message1InOtherMailbox = SimpleMailboxMessage.copy(notPersistedMailbox.getMailboxId(), message1);
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java
index 762c410..b223a79 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java
@@ -36,6 +36,7 @@ import javax.mail.Flags;
 import javax.mail.Flags.Flag;
 import javax.mail.util.SharedByteArrayInputStream;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.FlagsBuilder;
 import org.apache.james.mailbox.MessageManager.FlagsUpdateMode;
 import org.apache.james.mailbox.MessageUid;
@@ -71,6 +72,7 @@ public abstract class MessageMapperTest {
     private static final String USER_FLAG = "userFlag";
 
     private static final String CUSTOMS_USER_FLAGS_VALUE = "CustomsFlags";
+    private static final Username BENWA = Username.of("benwa");
 
     private MapperProvider mapperProvider;
     private MessageMapper messageMapper;
@@ -103,8 +105,8 @@ public abstract class MessageMapperTest {
     }
 
     private void initData() throws MailboxException {
-        benwaInboxMailbox = createMailbox(MailboxPath.forUser("benwa", "INBOX"));
-        benwaWorkMailbox = createMailbox(MailboxPath.forUser("benwa", "INBOX" + DELIMITER + "work"));
+        benwaInboxMailbox = createMailbox(MailboxPath.forUser(BENWA, "INBOX"));
+        benwaWorkMailbox = createMailbox(MailboxPath.forUser(BENWA, "INBOX" + DELIMITER + "work"));
 
         message1 = createMessage(benwaInboxMailbox, mapperProvider.generateMessageId(), "Subject: Test1 \n\nBody1\n.\n", BODY_START, new PropertyBuilder());
         message2 = createMessage(benwaInboxMailbox, mapperProvider.generateMessageId(), "Subject: Test2 \n\nBody2\n.\n", BODY_START, new PropertyBuilder());
@@ -1103,7 +1105,7 @@ public abstract class MessageMapperTest {
 
     @Test
     public void getApplicableFlagShouldReturnDefaultApplicableFlagsWhenMailboxEmpty() throws Exception {
-        Mailbox emptyMailbox = createMailbox(MailboxPath.forUser("benwa", "EMPTY"));
+        Mailbox emptyMailbox = createMailbox(MailboxPath.forUser(BENWA, "EMPTY"));
 
         assertThat(messageMapper.getApplicableFlag(emptyMailbox))
             .isEqualTo(new FlagsBuilder()
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMoveTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMoveTest.java
index 27c34fd..8658d50 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMoveTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMoveTest.java
@@ -26,6 +26,7 @@ import java.util.Date;
 import javax.mail.Flags;
 import javax.mail.util.SharedByteArrayInputStream;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxId;
@@ -72,8 +73,9 @@ public abstract class MessageMoveTest {
         this.mailboxMapper = mapperProvider.createMailboxMapper();
         Assume.assumeNotNull(mailboxMapper);
 
-        benwaInboxMailbox = createMailbox(MailboxPath.forUser("benwa", "INBOX"));
-        benwaWorkMailbox = createMailbox(MailboxPath.forUser("benwa", "INBOX" + DELIMITER + "work"));
+        Username benwa = Username.of("benwa");
+        benwaInboxMailbox = createMailbox(MailboxPath.forUser(benwa, "INBOX"));
+        benwaWorkMailbox = createMailbox(MailboxPath.forUser(benwa, "INBOX" + DELIMITER + "work"));
         message1 = createMessage(benwaInboxMailbox, mapperProvider.generateMessageId(), "Subject: Test1 \n\nBody1\n.\n", BODY_START, new PropertyBuilder());
     }
 
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageWithAttachmentMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageWithAttachmentMapperTest.java
index 2c8d794..7ab9137 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageWithAttachmentMapperTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageWithAttachmentMapperTest.java
@@ -30,6 +30,7 @@ import java.util.List;
 import javax.mail.Flags;
 import javax.mail.util.SharedByteArrayInputStream;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.Attachment;
 import org.apache.james.mailbox.model.AttachmentId;
@@ -81,7 +82,7 @@ public abstract class MessageWithAttachmentMapperTest {
         this.messageMapper = mapperProvider.createMessageMapper();
         this.attachmentMapper = mapperProvider.createAttachmentMapper();
 
-        attachmentsMailbox = createMailbox(MailboxPath.forUser("benwa", "Attachments"));
+        attachmentsMailbox = createMailbox(MailboxPath.forUser(Username.of("benwa"), "Attachments"));
 
         Attachment attachment = Attachment.builder()
                 .attachmentId(AttachmentId.from("123"))
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/UsernameTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/UsernameTest.java
deleted file mode 100644
index 1f34d74..0000000
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/UsernameTest.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.mailbox.store.mail.model;
-
-import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import org.apache.james.mailbox.MailboxSession;
-import org.junit.Test;
-
-import nl.jqno.equalsverifier.EqualsVerifier;
-
-public class UsernameTest {
-
-    @Test
-    public void shouldRespectBeanContract() {
-        EqualsVerifier.forClass(Username.class)
-            .verify();
-    }
-
-    @Test
-    public void fromRawValueShouldThrowOnNull() {
-        assertThatThrownBy(() -> Username.fromRawValue(null))
-            .isInstanceOf(NullPointerException.class);
-    }
-
-    @Test
-    public void fromMailboxSessionShouldThrowOnNull() {
-        assertThatThrownBy(() -> Username.fromMailboxSession(null))
-            .isInstanceOf(NullPointerException.class);
-    }
-
-    @Test
-    public void fromMailboxSessionShouldThrowOnNullUser() {
-        MailboxSession mailboxSession = mock(MailboxSession.class);
-        when(mailboxSession.getUser()).thenReturn(null);
-
-        assertThatThrownBy(() -> Username.fromMailboxSession(mailboxSession))
-            .isInstanceOf(NullPointerException.class);
-    }
-
-}
\ No newline at end of file
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolverTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolverTest.java
index 97bb334..91aaeb3 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolverTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolverTest.java
@@ -26,6 +26,7 @@ import static org.mockito.Mockito.when;
 
 import java.util.Optional;
 
+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;
@@ -43,10 +44,11 @@ import com.google.common.collect.Lists;
 
 public class DefaultUserQuotaRootResolverTest {
 
-    private static final MailboxPath MAILBOX_PATH = MailboxPath.forUser("benwa", "INBOX");
+    private static final Username BENWA = Username.of("benwa");
+    private static final MailboxPath MAILBOX_PATH = MailboxPath.forUser(BENWA, "INBOX");
     public static final Mailbox MAILBOX = new Mailbox(MAILBOX_PATH, 10);
-    private static final MailboxPath PATH_LIKE = MailboxPath.forUser("benwa", "%");
-    private static final MailboxPath MAILBOX_PATH_2 = MailboxPath.forUser("benwa", "test");
+    private static final MailboxPath PATH_LIKE = MailboxPath.forUser(BENWA, "%");
+    private static final MailboxPath MAILBOX_PATH_2 = MailboxPath.forUser(BENWA, "test");
     private static final Mailbox MAILBOX_2 = new Mailbox(MAILBOX_PATH_2, 10);
     private static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("#private&benwa", Optional.empty());
     private static final MailboxId MAILBOX_ID = TestId.of(42);
@@ -68,12 +70,12 @@ public class DefaultUserQuotaRootResolverTest {
 
     @Test(expected = IllegalArgumentException.class)
     public void getQuotaRootShouldThrowWhenNamespaceContainsSeparator() {
-        testee.getQuotaRoot(new MailboxPath("#pr&ivate", "benwa", "INBOX"));
+        testee.getQuotaRoot(new MailboxPath("#pr&ivate", BENWA, "INBOX"));
     }
 
     @Test(expected = IllegalArgumentException.class)
     public void getQuotaRootShouldThrowWhenUserContainsSeparator() {
-        testee.getQuotaRoot(MailboxPath.forUser("ben&wa", "INBOX"));
+        testee.getQuotaRoot(MailboxPath.forUser(Username.of("ben&wa"), "INBOX"));
     }
 
     @Test
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/QuotaCheckerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/QuotaCheckerTest.java
index 86d5cc1..81ca0d6 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/QuotaCheckerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/QuotaCheckerTest.java
@@ -25,6 +25,7 @@ import static org.mockito.Mockito.when;
 
 import java.util.Optional;
 
+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;
@@ -41,7 +42,7 @@ import org.junit.Test;
 public class QuotaCheckerTest {
 
     public static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("benwa", Optional.empty());
-    public static final MailboxPath MAILBOX_PATH = MailboxPath.forUser("benwa", "INBOX");
+    public static final MailboxPath MAILBOX_PATH = MailboxPath.forUser(Username.of("benwa"), "INBOX");
     public static final Mailbox MAILBOX = new Mailbox(MAILBOX_PATH, 10);
 
     private QuotaRootResolver mockedQuotaRootResolver;
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java
index 6447070..0133465 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java
@@ -32,6 +32,7 @@ import java.util.concurrent.TimeUnit;
 
 import javax.mail.Flags;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageIdManager;
@@ -68,8 +69,8 @@ import com.google.common.collect.ImmutableList;
 public abstract class AbstractMessageSearchIndexTest {
 
     protected static final String INBOX = "INBOX";
-    protected static final String OTHERUSER = "otheruser";
-    protected static final String USERNAME = "benwa";
+    protected static final Username OTHERUSER = Username.of("otheruser");
+    protected static final Username USERNAME = Username.of("benwa");
 
     public static final long LIMIT = 100L;
     public static final boolean RECENT = true;
diff --git a/mailbox/tools/copier/src/main/java/org/apache/james/mailbox/tools/copier/MailboxCopierImpl.java b/mailbox/tools/copier/src/main/java/org/apache/james/mailbox/tools/copier/MailboxCopierImpl.java
index 88adef4..4f04f4b 100644
--- a/mailbox/tools/copier/src/main/java/org/apache/james/mailbox/tools/copier/MailboxCopierImpl.java
+++ b/mailbox/tools/copier/src/main/java/org/apache/james/mailbox/tools/copier/MailboxCopierImpl.java
@@ -27,6 +27,7 @@ import java.util.Set;
 
 import javax.mail.Flags.Flag;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
@@ -72,7 +73,7 @@ public class MailboxCopierImpl implements MailboxCopier {
 
         List<MailboxPath> mailboxPathList = null;
 
-        srcMailboxSession = srcMailboxManager.createSystemSession("manager");
+        srcMailboxSession = srcMailboxManager.createSystemSession(Username.of("manager"));
         srcMailboxManager.startProcessingRequest(srcMailboxSession);
         mailboxPathList = srcMailboxManager.list(srcMailboxSession);
         srcMailboxManager.endProcessingRequest(srcMailboxSession);
diff --git a/mailbox/tools/copier/src/test/java/org/apache/james/mailbox/tools/copier/MailboxCopierTest.java b/mailbox/tools/copier/src/test/java/org/apache/james/mailbox/tools/copier/MailboxCopierTest.java
index 54a170d..e51ce03 100644
--- a/mailbox/tools/copier/src/test/java/org/apache/james/mailbox/tools/copier/MailboxCopierTest.java
+++ b/mailbox/tools/copier/src/test/java/org/apache/james/mailbox/tools/copier/MailboxCopierTest.java
@@ -23,6 +23,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import java.io.IOException;
 import java.util.List;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
@@ -110,7 +111,7 @@ public class MailboxCopierTest {
      * @throws BadCredentialsException
      */
     private void assertMailboxManagerSize(MailboxManager mailboxManager, int multiplicationFactor) throws BadCredentialsException, MailboxException {
-        MailboxSession mailboxSession = mailboxManager.createSystemSession("manager");
+        MailboxSession mailboxSession = mailboxManager.createSystemSession(Username.of("manager"));
         mailboxManager.startProcessingRequest(mailboxSession);
 
         List<MailboxPath> mailboxPathList = mailboxManager.list(mailboxSession);
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 f2b57cb..bb08369 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
@@ -103,7 +103,7 @@ public class ReIndexerImpl implements ReIndexer {
     }
 
     private void validateIdExists(MailboxId mailboxId) throws MailboxException {
-        MailboxSession mailboxSession = mailboxManager.createSystemSession("ReIndexingImap");
+        MailboxSession mailboxSession = mailboxManager.createSystemSession(Username.of("ReIndexingImap"));
         mapperFactory.getMailboxMapper(mailboxSession).findMailboxById(mailboxId);
     }
 }
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 d1a0941..390c557 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
@@ -55,6 +55,7 @@ public class ReIndexerPerformer {
     private static final int NO_LIMIT = 0;
     private static final int SINGLE_MESSAGE = 1;
     private static final String RE_INDEXING = "re-indexing";
+    private static final Username RE_INDEXER_PERFORMER_USER = Username.of(RE_INDEXING);
 
     private final MailboxManager mailboxManager;
     private final ListeningMessageSearchIndex messageSearchIndex;
@@ -71,7 +72,7 @@ public class ReIndexerPerformer {
 
     Task.Result reIndex(MailboxId mailboxId, ReprocessingContext reprocessingContext) throws Exception {
         LOGGER.info("Intend to reindex mailbox with mailboxId {}", mailboxId.serialize());
-        MailboxSession mailboxSession = mailboxManager.createSystemSession(RE_INDEXING);
+        MailboxSession mailboxSession = mailboxManager.createSystemSession(RE_INDEXER_PERFORMER_USER);
         Mailbox mailbox = mailboxSessionMapperFactory.getMailboxMapper(mailboxSession).findMailboxById(mailboxId);
         messageSearchIndex.deleteAll(mailboxSession, mailboxId);
         try {
@@ -108,7 +109,7 @@ public class ReIndexerPerformer {
     }
 
     Task.Result reIndex(ReprocessingContext reprocessingContext) throws MailboxException {
-        MailboxSession mailboxSession = mailboxManager.createSystemSession(RE_INDEXING);
+        MailboxSession mailboxSession = mailboxManager.createSystemSession(RE_INDEXER_PERFORMER_USER);
         LOGGER.info("Starting a full reindex");
         Stream<MailboxId> mailboxIds = mailboxSessionMapperFactory.getMailboxMapper(mailboxSession).list()
             .stream()
@@ -122,7 +123,7 @@ public class ReIndexerPerformer {
     }
 
     Task.Result reIndex(Username username, ReprocessingContext reprocessingContext) throws MailboxException {
-        MailboxSession mailboxSession = mailboxManager.createSystemSession(username.asString());
+        MailboxSession mailboxSession = mailboxManager.createSystemSession(username);
         LOGGER.info("Starting a reindex for user {}", username.asString());
 
         Stream<MailboxId> mailboxIds = mailboxManager.search(MailboxQuery.privateMailboxesBuilder(mailboxSession).build(), mailboxSession)
@@ -137,7 +138,7 @@ public class ReIndexerPerformer {
     }
 
     Task.Result handleMessageReIndexing(MailboxId mailboxId, MessageUid uid, ReprocessingContext reprocessingContext) throws MailboxException {
-        MailboxSession mailboxSession = mailboxManager.createSystemSession(RE_INDEXING);
+        MailboxSession mailboxSession = mailboxManager.createSystemSession(RE_INDEXER_PERFORMER_USER);
 
         Mailbox mailbox = mailboxSessionMapperFactory.getMailboxMapper(mailboxSession).findMailboxById(mailboxId);
         return handleMessageReIndexing(mailboxSession, mailbox, uid, reprocessingContext);
@@ -145,7 +146,7 @@ public class ReIndexerPerformer {
 
     Task.Result handleMessageIdReindexing(MessageId messageId) {
         try {
-            MailboxSession session = mailboxManager.createSystemSession("MessageIdReIndexerImpl");
+            MailboxSession session = mailboxManager.createSystemSession(RE_INDEXER_PERFORMER_USER);
 
             return mailboxSessionMapperFactory.getMessageIdMapper(session)
                 .find(ImmutableList.of(messageId), MessageMapper.FetchType.Full)
diff --git a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/CassandraReIndexerImplTest.java b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/CassandraReIndexerImplTest.java
index a862423..42a3d5d 100644
--- a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/CassandraReIndexerImplTest.java
+++ b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/CassandraReIndexerImplTest.java
@@ -30,6 +30,7 @@ import java.time.Duration;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.cassandra.CassandraMailboxManager;
@@ -51,7 +52,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 import com.google.common.base.Strings;
 
 public class CassandraReIndexerImplTest {
-    private static final String USERNAME = "benwa@apache.org";
+    private static final Username USERNAME = Username.of("benwa@apache.org");
     public static final MailboxPath INBOX = MailboxPath.forUser(USERNAME, "INBOX");
     private CassandraMailboxManager mailboxManager;
     private ListeningMessageSearchIndex messageSearchIndex;
diff --git a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/MessageIdReIndexerImplTest.java b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/MessageIdReIndexerImplTest.java
index 8263a93..3dfe4cb 100644
--- a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/MessageIdReIndexerImplTest.java
+++ b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/MessageIdReIndexerImplTest.java
@@ -25,6 +25,7 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
@@ -41,7 +42,7 @@ import org.junit.jupiter.api.Test;
 import org.mockito.ArgumentCaptor;
 
 public class MessageIdReIndexerImplTest {
-    private static final String USERNAME = "benwa@apache.org";
+    private static final Username USERNAME = Username.of("benwa@apache.org");
     public static final MailboxPath INBOX = MailboxPath.forUser(USERNAME, "INBOX");
 
     private InMemoryMailboxManager mailboxManager;
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 07fd1a4..d554aed 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
@@ -48,7 +48,7 @@ import org.mockito.ArgumentCaptor;
 
 public class ReIndexerImplTest {
 
-    private static final String USERNAME = "benwa@apache.org";
+    private static final Username USERNAME = Username.of("benwa@apache.org");
     public static final MailboxPath INBOX = MailboxPath.forUser(USERNAME, "INBOX");
     private InMemoryMailboxManager mailboxManager;
     private ListeningMessageSearchIndex messageSearchIndex;
@@ -126,7 +126,7 @@ public class ReIndexerImplTest {
                 MessageManager.AppendCommand.builder().build("header: value\r\n\r\nbody"),
                 systemSession);
 
-        reIndexer.reIndex(Username.of(USERNAME)).run();
+        reIndexer.reIndex(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/zoo-seq-provider/src/test/java/org/apache/james/mailbox/store/mail/ZooUidProviderTest.java b/mailbox/zoo-seq-provider/src/test/java/org/apache/james/mailbox/store/mail/ZooUidProviderTest.java
index 660a288..9ef11eb 100644
--- a/mailbox/zoo-seq-provider/src/test/java/org/apache/james/mailbox/store/mail/ZooUidProviderTest.java
+++ b/mailbox/zoo-seq-provider/src/test/java/org/apache/james/mailbox/store/mail/ZooUidProviderTest.java
@@ -29,6 +29,7 @@ import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.retry.RetryOneTime;
 import org.apache.curator.test.TestingServer;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxId;
@@ -156,8 +157,9 @@ public class ZooUidProviderTest {
         client.start();
         uuidProvider = new ZooUidProvider(client, retryPolicy);
         longProvider = new ZooUidProvider(client, retryPolicy);
-        MailboxPath path1 = new MailboxPath("namespacetest", "namespaceuser", "UUID");
-        MailboxPath path2 = new MailboxPath("namespacetest", "namespaceuser", "Long");
+        Username namespaceuser = Username.of("namespaceuser");
+        MailboxPath path1 = new MailboxPath("namespacetest", namespaceuser, "UUID");
+        MailboxPath path2 = new MailboxPath("namespacetest", namespaceuser, "Long");
         mailboxUUID = new Mailbox(path1, 1L);
         mailboxUUID.setMailboxId(UUIDId.of(randomUUID));
         mailboxLong = new Mailbox(path2, 2L);
diff --git a/mailet/crypto/src/main/java/org/apache/james/transport/mailets/AbstractSign.java b/mailet/crypto/src/main/java/org/apache/james/transport/mailets/AbstractSign.java
index 15ccec4..d8f0dc6 100644
--- a/mailet/crypto/src/main/java/org/apache/james/transport/mailets/AbstractSign.java
+++ b/mailet/crypto/src/main/java/org/apache/james/transport/mailets/AbstractSign.java
@@ -36,6 +36,7 @@ import javax.mail.internet.MimeMultipart;
 import javax.mail.internet.ParseException;
 
 import org.apache.james.core.MailAddress;
+import org.apache.james.core.Username;
 import org.apache.james.transport.KeyHolder;
 import org.apache.james.transport.SMIMEAttributeNames;
 import org.apache.james.user.api.UsersRepository;
@@ -584,8 +585,8 @@ public abstract class AbstractSign extends GenericMailet {
             }
         } else {
             // is the reverse-path user different from the SMTP authorized user?
-            String username = getUsername(reversePath);
-            if (!username.equals(authUser)) {
+            Username username = getUsername(reversePath);
+            if (!username.asString().equals(authUser)) { //FIXME-USERNAME
                 LOGGER.info("SMTP logged in as <{}> but pretend to be sender <{}>", authUser, username);
                 return false;
             }
@@ -607,7 +608,7 @@ public abstract class AbstractSign extends GenericMailet {
 
     }
 
-    private String getUsername(MailAddress mailAddress) {
+    private Username getUsername(MailAddress mailAddress) {
         try {
             return usersRepository.getUser(mailAddress);
         } catch (UsersRepositoryException e) {
diff --git a/mpt/antlib/src/main/java/org/apache/james/mpt/ant/MailProtocolTestTask.java b/mpt/antlib/src/main/java/org/apache/james/mpt/ant/MailProtocolTestTask.java
index 85904bb..24c8570 100644
--- a/mpt/antlib/src/main/java/org/apache/james/mpt/ant/MailProtocolTestTask.java
+++ b/mpt/antlib/src/main/java/org/apache/james/mpt/ant/MailProtocolTestTask.java
@@ -30,6 +30,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Optional;
 
+import org.apache.james.core.Username;
 import org.apache.james.mpt.Runner;
 import org.apache.james.mpt.api.ImapFeatures;
 import org.apache.james.mpt.api.ImapFeatures.Feature;
@@ -388,7 +389,7 @@ public class MailProtocolTestTask extends Task implements Monitor {
                 final File scriptFile = getScript();
                 final ScriptedUserAdder adder = new ScriptedUserAdder(getHost(), port, MailProtocolTestTask.this);
                 try (Reader reader = newReader(scriptFile)) {
-                    adder.addUser(getUser(), getPasswd(), reader);
+                    adder.addUser(Username.of(getUser()), getPasswd(), reader);
                 }
             } catch (Exception e) {
                 log(e.getMessage(), Project.MSG_ERR);
diff --git a/mpt/core/src/main/java/org/apache/james/mpt/api/HostSystem.java b/mpt/core/src/main/java/org/apache/james/mpt/api/HostSystem.java
index 70176ff..c514e42 100644
--- a/mpt/core/src/main/java/org/apache/james/mpt/api/HostSystem.java
+++ b/mpt/core/src/main/java/org/apache/james/mpt/api/HostSystem.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.mpt.api;
 
+import org.apache.james.core.Username;
 import org.apache.james.mpt.host.ExternalHostSystem;
 
 /**
@@ -44,7 +45,7 @@ public interface HostSystem extends SessionFactory {
      *            user password
      * @throws Exception
      */
-    boolean addUser(String user, String password) throws Exception;
+    boolean addUser(Username user, String password) throws Exception;
 
     /**
      * Creates a new session for functional testing.
diff --git a/mpt/core/src/main/java/org/apache/james/mpt/api/ImapHostSystem.java b/mpt/core/src/main/java/org/apache/james/mpt/api/ImapHostSystem.java
index 0ce9b0c..2f6482f 100644
--- a/mpt/core/src/main/java/org/apache/james/mpt/api/ImapHostSystem.java
+++ b/mpt/core/src/main/java/org/apache/james/mpt/api/ImapHostSystem.java
@@ -18,6 +18,7 @@
  ****************************************************************/
 package org.apache.james.mpt.api;
 
+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.model.MailboxACL;
@@ -32,5 +33,5 @@ public interface ImapHostSystem extends HostSystem {
 
     void setQuotaLimits(QuotaCount maxMessageQuota, QuotaSize maxStorageQuota) throws Exception;
 
-    void grantRights(MailboxPath mailboxPath, String userName, MailboxACL.Rfc4314Rights rights) throws Exception;
+    void grantRights(MailboxPath mailboxPath, Username userName, MailboxACL.Rfc4314Rights rights) throws Exception;
 }
\ No newline at end of file
diff --git a/mpt/core/src/main/java/org/apache/james/mpt/api/UserAdder.java b/mpt/core/src/main/java/org/apache/james/mpt/api/UserAdder.java
index 4311deb..f32a0c6 100644
--- a/mpt/core/src/main/java/org/apache/james/mpt/api/UserAdder.java
+++ b/mpt/core/src/main/java/org/apache/james/mpt/api/UserAdder.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.mpt.api;
 
+import org.apache.james.core.Username;
+
 /**
  * Adds users on demand.
  */
@@ -28,5 +30,5 @@ public interface UserAdder {
      * @param user not null
      * @param password not null
      */
-    void addUser(String user, String password) throws Exception;
+    void addUser(Username user, String password) throws Exception;
 }
diff --git a/mpt/core/src/main/java/org/apache/james/mpt/host/ExternalHostSystem.java b/mpt/core/src/main/java/org/apache/james/mpt/host/ExternalHostSystem.java
index 081de7a..0b4e6fe 100644
--- a/mpt/core/src/main/java/org/apache/james/mpt/host/ExternalHostSystem.java
+++ b/mpt/core/src/main/java/org/apache/james/mpt/host/ExternalHostSystem.java
@@ -20,6 +20,7 @@
 package org.apache.james.mpt.host;
 
 import org.apache.commons.lang3.NotImplementedException;
+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.model.MailboxACL;
@@ -82,7 +83,7 @@ public class ExternalHostSystem extends ExternalSessionFactory implements ImapHo
     }
     
     @Override
-    public boolean addUser(String user, String password) throws Exception {
+    public boolean addUser(Username user, String password) throws Exception {
         if (userAdder == null) {
             monitor.note("Please ensure user '" + user + "' with password '" + password + "' exists.");
             return false;
@@ -122,7 +123,7 @@ public class ExternalHostSystem extends ExternalSessionFactory implements ImapHo
     }
 
     @Override
-    public void grantRights(MailboxPath mailboxPath, String userName, MailboxACL.Rfc4314Rights rights) throws Exception {
+    public void grantRights(MailboxPath mailboxPath, Username userName, MailboxACL.Rfc4314Rights rights) throws Exception {
         throw new NotImplementedException("Not implemented");
     }
 }
diff --git a/mpt/core/src/main/java/org/apache/james/mpt/script/GenericSimpleScriptedTestProtocol.java b/mpt/core/src/main/java/org/apache/james/mpt/script/GenericSimpleScriptedTestProtocol.java
index b4569b4..7036061 100644
--- a/mpt/core/src/main/java/org/apache/james/mpt/script/GenericSimpleScriptedTestProtocol.java
+++ b/mpt/core/src/main/java/org/apache/james/mpt/script/GenericSimpleScriptedTestProtocol.java
@@ -24,6 +24,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
 
+import org.apache.james.core.Username;
 import org.apache.james.mpt.api.Continuation;
 import org.apache.james.mpt.api.HostSystem;
 import org.apache.james.mpt.api.Session;
@@ -42,20 +43,20 @@ public class GenericSimpleScriptedTestProtocol<T extends HostSystem, SelfT exten
     
     private static class CreateUser implements PrepareCommand<HostSystem> {
         
-        final String user;
+        final Username username;
         final String password;
 
-        CreateUser(String user, String password) {
-            this.user = user;
+        CreateUser(Username username, String password) {
+            this.username = username;
             this.password = password;
         }
         
         @Override
         public void prepare(HostSystem system) throws Exception {
             try {
-                system.addUser(user, password);
+                system.addUser(username, password);
             } catch (Exception e) {
-                LOGGER.info("User {} already exists", user, e);
+                LOGGER.info("User {} already exists", username, e);
             }
         }
     }
@@ -88,10 +89,14 @@ public class GenericSimpleScriptedTestProtocol<T extends HostSystem, SelfT exten
         this.locale = locale;
         return (SelfT) this;
     }
-    
-    @SuppressWarnings("unchecked")
+
     public SelfT withUser(String user, String password) {
-        prepareCommands.add(new CreateUser(user, password));
+        return withUser(Username.of(user), password);
+    }
+
+    @SuppressWarnings("unchecked")
+    public SelfT withUser(Username username, String password) {
+        prepareCommands.add(new CreateUser(username, password));
         return (SelfT) this;
     }
     
diff --git a/mpt/core/src/main/java/org/apache/james/mpt/script/ImapScriptedTestProtocol.java b/mpt/core/src/main/java/org/apache/james/mpt/script/ImapScriptedTestProtocol.java
index f968a32..5a5f8b3 100644
--- a/mpt/core/src/main/java/org/apache/james/mpt/script/ImapScriptedTestProtocol.java
+++ b/mpt/core/src/main/java/org/apache/james/mpt/script/ImapScriptedTestProtocol.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.mpt.script;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mpt.api.ImapHostSystem;
@@ -42,18 +43,18 @@ public class ImapScriptedTestProtocol extends GenericSimpleScriptedTestProtocol<
     private static class CreateRights implements PrepareCommand<ImapHostSystem> {
 
         final MailboxPath mailboxPath;
-        final String userName;
+        final Username username;
         final MailboxACL.Rfc4314Rights rights;
 
-        public CreateRights(MailboxPath mailboxPath, String userName, MailboxACL.Rfc4314Rights rights) {
+        public CreateRights(MailboxPath mailboxPath, Username username, MailboxACL.Rfc4314Rights rights) {
             this.mailboxPath = mailboxPath;
-            this.userName = userName;
+            this.username = username;
             this.rights = rights;
         }
 
         @Override
         public void prepare(ImapHostSystem system) throws Exception {
-            system.grantRights(mailboxPath, userName, rights);
+            system.grantRights(mailboxPath, username, rights);
         }
     }
 
@@ -66,7 +67,7 @@ public class ImapScriptedTestProtocol extends GenericSimpleScriptedTestProtocol<
         return withPreparedCommand(new CreateMailbox(mailboxPath));
     }
 
-    public ImapScriptedTestProtocol withRights(MailboxPath mailboxPath, String userName, MailboxACL.Rfc4314Rights rights) {
-        return withPreparedCommand(new CreateRights(mailboxPath, userName, rights));
+    public ImapScriptedTestProtocol withRights(MailboxPath mailboxPath, Username username, MailboxACL.Rfc4314Rights rights) {
+        return withPreparedCommand(new CreateRights(mailboxPath, username, rights));
     }
 }
\ No newline at end of file
diff --git a/mpt/core/src/main/java/org/apache/james/mpt/user/ScriptedUserAdder.java b/mpt/core/src/main/java/org/apache/james/mpt/user/ScriptedUserAdder.java
index 51c0485..606a7c8 100644
--- a/mpt/core/src/main/java/org/apache/james/mpt/user/ScriptedUserAdder.java
+++ b/mpt/core/src/main/java/org/apache/james/mpt/user/ScriptedUserAdder.java
@@ -22,6 +22,7 @@ package org.apache.james.mpt.user;
 import java.io.Reader;
 import java.io.StringReader;
 
+import org.apache.james.core.Username;
 import org.apache.james.mpt.Runner;
 import org.apache.james.mpt.api.Monitor;
 import org.apache.james.mpt.api.UserAdder;
@@ -48,7 +49,7 @@ public class ScriptedUserAdder implements UserAdder {
     
     /**
      * Constructs an adder without a script.
-     * Note that {@link #addUser(String, String)} will not be available
+     * Note that {@link #addUser(Username, String)} will not be available
      * @param host connect to this host
      * @param port connect to this port
      */
@@ -61,7 +62,7 @@ public class ScriptedUserAdder implements UserAdder {
     }
     
     /**
-     * Note that {@link #addUser(String, String)} will not be available
+     * Note that {@link #addUser(Username, String)} will not be available
      * @param host connect to this host
      * @param port connect to this port
      * @param monitor not null
@@ -85,7 +86,7 @@ public class ScriptedUserAdder implements UserAdder {
      * @throws NullPointerException when script has not been set
      */
     @Override
-    public void addUser(String user, String password) throws Exception {
+    public void addUser(Username user, String password) throws Exception {
         final StringReader reader = new StringReader(script);
         addUser(user, password, reader);
     }
@@ -97,9 +98,9 @@ public class ScriptedUserAdder implements UserAdder {
      * @param reader reader for script, not null
      * @throws Exception upon failure
      */
-    public void addUser(String user, String password, Reader reader) throws Exception {
+    public void addUser(Username user, String password, Reader reader) throws Exception {
         final ProtocolSessionBuilder builder = new ProtocolSessionBuilder();
-        builder.setVariable(USER_VARIABLE_NAME, user);
+        builder.setVariable(USER_VARIABLE_NAME, user.asString());
         builder.setVariable(PASSWORD_VARIABLE_NAME, password);
         
         final Runner runner = new Runner();
diff --git a/mpt/core/src/test/java/org/apache/james/mpt/TestExternalHostSystem.java b/mpt/core/src/test/java/org/apache/james/mpt/TestExternalHostSystem.java
index 8705a6b..72360dd 100644
--- a/mpt/core/src/test/java/org/apache/james/mpt/TestExternalHostSystem.java
+++ b/mpt/core/src/test/java/org/apache/james/mpt/TestExternalHostSystem.java
@@ -25,6 +25,7 @@ import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
 
+import org.apache.james.core.Username;
 import org.apache.james.mpt.api.Continuation;
 import org.apache.james.mpt.api.ImapFeatures;
 import org.apache.james.mpt.api.ImapFeatures.Feature;
@@ -39,7 +40,7 @@ import org.junit.Test;
 
 public class TestExternalHostSystem {
     
-    private static final String USER = "USER NAME";
+    private static final Username USER = Username.of("USERNAME");
 
     private static final String PASSWORD = "SOME PASSWORD";
 
diff --git a/mpt/core/src/test/java/org/apache/james/mpt/TestScriptedUserAdder.java b/mpt/core/src/test/java/org/apache/james/mpt/TestScriptedUserAdder.java
index eb1373c..75528fc 100644
--- a/mpt/core/src/test/java/org/apache/james/mpt/TestScriptedUserAdder.java
+++ b/mpt/core/src/test/java/org/apache/james/mpt/TestScriptedUserAdder.java
@@ -21,6 +21,7 @@ package org.apache.james.mpt;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
+import org.apache.james.core.Username;
 import org.apache.james.mpt.user.ScriptedUserAdder;
 import org.junit.After;
 import org.junit.Before;
@@ -47,7 +48,7 @@ public class TestScriptedUserAdder {
     @Test
     public void testShouldExecuteScriptAgainstPort() throws Exception {
         ScriptedUserAdder adder = new ScriptedUserAdder("localhost", protocol.getPort(), "C: USER='${user}' password='${password}'");
-        adder.addUser("A User", "Some Password");
+        adder.addUser(Username.of("A User"), "Some Password");
         assertThat(record.complete()).isEqualTo("USER='A User' password='Some Password'\r\n");
     }
 }
diff --git a/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/host/JamesImapHostSystem.java b/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/host/JamesImapHostSystem.java
index 3398559..1f5a3b9 100644
--- a/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/host/JamesImapHostSystem.java
+++ b/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/host/JamesImapHostSystem.java
@@ -25,6 +25,7 @@ import org.apache.commons.configuration2.plist.PropertyListConfiguration;
 import org.apache.commons.configuration2.tree.ImmutableNode;
 import org.apache.james.adapter.mailbox.store.UserRepositoryAuthenticator;
 import org.apache.james.adapter.mailbox.store.UserRepositoryAuthorizator;
+import org.apache.james.core.Username;
 import org.apache.james.imap.api.ImapConfiguration;
 import org.apache.james.imap.api.process.ImapProcessor;
 import org.apache.james.imap.decode.ImapDecoder;
@@ -80,7 +81,7 @@ public abstract class JamesImapHostSystem implements ImapHostSystem, GrantRights
     }
 
     @Override
-    public boolean addUser(String user, String password) throws Exception {
+    public boolean addUser(Username user, String password) throws Exception {
         memoryUsersRepository.addUser(user, password);
         return true;
     }
@@ -106,16 +107,16 @@ public abstract class JamesImapHostSystem implements ImapHostSystem, GrantRights
     }
 
     @Override
-    public void grantRights(MailboxPath mailboxPath, String userName, MailboxACL.Rfc4314Rights rights) throws Exception {
+    public void grantRights(MailboxPath mailboxPath, Username username, MailboxACL.Rfc4314Rights rights) throws Exception {
         MailboxManager mailboxManager = getMailboxManager();
         MailboxSession mailboxSession = mailboxManager.createSystemSession(mailboxPath.getUser());
         mailboxManager.startProcessingRequest(mailboxSession);
         mailboxManager.setRights(mailboxPath,
             MailboxACL.EMPTY.apply(MailboxACL.command()
-                .forUser(userName)
+                .forUser(username)
                 .rights(rights)
                 .asAddition()),
-            mailboxManager.createSystemSession(userName));
+            mailboxManager.createSystemSession(username));
         mailboxManager.logout(mailboxSession, true);
         mailboxManager.endProcessingRequest(mailboxSession);
     }
diff --git a/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/GrantRightsOnHost.java b/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/GrantRightsOnHost.java
index 5ae7b14..46a729f 100644
--- a/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/GrantRightsOnHost.java
+++ b/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/GrantRightsOnHost.java
@@ -19,11 +19,12 @@
 
 package org.apache.james.mpt.imapmailbox;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MailboxPath;
 
 public interface GrantRightsOnHost {
 
-    void grantRights(MailboxPath mailboxPath, String userName, MailboxACL.Rfc4314Rights rights) throws Exception;
+    void grantRights(MailboxPath mailboxPath, Username userName, MailboxACL.Rfc4314Rights rights) throws Exception;
 
 }
diff --git a/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/ImapTestConstants.java b/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/ImapTestConstants.java
index da20795..ad4c600 100644
--- a/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/ImapTestConstants.java
+++ b/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/ImapTestConstants.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.mpt.imapmailbox;
 
+import org.apache.james.core.Username;
+
 /**
  * Some constants to use when running Imap tests.
  */
@@ -27,7 +29,7 @@ public interface ImapTestConstants {
 
     String HOST = "localhost";
 
-    String USER = "imapuser";
+    Username USER = Username.of("imapuser");
 
     String PASSWORD = "password";
 
diff --git a/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/ACLCommands.java b/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/ACLCommands.java
index a597742..df03477 100644
--- a/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/ACLCommands.java
+++ b/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/ACLCommands.java
@@ -21,6 +21,7 @@ package org.apache.james.mpt.imapmailbox.suite;
 
 import java.util.Locale;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mpt.api.ImapHostSystem;
@@ -32,7 +33,7 @@ import org.junit.Test;
 
 public abstract class ACLCommands implements ImapTestConstants {
     
-    public static final String OTHER_USER_NAME = "Boby";
+    public static final Username OTHER_USER_NAME = Username.of("Boby");
     public static final String OTHER_USER_PASSWORD = "password";
     public static final MailboxPath OTHER_USER_MAILBOX = MailboxPath.forUser(OTHER_USER_NAME, "");
 
diff --git a/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/ACLIntegration.java b/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/ACLIntegration.java
index c108a82..114be87 100644
--- a/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/ACLIntegration.java
+++ b/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/ACLIntegration.java
@@ -21,6 +21,7 @@ package org.apache.james.mpt.imapmailbox.suite;
 
 import java.util.Locale;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mpt.api.ImapHostSystem;
@@ -31,7 +32,7 @@ import org.junit.Before;
 import org.junit.Test;
 
 public abstract class ACLIntegration implements ImapTestConstants {
-    public static final String OTHER_USER_NAME = "Boby";
+    public static final Username OTHER_USER_NAME = Username.of("Boby");
     public static final String OTHER_USER_PASSWORD = "password";
     public static final MailboxPath OTHER_USER_MAILBOX = MailboxPath.forUser(OTHER_USER_NAME, "");
     public static final MailboxPath MY_INBOX = MailboxPath.forUser(USER, "");
@@ -104,7 +105,7 @@ public abstract class ACLIntegration implements ImapTestConstants {
     @Test
     public void rightXOnOriginShouldBeSufficientToRenameAMailboxUS() throws Exception {
         scriptedTestProtocol
-            .withMailbox(MailboxPath.forUser("Boby","test"))
+            .withMailbox(MailboxPath.forUser(OTHER_USER_NAME,"test"))
             .withGrantRights(MailboxPath.forUser(OTHER_USER_NAME, "test"), USER, MailboxACL.Rfc4314Rights.fromSerializedRfc4314Rights("x"))
             .run("aclIntegration/ACLIntegrationRightX");
     }
@@ -112,7 +113,7 @@ public abstract class ACLIntegration implements ImapTestConstants {
     @Test
     public void rightXOnOriginShouldBeNeededToRenameAMailboxUS() throws Exception {
         scriptedTestProtocol
-            .withMailbox(MailboxPath.forUser("Boby","test"))
+            .withMailbox(MailboxPath.forUser(OTHER_USER_NAME,"test"))
             .withGrantRights(MailboxPath.forUser(OTHER_USER_NAME, "test"), USER, MailboxACL.Rfc4314Rights.fromSerializedRfc4314Rights("rswipktela"))
             .run("aclIntegration/ACLIntegrationWithoutRightX");
     }
diff --git a/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/ACLScriptedTestProtocol.java b/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/ACLScriptedTestProtocol.java
index 137cecf..ac863dd 100644
--- a/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/ACLScriptedTestProtocol.java
+++ b/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/ACLScriptedTestProtocol.java
@@ -2,6 +2,7 @@ package org.apache.james.mpt.imapmailbox.suite;
 
 import java.util.Locale;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mpt.api.HostSystem;
@@ -16,19 +17,19 @@ public class ACLScriptedTestProtocol extends ImapScriptedTestProtocol {
     private static class GrantRightsCommand implements SimpleScriptedTestProtocol.PrepareCommand<HostSystem> {
         GrantRightsOnHost grantRightsOnHost;
         MailboxPath mailboxPath;
-        String userName;
+        Username username;
         MailboxACL.Rfc4314Rights rights;
 
-        GrantRightsCommand(GrantRightsOnHost grantRightsOnHost, MailboxPath mailboxPath, String userName, MailboxACL.Rfc4314Rights rights) {
+        GrantRightsCommand(GrantRightsOnHost grantRightsOnHost, MailboxPath mailboxPath, Username username, MailboxACL.Rfc4314Rights rights) {
             this.grantRightsOnHost = grantRightsOnHost;
             this.mailboxPath = mailboxPath;
-            this.userName = userName;
+            this.username = username;
             this.rights = rights;
         }
 
         @Override
         public void prepare(HostSystem system) throws Exception {
-            grantRightsOnHost.grantRights(mailboxPath, userName, rights);
+            grantRightsOnHost.grantRights(mailboxPath, username, rights);
         }
     }
     
@@ -56,8 +57,8 @@ public class ACLScriptedTestProtocol extends ImapScriptedTestProtocol {
         this.mailboxMessageAppender = mailboxMessageAppender;
     }
 
-    public ACLScriptedTestProtocol withGrantRights(MailboxPath mailboxPath, String userName, MailboxACL.Rfc4314Rights rights) {
-        return (ACLScriptedTestProtocol) withPreparedCommand(new GrantRightsCommand(grantRightsOnHost, mailboxPath, userName, rights));
+    public ACLScriptedTestProtocol withGrantRights(MailboxPath mailboxPath, Username username, MailboxACL.Rfc4314Rights rights) {
+        return (ACLScriptedTestProtocol) withPreparedCommand(new GrantRightsCommand(grantRightsOnHost, mailboxPath, username, rights));
     }
     
     public ACLScriptedTestProtocol withFilledMailbox(MailboxPath otherUserMailbox) {
@@ -68,6 +69,11 @@ public class ACLScriptedTestProtocol extends ImapScriptedTestProtocol {
     public ACLScriptedTestProtocol withUser(String user, String password) {
         return (ACLScriptedTestProtocol) super.withUser(user, password);
     }
+
+    @Override
+    public ACLScriptedTestProtocol withUser(Username user, String password) {
+        return (ACLScriptedTestProtocol) super.withUser(user, password);
+    }
     
     @Override
     public ACLScriptedTestProtocol withLocale(Locale locale) {
diff --git a/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/AuthenticatePlain.java b/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/AuthenticatePlain.java
index 3729ca1..0ca8d11 100644
--- a/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/AuthenticatePlain.java
+++ b/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/AuthenticatePlain.java
@@ -21,6 +21,7 @@ package org.apache.james.mpt.imapmailbox.suite;
 
 import java.util.Locale;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mpt.api.ImapHostSystem;
 import org.apache.james.mpt.imapmailbox.ImapTestConstants;
@@ -42,8 +43,8 @@ public abstract class AuthenticatePlain implements ImapTestConstants {
         simpleScriptedTestProtocol = new ImapScriptedTestProtocol("/org/apache/james/imap/scripts/", system)
                 .withUser(USER, PASSWORD)
                 .withUser("delegate", "123456")
-                .withMailbox(MailboxPath.forUser("delegate", "delegate"))
-                .withMailbox(MailboxPath.forUser("imapuser", "imapuser"));
+                .withMailbox(MailboxPath.forUser(Username.of("delegate"), "delegate"))
+                .withMailbox(MailboxPath.forUser(Username.of("imapuser"), "imapuser"));
         BasicImapCommands.welcome(simpleScriptedTestProtocol);
     }
     
diff --git a/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/AuthenticatedState.java b/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/AuthenticatedState.java
index d2b2f2b..b11fd73 100644
--- a/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/AuthenticatedState.java
+++ b/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/AuthenticatedState.java
@@ -21,6 +21,7 @@ package org.apache.james.mpt.imapmailbox.suite;
 
 import java.util.Locale;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mpt.api.ImapFeatures.Feature;
 import org.apache.james.mpt.api.ImapHostSystem;
@@ -31,7 +32,8 @@ import org.junit.Before;
 import org.junit.Test;
 
 public abstract class AuthenticatedState extends BasicImapCommands {
-    
+    private static final Username USER_2 = Username.of("imapuser2");
+
     protected abstract ImapHostSystem createImapHostSystem();
     
     private ImapHostSystem system;
@@ -436,13 +438,13 @@ public abstract class AuthenticatedState extends BasicImapCommands {
 
     @Test
     public void listShouldNotListMailboxWithOtherUserUS() throws Exception {
-        system.createMailbox(MailboxPath.forUser(USER + "2", "Other"));
+        system.createMailbox(MailboxPath.forUser(USER_2, "Other"));
         simpleScriptedTestProtocol.run("ListMailboxes");
     }
 
     @Test
     public void listShouldNotListMailboxWithOtherUserITALY() throws Exception {
-        system.createMailbox(MailboxPath.forUser(USER + "2", "Other"));
+        system.createMailbox(MailboxPath.forUser(USER_2, "Other"));
         simpleScriptedTestProtocol
             .withLocale(Locale.ITALY)
             .run("ListMailboxes");
@@ -450,7 +452,7 @@ public abstract class AuthenticatedState extends BasicImapCommands {
 
     @Test
     public void listShouldNotListMailboxWithOtherUserKOREA() throws Exception {
-        system.createMailbox(MailboxPath.forUser(USER + "2", "Other"));
+        system.createMailbox(MailboxPath.forUser(USER_2, "Other"));
         simpleScriptedTestProtocol
             .withLocale(Locale.KOREA)
             .run("ListMailboxes");
diff --git a/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/ListingWithSharingTest.java b/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/ListingWithSharingTest.java
index 12f9f1d..08a746e 100644
--- a/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/ListingWithSharingTest.java
+++ b/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/ListingWithSharingTest.java
@@ -21,6 +21,7 @@ package org.apache.james.mpt.imapmailbox.suite;
 
 import java.util.Locale;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mpt.api.ImapHostSystem;
@@ -31,7 +32,7 @@ import org.junit.Before;
 import org.junit.Test;
 
 public abstract class ListingWithSharingTest implements ImapTestConstants {
-    public static final String OTHER_USER_NAME = "Boby";
+    public static final Username OTHER_USER_NAME = Username.of("Boby");
     public static final String OTHER_USER_PASSWORD = "password";
     public static final MailboxPath OTHER_USER_SHARED_MAILBOX = MailboxPath.forUser(OTHER_USER_NAME, "sharedMailbox");
     public static final MailboxPath OTHER_USER_SHARED_MAILBOX_CHILD = MailboxPath.forUser(OTHER_USER_NAME, "sharedMailbox.child");
diff --git a/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/base/BasicImapCommands.java b/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/base/BasicImapCommands.java
index 5f48067..0590606 100644
--- a/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/base/BasicImapCommands.java
+++ b/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/base/BasicImapCommands.java
@@ -32,7 +32,7 @@ public class BasicImapCommands implements ImapTestConstants {
     }
     
     public static void authenticate(GenericSimpleScriptedTestProtocol<?, ?> scriptedTestProtocol) {
-        addLogin(scriptedTestProtocol.preElements(), USER, PASSWORD);
+        addLogin(scriptedTestProtocol.preElements(), USER.asString(), PASSWORD);
     }
 
 
diff --git a/mpt/impl/imap-mailbox/cyrus/src/test/java/org/apache/james/mpt/imapmailbox/cyrus/host/CyrusHostSystem.java b/mpt/impl/imap-mailbox/cyrus/src/test/java/org/apache/james/mpt/imapmailbox/cyrus/host/CyrusHostSystem.java
index 1ff7819..c644e30 100644
--- a/mpt/impl/imap-mailbox/cyrus/src/test/java/org/apache/james/mpt/imapmailbox/cyrus/host/CyrusHostSystem.java
+++ b/mpt/impl/imap-mailbox/cyrus/src/test/java/org/apache/james/mpt/imapmailbox/cyrus/host/CyrusHostSystem.java
@@ -22,6 +22,7 @@ import java.net.InetSocketAddress;
 import java.util.function.Supplier;
 
 import org.apache.commons.lang3.NotImplementedException;
+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.model.MailboxPath;
@@ -64,12 +65,12 @@ public class CyrusHostSystem extends ExternalHostSystem implements Provider<Cont
     }
     
     @Override
-    public boolean addUser(String user, String password) throws Exception {
+    public boolean addUser(Username user, String password) throws Exception {
         return super.addUser(user, password) && createUserInbox(user);
     }
 
-    private boolean createUserInbox(String user) {
-        createMailbox(MailboxPath.forUser(user, ""));
+    private boolean createUserInbox(Username username) {
+        createMailbox(MailboxPath.forUser(username, ""));
         return true;
     }
     
diff --git a/mpt/impl/imap-mailbox/cyrus/src/test/java/org/apache/james/mpt/imapmailbox/cyrus/host/CyrusUserAdder.java b/mpt/impl/imap-mailbox/cyrus/src/test/java/org/apache/james/mpt/imapmailbox/cyrus/host/CyrusUserAdder.java
index fc2eb0b..da937d1 100644
--- a/mpt/impl/imap-mailbox/cyrus/src/test/java/org/apache/james/mpt/imapmailbox/cyrus/host/CyrusUserAdder.java
+++ b/mpt/impl/imap-mailbox/cyrus/src/test/java/org/apache/james/mpt/imapmailbox/cyrus/host/CyrusUserAdder.java
@@ -18,6 +18,7 @@
  ****************************************************************/
 package org.apache.james.mpt.imapmailbox.cyrus.host;
 
+import org.apache.james.core.Username;
 import org.apache.james.mpt.api.UserAdder;
 
 import com.google.inject.Inject;
@@ -38,7 +39,7 @@ public class CyrusUserAdder implements UserAdder {
     }
 
     @Override
-    public void addUser(String user, String password) throws Exception {
-        this.docker.createUser(container.get(), user, password);
+    public void addUser(Username user, String password) throws Exception {
+        this.docker.createUser(container.get(), user.asString(), password);
     }
 }
\ No newline at end of file
diff --git a/mpt/impl/imap-mailbox/cyrus/src/test/java/org/apache/james/mpt/imapmailbox/cyrus/host/GrantRightsOnCyrusHost.java b/mpt/impl/imap-mailbox/cyrus/src/test/java/org/apache/james/mpt/imapmailbox/cyrus/host/GrantRightsOnCyrusHost.java
index e49a89b..a6f56c8 100644
--- a/mpt/impl/imap-mailbox/cyrus/src/test/java/org/apache/james/mpt/imapmailbox/cyrus/host/GrantRightsOnCyrusHost.java
+++ b/mpt/impl/imap-mailbox/cyrus/src/test/java/org/apache/james/mpt/imapmailbox/cyrus/host/GrantRightsOnCyrusHost.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.mpt.imapmailbox.cyrus.host;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mpt.imapmailbox.GrantRightsOnHost;
@@ -37,11 +38,11 @@ public class GrantRightsOnCyrusHost implements GrantRightsOnHost {
     }
 
     @Override
-    public void grantRights(MailboxPath mailboxPath, String userName, MailboxACL.Rfc4314Rights rights) throws Exception {
+    public void grantRights(MailboxPath mailboxPath, Username username, MailboxACL.Rfc4314Rights rights) throws Exception {
         ProtocolSession protocolSession = system.logAndGetAdminProtocolSession(new ProtocolSession());
         protocolSession.cl(String.format("A1 SETACL %s %s %s",
             system.createMailboxStringFromMailboxPath(mailboxPath),
-            userName,
+            username.asString(),
             rights.serialize()));
         protocolSession.sl("A1 OK .*", GRANT_RIGHTS_LOCATION);
         system.executeProtocolSession(system.logoutAndGetProtocolSession(protocolSession));
diff --git a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/DockerDeploymentValidationGuiceJPATest.java b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/DockerDeploymentValidationGuiceJPATest.java
index c9e74c7..268f8db 100644
--- a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/DockerDeploymentValidationGuiceJPATest.java
+++ b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/DockerDeploymentValidationGuiceJPATest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.mpt.imapmailbox.external.james;
 
+import org.apache.james.core.Username;
 import org.apache.james.mpt.api.ImapHostSystem;
 import org.apache.james.mpt.imapmailbox.external.james.host.ProvisioningAPI;
 import org.apache.james.mpt.imapmailbox.external.james.host.SmtpHostSystem;
@@ -50,7 +51,7 @@ public class DockerDeploymentValidationGuiceJPATest extends DeploymentValidation
         ProvisioningAPI provisioningAPI = dockerJamesRule.cliJarDomainsAndUsersAdder();
         Injector injector = Guice.createInjector(new ExternalJamesModule(getConfiguration(), provisioningAPI));
         provisioningAPI.addDomain(DOMAIN);
-        provisioningAPI.addUser(USER_ADDRESS, PASSWORD);
+        provisioningAPI.addUser(Username.of(USER_ADDRESS), PASSWORD);
         system = injector.getInstance(ImapHostSystem.class);
         smtpHostSystem = injector.getInstance(SmtpHostSystem.class);
         system.beforeTest();
diff --git a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/DockerDeploymentValidationSpringJPATest.java b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/DockerDeploymentValidationSpringJPATest.java
index d99e546..a40e763 100644
--- a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/DockerDeploymentValidationSpringJPATest.java
+++ b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/DockerDeploymentValidationSpringJPATest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.mpt.imapmailbox.external.james;
 
+import org.apache.james.core.Username;
 import org.apache.james.mpt.api.ImapHostSystem;
 import org.apache.james.mpt.imapmailbox.external.james.host.ProvisioningAPI;
 import org.apache.james.mpt.imapmailbox.external.james.host.SmtpHostSystem;
@@ -51,7 +52,7 @@ public class DockerDeploymentValidationSpringJPATest extends DeploymentValidatio
         Injector injector = Guice.createInjector(new ExternalJamesModule(getConfiguration(), provisioningAPI));
         system = injector.getInstance(ImapHostSystem.class);
         provisioningAPI.addDomain(DOMAIN);
-        provisioningAPI.addUser(USER_ADDRESS, PASSWORD);
+        provisioningAPI.addUser(Username.of(USER_ADDRESS), PASSWORD);
         smtpHostSystem = injector.getInstance(SmtpHostSystem.class);
         system.beforeTest();
 
diff --git a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/docker/CliProvisioningAPI.java b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/docker/CliProvisioningAPI.java
index 2817fe8..f64f0f4 100644
--- a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/docker/CliProvisioningAPI.java
+++ b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/docker/CliProvisioningAPI.java
@@ -22,6 +22,7 @@ import java.io.IOException;
 
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.james.core.Username;
 import org.apache.james.mpt.imapmailbox.external.james.ProvisioningException;
 import org.apache.james.mpt.imapmailbox.external.james.host.ProvisioningAPI;
 import org.apache.james.util.docker.DockerContainer;
@@ -66,8 +67,8 @@ public class CliProvisioningAPI implements ProvisioningAPI {
     }
 
     @Override
-    public void addUser(String user, String password) throws Exception {
-        Container.ExecResult execResult = exec("adduser", user, password);
+    public void addUser(Username user, String password) throws Exception {
+        Container.ExecResult execResult = exec("adduser", user.asString(), password);
 
         if (execResult.getExitCode() != 0) {
             throw new ProvisioningException("Failed to add user" + executionResultToString(execResult));
diff --git a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/external/ExternalJamesImapHostSystem.java b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/external/ExternalJamesImapHostSystem.java
index 6f9c4c7..10c6bf9 100644
--- a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/external/ExternalJamesImapHostSystem.java
+++ b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/external/ExternalJamesImapHostSystem.java
@@ -22,6 +22,7 @@ import java.net.InetSocketAddress;
 import java.util.function.Supplier;
 
 import org.apache.commons.lang3.NotImplementedException;
+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.model.MailboxPath;
@@ -53,7 +54,7 @@ public class ExternalJamesImapHostSystem extends ExternalHostSystem {
     }
     
     @Override
-    public boolean addUser(String user, String password) throws Exception {
+    public boolean addUser(Username user, String password) throws Exception {
         return super.addUser(user, password);
     }
     
diff --git a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/external/NoopDomainsAndUserAdder.java b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/external/NoopDomainsAndUserAdder.java
index 38fdfad..1654a7d 100644
--- a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/external/NoopDomainsAndUserAdder.java
+++ b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/external/NoopDomainsAndUserAdder.java
@@ -18,6 +18,7 @@
  ****************************************************************/
 package org.apache.james.mpt.imapmailbox.external.james.host.external;
 
+import org.apache.james.core.Username;
 import org.apache.james.mpt.imapmailbox.external.james.host.ProvisioningAPI;
 
 public class NoopDomainsAndUserAdder implements ProvisioningAPI {
@@ -27,7 +28,7 @@ public class NoopDomainsAndUserAdder implements ProvisioningAPI {
     }
 
     @Override
-    public void addUser(String user, String password) throws Exception {
+    public void addUser(Username user, String password) throws Exception {
         // User should already be configured
         // We do not throw an exception in order to use BaseImapProtocol based tests
     }
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 857bf99..202fa0c 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
@@ -53,8 +53,8 @@ public abstract class JamesManageSieveHostSystem implements ManageSieveHostSyste
     protected abstract UsersRepository createUsersRepository();
 
     @Override
-    public boolean addUser(String user, String password) throws Exception {
-        usersRepository.addUser(user, password);
+    public boolean addUser(Username username, String password) throws Exception {
+        usersRepository.addUser(username, password);
         return true;
     }
 
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 245ee74..9162099 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
@@ -82,11 +82,11 @@ public class SmtpTestRule implements TestRule, SmtpHostSystem {
     }
 
     @Override
-    public boolean addUser(String userAtDomain, String password) throws Exception {
-        Optional<Domain> domain = Username.of(userAtDomain).getDomainPart();
+    public boolean addUser(Username userAtDomain, String password) throws Exception {
+        Optional<Domain> domain = userAtDomain.getDomainPart();
         Preconditions.checkArgument(domain.isPresent(), "The 'user' should contain the 'domain'");
         createDomainIfNeeded(domain.get().asString());
-        jamesServer.getProbe(DataProbeImpl.class).addUser(userAtDomain, password);
+        jamesServer.getProbe(DataProbeImpl.class).addUser(userAtDomain.asString(), password);
         return true;
     }
 
diff --git a/mpt/mavenplugin/src/main/java/org/apache/james/mpt/maven/AddUser.java b/mpt/mavenplugin/src/main/java/org/apache/james/mpt/maven/AddUser.java
index e8c2e2c..05e02ac 100644
--- a/mpt/mavenplugin/src/main/java/org/apache/james/mpt/maven/AddUser.java
+++ b/mpt/mavenplugin/src/main/java/org/apache/james/mpt/maven/AddUser.java
@@ -22,6 +22,7 @@ package org.apache.james.mpt.maven;
 import java.io.File;
 import java.util.Optional;
 
+import org.apache.james.core.Username;
 import org.apache.james.util.Port;
 
 
@@ -31,7 +32,7 @@ import org.apache.james.util.Port;
 public class AddUser {
     
     private Optional<Port> port = Optional.empty();
-    private String user;
+    private Username user;
     private String passwd;
     private String scriptText;
     private String host;
@@ -89,7 +90,7 @@ public class AddUser {
      * Gets the name of the user to be created.
      * @return user name, not null
      */
-    public String getUser() {
+    public Username getUser() {
         return user;
     }
 
@@ -97,7 +98,7 @@ public class AddUser {
      * Sets the name of the user to be created.
      * @param user not null
      */
-    public void setUser(String user) {
+    public void setUser(Username user) {
         this.user = user;
     }
     
diff --git a/protocols/api/pom.xml b/protocols/api/pom.xml
index 3349126..e1b8b49 100644
--- a/protocols/api/pom.xml
+++ b/protocols/api/pom.xml
@@ -35,6 +35,10 @@
     <dependencies>
         <dependency>
             <groupId>${james.groupId}</groupId>
+            <artifactId>james-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
             <artifactId>testing-base</artifactId>
             <scope>test</scope>
         </dependency>
diff --git a/protocols/api/src/main/java/org/apache/james/protocols/api/ProtocolSession.java b/protocols/api/src/main/java/org/apache/james/protocols/api/ProtocolSession.java
index fbcb830..0937b4b 100644
--- a/protocols/api/src/main/java/org/apache/james/protocols/api/ProtocolSession.java
+++ b/protocols/api/src/main/java/org/apache/james/protocols/api/ProtocolSession.java
@@ -23,6 +23,7 @@ import java.net.InetSocketAddress;
 import java.nio.charset.Charset;
 import java.util.Map;
 
+import org.apache.james.core.Username;
 import org.apache.james.protocols.api.handler.LineHandler;
 
 /**
@@ -116,14 +117,14 @@ public interface ProtocolSession {
      *
      * @return the user name
      */
-    String getUser();
+    Username getUsername();
 
     /**
      * Sets the user name associated with this interaction.
      *
-     * @param user the user name
+     * @param username the user name
      */
-    void setUser(String user);
+    void setUsername(Username username);
 
     /**
      * Return true if StartTLS is supported by the configuration
diff --git a/protocols/api/src/main/java/org/apache/james/protocols/api/ProtocolSessionImpl.java b/protocols/api/src/main/java/org/apache/james/protocols/api/ProtocolSessionImpl.java
index 8f32966..266aeba 100644
--- a/protocols/api/src/main/java/org/apache/james/protocols/api/ProtocolSessionImpl.java
+++ b/protocols/api/src/main/java/org/apache/james/protocols/api/ProtocolSessionImpl.java
@@ -24,6 +24,7 @@ import java.nio.charset.Charset;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.james.core.Username;
 import org.apache.james.protocols.api.handler.LineHandler;
 
 /**
@@ -35,7 +36,7 @@ public class ProtocolSessionImpl implements ProtocolSession {
     private final ProtocolTransport transport;
     private final Map<String, Object> connectionState;
     private final Map<String, Object> sessionState;
-    private String user;
+    private Username username;
     protected final ProtocolConfiguration config;
     private static final Charset CHARSET = Charset.forName("US-ASCII");
     private static final String DELIMITER = "\r\n";
@@ -58,13 +59,13 @@ public class ProtocolSessionImpl implements ProtocolSession {
     }
 
     @Override
-    public String getUser() {
-        return user;
+    public Username getUsername() {
+        return username;
     }
 
     @Override
-    public void setUser(String user) {
-        this.user = user;
+    public void setUsername(Username username) {
+        this.username = username;
     }
 
     /**
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/api/ImapSessionUtils.java b/protocols/imap/src/main/java/org/apache/james/imap/api/ImapSessionUtils.java
index 6d4e25a..532eb49 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/api/ImapSessionUtils.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/api/ImapSessionUtils.java
@@ -21,6 +21,7 @@ package org.apache.james.imap.api;
 
 import java.util.Optional;
 
+import org.apache.james.core.Username;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.mailbox.MailboxSession;
 
@@ -36,10 +37,10 @@ public class ImapSessionUtils {
         return (MailboxSession) session.getAttribute(ImapSessionUtils.MAILBOX_SESSION_ATTRIBUTE_SESSION_KEY);
     }
 
-    public static String getUserName(ImapSession imapSession) {
+    public static Username getUserName(ImapSession imapSession) {
         Preconditions.checkNotNull(imapSession);
         return Optional.ofNullable(getMailboxSession(imapSession))
-            .map(mailboxSession -> mailboxSession.getUser().asString())
+            .map(mailboxSession -> mailboxSession.getUser())
             .orElse(null);
     }
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/main/PathConverter.java b/protocols/imap/src/main/java/org/apache/james/imap/main/PathConverter.java
index e7d5ff6..8f97bd7 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/main/PathConverter.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/main/PathConverter.java
@@ -21,6 +21,7 @@ package org.apache.james.imap.main;
 
 import java.util.List;
 
+import org.apache.james.core.Username;
 import org.apache.james.imap.api.ImapSessionUtils;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.mailbox.model.MailboxConstants;
@@ -74,14 +75,14 @@ public class PathConverter {
         return buildMailboxPath(namespace, retrieveUserName(namespace), mailboxName);
     }
 
-    private String retrieveUserName(String namespace) {
+    private Username retrieveUserName(String namespace) {
         if (namespace.equals(MailboxConstants.USER_NAMESPACE)) {
             return ImapSessionUtils.getUserName(session);
         }
         throw new DeniedAccessOnSharedMailboxException();
     }
 
-    private MailboxPath buildMailboxPath(String namespace, String user, String mailboxName) {
+    private MailboxPath buildMailboxPath(String namespace, Username user, String mailboxName) {
         if (!namespace.equals(MailboxConstants.USER_NAMESPACE)) {
             throw new DeniedAccessOnSharedMailboxException();
         }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractAuthProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractAuthProcessor.java
index 7d8ba6a..77416a8 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractAuthProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractAuthProcessor.java
@@ -20,6 +20,7 @@ package org.apache.james.imap.processor;
 
 import java.util.Optional;
 
+import org.apache.james.core.Username;
 import org.apache.james.imap.api.ImapSessionUtils;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.request.ImapRequest;
@@ -67,7 +68,7 @@ public abstract class AbstractAuthProcessor<R extends ImapRequest> extends Abstr
             if (!authFailure) {
                 final MailboxManager mailboxManager = getMailboxManager();
                 try {
-                    final MailboxSession mailboxSession = mailboxManager.login(authenticationAttempt.getAuthenticationId(),
+                    final MailboxSession mailboxSession = mailboxManager.login(Username.of(authenticationAttempt.getAuthenticationId()),
                         authenticationAttempt.getPassword());
                     session.authenticated();
                     session.setAttribute(ImapSessionUtils.MAILBOX_SESSION_ATTRIBUTE_SESSION_KEY, mailboxSession);
@@ -96,9 +97,9 @@ public abstract class AbstractAuthProcessor<R extends ImapRequest> extends Abstr
             if (!authFailure) {
                 final MailboxManager mailboxManager = getMailboxManager();
                 try {
-                    final MailboxSession mailboxSession = mailboxManager.loginAsOtherUser(authenticationAttempt.getAuthenticationId(),
+                    final MailboxSession mailboxSession = mailboxManager.loginAsOtherUser(Username.of(authenticationAttempt.getAuthenticationId()),
                         authenticationAttempt.getPassword(),
-                        authenticationAttempt.getDelegateUserName().get());
+                        Username.of(authenticationAttempt.getDelegateUserName().get()));
                     session.authenticated();
                     session.setAttribute(ImapSessionUtils.MAILBOX_SESSION_ATTRIBUTE_SESSION_KEY, mailboxSession);
                     provisionInbox(session, mailboxManager, mailboxSession);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
index f4d1479..712925e 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
@@ -369,7 +369,7 @@ public abstract class AbstractMailboxProcessor<R extends ImapRequest> extends Ab
             if (sb.length() > 0) {
                 sb.append(delimiter);
             }
-            sb.append(mailboxPath.getUser());
+            sb.append(mailboxPath.getUser().asString());
         }
         if (mailboxPath.getName() != null && !mailboxPath.getName().equals("")) {
             if (sb.length() > 0) {
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/api/ImapSessionUtilsTest.java b/protocols/imap/src/test/java/org/apache/james/imap/api/ImapSessionUtilsTest.java
index 59999ba..57a82eb 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/api/ImapSessionUtilsTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/api/ImapSessionUtilsTest.java
@@ -22,6 +22,7 @@ package org.apache.james.imap.api;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
+import org.apache.james.core.Username;
 import org.apache.james.imap.encode.FakeImapSession;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
@@ -29,7 +30,7 @@ import org.junit.Before;
 import org.junit.Test;
 
 public class ImapSessionUtilsTest {
-    private static final String USERNAME = "username";
+    private static final Username USERNAME = Username.of("username");
     private static final MailboxSession MAILBOX_SESSION = MailboxSessionUtil.create(USERNAME);
     private FakeImapSession fakeImapSession;
 
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/CreateCommandParserTest.java b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/CreateCommandParserTest.java
index 526cf28..a7a8e04 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/CreateCommandParserTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/CreateCommandParserTest.java
@@ -30,6 +30,7 @@ import java.io.InputStream;
 import java.io.OutputStream;
 import java.nio.charset.StandardCharsets;
 
+import org.apache.james.core.Username;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapSessionUtils;
 import org.apache.james.imap.api.process.ImapSession;
@@ -52,7 +53,7 @@ public class CreateCommandParserTest {
     @Before
     public void setUp() throws Exception {
         mockImapSession = mock(ImapSession.class);
-        mailboxSession = MailboxSessionUtil.create("userName");
+        mailboxSession = MailboxSessionUtil.create(Username.of("userName"));
 
         when(mockImapSession.getAttribute(ImapSessionUtils.MAILBOX_SESSION_ATTRIBUTE_SESSION_KEY)).thenReturn(mailboxSession);
 
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/main/PathConverterTest.java b/protocols/imap/src/test/java/org/apache/james/imap/main/PathConverterTest.java
index 6395098..657722f 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/main/PathConverterTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/main/PathConverterTest.java
@@ -23,6 +23,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import org.apache.james.core.Username;
 import org.apache.james.imap.api.ImapSessionUtils;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.mailbox.MailboxSession;
@@ -36,7 +37,7 @@ import org.junit.rules.ExpectedException;
 
 public class PathConverterTest {
 
-    private static final String USERNAME = "username";
+    private static final Username USERNAME = Username.of("username");
     private static final char PATH_DELIMITER = '.';
 
     private ImapSession imapSession;
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 d9714a8..c4ff836 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
@@ -76,7 +76,7 @@ public class CopyProcessorTest {
         mockStatusResponseFactory = mock(StatusResponseFactory.class);
         mockResponder = mock(ImapProcessor.Responder.class);
         mockImapSession = mock(ImapSession.class);
-        mailboxSession = MailboxSessionUtil.create(USERNAME.asString());
+        mailboxSession = MailboxSessionUtil.create(USERNAME);
 
         testee = new CopyProcessor(mockNextProcessor, mockMailboxManager, mockStatusResponseFactory, new NoopMetricFactory());
     }
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/DeleteACLProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/DeleteACLProcessorTest.java
index 84c637e..d43a94b 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/DeleteACLProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/DeleteACLProcessorTest.java
@@ -29,6 +29,7 @@ import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
 
+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 +62,7 @@ import org.mockito.ArgumentCaptor;
 public class DeleteACLProcessorTest {
 
     private static final String MAILBOX_NAME = ImapConstants.INBOX_NAME;
-    private static final String USER_1 = "user1";
+    private static final Username USER_1 = Username.of("user1");
 
     private ImapSession imapSession;
     private MailboxManager mailboxManager;
@@ -99,9 +100,9 @@ public class DeleteACLProcessorTest {
         deleteACLRequest = new DeleteACLRequest(TAG,
             ImapCommand.anyStateCommand("Name"),
             MAILBOX_NAME,
-            USER_1);
+            USER_1.asString());
 
-        user1Key = EntryKey.deserialize(USER_1);
+        user1Key = EntryKey.deserialize(USER_1.asString());
 
         argumentCaptor = ArgumentCaptor.forClass(ImapResponseMessage.class);
     }
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/GetACLProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/GetACLProcessorTest.java
index 381b18d..4f5a58e 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/GetACLProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/GetACLProcessorTest.java
@@ -29,6 +29,7 @@ import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
 
+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 +62,7 @@ import org.mockito.ArgumentCaptor;
 public class GetACLProcessorTest {
 
     private static final String MAILBOX_NAME = ImapConstants.INBOX_NAME;
-    private static final String USER_1 = "user1";
+    private static final Username USER_1 = Username.of("user1");
 
     private ImapSession imapSession;
     private MailboxManager mailboxManager;
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/GetAnnotationProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/GetAnnotationProcessorTest.java
index 8e5e7e0..5061360 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/GetAnnotationProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/GetAnnotationProcessorTest.java
@@ -33,6 +33,7 @@ import static org.mockito.Mockito.when;
 import java.util.Optional;
 import java.util.Set;
 
+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;
@@ -104,7 +105,7 @@ public class GetAnnotationProcessorTest {
         mockResponder = mock(ImapProcessor.Responder.class);
         mockImapSession = mock(ImapSession.class);
 
-        mailboxSession = MailboxSessionUtil.create("username");
+        mailboxSession = MailboxSessionUtil.create(Username.of("username"));
         inbox = MailboxPath.inbox(mailboxSession);
         keys = ImmutableSet.of(PRIVATE_KEY);
         annotationRequestBuilder = GetAnnotationRequest.builder()
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/GetQuotaProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/GetQuotaProcessorTest.java
index 5c76ef7..46ff00c 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/GetQuotaProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/GetQuotaProcessorTest.java
@@ -30,6 +30,7 @@ import static org.mockito.Mockito.when;
 
 import java.util.Optional;
 
+import org.apache.james.core.Username;
 import org.apache.james.core.quota.QuotaCount;
 import org.apache.james.core.quota.QuotaSize;
 import org.apache.james.imap.api.ImapCommand;
@@ -62,7 +63,8 @@ import com.google.common.collect.ImmutableList;
 public class GetQuotaProcessorTest {
 
     private static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("plop", Optional.empty());
-    private static final MailboxPath MAILBOX_PATH = new MailboxPath("namespace", "plop", "INBOX");
+    private static final Username PLOP = Username.of("plop");
+    private static final MailboxPath MAILBOX_PATH = new MailboxPath("namespace", PLOP, "INBOX");
     private static final Quota<QuotaCount> MESSAGE_QUOTA =
         Quota.<QuotaCount>builder().used(QuotaCount.count(24)).computedLimit(QuotaCount.count(1589)).build();
     private static final Quota<QuotaSize> STORAGE_QUOTA =
@@ -79,7 +81,7 @@ public class GetQuotaProcessorTest {
 
     @Before
     public void setUp() throws Exception {
-        mailboxSession = MailboxSessionUtil.create("plop");
+        mailboxSession = MailboxSessionUtil.create(PLOP);
         UnpooledStatusResponseFactory statusResponseFactory = new UnpooledStatusResponseFactory();
         mockedImapSession = mock(ImapSession.class);
         mockedQuotaManager = mock(QuotaManager.class);
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/GetQuotaRootProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/GetQuotaRootProcessorTest.java
index 4510fa6..4ac151d 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/GetQuotaRootProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/GetQuotaRootProcessorTest.java
@@ -31,6 +31,7 @@ import static org.mockito.Mockito.when;
 import java.util.List;
 import java.util.Optional;
 
+import org.apache.james.core.Username;
 import org.apache.james.core.quota.QuotaCount;
 import org.apache.james.core.quota.QuotaSize;
 import org.apache.james.imap.api.ImapCommand;
@@ -62,7 +63,8 @@ import org.mockito.ArgumentCaptor;
 public class GetQuotaRootProcessorTest {
 
     private static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("plop", Optional.empty());
-    private static final MailboxPath MAILBOX_PATH = MailboxPath.forUser("plop", "INBOX");
+    private static final Username PLOP = Username.of("plop");
+    private static final MailboxPath MAILBOX_PATH = MailboxPath.forUser(PLOP, "INBOX");
     private static final Quota<QuotaCount> MESSAGE_QUOTA =
         Quota.<QuotaCount>builder().used(QuotaCount.count(24)).computedLimit(QuotaCount.count(1589)).build();
     private static final Quota<QuotaSize> STORAGE_QUOTA =
@@ -78,7 +80,7 @@ public class GetQuotaRootProcessorTest {
 
     @Before
     public void setUp() {
-        mailboxSession = MailboxSessionUtil.create("plop");
+        mailboxSession = MailboxSessionUtil.create(PLOP);
         UnpooledStatusResponseFactory statusResponseFactory = new UnpooledStatusResponseFactory();
         mockedImapSession = mock(ImapSession.class);
         mockedQuotaManager = mock(QuotaManager.class);
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/LSubProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/LSubProcessorTest.java
index f6b0243..75c6424 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/LSubProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/LSubProcessorTest.java
@@ -29,6 +29,7 @@ import static org.mockito.Mockito.when;
 import java.util.ArrayList;
 import java.util.Collection;
 
+import org.apache.james.core.Username;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapSessionUtils;
 import org.apache.james.imap.api.display.HumanReadableText;
@@ -68,7 +69,7 @@ public class LSubProcessorTest {
 
     private static final String MAILBOX_A = "A.MAILBOX";
 
-    public static final String USER = "test";
+    public static final Username USER = Username.of("test");
 
     LSubProcessor processor;
     ImapProcessor next;
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/ListRightsProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/ListRightsProcessorTest.java
index 375256a..43a80c2 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/ListRightsProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/ListRightsProcessorTest.java
@@ -29,6 +29,7 @@ import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
 
+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;
@@ -62,7 +63,7 @@ import org.mockito.ArgumentCaptor;
 public class ListRightsProcessorTest {
 
     private static final String MAILBOX_NAME = ImapConstants.INBOX_NAME;
-    private static final String USER_1 = "user1";
+    private static final Username USER_1 = Username.of("user1");
 
     private ImapSession imapSession;
     private MailboxManager mailboxManager;
@@ -99,9 +100,9 @@ public class ListRightsProcessorTest {
         when(mailboxManager.getMailbox(any(MailboxPath.class), any(MailboxSession.class)))
             .thenReturn(messageManager);
 
-        listRightsRequest = new ListRightsRequest(TAG, ImapCommand.anyStateCommand("Name"), MAILBOX_NAME, USER_1);
+        listRightsRequest = new ListRightsRequest(TAG, ImapCommand.anyStateCommand("Name"), MAILBOX_NAME, USER_1.asString());
 
-        user1Key = EntryKey.deserialize(USER_1);
+        user1Key = EntryKey.deserialize(USER_1.asString());
         listRights = new Rfc4314Rights[] {Rfc4314Rights.fromSerializedRfc4314Rights("ae"), Rfc4314Rights.fromSerializedRfc4314Rights("i"), Rfc4314Rights.fromSerializedRfc4314Rights("k")};
     }
     
@@ -171,7 +172,7 @@ public class ListRightsProcessorTest {
 
         subject.doProcess(listRightsRequest, responder, imapSession);
 
-        ListRightsResponse response = new ListRightsResponse(MAILBOX_NAME, USER_1, listRights);
+        ListRightsResponse response = new ListRightsResponse(MAILBOX_NAME, USER_1.asString(), listRights);
         verify(responder, times(2)).respond(argumentCaptor.capture());
         verifyNoMoreInteractions(responder);
 
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 34f96a4..22296e8 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
@@ -79,7 +79,7 @@ public class MoveProcessorTest {
         mockStatusResponseFactory = mock(StatusResponseFactory.class);
         mockResponder = mock(ImapProcessor.Responder.class);
         mockImapSession = mock(ImapSession.class);
-        mailboxSession = MailboxSessionUtil.create(USERNAME.asString());
+        mailboxSession = MailboxSessionUtil.create(USERNAME);
 
         when(mockMailboxManager.hasCapability(eq(MailboxCapabilities.Move))).thenReturn(true);
         testee = new MoveProcessor(mockNextProcessor, mockMailboxManager, mockStatusResponseFactory, new NoopMetricFactory());
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/SearchProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/SearchProcessorTest.java
index f4689bf..1653c0d 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/SearchProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/SearchProcessorTest.java
@@ -39,6 +39,7 @@ import java.util.stream.Stream;
 import javax.mail.Flags;
 import javax.mail.Flags.Flag;
 
+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.ImapSessionUtils;
@@ -100,8 +101,9 @@ public class SearchProcessorTest {
     private static final SearchQuery.UidRange[] RANGES = {
             new SearchQuery.UidRange(MessageUid.of(1)),
             new SearchQuery.UidRange(MessageUid.of(42), MessageUid.of(1048)) };
-    
-    private static final MailboxPath mailboxPath = new MailboxPath("namespace", "user", "name");
+
+    private static final Username USER = Username.of("user");
+    private static final MailboxPath mailboxPath = new MailboxPath("namespace", USER, "name");
     private static final MailboxId mailboxId = TestId.of(18);
 
     SearchProcessor processor;
@@ -126,7 +128,7 @@ public class SearchProcessorTest {
         statusResponse = mock(StatusResponse.class);
         mailbox = mock(MessageManager.class);
         mailboxManager = mock(MailboxManager.class);
-        mailboxSession = MailboxSessionUtil.create("user");
+        mailboxSession = MailboxSessionUtil.create(USER);
         selectedMailbox = mock(SelectedMailbox.class);
         when(selectedMailbox.getMailboxId()).thenReturn(mailboxId);
         
@@ -140,7 +142,7 @@ public class SearchProcessorTest {
     }
 
     private void allowUnsolicitedResponses() {
-        when(session.getAttribute(ImapSessionUtils.MAILBOX_USER_ATTRIBUTE_SESSION_KEY)).thenReturn("user");
+        when(session.getAttribute(ImapSessionUtils.MAILBOX_USER_ATTRIBUTE_SESSION_KEY)).thenReturn(USER);
         when(session.getAttribute(ImapSessionUtils.MAILBOX_SESSION_ATTRIBUTE_SESSION_KEY)).thenReturn(mailboxSession);
     }
 
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/SetACLProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/SetACLProcessorTest.java
index 25e2b79..dcb4629 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/SetACLProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/SetACLProcessorTest.java
@@ -29,6 +29,7 @@ import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
 
+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;
@@ -63,7 +64,7 @@ import org.mockito.ArgumentCaptor;
 public class SetACLProcessorTest {
 
     private static final String MAILBOX_NAME = ImapConstants.INBOX_NAME;
-    private static final String USER_1 = "user1";
+    private static final Username USER_1 = Username.of("user1");
     private static final String SET_RIGHTS = "aw";
     private static final String UNSUPPORTED_RIGHT = "W";
 
@@ -101,15 +102,15 @@ public class SetACLProcessorTest {
         when(mailboxManager.getMailbox(any(MailboxPath.class), any(MailboxSession.class)))
             .thenReturn(messageManager);
 
-        replaceAclRequest = new SetACLRequest(TAG, ImapCommand.anyStateCommand("Name"), MAILBOX_NAME, USER_1, SET_RIGHTS);
+        replaceAclRequest = new SetACLRequest(TAG, ImapCommand.anyStateCommand("Name"), MAILBOX_NAME, USER_1.asString(), SET_RIGHTS);
 
-        user1Key = EntryKey.deserialize(USER_1);
+        user1Key = EntryKey.deserialize(USER_1.asString());
         setRights = Rfc4314Rights.fromSerializedRfc4314Rights(SET_RIGHTS);
     }
     
     @Test
     public void testUnsupportedRight() throws Exception {
-        SetACLRequest setACLRequest = new SetACLRequest(TAG, ImapCommand.anyStateCommand("Name"), MAILBOX_NAME, USER_1, UNSUPPORTED_RIGHT);
+        SetACLRequest setACLRequest = new SetACLRequest(TAG, ImapCommand.anyStateCommand("Name"), MAILBOX_NAME, USER_1.asString(), UNSUPPORTED_RIGHT);
 
         when(mailboxManager.hasRight(path, MailboxACL.Right.Lookup, mailboxSession))
             .thenReturn(false);
@@ -180,8 +181,7 @@ public class SetACLProcessorTest {
         when(mailboxManager.hasRight(path, MailboxACL.Right.Administer, mailboxSession))
             .thenReturn(true);
 
-
-        SetACLRequest r = new SetACLRequest(TAG, ImapCommand.anyStateCommand("Name"), MAILBOX_NAME, USER_1, prefix + SET_RIGHTS);
+        SetACLRequest r = new SetACLRequest(TAG, ImapCommand.anyStateCommand("Name"), MAILBOX_NAME, USER_1.asString(), prefix + SET_RIGHTS);
         subject.doProcess(r, responder, imapSession);
 
         verify(mailboxManager).applyRightsCommand(path,
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/SetAnnotationProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/SetAnnotationProcessorTest.java
index 63b1bb6..daeba27 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/SetAnnotationProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/SetAnnotationProcessorTest.java
@@ -31,6 +31,7 @@ import static org.mockito.Mockito.when;
 
 import java.util.List;
 
+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;
@@ -91,7 +92,7 @@ public class SetAnnotationProcessorTest {
         mockResponder = mock(ImapProcessor.Responder.class);
         mockImapSession = mock(ImapSession.class);
 
-        mockMailboxSession = MailboxSessionUtil.create("username");
+        mockMailboxSession = MailboxSessionUtil.create(Username.of("username"));
         inbox = MailboxPath.inbox(mockMailboxSession);
         mailboxAnnotations = ImmutableList.of(MailboxAnnotation.newInstance(new MailboxAnnotationKey("/private/key"), "anyValue"));
         request = new SetAnnotationRequest(TAG, ImapCommand.anyStateCommand("Name"), ImapConstants.INBOX_NAME, mailboxAnnotations);
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/SetQuotaProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/SetQuotaProcessorTest.java
index 62b80c5..89c7773 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/SetQuotaProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/SetQuotaProcessorTest.java
@@ -26,6 +26,7 @@ import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
 
+import org.apache.james.core.Username;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapSessionState;
 import org.apache.james.imap.api.ImapSessionUtils;
@@ -51,7 +52,7 @@ public class SetQuotaProcessorTest {
 
     @Before
     public void setUp() {
-        mailboxSession = MailboxSessionUtil.create("plop");
+        mailboxSession = MailboxSessionUtil.create(Username.of("plop"));
         UnpooledStatusResponseFactory statusResponseFactory = new UnpooledStatusResponseFactory();
         mockedImapSession = mock(ImapSession.class);
         mockedResponder = mock(ImapProcessor.Responder.class);
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
index 4f63da0..b6e2419 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
@@ -30,6 +30,7 @@ import java.util.stream.Stream;
 import javax.mail.Flags;
 
 import org.apache.commons.lang3.NotImplementedException;
+import org.apache.james.core.Username;
 import org.apache.james.imap.api.ImapSessionState;
 import org.apache.james.imap.api.ImapSessionUtils;
 import org.apache.james.imap.api.process.ImapSession;
@@ -110,10 +111,11 @@ public class MailboxEventAnalyserTest {
     }
 
     private static final MessageUid MESSAGE_UID = MessageUid.of(1);
-    private static final MailboxSession MAILBOX_SESSION = MailboxSessionUtil.create("user");
-    private static final MailboxSession OTHER_MAILBOX_SESSION = MailboxSessionUtil.create("user");
+    private static final Username USER = Username.of("user");
+    private static final MailboxSession MAILBOX_SESSION = MailboxSessionUtil.create(USER);
+    private static final MailboxSession OTHER_MAILBOX_SESSION = MailboxSessionUtil.create(USER);
     private static final char PATH_DELIMITER = '.';
-    private static final MailboxPath MAILBOX_PATH = new MailboxPath("namespace", "user", "name");
+    private static final MailboxPath MAILBOX_PATH = new MailboxPath("namespace", USER, "name");
     private static final TestId MAILBOX_ID = TestId.of(36);
     private static final int UID_VALIDITY = 1024;
     private static final Mailbox DEFAULT_MAILBOX = new Mailbox(MAILBOX_PATH, UID_VALIDITY, MAILBOX_ID);
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/SelectedMailboxImplTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/SelectedMailboxImplTest.java
index 7d7df56..ba8fd4f 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/SelectedMailboxImplTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/SelectedMailboxImplTest.java
@@ -36,6 +36,7 @@ import java.util.stream.Stream;
 
 import javax.mail.Flags;
 
+import org.apache.james.core.Username;
 import org.apache.james.imap.api.ImapSessionUtils;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.mailbox.MailboxManager;
@@ -84,7 +85,7 @@ public class SelectedMailboxImplTest {
     public void setUp() throws Exception {
         ThreadFactory threadFactory = NamedThreadFactory.withClassName(getClass());
         executorService = Executors.newFixedThreadPool(1, threadFactory);
-        mailboxPath = MailboxPath.forUser("tellier@linagora.com", MailboxConstants.INBOX);
+        mailboxPath = MailboxPath.forUser(Username.of("tellier@linagora.com"), MailboxConstants.INBOX);
         mailboxManager = mock(MailboxManager.class);
         messageManager = mock(MessageManager.class);
         imapSession = mock(ImapSession.class);
@@ -171,7 +172,7 @@ public class SelectedMailboxImplTest {
     private void emitEvent(MailboxListener mailboxListener) throws Exception {
         mailboxListener.event(EventFactory.added()
             .randomEventId()
-            .mailboxSession(MailboxSessionUtil.create("user"))
+            .mailboxSession(MailboxSessionUtil.create(Username.of("user")))
             .mailbox(mailbox)
             .addMetaData(new MessageMetaData(EMITTED_EVENT_UID, MOD_SEQ, new Flags(), SIZE, new Date(), new DefaultMessageId()))
             .build());
diff --git a/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/AuthenticationProcessor.java b/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/AuthenticationProcessor.java
index 89994d8..50edcbb 100644
--- a/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/AuthenticationProcessor.java
+++ b/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/AuthenticationProcessor.java
@@ -20,6 +20,8 @@
 
 package org.apache.james.managesieve.api;
 
+import org.apache.james.core.Username;
+
 public interface AuthenticationProcessor {
 
     String initialServerResponse(Session session);
@@ -27,6 +29,6 @@ public interface AuthenticationProcessor {
     /**
      * @return Null if authentication failed, the authenticated username if authentication is successful
      */
-    String isAuthenticationSuccesfull(Session session, String suppliedClientData) throws SyntaxException, AuthenticationException;
+    Username isAuthenticationSuccesfull(Session session, String suppliedClientData) throws SyntaxException, AuthenticationException;
 
 }
diff --git a/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/Session.java b/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/Session.java
index 5f71129..c33293d 100644
--- a/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/Session.java
+++ b/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/Session.java
@@ -20,6 +20,7 @@
 
 package org.apache.james.managesieve.api;
 
+import org.apache.james.core.Username;
 import org.apache.james.managesieve.api.commands.Authenticate;
 
 public interface Session {
@@ -34,9 +35,9 @@ public interface Session {
 
     boolean isAuthenticated();
 
-    String getUser();
+    Username getUser();
 
-    void setUser(String user);
+    void setUser(Username user);
 
     State getState();
 
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 6a75d32..ef1e78e 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
@@ -101,7 +101,7 @@ public class CoreProcessor implements CoreCommands {
     private Map<Capabilities, String> computeCapabilityMap(Session session) {
         Map<Capabilities, String> capabilities = Maps.newHashMap(capabilitiesBase);
         if (session.isAuthenticated()) {
-            capabilities.put(Capabilities.OWNER, session.getUser());
+            capabilities.put(Capabilities.OWNER, session.getUser().asString());
         }
         return capabilities;
     }
@@ -131,7 +131,7 @@ public class CoreProcessor implements CoreCommands {
     public String deleteScript(Session session, String name) {
         return handleCommandExecution(() -> {
             authenticationCheck(session);
-            sieveRepository.deleteScript(Username.of(session.getUser()), new ScriptName(name));
+            sieveRepository.deleteScript(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.of(session.getUser()), new ScriptName(name)), StandardCharsets.UTF_8);
+            String scriptContent = IOUtils.toString(sieveRepository.getScript(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.of(session.getUser()), new ScriptName(name), size);
+            sieveRepository.haveSpace(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.of(session.getUser())),
+            Iterables.transform(sieveRepository.listScripts(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.of(session.getUser()), new ScriptName(name), new ScriptContent(content));
+            sieveRepository.putScript(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.of(session.getUser()), new ScriptName(oldName), new ScriptName(newName));
+            sieveRepository.renameScript(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.of(session.getUser()), new ScriptName(name));
+            sieveRepository.setActive(session.getUser(), new ScriptName(name));
             return "OK";
         }, session);
     }
@@ -229,7 +229,7 @@ public class CoreProcessor implements CoreCommands {
         try {
             SupportedMechanism currentAuthenticationMechanism = session.getChoosedAuthenticationMechanism();
             AuthenticationProcessor authenticationProcessor = authenticationProcessorMap.get(currentAuthenticationMechanism);
-            String authenticatedUsername = authenticationProcessor.isAuthenticationSuccesfull(session, suppliedData);
+            Username authenticatedUsername = authenticationProcessor.isAuthenticationSuccesfull(session, suppliedData);
             if (authenticatedUsername != null) {
                 session.setUser(authenticatedUsername);
                 session.setState(Session.State.AUTHENTICATED);
diff --git a/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/PlainAuthenticationProcessor.java b/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/PlainAuthenticationProcessor.java
index c2d1798..f0d4f03 100644
--- a/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/PlainAuthenticationProcessor.java
+++ b/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/PlainAuthenticationProcessor.java
@@ -22,6 +22,7 @@ package org.apache.james.managesieve.core;
 
 import java.util.Iterator;
 
+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.Session;
@@ -52,7 +53,7 @@ public class PlainAuthenticationProcessor implements AuthenticationProcessor {
 
 
     @Override
-    public String isAuthenticationSuccesfull(Session session, String suppliedClientData) throws SyntaxException, AuthenticationException {
+    public Username isAuthenticationSuccesfull(Session session, String suppliedClientData) throws SyntaxException, AuthenticationException {
         if (suppliedClientData.contains("\u0000")) {
             return authenticateWithSeparator(session, suppliedClientData, '\u0000');
         } else {
@@ -60,12 +61,12 @@ public class PlainAuthenticationProcessor implements AuthenticationProcessor {
         }
     }
 
-    private String authenticateWithSeparator(Session session, String suppliedClientData, char c) throws SyntaxException, AuthenticationException {
+    private Username authenticateWithSeparator(Session session, String suppliedClientData, char c) throws SyntaxException, AuthenticationException {
         Iterator<String> it = Splitter.on(c).split(suppliedClientData).iterator();
         if (!it.hasNext()) {
             throw new SyntaxException("You must supply a username for the authentication mechanism. Formal syntax : <NULL>username<NULL>password");
         }
-        String userName = it.next();
+        Username userName = Username.of(it.next());
         if (!it.hasNext()) {
             throw new SyntaxException("You must supply a password for the authentication mechanism. Formal syntax : <NULL>username<NULL>password");
         }
diff --git a/protocols/managesieve/src/main/java/org/apache/james/managesieve/util/SettableSession.java b/protocols/managesieve/src/main/java/org/apache/james/managesieve/util/SettableSession.java
index 5955b35..09b49de 100644
--- a/protocols/managesieve/src/main/java/org/apache/james/managesieve/util/SettableSession.java
+++ b/protocols/managesieve/src/main/java/org/apache/james/managesieve/util/SettableSession.java
@@ -20,12 +20,13 @@
 
 package org.apache.james.managesieve.util;
 
+import org.apache.james.core.Username;
 import org.apache.james.managesieve.api.Session;
 import org.apache.james.managesieve.api.commands.Authenticate;
 
 public class SettableSession implements Session {
 
-    private String user;
+    private Username user;
     private State state;
     private Authenticate.SupportedMechanism choosedAuthenticationMechanism;
     private boolean sslEnabled;
@@ -36,7 +37,7 @@ public class SettableSession implements Session {
     }
 
     @Override
-    public String getUser() {
+    public Username getUser() {
         return user;
     }
 
@@ -46,7 +47,7 @@ public class SettableSession implements Session {
     }
 
     @Override
-    public void setUser(String user) {
+    public void setUser(Username user) {
         this.user = user;
     }
 
diff --git a/protocols/netty/src/main/java/org/apache/james/protocols/netty/ProtocolMDCContext.java b/protocols/netty/src/main/java/org/apache/james/protocols/netty/ProtocolMDCContext.java
index f5d76a6..810a448 100644
--- a/protocols/netty/src/main/java/org/apache/james/protocols/netty/ProtocolMDCContext.java
+++ b/protocols/netty/src/main/java/org/apache/james/protocols/netty/ProtocolMDCContext.java
@@ -64,7 +64,7 @@ public class ProtocolMDCContext {
             .map(protocolSession -> MDCBuilder.create()
                 .addContext(MDCBuilder.SESSION_ID, protocolSession.getSessionID())
                 .addContext(MDCBuilder.CHARSET, protocolSession.getCharset().displayName())
-                .addContext(MDCBuilder.USER, protocolSession.getUser()))
+                .addContext(MDCBuilder.USER, protocolSession.getUsername()))
             .orElse(MDCBuilder.create());
     }
 
diff --git a/protocols/pop3/src/main/java/org/apache/james/protocols/pop3/core/AbstractApopCmdHandler.java b/protocols/pop3/src/main/java/org/apache/james/protocols/pop3/core/AbstractApopCmdHandler.java
index 990562c..656339a 100644
--- a/protocols/pop3/src/main/java/org/apache/james/protocols/pop3/core/AbstractApopCmdHandler.java
+++ b/protocols/pop3/src/main/java/org/apache/james/protocols/pop3/core/AbstractApopCmdHandler.java
@@ -21,6 +21,7 @@ package org.apache.james.protocols.pop3.core;
 
 import java.util.Collection;
 
+import org.apache.james.core.Username;
 import org.apache.james.protocols.api.ProtocolSession.State;
 import org.apache.james.protocols.api.Request;
 import org.apache.james.protocols.api.Response;
@@ -57,11 +58,12 @@ public abstract class AbstractApopCmdHandler extends AbstractPassCmdHandler {
         }
         if (!syntaxError && session.getHandlerState() == POP3Session.AUTHENTICATION_READY) {
 
-            Response response = doAuth(session, parts[0], parts[1]);
+            Username username = Username.of(parts[0]);
+            Response response = doAuth(session, username, parts[1]);
             
             if (POP3Response.OK_RESPONSE.equals(response.getRetCode())) {
                 // the auth was successful so set the user
-                session.setUser(parts[0]);
+                session.setUsername(username);
             }
             return response;
         } else {
@@ -78,7 +80,7 @@ public abstract class AbstractApopCmdHandler extends AbstractPassCmdHandler {
 
     
     @Override
-    protected final Mailbox auth(POP3Session session, String username, String password) throws Exception {
+    protected final Mailbox auth(POP3Session session, Username username, String password) throws Exception {
         return auth(session, (String)session.getAttachment(POP3Session.APOP_TIMESTAMP, State.Connection), username, password);
     }
 
@@ -88,5 +90,5 @@ public abstract class AbstractApopCmdHandler extends AbstractPassCmdHandler {
      *
      * @return mailbox
      */
-    protected abstract Mailbox auth(POP3Session session, String apopTimestamp, String user, String digest) throws Exception;
+    protected abstract Mailbox auth(POP3Session session, String apopTimestamp, Username user, String digest) throws Exception;
 }
diff --git a/protocols/pop3/src/main/java/org/apache/james/protocols/pop3/core/AbstractPassCmdHandler.java b/protocols/pop3/src/main/java/org/apache/james/protocols/pop3/core/AbstractPassCmdHandler.java
index 915b455..9358025 100644
--- a/protocols/pop3/src/main/java/org/apache/james/protocols/pop3/core/AbstractPassCmdHandler.java
+++ b/protocols/pop3/src/main/java/org/apache/james/protocols/pop3/core/AbstractPassCmdHandler.java
@@ -20,7 +20,9 @@
 package org.apache.james.protocols.pop3.core;
 
 import java.util.Collection;
+import java.util.Optional;
 
+import org.apache.james.core.Username;
 import org.apache.james.protocols.api.Request;
 import org.apache.james.protocols.api.Response;
 import org.apache.james.protocols.pop3.POP3Response;
@@ -48,7 +50,7 @@ public abstract class AbstractPassCmdHandler extends RsetCmdHandler {
     public Response onCommand(POP3Session session, Request request) {
         String parameters = request.getArgument();
         if (session.getHandlerState() == POP3Session.AUTHENTICATION_USERSET && parameters != null) {
-            return doAuth(session, session.getUser(), parameters);
+            return doAuth(session, session.getUsername(), parameters);
         } else {
             session.setHandlerState(POP3Session.AUTHENTICATION_READY);
             return AUTH_FAILED;
@@ -59,7 +61,7 @@ public abstract class AbstractPassCmdHandler extends RsetCmdHandler {
     /**
      * Authenticate a user and return the {@link Response}
      */
-    protected final Response doAuth(POP3Session session, String user, String pass) {
+    protected final Response doAuth(POP3Session session, Username user, String pass) {
         try {
             Mailbox mailbox = auth(session, user, pass);
 
@@ -68,16 +70,18 @@ public abstract class AbstractPassCmdHandler extends RsetCmdHandler {
                 stat(session);
 
                 session.setHandlerState(POP3Session.TRANSACTION);
-                
 
-                StringBuilder responseBuffer = new StringBuilder(64).append("Welcome ").append(session.getUser());
+                StringBuilder responseBuffer = new StringBuilder(64).append("Welcome ")
+                    .append(Optional.ofNullable(session.getUsername())
+                        .map(Username::asString)
+                        .orElse(null));
                 return  new POP3Response(POP3Response.OK_RESPONSE, responseBuffer.toString());
             } else {
                 session.setHandlerState(POP3Session.AUTHENTICATION_READY);
                 return AUTH_FAILED;
             }
         } catch (Exception e) {
-            LOGGER.error("Unexpected error accessing mailbox for {}", session.getUser(), e);
+            LOGGER.error("Unexpected error accessing mailbox for {}", session.getUsername(), e);
             session.setHandlerState(POP3Session.AUTHENTICATION_READY);
             return UNEXPECTED_ERROR;
         }
@@ -94,5 +98,5 @@ public abstract class AbstractPassCmdHandler extends RsetCmdHandler {
      *
      * @return mailbox
      */
-    protected abstract Mailbox auth(POP3Session session, String username, String password) throws Exception;
+    protected abstract Mailbox auth(POP3Session session, Username username, String password) throws Exception;
 }
diff --git a/protocols/pop3/src/main/java/org/apache/james/protocols/pop3/core/UserCmdHandler.java b/protocols/pop3/src/main/java/org/apache/james/protocols/pop3/core/UserCmdHandler.java
index 427ba96..c4ded58 100644
--- a/protocols/pop3/src/main/java/org/apache/james/protocols/pop3/core/UserCmdHandler.java
+++ b/protocols/pop3/src/main/java/org/apache/james/protocols/pop3/core/UserCmdHandler.java
@@ -22,6 +22,7 @@ package org.apache.james.protocols.pop3.core;
 import java.util.Collection;
 import java.util.Set;
 
+import org.apache.james.core.Username;
 import org.apache.james.protocols.api.Request;
 import org.apache.james.protocols.api.Response;
 import org.apache.james.protocols.api.handler.CommandHandler;
@@ -46,7 +47,7 @@ public class UserCmdHandler implements CommandHandler<POP3Session>, CapaCapabili
     public Response onCommand(POP3Session session, Request request) {
         String parameters = request.getArgument();
         if (session.getHandlerState() == POP3Session.AUTHENTICATION_READY && parameters != null) {
-            session.setUser(parameters);
+            session.setUsername(Username.of(parameters));
             session.setHandlerState(POP3Session.AUTHENTICATION_USERSET);
             return POP3Response.OK;
         } else {
diff --git a/protocols/pop3/src/test/java/org/apache/james/protocols/pop3/AbstractPOP3ServerTest.java b/protocols/pop3/src/test/java/org/apache/james/protocols/pop3/AbstractPOP3ServerTest.java
index e253464..3aa9c15 100644
--- a/protocols/pop3/src/test/java/org/apache/james/protocols/pop3/AbstractPOP3ServerTest.java
+++ b/protocols/pop3/src/test/java/org/apache/james/protocols/pop3/AbstractPOP3ServerTest.java
@@ -31,6 +31,7 @@ import java.util.regex.Pattern;
 import org.apache.commons.net.pop3.POP3Client;
 import org.apache.commons.net.pop3.POP3MessageInfo;
 import org.apache.commons.net.pop3.POP3Reply;
+import org.apache.james.core.Username;
 import org.apache.james.protocols.api.Protocol;
 import org.apache.james.protocols.api.ProtocolServer;
 import org.apache.james.protocols.api.handler.WiringException;
@@ -520,8 +521,8 @@ public abstract class AbstractPOP3ServerTest {
         }
 
         @Override
-        protected Mailbox auth(POP3Session session, String apopTimestamp, String user, String digest) throws Exception {
-            return mailboxes.get(user);
+        protected Mailbox auth(POP3Session session, String apopTimestamp, Username user, String digest) throws Exception {
+            return mailboxes.get(user.asString());
         }
         
         
diff --git a/protocols/pop3/src/test/java/org/apache/james/protocols/pop3/utils/TestPassCmdHandler.java b/protocols/pop3/src/test/java/org/apache/james/protocols/pop3/utils/TestPassCmdHandler.java
index b3cf2b7..fdaa284 100644
--- a/protocols/pop3/src/test/java/org/apache/james/protocols/pop3/utils/TestPassCmdHandler.java
+++ b/protocols/pop3/src/test/java/org/apache/james/protocols/pop3/utils/TestPassCmdHandler.java
@@ -21,6 +21,7 @@ package org.apache.james.protocols.pop3.utils;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.james.core.Username;
 import org.apache.james.protocols.pop3.POP3Session;
 import org.apache.james.protocols.pop3.core.AbstractPassCmdHandler;
 import org.apache.james.protocols.pop3.mailbox.Mailbox;
@@ -33,8 +34,8 @@ public class TestPassCmdHandler extends AbstractPassCmdHandler {
     }
     
     @Override
-    protected Mailbox auth(POP3Session session, String username, String password) throws Exception {
-        return mailboxes.get(username);
+    protected Mailbox auth(POP3Session session, Username username, String password) throws Exception {
+        return mailboxes.get(username.asString());
     }
 
 }
diff --git a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/AbstractSenderAuthIdentifyVerificationRcptHook.java b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/AbstractSenderAuthIdentifyVerificationRcptHook.java
index 8351806..487ec8c 100644
--- a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/AbstractSenderAuthIdentifyVerificationRcptHook.java
+++ b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/AbstractSenderAuthIdentifyVerificationRcptHook.java
@@ -21,6 +21,7 @@ package org.apache.james.protocols.smtp.core;
 import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.james.core.MaybeSender;
+import org.apache.james.core.Username;
 import org.apache.james.protocols.api.ProtocolSession;
 import org.apache.james.protocols.smtp.SMTPRetCode;
 import org.apache.james.protocols.smtp.SMTPSession;
@@ -44,7 +45,7 @@ public abstract class AbstractSenderAuthIdentifyVerificationRcptHook implements
     
     @Override
     public HookResult doRcpt(SMTPSession session, MaybeSender sender, MailAddress rcpt) {
-        if (session.getUser() != null) {
+        if (session.getUsername() != null) {
             MaybeSender senderAddress = (MaybeSender) session.getAttachment(SMTPSession.SENDER, ProtocolSession.State.Transaction);
             
             // Check if the sender address is the same as the user which was used to authenticate.
@@ -66,8 +67,9 @@ public abstract class AbstractSenderAuthIdentifyVerificationRcptHook implements
     private boolean senderMatchSessionUser(MaybeSender maybeSender, SMTPSession session) {
         Preconditions.checkArgument(!maybeSender.isNullSender());
 
-        String authUser = session.getUser();
-        String sender = getUser(maybeSender.get());
+        Username authUser = session.getUsername();
+        Username sender = getUser(maybeSender.get());
+        Username username = getUser(maybeSender.get());
 
         return isSenderAllowed(authUser, sender);
     }
@@ -89,10 +91,10 @@ public abstract class AbstractSenderAuthIdentifyVerificationRcptHook implements
      * 
      * @return username corresponding to the mail address
      */
-    protected abstract String getUser(MailAddress mailAddress);
+    protected abstract Username getUser(MailAddress mailAddress);
 
     /**
      * Is a given sender allowed for a user
      */
-    protected abstract boolean isSenderAllowed(String user, String sender);
+    protected abstract boolean isSenderAllowed(Username user, Username sender);
 }
diff --git a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/ReceivedDataLineFilter.java b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/ReceivedDataLineFilter.java
index c0f19f9..48b0a73 100644
--- a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/ReceivedDataLineFilter.java
+++ b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/ReceivedDataLineFilter.java
@@ -51,7 +51,7 @@ public class ReceivedDataLineFilter extends AbstractAddHeadersFilter {
         // Check if EHLO was used
         if (EHLO.equals(heloMode)) {
             // Not successful auth
-            if (session.getUser() == null) {
+            if (session.getUsername() == null) {
                 return ESMTP;
             } else {
                 // See RFC3848
diff --git a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/AuthCmdHandler.java b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/AuthCmdHandler.java
index 84e0b57..622eea9 100644
--- a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/AuthCmdHandler.java
+++ b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/esmtp/AuthCmdHandler.java
@@ -33,6 +33,7 @@ import java.util.Locale;
 import java.util.Optional;
 import java.util.StringTokenizer;
 
+import org.apache.james.core.Username;
 import org.apache.james.protocols.api.Request;
 import org.apache.james.protocols.api.Response;
 import org.apache.james.protocols.api.handler.CommandHandler;
@@ -156,7 +157,7 @@ public class AuthCmdHandler
      * @param argument the argument passed in with the command by the SMTP client
      */
     private Response doAUTH(SMTPSession session, String argument) {
-        if (session.getUser() != null) {
+        if (session.getUsername() != null) {
             return ALREADY_AUTH;
         } else if (argument == null) {
             return SYNTAX_ERROR;
@@ -267,7 +268,7 @@ public class AuthCmdHandler
             // with in the if clause below
         }
         // Authenticate user
-        Response response = doAuthTest(session, user, pass, "PLAIN");
+        Response response = doAuthTest(session, Username.of(user), pass, "PLAIN");
         
         session.popLineHandler();
 
@@ -303,22 +304,22 @@ public class AuthCmdHandler
         
         session.pushLineHandler(new AbstractSMTPLineHandler() {
 
-            private String user;
+            private Username username;
 
-            public LineHandler<SMTPSession> setUser(String user) {
-                this.user = user;
+            public LineHandler<SMTPSession> setUsername(Username username) {
+                this.username = username;
                 return this;
             }
 
             @Override
             protected Response onCommand(SMTPSession session, String l) {
-                return doLoginAuthPassCheck(session, user, l);
+                return doLoginAuthPassCheck(session, username, l);
             }
-        }.setUser(user));
+        }.setUsername(Username.of(user)));
         return AUTH_READY_PASSWORD_LOGIN;
     }
     
-    private Response doLoginAuthPassCheck(SMTPSession session, String user, String pass) {
+    private Response doLoginAuthPassCheck(SMTPSession session, Username username, String pass) {
         if (pass != null) {
             try {
                 pass = decodeBase64(pass);
@@ -332,11 +333,11 @@ public class AuthCmdHandler
         session.popLineHandler();
 
         // Authenticate user
-        return doAuthTest(session, user, pass, "LOGIN");
+        return doAuthTest(session, username, pass, "LOGIN");
     }
 
-    protected Response doAuthTest(SMTPSession session, String user, String pass, String authType) {
-        if ((user == null) || (pass == null)) {
+    protected Response doAuthTest(SMTPSession session, Username username, String pass, String authType) {
+        if ((username == null) || (pass == null)) {
             return new SMTPResponse(SMTPRetCode.SYNTAX_ERROR_ARGUMENTS,"Could not decode parameters for AUTH " + authType);
         }
 
@@ -349,7 +350,7 @@ public class AuthCmdHandler
                 LOGGER.debug("executing  hook {}", rawHook);
 
                 long start = System.currentTimeMillis();
-                HookResult hRes = rawHook.doAuth(session, user, pass);
+                HookResult hRes = rawHook.doAuth(session, username, pass);
                 long executionTime = System.currentTimeMillis() - start;
 
                 if (rHooks != null) {
@@ -374,7 +375,7 @@ public class AuthCmdHandler
         }
 
         res = AUTH_FAILED;
-        LOGGER.error("AUTH method {} failed from {}@{}", authType, user, session.getRemoteAddress().getAddress().getHostAddress());
+        LOGGER.error("AUTH method {} failed from {}@{}", authType, username, session.getRemoteAddress().getAddress().getHostAddress());
         return res;
     }
 
diff --git a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/hook/AuthHook.java b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/hook/AuthHook.java
index 952c98b..60cc5a3 100644
--- a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/hook/AuthHook.java
+++ b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/hook/AuthHook.java
@@ -18,6 +18,7 @@
  ****************************************************************/
 package org.apache.james.protocols.smtp.hook;
 
+import org.apache.james.core.Username;
 import org.apache.james.protocols.smtp.SMTPSession;
 
 /**
@@ -33,5 +34,5 @@ public interface AuthHook extends Hook {
      * @param password the password
      * @return HockResult
      */
-    HookResult doAuth(SMTPSession session, String username, String password);
+    HookResult doAuth(SMTPSession session, Username username, String password);
 }
diff --git a/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/core/fastfail/ResolvableEhloHeloHandlerTest.java b/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/core/fastfail/ResolvableEhloHeloHandlerTest.java
index df2d274..320f6a1 100644
--- a/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/core/fastfail/ResolvableEhloHeloHandlerTest.java
+++ b/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/core/fastfail/ResolvableEhloHeloHandlerTest.java
@@ -30,6 +30,7 @@ import java.util.Map;
 
 import org.apache.james.core.MailAddress;
 import org.apache.james.core.MaybeSender;
+import org.apache.james.core.Username;
 import org.apache.james.protocols.smtp.SMTPSession;
 import org.apache.james.protocols.smtp.hook.HookReturnCode;
 import org.apache.james.protocols.smtp.utils.BaseFakeSMTPSession;
@@ -43,7 +44,7 @@ public class ResolvableEhloHeloHandlerTest {
 
 
     private SMTPSession setupMockSession(String argument,
-             final boolean relaying, final boolean authRequired, final String user, MailAddress recipient) {
+             final boolean relaying, final boolean authRequired, final Username username, MailAddress recipient) {
 
         return new BaseFakeSMTPSession() {
 
@@ -56,8 +57,8 @@ public class ResolvableEhloHeloHandlerTest {
             }
 
             @Override
-            public String getUser() {
-                return user;
+            public Username getUsername() {
+                return username;
             }
 
             @Override
@@ -148,7 +149,7 @@ public class ResolvableEhloHeloHandlerTest {
     @Test
     public void testRejectInvalidHeloAuthUser() throws Exception {
         MailAddress mailAddress = new MailAddress("test@localhost");
-        SMTPSession session = setupMockSession(INVALID_HOST,false,true,"valid@user",mailAddress);
+        SMTPSession session = setupMockSession(INVALID_HOST, false, true, Username.of("valid@user"), mailAddress);
         ResolvableEhloHeloHandler handler = createHandler();
 
 
diff --git a/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/utils/BaseFakeSMTPSession.java b/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/utils/BaseFakeSMTPSession.java
index e16b4bc..a6c8af1 100644
--- a/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/utils/BaseFakeSMTPSession.java
+++ b/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/utils/BaseFakeSMTPSession.java
@@ -24,6 +24,7 @@ import java.net.InetSocketAddress;
 import java.nio.charset.Charset;
 import java.util.Map;
 
+import org.apache.james.core.Username;
 import org.apache.james.protocols.api.ProtocolSession;
 import org.apache.james.protocols.api.Response;
 import org.apache.james.protocols.api.handler.LineHandler;
@@ -71,7 +72,7 @@ public class BaseFakeSMTPSession implements SMTPSession {
     }
 
     @Override
-    public String getUser() {
+    public Username getUsername() {
         throw new UnsupportedOperationException("Unimplemented Stub Method");
     }
 
@@ -96,11 +97,10 @@ public class BaseFakeSMTPSession implements SMTPSession {
     }
 
     @Override
-    public void setUser(String user) {
+    public void setUsername(Username username) {
         throw new UnsupportedOperationException("Unimplemented Stub Method");
     }
 
-
     @Override
     public void popLineHandler() {
         throw new UnsupportedOperationException("Unimplemented Stub Method");
diff --git a/server/container/cli-integration/src/test/java/org/apache/james/cli/ReindexCommandIntegrationTest.java b/server/container/cli-integration/src/test/java/org/apache/james/cli/ReindexCommandIntegrationTest.java
index c1ff23f..665521b 100644
--- a/server/container/cli-integration/src/test/java/org/apache/james/cli/ReindexCommandIntegrationTest.java
+++ b/server/container/cli-integration/src/test/java/org/apache/james/cli/ReindexCommandIntegrationTest.java
@@ -26,6 +26,7 @@ import static org.mockito.Mockito.when;
 
 import org.apache.james.GuiceJamesServer;
 import org.apache.james.MemoryJmapTestRule;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.indexer.ReIndexer;
 import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MailboxPath;
@@ -77,7 +78,7 @@ public class ReindexCommandIntegrationTest {
         String mailbox = "mailbox";
         ServerCmd.doMain(new String[] {"-h", "127.0.0.1", "-p", "9999", "reindexmailbox", MailboxConstants.USER_NAMESPACE, USER, mailbox});
 
-        verify(reIndexer).reIndex(MailboxPath.forUser(USER, mailbox));
+        verify(reIndexer).reIndex(MailboxPath.forUser(Username.of(USER), mailbox));
     }
 
 }
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/ESReporterTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/ESReporterTest.java
index ef7ff8d..a1c1189 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/ESReporterTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/ESReporterTest.java
@@ -34,6 +34,7 @@ import java.util.TimerTask;
 import java.util.stream.Collectors;
 
 import org.apache.commons.net.imap.IMAPClient;
+import org.apache.james.core.Username;
 import org.apache.james.jmap.api.access.AccessToken;
 import org.apache.james.mailbox.extractor.TextExtractor;
 import org.apache.james.mailbox.store.search.PDFTextExtractor;
@@ -98,7 +99,7 @@ class ESReporterTest {
                 .setConfig(newConfig().encoderConfig(encoderConfig().defaultContentCharset(StandardCharsets.UTF_8)))
                 .setPort(server.getProbe(JmapGuiceProbe.class).getJmapPort())
                 .build();
-        accessToken = authenticateJamesUser(baseUri(server), USERNAME, PASSWORD);
+        accessToken = authenticateJamesUser(baseUri(server), Username.of(USERNAME), PASSWORD);
 
         timer = new Timer();
     }
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/FixingGhostMailboxTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/FixingGhostMailboxTest.java
index ffd8e4f..5c88a39 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/FixingGhostMailboxTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/FixingGhostMailboxTest.java
@@ -41,6 +41,7 @@ import static org.hamcrest.Matchers.nullValue;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 
+import org.apache.james.core.Username;
 import org.apache.james.jmap.api.access.AccessToken;
 import org.apache.james.mailbox.MessageManager.AppendCommand;
 import org.apache.james.mailbox.cassandra.mail.task.MailboxMergingTask;
@@ -137,7 +138,7 @@ public class FixingGhostMailboxTest {
             .addDomain(DOMAIN)
             .addUser(ALICE, ALICE_SECRET)
             .addUser(BOB, BOB_SECRET);
-        accessToken = authenticateJamesUser(baseUri(server), ALICE, ALICE_SECRET);
+        accessToken = authenticateJamesUser(baseUri(server), Username.of(ALICE), ALICE_SECRET);
 
         Host cassandraHost = dockerCassandra.getCassandra().getHost();
         session = Cluster.builder()
@@ -153,7 +154,7 @@ public class FixingGhostMailboxTest {
     private void simulateGhostMailboxBug() throws MailboxException, IOException {
         // State before ghost mailbox bug
         // Alice INBOX is delegated to Bob and contains one message
-        aliceInboxPath = MailboxPath.forUser(ALICE, MailboxConstants.INBOX);
+        aliceInboxPath = MailboxPath.forUser(Username.of(ALICE), MailboxConstants.INBOX);
         aliceGhostInboxId = mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, ALICE, MailboxConstants.INBOX);
         aclProbe.addRights(aliceInboxPath, BOB, MailboxACL.FULL_RIGHTS);
         message1 = mailboxProbe.appendMessage(ALICE, aliceInboxPath, AppendCommand.from(generateMessageContent()));
diff --git a/server/container/guice/cassandra-ldap-guice/src/test/java/org/apache/james/CassandraLdapJamesServerTest.java b/server/container/guice/cassandra-ldap-guice/src/test/java/org/apache/james/CassandraLdapJamesServerTest.java
index 5c91b17..971c47e 100644
--- a/server/container/guice/cassandra-ldap-guice/src/test/java/org/apache/james/CassandraLdapJamesServerTest.java
+++ b/server/container/guice/cassandra-ldap-guice/src/test/java/org/apache/james/CassandraLdapJamesServerTest.java
@@ -68,13 +68,13 @@ class CassandraLdapJamesServerTest implements JamesServerContract {
     void userFromLdapShouldLoginViaImapProtocol(GuiceJamesServer server) throws Exception {
         imapClient.connect(JAMES_SERVER_HOST, server.getProbe(ImapGuiceProbe.class).getImapPort());
 
-        assertThat(imapClient.login(JAMES_USER, PASSWORD)).isTrue();
+        assertThat(imapClient.login(JAMES_USER.asString(), PASSWORD)).isTrue();
     }
 
     @Test
     void mailsShouldBeWellReceivedBeforeFirstUserConnectionWithLdap(GuiceJamesServer server) throws Exception {
         messageSender.connect(JAMES_SERVER_HOST, server.getProbe(SmtpGuiceProbe.class).getSmtpPort())
-            .sendMessage("bob@any.com", JAMES_USER + "@localhost");
+            .sendMessage("bob@any.com", JAMES_USER.asString() + "@localhost");
 
         calmlyAwait.until(() -> server.getProbe(SpoolerProbe.class).processingFinished());
 
diff --git a/server/container/guice/cassandra-rabbitmq-ldap-guice/src/test/java/org/apache/james/CassandraRabbitMQLdapJmapJamesServerTest.java b/server/container/guice/cassandra-rabbitmq-ldap-guice/src/test/java/org/apache/james/CassandraRabbitMQLdapJmapJamesServerTest.java
index c4ed73c..bdff8d8 100644
--- a/server/container/guice/cassandra-rabbitmq-ldap-guice/src/test/java/org/apache/james/CassandraRabbitMQLdapJmapJamesServerTest.java
+++ b/server/container/guice/cassandra-rabbitmq-ldap-guice/src/test/java/org/apache/james/CassandraRabbitMQLdapJmapJamesServerTest.java
@@ -49,7 +49,7 @@ class CassandraRabbitMQLdapJmapJamesServerTest {
             IMAPClient imapClient = new IMAPClient();
             imapClient.connect(JAMES_SERVER_HOST, server.getProbe(ImapGuiceProbe.class).getImapPort());
 
-            assertThat(imapClient.login(JAMES_USER, PASSWORD)).isTrue();
+            assertThat(imapClient.login(JAMES_USER.asString(), PASSWORD)).isTrue();
         }
     }
 
diff --git a/server/container/guice/guice-common/src/main/java/org/apache/james/utils/DataProbeImpl.java b/server/container/guice/guice-common/src/main/java/org/apache/james/utils/DataProbeImpl.java
index 3f07581..7e7b4c1 100644
--- a/server/container/guice/guice-common/src/main/java/org/apache/james/utils/DataProbeImpl.java
+++ b/server/container/guice/guice-common/src/main/java/org/apache/james/utils/DataProbeImpl.java
@@ -26,16 +26,16 @@ import javax.inject.Inject;
 
 import org.apache.commons.lang3.NotImplementedException;
 import org.apache.james.core.Domain;
+import org.apache.james.core.Username;
 import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.probe.DataProbe;
 import org.apache.james.rrt.api.RecipientRewriteTable;
 import org.apache.james.rrt.lib.MappingSource;
 import org.apache.james.rrt.lib.Mappings;
 import org.apache.james.user.api.UsersRepository;
+import org.apache.james.util.streams.Iterators;
 
 import com.github.steveash.guavate.Guavate;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
 
 public class DataProbeImpl implements GuiceProbe, DataProbe {
     
@@ -55,12 +55,12 @@ public class DataProbeImpl implements GuiceProbe, DataProbe {
 
     @Override
     public void addUser(String userName, String password) throws Exception {
-        usersRepository.addUser(userName, password);
+        usersRepository.addUser(Username.of(userName), password);
     }
 
     @Override
     public void removeUser(String username) throws Exception {
-        usersRepository.removeUser(username);
+        usersRepository.removeUser(Username.of(username));
     }
 
     @Override
@@ -70,7 +70,9 @@ public class DataProbeImpl implements GuiceProbe, DataProbe {
 
     @Override
     public String[] listUsers() throws Exception {
-        return Iterables.toArray(ImmutableList.copyOf(usersRepository.list()), String.class);
+        return Iterators.toStream(usersRepository.list())
+            .map(Username::asString)
+            .toArray(String[]::new);
     }
 
     @Override
diff --git a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/ACLProbeImpl.java b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/ACLProbeImpl.java
index 3182b8e..02362dd 100644
--- a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/ACLProbeImpl.java
+++ b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/ACLProbeImpl.java
@@ -21,6 +21,7 @@ package org.apache.james.modules;
 
 import javax.inject.Inject;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
@@ -45,14 +46,14 @@ public class ACLProbeImpl implements GuiceProbe, ACLProbe {
     public void replaceRights(MailboxPath mailboxPath, String targetUser, Rfc4314Rights rights) throws MailboxException {
         MailboxSession mailboxSession = mailboxManager.createSystemSession(mailboxPath.getUser());
 
-        ACLCommand command = MailboxACL.command().forUser(targetUser).rights(rights).asReplacement();
+        ACLCommand command = MailboxACL.command().forUser(Username.of(targetUser)).rights(rights).asReplacement();
         mailboxManager.applyRightsCommand(mailboxPath, command, mailboxSession);
     }
 
     @Override
     public void addRights(MailboxPath mailboxPath, String targetUser, Rfc4314Rights rights) throws MailboxException {
         MailboxSession mailboxSession = mailboxManager.createSystemSession(mailboxPath.getUser());
-        ACLCommand command = MailboxACL.command().forUser(targetUser).rights(rights).asAddition();
+        ACLCommand command = MailboxACL.command().forUser(Username.of(targetUser)).rights(rights).asAddition();
 
         mailboxManager.applyRightsCommand(mailboxPath, command, mailboxSession);
     }
diff --git a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/MailboxProbeImpl.java b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/MailboxProbeImpl.java
index df0e819..3f49929 100644
--- a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/MailboxProbeImpl.java
+++ b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/MailboxProbeImpl.java
@@ -30,6 +30,7 @@ import javax.inject.Inject;
 import javax.mail.Flags;
 
 import org.apache.commons.lang3.NotImplementedException;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
@@ -61,7 +62,7 @@ public class MailboxProbeImpl implements GuiceProbe, MailboxProbe {
 
     @Override
     public MailboxId createMailbox(String namespace, String user, String name) {
-        return createMailbox(new MailboxPath(namespace, user, name));
+        return createMailbox(new MailboxPath(namespace, Username.of(user), name));
     }
 
     public MailboxId createMailbox(MailboxPath mailboxPath) {
@@ -80,11 +81,12 @@ public class MailboxProbeImpl implements GuiceProbe, MailboxProbe {
 
     @Override
     public MailboxId getMailboxId(String namespace, String user, String name) {
+        Username username = Username.of(user);
         MailboxSession mailboxSession = null;
         try {
-            mailboxSession = mailboxManager.createSystemSession(user);
+            mailboxSession = mailboxManager.createSystemSession(username);
             MailboxMapper mailboxMapper = mailboxMapperFactory.getMailboxMapper(mailboxSession);
-            return mailboxMapper.findMailboxByPath(new MailboxPath(namespace, user, name)).getMailboxId();
+            return mailboxMapper.findMailboxByPath(new MailboxPath(namespace, username, name)).getMailboxId();
         } catch (MailboxException e) {
             throw new RuntimeException(e);
         } finally {
@@ -107,7 +109,7 @@ public class MailboxProbeImpl implements GuiceProbe, MailboxProbe {
     public Collection<String> listUserMailboxes(String user) {
         MailboxSession mailboxSession = null;
         try {
-            mailboxSession = mailboxManager.createSystemSession(user);
+            mailboxSession = mailboxManager.createSystemSession(Username.of(user));
             mailboxManager.startProcessingRequest(mailboxSession);
             return searchUserMailboxes(mailboxSession)
                     .stream()
@@ -133,10 +135,11 @@ public class MailboxProbeImpl implements GuiceProbe, MailboxProbe {
     @Override
     public void deleteMailbox(String namespace, String user, String name) {
         MailboxSession mailboxSession = null;
+        Username username = Username.of(user);
         try {
-            mailboxSession = mailboxManager.createSystemSession(user);
+            mailboxSession = mailboxManager.createSystemSession(username);
             mailboxManager.startProcessingRequest(mailboxSession);
-            mailboxManager.deleteMailbox(new MailboxPath(namespace, user, name), mailboxSession);
+            mailboxManager.deleteMailbox(new MailboxPath(namespace, username, name), mailboxSession);
         } catch (MailboxException e) {
             throw new RuntimeException(e);
         } finally {
@@ -146,10 +149,11 @@ public class MailboxProbeImpl implements GuiceProbe, MailboxProbe {
 
     @Override
     public void importEmlFileToMailbox(String namespace, String user, String name, String emlPath) throws Exception {
-        MailboxSession mailboxSession = mailboxManager.createSystemSession(user);
+        Username username = Username.of(user);
+        MailboxSession mailboxSession = mailboxManager.createSystemSession(username);
         mailboxManager.startProcessingRequest(mailboxSession);
 
-        MessageManager messageManager = mailboxManager.getMailbox(new MailboxPath(namespace, user, name), mailboxSession);
+        MessageManager messageManager = mailboxManager.getMailbox(new MailboxPath(namespace, username, name), mailboxSession);
         InputStream emlFileAsStream = new FileInputStream(emlPath);
         messageManager.appendMessage(MessageManager.AppendCommand.builder()
             .recent()
@@ -163,7 +167,7 @@ public class MailboxProbeImpl implements GuiceProbe, MailboxProbe {
     public ComposedMessageId appendMessage(String username, MailboxPath mailboxPath, InputStream message, Date internalDate, boolean isRecent, Flags flags)
             throws MailboxException {
 
-        MailboxSession mailboxSession = mailboxManager.createSystemSession(username);
+        MailboxSession mailboxSession = mailboxManager.createSystemSession(Username.of(username));
         MessageManager messageManager = mailboxManager.getMailbox(mailboxPath, mailboxSession);
         return messageManager.appendMessage(message, internalDate, mailboxSession, isRecent, flags);
     }
@@ -171,7 +175,7 @@ public class MailboxProbeImpl implements GuiceProbe, MailboxProbe {
     public ComposedMessageId appendMessage(String username, MailboxPath mailboxPath, MessageManager.AppendCommand appendCommand)
             throws MailboxException {
 
-        MailboxSession mailboxSession = mailboxManager.createSystemSession(username);
+        MailboxSession mailboxSession = mailboxManager.createSystemSession(Username.of(username));
         MessageManager messageManager = mailboxManager.getMailbox(mailboxPath, mailboxSession);
         return messageManager.appendMessage(appendCommand, mailboxSession);
     }
@@ -198,7 +202,7 @@ public class MailboxProbeImpl implements GuiceProbe, MailboxProbe {
 
     @Override
     public Collection<String> listSubscriptions(String user) throws Exception {
-        MailboxSession mailboxSession = mailboxManager.createSystemSession(user);
+        MailboxSession mailboxSession = mailboxManager.createSystemSession(Username.of(user));
         return subscriptionManager.subscriptions(mailboxSession);
     }
 
diff --git a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/QuotaProbesImpl.java b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/QuotaProbesImpl.java
index 1a88992..5b66e67 100644
--- a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/QuotaProbesImpl.java
+++ b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/QuotaProbesImpl.java
@@ -21,6 +21,7 @@ package org.apache.james.modules;
 
 import javax.inject.Inject;
 
+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;
@@ -50,7 +51,7 @@ public class QuotaProbesImpl implements QuotaProbe, GuiceProbe {
 
     @Override
     public String getQuotaRoot(String namespace, String user, String name) throws MailboxException {
-        return quotaRootResolver.getQuotaRoot(new MailboxPath(namespace, user, name)).getValue();
+        return quotaRootResolver.getQuotaRoot(new MailboxPath(namespace, Username.of(user), name)).getValue();
     }
 
     @Override
diff --git a/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/JmapGuiceProbe.java b/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/JmapGuiceProbe.java
index c02de9d..434b41b 100644
--- a/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/JmapGuiceProbe.java
+++ b/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/JmapGuiceProbe.java
@@ -23,6 +23,7 @@ import java.util.Arrays;
 
 import javax.inject.Inject;
 
+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.VacationPatch;
@@ -70,7 +71,7 @@ public class JmapGuiceProbe implements GuiceProbe {
         return vacationRepository.retrieveVacation(accountId).block();
     }
 
-    public void setInMailboxes(MessageId messageId, String username, MailboxId... mailboxIds) throws MailboxException {
+    public void setInMailboxes(MessageId messageId, Username username, MailboxId... mailboxIds) throws MailboxException {
         MailboxSession mailboxSession = mailboxManager.createSystemSession(username);
         messageIdManager.setInMailboxes(messageId, Arrays.asList(mailboxIds), mailboxSession);
     }
diff --git a/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/MessageIdProbe.java b/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/MessageIdProbe.java
index 69268d0..6240733 100644
--- a/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/MessageIdProbe.java
+++ b/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/MessageIdProbe.java
@@ -24,6 +24,7 @@ import java.util.List;
 import javax.inject.Inject;
 import javax.mail.Flags;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageIdManager;
@@ -51,19 +52,19 @@ public class MessageIdProbe implements GuiceProbe {
         this.messageIdManager = messageIdManager;
     }
 
-    public List<MessageResult> getMessages(MessageId messageId, String user) throws MailboxException {
+    public List<MessageResult> getMessages(MessageId messageId, Username user) throws MailboxException {
         MailboxSession mailboxSession = mailboxManager.createSystemSession(user);
 
         return messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.FULL_CONTENT, mailboxSession);
     }
 
-    public void updateNewFlags(String user, Flags newFlags, MessageId messageId, List<MailboxId> mailboxIds) throws MailboxException {
+    public void updateNewFlags(Username user, Flags newFlags, MessageId messageId, List<MailboxId> mailboxIds) throws MailboxException {
         MailboxSession mailboxSession = mailboxManager.createSystemSession(user);
 
         messageIdManager.setFlags(newFlags, FlagsUpdateMode.REPLACE, messageId, mailboxIds, mailboxSession);
     }
 
-    public List<AttachmentId> retrieveAttachmentIds(MessageId messageId, String username) throws MailboxException {
+    public List<AttachmentId> retrieveAttachmentIds(MessageId messageId, Username username) throws MailboxException {
         MailboxSession mailboxSession = mailboxManager.createSystemSession(username);
         List<MessageResult> messages = messageIdManager.getMessages(
             ImmutableList.of(messageId),
diff --git a/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthenticator.java b/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthenticator.java
index 64d975a..f8b35bd 100644
--- a/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthenticator.java
+++ b/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthenticator.java
@@ -21,6 +21,7 @@ package org.apache.james.adapter.mailbox.store;
 
 import javax.inject.Inject;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.store.Authenticator;
 import org.apache.james.user.api.UsersRepository;
@@ -40,7 +41,7 @@ public class UserRepositoryAuthenticator implements Authenticator {
     }
 
     @Override
-    public boolean isAuthentic(String userid, CharSequence passwd) throws MailboxException {
+    public boolean isAuthentic(Username userid, CharSequence passwd) throws MailboxException {
         try {
             return repos.test(userid, passwd.toString());
         } catch (UsersRepositoryException e) {
diff --git a/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthorizator.java b/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthorizator.java
index cda4fa9..85110ae 100644
--- a/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthorizator.java
+++ b/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthorizator.java
@@ -21,6 +21,7 @@ package org.apache.james.adapter.mailbox.store;
 
 import javax.inject.Inject;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.store.Authorizator;
 import org.apache.james.user.api.UsersRepository;
@@ -39,7 +40,7 @@ public class UserRepositoryAuthorizator implements Authorizator {
     }
 
     @Override
-    public AuthorizationState canLoginAsOtherUser(String userId, String otherUserId) throws MailboxException {
+    public AuthorizationState canLoginAsOtherUser(Username userId, Username otherUserId) throws MailboxException {
         try {
             if (!repos.isAdministrator(userId)) {
                 return AuthorizationState.NOT_ADMIN;
diff --git a/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthenticatorTest.java b/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthenticatorTest.java
index 48c8333..7ec82b1 100644
--- a/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthenticatorTest.java
+++ b/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthenticatorTest.java
@@ -23,6 +23,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.user.api.UsersRepository;
 import org.apache.james.user.api.UsersRepositoryException;
@@ -34,9 +35,9 @@ import org.junit.rules.ExpectedException;
 public class UserRepositoryAuthenticatorTest {
 
     public static final String PASSWORD = "password";
-    public static final String USER = "user";
+    public static final Username USER = Username.of("user");
     public static final String BAD_PASSWORD = "badPassword";
-    public static final String BAD_USER = "badUser";
+    public static final Username BAD_USER = Username.of("badUser");
     private UsersRepository usersRepository;
     private UserRepositoryAuthenticator testee;
 
diff --git a/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthorizatorTest.java b/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthorizatorTest.java
index 84e499e..cfb2750 100644
--- a/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthorizatorTest.java
+++ b/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthorizatorTest.java
@@ -23,6 +23,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.store.Authorizator;
 import org.apache.james.user.api.UsersRepository;
@@ -33,8 +34,8 @@ import org.junit.Test;
 import org.junit.rules.ExpectedException;
 
 public class UserRepositoryAuthorizatorTest {
-    private static final String ADMIN = "admin";
-    private static final String USER = "user";
+    private static final Username ADMIN = Username.of("admin");
+    private static final Username USER = Username.of("user");
 
     private UsersRepository usersRepository;
     private UserRepositoryAuthorizator testee;
diff --git a/server/container/mailbox-jmx/src/main/java/org/apache/james/adapter/mailbox/MailboxManagerManagement.java b/server/container/mailbox-jmx/src/main/java/org/apache/james/adapter/mailbox/MailboxManagerManagement.java
index 79d68db..dddfa29 100644
--- a/server/container/mailbox-jmx/src/main/java/org/apache/james/adapter/mailbox/MailboxManagerManagement.java
+++ b/server/container/mailbox-jmx/src/main/java/org/apache/james/adapter/mailbox/MailboxManagerManagement.java
@@ -30,6 +30,7 @@ import javax.inject.Named;
 import javax.management.NotCompliantMBeanException;
 import javax.management.StandardMBean;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
@@ -72,7 +73,7 @@ public class MailboxManagerManagement extends StandardMBean implements MailboxMa
                      .addContext(MDCBuilder.ACTION, "deleteMailboxes")
                      .addContext("concernedUser", username)
                      .build()) {
-            session = mailboxManager.createSystemSession(username);
+            session = mailboxManager.createSystemSession(Username.of(username));
             mailboxManager.startProcessingRequest(session);
             List<MailboxMetaData> mList = retrieveAllUserMailboxes(session);
             for (MailboxMetaData aMList : mList) {
@@ -100,7 +101,7 @@ public class MailboxManagerManagement extends StandardMBean implements MailboxMa
                      .addContext(MDCBuilder.ACTION, "listMailboxes")
                      .addContext("concernedUser", username)
                      .build()) {
-            session = mailboxManager.createSystemSession(username);
+            session = mailboxManager.createSystemSession(Username.of(username));
             mailboxManager.startProcessingRequest(session);
             List<MailboxMetaData> mList = retrieveAllUserMailboxes(session);
             boxes = mList.stream()
@@ -120,15 +121,16 @@ public class MailboxManagerManagement extends StandardMBean implements MailboxMa
     @Override
     public MailboxId createMailbox(String namespace, String user, String name) {
         checkMailboxArguments(namespace, user, name);
+        Username username = Username.of(user);
         MailboxSession session = null;
-        MailboxPath mailboxPath = new MailboxPath(namespace, user, name);
+        MailboxPath mailboxPath = new MailboxPath(namespace, username, name);
         try (Closeable closeable =
                  MDCBuilder.create()
                      .addContext(MDCBuilder.PROTOCOL, "CLI")
                      .addContext(MDCBuilder.ACTION, "createMailbox")
                      .addContext("mailboxPath", mailboxPath.asString())
                      .build()) {
-            session = mailboxManager.createSystemSession(user);
+            session = mailboxManager.createSystemSession(username);
             mailboxManager.startProcessingRequest(session);
             return mailboxManager.createMailbox(mailboxPath, session)
                 .orElseThrow(() -> new MailboxException("mailbox name is probably empty"));
@@ -143,15 +145,16 @@ public class MailboxManagerManagement extends StandardMBean implements MailboxMa
     @Override
     public void deleteMailbox(String namespace, String user, String name) {
         checkMailboxArguments(namespace, user, name);
+        Username username = Username.of(user);
         MailboxSession session = null;
-        MailboxPath mailboxPath = new MailboxPath(namespace, user, name);
+        MailboxPath mailboxPath = new MailboxPath(namespace, username, name);
         try (Closeable closeable =
                  MDCBuilder.create()
                      .addContext(MDCBuilder.PROTOCOL, "CLI")
                      .addContext(MDCBuilder.ACTION, "deleteMailbox")
                      .addContext("mailboxPath", mailboxPath.asString())
                      .build()) {
-            session = mailboxManager.createSystemSession(user);
+            session = mailboxManager.createSystemSession(username);
             mailboxManager.startProcessingRequest(session);
             mailboxManager.deleteMailbox(mailboxPath, session);
         } catch (Exception e) {
@@ -165,9 +168,10 @@ public class MailboxManagerManagement extends StandardMBean implements MailboxMa
     public void importEmlFileToMailbox(String namespace, String user, String name, String emlPath) {
         checkMailboxArguments(namespace, user, name);
         checkString(emlPath, "email file path name");
+        Username username = Username.of(user);
 
         MailboxSession session = null;
-        MailboxPath mailboxPath = new MailboxPath(namespace, user, name);
+        MailboxPath mailboxPath = new MailboxPath(namespace, username, name);
         try (Closeable closeable =
                  MDCBuilder.create()
                      .addContext(MDCBuilder.PROTOCOL, "CLI")
@@ -175,7 +179,7 @@ public class MailboxManagerManagement extends StandardMBean implements MailboxMa
                      .addContext("mailboxPath", mailboxPath.asString())
                      .addContext("emlPath", emlPath)
                      .build()) {
-            session = mailboxManager.createSystemSession(user);
+            session = mailboxManager.createSystemSession(username);
             mailboxManager.startProcessingRequest(session);
             MessageManager messageManager = mailboxManager.getMailbox(mailboxPath, session);
             InputStream emlFileAsStream = new FileInputStream(emlPath);
diff --git a/server/container/mailbox-jmx/src/main/java/org/apache/james/adapter/mailbox/QuotaManagement.java b/server/container/mailbox-jmx/src/main/java/org/apache/james/adapter/mailbox/QuotaManagement.java
index a2bed78..c0ff902 100644
--- a/server/container/mailbox-jmx/src/main/java/org/apache/james/adapter/mailbox/QuotaManagement.java
+++ b/server/container/mailbox-jmx/src/main/java/org/apache/james/adapter/mailbox/QuotaManagement.java
@@ -24,6 +24,7 @@ import java.io.IOException;
 
 import javax.inject.Inject;
 
+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;
@@ -57,7 +58,7 @@ public class QuotaManagement implements QuotaManagementMBean {
                      .addContext(MDCBuilder.PROTOCOL, "CLI")
                      .addContext(MDCBuilder.ACTION, "getQuotaRoot")
                      .build()) {
-            return quotaRootResolver.getQuotaRoot(new MailboxPath(namespace, user, name)).getValue();
+            return quotaRootResolver.getQuotaRoot(new MailboxPath(namespace, Username.of(user), name)).getValue();
         } catch (IOException e) {
             throw new RuntimeException(e);
         }
diff --git a/server/container/mailbox-jmx/src/main/java/org/apache/james/adapter/mailbox/ReIndexerManagement.java b/server/container/mailbox-jmx/src/main/java/org/apache/james/adapter/mailbox/ReIndexerManagement.java
index 6696d54..2b621b5 100644
--- a/server/container/mailbox-jmx/src/main/java/org/apache/james/adapter/mailbox/ReIndexerManagement.java
+++ b/server/container/mailbox-jmx/src/main/java/org/apache/james/adapter/mailbox/ReIndexerManagement.java
@@ -26,6 +26,7 @@ import java.time.Duration;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.indexer.ReIndexer;
 import org.apache.james.mailbox.model.MailboxPath;
@@ -51,7 +52,7 @@ public class ReIndexerManagement implements ReIndexerManagementMBean {
                      .addContext(MDCBuilder.PROTOCOL, "CLI")
                      .addContext(MDCBuilder.ACTION, "reIndex")
                      .build()) {
-            TaskId taskId = taskManager.submit(reIndexer.reIndex(new MailboxPath(namespace, user, name)));
+            TaskId taskId = taskManager.submit(reIndexer.reIndex(new MailboxPath(namespace, Username.of(user), name)));
             taskManager.await(taskId, Duration.ofMillis(Long.MAX_VALUE));
         } catch (IOException | TaskManager.ReachedTimeoutException e) {
             throw new RuntimeException(e);
diff --git a/server/container/mailbox-jmx/src/test/java/org/apache/james/adapter/mailbox/MailboxManagementTest.java b/server/container/mailbox-jmx/src/test/java/org/apache/james/adapter/mailbox/MailboxManagementTest.java
index 84eaaae..c3f1348 100644
--- a/server/container/mailbox-jmx/src/test/java/org/apache/james/adapter/mailbox/MailboxManagementTest.java
+++ b/server/container/mailbox-jmx/src/test/java/org/apache/james/adapter/mailbox/MailboxManagementTest.java
@@ -28,6 +28,7 @@ import java.nio.charset.StandardCharsets;
 import java.util.Iterator;
 
 import org.apache.commons.io.IOUtils;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.exception.MailboxExistsException;
 import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
@@ -44,7 +45,7 @@ import org.junit.jupiter.api.Test;
 
 public class MailboxManagementTest {
 
-    public static final String USER = "user";
+    public static final Username USER = Username.of("user");
     public static final int UID_VALIDITY = 10;
     public static final int LIMIT = 1;
 
@@ -59,27 +60,27 @@ public class MailboxManagementTest {
 
         mailboxManagerManagement = new MailboxManagerManagement();
         mailboxManagerManagement.setMailboxManager(mailboxManager);
-        session = mailboxManager.createSystemSession("TEST");
+        session = mailboxManager.createSystemSession(Username.of("TEST"));
     }
 
     @Test
     void deleteMailboxesShouldDeleteMailboxes() throws Exception {
         mapperFactory.createMailboxMapper(session).save(new Mailbox(MailboxPath.forUser(USER, "name"), UID_VALIDITY));
-        mailboxManagerManagement.deleteMailboxes(USER);
+        mailboxManagerManagement.deleteMailboxes(USER.asString());
         assertThat(mapperFactory.createMailboxMapper(session).list()).isEmpty();
     }
 
     @Test
     void deleteMailboxesShouldDeleteInbox() throws Exception {
         mapperFactory.createMailboxMapper(session).save(new Mailbox(MailboxPath.forUser(USER, "INBOX"), UID_VALIDITY));
-        mailboxManagerManagement.deleteMailboxes(USER);
+        mailboxManagerManagement.deleteMailboxes(USER.asString());
         assertThat(mapperFactory.createMailboxMapper(session).list()).isEmpty();
     }
 
     @Test
     void deleteMailboxesShouldDeleteMailboxesChildren() throws Exception {
         mapperFactory.createMailboxMapper(session).save(new Mailbox(MailboxPath.forUser(USER, "INBOX.test"), UID_VALIDITY));
-        mailboxManagerManagement.deleteMailboxes(USER);
+        mailboxManagerManagement.deleteMailboxes(USER.asString());
         assertThat(mapperFactory.createMailboxMapper(session).list()).isEmpty();
     }
 
@@ -87,22 +88,22 @@ public class MailboxManagementTest {
     void deleteMailboxesShouldNotDeleteMailboxesBelongingToNotPrivateNamespace() throws Exception {
         Mailbox mailbox = new Mailbox(new MailboxPath("#top", USER, "name"), UID_VALIDITY);
         mapperFactory.createMailboxMapper(session).save(mailbox);
-        mailboxManagerManagement.deleteMailboxes(USER);
+        mailboxManagerManagement.deleteMailboxes(USER.asString());
         assertThat(mapperFactory.createMailboxMapper(session).list()).containsExactly(mailbox);
     }
 
     @Test
     void deleteMailboxesShouldNotDeleteMailboxesBelongingToOtherUsers() throws Exception {
-        Mailbox mailbox = new Mailbox(MailboxPath.forUser("userbis", "name"), UID_VALIDITY);
+        Mailbox mailbox = new Mailbox(MailboxPath.forUser(Username.of("userbis"), "name"), UID_VALIDITY);
         mapperFactory.createMailboxMapper(session).save(mailbox);
-        mailboxManagerManagement.deleteMailboxes(USER);
+        mailboxManagerManagement.deleteMailboxes(USER.asString());
         assertThat(mapperFactory.createMailboxMapper(session).list()).containsExactly(mailbox);
     }
 
     @Test
     void deleteMailboxesShouldDeleteMailboxesWithEmptyNames() throws Exception {
         mapperFactory.createMailboxMapper(session).save(new Mailbox(MailboxPath.forUser(USER, ""), UID_VALIDITY));
-        mailboxManagerManagement.deleteMailboxes(USER);
+        mailboxManagerManagement.deleteMailboxes(USER.asString());
         assertThat(mapperFactory.createMailboxMapper(session).list()).isEmpty();
     }
 
@@ -123,13 +124,13 @@ public class MailboxManagementTest {
         mapperFactory.createMailboxMapper(session).save(new Mailbox(MailboxPath.forUser(USER, "name"), UID_VALIDITY));
         mapperFactory.createMailboxMapper(session).save(new Mailbox(MailboxPath.forUser(USER, "INBOX"), UID_VALIDITY));
         mapperFactory.createMailboxMapper(session).save(new Mailbox(MailboxPath.forUser(USER, "INBOX.test"), UID_VALIDITY));
-        mailboxManagerManagement.deleteMailboxes(USER);
+        mailboxManagerManagement.deleteMailboxes(USER.asString());
         assertThat(mapperFactory.createMailboxMapper(session).list()).isEmpty();
     }
 
     @Test
     void createMailboxShouldCreateAMailbox() throws Exception {
-        mailboxManagerManagement.createMailbox(MailboxConstants.USER_NAMESPACE, USER, "name");
+        mailboxManagerManagement.createMailbox(MailboxConstants.USER_NAMESPACE, USER.asString(), "name");
         assertThat(mapperFactory.createMailboxMapper(session).list()).hasSize(1);
         assertThat(mapperFactory.createMailboxMapper(session).findMailboxByPath(MailboxPath.forUser(USER, "name"))).isNotNull();
     }
@@ -140,7 +141,7 @@ public class MailboxManagementTest {
         Mailbox mailbox = new Mailbox(path, UID_VALIDITY);
         mapperFactory.createMailboxMapper(session).save(mailbox);
 
-        assertThatThrownBy(() -> mailboxManagerManagement.createMailbox(MailboxConstants.USER_NAMESPACE, USER, "name"))
+        assertThatThrownBy(() -> mailboxManagerManagement.createMailbox(MailboxConstants.USER_NAMESPACE, USER.asString(), "name"))
             .isInstanceOf(RuntimeException.class)
             .hasCauseInstanceOf(MailboxExistsException.class);
     }
@@ -194,7 +195,7 @@ public class MailboxManagementTest {
     void listMailboxesShouldReturnUserMailboxes() throws Exception {
         Mailbox mailbox1 = new Mailbox(new MailboxPath("#top", USER, "name1"), UID_VALIDITY);
         Mailbox mailbox2 = new Mailbox(MailboxPath.forUser(USER, "name2"), UID_VALIDITY);
-        Mailbox mailbox3 = new Mailbox(MailboxPath.forUser("other_user", "name3"), UID_VALIDITY);
+        Mailbox mailbox3 = new Mailbox(MailboxPath.forUser(Username.of("other_user"), "name3"), UID_VALIDITY);
         Mailbox mailbox4 = new Mailbox(MailboxPath.forUser(USER, "name4"), UID_VALIDITY);
         Mailbox mailbox5 = new Mailbox(MailboxPath.forUser(USER, "INBOX"), UID_VALIDITY);
         Mailbox mailbox6 = new Mailbox(MailboxPath.forUser(USER, "INBOX.toto"), UID_VALIDITY);
@@ -204,7 +205,7 @@ public class MailboxManagementTest {
         mapperFactory.createMailboxMapper(session).save(mailbox4);
         mapperFactory.createMailboxMapper(session).save(mailbox5);
         mapperFactory.createMailboxMapper(session).save(mailbox6);
-        assertThat(mailboxManagerManagement.listMailboxes(USER)).containsOnly("name2", "name4", "INBOX", "INBOX.toto");
+        assertThat(mailboxManagerManagement.listMailboxes(USER.asString())).containsOnly("name2", "name4", "INBOX", "INBOX.toto");
     }
 
     @Test
@@ -222,7 +223,7 @@ public class MailboxManagementTest {
     @Test
     void deleteMailboxShouldDeleteGivenMailbox() throws Exception {
         mapperFactory.createMailboxMapper(session).save(new Mailbox(MailboxPath.forUser(USER, "name"), UID_VALIDITY));
-        mailboxManagerManagement.deleteMailbox(MailboxConstants.USER_NAMESPACE, USER, "name");
+        mailboxManagerManagement.deleteMailbox(MailboxConstants.USER_NAMESPACE, USER.asString(), "name");
         assertThat(mapperFactory.createMailboxMapper(session).list()).isEmpty();
     }
 
@@ -230,15 +231,15 @@ public class MailboxManagementTest {
     void deleteMailboxShouldNotDeleteGivenMailboxIfWrongNamespace() throws Exception {
         Mailbox mailbox = new Mailbox(new MailboxPath("#top", USER, "name"), UID_VALIDITY);
         mapperFactory.createMailboxMapper(session).save(mailbox);
-        mailboxManagerManagement.deleteMailbox(MailboxConstants.USER_NAMESPACE, USER, "name");
+        mailboxManagerManagement.deleteMailbox(MailboxConstants.USER_NAMESPACE, USER.asString(), "name");
         assertThat(mapperFactory.createMailboxMapper(session).list()).containsOnly(mailbox);
     }
 
     @Test
     void deleteMailboxShouldNotDeleteGivenMailboxIfWrongUser() throws Exception {
-        Mailbox mailbox = new Mailbox(MailboxPath.forUser("userbis", "name"), UID_VALIDITY);
+        Mailbox mailbox = new Mailbox(MailboxPath.forUser(Username.of("userbis"), "name"), UID_VALIDITY);
         mapperFactory.createMailboxMapper(session).save(mailbox);
-        mailboxManagerManagement.deleteMailbox(MailboxConstants.USER_NAMESPACE, USER, "name");
+        mailboxManagerManagement.deleteMailbox(MailboxConstants.USER_NAMESPACE, USER.asString(), "name");
         assertThat(mapperFactory.createMailboxMapper(session).list()).containsOnly(mailbox);
     }
 
@@ -246,7 +247,7 @@ public class MailboxManagementTest {
     void deleteMailboxShouldNotDeleteGivenMailboxIfWrongName() throws Exception {
         Mailbox mailbox = new Mailbox(MailboxPath.forUser(USER, "wrong_name"), UID_VALIDITY);
         mapperFactory.createMailboxMapper(session).save(mailbox);
-        mailboxManagerManagement.deleteMailbox(MailboxConstants.USER_NAMESPACE, USER, "name");
+        mailboxManagerManagement.deleteMailbox(MailboxConstants.USER_NAMESPACE, USER.asString(), "name");
         assertThat(mapperFactory.createMailboxMapper(session).list()).containsOnly(mailbox);
     }
 
@@ -256,7 +257,7 @@ public class MailboxManagementTest {
                 UID_VALIDITY);
         mapperFactory.createMailboxMapper(session).save(mailbox);
         String emlpath = ClassLoader.getSystemResource("eml/frnog.eml").getFile();
-        mailboxManagerManagement.importEmlFileToMailbox(MailboxConstants.USER_NAMESPACE, USER, "name", emlpath);
+        mailboxManagerManagement.importEmlFileToMailbox(MailboxConstants.USER_NAMESPACE, USER.asString(), "name", emlpath);
 
         assertThat(mapperFactory.getMessageMapper(session).countMessagesInMailbox(mailbox)).isEqualTo(1);
         Iterator<MailboxMessage> iterator = mapperFactory.getMessageMapper(session).findInMailbox(mailbox,
@@ -273,7 +274,7 @@ public class MailboxManagementTest {
                 UID_VALIDITY);
         mapperFactory.createMailboxMapper(session).save(mailbox);
         String emlpath = ClassLoader.getSystemResource("eml/frnog.eml").getFile();
-        mailboxManagerManagement.importEmlFileToMailbox(MailboxConstants.USER_NAMESPACE, USER, "name", "wrong_path" + emlpath);
+        mailboxManagerManagement.importEmlFileToMailbox(MailboxConstants.USER_NAMESPACE, USER.asString(), "name", "wrong_path" + emlpath);
 
         assertThat(mapperFactory.getMessageMapper(session).countMessagesInMailbox(mailbox)).isEqualTo(0);
         Iterator<MailboxMessage> iterator = mapperFactory.getMessageMapper(session).findInMailbox(mailbox,
diff --git a/server/container/mailbox-jmx/src/test/java/org/apache/james/adapter/mailbox/ReIndexerManagementTest.java b/server/container/mailbox-jmx/src/test/java/org/apache/james/adapter/mailbox/ReIndexerManagementTest.java
index 6d567e6..946d6a3 100644
--- a/server/container/mailbox-jmx/src/test/java/org/apache/james/adapter/mailbox/ReIndexerManagementTest.java
+++ b/server/container/mailbox-jmx/src/test/java/org/apache/james/adapter/mailbox/ReIndexerManagementTest.java
@@ -25,6 +25,7 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.indexer.ReIndexer;
 import org.apache.james.mailbox.model.MailboxPath;
@@ -57,7 +58,7 @@ public class ReIndexerManagementTest {
 
         assertThat(taskManager.list()).isEmpty();
         testee.reIndex(namespace, user, name);
-        verify(reIndexer).reIndex(new MailboxPath(namespace, user, name));
+        verify(reIndexer).reIndex(new MailboxPath(namespace, Username.of(user), name));
         assertThat(taskManager.list()).hasSize(1);
     }
 
diff --git a/server/container/spring/src/main/java/org/apache/james/container/spring/tool/James23Importer.java b/server/container/spring/src/main/java/org/apache/james/container/spring/tool/James23Importer.java
deleted file mode 100644
index c3bccbe..0000000
--- a/server/container/spring/src/main/java/org/apache/james/container/spring/tool/James23Importer.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-package org.apache.james.container.spring.tool;
-
-import java.io.IOException;
-import java.util.Iterator;
-
-import javax.inject.Inject;
-import javax.inject.Named;
-import javax.mail.MessagingException;
-
-import org.apache.james.domainlist.api.DomainList;
-import org.apache.james.domainlist.api.DomainListException;
-import org.apache.james.mailbox.MailboxManager;
-import org.apache.james.mailbox.MailboxSession;
-import org.apache.james.mailbox.MessageManager;
-import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.exception.MailboxExistsException;
-import org.apache.james.mailbox.model.MailboxPath;
-import org.apache.james.mailrepository.api.MailKey;
-import org.apache.james.mailrepository.api.MailRepository;
-import org.apache.james.mailrepository.api.MailRepositoryStore;
-import org.apache.james.mailrepository.api.MailRepositoryStore.MailRepositoryStoreException;
-import org.apache.james.mailrepository.api.MailRepositoryUrl;
-import org.apache.james.server.core.MimeMessageInputStream;
-import org.apache.james.user.api.UsersRepository;
-import org.apache.james.user.api.UsersRepositoryException;
-import org.apache.mailet.Mail;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Tool to import James 2.3 users and mails into James 3.0.
- */
-public class James23Importer {
-    private static final Logger LOGGER = LoggerFactory.getLogger(James23Importer.class);
-
-    /**
-     * James 3.0 users repository.
-     */
-    @Inject
-    private UsersRepository james30UsersRepository;
-
-    /**
-     * James 3.0 users repository.
-     */
-    @Inject
-    private MailRepositoryStore mailRepositoryStore;
-
-    /**
-     * James 3.0 domain list.
-     */
-    @Inject
-    private DomainList domainList;
-
-    /**
-     * The mailbox manager needed to copy the mails to.
-     */
-    @Inject
-    @Named("mailboxmanager")
-    private MailboxManager mailboxManager;
-
-    /**
-     * James 2.3 user repository defined by configuration.
-     */
-    @Inject
-    @Named("usersrepository23")
-    private UsersRepository james23UsersRepository;
-
-    /**
-     * Import 2.3 users to 3.0 users (taking virtualDomains into account)<br>
-     * Import 2.3 mails to 3.0 mails.
-     * 
-     * @throws MailRepositoryStoreException
-     * @throws MessagingException
-     * @throws UsersRepositoryException
-     * @throws DomainListException
-     * @throws IOException
-     * @throws MailboxException
-     */
-    public void importUsersAndMailsFromJames23(String james23MailRepositoryPath, String defaultPassword) throws MailRepositoryStoreException, MessagingException, UsersRepositoryException, DomainListException, MailboxException, IOException {
-        importUsersFromJames23(defaultPassword);
-        importMailsFromJames23(james23MailRepositoryPath);
-    }
-
-    /**
-     * Import 2.3 users to 3.0 users (taking virtualDomains into account)
-     * 
-     * @param defaultPassword
-     * @throws MessagingException
-     * @throws UsersRepositoryException
-     * @throws DomainListException
-     */
-    public void importUsersFromJames23(String defaultPassword) throws MessagingException, UsersRepositoryException, DomainListException {
-        Iterator<String> j23uIt = james23UsersRepository.list();
-        while (j23uIt.hasNext()) {
-            String userName23 = j23uIt.next();
-            String userName30 = convert23UserTo30(userName23);
-            james30UsersRepository.addUser(userName30, defaultPassword);
-            LOGGER.info("New user is copied from 2.3 to 3.0 with username={}", userName30);
-        }
-    }
-
-    /**
-     * Import 2.3 mails to 3.0 mails.
-     * 
-     * @param james23MailRepositoryPath
-     *            the 2.3 mail repository path to import from e.g.
-     *            file://var/mail/inboxes
-     * @throws MessagingException
-     * @throws MailRepositoryStoreException
-     * @throws UsersRepositoryException
-     * @throws IOException
-     * @throws MailboxException
-     * @throws DomainListException
-     */
-    public void importMailsFromJames23(String james23MailRepositoryPath) throws MessagingException, MailRepositoryStoreException, UsersRepositoryException, MailboxException, DomainListException {
-
-        Iterator<String> james23userRepositoryIterator = james23UsersRepository.list();
-
-        while (james23userRepositoryIterator.hasNext()) {
-
-            String userName23 = james23userRepositoryIterator.next();
-            MailRepository mailRepository = mailRepositoryStore.select(MailRepositoryUrl.from(james23MailRepositoryPath + "/" + userName23));
-            Iterator<MailKey> mailRepositoryIterator = mailRepository.list();
-
-            String userName30 = convert23UserTo30(userName23);
-
-
-            MailboxSession mailboxSession = mailboxManager.createSystemSession(userName30);
-            MailboxPath mailboxPath = MailboxPath.inbox(mailboxSession);
-
-            mailboxManager.startProcessingRequest(mailboxSession);
-            try {
-                mailboxManager.createMailbox(mailboxPath, mailboxSession);
-            } catch (MailboxExistsException e) {
-                // Do nothing, the mailbox already exists.
-            }
-            mailboxManager.endProcessingRequest(mailboxSession);
-
-            MessageManager messageManager = mailboxManager.getMailbox(mailboxPath, mailboxSession);
-
-            while (mailRepositoryIterator.hasNext()) {
-                Mail mail = mailRepository.retrieve(mailRepositoryIterator.next());
-                mailboxManager.startProcessingRequest(mailboxSession);
-                messageManager.appendMessage(MessageManager.AppendCommand.builder()
-                    .build(new MimeMessageInputStream(mail.getMessage())), mailboxSession);
-                mailboxManager.endProcessingRequest(mailboxSession);
-            }
-
-        }
-
-    }
-
-    /**
-     * Utility method to convert a James 2.3 username to a James 3.0 username.
-     * To achieve this, we need to add the default James 3.0 domain because 2.3
-     * users have no domains.
-     * 
-     * @param userName23
-     * @return
-     * @throws DomainListException
-     */
-    private String convert23UserTo30(String userName23) throws DomainListException {
-        return userName23 + "@" + domainList.getDefaultDomain();
-    }
-
-}
diff --git a/server/container/spring/src/main/java/org/apache/james/container/spring/tool/James23ImporterManagement.java b/server/container/spring/src/main/java/org/apache/james/container/spring/tool/James23ImporterManagement.java
deleted file mode 100644
index 2f0f203..0000000
--- a/server/container/spring/src/main/java/org/apache/james/container/spring/tool/James23ImporterManagement.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-package org.apache.james.container.spring.tool;
-
-import javax.inject.Inject;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * {@link James23Importer} support via JMX.
- */
-public class James23ImporterManagement implements James23ImporterManagementMBean {
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(James23ImporterManagement.class);
-
-    @Inject
-    private James23Importer james23Importer;
-
-    @Override
-    public void importUsersAndMailsFromJames23(String james23MailRepositoryPath, String defaultPassword) throws Exception {
-        try {
-            james23Importer.importUsersAndMailsFromJames23(james23MailRepositoryPath, defaultPassword);
-        } catch (Exception e) {
-            throw new Exception("Error while importing users and mails", e);
-        }
-    }
-
-    @Override
-    public void importUsersFromJames23(String defaultPassword) throws Exception {
-        try {
-            james23Importer.importUsersFromJames23(defaultPassword);
-        } catch (Exception e) {
-            throw new Exception("Error while importing users", e);
-        }
-    }
-
-    @Override
-    public void importMailsFromJames23(String james23MailRepositoryPath) throws Exception {
-        try {
-            james23Importer.importMailsFromJames23(james23MailRepositoryPath);
-        } catch (Exception e) {
-            LOGGER.error("Error while importing mail", e);
-            throw new Exception(e.getMessage());
-        }
-    }
-
-}
diff --git a/server/container/spring/src/main/java/org/apache/james/container/spring/tool/James23ImporterManagementMBean.java b/server/container/spring/src/main/java/org/apache/james/container/spring/tool/James23ImporterManagementMBean.java
deleted file mode 100644
index 212569d..0000000
--- a/server/container/spring/src/main/java/org/apache/james/container/spring/tool/James23ImporterManagementMBean.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-package org.apache.james.container.spring.tool;
-
-import org.apache.james.mailbox.MailboxManager;
-
-/**
- * Allow to copy {@link MailboxManager} contents from one to the other via JMX
- */
-public interface James23ImporterManagementMBean {
-    
-    /**
-     * First import users (each user is created with the given default  password), the
-     * import the mails for each users from the given mail repository path.
-     * 
-     * @param james23MailRepositoryPath
-     * @param defaultPassword
-     */
-    void importUsersAndMailsFromJames23(String james23MailRepositoryPath, String defaultPassword) throws Exception;
-
-    /**
-     * Import users (each user is created with the given default  password).
-     * 
-     * @param defaultPassword
-     * @throws Exception
-     */
-    void importUsersFromJames23(String defaultPassword) throws Exception;
-    
-    /**
-     * Import the mails for each users from the given mail repository path.
-     * 
-     * @param james23MailRepositoryPath
-     * @throws Exception
-     */
-    void importMailsFromJames23(String james23MailRepositoryPath) throws Exception;
-    
-}
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 8956cf8..263d9af 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
@@ -43,7 +43,7 @@ public interface UsersRepository {
      *             if error
      * 
      */
-    void addUser(String username, String password) throws UsersRepositoryException;
+    void addUser(Username username, String password) throws UsersRepositoryException;
 
     /**
      * Get the user object with the specified user name. Return null if no such
@@ -55,7 +55,7 @@ public interface UsersRepository {
      * @throws UsersRepositoryException
      *             if error
      */
-    User getUserByName(String name) throws UsersRepositoryException;
+    User getUserByName(Username name) throws UsersRepositoryException;
 
     /**
      * Update the repository with the specified user object. A user object with
@@ -74,7 +74,7 @@ public interface UsersRepository {
      * @throws UsersRepositoryException
      *             if error
      */
-    void removeUser(String name) throws UsersRepositoryException;
+    void removeUser(Username name) throws UsersRepositoryException;
 
     /**
      * Returns whether or not this user is in the repository
@@ -85,7 +85,7 @@ public interface UsersRepository {
      * @throws UsersRepositoryException
      *             if error
      */
-    boolean contains(String name) throws UsersRepositoryException;
+    boolean contains(Username name) throws UsersRepositoryException;
 
     /**
      * Test if user with name 'name' has password 'password'.
@@ -101,7 +101,7 @@ public interface UsersRepository {
      *             if error
      * 
      */
-    boolean test(String name, String password) throws UsersRepositoryException;
+    boolean test(Username name, String password) throws UsersRepositoryException;
 
     /**
      * Returns a count of the users in the repository.
@@ -120,7 +120,7 @@ public interface UsersRepository {
      * @throws UsersRepositoryException
      *             if error
      */
-    Iterator<String> list() throws UsersRepositoryException;
+    Iterator<Username> list() throws UsersRepositoryException;
 
     /**
      * Return true if virtualHosting support is enabled, otherwise false
@@ -136,7 +136,7 @@ public interface UsersRepository {
      * @return Username used by James for this mailAddress
      * @throws UsersRepositoryException
      */
-    String getUser(MailAddress mailAddress) throws UsersRepositoryException;
+    Username getUser(MailAddress mailAddress) throws UsersRepositoryException;
 
     /**
      * Returns one of the possible mail addresses to be used to send a mail to that user
@@ -148,11 +148,11 @@ public interface UsersRepository {
     /**
      * Return true if the user is an admin for this repository
      */
-    boolean isAdministrator(String username) throws UsersRepositoryException;
+    boolean isAdministrator(Username username) throws UsersRepositoryException;
 
     /**
-     * @return true if one can use {@link UsersRepository#updateUser(User)} {@link UsersRepository#addUser(String, String)}
-     *             {@link UsersRepository#removeUser(String)} and false overwhise
+     * @return true if one can use {@link UsersRepository#updateUser(User)} {@link UsersRepository#addUser(Username, String)}
+     *             {@link UsersRepository#removeUser(Username)} and false overwhise
      */
     boolean isReadOnly();
 
diff --git a/server/data/data-api/src/main/java/org/apache/james/user/api/UsersRepositoryManagementMBean.java b/server/data/data-api/src/main/java/org/apache/james/user/api/UsersRepositoryManagementMBean.java
index ee74984..8e262b1 100644
--- a/server/data/data-api/src/main/java/org/apache/james/user/api/UsersRepositoryManagementMBean.java
+++ b/server/data/data-api/src/main/java/org/apache/james/user/api/UsersRepositoryManagementMBean.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.user.api;
 
+import org.apache.james.core.Username;
+
 /**
  * Expose user account management functionality through JMX.
  */
@@ -99,7 +101,7 @@ public interface UsersRepositoryManagementMBean {
      *             if error
      */
     @Deprecated
-    void unsetAlias(String userName) throws Exception;
+    void unsetAlias(Username userName) throws Exception;
 
     /**
      * Retrieves the user's alias, if set
@@ -110,7 +112,7 @@ public interface UsersRepositoryManagementMBean {
      *             if error
      */
     @Deprecated
-    String getAlias(String userName) throws Exception;
+    String getAlias(Username userName) throws Exception;
 
     /**
      * Removes a user's forward email address which terminates remote mail
@@ -123,7 +125,7 @@ public interface UsersRepositoryManagementMBean {
      *             if error
      */
     @Deprecated
-    void unsetForwardAddress(String userName) throws Exception;
+    void unsetForwardAddress(Username userName) throws Exception;
 
     /**
      * Retrieves the user's forward, if set
@@ -136,7 +138,7 @@ public interface UsersRepositoryManagementMBean {
      *             if error
      */
     @Deprecated
-    String getForwardAddress(String userName) throws Exception;
+    String getForwardAddress(Username userName) throws Exception;
 
     /**
      * Return true if the UserRepository has VirtualHosting enabled
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 7aa04a8..c614ba0 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
@@ -31,7 +31,7 @@ public interface User {
      * 
      * @return the user name for this user
      */
-    String getUserName();
+    Username getUserName();
 
     /**
      * Return true if pass matches password of this user.
@@ -52,9 +52,9 @@ public interface User {
      */
     boolean setPassword(String newPass);
 
-    default boolean hasUsername(String username) {
-        Username thisUsername = Username.of(getUserName());
-        Username thatUsername = Username.of(username);
+    default boolean hasUsername(Username username) {
+        Username thisUsername = getUserName();
+        Username thatUsername = username;
 
         return thisUsername.equals(thatUsername);
     }
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/user/cassandra/CassandraUsersRepository.java b/server/data/data-cassandra/src/main/java/org/apache/james/user/cassandra/CassandraUsersRepository.java
index 29b4f9d..0f07fcb 100644
--- a/server/data/data-cassandra/src/main/java/org/apache/james/user/cassandra/CassandraUsersRepository.java
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/user/cassandra/CassandraUsersRepository.java
@@ -39,6 +39,7 @@ import java.util.Optional;
 import javax.inject.Inject;
 
 import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
+import org.apache.james.core.Username;
 import org.apache.james.user.api.AlreadyExistInUsersRepositoryException;
 import org.apache.james.user.api.UsersRepositoryException;
 import org.apache.james.user.api.model.User;
@@ -113,11 +114,11 @@ public class CassandraUsersRepository extends AbstractUsersRepository {
     }
 
     @Override
-    public User getUserByName(String name) {
+    public User getUserByName(Username name) {
         return executor.executeSingleRow(
                 getUserStatement.bind()
-                    .setString(NAME, name.toLowerCase(Locale.US)))
-            .map(row -> new DefaultUser(row.getString(REALNAME), row.getString(PASSWORD), row.getString(ALGORITHM)))
+                    .setString(NAME, name.asString().toLowerCase(Locale.US)))
+            .map(row -> new DefaultUser(Username.of(row.getString(REALNAME)), row.getString(PASSWORD), row.getString(ALGORITHM)))
             .filter(user -> user.hasUsername(name))
             .blockOptional()
             .orElse(null);
@@ -129,10 +130,10 @@ public class CassandraUsersRepository extends AbstractUsersRepository {
         DefaultUser defaultUser = (DefaultUser) user;
         boolean executed = executor.executeReturnApplied(
                 updateUserStatement.bind()
-                    .setString(REALNAME, defaultUser.getUserName())
+                    .setString(REALNAME, defaultUser.getUserName().asString())
                     .setString(PASSWORD, defaultUser.getHashedPassword())
                     .setString(ALGORITHM, defaultUser.getHashAlgorithm())
-                    .setString(NAME, defaultUser.getUserName().toLowerCase(Locale.US)))
+                    .setString(NAME, defaultUser.getUserName().asString().toLowerCase(Locale.US)))
             .block();
 
         if (!executed) {
@@ -141,24 +142,24 @@ public class CassandraUsersRepository extends AbstractUsersRepository {
     }
 
     @Override
-    public void removeUser(String name) throws UsersRepositoryException {
+    public void removeUser(Username name) throws UsersRepositoryException {
         boolean executed = executor.executeReturnApplied(
             removeUserStatement.bind()
-                .setString(NAME, name))
+                .setString(NAME, name.asString()))
             .block();
 
         if (!executed) {
-            throw new UsersRepositoryException("unable to remove unknown user " + name);
+            throw new UsersRepositoryException("unable to remove unknown user " + name.asString());
         }
     }
 
     @Override
-    public boolean contains(String name) {
+    public boolean contains(Username name) {
         return getUserByName(name) != null;
     }
 
     @Override
-    public boolean test(String name, String password) throws UsersRepositoryException {
+    public boolean test(Username name, String password) throws UsersRepositoryException {
         return Optional.ofNullable(getUserByName(name))
                 .map(x -> x.verifyPassword(password))
             .orElseGet(() -> {
@@ -175,27 +176,28 @@ public class CassandraUsersRepository extends AbstractUsersRepository {
     }
 
     @Override
-    public Iterator<String> list() throws UsersRepositoryException {
+    public Iterator<Username> list() throws UsersRepositoryException {
         return executor.executeRows(listStatement.bind())
             .map(row -> row.getString(REALNAME))
+            .map(Username::of)
             .toIterable()
             .iterator();
     }
 
     @Override
-    public void addUser(String username, String password) throws UsersRepositoryException {
+    public void addUser(Username username, String password) throws UsersRepositoryException {
         isValidUsername(username);
         doAddUser(username, password);
     }
 
     @Override
-    protected void doAddUser(String username, String password) throws UsersRepositoryException {
+    protected void doAddUser(Username username, String password) throws UsersRepositoryException {
         DefaultUser user = new DefaultUser(username, DEFAULT_ALGO_VALUE);
         user.setPassword(password);
         boolean executed = executor.executeReturnApplied(
             insertStatement.bind()
-                .setString(NAME, user.getUserName().toLowerCase(Locale.US))
-                .setString(REALNAME, user.getUserName())
+                .setString(NAME, user.getUserName().asString().toLowerCase(Locale.US))
+                .setString(REALNAME, user.getUserName().asString())
                 .setString(PASSWORD, user.getHashedPassword())
                 .setString(ALGORITHM, user.getHashAlgorithm()))
             .block();
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 2d549e8..9089cd3 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
@@ -366,7 +366,7 @@ public class SieveFileRepository implements SieveRepository {
             try {
                 FileUtils.forceMkdir(getUserDirectoryFile(username));
             } catch (IOException e) {
-                throw new StorageException("Error while creating directory for " + username, e);
+                throw new StorageException("Error while creating directory for " + username.asString(), e);
             }
         }
     }
diff --git a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/access/CassandraAccessTokenDAO.java b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/access/CassandraAccessTokenDAO.java
index 23e761a..79851fe 100644
--- a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/access/CassandraAccessTokenDAO.java
+++ b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/access/CassandraAccessTokenDAO.java
@@ -33,12 +33,14 @@ import javax.inject.Inject;
 import javax.inject.Named;
 
 import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
+import org.apache.james.core.Username;
 import org.apache.james.jmap.api.access.AccessToken;
 import org.apache.james.jmap.cassandra.access.table.CassandraAccessTokenTable;
 
 import com.datastax.driver.core.PreparedStatement;
 import com.datastax.driver.core.Session;
 import com.google.common.primitives.Ints;
+
 import reactor.core.publisher.Mono;
 
 public class CassandraAccessTokenDAO {
@@ -70,10 +72,10 @@ public class CassandraAccessTokenDAO {
             .where(eq(CassandraAccessTokenTable.TOKEN, bindMarker(CassandraAccessTokenTable.TOKEN))));
     }
 
-    public Mono<Void> addToken(String username, AccessToken accessToken) {
+    public Mono<Void> addToken(Username username, AccessToken accessToken) {
         return cassandraAsyncExecutor.executeVoid(insertStatement.bind()
             .setUUID(CassandraAccessTokenTable.TOKEN, accessToken.asUUID())
-            .setString(CassandraAccessTokenTable.USERNAME, username)
+            .setString(CassandraAccessTokenTable.USERNAME, username.asString())
             .setInt(TTL, durationInSeconds));
     }
 
@@ -82,9 +84,10 @@ public class CassandraAccessTokenDAO {
             .setUUID(CassandraAccessTokenTable.TOKEN, accessToken.asUUID()));
     }
 
-    public Mono<String> getUsernameFromToken(AccessToken accessToken) {
+    public Mono<Username> getUsernameFromToken(AccessToken accessToken) {
         return cassandraAsyncExecutor.executeSingleRow(selectStatement.bind()
                 .setUUID(CassandraAccessTokenTable.TOKEN, accessToken.asUUID()))
-            .map(row -> row.getString(CassandraAccessTokenTable.USERNAME));
+            .map(row -> row.getString(CassandraAccessTokenTable.USERNAME))
+            .map(Username::of);
     }
... 9395 lines suppressed ...


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