http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/data/data-library/src/main/java/org/apache/james/domainlist/lib/DomainListManagement.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-library/src/main/java/org/apache/james/domainlist/lib/DomainListManagement.java
 
b/server/data/data-library/src/main/java/org/apache/james/domainlist/lib/DomainListManagement.java
index 023f64b..312ed2b 100644
--- 
a/server/data/data-library/src/main/java/org/apache/james/domainlist/lib/DomainListManagement.java
+++ 
b/server/data/data-library/src/main/java/org/apache/james/domainlist/lib/DomainListManagement.java
@@ -19,16 +19,18 @@
 package org.apache.james.domainlist.lib;
 
 import java.util.List;
+import java.util.Optional;
 
 import javax.inject.Inject;
 import javax.management.NotCompliantMBeanException;
 import javax.management.StandardMBean;
 
+import org.apache.james.core.Domain;
 import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.domainlist.api.DomainListException;
 import org.apache.james.domainlist.api.DomainListManagementMBean;
 
-import com.google.common.collect.ImmutableList;
+import com.github.steveash.guavate.Guavate;
 
 public class DomainListManagement extends StandardMBean implements 
DomainListManagementMBean {
 
@@ -39,14 +41,14 @@ public class DomainListManagement extends StandardMBean 
implements DomainListMan
     }
 
     @Inject
-    public void setDomainList(DomainList domainList) {
+    public void setDomainList(DomainList domainList) {
         this.domainList = domainList;
     }
 
     @Override
     public void addDomain(String domain) throws Exception {
         try {
-            domainList.addDomain(domain);
+            domainList.addDomain(Domain.of(domain));
         } catch (DomainListException e) {
             throw new Exception(e.getMessage());
         }
@@ -55,7 +57,7 @@ public class DomainListManagement extends StandardMBean 
implements DomainListMan
     @Override
     public boolean containsDomain(String domain) throws Exception {
         try {
-            return domainList.containsDomain(domain);
+            return domainList.containsDomain(Domain.of(domain));
         } catch (DomainListException e) {
             throw new Exception(e.getMessage());
         }
@@ -64,7 +66,10 @@ public class DomainListManagement extends StandardMBean 
implements DomainListMan
     @Override
     public List<String> getDomains() throws Exception {
         try {
-            return ImmutableList.copyOf(domainList.getDomains());
+            return domainList.getDomains()
+                .stream()
+                .map(Domain::name)
+                .collect(Guavate.toImmutableList());
         } catch (DomainListException e) {
             throw new Exception(e.getMessage());
         }
@@ -73,7 +78,7 @@ public class DomainListManagement extends StandardMBean 
implements DomainListMan
     @Override
     public void removeDomain(String domain) throws Exception {
         try {
-            domainList.removeDomain(domain);
+            domainList.removeDomain(Domain.of(domain));
         } catch (DomainListException e) {
             throw new Exception(e.getMessage());
         }
@@ -82,7 +87,7 @@ public class DomainListManagement extends StandardMBean 
implements DomainListMan
     @Override
     public String getDefaultDomain() throws Exception {
         try {
-            return domainList.getDefaultDomain();
+            return 
Optional.ofNullable(domainList.getDefaultDomain()).map(Domain::name).orElse(null);
         } catch (DomainListException e) {
             throw new Exception(e.getMessage());
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/data/data-library/src/main/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTable.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-library/src/main/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTable.java
 
b/server/data/data-library/src/main/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTable.java
index ff8af77..d1d178a 100644
--- 
a/server/data/data-library/src/main/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTable.java
+++ 
b/server/data/data-library/src/main/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTable.java
@@ -20,6 +20,7 @@ package org.apache.james.rrt.lib;
 
 import java.util.Locale;
 import java.util.Map;
+import java.util.Optional;
 import java.util.regex.Pattern;
 import java.util.regex.PatternSyntaxException;
 
@@ -28,6 +29,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.domainlist.api.DomainList;
 import org.apache.james.domainlist.api.DomainListException;
@@ -71,12 +73,8 @@ public abstract class AbstractRecipientRewriteTable 
implements RecipientRewriteT
 
     /**
      * Override to handle config
-     * 
-     * @param conf
-     * @throws ConfigurationException
      */
     protected void doConfigure(HierarchicalConfiguration conf) throws 
ConfigurationException {
-
     }
 
     public void setRecursiveMapping(boolean recursive) {
@@ -99,11 +97,11 @@ public abstract class AbstractRecipientRewriteTable 
implements RecipientRewriteT
     }
 
     @Override
-    public Mappings getMappings(String user, String domain) throws 
ErrorMappingException, RecipientRewriteTableException {
+    public Mappings getMappings(String user, Domain domain) throws 
ErrorMappingException, RecipientRewriteTableException {
         return getMappings(user, domain, mappingLimit);
     }
 
-    public Mappings getMappings(String user, String domain, int mappingLimit) 
throws ErrorMappingException, RecipientRewriteTableException {
+    public Mappings getMappings(String user, Domain domain, int mappingLimit) 
throws ErrorMappingException, RecipientRewriteTableException {
 
         // We have to much mappings throw ErrorMappingException to avoid
         // infinity loop
@@ -123,7 +121,7 @@ public abstract class AbstractRecipientRewriteTable 
implements RecipientRewriteT
                 for (String target : targetMappings.asStrings()) {
                     if (target.startsWith(RecipientRewriteTable.REGEX_PREFIX)) 
{
                         try {
-                            target = RecipientRewriteTableUtil.regexMap(new 
MailAddress(user, domain), target);
+                            target = RecipientRewriteTableUtil.regexMap(new 
MailAddress(user, domain.asString()), target);
                         } catch (PatternSyntaxException | ParseException e) {
                             LOGGER.error("Exception during regexMap 
processing: ", e);
                         }
@@ -135,32 +133,31 @@ public abstract class AbstractRecipientRewriteTable 
implements RecipientRewriteT
                         continue;
                     }
 
-                    String buf = "Valid virtual user mapping " + user + "@" + 
domain + " to " + target;
+                    String buf = "Valid virtual user mapping " + user + "@" + 
domain.name() + " to " + target;
                     LOGGER.debug(buf);
 
                     if (recursive) {
 
                         String userName;
-                        String domainName;
+                        Domain targetDomain;
                         String[] args = target.split("@");
 
-                        if (args != null && args.length > 1) {
-
+                        if (args.length > 1) {
                             userName = args[0];
-                            domainName = args[1];
+                            targetDomain = Domain.of(args[1]);
                         } else {
                             // TODO Is that the right todo here?
                             userName = target;
-                            domainName = domain;
+                            targetDomain = domain;
                         }
 
                         // Check if the returned mapping is the same as the
                         // input. If so return null to avoid loops
-                        if (userName.equalsIgnoreCase(user) && 
domainName.equalsIgnoreCase(domain)) {
+                        if (userName.equalsIgnoreCase(user) && 
targetDomain.equals(domain)) {
                             return null;
                         }
 
-                        Mappings childMappings = getMappings(userName, 
domainName, mappingLimit - 1);
+                        Mappings childMappings = getMappings(userName, 
targetDomain, mappingLimit - 1);
 
                         if (childMappings == null || childMappings.isEmpty()) {
                             // add mapping
@@ -181,7 +178,7 @@ public abstract class AbstractRecipientRewriteTable 
implements RecipientRewriteT
     }
 
     @Override
-    public void addRegexMapping(String user, String domain, String regex) 
throws RecipientRewriteTableException {
+    public void addRegexMapping(String user, Domain domain, String regex) 
throws RecipientRewriteTableException {
         try {
             Pattern.compile(regex);
         } catch (PatternSyntaxException e) {
@@ -189,22 +186,22 @@ public abstract class AbstractRecipientRewriteTable 
implements RecipientRewriteT
         }
 
         checkMapping(user, domain, MappingImpl.regex(regex));
-        LOGGER.info("Add regex mapping => {} for user: {} domain: {}", regex, 
user, domain);
+        LOGGER.info("Add regex mapping => {} for user: {} domain: {}", regex, 
user, domain.name());
         addMappingInternal(user, domain, MappingImpl.regex(regex));
 
     }
 
     @Override
-    public void removeRegexMapping(String user, String domain, String regex) 
throws RecipientRewriteTableException {
-        LOGGER.info("Remove regex mapping => {} for user: {} domain: {}", 
regex, user, domain);
+    public void removeRegexMapping(String user, Domain domain, String regex) 
throws RecipientRewriteTableException {
+        LOGGER.info("Remove regex mapping => {} for user: {} domain: {}", 
regex, user, domain.name());
         removeMappingInternal(user, domain, MappingImpl.regex(regex));
     }
 
     @Override
-    public void addAddressMapping(String user, String domain, String address) 
throws RecipientRewriteTableException {
+    public void addAddressMapping(String user, Domain domain, String address) 
throws RecipientRewriteTableException {
         if (address.indexOf('@') < 0) {
             try {
-                address = address + "@" + domainList.getDefaultDomain();
+                address = address + "@" + 
domainList.getDefaultDomain().asString();
             } catch (DomainListException e) {
                 throw new RecipientRewriteTableException("Unable to retrieve 
default domain", e);
             }
@@ -215,40 +212,40 @@ public abstract class AbstractRecipientRewriteTable 
implements RecipientRewriteT
             throw new RecipientRewriteTableException("Invalid emailAddress: " 
+ address, e);
         }
         checkMapping(user, domain, MappingImpl.address(address));
-        LOGGER.info("Add address mapping => {} for user: {} domain: {}", 
address, user, domain);
+        LOGGER.info("Add address mapping => {} for user: {} domain: {}", 
address, user, domain.name());
         addMappingInternal(user, domain, MappingImpl.address(address));
 
     }
 
     @Override
-    public void removeAddressMapping(String user, String domain, String 
address) throws RecipientRewriteTableException {
+    public void removeAddressMapping(String user, Domain domain, String 
address) throws RecipientRewriteTableException {
         if (address.indexOf('@') < 0) {
             try {
-                address = address + "@" + domainList.getDefaultDomain();
+                address = address + "@" + 
domainList.getDefaultDomain().asString();
             } catch (DomainListException e) {
                 throw new RecipientRewriteTableException("Unable to retrieve 
default domain", e);
             }
         }
-        LOGGER.info("Remove address mapping => {} for user: {} domain: {}", 
address, user, domain);
+        LOGGER.info("Remove address mapping => {} for user: {} domain: {}", 
address, user, domain.name());
         removeMappingInternal(user, domain, MappingImpl.address(address));
     }
 
     @Override
-    public void addErrorMapping(String user, String domain, String error) 
throws RecipientRewriteTableException {
+    public void addErrorMapping(String user, Domain domain, String error) 
throws RecipientRewriteTableException {
         checkMapping(user, domain, MappingImpl.error(error));
-        LOGGER.info("Add error mapping => {} for user: {} domain: {}", error, 
user, domain);
+        LOGGER.info("Add error mapping => {} for user: {} domain: {}", error, 
user, domain.name());
         addMappingInternal(user, domain, MappingImpl.error(error));
 
     }
 
     @Override
-    public void removeErrorMapping(String user, String domain, String error) 
throws RecipientRewriteTableException {
-        LOGGER.info("Remove error mapping => {} for user: {} domain: {}", 
error, user, domain);
+    public void removeErrorMapping(String user, Domain domain, String error) 
throws RecipientRewriteTableException {
+        LOGGER.info("Remove error mapping => {} for user: {} domain: {}", 
error, user, domain.name());
         removeMappingInternal(user, domain, MappingImpl.error(error));
     }
 
     @Override
-    public void addMapping(String user, String domain, String mapping) throws 
RecipientRewriteTableException {
+    public void addMapping(String user, Domain domain, String mapping) throws 
RecipientRewriteTableException {
 
         String map = mapping.toLowerCase(Locale.US);
 
@@ -260,7 +257,8 @@ public abstract class AbstractRecipientRewriteTable 
implements RecipientRewriteT
             if (user != null) {
                 throw new RecipientRewriteTableException("User must be null 
for aliasDomain mappings");
             }
-            addAliasDomainMapping(domain, 
map.substring(RecipientRewriteTable.ALIASDOMAIN_PREFIX.length()));
+            String domainName = 
map.substring(RecipientRewriteTable.ALIASDOMAIN_PREFIX.length());
+            addAliasDomainMapping(domain, Domain.of(domainName));
         } else {
             addAddressMapping(user, domain, map);
         }
@@ -268,7 +266,7 @@ public abstract class AbstractRecipientRewriteTable 
implements RecipientRewriteT
     }
 
     @Override
-    public void removeMapping(String user, String domain, String mapping) 
throws RecipientRewriteTableException {
+    public void removeMapping(String user, Domain domain, String mapping) 
throws RecipientRewriteTableException {
 
         String map = mapping.toLowerCase(Locale.US);
 
@@ -280,7 +278,8 @@ public abstract class AbstractRecipientRewriteTable 
implements RecipientRewriteT
             if (user != null) {
                 throw new RecipientRewriteTableException("User must be null 
for aliasDomain mappings");
             }
-            removeAliasDomainMapping(domain, 
map.substring(RecipientRewriteTable.ALIASDOMAIN_PREFIX.length()));
+            String domainName = 
map.substring(RecipientRewriteTable.ALIASDOMAIN_PREFIX.length());
+            removeAliasDomainMapping(domain, Domain.of(domainName));
         } else {
             removeAddressMapping(user, domain, map);
         }
@@ -300,25 +299,25 @@ public abstract class AbstractRecipientRewriteTable 
implements RecipientRewriteT
     }
 
     @Override
-    public Mappings getUserDomainMappings(String user, String domain) throws 
RecipientRewriteTableException {
+    public Mappings getUserDomainMappings(String user, Domain domain) throws 
RecipientRewriteTableException {
         return getUserDomainMappingsInternal(user, domain);
     }
 
     @Override
-    public void addAliasDomainMapping(String aliasDomain, String realDomain) 
throws RecipientRewriteTableException {
+    public void addAliasDomainMapping(Domain aliasDomain, Domain realDomain) 
throws RecipientRewriteTableException {
         LOGGER.info("Add domain mapping: {} => {}", aliasDomain, realDomain);
         addMappingInternal(null, aliasDomain, MappingImpl.domain(realDomain));
     }
 
     @Override
-    public void removeAliasDomainMapping(String aliasDomain, String 
realDomain) throws RecipientRewriteTableException {
+    public void removeAliasDomainMapping(Domain aliasDomain, Domain 
realDomain) throws RecipientRewriteTableException {
         LOGGER.info("Remove domain mapping: {} => {}", aliasDomain, 
realDomain);
         removeMappingInternal(null, aliasDomain, 
MappingImpl.domain(realDomain));
     }
 
     /**
      * Add new mapping
-     * 
+     *
      * @param user
      *            the user
      * @param domain
@@ -327,7 +326,7 @@ public abstract class AbstractRecipientRewriteTable 
implements RecipientRewriteT
      *            the mapping
      * @throws RecipientRewriteTableException
      */
-    protected abstract void addMappingInternal(String user, String domain, 
Mapping mapping) throws RecipientRewriteTableException;
+    protected abstract void addMappingInternal(String user, Domain domain, 
Mapping mapping) throws RecipientRewriteTableException;
 
     /**
      * Remove mapping
@@ -340,7 +339,7 @@ public abstract class AbstractRecipientRewriteTable 
implements RecipientRewriteT
      *            the mapping
      * @throws RecipientRewriteTableException
      */
-    protected abstract void removeMappingInternal(String user, String domain, 
Mapping mapping) throws RecipientRewriteTableException;
+    protected abstract void removeMappingInternal(String user, Domain domain, 
Mapping mapping) throws RecipientRewriteTableException;
 
     /**
      * Return Collection of all mappings for the given username and domain
@@ -351,7 +350,7 @@ public abstract class AbstractRecipientRewriteTable 
implements RecipientRewriteT
      *            the domain
      * @return Collection which hold the mappings
      */
-    protected abstract Mappings getUserDomainMappingsInternal(String user, 
String domain) throws RecipientRewriteTableException;
+    protected abstract Mappings getUserDomainMappingsInternal(String user, 
Domain domain) throws RecipientRewriteTableException;
 
     /**
      * Return a Map which holds all Mappings
@@ -375,7 +374,7 @@ public abstract class AbstractRecipientRewriteTable 
implements RecipientRewriteT
      *            the mapping of virtual to real recipients, as
      *            <code>MailAddress</code>es to <code>String</code>s.
      */
-    protected abstract String mapAddressInternal(String user, String domain) 
throws RecipientRewriteTableException;
+    protected abstract String mapAddressInternal(String user, Domain domain) 
throws RecipientRewriteTableException;
 
     /**
      * Get all mappings for the given user and domain. If a aliasdomain mapping
@@ -387,7 +386,7 @@ public abstract class AbstractRecipientRewriteTable 
implements RecipientRewriteT
      *            the domain
      * @return the mappings
      */
-    private Mappings mapAddress(String user, String domain) throws 
RecipientRewriteTableException {
+    private Mappings mapAddress(String user, Domain domain) throws 
RecipientRewriteTableException {
 
         String mappings = mapAddressInternal(user, domain);
 
@@ -410,7 +409,7 @@ public abstract class AbstractRecipientRewriteTable 
implements RecipientRewriteT
         }
     }
 
-    private void checkMapping(String user, String domain, Mapping mapping) 
throws RecipientRewriteTableException {
+    private void checkMapping(String user, Domain domain, Mapping mapping) 
throws RecipientRewriteTableException {
         Mappings mappings = getUserDomainMappings(user, domain);
         if (mappings != null && mappings.contains(mapping)) {
             throw new RecipientRewriteTableException("Mapping " + mapping + " 
for user " + user + " domain " + domain + " already exist!");
@@ -439,20 +438,9 @@ public abstract class AbstractRecipientRewriteTable 
implements RecipientRewriteT
     /**
      * Fix the domain for the given argument.
      * If give value is null, return a wildcard.
-     * 
-     * @param domain the given domain String
-     * @return fixedDomain the fixed domain String
      */
-    protected String getFixedDomain(String domain) {
-        if (domain != null) {
-            if (domain.equals(WILDCARD) || !domain.contains("@")) {
-                return domain;
-            } else {
-                throw new IllegalArgumentException("Invalid domain: " + 
domain);
-            }
-        } else {
-            return WILDCARD;
-        }
+    protected Domain getFixedDomain(Domain domain) {
+        return Optional.ofNullable(domain).orElse(Domains.WILDCARD);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/data/data-library/src/main/java/org/apache/james/rrt/lib/MappingImpl.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-library/src/main/java/org/apache/james/rrt/lib/MappingImpl.java
 
b/server/data/data-library/src/main/java/org/apache/james/rrt/lib/MappingImpl.java
index a17df46..ffb0f3e 100644
--- 
a/server/data/data-library/src/main/java/org/apache/james/rrt/lib/MappingImpl.java
+++ 
b/server/data/data-library/src/main/java/org/apache/james/rrt/lib/MappingImpl.java
@@ -22,6 +22,7 @@ package org.apache.james.rrt.lib;
 
 import java.io.Serializable;
 
+import org.apache.james.core.Domain;
 import org.apache.james.rrt.api.RecipientRewriteTable;
 
 import com.google.common.base.Objects;
@@ -50,8 +51,8 @@ public class MappingImpl implements Mapping, Serializable {
         return new MappingImpl(RecipientRewriteTable.ERROR_PREFIX, mapping);
     }
 
-    public static MappingImpl domain(String mapping) {
-        return new MappingImpl(RecipientRewriteTable.ALIASDOMAIN_PREFIX, 
mapping);
+    public static MappingImpl domain(Domain mapping) {
+        return new MappingImpl(RecipientRewriteTable.ALIASDOMAIN_PREFIX, 
mapping.asString());
     }
     
     private final String mapping;
@@ -72,9 +73,9 @@ public class MappingImpl implements Mapping, Serializable {
     }
     
     @Override
-    public Mapping appendDomain(String domain) {
+    public Mapping appendDomain(Domain domain) {
         Preconditions.checkNotNull(domain);
-        return new MappingImpl("", mapping + "@" + domain);
+        return new MappingImpl("", mapping + "@" + domain.asString());
     }
     
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/data/data-library/src/main/java/org/apache/james/rrt/lib/RecipientRewriteTableManagement.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-library/src/main/java/org/apache/james/rrt/lib/RecipientRewriteTableManagement.java
 
b/server/data/data-library/src/main/java/org/apache/james/rrt/lib/RecipientRewriteTableManagement.java
index 109f2a3..7e22a3e 100644
--- 
a/server/data/data-library/src/main/java/org/apache/james/rrt/lib/RecipientRewriteTableManagement.java
+++ 
b/server/data/data-library/src/main/java/org/apache/james/rrt/lib/RecipientRewriteTableManagement.java
@@ -24,6 +24,7 @@ import javax.inject.Inject;
 import javax.management.NotCompliantMBeanException;
 import javax.management.StandardMBean;
 
+import org.apache.james.core.Domain;
 import org.apache.james.rrt.api.RecipientRewriteTable;
 import org.apache.james.rrt.api.RecipientRewriteTableException;
 import org.apache.james.rrt.api.RecipientRewriteTableManagementMBean;
@@ -49,7 +50,7 @@ public class RecipientRewriteTableManagement extends 
StandardMBean implements Re
     @Override
     public void addRegexMapping(String user, String domain, String regex) 
throws Exception {
         try {
-            rrt.addRegexMapping(user, domain, regex);
+            rrt.addRegexMapping(user, Domain.of(domain), regex);
         } catch (RecipientRewriteTableException e) {
             throw new Exception(e.getMessage());
         }
@@ -58,7 +59,7 @@ public class RecipientRewriteTableManagement extends 
StandardMBean implements Re
     @Override
     public void removeRegexMapping(String user, String domain, String regex) 
throws Exception {
         try {
-            rrt.removeRegexMapping(user, domain, regex);
+            rrt.removeRegexMapping(user, Domain.of(domain), regex);
         } catch (RecipientRewriteTableException e) {
             throw new Exception(e.getMessage());
         }
@@ -67,7 +68,7 @@ public class RecipientRewriteTableManagement extends 
StandardMBean implements Re
     @Override
     public void addAddressMapping(String user, String domain, String address) 
throws Exception {
         try {
-            rrt.addAddressMapping(user, domain, address);
+            rrt.addAddressMapping(user, Domain.of(domain), address);
         } catch (RecipientRewriteTableException e) {
             throw new Exception(e.getMessage());
         }
@@ -76,7 +77,7 @@ public class RecipientRewriteTableManagement extends 
StandardMBean implements Re
     @Override
     public void removeAddressMapping(String user, String domain, String 
address) throws Exception {
         try {
-            rrt.removeAddressMapping(user, domain, address);
+            rrt.removeAddressMapping(user, Domain.of(domain), address);
         } catch (RecipientRewriteTableException e) {
             throw new Exception(e.getMessage());
         }
@@ -85,7 +86,7 @@ public class RecipientRewriteTableManagement extends 
StandardMBean implements Re
     @Override
     public void addErrorMapping(String user, String domain, String error) 
throws Exception {
         try {
-            rrt.addErrorMapping(user, domain, error);
+            rrt.addErrorMapping(user, Domain.of(domain), error);
         } catch (RecipientRewriteTableException e) {
             throw new Exception(e.getMessage());
         }
@@ -94,7 +95,7 @@ public class RecipientRewriteTableManagement extends 
StandardMBean implements Re
     @Override
     public void removeErrorMapping(String user, String domain, String error) 
throws Exception {
         try {
-            rrt.removeErrorMapping(user, domain, error);
+            rrt.removeErrorMapping(user, Domain.of(domain), error);
         } catch (RecipientRewriteTableException e) {
             throw new Exception(e.getMessage());
         }
@@ -103,7 +104,7 @@ public class RecipientRewriteTableManagement extends 
StandardMBean implements Re
     @Override
     public void addDomainMapping(String domain, String targetDomain) throws 
Exception {
         try {
-            rrt.addAliasDomainMapping(domain, targetDomain);
+            rrt.addAliasDomainMapping(Domain.of(domain), 
Domain.of(targetDomain));
         } catch (RecipientRewriteTableException e) {
             throw new Exception(e.getMessage());
         }
@@ -112,7 +113,7 @@ public class RecipientRewriteTableManagement extends 
StandardMBean implements Re
     @Override
     public void removeDomainMapping(String domain, String targetDomain) throws 
Exception {
         try {
-            rrt.removeAliasDomainMapping(domain, targetDomain);
+            rrt.removeAliasDomainMapping(Domain.of(domain), 
Domain.of(targetDomain));
         } catch (RecipientRewriteTableException e) {
             throw new Exception(e.getMessage());
         }
@@ -121,7 +122,7 @@ public class RecipientRewriteTableManagement extends 
StandardMBean implements Re
     @Override
     public Mappings getUserDomainMappings(String user, String domain) throws 
Exception {
         try {
-            return rrt.getUserDomainMappings(user, domain);
+            return rrt.getUserDomainMappings(user, Domain.of(domain));
         } catch (RecipientRewriteTableException e) {
             throw new Exception(e.getMessage());
         }
@@ -130,7 +131,7 @@ public class RecipientRewriteTableManagement extends 
StandardMBean implements Re
     @Override
     public void addMapping(String user, String domain, String mapping) throws 
Exception {
         try {
-            rrt.addMapping(user, domain, mapping);
+            rrt.addMapping(user, Domain.of(domain), mapping);
         } catch (RecipientRewriteTableException e) {
             throw new Exception(e.getMessage());
         }
@@ -139,7 +140,7 @@ public class RecipientRewriteTableManagement extends 
StandardMBean implements Re
     @Override
     public void removeMapping(String user, String domain, String mapping) 
throws Exception {
         try {
-            rrt.removeMapping(user, domain, mapping);
+            rrt.removeMapping(user, Domain.of(domain), mapping);
         } catch (RecipientRewriteTableException e) {
             throw new Exception(e.getMessage());
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/data/data-library/src/main/java/org/apache/james/rrt/lib/RecipientRewriteTableUtil.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-library/src/main/java/org/apache/james/rrt/lib/RecipientRewriteTableUtil.java
 
b/server/data/data-library/src/main/java/org/apache/james/rrt/lib/RecipientRewriteTableUtil.java
index 75c4054..89d3d79 100644
--- 
a/server/data/data-library/src/main/java/org/apache/james/rrt/lib/RecipientRewriteTableUtil.java
+++ 
b/server/data/data-library/src/main/java/org/apache/james/rrt/lib/RecipientRewriteTableUtil.java
@@ -26,6 +26,7 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.regex.PatternSyntaxException;
 
+import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.james.rrt.api.RecipientRewriteTable;
 
@@ -135,7 +136,7 @@ public class RecipientRewriteTableUtil {
 
     /**
      * Returns the real recipient given a virtual username and domain.
-     * 
+     *
      * @param user
      *            the virtual user
      * @param domain
@@ -143,12 +144,12 @@ public class RecipientRewriteTableUtil {
      * @return the real recipient address, or <code>null</code> if no mapping
      *         exists
      */
-    public static String getTargetString(String user, String domain, 
Map<String, String> mappings) {
+    public static String getTargetString(String user, Domain domain, 
Map<String, String> mappings) {
         StringBuffer buf;
         String target;
 
         // Look for exact (user@domain) match
-        buf = new StringBuffer().append(user).append("@").append(domain);
+        buf = new 
StringBuffer().append(user).append("@").append(domain.asString());
         target = mappings.get(buf.toString());
         if (target != null) {
             return target;
@@ -162,7 +163,7 @@ public class RecipientRewriteTableUtil {
         }
 
         // Look for *@domain match
-        buf = new StringBuffer().append("*@").append(domain);
+        buf = new StringBuffer().append("*@").append(domain.asString());
         target = mappings.get(buf.toString());
         if (target != null) {
             return target;

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractJamesUsersRepository.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractJamesUsersRepository.java
 
b/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractJamesUsersRepository.java
index 45f57b3..040745f 100644
--- 
a/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractJamesUsersRepository.java
+++ 
b/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractJamesUsersRepository.java
@@ -25,6 +25,7 @@ import java.util.Map;
 
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.HierarchicalConfiguration;
+import org.apache.james.core.Domain;
 import org.apache.james.rrt.api.RecipientRewriteTable;
 import org.apache.james.rrt.api.RecipientRewriteTableException;
 import org.apache.james.rrt.lib.Mappings;
@@ -118,7 +119,7 @@ public abstract class AbstractJamesUsersRepository extends 
AbstractUsersReposito
     }
 
     @Override
-    public Mappings getMappings(String username, String domain) throws 
ErrorMappingException, RecipientRewriteTableException {
+    public Mappings getMappings(String username, Domain domain) throws 
ErrorMappingException, RecipientRewriteTableException {
         Builder mappingsBuilder = MappingsImpl.builder();
         try {
             User user = getUserByName(username);
@@ -129,7 +130,7 @@ public abstract class AbstractJamesUsersRepository extends 
AbstractUsersReposito
                 if (enableAliases && jUser.getAliasing()) {
                     String alias = jUser.getAlias();
                     if (alias != null) {
-                        mappingsBuilder.add(alias + "@" + domain);
+                        mappingsBuilder.add(alias + "@" + domain.asString());
                     }
                 }
 
@@ -179,13 +180,13 @@ public abstract class AbstractJamesUsersRepository 
extends AbstractUsersReposito
                     String user = users.next();
                     int index = user.indexOf("@");
                     String username;
-                    String domain;
+                    Domain domain;
                     if (index != -1) {
                         username = user.substring(0, index);
-                        domain = user.substring(index + 1, user.length());
+                        domain = Domain.of(user.substring(index + 1, 
user.length()));
                     } else {
                         username = user;
-                        domain = "localhost";
+                        domain = Domain.of("localhost");
                     }
                     try {
                         mappings.put(user, getMappings(username, domain));
@@ -202,65 +203,65 @@ public abstract class AbstractJamesUsersRepository 
extends AbstractUsersReposito
     }
 
     @Override
-    public Mappings getUserDomainMappings(String user, String domain) throws 
RecipientRewriteTableException {
+    public Mappings getUserDomainMappings(String user, Domain domain) throws 
RecipientRewriteTableException {
         return MappingsImpl.empty();
     }
 
     @Override
-    public void addRegexMapping(String user, String domain, String regex) 
throws RecipientRewriteTableException {
+    public void addRegexMapping(String user, Domain domain, String regex) 
throws RecipientRewriteTableException {
         throw new RecipientRewriteTableException("Read-Only 
RecipientRewriteTable");
     }
 
     @Override
-    public void removeRegexMapping(String user, String domain, String regex) 
throws RecipientRewriteTableException {
+    public void removeRegexMapping(String user, Domain domain, String regex) 
throws RecipientRewriteTableException {
         throw new RecipientRewriteTableException("Read-Only 
RecipientRewriteTable");
 
     }
 
     @Override
-    public void addAddressMapping(String user, String domain, String address) 
throws RecipientRewriteTableException {
+    public void addAddressMapping(String user, Domain domain, String address) 
throws RecipientRewriteTableException {
         throw new RecipientRewriteTableException("Read-Only 
RecipientRewriteTable");
 
     }
 
     @Override
-    public void removeAddressMapping(String user, String domain, String 
address) throws RecipientRewriteTableException {
+    public void removeAddressMapping(String user, Domain domain, String 
address) throws RecipientRewriteTableException {
         throw new RecipientRewriteTableException("Read-Only 
RecipientRewriteTable");
 
     }
 
     @Override
-    public void addErrorMapping(String user, String domain, String error) 
throws RecipientRewriteTableException {
+    public void addErrorMapping(String user, Domain domain, String error) 
throws RecipientRewriteTableException {
         throw new RecipientRewriteTableException("Read-Only 
RecipientRewriteTable");
 
     }
 
     @Override
-    public void removeErrorMapping(String user, String domain, String error) 
throws RecipientRewriteTableException {
+    public void removeErrorMapping(String user, Domain domain, String error) 
throws RecipientRewriteTableException {
         throw new RecipientRewriteTableException("Read-Only 
RecipientRewriteTable");
 
     }
 
     @Override
-    public void addMapping(String user, String domain, String mapping) throws 
RecipientRewriteTableException {
+    public void addMapping(String user, Domain domain, String mapping) throws 
RecipientRewriteTableException {
         throw new RecipientRewriteTableException("Read-Only 
RecipientRewriteTable");
 
     }
 
     @Override
-    public void removeMapping(String user, String domain, String mapping) 
throws RecipientRewriteTableException {
+    public void removeMapping(String user, Domain domain, String mapping) 
throws RecipientRewriteTableException {
         throw new RecipientRewriteTableException("Read-Only 
RecipientRewriteTable");
 
     }
 
     @Override
-    public void addAliasDomainMapping(String aliasDomain, String realDomain) 
throws RecipientRewriteTableException {
+    public void addAliasDomainMapping(Domain aliasDomain, Domain realDomain) 
throws RecipientRewriteTableException {
         throw new RecipientRewriteTableException("Read-Only 
RecipientRewriteTable");
 
     }
 
     @Override
-    public void removeAliasDomainMapping(String aliasDomain, String 
realDomain) throws RecipientRewriteTableException {
+    public void removeAliasDomainMapping(Domain aliasDomain, Domain 
realDomain) throws RecipientRewriteTableException {
         throw new RecipientRewriteTableException("Read-Only 
RecipientRewriteTable");
 
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractUsersRepository.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractUsersRepository.java
 
b/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractUsersRepository.java
index 9ec041c..f28a127 100644
--- 
a/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractUsersRepository.java
+++ 
b/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractUsersRepository.java
@@ -25,6 +25,7 @@ import javax.inject.Inject;
 
 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.domainlist.api.DomainList;
 import org.apache.james.domainlist.api.DomainListException;
@@ -73,7 +74,7 @@ public abstract class AbstractUsersRepository implements 
UsersRepository, Config
             if (i == -1) {
                 throw new UsersRepositoryException("Given Username needs to 
contain a @domainpart");
             } else {
-                String domain = username.substring(i + 1);
+                Domain domain = Domain.of(username.substring(i + 1));
                 try {
                     if (!domainList.containsDomain(domain)) {
                         throw new UsersRepositoryException("Domain does not 
exist in DomainList");

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/data/data-library/src/test/java/org/apache/james/domainlist/api/mock/SimpleDomainList.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-library/src/test/java/org/apache/james/domainlist/api/mock/SimpleDomainList.java
 
b/server/data/data-library/src/test/java/org/apache/james/domainlist/api/mock/SimpleDomainList.java
index f85c2e3..256625c 100644
--- 
a/server/data/data-library/src/test/java/org/apache/james/domainlist/api/mock/SimpleDomainList.java
+++ 
b/server/data/data-library/src/test/java/org/apache/james/domainlist/api/mock/SimpleDomainList.java
@@ -21,6 +21,7 @@ package org.apache.james.domainlist.api.mock;
 import java.util.LinkedList;
 import java.util.List;
 
+import org.apache.james.core.Domain;
 import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.domainlist.api.DomainListException;
 
@@ -31,20 +32,20 @@ import com.google.common.collect.ImmutableList;
  */
 public class SimpleDomainList implements DomainList {
 
-    private final List<String> domains = new LinkedList<>();
+    private final List<Domain> domains = new LinkedList<>();
 
     @Override
-    public boolean containsDomain(String domain) throws DomainListException {
+    public boolean containsDomain(Domain domain) throws DomainListException {
         return domains.contains(domain);
     }
 
     @Override
-    public List<String> getDomains() throws DomainListException {
+    public List<Domain> getDomains() throws DomainListException {
         return ImmutableList.copyOf(domains);
     }
 
     @Override
-    public void addDomain(String domain) throws DomainListException {
+    public void addDomain(Domain domain) throws DomainListException {
         if (domains.contains(domain)) {
             throw new DomainListException("Domain " + domain + " already 
exist");
         }
@@ -52,14 +53,14 @@ public class SimpleDomainList implements DomainList {
     }
 
     @Override
-    public void removeDomain(String domain) throws DomainListException {
+    public void removeDomain(Domain domain) throws DomainListException {
         if (!domains.remove(domain)) {
             throw new DomainListException("Domain " + domain + " does not 
exist");
         }
     }
 
     @Override
-    public String getDefaultDomain() {
-        return "localhost";
+    public Domain getDefaultDomain() {
+        return Domain.of("localhost");
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/data/data-library/src/test/java/org/apache/james/domainlist/lib/AbstractDomainListPrivateMethodsTest.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-library/src/test/java/org/apache/james/domainlist/lib/AbstractDomainListPrivateMethodsTest.java
 
b/server/data/data-library/src/test/java/org/apache/james/domainlist/lib/AbstractDomainListPrivateMethodsTest.java
index ad8059d..9cdabd4 100644
--- 
a/server/data/data-library/src/test/java/org/apache/james/domainlist/lib/AbstractDomainListPrivateMethodsTest.java
+++ 
b/server/data/data-library/src/test/java/org/apache/james/domainlist/lib/AbstractDomainListPrivateMethodsTest.java
@@ -28,8 +28,10 @@ import static org.mockito.Mockito.when;
 import java.net.InetAddress;
 import java.util.Arrays;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import org.apache.commons.configuration.HierarchicalConfiguration;
+import org.apache.james.core.Domain;
 import org.apache.james.dnsservice.api.DNSService;
 import org.apache.james.domainlist.api.DomainListException;
 import org.junit.Before;
@@ -52,7 +54,7 @@ public class AbstractDomainListPrivateMethodsTest {
 
     private static class MyDomainList extends AbstractDomainList {
 
-        private List<String> domains;
+        private List<Domain> domains;
 
         public MyDomainList(DNSService dns, EnvDetector envDetector) {
             super(dns, envDetector);
@@ -60,22 +62,22 @@ public class AbstractDomainListPrivateMethodsTest {
         }
 
         @Override
-        protected boolean containsDomainInternal(String domain) throws 
DomainListException {
+        protected boolean containsDomainInternal(Domain domain) throws 
DomainListException {
             return domains.contains(domain);
         }
 
         @Override
-        public void addDomain(String domain) throws DomainListException {
+        public void addDomain(Domain domain) throws DomainListException {
             domains.add(domain);
         }
 
         @Override
-        public void removeDomain(String domain) throws DomainListException {
+        public void removeDomain(Domain domain) throws DomainListException {
             domains.remove(domain);
         }
 
         @Override
-        protected List<String> getDomainListInternal() throws 
DomainListException {
+        protected List<Domain> getDomainListInternal() throws 
DomainListException {
             return domains;
         }
     }
@@ -110,7 +112,7 @@ public class AbstractDomainListPrivateMethodsTest {
         
when(configuration.getString(AbstractDomainList.CONFIGURE_DEFAULT_DOMAIN, 
AbstractDomainList.LOCALHOST))
             .thenReturn(AbstractDomainList.LOCALHOST);
 
-        String expectedDefaultDomain = 
InetAddress.getLocalHost().getHostName();
+        Domain expectedDefaultDomain = 
Domain.of(InetAddress.getLocalHost().getHostName());
         domainList.configureDefaultDomain(configuration);
 
         
assertThat(domainList.getDomainListInternal()).contains(expectedDefaultDomain);
@@ -122,7 +124,7 @@ public class AbstractDomainListPrivateMethodsTest {
         
when(configuration.getString(AbstractDomainList.CONFIGURE_DEFAULT_DOMAIN, 
AbstractDomainList.LOCALHOST))
             .thenReturn(AbstractDomainList.LOCALHOST);
 
-        String expectedDefaultDomain = 
InetAddress.getLocalHost().getHostName();
+        Domain expectedDefaultDomain = 
Domain.of(InetAddress.getLocalHost().getHostName());
         domainList.configureDefaultDomain(configuration);
         domainList.configureDefaultDomain(configuration);
 
@@ -138,7 +140,7 @@ public class AbstractDomainListPrivateMethodsTest {
 
         domainList.configureDefaultDomain(configuration);
 
-        
assertThat(domainList.getDomainListInternal()).contains(expectedDefaultDomain);
+        
assertThat(domainList.getDomainListInternal()).contains(Domain.of(expectedDefaultDomain));
     }
 
     @Test
@@ -148,10 +150,10 @@ public class AbstractDomainListPrivateMethodsTest {
         
when(configuration.getString(AbstractDomainList.CONFIGURE_DEFAULT_DOMAIN, 
AbstractDomainList.LOCALHOST))
             .thenReturn(expectedDefaultDomain);
 
-        domainList.addDomain(expectedDefaultDomain);
+        domainList.addDomain(Domain.of(expectedDefaultDomain));
         domainList.configureDefaultDomain(configuration);
 
-        
assertThat(domainList.getDomainListInternal()).contains(expectedDefaultDomain);
+        
assertThat(domainList.getDomainListInternal()).contains(Domain.of(expectedDefaultDomain));
     }
 
     @Test
@@ -188,7 +190,7 @@ public class AbstractDomainListPrivateMethodsTest {
         String detected = "detected.tld";
         
when(dnsService.getHostName(any(InetAddress.class))).thenReturn(detected);
 
-        assertThat(domainList.getDomains()).containsOnly(detected);
+        assertThat(domainList.getDomains()).containsOnly(Domain.of(detected));
     }
 
     @Test
@@ -206,7 +208,7 @@ public class AbstractDomainListPrivateMethodsTest {
         when(detectedAddress.getHostAddress()).thenReturn(detectedIp);
         
when(dnsService.getAllByName(detected)).thenReturn(ImmutableList.of(detectedAddress));
 
-        assertThat(domainList.getDomains()).containsOnly(detected, detectedIp);
+        assertThat(domainList.getDomains()).containsOnly(Domain.of(detected), 
Domain.of(detectedIp));
     }
 
     @Test
@@ -228,9 +230,11 @@ public class AbstractDomainListPrivateMethodsTest {
         when(detectedAddress2.getHostAddress()).thenReturn(detectedIp2);
         
when(dnsService.getAllByName(detected)).thenReturn(ImmutableList.of(detectedAddress1));
         
when(dnsService.getAllByName(added)).thenReturn(ImmutableList.of(detectedAddress2));
-        domainList.addDomain(added);
+        domainList.addDomain(Domain.of(added));
 
-        assertThat(domainList.getDomains()).containsOnly(detected, 
detectedIp1, added, detectedIp2);
+        assertThat(domainList.getDomains())
+            .extracting(Domain::name)
+            .containsOnly(detected, detectedIp1, added, detectedIp2);
     }
 
     @Test
@@ -239,7 +243,7 @@ public class AbstractDomainListPrivateMethodsTest {
 
         when(configuration.getBoolean(AbstractDomainList.CONFIGURE_AUTODETECT, 
true)).thenReturn(false);
         
when(configuration.getBoolean(AbstractDomainList.CONFIGURE_AUTODETECT_IP, 
true)).thenReturn(false);
-        String domain = "added.tld";
+        Domain domain = Domain.of("added.tld");
         domainList.addDomain(domain);
         domainList.configure(configuration);
 
@@ -255,7 +259,7 @@ public class AbstractDomainListPrivateMethodsTest {
         when(detectedAddress.getHostAddress()).thenReturn(detectedIp);
         
when(dnsService.getAllByName(detected)).thenReturn(ImmutableList.of(detectedAddress));
 
-        assertThat(domainList.containsDomain(detectedIp)).isTrue();
+        assertThat(domainList.containsDomain(Domain.of(detectedIp))).isTrue();
     }
 
     @Test
@@ -264,7 +268,7 @@ public class AbstractDomainListPrivateMethodsTest {
 
         when(configuration.getBoolean(AbstractDomainList.CONFIGURE_AUTODETECT, 
true)).thenReturn(false);
         
when(configuration.getBoolean(AbstractDomainList.CONFIGURE_AUTODETECT_IP, 
true)).thenReturn(false);
-        String domain = "added.tld";
+        Domain domain = Domain.of("added.tld");
         domainList.addDomain(domain);
         domainList.configure(configuration);
 
@@ -277,7 +281,7 @@ public class AbstractDomainListPrivateMethodsTest {
 
         when(configuration.getBoolean(AbstractDomainList.CONFIGURE_AUTODETECT, 
true)).thenReturn(false);
         
when(configuration.getBoolean(AbstractDomainList.CONFIGURE_AUTODETECT_IP, 
true)).thenReturn(false);
-        String domain = "added.tld";
+        Domain domain = Domain.of("added.tld");
         domainList.configure(configuration);
 
         assertThat(domainList.containsDomain(domain)).isFalse();
@@ -290,7 +294,7 @@ public class AbstractDomainListPrivateMethodsTest {
         when(configuration.getBoolean(AbstractDomainList.CONFIGURE_AUTODETECT, 
true)).thenReturn(false);
         
when(configuration.getBoolean(AbstractDomainList.CONFIGURE_AUTODETECT_IP, 
true)).thenReturn(false);
         domainList.configure(configuration);
-        domainList.containsDomain("added.tld");
+        domainList.containsDomain(Domain.of("added.tld"));
 
         verifyZeroInteractions(dnsService);
     }
@@ -306,7 +310,7 @@ public class AbstractDomainListPrivateMethodsTest {
         String detected = "detected.tld";
         
when(dnsService.getHostName(any(InetAddress.class))).thenReturn(detected);
 
-        assertThat(domainList.containsDomain(detected)).isTrue();
+        assertThat(domainList.containsDomain(Domain.of(detected))).isTrue();
     }
 
     @Test
@@ -319,7 +323,7 @@ public class AbstractDomainListPrivateMethodsTest {
         
when(configuration.getBoolean(AbstractDomainList.CONFIGURE_AUTODETECT_IP, 
true)).thenReturn(false);
         domainList.configure(configuration);
 
-        assertThat(domainList.containsDomain(envDomain)).isTrue();
+        assertThat(domainList.containsDomain(Domain.of(envDomain))).isTrue();
     }
 
     @Test
@@ -333,7 +337,7 @@ public class AbstractDomainListPrivateMethodsTest {
         domainList.configure(configuration);
 
         assertThat(domainList.getDomains())
-            .containsOnlyElementsOf(Arrays.asList(configuredDomain));
+            
.containsOnlyElementsOf(Arrays.stream(configuredDomain).map(Domain::of).collect(Collectors.toList()));
     }
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/data/data-library/src/test/java/org/apache/james/domainlist/lib/AbstractDomainListTest.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-library/src/test/java/org/apache/james/domainlist/lib/AbstractDomainListTest.java
 
b/server/data/data-library/src/test/java/org/apache/james/domainlist/lib/AbstractDomainListTest.java
index a639b36..9884dcf 100644
--- 
a/server/data/data-library/src/test/java/org/apache/james/domainlist/lib/AbstractDomainListTest.java
+++ 
b/server/data/data-library/src/test/java/org/apache/james/domainlist/lib/AbstractDomainListTest.java
@@ -23,6 +23,7 @@ import static org.junit.Assert.fail;
 
 import java.net.UnknownHostException;
 
+import org.apache.james.core.Domain;
 import org.apache.james.dnsservice.api.DNSService;
 import org.apache.james.dnsservice.api.InMemoryDNSService;
 import org.apache.james.domainlist.api.DomainList;
@@ -35,12 +36,12 @@ public abstract class AbstractDomainListTest {
 
     private static final Logger LOGGER = 
LoggerFactory.getLogger(AbstractDomainListTest.class);
 
-    private static final String DOMAIN_1 = "domain1.tld";
-    private static final String DOMAIN_2 = "domain2.tld";
-    private static final String DOMAIN_3 = "domain3.tld";
-    private static final String DOMAIN_4 = "domain4.tld";
-    private static final String DOMAIN_5 = "domain5.tld";
-    private static final String DOMAIN_UPPER_5 = "Domain5.tld";
+    private static final Domain DOMAIN_1 = Domain.of("domain1.tld");
+    private static final Domain DOMAIN_2 = Domain.of("domain2.tld");
+    private static final Domain DOMAIN_3 = Domain.of("domain3.tld");
+    private static final Domain DOMAIN_4 = Domain.of("domain4.tld");
+    private static final Domain DOMAIN_5 = Domain.of("domain5.tld");
+    private static final Domain DOMAIN_UPPER_5 = Domain.of("Domain5.tld");
 
     private DomainList domainList;
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/data/data-library/src/test/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTableTest.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-library/src/test/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTableTest.java
 
b/server/data/data-library/src/test/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTableTest.java
index b891627..8bfb554 100644
--- 
a/server/data/data-library/src/test/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTableTest.java
+++ 
b/server/data/data-library/src/test/java/org/apache/james/rrt/lib/AbstractRecipientRewriteTableTest.java
@@ -23,6 +23,7 @@ import static 
org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.util.Map;
 
+import org.apache.james.core.Domain;
 import org.apache.james.lifecycle.api.LifecycleUtil;
 import org.apache.james.rrt.api.RecipientRewriteTable;
 import org.apache.james.rrt.api.RecipientRewriteTable.ErrorMappingException;
@@ -63,7 +64,7 @@ public abstract class AbstractRecipientRewriteTableTest {
 
                 for (String aMap : map.asStrings()) {
                     try {
-                        removeMapping(args[0], args[1], aMap);
+                        removeMapping(args[0], Domain.of(args[1]), aMap);
                     } catch (IllegalArgumentException e) {
                         e.printStackTrace();
                     }
@@ -78,7 +79,7 @@ public abstract class AbstractRecipientRewriteTableTest {
     @Test
     public void testStoreAndGetMappings() throws ErrorMappingException, 
RecipientRewriteTableException {
         String user = "*";
-        String domain = "test";
+        Domain domain = Domain.of("test");
         String regex = "prefix_.*:admin@test";
         addMapping(user, domain, regex, REGEX_TYPE);
         assertThat(virtualUserTable.getMappings("prefix_abc", 
domain)).isNotEmpty();
@@ -87,7 +88,7 @@ public abstract class AbstractRecipientRewriteTableTest {
     @Test
     public void testStoreAndRetrieveRegexMapping() throws 
ErrorMappingException, RecipientRewriteTableException {
         String user = "test";
-        String domain = "localhost";
+        Domain domain = Domain.of("localhost");
         // String regex = "(.*):{$1}@localhost";
         // String regex2 = "(.+):{$1}@test";
         String regex = "(.*)@localhost";
@@ -118,7 +119,7 @@ public abstract class AbstractRecipientRewriteTableTest {
     public void testStoreAndRetrieveAddressMapping() throws 
ErrorMappingException, RecipientRewriteTableException {
 
         String user = "test";
-        String domain = "localhost";
+        Domain domain = Domain.of("localhost");
         String address = "test@localhost2";
         String address2 = "test@james";
 
@@ -141,7 +142,7 @@ public abstract class AbstractRecipientRewriteTableTest {
     @Test
     public void testStoreAndRetrieveErrorMapping() throws 
ErrorMappingException, RecipientRewriteTableException {
         String user = "test";
-        String domain = "localhost";
+        Domain domain = Domain.of("localhost");
         String error = "bounce!";
 
         assertThat(virtualUserTable.getMappings(user, domain)).describedAs("No 
mapping").isNull();
@@ -164,7 +165,7 @@ public abstract class AbstractRecipientRewriteTableTest {
     public void testStoreAndRetrieveWildCardAddressMapping() throws 
ErrorMappingException, RecipientRewriteTableException {
         String user = "test";
         String user2 = "test2";
-        String domain = "localhost";
+        Domain domain = Domain.of("localhost");
         String address = "test@localhost2";
         String address2 = "test@james";
 
@@ -188,18 +189,18 @@ public abstract class AbstractRecipientRewriteTableTest {
         String user1 = "user1";
         String user2 = "user2";
         String user3 = "user3";
-        String domain1 = "domain1";
-        String domain2 = "domain2";
-        String domain3 = "domain3";
+        Domain domain1 = Domain.of("domain1");
+        Domain domain2 = Domain.of("domain2");
+        Domain domain3 = Domain.of("domain3");
 
         virtualUserTable.setRecursiveMapping(true);
 
             assertThat(virtualUserTable.getAllMappings()).describedAs("No 
mapping").isNull();
 
-            addMapping(user1, domain1, user2 + "@" + domain2, ADDRESS_TYPE);
-            addMapping(user2, domain2, user3 + "@" + domain3, ADDRESS_TYPE);
-            assertThat(virtualUserTable.getMappings(user1, 
domain1)).containsOnly(MappingImpl.address(user3 + "@" + domain3));
-            addMapping(user3, domain3, user1 + "@" + domain1, ADDRESS_TYPE);
+            addMapping(user1, domain1, user2 + "@" + domain2.asString(), 
ADDRESS_TYPE);
+            addMapping(user2, domain2, user3 + "@" + domain3.asString(), 
ADDRESS_TYPE);
+            assertThat(virtualUserTable.getMappings(user1, 
domain1)).containsOnly(MappingImpl.address(user3 + "@" + domain3.asString()));
+            addMapping(user3, domain3, user1 + "@" + domain1.asString(), 
ADDRESS_TYPE);
             
             assertThatThrownBy(() ->
                 virtualUserTable.getMappings(user1, domain1))
@@ -208,14 +209,14 @@ public abstract class AbstractRecipientRewriteTableTest {
 
             // disable recursive mapping
             virtualUserTable.setRecursiveMapping(false);
-            assertThat(virtualUserTable.getMappings(user1, 
domain1)).describedAs("Not recursive 
mapped").containsExactly(MappingImpl.address(user2 + "@" + domain2));
+            assertThat(virtualUserTable.getMappings(user1, 
domain1)).describedAs("Not recursive 
mapped").containsExactly(MappingImpl.address(user2 + "@" + domain2.asString()));
     }
 
     @Test
     public void testAliasDomainMapping() throws ErrorMappingException, 
RecipientRewriteTableException {
 
         String domain = "realdomain";
-        String aliasDomain = "aliasdomain";
+        Domain aliasDomain = Domain.of("aliasdomain");
         String user = "user";
         String user2 = "user2";
 
@@ -241,7 +242,8 @@ public abstract class AbstractRecipientRewriteTableTest {
     @Test
     public void sortMappingsShouldReturnSameStringWhenSingleDomainAlias() {
         String singleDomainAlias = RecipientRewriteTable.ALIASDOMAIN_PREFIX + 
"first";
-        
assertThat(AbstractRecipientRewriteTable.sortMappings(MappingsImpl.fromRawString(singleDomainAlias))).containsExactly(MappingImpl.domain("first"));
+        
assertThat(AbstractRecipientRewriteTable.sortMappings(MappingsImpl.fromRawString(singleDomainAlias)))
+            .containsExactly(MappingImpl.domain(Domain.of("first")));
     }
      
     @Test
@@ -271,7 +273,7 @@ public abstract class AbstractRecipientRewriteTableTest {
     @Test
     public void addMappingShouldThrowWhenMappingAlreadyExists() throws 
Exception {
         String user = "test";
-        String domain = "localhost";
+        Domain domain = Domain.of("localhost");
         String address = "test@localhost2";
 
         expectedException.expect(RecipientRewriteTableException.class);
@@ -283,7 +285,7 @@ public abstract class AbstractRecipientRewriteTableTest {
     @Test
     public void 
addMappingShouldNotThrowWhenMappingAlreadyExistsWithAnOtherType() throws 
Exception {
         String user = "test";
-        String domain = "localhost";
+        Domain domain = Domain.of("localhost");
         String address = "test@localhost2";
 
         addMapping(user, domain, address, ADDRESS_TYPE);
@@ -294,13 +296,13 @@ public abstract class AbstractRecipientRewriteTableTest {
 
     protected abstract AbstractRecipientRewriteTable 
getRecipientRewriteTable() throws Exception;
 
-    protected abstract void addMapping(String user, String domain, String 
mapping, int type) throws
+    protected abstract void addMapping(String user, Domain domain, String 
mapping, int type) throws
             RecipientRewriteTableException;
 
-    protected abstract void removeMapping(String user, String domain, String 
mapping, int type) throws
+    protected abstract void removeMapping(String user, Domain domain, String 
mapping, int type) throws
             RecipientRewriteTableException;
 
-    private void removeMapping(String user, String domain, String rawMapping) 
throws RecipientRewriteTableException {
+    private void removeMapping(String user, Domain domain, String rawMapping) 
throws RecipientRewriteTableException {
         if (rawMapping.startsWith(RecipientRewriteTable.ERROR_PREFIX)) {
             removeMapping(user, domain, 
rawMapping.substring(RecipientRewriteTable.ERROR_PREFIX.length()), ERROR_TYPE);
         } else if (rawMapping.startsWith(RecipientRewriteTable.REGEX_PREFIX)) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/data/data-library/src/test/java/org/apache/james/rrt/lib/MappingImplTest.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-library/src/test/java/org/apache/james/rrt/lib/MappingImplTest.java
 
b/server/data/data-library/src/test/java/org/apache/james/rrt/lib/MappingImplTest.java
index cdb80ca..ad055d0 100644
--- 
a/server/data/data-library/src/test/java/org/apache/james/rrt/lib/MappingImplTest.java
+++ 
b/server/data/data-library/src/test/java/org/apache/james/rrt/lib/MappingImplTest.java
@@ -23,6 +23,7 @@ package org.apache.james.rrt.lib;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
+import org.apache.james.core.Domain;
 import org.junit.Test;
 
 public class MappingImplTest {
@@ -70,12 +71,12 @@ public class MappingImplTest {
     
     @Test
     public void appendDomainShouldWorkOnValidDomain() {
-        
assertThat(MappingImpl.address("abc").appendDomain("domain")).isEqualTo(MappingImpl.address("abc@domain"));
+        
assertThat(MappingImpl.address("abc").appendDomain(Domain.of("domain"))).isEqualTo(MappingImpl.address("abc@domain"));
     }
     
     @Test
     public void appendDomainShouldWorkWhenMappingAlreadyContainsDomains() {
-        
assertThat(MappingImpl.address("abc@d").appendDomain("domain")).isEqualTo(MappingImpl.address("abc@d@domain"));
+        
assertThat(MappingImpl.address("abc@d").appendDomain(Domain.of("domain"))).isEqualTo(MappingImpl.address("abc@d@domain"));
     }
     
     @Test(expected = NullPointerException.class)
@@ -84,11 +85,6 @@ public class MappingImplTest {
     }
     
     @Test
-    public void appendDomainShouldWorkWhenEmptyDomain() {
-        
assertThat(MappingImpl.address("abc").appendDomain("")).isEqualTo(MappingImpl.address("abc@"));
-    }
-
-    @Test
     public void getTypeShouldReturnAddressWhenNoPrefix() {
         
assertThat(MappingImpl.address("abc").getType()).isEqualTo(Mapping.Type.Address);
     }
@@ -110,12 +106,12 @@ public class MappingImplTest {
 
     @Test
     public void getTypeShouldReturnDomainWhenDomainPrefix() {
-        
assertThat(MappingImpl.domain("abc").getType()).isEqualTo(Mapping.Type.Domain);
+        
assertThat(MappingImpl.domain(Domain.of("abc")).getType()).isEqualTo(Mapping.Type.Domain);
     }
     
     @Test(expected = IllegalStateException.class)
     public void getErrorMessageShouldThrowWhenMappingIsNotAnError() {
-        MappingImpl.domain("toto").getErrorMessage();
+        MappingImpl.domain(Domain.of("toto")).getErrorMessage();
     }
     
     @Test
@@ -151,6 +147,6 @@ public class MappingImplTest {
 
     @Test
     public void getAddressShouldThrowForDomain() {
-        assertThatThrownBy(() -> 
MappingImpl.domain("value").getAddress()).isInstanceOf(IllegalStateException.class);
+        assertThatThrownBy(() -> 
MappingImpl.domain(Domain.of("value")).getAddress()).isInstanceOf(IllegalStateException.class);
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/data/data-library/src/test/java/org/apache/james/rrt/lib/MappingsImplTest.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-library/src/test/java/org/apache/james/rrt/lib/MappingsImplTest.java
 
b/server/data/data-library/src/test/java/org/apache/james/rrt/lib/MappingsImplTest.java
index 5ac3a9c..bb66d38 100644
--- 
a/server/data/data-library/src/test/java/org/apache/james/rrt/lib/MappingsImplTest.java
+++ 
b/server/data/data-library/src/test/java/org/apache/james/rrt/lib/MappingsImplTest.java
@@ -24,6 +24,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import java.util.Optional;
 
+import org.apache.james.core.Domain;
 import org.junit.Test;
 
 
@@ -111,7 +112,7 @@ public class MappingsImplTest {
     @Test
     public void 
fromRawStringShouldNotUseColonDelimiterWhenValueStartsWithDomain() {
         MappingsImpl actual = MappingsImpl.fromRawString("domain:test");
-        assertThat(actual).containsExactly(MappingImpl.domain("test"));
+        
assertThat(actual).containsExactly(MappingImpl.domain(Domain.of("test")));
     }
     
 
@@ -160,11 +161,11 @@ public class MappingsImplTest {
     @Test
     public void selectShouldReturnMatchingElementsInOrderWhenMatchingMapping() 
{
         MappingsImpl mappings = MappingsImpl.builder()
-                .add(MappingImpl.regex("toto"))
-                .add(MappingImpl.address("toto")) 
-                .add(MappingImpl.domain("domain"))
-                .add(MappingImpl.regex("tata"))
-                .build();
+            .add(MappingImpl.regex("toto"))
+            .add(MappingImpl.address("toto"))
+            .add(MappingImpl.domain(Domain.of("domain")))
+            .add(MappingImpl.regex("tata"))
+            .build();
         MappingsImpl expected = MappingsImpl.builder()
                 .add(MappingImpl.regex("toto"))
                 .add(MappingImpl.regex("tata"))
@@ -192,15 +193,15 @@ public class MappingsImplTest {
     @Test
     public void 
excludeShouldReturnNonMatchingElementsInOrderWhenNonMatchingMapping() {
         MappingsImpl mappings = MappingsImpl.builder()
-                .add(MappingImpl.regex("toto"))
-                .add(MappingImpl.address("toto")) 
-                .add(MappingImpl.domain("domain"))
-                .add(MappingImpl.regex("tata"))
-                .build();
+            .add(MappingImpl.regex("toto"))
+            .add(MappingImpl.address("toto"))
+            .add(MappingImpl.domain(Domain.of("domain")))
+            .add(MappingImpl.regex("tata"))
+            .build();
         MappingsImpl expected = MappingsImpl.builder()
-                .add(MappingImpl.address("toto")) 
-                .add(MappingImpl.domain("domain"))
-                .build();
+            .add(MappingImpl.address("toto"))
+            .add(MappingImpl.domain(Domain.of("domain")))
+            .build();
         assertThat(mappings.exclude(Mapping.Type.Regex)).isEqualTo(expected);
     }
     

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/data/data-library/src/test/java/org/apache/james/rrt/lib/RewriteTablesStepdefs.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-library/src/test/java/org/apache/james/rrt/lib/RewriteTablesStepdefs.java
 
b/server/data/data-library/src/test/java/org/apache/james/rrt/lib/RewriteTablesStepdefs.java
index 5825492..14655fe 100644
--- 
a/server/data/data-library/src/test/java/org/apache/james/rrt/lib/RewriteTablesStepdefs.java
+++ 
b/server/data/data-library/src/test/java/org/apache/james/rrt/lib/RewriteTablesStepdefs.java
@@ -23,6 +23,7 @@ import static 
org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.util.List;
 
+import org.apache.james.core.Domain;
 import org.apache.james.rrt.api.RecipientRewriteTable;
 import org.apache.james.rrt.api.RecipientRewriteTable.ErrorMappingException;
 import org.apache.james.rrt.api.RecipientRewriteTableException;
@@ -38,13 +39,13 @@ public class RewriteTablesStepdefs {
 
     @Given("store \"([^\"]*)\" regexp mapping for user \"([^\"]*)\" at domain 
\"([^\"]*)\"")
     public void storeRegexpMappingForUserAtDomain(String regexp, String user, 
String domain) throws Throwable {
-        rewriteTable.addRegexMapping(user, domain, regexp);
+        rewriteTable.addRegexMapping(user, Domain.of(domain), regexp);
     }
 
     @Given("store an invalid \"([^\"]*)\" regexp mapping for user \"([^\"]*)\" 
at domain \"([^\"]*)\"")
     public void storeInvalidRegexpMappingForUserAtDomain(String regexp, String 
user, String domain) {
         try {
-            rewriteTable.addRegexMapping(user, domain, regexp);
+            rewriteTable.addRegexMapping(user, Domain.of(domain), regexp);
         } catch (RecipientRewriteTableException e) {
             this.exception = e;
         }
@@ -52,12 +53,12 @@ public class RewriteTablesStepdefs {
 
     @Given("store \"([^\"]*)\" address mapping for user \"([^\"]*)\" at domain 
\"([^\"]*)\"")
     public void storeAddressMappingForUserAtDomain(String address, String 
user, String domain) throws Throwable {
-        rewriteTable.addAddressMapping(user, domain, address);
+        rewriteTable.addAddressMapping(user, Domain.of(domain), address);
     }
 
     @Given("store \"([^\"]*)\" error mapping for user \"([^\"]*)\" at domain 
\"([^\"]*)\"")
     public void storeErrorMappingForUserAtDomain(String error, String user, 
String domain) throws Throwable {
-        rewriteTable.addErrorMapping(user, domain, error);
+        rewriteTable.addErrorMapping(user, Domain.of(domain), error);
     }
 
     @Given("store \"([^\"]*)\" address mapping as wildcard for domain 
\"([^\"]*)\"")
@@ -67,7 +68,7 @@ public class RewriteTablesStepdefs {
 
     @Given("store \"([^\"]*)\" alias domain mapping for domain \"([^\"]*)\"")
     public void storeAliasDomainMappingForDomain(String aliasDomain, String 
domain) throws Throwable {
-        rewriteTable.addAliasDomainMapping(aliasDomain, domain);
+        rewriteTable.addAliasDomainMapping(Domain.of(aliasDomain), 
Domain.of(domain));
     }
 
     @Given("recursive mapping is disable")
@@ -82,17 +83,17 @@ public class RewriteTablesStepdefs {
 
     @When("user \"([^\"]*)\" at domain \"([^\"]*)\" removes a regexp mapping 
\"([^\"]*)\"")
     public void userAtDomainRemovesRegexpMapping(String user, String domain, 
String regexp) throws Throwable {
-        rewriteTable.removeRegexMapping(user, domain, regexp);
+        rewriteTable.removeRegexMapping(user, Domain.of(domain), regexp);
     }
 
     @When("user \"([^\"]*)\" at domain \"([^\"]*)\" removes a address mapping 
\"([^\"]*)\"")
     public void userAtDomainRemovesAddressMapping(String user, String domain, 
String address) throws Throwable {
-        rewriteTable.removeAddressMapping(user, domain, address);
+        rewriteTable.removeAddressMapping(user, Domain.of(domain), address);
     }
 
     @When("user \"([^\"]*)\" at domain \"([^\"]*)\" removes a error mapping 
\"([^\"]*)\"")
     public void userAtDomainRemovesErrorMapping(String user, String domain, 
String error) throws Throwable {
-        rewriteTable.removeErrorMapping(user, domain, error);
+        rewriteTable.removeErrorMapping(user, Domain.of(domain), error);
     }
 
     @When("wildcard address mapping \"([^\"]*)\" at domain \"([^\"]*)\" is 
removed")
@@ -102,7 +103,7 @@ public class RewriteTablesStepdefs {
 
     @When("alias domain mapping \"([^\"]*)\" for \"([^\"]*)\" domain is 
removed")
     public void removeAliasDomainMappingForDomain(String aliasdomain, String 
domain) throws Throwable {
-        rewriteTable.removeAliasDomainMapping(aliasdomain, domain);
+        rewriteTable.removeAliasDomainMapping(Domain.of(aliasdomain), 
Domain.of(domain));
     }
 
     @Then("mappings should be empty")
@@ -112,12 +113,12 @@ public class RewriteTablesStepdefs {
 
     @Then("mappings for user \"([^\"]*)\" at domain \"([^\"]*)\" should be 
empty")
     public void assertMappingsIsEmpty(String user, String domain) throws 
Throwable {
-        assertThat(rewriteTable.getMappings(user, domain)).isNullOrEmpty();
+        assertThat(rewriteTable.getMappings(user, 
Domain.of(domain))).isNullOrEmpty();
     }
 
     @Then("mappings for user \"([^\"]*)\" at domain \"([^\"]*)\" should 
contains only \"([^\"]*)\"")
     public void assertMappingsForUser(String user, String domain, List<String> 
mappings) throws Throwable {
-        assertThat(rewriteTable.getMappings(user, 
domain).asStrings()).containsOnlyElementsOf(mappings);
+        assertThat(rewriteTable.getMappings(user, 
Domain.of(domain)).asStrings()).containsOnlyElementsOf(mappings);
     }
 
     @Then("a \"([^\"]*)\" exception should have been thrown")
@@ -127,7 +128,7 @@ public class RewriteTablesStepdefs {
 
     @Then("retrieving mappings for user \"([^\"]*)\" at domain \"([^\"]*)\" 
should raise an ErrorMappingException with message \"([^\"]*)\"")
     public void retrievingMappingsForUserAtDomainShouldRaiseAnException(String 
user, String domain, String message) throws Exception {
-        assertThatThrownBy(() -> rewriteTable.getMappings(user, domain))
+        assertThatThrownBy(() -> rewriteTable.getMappings(user, 
Domain.of(domain)))
             .isInstanceOf(ErrorMappingException.class)
             .hasMessage(message);
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/data/data-library/src/test/java/org/apache/james/user/lib/AbstractUsersRepositoryTest.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-library/src/test/java/org/apache/james/user/lib/AbstractUsersRepositoryTest.java
 
b/server/data/data-library/src/test/java/org/apache/james/user/lib/AbstractUsersRepositoryTest.java
index f64ccba..4f49809 100644
--- 
a/server/data/data-library/src/test/java/org/apache/james/user/lib/AbstractUsersRepositoryTest.java
+++ 
b/server/data/data-library/src/test/java/org/apache/james/user/lib/AbstractUsersRepositoryTest.java
@@ -24,6 +24,7 @@ import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.Optional;
 
+import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
 import org.apache.james.domainlist.api.mock.SimpleDomainList;
 import org.apache.james.lifecycle.api.LifecycleUtil;
@@ -36,7 +37,7 @@ import org.junit.Test;
 
 public abstract class AbstractUsersRepositoryTest {
 
-    private static final String DOMAIN = "domain"; 
+    private static final Domain DOMAIN = Domain.of("domain");
 
     protected AbstractUsersRepository usersRepository; 
 
@@ -70,7 +71,7 @@ public abstract class AbstractUsersRepositoryTest {
     
     private String login(String login) throws UsersRepositoryException {
         if (usersRepository.supportVirtualHosting()) {
-            return login + '@' + DOMAIN;
+            return login + '@' + DOMAIN.name();
         } else {
             return login;
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/data/data-memory/src/main/java/org/apache/james/domainlist/memory/MemoryDomainList.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-memory/src/main/java/org/apache/james/domainlist/memory/MemoryDomainList.java
 
b/server/data/data-memory/src/main/java/org/apache/james/domainlist/memory/MemoryDomainList.java
index 1f387d2..e7faf84 100644
--- 
a/server/data/data-memory/src/main/java/org/apache/james/domainlist/memory/MemoryDomainList.java
+++ 
b/server/data/data-memory/src/main/java/org/apache/james/domainlist/memory/MemoryDomainList.java
@@ -21,10 +21,10 @@ package org.apache.james.domainlist.memory;
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Locale;
 
 import javax.inject.Inject;
 
+import org.apache.james.core.Domain;
 import org.apache.james.dnsservice.api.DNSService;
 import org.apache.james.domainlist.api.DomainListException;
 import org.apache.james.domainlist.lib.AbstractDomainList;
@@ -33,7 +33,7 @@ import com.google.common.collect.ImmutableList;
 
 public class MemoryDomainList extends AbstractDomainList {
 
-    private final List<String> domains;
+    private final List<Domain> domains;
 
     @Inject
     public MemoryDomainList(DNSService dns) {
@@ -42,27 +42,27 @@ public class MemoryDomainList extends AbstractDomainList {
     }
 
     @Override
-    protected List<String> getDomainListInternal() throws DomainListException {
+    protected List<Domain> getDomainListInternal() throws DomainListException {
         return ImmutableList.copyOf(domains);
     }
 
     @Override
-    protected boolean containsDomainInternal(String domain) throws 
DomainListException {
-        return domains.contains(domain.toLowerCase(Locale.US));
+    protected boolean containsDomainInternal(Domain domain) throws 
DomainListException {
+        return domains.contains(domain);
     }
 
     @Override
-    public void addDomain(String domain) throws DomainListException {
+    public void addDomain(Domain domain) throws DomainListException {
         if (containsDomain(domain)) {
-            throw new DomainListException(domain.toLowerCase(Locale.US) + " 
already exists.");
+            throw new DomainListException(domain + " already exists.");
         }
-        domains.add(domain.toLowerCase(Locale.US));
+        domains.add(domain);
     }
 
     @Override
-    public void removeDomain(String domain) throws DomainListException {
-        if (!domains.remove(domain.toLowerCase(Locale.US))) {
-            throw new DomainListException(domain.toLowerCase(Locale.US) + " 
was not found");
+    public void removeDomain(Domain domain) throws DomainListException {
+        if (!domains.remove(domain)) {
+            throw new DomainListException(domain + " was not found");
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/data/data-memory/src/main/java/org/apache/james/rrt/memory/MemoryRecipientRewriteTable.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-memory/src/main/java/org/apache/james/rrt/memory/MemoryRecipientRewriteTable.java
 
b/server/data/data-memory/src/main/java/org/apache/james/rrt/memory/MemoryRecipientRewriteTable.java
index a95de2d..6b8e1c7 100644
--- 
a/server/data/data-memory/src/main/java/org/apache/james/rrt/memory/MemoryRecipientRewriteTable.java
+++ 
b/server/data/data-memory/src/main/java/org/apache/james/rrt/memory/MemoryRecipientRewriteTable.java
@@ -26,6 +26,7 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.stream.Stream;
 
+import org.apache.james.core.Domain;
 import org.apache.james.rrt.api.RecipientRewriteTableException;
 import org.apache.james.rrt.lib.AbstractRecipientRewriteTable;
 import org.apache.james.rrt.lib.Mapping;
@@ -40,10 +41,10 @@ public class MemoryRecipientRewriteTable extends 
AbstractRecipientRewriteTable {
 
     private static class InMemoryMappingEntry {
         private final String user;
-        private final String domain;
+        private final Domain domain;
         private final Mapping mapping;
 
-        public InMemoryMappingEntry(String user, String domain, Mapping 
mapping) {
+        public InMemoryMappingEntry(String user, Domain domain, Mapping 
mapping) {
             this.user = user;
             this.domain = domain;
             this.mapping = mapping;
@@ -53,7 +54,7 @@ public class MemoryRecipientRewriteTable extends 
AbstractRecipientRewriteTable {
             return user;
         }
 
-        public String getDomain() {
+        public Domain getDomain() {
             return domain;
         }
 
@@ -62,7 +63,7 @@ public class MemoryRecipientRewriteTable extends 
AbstractRecipientRewriteTable {
         }
 
         public String asKey() {
-            return getUser() + "@" + getDomain();
+            return getUser() + "@" + getDomain().asString();
         }
 
         @Override
@@ -91,27 +92,26 @@ public class MemoryRecipientRewriteTable extends 
AbstractRecipientRewriteTable {
     }
 
     @Override
-    protected void addMappingInternal(String user, String domain, Mapping 
mapping) throws RecipientRewriteTableException {
+    protected void addMappingInternal(String user, Domain domain, Mapping 
mapping) throws RecipientRewriteTableException {
         mappingEntries.add(new InMemoryMappingEntry(getFixedUser(user), 
getFixedDomain(domain), mapping));
     }
 
     @Override
-    protected void removeMappingInternal(String user, String domain, Mapping 
mapping) throws RecipientRewriteTableException {
+    protected void removeMappingInternal(String user, Domain domain, Mapping 
mapping) throws RecipientRewriteTableException {
         mappingEntries.remove(new InMemoryMappingEntry(getFixedUser(user), 
getFixedDomain(domain), mapping));
     }
 
     @Override
-    protected Mappings getUserDomainMappingsInternal(String user, String 
domain) throws RecipientRewriteTableException {
+    protected Mappings getUserDomainMappingsInternal(String user, Domain 
domain) throws RecipientRewriteTableException {
         return retrieveMappings(user, domain)
             .orElse(null);
     }
 
     @Override
-    protected String mapAddressInternal(String user, String domain) throws 
RecipientRewriteTableException {
+    protected String mapAddressInternal(String user, Domain domain) throws 
RecipientRewriteTableException {
         Mappings mappings = retrieveMappings(user, domain)
             .orElse(retrieveMappings(WILDCARD, domain)
-                .orElse(retrieveMappings(user, WILDCARD)
-                    .orElse(MappingsImpl.empty())));
+                .orElse(MappingsImpl.empty()));
 
         return !mappings.isEmpty() ? mappings.serialize() : null;
     }
@@ -136,7 +136,7 @@ public class MemoryRecipientRewriteTable extends 
AbstractRecipientRewriteTable {
             });
     }
 
-    private Optional<Mappings> retrieveMappings(final String user, final 
String domain) {
+    private Optional<Mappings> retrieveMappings(final String user, final 
Domain domain) {
         Stream<Mapping> userEntries = mappingEntries.stream()
             .filter(mappingEntry -> user.equals(mappingEntry.getUser()) && 
domain.equals(mappingEntry.getDomain()))
             .map(InMemoryMappingEntry::getMapping);

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/data/data-memory/src/test/java/org/apache/james/rrt/memory/MemoryRecipientRewriteTableTest.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-memory/src/test/java/org/apache/james/rrt/memory/MemoryRecipientRewriteTableTest.java
 
b/server/data/data-memory/src/test/java/org/apache/james/rrt/memory/MemoryRecipientRewriteTableTest.java
index 509b76f..a06e2ee 100644
--- 
a/server/data/data-memory/src/test/java/org/apache/james/rrt/memory/MemoryRecipientRewriteTableTest.java
+++ 
b/server/data/data-memory/src/test/java/org/apache/james/rrt/memory/MemoryRecipientRewriteTableTest.java
@@ -20,6 +20,7 @@
 package org.apache.james.rrt.memory;
 
 import org.apache.commons.configuration.DefaultConfigurationBuilder;
+import org.apache.james.core.Domain;
 import org.apache.james.rrt.api.RecipientRewriteTableException;
 import org.apache.james.rrt.lib.AbstractRecipientRewriteTable;
 import org.apache.james.rrt.lib.AbstractRecipientRewriteTableTest;
@@ -48,7 +49,7 @@ public class MemoryRecipientRewriteTableTest extends 
AbstractRecipientRewriteTab
     }
 
     @Override
-    protected void addMapping(String user, String domain, String mapping, int 
type) throws RecipientRewriteTableException {
+    protected void addMapping(String user, Domain domain, String mapping, int 
type) throws RecipientRewriteTableException {
         switch (type) {
         case ERROR_TYPE:
             virtualUserTable.addErrorMapping(user, domain, mapping);
@@ -60,7 +61,7 @@ public class MemoryRecipientRewriteTableTest extends 
AbstractRecipientRewriteTab
             virtualUserTable.addAddressMapping(user, domain, mapping);
             break;
         case ALIASDOMAIN_TYPE:
-            virtualUserTable.addAliasDomainMapping(domain, mapping);
+            virtualUserTable.addAliasDomainMapping(domain, Domain.of(mapping));
             break;
         default:
             throw new RuntimeException("Invalid mapping type: " + type);
@@ -68,7 +69,7 @@ public class MemoryRecipientRewriteTableTest extends 
AbstractRecipientRewriteTab
     }
 
     @Override
-    protected void removeMapping(String user, String domain, String mapping, 
int type) throws RecipientRewriteTableException {
+    protected void removeMapping(String user, Domain domain, String mapping, 
int type) throws RecipientRewriteTableException {
         switch (type) {
         case ERROR_TYPE:
             virtualUserTable.removeErrorMapping(user, domain, mapping);
@@ -80,7 +81,7 @@ public class MemoryRecipientRewriteTableTest extends 
AbstractRecipientRewriteTab
             virtualUserTable.removeAddressMapping(user, domain, mapping);
             break;
         case ALIASDOMAIN_TYPE:
-            virtualUserTable.removeAliasDomainMapping(domain, mapping);
+            virtualUserTable.removeAliasDomainMapping(domain, 
Domain.of(mapping));
             break;
         default:
             throw new RuntimeException("Invalid mapping type: " + type);


---------------------------------------------------------------------
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