diff --git a/authentication/source/java/ch/systemsx/cisd/authentication/ldap/LDAPDirectoryConfiguration.java b/authentication/source/java/ch/systemsx/cisd/authentication/ldap/LDAPDirectoryConfiguration.java
index a4eeda1a7648bf9e57f0c1d7598855d1e6065e48..a8f17eb69a5ba2bf423afeec25dff621d902d0c3 100644
--- a/authentication/source/java/ch/systemsx/cisd/authentication/ldap/LDAPDirectoryConfiguration.java
+++ b/authentication/source/java/ch/systemsx/cisd/authentication/ldap/LDAPDirectoryConfiguration.java
@@ -44,6 +44,8 @@ public final class LDAPDirectoryConfiguration
     private String firstNameAttributeName = "givenName";
 
     private String emailAttributeName = "mail";
+    
+    private String emailAttributePrefix = "";
 
     private String securityProtocol = "ssl";
 
@@ -125,6 +127,21 @@ public final class LDAPDirectoryConfiguration
         }
     }
 
+    public String getEmailAttributePrefix()
+    {
+        return emailAttributePrefix;
+    }
+
+    /**
+     * The prefix of email values that is used when doing a search.
+     * <p>
+     * Default value: empty
+     */
+    public void setEmailAttributePrefix(String emailAttributePrefix)
+    {
+        this.emailAttributePrefix = emailAttributePrefix;
+    }
+
     /**
      * Default value: <code>ssl</code>
      * 
diff --git a/authentication/source/java/ch/systemsx/cisd/authentication/ldap/LDAPPrincipalQuery.java b/authentication/source/java/ch/systemsx/cisd/authentication/ldap/LDAPPrincipalQuery.java
index 9e9444f9dc2f72ae50c649f07665b2d624acc3a9..02dd907523ed11efa0f080df50b6e04035b845e1 100644
--- a/authentication/source/java/ch/systemsx/cisd/authentication/ldap/LDAPPrincipalQuery.java
+++ b/authentication/source/java/ch/systemsx/cisd/authentication/ldap/LDAPPrincipalQuery.java
@@ -82,6 +82,18 @@ public final class LDAPPrincipalQuery implements ISelfTestable
     public Principal tryGetPrincipal(String userId) throws IllegalArgumentException
     {
         final List<Principal> principals = listPrincipalsByUserId(userId, 1);
+        return tryGetPrincipal(principals, "User '%s' is not unique.", userId);
+    }
+
+    public Principal tryGetPrincipalByEmail(String email)
+    {
+        final List<Principal> principals = listPrincipalsByEmail(email, 1);
+        return tryGetPrincipal(principals, "Email '%s' is not unique.", email);
+    }
+
+    private Principal tryGetPrincipal(final List<Principal> principals, final String msgTemplate,
+            final String user)
+    {
         if (principals.size() == 0)
         {
             return null;
@@ -91,7 +103,7 @@ public final class LDAPPrincipalQuery implements ISelfTestable
         } else
         {
             // Cannot happen - we have limited the search to 1
-            throw new IllegalArgumentException("User '" + userId + "' is not unique.");
+            throw new IllegalArgumentException(String.format(msgTemplate, user));
         }
     }
 
@@ -114,14 +126,35 @@ public final class LDAPPrincipalQuery implements ISelfTestable
         return listPrincipalsByKeyValue(config.getUserIdAttributeName(), userId, null, limit);
     }
 
+    public List<Principal> listPrincipalsByEmail(String email, int limit)
+    {
+        if (operationLog.isDebugEnabled())
+        {
+            operationLog.debug(String.format("listPrincipalsByEmail(%s,%s)", email, limit));
+        }
+        return listPrincipalsByKeyValue(config.getEmailAttributeName(), config
+                .getEmailAttributePrefix()
+                + email, null, limit);
+    }
+
     public List<Principal> listPrincipalsByEmail(String email)
     {
         if (operationLog.isDebugEnabled())
         {
             operationLog.debug(String.format("listPrincipalsByEmail(%s)", email));
         }
-        return listPrincipalsByKeyValue(config.getEmailAttributeName(), email, null,
-                Integer.MAX_VALUE);
+        return listPrincipalsByKeyValue(config.getEmailAttributeName(), config
+                .getEmailAttributePrefix()
+                + email, null, Integer.MAX_VALUE);
+    }
+
+    public List<Principal> listPrincipalsByLastName(String lastName, int limit)
+    {
+        if (operationLog.isDebugEnabled())
+        {
+            operationLog.debug(String.format("listPrincipalsByLastName(%s,%s)", lastName, limit));
+        }
+        return listPrincipalsByKeyValue(config.getLastNameAttributeName(), lastName, null, limit);
     }
 
     public List<Principal> listPrincipalsByLastName(String lastName)