http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailetContext.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailetContext.java
 
b/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailetContext.java
index 7579d39..a52d80f 100644
--- 
a/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailetContext.java
+++ 
b/server/mailet/mailetcontainer-camel/src/main/java/org/apache/james/mailetcontainer/impl/JamesMailetContext.java
@@ -40,6 +40,7 @@ import javax.mail.internet.ParseException;
 
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.HierarchicalConfiguration;
+import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.james.dnsservice.api.DNSService;
 import org.apache.james.dnsservice.api.TemporaryResolutionException;
@@ -232,7 +233,7 @@ public class JamesMailetContext implements MailetContext, 
Configurable {
         try {
             if (!name.contains("@")) {
                 try {
-                    return isLocalEmail(new 
MailAddress(name.toLowerCase(Locale.US), domains.getDefaultDomain()));
+                    return isLocalEmail(new 
MailAddress(name.toLowerCase(Locale.US), 
domains.getDefaultDomain().asString()));
                 } catch (DomainListException e) {
                     LOGGER.error("Unable to access DomainList", e);
                     return false;
@@ -249,7 +250,7 @@ public class JamesMailetContext implements MailetContext, 
Configurable {
     @Override
     public boolean isLocalEmail(MailAddress mailAddress) {
         if (mailAddress != null) {
-            if 
(!isLocalServer(mailAddress.getDomain().toLowerCase(Locale.US))) {
+            if (!isLocalServer(Domain.of(mailAddress.getDomain()))) {
                 return false;
             }
             try {
@@ -308,9 +309,9 @@ public class JamesMailetContext implements MailetContext, 
Configurable {
     }
 
     @Override
-    public boolean isLocalServer(String name) {
+    public boolean isLocalServer(Domain domain) {
         try {
-            return domains.containsDomain(name);
+            return domains.containsDomain(domain);
         } catch (DomainListException e) {
             LOGGER.error("Unable to retrieve domains", e);
             return false;
@@ -455,14 +456,14 @@ public class JamesMailetContext implements MailetContext, 
Configurable {
             // list of supported domains that isn't localhost. If that
             // doesn't work, use the hostname, even if it is localhost.
             if (postMasterAddress.indexOf('@') < 0) {
-                String domainName = null; // the domain to use
+                Domain domainName = null; // the domain to use
                 // loop through candidate domains until we find one or exhaust
                 // the
                 // list
-                for (String dom : domains.getDomains()) {
-                    String serverName = dom.toLowerCase(Locale.US);
-                    if (!("localhost".equals(serverName))) {
-                        domainName = serverName; // ok, not localhost, so
+                Domain localhost = Domain.of("localhost");
+                for (Domain dom : domains.getDomains()) {
+                    if (!(localhost.equals(dom))) {
+                        domainName = dom; // ok, not localhost, so
                         // use it
                     }
                 }
@@ -470,15 +471,15 @@ public class JamesMailetContext implements MailetContext, 
Configurable {
                 // if we found a suitable domain, use it. Otherwise fallback to
                 // the
                 // host name.
-                postMasterAddress = postMasterAddress + "@" + (domainName != 
null ? domainName : domains.getDefaultDomain());
+                postMasterAddress = postMasterAddress + "@" + (domainName != 
null ? domainName.name() : domains.getDefaultDomain());
             }
             try {
                 this.postmaster = new MailAddress(postMasterAddress);
-                if (!domains.containsDomain(postmaster.getDomain())) {
+                if 
(!domains.containsDomain(Domain.of(postmaster.getDomain()))) {
                     LOGGER.warn("The specified postmaster address ( {} ) is 
not a local " +
-                            "address.  This is not necessarily a problem, but 
it does mean that emails addressed to " +
-                            "the postmaster will be routed to another server.  
For some configurations this may " +
-                            "cause problems.", postmaster);
+                        "address.  This is not necessarily a problem, but it 
does mean that emails addressed to " +
+                        "the postmaster will be routed to another server.  For 
some configurations this may " +
+                        "cause problems.", postmaster);
                 }
             } catch (AddressException e) {
                 throw new ConfigurationException("Postmaster address " + 
postMasterAddress + "is invalid", e);

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/mailet/mailetcontainer-camel/src/test/java/org/apache/james/mailetcontainer/impl/JamesMailetContextTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailetcontainer-camel/src/test/java/org/apache/james/mailetcontainer/impl/JamesMailetContextTest.java
 
b/server/mailet/mailetcontainer-camel/src/test/java/org/apache/james/mailetcontainer/impl/JamesMailetContextTest.java
index bd8a732..1d0d04b 100644
--- 
a/server/mailet/mailetcontainer-camel/src/test/java/org/apache/james/mailetcontainer/impl/JamesMailetContextTest.java
+++ 
b/server/mailet/mailetcontainer-camel/src/test/java/org/apache/james/mailetcontainer/impl/JamesMailetContextTest.java
@@ -32,6 +32,7 @@ import java.util.concurrent.TimeUnit;
 import javax.mail.internet.MimeMessage;
 
 import org.apache.commons.configuration.HierarchicalConfiguration;
+import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.james.core.builder.MimeMessageBuilder;
 import org.apache.james.dnsservice.api.DNSService;
@@ -52,9 +53,9 @@ import org.mockito.ArgumentCaptor;
 import com.google.common.collect.ImmutableList;
 
 public class JamesMailetContextTest {
-    public static final String DOMAIN_COM = "domain.com";
+    public static final Domain DOMAIN_COM = Domain.of("domain.com");
     public static final String USERNAME = "user";
-    public static final String USERMAIL = USERNAME + "@" + DOMAIN_COM;
+    public static final String USERMAIL = USERNAME + "@" + DOMAIN_COM.name();
     public static final String PASSWORD = "password";
     public static final DNSService DNS_SERVICE = null;
 
@@ -117,7 +118,7 @@ public class JamesMailetContextTest {
     public void 
isLocalUserShouldReturnTrueWhenUsedWithLocalPartAndUserExistOnDefaultDomain() 
throws Exception {
         HierarchicalConfiguration configuration = 
mock(HierarchicalConfiguration.class);
         when(configuration.getString(eq("defaultDomain"), any(String.class)))
-            .thenReturn(DOMAIN_COM);
+            .thenReturn(DOMAIN_COM.name());
 
         domainList.configure(configuration);
         usersRepository.addUser(USERMAIL, PASSWORD);

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/AbstractRecipientRewriteTable.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/AbstractRecipientRewriteTable.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/AbstractRecipientRewriteTable.java
index a66f25f..e048835 100755
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/AbstractRecipientRewriteTable.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/AbstractRecipientRewriteTable.java
@@ -32,6 +32,7 @@ import javax.inject.Inject;
 import javax.mail.MessagingException;
 import javax.mail.internet.ParseException;
 
+import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.james.dnsservice.api.DNSService;
 import org.apache.james.domainlist.api.DomainList;
@@ -126,7 +127,8 @@ public abstract class AbstractRecipientRewriteTable extends 
GenericMailet {
                         }
 
                         try {
-                            MailAddress target = (targetAddress.indexOf('@') < 
0) ? new MailAddress(targetAddress, domainList.getDefaultDomain()) : new 
MailAddress(targetAddress);
+                            MailAddress target = (targetAddress.indexOf('@') < 
0) ?
+                                new MailAddress(targetAddress, 
domainList.getDefaultDomain().asString()) : new MailAddress(targetAddress);
 
                             // Mark this source address as an address to remove
                             // from the recipient list
@@ -134,7 +136,7 @@ public abstract class AbstractRecipientRewriteTable extends 
GenericMailet {
 
                             // We need to separate local and remote
                             // recipients. This is explained below.
-                            if 
(getMailetContext().isLocalServer(target.getDomain())) {
+                            if 
(getMailetContext().isLocalServer(Domain.of(target.getDomain()))) {
                                 recipientsToAddLocal.add(target);
                             } else {
                                 recipientsToAddForward.add(target);

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/BayesianAnalysis.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/BayesianAnalysis.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/BayesianAnalysis.java
index 7e9c29a..60249a6 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/BayesianAnalysis.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/BayesianAnalysis.java
@@ -31,6 +31,7 @@ import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
 import javax.sql.DataSource;
 
+import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.james.filesystem.api.FileSystem;
 import org.apache.james.util.bayesian.JDBCBayesianAnalyzer;
@@ -294,7 +295,7 @@ public class BayesianAnalysis extends GenericMailet {
 
             if (ignoreLocalSender) {
                 // ignore the message if the sender is local
-                if (mail.getSender() != null && 
getMailetContext().isLocalServer(mail.getSender().getDomain())) {
+                if (mail.getSender() != null && 
getMailetContext().isLocalServer(Domain.of(mail.getSender().getDomain()))) {
                     return;
                 }
             }

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessor.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessor.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessor.java
index ec49b8b..d2d3165 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessor.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessor.java
@@ -29,6 +29,7 @@ import javax.mail.MessagingException;
 import javax.mail.internet.AddressException;
 import javax.mail.internet.MimeMessage;
 
+import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.domainlist.api.DomainListException;
@@ -117,7 +118,7 @@ public class RecipientRewriteTableProcessor {
 
     private RrtExecutionResult getRrtExecutionResult(Mail mail, MailAddress 
recipient) {
         try {
-            Mappings mappings = 
virtualTableStore.getMappings(recipient.getLocalPart(), recipient.getDomain());
+            Mappings mappings = 
virtualTableStore.getMappings(recipient.getLocalPart(), 
Domain.of(recipient.getDomain()));
 
             if (mappings != null) {
                 List<MailAddress> newMailAddresses = handleMappings(mappings, 
mail.getSender(), recipient, mail.getMessage());
@@ -154,7 +155,7 @@ public class RecipientRewriteTableProcessor {
 
     private ImmutableList<MailAddress> 
getLocalAddresses(ImmutableList<MailAddress> mailAddresses) {
         return mailAddresses.stream()
-            .filter(mailAddress -> 
mailetContext.isLocalServer(mailAddress.getDomain()))
+            .filter(mailAddress -> 
mailetContext.isLocalServer(Domain.of(mailAddress.getDomain())))
             .collect(Guavate.toImmutableList());
     }
 
@@ -172,7 +173,7 @@ public class RecipientRewriteTableProcessor {
             .collect(Guavate.toImmutableList());
         
         if (!addressWithoutDomains.isEmpty()) {
-            final String defaultDomain = getDefaultDomain(domainList);
+            final Domain defaultDomain = getDefaultDomain(domainList);
 
             return addressWithoutDomains.stream()
                 .map(address -> address.appendDomain(defaultDomain))
@@ -183,7 +184,7 @@ public class RecipientRewriteTableProcessor {
 
     private void forwardToRemoteAddress(MailAddress sender, MailAddress 
recipient, MimeMessage message, ImmutableList<MailAddress> mailAddresses) 
throws MessagingException {
         ImmutableList<MailAddress> remoteAddress = mailAddresses.stream()
-            .filter(mailAddress -> 
!mailetContext.isLocalServer(mailAddress.getDomain()))
+            .filter(mailAddress -> 
!mailetContext.isLocalServer(Domain.of(mailAddress.getDomain())))
             .collect(Guavate.toImmutableList());
 
         if (!remoteAddress.isEmpty()) {
@@ -196,7 +197,7 @@ public class RecipientRewriteTableProcessor {
         }
     }
 
-    private String getDefaultDomain(DomainList domainList) throws 
MessagingException {
+    private Domain getDefaultDomain(DomainList domainList) throws 
MessagingException {
         try {
             return domainList.getDefaultDomain();
         } catch (DomainListException e) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/WhiteListManager.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/WhiteListManager.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/WhiteListManager.java
index 2a4889a..96bc35d 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/WhiteListManager.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/WhiteListManager.java
@@ -46,6 +46,7 @@ import javax.mail.internet.MimeMessage;
 import javax.mail.internet.MimeMultipart;
 import javax.sql.DataSource;
 
+import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.james.transport.mailets.managesieve.ManageSieveMailet;
 import org.apache.james.user.api.UsersRepository;
@@ -307,7 +308,7 @@ public class WhiteListManager extends GenericMailet {
                 ResultSet selectRS = null;
                 try {
                     String recipientUser = 
recipient.getLocalPart().toLowerCase(Locale.US);
-                    String recipientHost = 
recipient.getDomain().toLowerCase(Locale.US);
+                    Domain recipientHost = Domain.of(recipient.getDomain());
 
                     if (getMailetContext().isLocalServer(recipientHost)) {
                         // not a remote recipient, so skip
@@ -324,7 +325,7 @@ public class WhiteListManager extends GenericMailet {
                     selectStmt.setString(1, senderUser);
                     selectStmt.setString(2, senderHost);
                     selectStmt.setString(3, recipientUser);
-                    selectStmt.setString(4, recipientHost);
+                    selectStmt.setString(4, recipientHost.asString());
                     selectRS = selectStmt.executeQuery();
                     if (selectRS.next()) {
                         // This address was already in the list
@@ -337,7 +338,7 @@ public class WhiteListManager extends GenericMailet {
                     insertStmt.setString(1, senderUser);
                     insertStmt.setString(2, senderHost);
                     insertStmt.setString(3, recipientUser);
-                    insertStmt.setString(4, recipientHost);
+                    insertStmt.setString(4, recipientHost.asString());
                     insertStmt.executeUpdate();
                     dbUpdated = true;
 
@@ -457,7 +458,7 @@ public class WhiteListManager extends GenericMailet {
                             continue;
                         }
                         String recipientUser = 
recipientMailAddress.getLocalPart().toLowerCase(Locale.US);
-                        String recipientHost = 
recipientMailAddress.getDomain().toLowerCase(Locale.US);
+                        Domain recipientHost = 
Domain.of(recipientMailAddress.getDomain());
 
                         if (getMailetContext().isLocalServer(recipientHost)) {
                             // not a remote recipient, so skip
@@ -474,7 +475,7 @@ public class WhiteListManager extends GenericMailet {
                         selectStmt.setString(1, senderUser);
                         selectStmt.setString(2, senderHost);
                         selectStmt.setString(3, recipientUser);
-                        selectStmt.setString(4, recipientHost);
+                        selectStmt.setString(4, recipientHost.asString());
                         selectRS = selectStmt.executeQuery();
                         if (selectRS.next()) {
                             // This address was already in the list
@@ -488,7 +489,7 @@ public class WhiteListManager extends GenericMailet {
                         insertStmt.setString(1, senderUser);
                         insertStmt.setString(2, senderHost);
                         insertStmt.setString(3, recipientUser);
-                        insertStmt.setString(4, recipientHost);
+                        insertStmt.setString(4, recipientHost.asString());
                         insertStmt.executeUpdate();
                         dbUpdated = true;
                         out.println("Inserted: " + recipientMailAddress);
@@ -578,7 +579,7 @@ public class WhiteListManager extends GenericMailet {
                             continue;
                         }
                         String recipientUser = 
recipientMailAddress.getLocalPart().toLowerCase(Locale.US);
-                        String recipientHost = 
recipientMailAddress.getDomain().toLowerCase(Locale.US);
+                        Domain recipientHost = 
Domain.of(recipientMailAddress.getDomain());
 
                         if (getMailetContext().isLocalServer(recipientHost)) {
                             // not a remote recipient, so skip
@@ -595,7 +596,7 @@ public class WhiteListManager extends GenericMailet {
                         selectStmt.setString(1, senderUser);
                         selectStmt.setString(2, senderHost);
                         selectStmt.setString(3, recipientUser);
-                        selectStmt.setString(4, recipientHost);
+                        selectStmt.setString(4, recipientHost.asString());
                         selectRS = selectStmt.executeQuery();
                         if (!selectRS.next()) {
                             // This address was not in the list
@@ -609,7 +610,7 @@ public class WhiteListManager extends GenericMailet {
                         deleteStmt.setString(1, senderUser);
                         deleteStmt.setString(2, senderHost);
                         deleteStmt.setString(3, recipientUser);
-                        deleteStmt.setString(4, recipientHost);
+                        deleteStmt.setString(4, recipientHost.asString());
                         deleteStmt.executeUpdate();
                         dbUpdated = true;
                         out.println("Removed: " + recipientMailAddress);

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/XMLRecipientRewriteTable.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/XMLRecipientRewriteTable.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/XMLRecipientRewriteTable.java
index 736bed8..84aeb0c 100755
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/XMLRecipientRewriteTable.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/XMLRecipientRewriteTable.java
@@ -26,6 +26,7 @@ import java.util.Map;
 
 import javax.mail.MessagingException;
 
+import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.james.rrt.lib.RecipientRewriteTableUtil;
 import org.apache.mailet.Experimental;
@@ -103,7 +104,7 @@ public class XMLRecipientRewriteTable extends 
AbstractRecipientRewriteTable {
 
         for (MailAddress source : recipients) {
             String user = source.getLocalPart().toLowerCase(Locale.US);
-            String domain = source.getDomain().toLowerCase(Locale.US);
+            Domain domain = Domain.of(source.getDomain());
 
             String targetString = 
RecipientRewriteTableUtil.getTargetString(user, domain, mappings);
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailet.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailet.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailet.java
index c07201f..e705a48 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailet.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/managesieve/ManageSieveMailet.java
@@ -24,12 +24,12 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.net.MalformedURLException;
 import java.net.URL;
-import java.util.Locale;
 import java.util.Scanner;
 
 import javax.inject.Inject;
 import javax.mail.MessagingException;
 
+import org.apache.james.core.Domain;
 import org.apache.james.managesieve.api.Session;
 import org.apache.james.managesieve.api.SieveParser;
 import org.apache.james.managesieve.core.CoreProcessor;
@@ -127,7 +127,7 @@ public class ManageSieveMailet extends GenericMailet 
implements MessageToCoreToM
             LOGGER.error("Sender is null");
             return;
         }
-        if 
(!getMailetContext().isLocalServer(mail.getSender().getDomain().toLowerCase(Locale.US)))
 {
+        if 
(!getMailetContext().isLocalServer(Domain.of(mail.getSender().getDomain()))) {
             LOGGER.error("Sender not local");
             return;
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/HeloNameProvider.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/HeloNameProvider.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/HeloNameProvider.java
index 9042fbb..95bee1b 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/HeloNameProvider.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/HeloNameProvider.java
@@ -41,7 +41,7 @@ public class HeloNameProvider {
         if (heloName == null) {
             // TODO: Maybe we should better just lookup the hostname via dns
             try {
-                return domainList.getDefaultDomain();
+                return domainList.getDefaultDomain().name();
             } catch (DomainListException e) {
                 LOGGER.warn("Unable to access DomainList", e);
                 return LOCALHOST;

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AbstractSQLWhitelistMatcher.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AbstractSQLWhitelistMatcher.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AbstractSQLWhitelistMatcher.java
index acbbad5..36df391 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AbstractSQLWhitelistMatcher.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AbstractSQLWhitelistMatcher.java
@@ -34,6 +34,7 @@ import javax.inject.Inject;
 import javax.mail.MessagingException;
 import javax.sql.DataSource;
 
+import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.james.filesystem.api.FileSystem;
 import org.apache.james.transport.mailets.WhiteListManager;
@@ -155,9 +156,9 @@ public abstract class AbstractSQLWhitelistMatcher extends 
GenericMatcher {
 
         for (MailAddress recipientMailAddress : recipients) {
             String recipientUser = 
recipientMailAddress.getLocalPart().toLowerCase(Locale.US);
-            String recipientHost = 
recipientMailAddress.getDomain().toLowerCase(Locale.US);
+            String recipientHost = recipientMailAddress.getDomain();
 
-            if (!getMailetContext().isLocalServer(recipientHost)) {
+            if (!getMailetContext().isLocalServer(Domain.of(recipientHost))) {
                 // not a local recipient, so skip
                 continue;
             }

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessorTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessorTest.java
 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessorTest.java
index 59881a1..5caf722 100644
--- 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessorTest.java
+++ 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/RecipientRewriteTableProcessorTest.java
@@ -29,6 +29,7 @@ import java.util.Collection;
 import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
 
+import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.domainlist.api.DomainListException;
@@ -104,7 +105,7 @@ public class RecipientRewriteTableProcessorTest {
 
     @Test
     public void handleMappingsShouldReturnTheMailAddressBelongToLocalServer() 
throws Exception {
-        
when(domainList.getDefaultDomain()).thenReturn(MailAddressFixture.JAMES_LOCAL);
+        
when(domainList.getDefaultDomain()).thenReturn(Domain.of(MailAddressFixture.JAMES_LOCAL));
         mappings = MappingsImpl.builder()
                 .add(MailAddressFixture.ANY_AT_JAMES.toString())
                 .add(NONEDOMAIN)
@@ -118,7 +119,7 @@ public class RecipientRewriteTableProcessorTest {
 
     @Test
     public void 
handleMappingsShouldReturnTheOnlyMailAddressBelongToLocalServer() throws 
Exception {
-        
when(domainList.getDefaultDomain()).thenReturn(MailAddressFixture.JAMES2_APACHE_ORG);
+        
when(domainList.getDefaultDomain()).thenReturn(Domain.of(MailAddressFixture.JAMES2_APACHE_ORG));
 
         mappings = MappingsImpl.builder()
                 .add(MailAddressFixture.ANY_AT_JAMES.toString())
@@ -134,7 +135,7 @@ public class RecipientRewriteTableProcessorTest {
 
     @Test
     public void 
handleMappingsShouldRemoveMappingElementWhenCannotCreateMailAddress() throws 
Exception {
-        
when(domainList.getDefaultDomain()).thenReturn(MailAddressFixture.JAMES_LOCAL);
+        
when(domainList.getDefaultDomain()).thenReturn(Domain.of(MailAddressFixture.JAMES_LOCAL));
         mappings = MappingsImpl.builder()
                 .add(MailAddressFixture.ANY_AT_JAMES.toString())
                 .add(NONEDOMAIN)
@@ -149,7 +150,7 @@ public class RecipientRewriteTableProcessorTest {
 
     @Test
     public void handleMappingsShouldForwardEmailToRemoteServer() throws 
Exception {
-        
when(domainList.getDefaultDomain()).thenReturn(MailAddressFixture.JAMES_LOCAL);
+        
when(domainList.getDefaultDomain()).thenReturn(Domain.of(MailAddressFixture.JAMES_LOCAL));
 
         mappings = MappingsImpl.builder()
                 .add(MailAddressFixture.ANY_AT_JAMES.toString())
@@ -172,7 +173,7 @@ public class RecipientRewriteTableProcessorTest {
 
     @Test
     public void 
handleMappingsShouldNotForwardAnyEmailToRemoteServerWhenNoMoreReomoteAddress() 
throws Exception {
-        
when(domainList.getDefaultDomain()).thenReturn(MailAddressFixture.JAMES_LOCAL);
+        
when(domainList.getDefaultDomain()).thenReturn(Domain.of(MailAddressFixture.JAMES_LOCAL));
 
         mappings = MappingsImpl.builder()
                 .add(NONEDOMAIN)
@@ -186,7 +187,7 @@ public class RecipientRewriteTableProcessorTest {
     
     @Test
     public void handleMappingWithOnlyLocalRecipient() throws Exception {
-        
when(domainList.getDefaultDomain()).thenReturn(MailAddressFixture.JAMES_LOCAL);
+        
when(domainList.getDefaultDomain()).thenReturn(Domain.of(MailAddressFixture.JAMES_LOCAL));
 
         mappings = MappingsImpl.builder()
                 .add(NONEDOMAIN)
@@ -201,7 +202,7 @@ public class RecipientRewriteTableProcessorTest {
     
     @Test
     public void handleMappingWithOnlyRemoteRecipient() throws Exception {
-        
when(domainList.getDefaultDomain()).thenReturn(MailAddressFixture.JAMES_LOCAL);
+        
when(domainList.getDefaultDomain()).thenReturn(Domain.of(MailAddressFixture.JAMES_LOCAL));
 
         mappings = MappingsImpl.builder()
                 .add(MailAddressFixture.ANY_AT_JAMES.toString())
@@ -223,7 +224,7 @@ public class RecipientRewriteTableProcessorTest {
     
     @Test
     public void 
processShouldNotRewriteRecipientWhenVirtualTableStoreReturnNullMappings() 
throws Exception {
-        when(virtualTableStore.getMappings(any(String.class), 
any(String.class))).thenReturn(null);
+        when(virtualTableStore.getMappings(any(String.class), 
any(Domain.class))).thenReturn(null);
 
         mail = FakeMail.builder()
             .mimeMessage(message)
@@ -238,7 +239,7 @@ public class RecipientRewriteTableProcessorTest {
     @SuppressWarnings("unchecked")
     @Test
     public void 
processShouldSendMailToAllErrorRecipientsWhenErrorMappingException() throws 
Exception {
-        when(virtualTableStore.getMappings(eq("other"), 
eq(MailAddressFixture.JAMES_LOCAL))).thenThrow(ErrorMappingException.class);
+        when(virtualTableStore.getMappings(eq("other"), 
eq(Domain.of(MailAddressFixture.JAMES_LOCAL)))).thenThrow(ErrorMappingException.class);
 
         mail = FakeMail.builder()
             .sender(MailAddressFixture.ANY_AT_JAMES)
@@ -263,7 +264,7 @@ public class RecipientRewriteTableProcessorTest {
     @SuppressWarnings("unchecked")
     @Test
     public void 
processShouldSendMailToAllErrorRecipientsWhenRecipientRewriteTableException() 
throws Exception {
-        when(virtualTableStore.getMappings(eq("other"), 
eq(MailAddressFixture.JAMES_LOCAL))).thenThrow(RecipientRewriteTableException.class);
+        when(virtualTableStore.getMappings(eq("other"), 
eq(Domain.of(MailAddressFixture.JAMES_LOCAL)))).thenThrow(RecipientRewriteTableException.class);
 
         mail = FakeMail.builder()
             .sender(MailAddressFixture.ANY_AT_JAMES)
@@ -288,7 +289,7 @@ public class RecipientRewriteTableProcessorTest {
     @SuppressWarnings("unchecked")
     @Test
     public void 
processShouldSendMailToAllErrorRecipientsWhenMessagingException() throws 
Exception {
-        when(virtualTableStore.getMappings(eq("other"), 
eq(MailAddressFixture.JAMES_LOCAL))).thenThrow(MessagingException.class);
+        when(virtualTableStore.getMappings(eq("other"), 
eq(Domain.of(MailAddressFixture.JAMES_LOCAL)))).thenThrow(MessagingException.class);
 
         mail = FakeMail.builder()
             .sender(MailAddressFixture.ANY_AT_JAMES)
@@ -312,7 +313,7 @@ public class RecipientRewriteTableProcessorTest {
     
     @Test
     public void processShouldNotSendMailWhenNoErrorRecipients() throws 
Exception {
-        when(virtualTableStore.getMappings(any(String.class), 
any(String.class))).thenReturn(null);
+        when(virtualTableStore.getMappings(any(String.class), 
any(Domain.class))).thenReturn(null);
 
         mail = FakeMail.builder()
             .mimeMessage(message)
@@ -326,7 +327,7 @@ public class RecipientRewriteTableProcessorTest {
     
     @Test
     public void 
processShouldResetMailStateToGhostWhenCanNotBuildNewRecipient() throws 
Exception {
-        when(virtualTableStore.getMappings(any(String.class), 
any(String.class))).thenReturn(mappings);
+        when(virtualTableStore.getMappings(any(String.class), 
any(Domain.class))).thenReturn(mappings);
 
         mail = FakeMail.builder()
             .mimeMessage(message)

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/HeloNameProviderTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/HeloNameProviderTest.java
 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/HeloNameProviderTest.java
index 1ac0d55..e2c38c5 100644
--- 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/HeloNameProviderTest.java
+++ 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/HeloNameProviderTest.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.Domain;
 import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.domainlist.api.DomainListException;
 import org.apache.james.transport.mailets.remote.delivery.HeloNameProvider;
@@ -54,7 +55,7 @@ public class HeloNameProviderTest {
 
     @Test
     public void getHeloNameShouldReturnDomainListDefaultDomainOnNullHeloName() 
throws DomainListException {
-        when(domainList.getDefaultDomain()).thenReturn(DOMAIN);
+        when(domainList.getDefaultDomain()).thenReturn(Domain.of(DOMAIN));
         HeloNameProvider heloNameProvider = new HeloNameProvider(null, 
domainList);
 
         assertThat(heloNameProvider.getHeloName()).isEqualTo(DOMAIN);

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryConfigurationTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryConfigurationTest.java
 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryConfigurationTest.java
index f8aef3e..3e6e40f 100644
--- 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryConfigurationTest.java
+++ 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryConfigurationTest.java
@@ -25,6 +25,7 @@ import static org.mockito.Mockito.when;
 
 import java.util.Properties;
 
+import org.apache.james.core.Domain;
 import org.apache.james.domainlist.api.DomainList;
 import org.apache.mailet.base.test.FakeMailetConfig;
 import org.assertj.core.data.MapEntry;
@@ -519,7 +520,7 @@ public class RemoteDeliveryConfigurationTest {
     public void getHeloNameProviderShouldCallDomainListByDefault() throws 
Exception {
         DomainList domainList = mock(DomainList.class);
         String value = "value";
-        when(domainList.getDefaultDomain()).thenReturn(value);
+        when(domainList.getDefaultDomain()).thenReturn(Domain.of(value));
         FakeMailetConfig mailetConfig = FakeMailetConfig.builder()
             .setProperty(RemoteDeliveryConfiguration.DELIVERY_THREADS, "1")
             .build();

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/protocols/fetchmail/src/main/java/org/apache/james/fetchmail/MessageProcessor.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/fetchmail/src/main/java/org/apache/james/fetchmail/MessageProcessor.java
 
b/server/protocols/fetchmail/src/main/java/org/apache/james/fetchmail/MessageProcessor.java
index 313b9d6..c1e84ce 100644
--- 
a/server/protocols/fetchmail/src/main/java/org/apache/james/fetchmail/MessageProcessor.java
+++ 
b/server/protocols/fetchmail/src/main/java/org/apache/james/fetchmail/MessageProcessor.java
@@ -32,6 +32,7 @@ import javax.mail.internet.InternetAddress;
 import javax.mail.internet.MimeMessage;
 import javax.mail.internet.ParseException;
 
+import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.james.domainlist.api.DomainListException;
 import org.apache.james.server.core.MailImpl;
@@ -849,7 +850,7 @@ public class MessageProcessor extends ProcessorAbstract {
      */
     protected boolean isLocalServer(MailAddress recipient) {
         try {
-            return 
getConfiguration().getDomainList().containsDomain(recipient.getDomain());
+            return 
getConfiguration().getDomainList().containsDomain(Domain.of(recipient.getDomain()));
         } catch (DomainListException e) {
             LOGGER.error("Unable to access DomainList", e);
             return false;

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/protocols/fetchmail/src/main/java/org/apache/james/fetchmail/ParsedConfiguration.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/fetchmail/src/main/java/org/apache/james/fetchmail/ParsedConfiguration.java
 
b/server/protocols/fetchmail/src/main/java/org/apache/james/fetchmail/ParsedConfiguration.java
index 9a62259..bd42f7b 100644
--- 
a/server/protocols/fetchmail/src/main/java/org/apache/james/fetchmail/ParsedConfiguration.java
+++ 
b/server/protocols/fetchmail/src/main/java/org/apache/james/fetchmail/ParsedConfiguration.java
@@ -28,6 +28,7 @@ import javax.mail.internet.ParseException;
 
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.HierarchicalConfiguration;
+import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.james.dnsservice.api.DNSService;
 import org.apache.james.domainlist.api.DomainList;
@@ -780,7 +781,7 @@ class ParsedConfiguration {
      */
     protected void validateDefaultDomainName(String defaultDomainName) throws 
ConfigurationException {
         try {
-            if (!getDomainList().containsDomain(defaultDomainName)) {
+            if (!getDomainList().containsDomain(Domain.of(defaultDomainName))) 
{
                 throw new ConfigurationException("Default domain name is not a 
local server: " + defaultDomainName);
             }
         } catch (DomainListException e) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/JmapMDN.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/JmapMDN.java 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/JmapMDN.java
index 7178c1e..abb4cd9 100644
--- 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/JmapMDN.java
+++ 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/JmapMDN.java
@@ -24,6 +24,7 @@ import java.util.Objects;
 import java.util.Optional;
 import java.util.stream.Stream;
 
+import org.apache.james.core.Domain;
 import org.apache.james.core.User;
 import org.apache.james.jmap.exceptions.InvalidOriginMessageForMDNException;
 import org.apache.james.mailbox.MailboxSession;
@@ -150,7 +151,7 @@ public class JmapMDN {
             .setTo(getSenderAddress(originalMessage))
             .setFrom(user.asString())
             .setSubject(subject)
-            
.setMessageId(MimeUtil.createUniqueMessageId(user.getDomainPart().orElse(null)))
+            
.setMessageId(MimeUtil.createUniqueMessageId(user.getDomainPart().map(Domain::name).orElse(null)))
             .build();
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/AuthRequiredToRelayRcptHook.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/AuthRequiredToRelayRcptHook.java
 
b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/AuthRequiredToRelayRcptHook.java
index 4186e33..69fb9d6 100644
--- 
a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/AuthRequiredToRelayRcptHook.java
+++ 
b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/AuthRequiredToRelayRcptHook.java
@@ -22,6 +22,7 @@ import javax.inject.Inject;
 
 import org.apache.commons.configuration.Configuration;
 import org.apache.commons.configuration.ConfigurationException;
+import org.apache.james.core.Domain;
 import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.domainlist.api.DomainListException;
 import 
org.apache.james.protocols.smtp.core.AbstractAuthRequiredToRelayRcptHook;
@@ -48,7 +49,7 @@ public class AuthRequiredToRelayRcptHook extends 
AbstractAuthRequiredToRelayRcpt
     @Override
     protected boolean isLocalDomain(String domain) {
         try {
-            return domains.containsDomain(domain);
+            return domains.containsDomain(Domain.of(domain));
         } catch (DomainListException e) {
             return false;
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/JamesMailCmdHandler.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/JamesMailCmdHandler.java
 
b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/JamesMailCmdHandler.java
index 87ad536..9ff0e71 100644
--- 
a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/JamesMailCmdHandler.java
+++ 
b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/JamesMailCmdHandler.java
@@ -42,7 +42,7 @@ public class JamesMailCmdHandler extends MailCmdHandler {
     @Override
     public String getDefaultDomain() {
         try {
-            return domainList.getDefaultDomain();
+            return domainList.getDefaultDomain().name();
         } catch (DomainListException e) {
             return super.getDefaultDomain();
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/JamesRcptCmdHandler.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/JamesRcptCmdHandler.java
 
b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/JamesRcptCmdHandler.java
index 70abba4..1ec3a2f 100644
--- 
a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/JamesRcptCmdHandler.java
+++ 
b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/JamesRcptCmdHandler.java
@@ -43,7 +43,7 @@ public class JamesRcptCmdHandler extends RcptCmdHandler {
     @Override
     public String getDefaultDomain() {
         try {
-            return domainList.getDefaultDomain();
+            return domainList.getDefaultDomain().name();
         } catch (DomainListException e) {
             return super.getDefaultDomain();
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/SenderAuthIdentifyVerificationRcptHook.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/SenderAuthIdentifyVerificationRcptHook.java
 
b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/SenderAuthIdentifyVerificationRcptHook.java
index d261810..db00d42 100644
--- 
a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/SenderAuthIdentifyVerificationRcptHook.java
+++ 
b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/SenderAuthIdentifyVerificationRcptHook.java
@@ -22,6 +22,7 @@ import javax.inject.Inject;
 
 import org.apache.commons.configuration.Configuration;
 import org.apache.commons.configuration.ConfigurationException;
+import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.domainlist.api.DomainListException;
@@ -73,7 +74,7 @@ public class SenderAuthIdentifyVerificationRcptHook extends 
AbstractSenderAuthId
     }
 
     @Override
-    protected boolean isLocalDomain(String domain) {
+    protected boolean isLocalDomain(Domain domain) {
         try {
             return domains.containsDomain(domain);
         } catch (DomainListException e) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/fastfail/ValidRcptHandler.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/fastfail/ValidRcptHandler.java
 
b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/fastfail/ValidRcptHandler.java
index e348c6d..3a1cdf8 100644
--- 
a/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/fastfail/ValidRcptHandler.java
+++ 
b/server/protocols/protocols-smtp/src/main/java/org/apache/james/smtpserver/fastfail/ValidRcptHandler.java
@@ -22,6 +22,7 @@ import javax.inject.Inject;
 
 import org.apache.commons.configuration.Configuration;
 import org.apache.commons.configuration.ConfigurationException;
+import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.domainlist.api.DomainListException;
@@ -111,7 +112,7 @@ public class ValidRcptHandler extends 
AbstractValidRcptHandler implements Protoc
                     LOGGER.debug("Unknown user {} check if it's an alias", 
username);
 
                     try {
-                        Mappings targetString = 
vut.getMappings(recipient.getLocalPart(), recipient.getDomain());
+                        Mappings targetString = 
vut.getMappings(recipient.getLocalPart(), Domain.of(recipient.getDomain()));
 
                         if (targetString != null && !targetString.isEmpty()) {
                             return true;
@@ -136,7 +137,7 @@ public class ValidRcptHandler extends 
AbstractValidRcptHandler implements Protoc
     @Override
     protected boolean isLocalDomain(SMTPSession session, String domain) {
         try {
-            return domains.containsDomain(domain);
+            return domains.containsDomain(Domain.of(domain));
         } catch (DomainListException e) {
             LOGGER.error("Unable to get domains", e);
             return false;

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java
 
b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java
index 366ac25..e9f6d1a 100644
--- 
a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java
+++ 
b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java
@@ -43,6 +43,7 @@ import org.apache.commons.net.ProtocolCommandEvent;
 import org.apache.commons.net.ProtocolCommandListener;
 import org.apache.commons.net.smtp.SMTPClient;
 import org.apache.commons.net.smtp.SMTPReply;
+import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.james.dnsservice.api.DNSService;
 import org.apache.james.domainlist.api.DomainList;
@@ -233,7 +234,7 @@ public class SMTPServerTest {
         queue = queueFactory.createQueue(MailQueueFactory.SPOOL);
         chain.put("mailqueuefactory", MailQueueFactory.class, queueFactory);
         MemoryDomainList domainList = new 
MemoryDomainList(mock(DNSService.class));
-        domainList.addDomain("localhost");
+        domainList.addDomain(Domain.of("localhost"));
         chain.put("domainlist", DomainList.class, domainList);
         
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/ValidRcptHandlerTest.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/ValidRcptHandlerTest.java
 
b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/ValidRcptHandlerTest.java
index 85fb7ab..88755b6 100644
--- 
a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/ValidRcptHandlerTest.java
+++ 
b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/ValidRcptHandlerTest.java
@@ -26,6 +26,7 @@ import java.io.ByteArrayInputStream;
 import java.util.HashMap;
 
 import org.apache.commons.configuration.DefaultConfigurationBuilder;
+import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.james.dnsservice.api.DNSService;
 import org.apache.james.domainlist.api.DomainList;
@@ -46,7 +47,7 @@ import org.junit.Test;
 
 public class ValidRcptHandlerTest {
 
-    private static final String VALID_DOMAIN = "localhost";
+    private static final Domain VALID_DOMAIN = Domain.of("localhost");
     private static final String VALID_USER = "postmaster";
     private static final String INVALID_USER = "invalid";
     private static final String USER1 = "user1";
@@ -115,8 +116,8 @@ public class ValidRcptHandlerTest {
     private RecipientRewriteTable setUpRecipientRewriteTable(DomainList 
domainList) throws RecipientRewriteTableException {
         MemoryRecipientRewriteTable memoryRecipientRewriteTable = new 
MemoryRecipientRewriteTable();
         memoryRecipientRewriteTable.setDomainList(domainList);
-        memoryRecipientRewriteTable.addAddressMapping(USER1, "localhost", 
"address");
-        memoryRecipientRewriteTable.addErrorMapping(USER2, "localhost", "554 
BOUNCE");
+        memoryRecipientRewriteTable.addAddressMapping(USER1, 
Domain.of("localhost"), "address");
+        memoryRecipientRewriteTable.addErrorMapping(USER2, 
Domain.of("localhost"), "554 BOUNCE");
         return memoryRecipientRewriteTable;
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/DomainsRoutes.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/DomainsRoutes.java
 
b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/DomainsRoutes.java
index 8438279..673ec80 100644
--- 
a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/DomainsRoutes.java
+++ 
b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/DomainsRoutes.java
@@ -22,6 +22,7 @@ package org.apache.james.webadmin.routes;
 import static org.apache.james.webadmin.Constants.SEPARATOR;
 
 import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.inject.Inject;
 import javax.ws.rs.DELETE;
@@ -30,6 +31,7 @@ import javax.ws.rs.PUT;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 
+import org.apache.james.core.Domain;
 import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.domainlist.api.DomainListException;
 import org.apache.james.webadmin.Constants;
@@ -42,8 +44,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Preconditions;
-import com.google.common.base.Strings;
-
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -146,14 +146,15 @@ public class DomainsRoutes implements Routes {
     })
     public void defineGetDomains() {
         service.get(DOMAINS,
-            (request, response) -> domainList.getDomains(),
+            (request, response) ->
+                
domainList.getDomains().stream().map(Domain::name).collect(Collectors.toList()),
             jsonTransformer);
     }
 
     private String removeDomain(Request request, Response response) {
         try {
-            String domain = request.params(DOMAIN_NAME);
-            removeDomain(domain);
+            Domain domain = checkValidDomain(request);
+            domainList.removeDomain(domain);
         } catch (DomainListException e) {
             LOGGER.info("{} did not exists", request.params(DOMAIN_NAME));
         }
@@ -161,22 +162,17 @@ public class DomainsRoutes implements Routes {
         return Constants.EMPTY_BODY;
     }
 
-    private void removeDomain(String domain) throws DomainListException {
-        Preconditions.checkArgument(!Strings.isNullOrEmpty(domain));
-        domainList.removeDomain(domain);
-    }
-
     private String addDomain(Request request, Response response) {
-        String domainName = request.params(DOMAIN_NAME);
+        Domain domain = checkValidDomain(request);
         try {
-            addDomain(domainName);
+            addDomain(domain);
             response.status(204);
         } catch (DomainListException e) {
-            LOGGER.info("{} already exists", domainName);
+            LOGGER.info("{} already exists", domain);
             throw ErrorResponder.builder()
                 .statusCode(HttpStatus.NO_CONTENT_204)
                 .type(ErrorType.INVALID_ARGUMENT)
-                .message(domainName + " already exists")
+                .message(domain.name() + " already exists")
                 .cause(e)
                 .haltError();
         } catch (IllegalArgumentException e) {
@@ -184,31 +180,43 @@ public class DomainsRoutes implements Routes {
             throw ErrorResponder.builder()
                 .statusCode(HttpStatus.BAD_REQUEST_400)
                 .type(ErrorType.INVALID_ARGUMENT)
-                .message("Invalid request for domain creation " + domainName)
+                .message("Invalid request for domain creation " + 
domain.name())
                 .cause(e)
                 .haltError();
         }
         return Constants.EMPTY_BODY;
     }
 
-    private void addDomain(String domain) throws DomainListException {
-        Preconditions.checkArgument(!Strings.isNullOrEmpty(domain));
-        Preconditions.checkArgument(!domain.contains("@"));
-        Preconditions.checkArgument(domain.length() < MAXIMUM_DOMAIN_SIZE);
+    private Domain checkValidDomain(Request request) {
+        String domainName = request.params(DOMAIN_NAME);
+        try {
+            return Domain.of(domainName);
+        } catch (IllegalArgumentException e) {
+            throw ErrorResponder.builder()
+                .statusCode(HttpStatus.BAD_REQUEST_400)
+                .type(ErrorType.INVALID_ARGUMENT)
+                .message("Invalid request for domain creation " + domainName)
+                .cause(e)
+                .haltError();
+        }
+    }
+
+    private void addDomain(Domain domain) throws DomainListException {
+        Preconditions.checkArgument(domain.name().length() < 
MAXIMUM_DOMAIN_SIZE);
         domainList.addDomain(domain);
     }
 
-    private String exists(Request request, Response response) throws 
DomainListException {
-        String domainName = request.params(DOMAIN_NAME);
-        if (!domainList.containsDomain(domainName)) {
+    private Response exists(Request request, Response response) throws 
DomainListException {
+        Domain domain = checkValidDomain(request);
+        if (!domainList.containsDomain(domain)) {
             throw ErrorResponder.builder()
                 .statusCode(HttpStatus.NOT_FOUND_404)
                 .type(ErrorType.INVALID_ARGUMENT)
-                .message("The domain list does not contain: " + domainName)
+                .message("The domain list does not contain: " + domain.name())
                 .haltError();
         } else {
             response.status(HttpStatus.NO_CONTENT_204);
+            return response;
         }
-        return Constants.EMPTY_BODY;
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/GroupsRoutes.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/GroupsRoutes.java
 
b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/GroupsRoutes.java
index d4987b4..0817f16 100644
--- 
a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/GroupsRoutes.java
+++ 
b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/GroupsRoutes.java
@@ -38,6 +38,7 @@ import javax.ws.rs.PUT;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 
+import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.domainlist.api.DomainListException;
@@ -61,7 +62,6 @@ import org.slf4j.LoggerFactory;
 import com.github.steveash.guavate.Guavate;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableSortedSet;
-
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -154,19 +154,20 @@ public class GroupsRoutes implements Routes {
     })
     public HaltException addToGroup(Request request, Response response) throws 
JsonExtractException, AddressException, RecipientRewriteTableException, 
UsersRepositoryException, DomainListException {
         MailAddress groupAddress = 
parseMailAddress(request.params(GROUP_ADDRESS));
-        ensureRegisteredDomain(groupAddress.getDomain());
+        Domain domain = Domain.of(groupAddress.getDomain());
+        ensureRegisteredDomain(domain);
         ensureNotShadowingAnotherAddress(groupAddress);
         MailAddress userAddress = 
parseMailAddress(request.params(USER_ADDRESS));
-        recipientRewriteTable.addAddressMapping(groupAddress.getLocalPart(), 
groupAddress.getDomain(), userAddress.asString());
+        recipientRewriteTable.addAddressMapping(groupAddress.getLocalPart(), 
domain, userAddress.asString());
         return halt(HttpStatus.CREATED_201);
     }
 
-    private void ensureRegisteredDomain(String domain) throws 
DomainListException {
+    private void ensureRegisteredDomain(Domain domain) throws 
DomainListException {
         if (!domainList.containsDomain(domain)) {
             throw ErrorResponder.builder()
                 .statusCode(HttpStatus.FORBIDDEN_403)
                 .type(ErrorType.INVALID_ARGUMENT)
-                .message("Server doesn't own the domain: " + domain)
+                .message("Server doesn't own the domain: " + domain.name())
                 .haltError();
         }
     }
@@ -199,7 +200,10 @@ public class GroupsRoutes implements Routes {
     public HaltException removeFromGroup(Request request, Response response) 
throws JsonExtractException, AddressException, RecipientRewriteTableException {
         MailAddress groupAddress = 
parseMailAddress(request.params(GROUP_ADDRESS));
         MailAddress userAddress = 
parseMailAddress(request.params(USER_ADDRESS));
-        
recipientRewriteTable.removeAddressMapping(groupAddress.getLocalPart(), 
groupAddress.getDomain(), userAddress.asString());
+        recipientRewriteTable.removeAddressMapping(
+            groupAddress.getLocalPart(),
+            Domain.of(groupAddress.getDomain()),
+            userAddress.asString());
         return halt(HttpStatus.OK_200);
     }
 
@@ -218,7 +222,7 @@ public class GroupsRoutes implements Routes {
     })
     public ImmutableSortedSet<String> listGroupMembers(Request request, 
Response response) throws RecipientRewriteTable.ErrorMappingException, 
RecipientRewriteTableException {
         MailAddress groupAddress = 
parseMailAddress(request.params(GROUP_ADDRESS));
-        Mappings mappings = 
recipientRewriteTable.getMappings(groupAddress.getLocalPart(), 
groupAddress.getDomain());
+        Mappings mappings = 
recipientRewriteTable.getMappings(groupAddress.getLocalPart(), 
Domain.of(groupAddress.getDomain()));
 
         ensureNonEmptyMappings(mappings);
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainsRoutesTest.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainsRoutesTest.java
 
b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainsRoutesTest.java
index 683fc91..1925284 100644
--- 
a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainsRoutesTest.java
+++ 
b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainsRoutesTest.java
@@ -34,6 +34,7 @@ import java.net.InetAddress;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.james.core.Domain;
 import org.apache.james.dnsservice.api.DNSService;
 import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.domainlist.api.DomainListException;
@@ -50,7 +51,6 @@ import org.junit.runner.RunWith;
 
 import com.jayway.restassured.RestAssured;
 import com.jayway.restassured.http.ContentType;
-
 import de.bechte.junit.runners.context.HierarchicalContextRunner;
 
 @RunWith(HierarchicalContextRunner.class)
@@ -260,13 +260,13 @@ public class DomainsRoutesTest {
     public class ExceptionHandling {
 
         private DomainList domainList;
-        private String domain;
+        private Domain domain;
 
         @Before
         public void setUp() throws Exception {
             domainList = mock(DomainList.class);
             createServer(domainList);
-            domain = "domain";
+            domain = Domain.of("domain");
         }
 
         @Test

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/GroupsRoutesTest.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/GroupsRoutesTest.java
 
b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/GroupsRoutesTest.java
index fee6ba0..33bba7c 100644
--- 
a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/GroupsRoutesTest.java
+++ 
b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/GroupsRoutesTest.java
@@ -26,6 +26,7 @@ import static 
org.apache.james.webadmin.WebAdminServer.NO_CONFIGURATION;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.CoreMatchers.is;
+import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyString;
 import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.mock;
@@ -33,6 +34,7 @@ import static org.mockito.Mockito.mock;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.james.core.Domain;
 import org.apache.james.dnsservice.api.DNSService;
 import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.domainlist.api.DomainListException;
@@ -57,21 +59,20 @@ import org.mockito.Mockito;
 import com.jayway.restassured.RestAssured;
 import com.jayway.restassured.filter.log.LogDetail;
 import com.jayway.restassured.http.ContentType;
-
 import de.bechte.junit.runners.context.HierarchicalContextRunner;
 
 @RunWith(HierarchicalContextRunner.class)
 public class GroupsRoutesTest {
 
-    private static final String DOMAIN = "b.com";
-    private static final String GROUP1 = "group1" + "@" + DOMAIN;
-    private static final String GROUP2 = "group2" + "@" + DOMAIN;
-    private static final String GROUP_WITH_SLASH = "group10/10" + "@" + DOMAIN;
-    private static final String GROUP_WITH_ENCODED_SLASH = "group10%2F10" + 
"@" + DOMAIN;
-    private static final String USER_A = "a" + "@" + DOMAIN;
-    private static final String USER_B = "b" + "@" + DOMAIN;
-    private static final String USER_WITH_SLASH = "user/@" + DOMAIN;
-    private static final String USER_WITH_ENCODED_SLASH = "user%2F@" + DOMAIN;
+    private static final Domain DOMAIN = Domain.of("b.com");
+    private static final String GROUP1 = "group1" + "@" + DOMAIN.name();
+    private static final String GROUP2 = "group2" + "@" + DOMAIN.name();
+    private static final String GROUP_WITH_SLASH = "group10/10" + "@" + 
DOMAIN.name();
+    private static final String GROUP_WITH_ENCODED_SLASH = "group10%2F10" + 
"@" + DOMAIN.name();
+    private static final String USER_A = "a" + "@" + DOMAIN.name();
+    private static final String USER_B = "b" + "@" + DOMAIN.name();
+    private static final String USER_WITH_SLASH = "user/@" + DOMAIN.name();
+    private static final String USER_WITH_ENCODED_SLASH = "user%2F@" + 
DOMAIN.name();
 
     private WebAdminServer webAdminServer;
 
@@ -372,7 +373,7 @@ public class GroupsRoutesTest {
             super.setUp();
             memoryRecipientRewriteTable.addErrorMapping("error", DOMAIN, 
"disabled");
             memoryRecipientRewriteTable.addRegexMapping("regex", DOMAIN, 
".*@b\\.com");
-            memoryRecipientRewriteTable.addAliasDomainMapping("alias", DOMAIN);
+            
memoryRecipientRewriteTable.addAliasDomainMapping(Domain.of("alias"), DOMAIN);
 
         }
 
@@ -387,7 +388,7 @@ public class GroupsRoutesTest {
             memoryRecipientRewriteTable = mock(RecipientRewriteTable.class);
             UsersRepository userRepository = mock(UsersRepository.class);
             DomainList domainList = mock(DomainList.class);
-            
Mockito.when(domainList.containsDomain(anyString())).thenReturn(true);
+            Mockito.when(domainList.containsDomain(any())).thenReturn(true);
             createServer(new GroupsRoutes(memoryRecipientRewriteTable, 
userRepository, domainList, new JsonTransformer()));
         }
 
@@ -526,7 +527,7 @@ public class GroupsRoutesTest {
         public void 
putShouldReturnErrorWhenRecipientRewriteTableExceptionIsThrown() throws 
Exception {
             doThrow(RecipientRewriteTableException.class)
                 .when(memoryRecipientRewriteTable)
-                .addAddressMapping(anyString(), anyString(), anyString());
+                .addAddressMapping(anyString(), any(), anyString());
 
             when()
                 .put(GROUP1 + SEPARATOR + GROUP2)
@@ -539,7 +540,7 @@ public class GroupsRoutesTest {
         public void putShouldReturnErrorWhenErrorMappingExceptionIsThrown() 
throws Exception {
             doThrow(RecipientRewriteTable.ErrorMappingException.class)
                 .when(memoryRecipientRewriteTable)
-                .addAddressMapping(anyString(), anyString(), anyString());
+                .addAddressMapping(anyString(), any(), anyString());
 
             when()
                 .put(GROUP1 + SEPARATOR + GROUP2)
@@ -552,7 +553,7 @@ public class GroupsRoutesTest {
         public void putShouldReturnErrorWhenRuntimeExceptionIsThrown() throws 
Exception {
             doThrow(RuntimeException.class)
                 .when(memoryRecipientRewriteTable)
-                .addAddressMapping(anyString(), anyString(), anyString());
+                .addAddressMapping(anyString(), any(), anyString());
 
             when()
                 .put(GROUP1 + SEPARATOR + GROUP2)
@@ -604,7 +605,7 @@ public class GroupsRoutesTest {
         public void 
deleteShouldReturnErrorWhenRecipientRewriteTableExceptionIsThrown() throws 
Exception {
             doThrow(RecipientRewriteTableException.class)
                 .when(memoryRecipientRewriteTable)
-                .removeAddressMapping(anyString(), anyString(), anyString());
+                .removeAddressMapping(anyString(), any(), anyString());
 
             when()
                 .delete(GROUP1 + SEPARATOR + GROUP2)
@@ -617,7 +618,7 @@ public class GroupsRoutesTest {
         public void deleteShouldReturnErrorWhenErrorMappingExceptionIsThrown() 
throws Exception {
             doThrow(RecipientRewriteTable.ErrorMappingException.class)
                 .when(memoryRecipientRewriteTable)
-                .removeAddressMapping(anyString(), anyString(), anyString());
+                .removeAddressMapping(anyString(), any(), anyString());
 
             when()
                 .delete(GROUP1 + SEPARATOR + GROUP2)
@@ -630,7 +631,7 @@ public class GroupsRoutesTest {
         public void deleteShouldReturnErrorWhenRuntimeExceptionIsThrown() 
throws Exception {
             doThrow(RuntimeException.class)
                 .when(memoryRecipientRewriteTable)
-                .removeAddressMapping(anyString(), anyString(), anyString());
+                .removeAddressMapping(anyString(), any(), anyString());
 
             when()
                 .delete(GROUP1 + SEPARATOR + GROUP2)
@@ -643,7 +644,7 @@ public class GroupsRoutesTest {
         public void 
getShouldReturnErrorWhenRecipientRewriteTableExceptionIsThrown() throws 
Exception {
             doThrow(RecipientRewriteTableException.class)
                 .when(memoryRecipientRewriteTable)
-                .getMappings(anyString(), anyString());
+                .getMappings(anyString(), any());
 
             when()
                 .get(GROUP1)
@@ -656,7 +657,7 @@ public class GroupsRoutesTest {
         public void getShouldReturnErrorWhenErrorMappingExceptionIsThrown() 
throws Exception {
             doThrow(RecipientRewriteTable.ErrorMappingException.class)
                 .when(memoryRecipientRewriteTable)
-                .getMappings(anyString(), anyString());
+                .getMappings(anyString(), any());
 
             when()
                 .get(GROUP1)
@@ -669,7 +670,7 @@ public class GroupsRoutesTest {
         public void getShouldReturnErrorWhenRuntimeExceptionIsThrown() throws 
Exception {
             doThrow(RuntimeException.class)
                 .when(memoryRecipientRewriteTable)
-                .getMappings(anyString(), anyString());
+                .getMappings(anyString(), any());
 
             when()
                 .get(GROUP1)

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UsersRoutesTest.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UsersRoutesTest.java
 
b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UsersRoutesTest.java
index 028a198..a9349a2 100644
--- 
a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UsersRoutesTest.java
+++ 
b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UsersRoutesTest.java
@@ -32,6 +32,7 @@ import static org.mockito.Mockito.when;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.james.core.Domain;
 import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.metrics.logger.DefaultMetricFactory;
 import org.apache.james.user.api.UsersRepository;
@@ -57,8 +58,8 @@ import 
de.bechte.junit.runners.context.HierarchicalContextRunner;
 @RunWith(HierarchicalContextRunner.class)
 public class UsersRoutesTest {
 
-    public static final String DOMAIN = "domain";
-    public static final String USERNAME = "username@" + DOMAIN;
+    public static final Domain DOMAIN = Domain.of("domain");
+    public static final String USERNAME = "username@" + DOMAIN.name();
     private WebAdminServer webAdminServer;
 
     private void createServer(UsersRepository usersRepository) throws 
Exception {

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/DomainQuotaRoutes.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/DomainQuotaRoutes.java
 
b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/DomainQuotaRoutes.java
index d02fd8a..a73c5d1 100644
--- 
a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/DomainQuotaRoutes.java
+++ 
b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/DomainQuotaRoutes.java
@@ -30,6 +30,7 @@ import javax.ws.rs.PUT;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 
+import org.apache.james.core.Domain;
 import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.domainlist.api.DomainListException;
 import org.apache.james.mailbox.quota.QuotaCount;
@@ -123,7 +124,7 @@ public class DomainQuotaRoutes implements Routes {
     })
     public void defineUpdateQuota() {
         service.put(QUOTA_ENDPOINT, ((request, response) -> {
-            String domain = checkDomainExist(request);
+            Domain domain = checkDomainExist(request);
             QuotaDTO quotaDTO = parseQuotaDTO(request);
             domainQuotaService.defineQuota(domain, quotaDTO);
             response.status(HttpStatus.NO_CONTENT_204);
@@ -144,7 +145,7 @@ public class DomainQuotaRoutes implements Routes {
     })
     public void defineGetQuota() {
         service.get(QUOTA_ENDPOINT, (request, response) -> {
-            String domain = checkDomainExist(request);
+            Domain domain = checkDomainExist(request);
             return domainQuotaService.getQuota(domain);
         }, jsonTransformer);
     }
@@ -160,7 +161,7 @@ public class DomainQuotaRoutes implements Routes {
     })
     public void defineDeleteQuotaSize() {
         service.delete(SIZE_ENDPOINT, (request, response) -> {
-            String domain = checkDomainExist(request);
+            Domain domain = checkDomainExist(request);
             domainQuotaService.remoteMaxQuotaSize(domain);
             response.status(HttpStatus.NO_CONTENT_204);
             return response;
@@ -183,7 +184,7 @@ public class DomainQuotaRoutes implements Routes {
     })
     public void defineUpdateQuotaSize() {
         service.put(SIZE_ENDPOINT, (request, response) -> {
-            String domain = checkDomainExist(request);
+            Domain domain = checkDomainExist(request);
             QuotaSize quotaSize = Quotas.quotaSize(request.body());
             domainQuotaService.setMaxSizeQuota(domain, quotaSize);
             response.status(HttpStatus.NO_CONTENT_204);
@@ -203,7 +204,7 @@ public class DomainQuotaRoutes implements Routes {
     })
     public void defineGetQuotaSize() {
         service.get(SIZE_ENDPOINT, (request, response) -> {
-            String domain = checkDomainExist(request);
+            Domain domain = checkDomainExist(request);
             Optional<QuotaSize> maxSizeQuota = 
domainQuotaService.getMaxSizeQuota(domain);
             if (maxSizeQuota.isPresent()) {
                 return maxSizeQuota;
@@ -224,7 +225,7 @@ public class DomainQuotaRoutes implements Routes {
     })
     public void defineDeleteQuotaCount() {
         service.delete(COUNT_ENDPOINT, (request, response) -> {
-            String domain = checkDomainExist(request);
+            Domain domain = checkDomainExist(request);
             domainQuotaService.remoteMaxQuotaCount(domain);
             response.status(HttpStatus.NO_CONTENT_204);
             return response;
@@ -247,7 +248,7 @@ public class DomainQuotaRoutes implements Routes {
     })
     public void defineUpdateQuotaCount() {
         service.put(COUNT_ENDPOINT, (request, response) -> {
-            String domain = checkDomainExist(request);
+            Domain domain = checkDomainExist(request);
             QuotaCount quotaCount = Quotas.quotaCount(request.body());
             domainQuotaService.setMaxCountQuota(domain, quotaCount);
             response.status(HttpStatus.NO_CONTENT_204);
@@ -266,7 +267,7 @@ public class DomainQuotaRoutes implements Routes {
     })
     public void defineGetQuotaCount() {
         service.get(COUNT_ENDPOINT, (request, response) -> {
-            String domain = checkDomainExist(request);
+            Domain domain = checkDomainExist(request);
             Optional<QuotaCount> maxCountQuota = 
domainQuotaService.getMaxCountQuota(domain);
             if (maxCountQuota.isPresent()) {
                 return maxCountQuota;
@@ -276,7 +277,7 @@ public class DomainQuotaRoutes implements Routes {
         }, jsonTransformer);
     }
 
-    private String checkDomainExist(Request request) {
+    private Domain checkDomainExist(Request request) {
         if (!isVirtualHostingSupported()) {
             throw ErrorResponder.builder()
                 .statusCode(HttpStatus.METHOD_NOT_ALLOWED_405)
@@ -284,8 +285,8 @@ public class DomainQuotaRoutes implements Routes {
                 .message("Domain Quota configuration not supported when 
virtual hosting is desactivated. Please use global quota configuration instead")
                 .haltError();
         }
-        String domain = request.params(DOMAIN);
         try {
+            Domain domain = Domain.of(request.params(DOMAIN));
             if (!domainList.containsDomain(domain)) {
                 throw ErrorResponder.builder()
                     .statusCode(HttpStatus.NOT_FOUND_404)
@@ -293,14 +294,21 @@ public class DomainQuotaRoutes implements Routes {
                     .message("Domain not found")
                     .haltError();
             }
+            return domain;
         } catch (DomainListException e) {
             throw ErrorResponder.builder()
                 .statusCode(HttpStatus.NOT_FOUND_404)
                 .type(ErrorType.NOT_FOUND)
                 .cause(e)
                 .haltError();
+        } catch (IllegalArgumentException e) {
+            throw ErrorResponder.builder()
+                .statusCode(HttpStatus.BAD_REQUEST_400)
+                .type(ErrorType.INVALID_ARGUMENT)
+                .message("Invalid domain")
+                .cause(e)
+                .haltError();
         }
-        return domain;
     }
 
     private QuotaDTO parseQuotaDTO(Request request) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/DomainQuotaService.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/DomainQuotaService.java
 
b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/DomainQuotaService.java
index 35a10ff..08b75e4 100644
--- 
a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/DomainQuotaService.java
+++ 
b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/DomainQuotaService.java
@@ -23,6 +23,7 @@ import java.util.Optional;
 
 import javax.inject.Inject;
 
+import org.apache.james.core.Domain;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.quota.MaxQuotaManager;
 import org.apache.james.mailbox.quota.QuotaCount;
@@ -40,31 +41,31 @@ public class DomainQuotaService {
         this.maxQuotaManager = maxQuotaManager;
     }
 
-    public Optional<QuotaCount> getMaxCountQuota(String domain) {
+    public Optional<QuotaCount> getMaxCountQuota(Domain domain) {
         return maxQuotaManager.getDomainMaxMessage(domain);
     }
 
-    public void setMaxCountQuota(String domain, QuotaCount quotaCount) throws 
MailboxException {
+    public void setMaxCountQuota(Domain domain, QuotaCount quotaCount) throws 
MailboxException {
         maxQuotaManager.setDomainMaxMessage(domain, quotaCount);
     }
 
-    public void remoteMaxQuotaCount(String domain) throws MailboxException {
+    public void remoteMaxQuotaCount(Domain domain) throws MailboxException {
         maxQuotaManager.removeDomainMaxMessage(domain);
     }
 
-    public Optional<QuotaSize> getMaxSizeQuota(String domain) {
+    public Optional<QuotaSize> getMaxSizeQuota(Domain domain) {
         return maxQuotaManager.getDomainMaxStorage(domain);
     }
 
-    public void setMaxSizeQuota(String domain, QuotaSize quotaSize) throws 
MailboxException {
+    public void setMaxSizeQuota(Domain domain, QuotaSize quotaSize) throws 
MailboxException {
         maxQuotaManager.setDomainMaxStorage(domain, quotaSize);
     }
 
-    public void remoteMaxQuotaSize(String domain) throws MailboxException {
+    public void remoteMaxQuotaSize(Domain domain) throws MailboxException {
         maxQuotaManager.removeDomainMaxStorage(domain);
     }
 
-    public QuotaDTO getQuota(String domain) {
+    public QuotaDTO getQuota(Domain domain) {
         return QuotaDTO
             .builder()
             .count(maxQuotaManager.getDomainMaxMessage(domain))
@@ -72,7 +73,7 @@ public class DomainQuotaService {
             .build();
     }
 
-    public void defineQuota(String domain, QuotaDTO quota) {
+    public void defineQuota(Domain domain, QuotaDTO quota) {
         quota.getCount()
             .ifPresent(Throwing.consumer(count -> 
maxQuotaManager.setDomainMaxMessage(domain, count)));
         quota.getSize()

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/DomainQuotaRoutesNoVirtualHostingTest.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/DomainQuotaRoutesNoVirtualHostingTest.java
 
b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/DomainQuotaRoutesNoVirtualHostingTest.java
index 66f9062..ddb89b7 100644
--- 
a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/DomainQuotaRoutesNoVirtualHostingTest.java
+++ 
b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/DomainQuotaRoutesNoVirtualHostingTest.java
@@ -24,6 +24,7 @@ import static 
org.apache.james.webadmin.WebAdminServer.NO_CONFIGURATION;
 
 import java.util.Collection;
 
+import org.apache.james.core.Domain;
 import org.apache.james.dnsservice.api.InMemoryDNSService;
 import org.apache.james.domainlist.memory.MemoryDomainList;
 import org.apache.james.mailbox.inmemory.quota.InMemoryPerUserMaxQuotaManager;
@@ -70,14 +71,13 @@ public class DomainQuotaRoutesNoVirtualHostingTest {
     @Before
     public void setUp() throws Exception {
         InMemoryPerUserMaxQuotaManager maxQuotaManager = new 
InMemoryPerUserMaxQuotaManager();
-        MemoryDomainList domainList = new MemoryDomainList(new 
InMemoryDNSService());
-        domainList.setAutoDetect(false);
-        domainList.setAutoDetectIP(false);
-        domainList.addDomain(FOUND_COM);
+        MemoryDomainList memoryDomainList = new MemoryDomainList(new 
InMemoryDNSService());
+        memoryDomainList.setAutoDetect(false);
+        memoryDomainList.addDomain(Domain.of(FOUND_COM));
         DomainQuotaService domainQuotaService = new 
DomainQuotaService(maxQuotaManager);
         QuotaModule quotaModule = new QuotaModule();
         MemoryUsersRepository usersRepository = 
MemoryUsersRepository.withoutVirtualHosting();
-        DomainQuotaRoutes domainQuotaRoutes = new 
DomainQuotaRoutes(domainList, domainQuotaService, usersRepository, new 
JsonTransformer(quotaModule), ImmutableSet.of(quotaModule));
+        DomainQuotaRoutes domainQuotaRoutes = new 
DomainQuotaRoutes(memoryDomainList, domainQuotaService, usersRepository, new 
JsonTransformer(quotaModule), ImmutableSet.of(quotaModule));
         webAdminServer = WebAdminUtils.createWebAdminServer(
             new NoopMetricFactory(),
             domainQuotaRoutes);


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

Reply via email to