diff --git a/ad-connector/src/main/java/net/jami/jams/ad/connector/ADConnector.java b/ad-connector/src/main/java/net/jami/jams/ad/connector/ADConnector.java
index 28867e97d37b16bca7c31eb2053f3c38533451cb..80d93744d8e335c7e6d8e072ef4d6937dc03e98b 100644
--- a/ad-connector/src/main/java/net/jami/jams/ad/connector/ADConnector.java
+++ b/ad-connector/src/main/java/net/jami/jams/ad/connector/ADConnector.java
@@ -93,8 +93,15 @@ public class ADConnector implements AuthenticationSource {
     }
 
     @Override
-    public List<UserProfile> getUserProfile(String queryString, String field) {
-        return userProfileService.getUserProfile(queryString, field);
+    public List<UserProfile> searchUserProfiles(String queryString, String field) {
+        return userProfileService.getUserProfile(queryString, field,false);
+    }
+
+    @Override
+    public UserProfile getUserProfile(String username) {
+        List<UserProfile> result = userProfileService.getUserProfile(username, "LOGON_NAME",true);
+        if(result == null || result.size() != 1) return null;
+        return result.get(0);
     }
 
     @Override
diff --git a/ad-connector/src/main/java/net/jami/jams/ad/connector/service/UserProfileService.java b/ad-connector/src/main/java/net/jami/jams/ad/connector/service/UserProfileService.java
index e3d62c44247909d7bc9cb00da2f1b43d56d3ccda..4aaef1cfe3f1ef5e5552849d2d68b771aaf90dc9 100644
--- a/ad-connector/src/main/java/net/jami/jams/ad/connector/service/UserProfileService.java
+++ b/ad-connector/src/main/java/net/jami/jams/ad/connector/service/UserProfileService.java
@@ -51,9 +51,8 @@ public class UserProfileService {
 
     private static final HashMap<String, String> fieldMap = ADConnector.settings.getFieldMappings();
 
-    public List<UserProfile> getUserProfile(String queryString, String field) {
+    public List<UserProfile> getUserProfile(String queryString, String field,boolean exactMatch) {
         Endpoint endpoint = ADConnector.getConnection();
-        UserProfile[] profiles = null;
         try {
             QueryRequest queryRequest = buildRequest(endpoint);
             Sentence sentence = null;
@@ -61,8 +60,14 @@ public class UserProfileService {
                 sentence = new QueryAssembler().addPhrase(FieldType.OBJECT_CLASS, PhraseOperator.EQUAL, ObjectType.USER.toString()).closeSentence();
             } else {
                 if (field.equals("LOGON_NAME")) {
-                    sentence = new QueryAssembler().addPhrase(FieldType.LOGON_NAME, PhraseOperator.CONTAINS, queryString)
-                        .closeSentence();
+                    if(exactMatch){
+                        sentence = new QueryAssembler().addPhrase(FieldType.LOGON_NAME, PhraseOperator.EQUAL, queryString)
+                            .closeSentence();
+                    }
+                    else {
+                        sentence = new QueryAssembler().addPhrase(FieldType.LOGON_NAME, PhraseOperator.CONTAINS, queryString)
+                            .closeSentence();
+                    }
                 }
                 if (field.equals("FULL_TEXT_NAME")) {
                     sentence = new QueryAssembler().addPhrase(FieldType.FIRST_NAME, PhraseOperator.CONTAINS, queryString)
diff --git a/datastore/src/main/java/net/jami/datastore/main/DataStore.java b/datastore/src/main/java/net/jami/datastore/main/DataStore.java
index 7e83e187fbd018bc268e10169987daa21fdf0392..e9b1dc82c09fa162be0efd0842bbec1c4446164f 100644
--- a/datastore/src/main/java/net/jami/datastore/main/DataStore.java
+++ b/datastore/src/main/java/net/jami/datastore/main/DataStore.java
@@ -80,7 +80,7 @@ public class DataStore implements AuthenticationSource {
         return userDao.storeObject(user);
     }
     @Override
-    public List<UserProfile> getUserProfile(String queryString, String field) {
+    public List<UserProfile> searchUserProfiles(String queryString, String field) {
         List<UserProfile> userList;
 
         if (!queryString.equals("*")) {
@@ -100,6 +100,15 @@ public class DataStore implements AuthenticationSource {
         return userList;
     }
 
+    @Override
+    public UserProfile getUserProfile(String username) {
+        StatementList statementList = new StatementList();
+        statementList.addStatement(new StatementElement("username","=", username,""));
+        List<UserProfile> userList = userProfileDao.getObjects(statementList);
+        if(userList.size() != 1) return null;
+        else return userList.get(0);
+    }
+
     @Override
     public boolean setUserProfile(UserProfile userProfile) {
         return userProfileDao.storeObject(userProfile);
diff --git a/jami-nameserver/src/main/java/net/jami/jams/nameserver/LocalNameServer.java b/jami-nameserver/src/main/java/net/jami/jams/nameserver/LocalNameServer.java
index 7d6b7964613e1c554834cb86e3b58c913e31f244..08acf7876155847de434256079c6f5aad2802329 100644
--- a/jami-nameserver/src/main/java/net/jami/jams/nameserver/LocalNameServer.java
+++ b/jami-nameserver/src/main/java/net/jami/jams/nameserver/LocalNameServer.java
@@ -69,9 +69,10 @@ public class LocalNameServer implements NameServer {
             //Reattempt resolution via directory lookups.
             final User user = new User();
             for(AuthModuleKey key : authenticationModule.getAuthSources().keySet()){
-                List<UserProfile> profiles = authenticationModule.getAuthSources().get(key).getUserProfile(username,"LOGON_NAME");
-                if(profiles != null && profiles.size() == 1){
-                    user.setUsername(username);
+                UserProfile profile = authenticationModule.getAuthSources().get(key).getUserProfile(username);
+                if(profile != null){
+                    //Use the username from the profile, not the one supplied otherwise phantom users will be created.
+                    user.setUsername(profile.getUsername());
                     user.setRealm(key.getRealm());
                     user.setUserType(key.getType());
                     user.setAccessLevel(AccessLevel.USER);
diff --git a/jams-common/src/main/java/net/jami/jams/common/authentication/AuthenticationSource.java b/jams-common/src/main/java/net/jami/jams/common/authentication/AuthenticationSource.java
index 170e5bb37f0447a0d7568dcf53ab52499306f67f..b65fb69544a79304b952ecd81c1bcc88968388d3 100644
--- a/jams-common/src/main/java/net/jami/jams/common/authentication/AuthenticationSource.java
+++ b/jams-common/src/main/java/net/jami/jams/common/authentication/AuthenticationSource.java
@@ -30,7 +30,8 @@ import java.util.List;
 public interface AuthenticationSource {
 
     boolean createUser(User user);
-    List<UserProfile> getUserProfile(String queryString, String field);
+    List<UserProfile> searchUserProfiles(String queryString, String field);
+    UserProfile getUserProfile(String username);
     boolean setUserProfile(UserProfile userProfile);
     boolean authenticate(String username, String password);
     AuthenticationSourceInfo getInfo();
diff --git a/jams-server/src/main/java/net/jami/jams/server/core/workflows/RegisterDeviceFlow.java b/jams-server/src/main/java/net/jami/jams/server/core/workflows/RegisterDeviceFlow.java
index 09f67e6935a547ed23151e69fd238792f80ec418..56aaed6a293eb5e7324870a634a761a6ec10ba0c 100644
--- a/jams-server/src/main/java/net/jami/jams/server/core/workflows/RegisterDeviceFlow.java
+++ b/jams-server/src/main/java/net/jami/jams/server/core/workflows/RegisterDeviceFlow.java
@@ -50,7 +50,7 @@ public class RegisterDeviceFlow {
             User user = dataStore.getUserDao().getObjects(statementList).get(0);
             UserProfile userProfile = userAuthenticationModule.getAuthSources()
                     .get(new AuthModuleKey(user.getRealm(),user.getUserType()))
-                    .getUserProfile(username,"LOGON_NAME").get(0);
+                    .searchUserProfiles(username,"LOGON_NAME").get(0);
 
             if (user == null) {
                 log.error("Tried to enroll a device, but could not find a user, this is impossible!");
diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/directory/DirectoryEntryServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/directory/DirectoryEntryServlet.java
index 3511994c258b0447181ba60efe8ad86e6119fc20..aa73eaf5118249b8351bd391bca0ca93f3099bcd 100644
--- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/directory/DirectoryEntryServlet.java
+++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/directory/DirectoryEntryServlet.java
@@ -34,7 +34,6 @@ import net.jami.jams.common.objects.user.UserProfile;
 
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 
 import static net.jami.jams.server.Server.userAuthenticationModule;
@@ -195,7 +194,7 @@ public class DirectoryEntryServlet extends HttpServlet {
         if (req.getParameter("directory") != null && req.getParameter("directoryType") != null) {
             List<UserProfile> profiles = userAuthenticationModule.getAuthSources()
                     .get(new AuthModuleKey(req.getParameter("directory"), AuthenticationSourceType.fromString(req.getParameter("directoryType"))))
-                    .getUserProfile(req.getParameter("username"), "LOGON_NAME");
+                    .searchUserProfiles(req.getParameter("username"), "LOGON_NAME");
             if(req.getParameter("format") != null && req.getParameter("format").equals("vcard")){
                 resp.getOutputStream().write(profiles.get(0).getAsVCard().getBytes());
             }
@@ -204,7 +203,7 @@ public class DirectoryEntryServlet extends HttpServlet {
         }
         List<UserProfile> userProfiles = new ArrayList<>();
         userAuthenticationModule.getAuthSources().forEach((k, v) -> {
-            userProfiles.addAll(v.getUserProfile(req.getParameter("username"), "LOGON_NAME"));
+            userProfiles.addAll(v.searchUserProfiles(req.getParameter("username"), "LOGON_NAME"));
         });
         if(req.getParameter("format") != null && req.getParameter("format").equals("vcard")){
             resp.getOutputStream().write(userProfiles.get(0).getAsVCard().getBytes());
diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/directory/SearchDirectoryServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/directory/SearchDirectoryServlet.java
index de295eac806cc48ad061657dd44a04611c955ad1..ce2c53815c91e75deed1543ceb5855c646739334 100644
--- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/directory/SearchDirectoryServlet.java
+++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/directory/SearchDirectoryServlet.java
@@ -36,7 +36,6 @@ import net.jami.jams.common.objects.user.UserProfile;
 
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 
 import static net.jami.jams.server.Server.dataStore;
@@ -57,10 +56,10 @@ public class SearchDirectoryServlet extends HttpServlet {
     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
         List<UserProfile> userProfiles = new ArrayList<>();
         userAuthenticationModule.getAuthSources().forEach((k, v) -> {
-            List<UserProfile> profiles = v.getUserProfile(req.getParameter("queryString"), "FULL_TEXT_NAME");
+            List<UserProfile> profiles = v.searchUserProfiles(req.getParameter("queryString"), "FULL_TEXT_NAME");
             if(profiles == null || profiles.size() == 0){
                 // check logon names if nothing was found
-                profiles = v.getUserProfile(req.getParameter("queryString"), "LOGON_NAME");
+                profiles = v.searchUserProfiles(req.getParameter("queryString"), "LOGON_NAME");
             }
             profiles.parallelStream().forEach(profile -> {
                 StatementList statementList = new StatementList();
diff --git a/ldap-connector/src/main/java/net/jami/jams/ldap/connector/LDAPConnector.java b/ldap-connector/src/main/java/net/jami/jams/ldap/connector/LDAPConnector.java
index bd6f4495705eb0cf35410cdba65fab6b77ee8159..8179ed2192ceec1c03f2f500ce368dc48715e9b6 100644
--- a/ldap-connector/src/main/java/net/jami/jams/ldap/connector/LDAPConnector.java
+++ b/ldap-connector/src/main/java/net/jami/jams/ldap/connector/LDAPConnector.java
@@ -69,8 +69,15 @@ public class LDAPConnector implements AuthenticationSource {
     }
 
     @Override
-    public List<UserProfile> getUserProfile(String queryString, String field) {
-        return userProfileService.getUserProfile(queryString,field);
+    public List<UserProfile> searchUserProfiles(String queryString, String field) {
+        return userProfileService.getUserProfile(queryString,field,false);
+    }
+
+    @Override
+    public UserProfile getUserProfile(String username) {
+        List<UserProfile> results = userProfileService.getUserProfile(username,"LOGON_NAME",true);
+        if(results == null || results.size() != 1) return null;
+        return results.get(0);
     }
 
     @Override
@@ -91,7 +98,7 @@ public class LDAPConnector implements AuthenticationSource {
 
     @Override
     public boolean test() {
-        return (getUserProfile("*","LOGON_NAME").size() != 0);
+        return (searchUserProfiles("*","LOGON_NAME").size() != 0);
     }
 
 
diff --git a/ldap-connector/src/main/java/net/jami/jams/ldap/connector/service/UserProfileService.java b/ldap-connector/src/main/java/net/jami/jams/ldap/connector/service/UserProfileService.java
index 711392288337fd748040c26ce3eedf35f8862cf8..854944b01e1cad67c23a75dec332734aac6d69c6 100644
--- a/ldap-connector/src/main/java/net/jami/jams/ldap/connector/service/UserProfileService.java
+++ b/ldap-connector/src/main/java/net/jami/jams/ldap/connector/service/UserProfileService.java
@@ -50,7 +50,7 @@ public class UserProfileService {
         this.connectionFactory = connectionFactory;
     }
 
-    public List<UserProfile> getUserProfile(String queryString, String field){
+    public List<UserProfile> getUserProfile(String queryString, String field, boolean exactMatch){
         Connection connection = null;
         try {
             queryString = queryString.replaceAll("[^\\x00-\\x7F]","*");
@@ -58,7 +58,7 @@ public class UserProfileService {
             try {
                 connection.open();
                 SearchOperation search = new SearchOperation(connectionFactory);
-                SearchResponse res = search.execute(buildRequest(queryString,field));
+                SearchResponse res = search.execute(buildRequest(queryString,field, exactMatch));
                 if (res.getEntries().size() == 0) return null;
                 return res.getEntries().stream().map(UserProfileService::profileFromResponse).collect(Collectors.toList());
             } catch (Exception e) {
@@ -76,10 +76,12 @@ public class UserProfileService {
     }
 
 
-    public static SearchRequest buildRequest(String queryString, String field) {
+    public static SearchRequest buildRequest(String queryString, String field, boolean exactMatch) {
 
-        if (!queryString.startsWith("*"))
-            queryString = "*".concat(queryString).concat("*");
+        if(!exactMatch) {
+            if (!queryString.startsWith("*"))
+                queryString = "*".concat(queryString).concat("*");
+        }
 
         if(field.equals("LOGON_NAME")) {
             return SearchRequest.builder()
diff --git a/ldap-connector/src/test/java/tests/GenericLDAPTest.java b/ldap-connector/src/test/java/tests/GenericLDAPTest.java
index 1525e1bb4681db67f307509db9667ee83ee167b9..82cb05e5146f6428835e6a427b8c8fd81663258f 100644
--- a/ldap-connector/src/test/java/tests/GenericLDAPTest.java
+++ b/ldap-connector/src/test/java/tests/GenericLDAPTest.java
@@ -34,7 +34,7 @@ public class GenericLDAPTest {
     @Test
     public void testLookUp() throws Exception{
         initLdapConnector();
-        List<UserProfile> profiles = ldapConnector.getUserProfile("*","FULL_TEXT_NAME");
+        List<UserProfile> profiles = ldapConnector.searchUserProfiles("*","FULL_TEXT_NAME");
         Assertions.assertEquals(2,profiles.size());
         Assertions.assertNotNull(profiles.get(0).getFirstName());
         Assertions.assertNotNull(profiles.get(1).getFirstName());
@@ -53,7 +53,7 @@ public class GenericLDAPTest {
     @Test
     public void getVcard() throws Exception{
         initLdapConnector();
-        List<UserProfile> profiles = ldapConnector.getUserProfile("Felix","FULL_TEXT_NAME");
+        List<UserProfile> profiles = ldapConnector.searchUserProfiles("Felix","FULL_TEXT_NAME");
         Assert.assertEquals(1,profiles.size());
         Assert.assertNotNull(profiles.get(0).getUsername());
         String vcard = profiles.get(0).getAsVCard();
diff --git a/versions.json b/versions.json
index 9916d14194aa5a84daab70a855a27b55e0be5f3e..d798f29682750f59b41737d2b845a105ceee1754 100644
--- a/versions.json
+++ b/versions.json
@@ -2,26 +2,26 @@
     "net.jami.jams.ad.connector.ADConnector": {
         "version": "2.0", 
         "filename": "ad-connector.jar", 
-        "md5": "bd362666285da485a316e93f934b66a7"
+        "md5": "9ae70d75d615ee650a6f930c9700de96"
     }, 
     "net.jami.jams.authmodule.UserAuthenticationModule": {
         "version": "2.0", 
         "filename": "authentication-module.jar", 
-        "md5": "da9f724c4162593cf80f6c6e7260c1b2"
+        "md5": "d69348e9c6bd62678880fea25ed03605"
     }, 
     "net.jami.jams.server.Server": {
         "version": "2.0", 
-        "md5": "ae811d245d4e10b45f4530a08fce3c8e", 
+        "md5": "bd2af8ffbd4c41ea5f86cc508d1ea5c8", 
         "filename": "jams-server.jar"
     }, 
     "net.jami.jams.ca.JamsCA": {
         "version": "2.0", 
-        "md5": "fbcb88fbe485c2803cc388b4a33da752", 
+        "md5": "4bbfb901bb528ff77fec1c9d0a2d8b45", 
         "filename": "cryptoengine.jar"
     }, 
     "net.jami.jams.ldap.connector.LDAPConnector": {
         "version": "2.0", 
-        "md5": "366361cb125966f86ea7b2192ee9c10c", 
+        "md5": "1094b1742b016e39824693a511978916", 
         "filename": "ldap-connector.jar"
     }
 }
\ No newline at end of file