http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/data/data-cassandra/src/test/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTableTest.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-cassandra/src/test/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTableTest.java
 
b/server/data/data-cassandra/src/test/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTableTest.java
index 8fe0e98..a82e94f 100644
--- 
a/server/data/data-cassandra/src/test/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTableTest.java
+++ 
b/server/data/data-cassandra/src/test/java/org/apache/james/rrt/cassandra/CassandraRecipientRewriteTableTest.java
@@ -22,6 +22,7 @@ import 
org.apache.commons.configuration.DefaultConfigurationBuilder;
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.DockerCassandraRule;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
+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;
@@ -58,7 +59,7 @@ public class CassandraRecipientRewriteTableTest extends 
AbstractRecipientRewrite
     }
 
     @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);
@@ -70,7 +71,7 @@ public class CassandraRecipientRewriteTableTest extends 
AbstractRecipientRewrite
             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);
@@ -78,7 +79,7 @@ public class CassandraRecipientRewriteTableTest extends 
AbstractRecipientRewrite
     }
 
     @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);
@@ -90,7 +91,7 @@ public class CassandraRecipientRewriteTableTest extends 
AbstractRecipientRewrite
             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);

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/data/data-file/src/main/java/org/apache/james/domainlist/xml/XMLDomainList.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-file/src/main/java/org/apache/james/domainlist/xml/XMLDomainList.java
 
b/server/data/data-file/src/main/java/org/apache/james/domainlist/xml/XMLDomainList.java
index 1d2966e..73b9b31 100644
--- 
a/server/data/data-file/src/main/java/org/apache/james/domainlist/xml/XMLDomainList.java
+++ 
b/server/data/data-file/src/main/java/org/apache/james/domainlist/xml/XMLDomainList.java
@@ -21,13 +21,13 @@ package org.apache.james.domainlist.xml;
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Locale;
 
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
 import org.apache.commons.configuration.ConfigurationException;
 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.apache.james.domainlist.lib.AbstractDomainList;
@@ -39,7 +39,7 @@ import org.apache.james.lifecycle.api.Configurable;
 @Singleton
 public class XMLDomainList extends AbstractDomainList implements Configurable {
 
-    private final List<String> domainNames = new ArrayList<>();
+    private final List<Domain> domainNames = new ArrayList<>();
     private boolean isConfigured = false;
 
     @Inject
@@ -54,17 +54,17 @@ public class XMLDomainList extends AbstractDomainList 
implements Configurable {
     }
 
     @Override
-    protected List<String> getDomainListInternal() {
+    protected List<Domain> getDomainListInternal() {
         return new ArrayList<>(domainNames);
     }
 
     @Override
-    protected boolean containsDomainInternal(String domains) throws 
DomainListException {
-        return domainNames.contains(domains.toLowerCase(Locale.US));
+    protected boolean containsDomainInternal(Domain domain) throws 
DomainListException {
+        return domainNames.contains(domain);
     }
 
     @Override
-    public void addDomain(String domain) throws DomainListException {
+    public void addDomain(Domain domain) throws DomainListException {
         if (isConfigured) {
             throw new DomainListException("Read-Only DomainList 
implementation");
         }
@@ -72,7 +72,7 @@ public class XMLDomainList extends AbstractDomainList 
implements Configurable {
     }
 
     @Override
-    public void removeDomain(String domain) throws DomainListException {
+    public void removeDomain(Domain domain) throws DomainListException {
         if (isConfigured) {
             throw new DomainListException("Read-Only DomainList 
implementation");
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/data/data-file/src/main/java/org/apache/james/rrt/file/XMLRecipientRewriteTable.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-file/src/main/java/org/apache/james/rrt/file/XMLRecipientRewriteTable.java
 
b/server/data/data-file/src/main/java/org/apache/james/rrt/file/XMLRecipientRewriteTable.java
index bab777e..f543ece 100644
--- 
a/server/data/data-file/src/main/java/org/apache/james/rrt/file/XMLRecipientRewriteTable.java
+++ 
b/server/data/data-file/src/main/java/org/apache/james/rrt/file/XMLRecipientRewriteTable.java
@@ -23,6 +23,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.RecipientRewriteTableException;
 import org.apache.james.rrt.lib.AbstractRecipientRewriteTable;
 import org.apache.james.rrt.lib.Mapping;
@@ -56,7 +57,7 @@ public class XMLRecipientRewriteTable extends 
AbstractRecipientRewriteTable {
     }
 
     @Override
-    protected String mapAddressInternal(String user, String domain) throws 
RecipientRewriteTableException {
+    protected String mapAddressInternal(String user, Domain domain) throws 
RecipientRewriteTableException {
         if (mappings == null) {
             return null;
         } else {
@@ -65,11 +66,11 @@ public class XMLRecipientRewriteTable extends 
AbstractRecipientRewriteTable {
     }
 
     @Override
-    protected Mappings getUserDomainMappingsInternal(String user, String 
domain) throws RecipientRewriteTableException {
+    protected Mappings getUserDomainMappingsInternal(String user, Domain 
domain) throws RecipientRewriteTableException {
         if (mappings == null) {
             return null;
         } else {
-            String maps = mappings.get(user + "@" + domain);
+            String maps = mappings.get(user + "@" + domain.asString());
             if (maps != null) {
                 return MappingsImpl.fromRawString(maps);
             } else {
@@ -92,12 +93,12 @@ public class XMLRecipientRewriteTable 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 {
         throw new RecipientRewriteTableException("Read-Only implementation");
     }
 
     @Override
-    protected void removeMappingInternal(String user, String domain, Mapping 
mapping) throws RecipientRewriteTableException {
+    protected void removeMappingInternal(String user, Domain domain, Mapping 
mapping) throws RecipientRewriteTableException {
         throw new RecipientRewriteTableException("Read-Only implementation");
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/data/data-file/src/test/java/org/apache/james/domainlist/xml/XMLDomainListTest.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-file/src/test/java/org/apache/james/domainlist/xml/XMLDomainListTest.java
 
b/server/data/data-file/src/test/java/org/apache/james/domainlist/xml/XMLDomainListTest.java
index 80a8628..7a99107 100644
--- 
a/server/data/data-file/src/test/java/org/apache/james/domainlist/xml/XMLDomainListTest.java
+++ 
b/server/data/data-file/src/test/java/org/apache/james/domainlist/xml/XMLDomainListTest.java
@@ -28,6 +28,7 @@ import java.util.List;
 
 import org.apache.commons.configuration.DefaultConfigurationBuilder;
 import org.apache.commons.configuration.HierarchicalConfiguration;
+import org.apache.james.core.Domain;
 import org.apache.james.dnsservice.api.DNSService;
 import org.apache.james.dnsservice.api.mock.MockDNSService;
 import org.apache.james.domainlist.api.DomainListException;
@@ -39,7 +40,7 @@ import com.google.common.collect.ImmutableList;
 
 public class XMLDomainListTest {
 
-    public static final String DEFAULT_DOMAIN = "default.domain";
+    public static final Domain DEFAULT_DOMAIN = Domain.of("default.domain");
 
     @Rule
     public ExpectedException expectedException = ExpectedException.none();
@@ -52,7 +53,7 @@ public class XMLDomainListTest {
         for (String name : names) {
             configuration.addProperty("domainnames.domainname", name);
         }
-        configuration.addProperty("defaultDomain", DEFAULT_DOMAIN);
+        configuration.addProperty("defaultDomain", DEFAULT_DOMAIN.asString());
         return configuration;
     }
 
@@ -130,7 +131,7 @@ public class XMLDomainListTest {
         XMLDomainList testee = new XMLDomainList(setUpDNSServer("hostname"));
         testee.configure(setUpConfiguration(true, false, domains));
 
-        testee.addDomain("newDomain");
+        testee.addDomain(Domain.of("newDomain"));
     }
 
     @Test
@@ -143,7 +144,7 @@ public class XMLDomainListTest {
         XMLDomainList testee = new XMLDomainList(setUpDNSServer("localhost"));
         testee.configure(setUpConfiguration(true, false, domains));
 
-        testee.removeDomain("newDomain");
+        testee.removeDomain(Domain.of("newDomain"));
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/data/data-file/src/test/java/org/apache/james/rrt/file/XMLRecipientRewriteTableTest.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-file/src/test/java/org/apache/james/rrt/file/XMLRecipientRewriteTableTest.java
 
b/server/data/data-file/src/test/java/org/apache/james/rrt/file/XMLRecipientRewriteTableTest.java
index 0c59bea..c683c60 100644
--- 
a/server/data/data-file/src/test/java/org/apache/james/rrt/file/XMLRecipientRewriteTableTest.java
+++ 
b/server/data/data-file/src/test/java/org/apache/james/rrt/file/XMLRecipientRewriteTableTest.java
@@ -23,6 +23,7 @@ import java.util.List;
 import java.util.Optional;
 
 import org.apache.commons.configuration.DefaultConfigurationBuilder;
+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.AbstractRecipientRewriteTable;
@@ -69,7 +70,7 @@ public class XMLRecipientRewriteTableTest extends 
AbstractRecipientRewriteTableT
     }
 
     @Override
-    protected void addMapping(String user, String domain, String mapping, int 
type) throws
+    protected void addMapping(String user, Domain domain, String mapping, int 
type) throws
             RecipientRewriteTableException {
 
         Mappings mappings = virtualUserTable.getUserDomainMappings(user, 
domain);
@@ -93,7 +94,7 @@ public class XMLRecipientRewriteTableTest extends 
AbstractRecipientRewriteTableT
         Mappings updatedMappings = builder.build();
         
         if (!updatedMappings.isEmpty()) {
-            defaultConfiguration.addProperty("mapping", user + "@" + domain + 
"=" + updatedMappings.serialize());
+            defaultConfiguration.addProperty("mapping", user + "@" + 
domain.asString() + "=" + updatedMappings.serialize());
         }
 
         try {
@@ -107,7 +108,7 @@ public class XMLRecipientRewriteTableTest extends 
AbstractRecipientRewriteTableT
     }
 
     @Override
-    protected void removeMapping(String user, String domain, String mapping, 
int type) throws
+    protected void removeMapping(String user, Domain domain, String mapping, 
int type) throws
             RecipientRewriteTableException {
 
         Mappings mappings = virtualUserTable.getUserDomainMappings(user, 
domain);
@@ -125,11 +126,11 @@ public class XMLRecipientRewriteTableTest extends 
AbstractRecipientRewriteTableT
         } else if (type == ADDRESS_TYPE) {
             mappings = mappings.remove(MappingImpl.address(mapping));
         } else if (type == ALIASDOMAIN_TYPE) {
-            mappings = mappings.remove(MappingImpl.domain(mapping));
+            mappings = mappings.remove(MappingImpl.domain(Domain.of(mapping)));
         }
 
         if (mappings.size() > 0) {
-            defaultConfiguration.addProperty("mapping", user + "@" + domain + 
"=" + mappings.serialize());
+            defaultConfiguration.addProperty("mapping", user + "@" + 
domain.asString() + "=" + mappings.serialize());
         }
 
         try {
@@ -141,10 +142,10 @@ public class XMLRecipientRewriteTableTest extends 
AbstractRecipientRewriteTableT
         }
     }
 
-    private void removeMappingsFromConfig(String user, String domain, Mappings 
mappings) {
+    private void removeMappingsFromConfig(String user, Domain domain, Mappings 
mappings) {
         List<String> stored = new ArrayList<>();
         for (String c : defaultConfiguration.getStringArray("mapping")) {
-            String mapping = user + "@" + domain + "=" + mappings.serialize();
+            String mapping = user + "@" + domain.asString() + "=" + 
mappings.serialize();
             if (!c.equalsIgnoreCase(mapping)) {
                 stored.add(c);
             }

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/data/data-hbase/src/main/java/org/apache/james/domainlist/hbase/HBaseDomainList.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-hbase/src/main/java/org/apache/james/domainlist/hbase/HBaseDomainList.java
 
b/server/data/data-hbase/src/main/java/org/apache/james/domainlist/hbase/HBaseDomainList.java
index d7bdbcc..4e262e2 100644
--- 
a/server/data/data-hbase/src/main/java/org/apache/james/domainlist/hbase/HBaseDomainList.java
+++ 
b/server/data/data-hbase/src/main/java/org/apache/james/domainlist/hbase/HBaseDomainList.java
@@ -21,7 +21,6 @@ package org.apache.james.domainlist.hbase;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Locale;
 
 import javax.inject.Inject;
 
@@ -33,6 +32,7 @@ import org.apache.hadoop.hbase.client.Result;
 import org.apache.hadoop.hbase.client.ResultScanner;
 import org.apache.hadoop.hbase.client.Scan;
 import org.apache.hadoop.hbase.util.Bytes;
+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.hbase.def.HDomainList;
@@ -57,11 +57,11 @@ public class HBaseDomainList extends AbstractDomainList {
     }
 
     @Override
-    protected boolean containsDomainInternal(String domain) throws 
DomainListException {
+    protected boolean containsDomainInternal(Domain domain) throws 
DomainListException {
         HTableInterface table = null;
         try {
             table = TablePool.getInstance().getDomainlistTable();
-            Get get = new Get(Bytes.toBytes(domain.toLowerCase(Locale.US)));
+            Get get = new Get(Bytes.toBytes(domain.asString()));
             Result result = table.get(get);
             if (!result.isEmpty()) {
                 return true;
@@ -82,15 +82,14 @@ public class HBaseDomainList extends AbstractDomainList {
     }
 
     @Override
-    public void addDomain(String domain) throws DomainListException {
-        String lowerCasedDomain = domain.toLowerCase(Locale.US);
-        if (containsDomain(lowerCasedDomain)) {
-            throw new DomainListException(lowerCasedDomain + " already 
exists.");
+    public void addDomain(Domain domain) throws DomainListException {
+        if (containsDomain(domain)) {
+            throw new DomainListException(domain + " already exists.");
         }
         HTableInterface table = null;
         try {
             table = TablePool.getInstance().getDomainlistTable();
-            Put put = new Put(Bytes.toBytes(lowerCasedDomain));
+            Put put = new Put(Bytes.toBytes(domain.asString()));
             put.add(HDomainList.COLUMN_FAMILY_NAME, HDomainList.COLUMN.DOMAIN, 
null);
             table.put(put);
             table.flushCommits();
@@ -109,11 +108,11 @@ public class HBaseDomainList extends AbstractDomainList {
     }
 
     @Override
-    public void removeDomain(String domain) throws DomainListException {
+    public void removeDomain(Domain domain) throws DomainListException {
         HTableInterface table = null;
         try {
             table = TablePool.getInstance().getDomainlistTable();
-            Delete delete = new 
Delete(Bytes.toBytes(domain.toLowerCase(Locale.US)));
+            Delete delete = new Delete(Bytes.toBytes(domain.asString()));
             table.delete(delete);
             table.flushCommits();
         } catch (IOException e) {
@@ -131,8 +130,8 @@ public class HBaseDomainList extends AbstractDomainList {
     }
 
     @Override
-    protected List<String> getDomainListInternal() throws DomainListException {
-        List<String> list = new ArrayList<>();
+    protected List<Domain> getDomainListInternal() throws DomainListException {
+        List<Domain> list = new ArrayList<>();
         HTableInterface table = null;
         ResultScanner resultScanner = null;
         try {
@@ -143,7 +142,7 @@ public class HBaseDomainList extends AbstractDomainList {
             resultScanner = table.getScanner(scan);
             Result result;
             while ((result = resultScanner.next()) != null) {
-                list.add(Bytes.toString(result.getRow()));
+                list.add(Domain.of(Bytes.toString(result.getRow())));
             }
         } catch (IOException e) {
             log.error("Error while counting domains from HBase", e);

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/data/data-hbase/src/main/java/org/apache/james/rrt/hbase/HBaseRecipientRewriteTable.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-hbase/src/main/java/org/apache/james/rrt/hbase/HBaseRecipientRewriteTable.java
 
b/server/data/data-hbase/src/main/java/org/apache/james/rrt/hbase/HBaseRecipientRewriteTable.java
index 1a3cf51..dd9b042 100644
--- 
a/server/data/data-hbase/src/main/java/org/apache/james/rrt/hbase/HBaseRecipientRewriteTable.java
+++ 
b/server/data/data-hbase/src/main/java/org/apache/james/rrt/hbase/HBaseRecipientRewriteTable.java
@@ -33,6 +33,7 @@ import org.apache.hadoop.hbase.client.Result;
 import org.apache.hadoop.hbase.client.ResultScanner;
 import org.apache.hadoop.hbase.client.Scan;
 import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.james.core.Domain;
 import org.apache.james.rrt.api.RecipientRewriteTableException;
 import org.apache.james.rrt.hbase.def.HRecipientRewriteTable;
 import org.apache.james.rrt.lib.AbstractRecipientRewriteTable;
@@ -55,9 +56,9 @@ public class HBaseRecipientRewriteTable extends 
AbstractRecipientRewriteTable {
     private static final String ROW_SEPARATOR = "@";
 
     @Override
-    protected void addMappingInternal(String user, String domain, Mapping 
mapping) throws RecipientRewriteTableException {
+    protected void addMappingInternal(String user, Domain domain, Mapping 
mapping) throws RecipientRewriteTableException {
         String fixedUser = getFixedUser(user);
-        String fixedDomain = getFixedDomain(domain);
+        Domain fixedDomain = getFixedDomain(domain);
         Mappings map = getUserDomainMappings(fixedUser, fixedDomain);
         if (map != null && map.size() != 0) {
             Mappings updatedMappings = 
MappingsImpl.from(map).add(mapping).build();
@@ -68,7 +69,7 @@ public class HBaseRecipientRewriteTable extends 
AbstractRecipientRewriteTable {
     }
 
     @Override
-    protected Mappings getUserDomainMappingsInternal(String user, String 
domain) throws
+    protected Mappings getUserDomainMappingsInternal(String user, Domain 
domain) throws
             RecipientRewriteTableException {
         HTableInterface table = null;
         Mappings list = MappingsImpl.empty();
@@ -90,7 +91,7 @@ public class HBaseRecipientRewriteTable extends 
AbstractRecipientRewriteTable {
         }
     }
 
-    private Mappings feedUserDomainMappingsList(HTableInterface table, String 
user, String domain, Mappings list) throws
+    private Mappings feedUserDomainMappingsList(HTableInterface table, String 
user, Domain domain, Mappings list) throws
             IOException {
         Get get = new Get(Bytes.toBytes(getRowKey(user, domain)));
         Result result = table.get(get);
@@ -153,7 +154,7 @@ public class HBaseRecipientRewriteTable extends 
AbstractRecipientRewriteTable {
     }
 
     @Override
-    protected String mapAddressInternal(String user, String domain) throws 
RecipientRewriteTableException {
+    protected String mapAddressInternal(String user, Domain domain) throws 
RecipientRewriteTableException {
         HTableInterface table = null;
         String mappings = null;
         try {
@@ -163,7 +164,7 @@ public class HBaseRecipientRewriteTable extends 
AbstractRecipientRewriteTable {
                 mappings = getMapping(table, WILDCARD, domain);
             }
             if (mappings == null) {
-                mappings = getMapping(table, user, WILDCARD);
+                mappings = getMapping(table, user, Domains.WILDCARD);
             }
         } catch (IOException e) {
             log.error("Error while mapping address in HBase", e);
@@ -180,7 +181,7 @@ public class HBaseRecipientRewriteTable extends 
AbstractRecipientRewriteTable {
         return mappings;
     }
 
-    private String getMapping(HTableInterface table, String user, String 
domain) throws IOException {
+    private String getMapping(HTableInterface table, String user, Domain 
domain) throws IOException {
         Get get = new Get(Bytes.toBytes(getRowKey(user, domain)));
         Result result = table.get(get);
         List<KeyValue> keyValues = 
result.getColumn(HRecipientRewriteTable.COLUMN_FAMILY_NAME,
@@ -192,10 +193,10 @@ public class HBaseRecipientRewriteTable extends 
AbstractRecipientRewriteTable {
     }
 
     @Override
-    protected void removeMappingInternal(String user, String domain, Mapping 
mapping) throws
+    protected void removeMappingInternal(String user, Domain domain, Mapping 
mapping) throws
             RecipientRewriteTableException {
         String fixedUser = getFixedUser(user);
-        String fixedDomain = getFixedDomain(domain);
+        Domain fixedDomain = getFixedDomain(domain);
         Mappings map = getUserDomainMappings(fixedUser, fixedDomain);
         if (map != null && map.size() > 1) {
             Mappings updatedMappings = map.remove(mapping);
@@ -215,7 +216,7 @@ public class HBaseRecipientRewriteTable extends 
AbstractRecipientRewriteTable {
      * @param mapping the mapping
      * @throws RecipientRewriteTableException
      */
-    private void doUpdateMapping(String user, String domain, String mapping) 
throws RecipientRewriteTableException {
+    private void doUpdateMapping(String user, Domain domain, String mapping) 
throws RecipientRewriteTableException {
         doAddMapping(user, domain, mapping);
     }
 
@@ -227,7 +228,7 @@ public class HBaseRecipientRewriteTable extends 
AbstractRecipientRewriteTable {
      * @param mapping the mapping
      * @throws RecipientRewriteTableException
      */
-    private void doRemoveMapping(String user, String domain, String mapping) 
throws RecipientRewriteTableException {
+    private void doRemoveMapping(String user, Domain domain, String mapping) 
throws RecipientRewriteTableException {
         HTableInterface table = null;
         try {
             table = TablePool.getInstance().getRecipientRewriteTable();
@@ -256,7 +257,7 @@ public class HBaseRecipientRewriteTable extends 
AbstractRecipientRewriteTable {
      * @param mapping the mapping
      * @throws RecipientRewriteTableException
      */
-    private void doAddMapping(String user, String domain, String mapping) 
throws RecipientRewriteTableException {
+    private void doAddMapping(String user, Domain domain, String mapping) 
throws RecipientRewriteTableException {
         HTableInterface table = null;
         try {
             table = TablePool.getInstance().getRecipientRewriteTable();
@@ -286,7 +287,7 @@ public class HBaseRecipientRewriteTable extends 
AbstractRecipientRewriteTable {
      * @param domain
      * @return the key
      */
-    private String getRowKey(String user, String domain) {
-        return user + ROW_SEPARATOR + domain;
+    private String getRowKey(String user, Domain domain) {
+        return user + ROW_SEPARATOR + domain.asString();
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/data/data-hbase/src/test/java/org/apache/james/domainlist/hbase/HBaseDomainListTest.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-hbase/src/test/java/org/apache/james/domainlist/hbase/HBaseDomainListTest.java
 
b/server/data/data-hbase/src/test/java/org/apache/james/domainlist/hbase/HBaseDomainListTest.java
index d8af78c..a9ddf11 100644
--- 
a/server/data/data-hbase/src/test/java/org/apache/james/domainlist/hbase/HBaseDomainListTest.java
+++ 
b/server/data/data-hbase/src/test/java/org/apache/james/domainlist/hbase/HBaseDomainListTest.java
@@ -20,6 +20,7 @@ package org.apache.james.domainlist.hbase;
 
 import java.io.IOException;
 
+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.lib.AbstractDomainListTest;
@@ -55,7 +56,7 @@ public class HBaseDomainListTest extends 
AbstractDomainListTest {
     @After
     public void tearDown() throws Exception {
         DomainList domainList = createDomainList();
-        for (String domain: domainList.getDomains()) {
+        for (Domain domain: domainList.getDomains()) {
             domainList.removeDomain(domain);
         }
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/data/data-hbase/src/test/java/org/apache/james/rrt/hbase/HBaseRecipientRewriteTableTest.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-hbase/src/test/java/org/apache/james/rrt/hbase/HBaseRecipientRewriteTableTest.java
 
b/server/data/data-hbase/src/test/java/org/apache/james/rrt/hbase/HBaseRecipientRewriteTableTest.java
index 7015000..116bc63 100644
--- 
a/server/data/data-hbase/src/test/java/org/apache/james/rrt/hbase/HBaseRecipientRewriteTableTest.java
+++ 
b/server/data/data-hbase/src/test/java/org/apache/james/rrt/hbase/HBaseRecipientRewriteTableTest.java
@@ -19,6 +19,7 @@
 package org.apache.james.rrt.hbase;
 
 import org.apache.commons.configuration.DefaultConfigurationBuilder;
+import org.apache.james.core.Domain;
 import org.apache.james.mailbox.hbase.HBaseClusterSingleton;
 import org.apache.james.rrt.api.RecipientRewriteTableException;
 import org.apache.james.rrt.lib.AbstractRecipientRewriteTable;
@@ -57,7 +58,7 @@ public class HBaseRecipientRewriteTableTest extends 
AbstractRecipientRewriteTabl
     }
 
     @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);
@@ -69,7 +70,7 @@ public class HBaseRecipientRewriteTableTest extends 
AbstractRecipientRewriteTabl
             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);
@@ -77,7 +78,7 @@ public class HBaseRecipientRewriteTableTest extends 
AbstractRecipientRewriteTabl
     }
 
     @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);
@@ -89,7 +90,7 @@ public class HBaseRecipientRewriteTableTest extends 
AbstractRecipientRewriteTabl
             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);

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/data/data-jdbc/src/main/java/org/apache/james/rrt/jdbc/JDBCRecipientRewriteTable.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-jdbc/src/main/java/org/apache/james/rrt/jdbc/JDBCRecipientRewriteTable.java
 
b/server/data/data-jdbc/src/main/java/org/apache/james/rrt/jdbc/JDBCRecipientRewriteTable.java
index a25d33d..9c9ffba 100644
--- 
a/server/data/data-jdbc/src/main/java/org/apache/james/rrt/jdbc/JDBCRecipientRewriteTable.java
+++ 
b/server/data/data-jdbc/src/main/java/org/apache/james/rrt/jdbc/JDBCRecipientRewriteTable.java
@@ -35,6 +35,7 @@ import javax.sql.DataSource;
 
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.HierarchicalConfiguration;
+import org.apache.james.core.Domain;
 import org.apache.james.filesystem.api.FileSystem;
 import org.apache.james.rrt.api.RecipientRewriteTableException;
 import org.apache.james.rrt.lib.AbstractRecipientRewriteTable;
@@ -184,9 +185,9 @@ public class JDBCRecipientRewriteTable 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 {
         String fixedUser = getFixedUser(user);
-        String fixedDomain = getFixedDomain(domain);
+        Domain fixedDomain = getFixedDomain(domain);
         Mappings map = getUserDomainMappings(fixedUser, fixedDomain);
         if (map != null && map.size() != 0) {
             Mappings updatedMappings = 
MappingsImpl.from(map).add(mapping).build();
@@ -196,7 +197,7 @@ public class JDBCRecipientRewriteTable extends 
AbstractRecipientRewriteTable {
     }
 
     @Override
-    protected String mapAddressInternal(String user, String domain) throws 
RecipientRewriteTableException {
+    protected String mapAddressInternal(String user, Domain domain) throws 
RecipientRewriteTableException {
         Connection conn = null;
         PreparedStatement mappingStmt = null;
         try {
@@ -206,7 +207,7 @@ public class JDBCRecipientRewriteTable extends 
AbstractRecipientRewriteTable {
             ResultSet mappingRS = null;
             try {
                 mappingStmt.setString(1, user);
-                mappingStmt.setString(2, domain);
+                mappingStmt.setString(2, domain.asString());
                 mappingRS = mappingStmt.executeQuery();
                 if (mappingRS.next()) {
                     return mappingRS.getString(1);
@@ -226,7 +227,7 @@ public class JDBCRecipientRewriteTable extends 
AbstractRecipientRewriteTable {
     }
 
     @Override
-    protected Mappings getUserDomainMappingsInternal(String user, String 
domain) throws RecipientRewriteTableException {
+    protected Mappings getUserDomainMappingsInternal(String user, Domain 
domain) throws RecipientRewriteTableException {
         Connection conn = null;
         PreparedStatement mappingStmt = null;
         try {
@@ -235,7 +236,7 @@ public class JDBCRecipientRewriteTable extends 
AbstractRecipientRewriteTable {
             ResultSet mappingRS = null;
             try {
                 mappingStmt.setString(1, user);
-                mappingStmt.setString(2, domain);
+                mappingStmt.setString(2, domain.asString());
                 mappingRS = mappingStmt.executeQuery();
                 if (mappingRS.next()) {
                     return MappingsImpl.fromRawString(mappingRS.getString(1));
@@ -266,9 +267,9 @@ public class JDBCRecipientRewriteTable extends 
AbstractRecipientRewriteTable {
                 mappingRS = mappingStmt.executeQuery();
                 while (mappingRS.next()) {
                     String user = mappingRS.getString(1);
-                    String domain = mappingRS.getString(2);
+                    Domain domain = Domain.of(mappingRS.getString(2));
                     String map = mappingRS.getString(3);
-                    mapping.put(user + "@" + domain, 
MappingsImpl.fromRawString(map));
+                    mapping.put(user + "@" + domain.asString(), 
MappingsImpl.fromRawString(map));
                 }
                 if (mapping.size() > 0) {
                     return mapping;
@@ -288,9 +289,9 @@ public class JDBCRecipientRewriteTable extends 
AbstractRecipientRewriteTable {
     }
 
     @Override
-    protected void removeMappingInternal(String user, String domain, Mapping 
mapping) throws RecipientRewriteTableException {
+    protected void removeMappingInternal(String user, Domain domain, Mapping 
mapping) throws RecipientRewriteTableException {
         String fixedUser = getFixedUser(user);
-        String fixedDomain = getFixedDomain(domain);
+        Domain fixedDomain = getFixedDomain(domain);
         Mappings map = getUserDomainMappings(fixedUser, fixedDomain);
         if (map != null && map.size() > 1) {
             Mappings updatedMappings = map.remove(mapping);
@@ -312,7 +313,7 @@ public class JDBCRecipientRewriteTable extends 
AbstractRecipientRewriteTable {
      * @return true if update was successfully
      * @throws RecipientRewriteTableException
      */
-    private void doUpdateMapping(String user, String domain, String mapping) 
throws RecipientRewriteTableException {
+    private void doUpdateMapping(String user, Domain domain, String mapping) 
throws RecipientRewriteTableException {
         Connection conn = null;
         PreparedStatement mappingStmt = null;
 
@@ -324,7 +325,7 @@ public class JDBCRecipientRewriteTable extends 
AbstractRecipientRewriteTable {
             try {
                 mappingStmt.setString(1, mapping);
                 mappingStmt.setString(2, user);
-                mappingStmt.setString(3, domain);
+                mappingStmt.setString(3, domain.asString());
 
                 if (mappingStmt.executeUpdate() < 1) {
                     throw new RecipientRewriteTableException("Mapping not 
found");
@@ -354,7 +355,7 @@ public class JDBCRecipientRewriteTable extends 
AbstractRecipientRewriteTable {
      * @return true if succesfully
      * @throws RecipientRewriteTableException
      */
-    private void doRemoveMapping(String user, String domain, String mapping) 
throws RecipientRewriteTableException {
+    private void doRemoveMapping(String user, Domain domain, String mapping) 
throws RecipientRewriteTableException {
         Connection conn = null;
         PreparedStatement mappingStmt = null;
 
@@ -365,7 +366,7 @@ public class JDBCRecipientRewriteTable extends 
AbstractRecipientRewriteTable {
             ResultSet mappingRS = null;
             try {
                 mappingStmt.setString(1, user);
-                mappingStmt.setString(2, domain);
+                mappingStmt.setString(2, domain.asString());
                 mappingStmt.setString(3, mapping);
                 if (mappingStmt.executeUpdate() < 1) {
                     throw new RecipientRewriteTableException("Mapping not 
found");
@@ -394,7 +395,7 @@ public class JDBCRecipientRewriteTable extends 
AbstractRecipientRewriteTable {
      * @return true if successfully
      * @throws RecipientRewriteTableException
      */
-    private void doAddMapping(String user, String domain, String mapping) 
throws RecipientRewriteTableException {
+    private void doAddMapping(String user, Domain domain, String mapping) 
throws RecipientRewriteTableException {
         Connection conn = null;
         PreparedStatement mappingStmt = null;
 
@@ -405,7 +406,7 @@ public class JDBCRecipientRewriteTable extends 
AbstractRecipientRewriteTable {
             ResultSet mappingRS = null;
             try {
                 mappingStmt.setString(1, user);
-                mappingStmt.setString(2, domain);
+                mappingStmt.setString(2, domain.asString());
                 mappingStmt.setString(3, mapping);
 
                 if (mappingStmt.executeUpdate() < 1) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/data/data-jdbc/src/test/java/org/apache/james/rrt/jdbc/JDBCRecipientRewriteTableTest.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-jdbc/src/test/java/org/apache/james/rrt/jdbc/JDBCRecipientRewriteTableTest.java
 
b/server/data/data-jdbc/src/test/java/org/apache/james/rrt/jdbc/JDBCRecipientRewriteTableTest.java
index 6549074..eb7a734 100644
--- 
a/server/data/data-jdbc/src/test/java/org/apache/james/rrt/jdbc/JDBCRecipientRewriteTableTest.java
+++ 
b/server/data/data-jdbc/src/test/java/org/apache/james/rrt/jdbc/JDBCRecipientRewriteTableTest.java
@@ -21,6 +21,7 @@ package org.apache.james.rrt.jdbc;
 import org.apache.commons.configuration.DefaultConfigurationBuilder;
 import org.apache.commons.dbcp.BasicDataSource;
 import org.apache.derby.jdbc.EmbeddedDriver;
+import org.apache.james.core.Domain;
 import org.apache.james.filesystem.api.mock.MockFileSystem;
 import org.apache.james.rrt.api.RecipientRewriteTableException;
 import org.apache.james.rrt.lib.AbstractRecipientRewriteTable;
@@ -69,7 +70,7 @@ public class JDBCRecipientRewriteTableTest extends 
AbstractRecipientRewriteTable
     }
 
     @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);
@@ -81,7 +82,7 @@ public class JDBCRecipientRewriteTableTest extends 
AbstractRecipientRewriteTable
             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);
@@ -89,7 +90,7 @@ public class JDBCRecipientRewriteTableTest extends 
AbstractRecipientRewriteTable
     }
 
     @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);
@@ -101,7 +102,7 @@ public class JDBCRecipientRewriteTableTest extends 
AbstractRecipientRewriteTable
             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);

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/data/data-jpa/src/main/java/org/apache/james/domainlist/jpa/JPADomainList.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-jpa/src/main/java/org/apache/james/domainlist/jpa/JPADomainList.java
 
b/server/data/data-jpa/src/main/java/org/apache/james/domainlist/jpa/JPADomainList.java
index 6188139..4a4fde6 100644
--- 
a/server/data/data-jpa/src/main/java/org/apache/james/domainlist/jpa/JPADomainList.java
+++ 
b/server/data/data-jpa/src/main/java/org/apache/james/domainlist/jpa/JPADomainList.java
@@ -20,7 +20,6 @@ package org.apache.james.domainlist.jpa;
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Locale;
 
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
@@ -31,6 +30,7 @@ import javax.persistence.NoResultException;
 import javax.persistence.PersistenceException;
 import javax.persistence.PersistenceUnit;
 
+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.jpa.model.JPADomain;
@@ -38,6 +38,7 @@ import org.apache.james.domainlist.lib.AbstractDomainList;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.github.steveash.guavate.Guavate;
 import com.google.common.collect.ImmutableList;
 
 /**
@@ -77,13 +78,19 @@ public class JPADomainList extends AbstractDomainList {
 
     @SuppressWarnings("unchecked")
     @Override
-    protected List<String> getDomainListInternal() throws DomainListException {
-        List<String> domains = new ArrayList<>();
+    protected List<Domain> getDomainListInternal() throws DomainListException {
+        List<Domain> domains = new ArrayList<>();
         EntityManager entityManager = 
entityManagerFactory.createEntityManager();
         final EntityTransaction transaction = entityManager.getTransaction();
         try {
             transaction.begin();
-            domains = 
entityManager.createNamedQuery("listDomainNames").getResultList();
+            List<String> resultList = entityManager
+                    .createNamedQuery("listDomainNames")
+                    .getResultList();
+            domains = resultList
+                    .stream()
+                    .map(domainAsString -> Domain.of(domainAsString))
+                    .collect(Guavate.toImmutableList());
             transaction.commit();
         } catch (PersistenceException e) {
             LOGGER.error("Failed to list domains", e);
@@ -96,13 +103,12 @@ public class JPADomainList extends AbstractDomainList {
     }
 
     @Override
-    protected boolean containsDomainInternal(String domain) throws 
DomainListException {
-        String lowerCasedDomain = domain.toLowerCase(Locale.US);
+    protected boolean containsDomainInternal(Domain domain) throws 
DomainListException {
         EntityManager entityManager = 
entityManagerFactory.createEntityManager();
         final EntityTransaction transaction = entityManager.getTransaction();
         try {
             transaction.begin();
-            boolean result = containsDomainInternal(lowerCasedDomain, 
entityManager);
+            boolean result = containsDomainInternal(domain, entityManager);
             transaction.commit();
             return result;
         } catch (PersistenceException e) {
@@ -115,17 +121,16 @@ public class JPADomainList extends AbstractDomainList {
     }
 
     @Override
-    public void addDomain(String domain) throws DomainListException {
-        String lowerCasedDomain = domain.toLowerCase(Locale.US);
+    public void addDomain(Domain domain) throws DomainListException {
         EntityManager entityManager = 
entityManagerFactory.createEntityManager();
         final EntityTransaction transaction = entityManager.getTransaction();
         try {
             transaction.begin();
-            if (containsDomainInternal(lowerCasedDomain, entityManager)) {
+            if (containsDomainInternal(domain, entityManager)) {
                 transaction.commit();
-                throw new DomainListException(lowerCasedDomain + " already 
exists.");
+                throw new DomainListException(domain + " already exists.");
             }
-            JPADomain jpaDomain = new JPADomain(lowerCasedDomain);
+            JPADomain jpaDomain = new JPADomain(domain);
             entityManager.persist(jpaDomain);
             transaction.commit();
         } catch (PersistenceException e) {
@@ -138,17 +143,16 @@ public class JPADomainList extends AbstractDomainList {
     }
 
     @Override
-    public void removeDomain(String domain) throws DomainListException {
-        String lowerCasedDomain = domain.toLowerCase(Locale.US);
+    public void removeDomain(Domain domain) throws DomainListException {
         EntityManager entityManager = 
entityManagerFactory.createEntityManager();
         final EntityTransaction transaction = entityManager.getTransaction();
         try {
             transaction.begin();
-            if (!containsDomainInternal(lowerCasedDomain, entityManager)) {
+            if (!containsDomainInternal(domain, entityManager)) {
                 transaction.commit();
                 throw new DomainListException(domain + " was not found.");
             }
-            
entityManager.createNamedQuery("deleteDomainByName").setParameter("name", 
lowerCasedDomain).executeUpdate();
+            
entityManager.createNamedQuery("deleteDomainByName").setParameter("name", 
domain.asString()).executeUpdate();
             transaction.commit();
         } catch (PersistenceException e) {
             LOGGER.error("Failed to remove domain", e);
@@ -165,10 +169,10 @@ public class JPADomainList extends AbstractDomainList {
         }
     }
 
-    private boolean containsDomainInternal(String domain, EntityManager 
entityManager) {
+    private boolean containsDomainInternal(Domain domain, EntityManager 
entityManager) {
         try {
             return entityManager.createNamedQuery("findDomainByName")
-                .setParameter("name", domain)
+                .setParameter("name", domain.asString())
                 .getSingleResult() != null;
         } catch (NoResultException e) {
             LOGGER.debug("No domain found", e);

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/data/data-jpa/src/main/java/org/apache/james/domainlist/jpa/model/JPADomain.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-jpa/src/main/java/org/apache/james/domainlist/jpa/model/JPADomain.java
 
b/server/data/data-jpa/src/main/java/org/apache/james/domainlist/jpa/model/JPADomain.java
index f504e49..3b43674 100644
--- 
a/server/data/data-jpa/src/main/java/org/apache/james/domainlist/jpa/model/JPADomain.java
+++ 
b/server/data/data-jpa/src/main/java/org/apache/james/domainlist/jpa/model/JPADomain.java
@@ -25,6 +25,8 @@ import javax.persistence.NamedQueries;
 import javax.persistence.NamedQuery;
 import javax.persistence.Table;
 
+import org.apache.james.core.Domain;
+
 /**
  * Domain class for the James Domain to be used for JPA persistence.
  */
@@ -60,8 +62,8 @@ public class JPADomain {
      * @param name
      *            the name of the Domain
      */
-    public JPADomain(String name) {
-        this.name = name;
+    public JPADomain(Domain name) {
+        this.name = name.asString();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/data/data-jpa/src/main/java/org/apache/james/rrt/jpa/JPARecipientRewriteTable.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-jpa/src/main/java/org/apache/james/rrt/jpa/JPARecipientRewriteTable.java
 
b/server/data/data-jpa/src/main/java/org/apache/james/rrt/jpa/JPARecipientRewriteTable.java
index 0f7a339..44c5c9f 100644
--- 
a/server/data/data-jpa/src/main/java/org/apache/james/rrt/jpa/JPARecipientRewriteTable.java
+++ 
b/server/data/data-jpa/src/main/java/org/apache/james/rrt/jpa/JPARecipientRewriteTable.java
@@ -1,262 +1,279 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-package org.apache.james.rrt.jpa;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.inject.Inject;
-import javax.persistence.EntityManager;
-import javax.persistence.EntityManagerFactory;
-import javax.persistence.EntityTransaction;
-import javax.persistence.PersistenceException;
-import javax.persistence.PersistenceUnit;
-
-import org.apache.james.rrt.api.RecipientRewriteTableException;
-import org.apache.james.rrt.jpa.model.JPARecipientRewrite;
-import org.apache.james.rrt.lib.AbstractRecipientRewriteTable;
-import org.apache.james.rrt.lib.Mapping;
-import org.apache.james.rrt.lib.Mappings;
-import org.apache.james.rrt.lib.MappingsImpl;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Class responsible to implement the Virtual User Table in database with JPA
- * access.
- */
-public class JPARecipientRewriteTable extends AbstractRecipientRewriteTable {
-    private static final Logger LOGGER = 
LoggerFactory.getLogger(JPARecipientRewriteTable.class);
-
-    /**
-     * The entity manager to access the database.
-     */
-    private EntityManagerFactory entityManagerFactory;
-
-    /**
-     * Set the entity manager to use.
-     * 
-     * @param entityManagerFactory
-     */
-    @Inject
-    @PersistenceUnit(unitName = "James")
-    public void setEntityManagerFactory(EntityManagerFactory 
entityManagerFactory) {
-        this.entityManagerFactory = entityManagerFactory;
-    }
-
-    @Override
-    protected void addMappingInternal(String user, String domain, Mapping 
mapping) throws RecipientRewriteTableException {
-        String fixedUser = getFixedUser(user);
-        String fixedDomain = getFixedDomain(domain);
-        Mappings map = getUserDomainMappings(fixedUser, fixedDomain);
-        if (map != null && map.size() != 0) {
-            Mappings updatedMappings = 
MappingsImpl.from(map).add(mapping).build();
-            doUpdateMapping(fixedUser, fixedDomain, 
updatedMappings.serialize());
-        } else {
-            doAddMapping(fixedUser, fixedDomain, mapping.asString());
-        }
-    }
-
-    @Override
-    protected String mapAddressInternal(String user, String domain) throws 
RecipientRewriteTableException {
-        String mapping = getMapping(user, domain, "selectExactMappings");
-        if (mapping != null) {
-            return mapping;
-        }
-        return getMapping(user, domain, "selectMappings");
-    }
-
-    private String getMapping(String user, String domain, String queryName) 
throws RecipientRewriteTableException {
-        EntityManager entityManager = 
entityManagerFactory.createEntityManager();
-        final EntityTransaction transaction = entityManager.getTransaction();
-        try {
-            transaction.begin();
-            @SuppressWarnings("unchecked")
-            List<JPARecipientRewrite> virtualUsers = 
entityManager.createNamedQuery(queryName).setParameter("user", 
user).setParameter("domain", domain).getResultList();
-            transaction.commit();
-            if (virtualUsers.size() > 0) {
-                return virtualUsers.get(0).getTargetAddress();
-            }
-        } catch (PersistenceException e) {
-            LOGGER.debug("Failed to find mapping for  user={} and domain={}", 
user, domain, e);
-            if (transaction.isActive()) {
-                transaction.rollback();
-            }
-            throw new RecipientRewriteTableException("Error while retrieve 
mappings", e);
-        } finally {
-            entityManager.close();
-        }
-        return null;
-    }
-
-    @Override
-    protected Mappings getUserDomainMappingsInternal(String user, String 
domain) throws RecipientRewriteTableException {
-        EntityManager entityManager = 
entityManagerFactory.createEntityManager();
-        final EntityTransaction transaction = entityManager.getTransaction();
-        try {
-            transaction.begin();
-            @SuppressWarnings("unchecked")
-            List<JPARecipientRewrite> virtualUsers = 
entityManager.createNamedQuery("selectUserDomainMapping").setParameter("user", 
user).setParameter("domain", domain).getResultList();
-            transaction.commit();
-            if (virtualUsers.size() > 0) {
-                return 
MappingsImpl.fromRawString(virtualUsers.get(0).getTargetAddress());
-            }
-        } catch (PersistenceException e) {
-            LOGGER.debug("Failed to get user domain mappings", e);
-            if (transaction.isActive()) {
-                transaction.rollback();
-            }
-            throw new RecipientRewriteTableException("Error while retrieve 
mappings", e);
-
-        } finally {
-            entityManager.close();
-        }
-        return null;
-    }
-
-    @Override
-    protected Map<String, Mappings> getAllMappingsInternal() throws 
RecipientRewriteTableException {
-        EntityManager entityManager = 
entityManagerFactory.createEntityManager();
-        final EntityTransaction transaction = entityManager.getTransaction();
-        Map<String, Mappings> mapping = new HashMap<>();
-        try {
-            transaction.begin();
-            @SuppressWarnings("unchecked")
-            List<JPARecipientRewrite> virtualUsers = 
entityManager.createNamedQuery("selectAllMappings").getResultList();
-            transaction.commit();
-            for (JPARecipientRewrite virtualUser : virtualUsers) {
-                mapping.put(virtualUser.getUser() + "@" + 
virtualUser.getDomain(), 
MappingsImpl.fromRawString(virtualUser.getTargetAddress()));
-            }
-            if (mapping.size() > 0) {
-                return mapping;
-            }
-        } catch (PersistenceException e) {
-            LOGGER.debug("Failed to get all mappings", e);
-            if (transaction.isActive()) {
-                transaction.rollback();
-            }
-            throw new RecipientRewriteTableException("Error while retrieve 
mappings", e);
-
-        } finally {
-            entityManager.close();
-        }
-        return null;
-    }
-
-    @Override
-    protected void removeMappingInternal(String user, String domain, Mapping 
mapping) throws RecipientRewriteTableException {
-        String fixedUser = getFixedUser(user);
-        String fixedDomain = getFixedDomain(domain);
-        Mappings map = getUserDomainMappings(fixedUser, fixedDomain);
-        if (map != null && map.size() > 1) {
-            Mappings updatedMappings = map.remove(mapping);
-            doUpdateMapping(fixedUser, fixedDomain, 
updatedMappings.serialize());
-        } else {
-            doRemoveMapping(fixedUser, fixedDomain, mapping.asString());
-        }
-    }
-
-    /**
-     * Update the mapping for the given user and domain
-     * 
-     * @param user the user
-     * @param domain the domain
-     * @param mapping the mapping
-     * @return true if update was successfully
-     * @throws RecipientRewriteTableException
-     */
-    private boolean doUpdateMapping(String user, String domain, String 
mapping) throws RecipientRewriteTableException {
-        EntityManager entityManager = 
entityManagerFactory.createEntityManager();
-        final EntityTransaction transaction = entityManager.getTransaction();
-        try {
-            transaction.begin();
-            int updated = 
entityManager.createNamedQuery("updateMapping").setParameter("targetAddress", 
mapping).setParameter("user", user).setParameter("domain", 
domain).executeUpdate();
-            transaction.commit();
-            if (updated > 0) {
-                return true;
-            }
-        } catch (PersistenceException e) {
-            LOGGER.debug("Failed to update mapping", e);
-            if (transaction.isActive()) {
-                transaction.rollback();
-            }
-            throw new RecipientRewriteTableException("Unable to update 
mapping", e);
-        } finally {
-            entityManager.close();
-        }
-        return false;
-    }
-
-    /**
-     * Remove a mapping for the given user and domain
-     * 
-     * @param user the user
-     * @param domain the domain
-     * @param mapping the mapping
-     * @throws RecipientRewriteTableException
-     */
-    private void doRemoveMapping(String user, String domain, String mapping) 
throws RecipientRewriteTableException {
-        EntityManager entityManager = 
entityManagerFactory.createEntityManager();
-        final EntityTransaction transaction = entityManager.getTransaction();
-        try {
-            transaction.begin();
-            
entityManager.createNamedQuery("deleteMapping").setParameter("user", 
user).setParameter("domain", domain).setParameter("targetAddress", 
mapping).executeUpdate();
-            transaction.commit();
-
-        } catch (PersistenceException e) {
-            LOGGER.debug("Failed to remove mapping", e);
-            if (transaction.isActive()) {
-                transaction.rollback();
-            }
-            throw new RecipientRewriteTableException("Unable to remove 
mapping", e);
-
-        } finally {
-            entityManager.close();
-        }
-    }
-
-    /**
-     * Add mapping for given user and domain
-     * 
-     * @param user the user
-     * @param domain the domain
-     * @param mapping the mapping
-     * @throws RecipientRewriteTableException
-     */
-    private void doAddMapping(String user, String domain, String mapping) 
throws RecipientRewriteTableException {
-        EntityManager entityManager = 
entityManagerFactory.createEntityManager();
-        final EntityTransaction transaction = entityManager.getTransaction();
-        try {
-            transaction.begin();
-            JPARecipientRewrite jpaRecipientRewrite = new 
JPARecipientRewrite(user, domain, mapping);
-            entityManager.persist(jpaRecipientRewrite);
-            transaction.commit();
-        } catch (PersistenceException e) {
-            LOGGER.debug("Failed to save virtual user", e);
-            if (transaction.isActive()) {
-                transaction.rollback();
-            }
-            throw new RecipientRewriteTableException("Unable to add mapping", 
e);
-        } finally {
-            entityManager.close();
-        }
-    }
-
-}
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+package org.apache.james.rrt.jpa;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.inject.Inject;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.EntityTransaction;
+import javax.persistence.PersistenceException;
+import javax.persistence.PersistenceUnit;
+
+import org.apache.james.core.Domain;
+import org.apache.james.rrt.api.RecipientRewriteTableException;
+import org.apache.james.rrt.jpa.model.JPARecipientRewrite;
+import org.apache.james.rrt.lib.AbstractRecipientRewriteTable;
+import org.apache.james.rrt.lib.Mapping;
+import org.apache.james.rrt.lib.Mappings;
+import org.apache.james.rrt.lib.MappingsImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Class responsible to implement the Virtual User Table in database with JPA
+ * access.
+ */
+public class JPARecipientRewriteTable extends AbstractRecipientRewriteTable {
+    private static final Logger LOGGER = 
LoggerFactory.getLogger(JPARecipientRewriteTable.class);
+
+    /**
+     * The entity manager to access the database.
+     */
+    private EntityManagerFactory entityManagerFactory;
+
+    /**
+     * Set the entity manager to use.
+     * 
+     * @param entityManagerFactory
+     */
+    @Inject
+    @PersistenceUnit(unitName = "James")
+    public void setEntityManagerFactory(EntityManagerFactory 
entityManagerFactory) {
+        this.entityManagerFactory = entityManagerFactory;
+    }
+
+    @Override
+    protected void addMappingInternal(String user, Domain domain, Mapping 
mapping) throws RecipientRewriteTableException {
+        String fixedUser = getFixedUser(user);
+        Domain fixedDomain = getFixedDomain(domain);
+        Mappings map = getUserDomainMappings(fixedUser, fixedDomain);
+        if (map != null && map.size() != 0) {
+            Mappings updatedMappings = 
MappingsImpl.from(map).add(mapping).build();
+            doUpdateMapping(fixedUser, fixedDomain, 
updatedMappings.serialize());
+        } else {
+            doAddMapping(fixedUser, fixedDomain, mapping.asString());
+        }
+    }
+
+    @Override
+    protected String mapAddressInternal(String user, Domain domain) throws 
RecipientRewriteTableException {
+        String mapping = getMapping(user, domain, "selectExactMappings");
+        if (mapping != null) {
+            return mapping;
+        }
+        return getMapping(user, domain, "selectMappings");
+    }
+
+    private String getMapping(String user, Domain domain, String queryName) 
throws RecipientRewriteTableException {
+        EntityManager entityManager = 
entityManagerFactory.createEntityManager();
+        final EntityTransaction transaction = entityManager.getTransaction();
+        try {
+            transaction.begin();
+            @SuppressWarnings("unchecked")
+            List<JPARecipientRewrite> virtualUsers = entityManager
+                .createNamedQuery(queryName)
+                .setParameter("user", user)
+                .setParameter("domain", domain.asString())
+                .getResultList();
+            transaction.commit();
+            if (virtualUsers.size() > 0) {
+                return virtualUsers.get(0).getTargetAddress();
+            }
+        } catch (PersistenceException e) {
+            LOGGER.debug("Failed to find mapping for  user={} and domain={}", 
user, domain, e);
+            if (transaction.isActive()) {
+                transaction.rollback();
+            }
+            throw new RecipientRewriteTableException("Error while retrieve 
mappings", e);
+        } finally {
+            entityManager.close();
+        }
+        return null;
+    }
+
+    @Override
+    protected Mappings getUserDomainMappingsInternal(String user, Domain 
domain) throws RecipientRewriteTableException {
+        EntityManager entityManager = 
entityManagerFactory.createEntityManager();
+        final EntityTransaction transaction = entityManager.getTransaction();
+        try {
+            transaction.begin();
+            @SuppressWarnings("unchecked")
+            List<JPARecipientRewrite> virtualUsers = 
entityManager.createNamedQuery("selectUserDomainMapping")
+                .setParameter("user", user)
+                .setParameter("domain", domain.asString())
+                .getResultList();
+            transaction.commit();
+            if (virtualUsers.size() > 0) {
+                return 
MappingsImpl.fromRawString(virtualUsers.get(0).getTargetAddress());
+            }
+        } catch (PersistenceException e) {
+            LOGGER.debug("Failed to get user domain mappings", e);
+            if (transaction.isActive()) {
+                transaction.rollback();
+            }
+            throw new RecipientRewriteTableException("Error while retrieve 
mappings", e);
+
+        } finally {
+            entityManager.close();
+        }
+        return null;
+    }
+
+    @Override
+    protected Map<String, Mappings> getAllMappingsInternal() throws 
RecipientRewriteTableException {
+        EntityManager entityManager = 
entityManagerFactory.createEntityManager();
+        final EntityTransaction transaction = entityManager.getTransaction();
+        Map<String, Mappings> mapping = new HashMap<>();
+        try {
+            transaction.begin();
+            @SuppressWarnings("unchecked")
+            List<JPARecipientRewrite> virtualUsers = 
entityManager.createNamedQuery("selectAllMappings").getResultList();
+            transaction.commit();
+            for (JPARecipientRewrite virtualUser : virtualUsers) {
+                mapping.put(virtualUser.getUser() + "@" + 
virtualUser.getDomain(), 
MappingsImpl.fromRawString(virtualUser.getTargetAddress()));
+            }
+            if (mapping.size() > 0) {
+                return mapping;
+            }
+        } catch (PersistenceException e) {
+            LOGGER.debug("Failed to get all mappings", e);
+            if (transaction.isActive()) {
+                transaction.rollback();
+            }
+            throw new RecipientRewriteTableException("Error while retrieve 
mappings", e);
+
+        } finally {
+            entityManager.close();
+        }
+        return null;
+    }
+
+    @Override
+    protected void removeMappingInternal(String user, Domain domain, Mapping 
mapping) throws RecipientRewriteTableException {
+        String fixedUser = getFixedUser(user);
+        Domain fixedDomain = getFixedDomain(domain);
+        Mappings map = getUserDomainMappings(fixedUser, fixedDomain);
+        if (map != null && map.size() > 1) {
+            Mappings updatedMappings = map.remove(mapping);
+            doUpdateMapping(fixedUser, fixedDomain, 
updatedMappings.serialize());
+        } else {
+            doRemoveMapping(fixedUser, fixedDomain, mapping.asString());
+        }
+    }
+
+    /**
+     * Update the mapping for the given user and domain
+     * 
+     * @param user the user
+     * @param domain the domain
+     * @param mapping the mapping
+     * @return true if update was successfully
+     * @throws RecipientRewriteTableException
+     */
+    private boolean doUpdateMapping(String user, Domain domain, String 
mapping) throws RecipientRewriteTableException {
+        EntityManager entityManager = 
entityManagerFactory.createEntityManager();
+        final EntityTransaction transaction = entityManager.getTransaction();
+        try {
+            transaction.begin();
+            int updated = entityManager
+                .createNamedQuery("updateMapping")
+                .setParameter("targetAddress", mapping)
+                .setParameter("user", user)
+                .setParameter("domain", domain.asString())
+                .executeUpdate();
+            transaction.commit();
+            if (updated > 0) {
+                return true;
+            }
+        } catch (PersistenceException e) {
+            LOGGER.debug("Failed to update mapping", e);
+            if (transaction.isActive()) {
+                transaction.rollback();
+            }
+            throw new RecipientRewriteTableException("Unable to update 
mapping", e);
+        } finally {
+            entityManager.close();
+        }
+        return false;
+    }
+
+    /**
+     * Remove a mapping for the given user and domain
+     * 
+     * @param user the user
+     * @param domain the domain
+     * @param mapping the mapping
+     * @throws RecipientRewriteTableException
+     */
+    private void doRemoveMapping(String user, Domain domain, String mapping) 
throws RecipientRewriteTableException {
+        EntityManager entityManager = 
entityManagerFactory.createEntityManager();
+        final EntityTransaction transaction = entityManager.getTransaction();
+        try {
+            transaction.begin();
+            entityManager.createNamedQuery("deleteMapping")
+                .setParameter("user", user)
+                .setParameter("domain", domain.asString())
+                .setParameter("targetAddress", mapping)
+                .executeUpdate();
+            transaction.commit();
+
+        } catch (PersistenceException e) {
+            LOGGER.debug("Failed to remove mapping", e);
+            if (transaction.isActive()) {
+                transaction.rollback();
+            }
+            throw new RecipientRewriteTableException("Unable to remove 
mapping", e);
+
+        } finally {
+            entityManager.close();
+        }
+    }
+
+    /**
+     * Add mapping for given user and domain
+     * 
+     * @param user the user
+     * @param domain the domain
+     * @param mapping the mapping
+     * @throws RecipientRewriteTableException
+     */
+    private void doAddMapping(String user, Domain domain, String mapping) 
throws RecipientRewriteTableException {
+        EntityManager entityManager = 
entityManagerFactory.createEntityManager();
+        final EntityTransaction transaction = entityManager.getTransaction();
+        try {
+            transaction.begin();
+            JPARecipientRewrite jpaRecipientRewrite = new 
JPARecipientRewrite(user, domain, mapping);
+            entityManager.persist(jpaRecipientRewrite);
+            transaction.commit();
+        } catch (PersistenceException e) {
+            LOGGER.debug("Failed to save virtual user", e);
+            if (transaction.isActive()) {
+                transaction.rollback();
+            }
+            throw new RecipientRewriteTableException("Unable to add mapping", 
e);
+        } finally {
+            entityManager.close();
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/data/data-jpa/src/main/java/org/apache/james/rrt/jpa/model/JPARecipientRewrite.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-jpa/src/main/java/org/apache/james/rrt/jpa/model/JPARecipientRewrite.java
 
b/server/data/data-jpa/src/main/java/org/apache/james/rrt/jpa/model/JPARecipientRewrite.java
index 20e7675..e1f2639 100644
--- 
a/server/data/data-jpa/src/main/java/org/apache/james/rrt/jpa/model/JPARecipientRewrite.java
+++ 
b/server/data/data-jpa/src/main/java/org/apache/james/rrt/jpa/model/JPARecipientRewrite.java
@@ -28,6 +28,8 @@ import javax.persistence.NamedQueries;
 import javax.persistence.NamedQuery;
 import javax.persistence.Table;
 
+import org.apache.james.core.Domain;
+
 import com.google.common.base.Objects;
 
 /**
@@ -114,9 +116,9 @@ public class JPARecipientRewrite {
      * @param user
      *            , domain and their associated targetAddress
      */
-    public JPARecipientRewrite(String user, String domain, String 
targetAddress) {
+    public JPARecipientRewrite(String user, Domain domain, String 
targetAddress) {
         this.user = user;
-        this.domain = domain;
+        this.domain = domain.asString();
         this.targetAddress = targetAddress;
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/data/data-jpa/src/test/java/org/apache/james/domainlist/jpa/JPADomainListTest.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-jpa/src/test/java/org/apache/james/domainlist/jpa/JPADomainListTest.java
 
b/server/data/data-jpa/src/test/java/org/apache/james/domainlist/jpa/JPADomainListTest.java
index 1527e65..0126bb1 100644
--- 
a/server/data/data-jpa/src/test/java/org/apache/james/domainlist/jpa/JPADomainListTest.java
+++ 
b/server/data/data-jpa/src/test/java/org/apache/james/domainlist/jpa/JPADomainListTest.java
@@ -19,6 +19,7 @@
 package org.apache.james.domainlist.jpa;
 
 import org.apache.james.backends.jpa.JpaTestCluster;
+import org.apache.james.core.Domain;
 import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.domainlist.jpa.model.JPADomain;
 import org.apache.james.domainlist.lib.AbstractDomainListTest;
@@ -41,7 +42,7 @@ public class JPADomainListTest extends AbstractDomainListTest 
{
     @After
     public void tearDown() throws Exception {
         DomainList domainList = createDomainList();
-        for (String domain: domainList.getDomains()) {
+        for (Domain domain: domainList.getDomains()) {
             domainList.removeDomain(domain);
         }
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/data/data-jpa/src/test/java/org/apache/james/rrt/jpa/JPARecipientRewriteTableTest.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-jpa/src/test/java/org/apache/james/rrt/jpa/JPARecipientRewriteTableTest.java
 
b/server/data/data-jpa/src/test/java/org/apache/james/rrt/jpa/JPARecipientRewriteTableTest.java
index 85ad4f3..5c6ba96 100644
--- 
a/server/data/data-jpa/src/test/java/org/apache/james/rrt/jpa/JPARecipientRewriteTableTest.java
+++ 
b/server/data/data-jpa/src/test/java/org/apache/james/rrt/jpa/JPARecipientRewriteTableTest.java
@@ -20,6 +20,7 @@ package org.apache.james.rrt.jpa;
 
 import org.apache.commons.configuration.DefaultConfigurationBuilder;
 import org.apache.james.backends.jpa.JpaTestCluster;
+import org.apache.james.core.Domain;
 import org.apache.james.rrt.api.RecipientRewriteTableException;
 import org.apache.james.rrt.jpa.model.JPARecipientRewrite;
 import org.apache.james.rrt.lib.AbstractRecipientRewriteTable;
@@ -56,7 +57,7 @@ public class JPARecipientRewriteTableTest extends 
AbstractRecipientRewriteTableT
     }
 
     @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);
@@ -68,7 +69,7 @@ public class JPARecipientRewriteTableTest extends 
AbstractRecipientRewriteTableT
             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);
@@ -76,7 +77,7 @@ public class JPARecipientRewriteTableTest extends 
AbstractRecipientRewriteTableT
     }
 
     @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);
@@ -88,7 +89,7 @@ public class JPARecipientRewriteTableTest extends 
AbstractRecipientRewriteTableT
             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);

http://git-wip-us.apache.org/repos/asf/james-project/blob/33cb12e5/server/data/data-library/src/main/java/org/apache/james/domainlist/lib/AbstractDomainList.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-library/src/main/java/org/apache/james/domainlist/lib/AbstractDomainList.java
 
b/server/data/data-library/src/main/java/org/apache/james/domainlist/lib/AbstractDomainList.java
index e448492..849dbf6 100644
--- 
a/server/data/data-library/src/main/java/org/apache/james/domainlist/lib/AbstractDomainList.java
+++ 
b/server/data/data-library/src/main/java/org/apache/james/domainlist/lib/AbstractDomainList.java
@@ -23,11 +23,11 @@ import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.util.Arrays;
 import java.util.List;
-import java.util.Locale;
 import java.util.stream.Stream;
 
 import org.apache.commons.configuration.ConfigurationException;
 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.DomainList;
 import org.apache.james.domainlist.api.DomainListException;
@@ -35,6 +35,7 @@ import org.apache.james.lifecycle.api.Configurable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.github.fge.lambdas.Throwing;
 import com.github.steveash.guavate.Guavate;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Strings;
@@ -61,7 +62,7 @@ public abstract class AbstractDomainList implements 
DomainList, Configurable {
     private final EnvDetector envDetector;
     private boolean autoDetect = true;
     private boolean autoDetectIP = true;
-    private String defaultDomain;
+    private Domain defaultDomain;
 
     public AbstractDomainList(DNSService dns, EnvDetector envDetector) {
         this.dns = dns;
@@ -84,26 +85,23 @@ public abstract class AbstractDomainList implements 
DomainList, Configurable {
     }
 
     protected void addConfiguredDomains(HierarchicalConfiguration config) {
-        String[] configuredDomainNames = 
config.getStringArray(CONFIGURE_DOMAIN_NAMES);
-        try {
-            if (configuredDomainNames != null) {
-                for (String domain : Arrays.asList(configuredDomainNames)) {
+        Arrays.stream(config.getStringArray(CONFIGURE_DOMAIN_NAMES))
+            .map(Domain::of)
+            .forEach(
+                Throwing.consumer((Domain domain) -> {
                     if (!containsDomainInternal(domain)) {
-                        addDomain(domain.toLowerCase(Locale.US));
+                        addDomain(domain);
                     }
-                }
-            }
-        } catch (DomainListException e) {
-            throw Throwables.propagate(e);
-        }
+                }).sneakyThrow());
     }
 
+
     private void addEnvDomain() {
         String envDomain = envDetector.getEnv(ENV_DOMAIN);
         if (!Strings.isNullOrEmpty(envDomain)) {
             try {
                 LOGGER.info("Adding environment defined domain {}", envDomain);
-                addDomain(envDomain);
+                addDomain(Domain.of(envDomain));
             } catch (DomainListException e) {
                 throw Throwables.propagate(e);
             }
@@ -112,11 +110,11 @@ public abstract class AbstractDomainList implements 
DomainList, Configurable {
 
     @VisibleForTesting void configureDefaultDomain(HierarchicalConfiguration 
config) throws ConfigurationException {
         try {
-            setDefaultDomain(config.getString(CONFIGURE_DEFAULT_DOMAIN, 
LOCALHOST));
+            
setDefaultDomain(Domain.of(config.getString(CONFIGURE_DEFAULT_DOMAIN, 
LOCALHOST)));
 
             String hostName = InetAddress.getLocalHost().getHostName();
             if (mayChangeDefaultDomain()) {
-                setDefaultDomain(hostName);
+                setDefaultDomain(Domain.of(hostName));
             }
         } catch (UnknownHostException e) {
             LOGGER.warn("Unable to retrieve hostname.", e);
@@ -129,7 +127,7 @@ public abstract class AbstractDomainList implements 
DomainList, Configurable {
         return LOCALHOST.equals(defaultDomain);
     }
 
-    private void setDefaultDomain(String defaultDomain) throws 
DomainListException {
+    private void setDefaultDomain(Domain defaultDomain) throws 
DomainListException {
         if (defaultDomain != null && !containsDomain(defaultDomain)) {
             addDomain(defaultDomain);
         }
@@ -137,7 +135,7 @@ public abstract class AbstractDomainList implements 
DomainList, Configurable {
     }
 
     @Override
-    public String getDefaultDomain() throws DomainListException {
+    public Domain getDefaultDomain() throws DomainListException {
         if (defaultDomain != null) {
             return defaultDomain;
         } else {
@@ -146,25 +144,25 @@ public abstract class AbstractDomainList implements 
DomainList, Configurable {
     }
 
     @Override
-    public boolean containsDomain(String domain) throws DomainListException {
+    public boolean containsDomain(Domain domain) throws DomainListException {
         boolean internalAnswer = containsDomainInternal(domain);
         return internalAnswer || getDomains().contains(domain);
     }
 
     @Override
-    public ImmutableList<String> getDomains() throws DomainListException {
-        List<String> domains = getDomainListInternal();
-        ImmutableList<String> detectedDomains = detectDomains();
+    public ImmutableList<Domain> getDomains() throws DomainListException {
+        List<Domain> domains = getDomainListInternal();
+        ImmutableList<Domain> detectedDomains = detectDomains();
         // Guava does not support concatenating ImmutableLists at this time:
         // 
https://stackoverflow.com/questions/37919648/concatenating-immutablelists
         // A work-around is to use Iterables.concat() until something like
         // https://github.com/google/guava/issues/1029 is implemented.
-        Iterable<String> domainsWithoutIp = Iterables.concat(domains, 
detectedDomains);
-        ImmutableList<String> detectedIps = detectIps(domainsWithoutIp);
-        ImmutableList<String> allDomains = 
ImmutableList.copyOf(Iterables.concat(domainsWithoutIp, detectedIps));
+        Iterable<Domain> domainsWithoutIp = Iterables.concat(domains, 
detectedDomains);
+        ImmutableList<Domain> detectedIps = detectIps(domainsWithoutIp);
+        ImmutableList<Domain> allDomains = 
ImmutableList.copyOf(Iterables.concat(domainsWithoutIp, detectedIps));
 
         if (LOGGER.isDebugEnabled()) {
-            for (String domain : allDomains) {
+            for (Domain domain : allDomains) {
                 LOGGER.debug("Handling mail for: " + domain);
             }
         }
@@ -172,7 +170,7 @@ public abstract class AbstractDomainList implements 
DomainList, Configurable {
         return allDomains;
     }
 
-    private ImmutableList<String> detectIps(Iterable<String> domains) {
+    private ImmutableList<Domain> detectIps(Iterable<Domain> domains) {
         if (autoDetectIP) {
             return getDomainsIpStream(domains, dns, LOGGER)
                 .collect(Guavate.toImmutableList());
@@ -180,7 +178,7 @@ public abstract class AbstractDomainList implements 
DomainList, Configurable {
         return ImmutableList.of();
     }
 
-    private ImmutableList<String> detectDomains() {
+    private ImmutableList<Domain> detectDomains() {
         if (autoDetect) {
             String hostName;
             try {
@@ -191,7 +189,7 @@ public abstract class AbstractDomainList implements 
DomainList, Configurable {
 
             LOGGER.info("Local host is: {}", hostName);
             if (hostName != null && !hostName.equals("localhost")) {
-                return ImmutableList.of(hostName.toLowerCase(Locale.US));
+                return ImmutableList.of(Domain.of(hostName));
             }
         }
         return ImmutableList.of();
@@ -204,16 +202,17 @@ public abstract class AbstractDomainList implements 
DomainList, Configurable {
      *            Iterable of domains
      * @return Stream of ipaddress for domains
      */
-    private static Stream<String> getDomainsIpStream(Iterable<String> domains, 
DNSService dns, Logger log) {
+    private static Stream<Domain> getDomainsIpStream(Iterable<Domain> domains, 
DNSService dns, Logger log) {
         return Guavate.stream(domains)
             .flatMap(domain -> getDomainIpStream(domain, dns, log))
             .distinct();
     }
 
-    private static Stream<String> getDomainIpStream(String domain, DNSService 
dns, Logger log) {
+    private static Stream<Domain> getDomainIpStream(Domain domain, DNSService 
dns, Logger log) {
         try {
-            return dns.getAllByName(domain).stream()
+            return dns.getAllByName(domain.name()).stream()
                 .map(InetAddress::getHostAddress)
+                .map(Domain::of)
                 .distinct();
         } catch (UnknownHostException e) {
             log.error("Cannot get IP address(es) for {}", domain);
@@ -259,8 +258,8 @@ public abstract class AbstractDomainList implements 
DomainList, Configurable {
      * 
      * @return List
      */
-    protected abstract List<String> getDomainListInternal() throws 
DomainListException;
+    protected abstract List<Domain> getDomainListInternal() throws 
DomainListException;
 
-    protected abstract boolean containsDomainInternal(String domain) throws 
DomainListException;
+    protected abstract boolean containsDomainInternal(Domain domain) throws 
DomainListException;
 
 }


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