diff --git a/projects/cadcAccessControl-Server/build.xml b/projects/cadcAccessControl-Server/build.xml
index b5ad9f91fe28e1e3606f3b6ab652d333b722271e..a5fea3d97328b8ea86663092f3136e7528463a7b 100644
--- a/projects/cadcAccessControl-Server/build.xml
+++ b/projects/cadcAccessControl-Server/build.xml
@@ -148,7 +148,7 @@
         <pathelement path="${jars}:${testingJars}"/>
       </classpath>
       <sysproperty key="ca.nrc.cadc.util.PropertiesReader.dir" value="test"/>
-      <test name="ca.nrc.cadc.ac.server.web.users.UserActionFactoryTest" />
+      <test name="ca.nrc.cadc.ac.server.ldap.LdapUserDAOTest" />
       <formatter type="plain" usefile="false" />
     </junit>
   </target>
diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/UserPersistence.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/UserPersistence.java
index 070080806602418dc3d0b5cacfc8849e375b0869..a384111bc699d2365af43f5f19b25bf123ba7570 100755
--- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/UserPersistence.java
+++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/UserPersistence.java
@@ -133,7 +133,22 @@ public interface UserPersistence<T extends Principal>
     User<T> getPendingUser(T userID)
             throws UserNotFoundException, TransientException,
                    AccessControlException;
-    
+
+    /**
+     * Get the user specified by userID with all of the users identities.
+     *
+     * @param userID The userID.
+     *
+     * @return User instance.
+     *
+     * @throws UserNotFoundException when the user is not found.
+     * @throws TransientException If an temporary, unexpected problem occurred.
+     * @throws AccessControlException If the operation is not permitted.
+     */
+    User<T> getAugmentedUser(T userID)
+        throws UserNotFoundException, TransientException,
+               AccessControlException;
+
     /**
      * Attempt to login the specified user.
      *
@@ -148,7 +163,7 @@ public interface UserPersistence<T extends Principal>
      */
     Boolean doLogin(String userID, String password)
             throws UserNotFoundException, TransientException, 
-            AccessControlException;
+                   AccessControlException;
    
     /**
      * Updated the user specified by User.
diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapDAO.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapDAO.java
index dae9d245d651331b3a0994cbbfa5d63141c60eaf..9df8ef92109a19d612bd3aab99630494bce9a301 100755
--- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapDAO.java
+++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapDAO.java
@@ -68,22 +68,17 @@
  */
 package ca.nrc.cadc.ac.server.ldap;
 
-import ca.nrc.cadc.auth.HttpPrincipal;
-import ca.nrc.cadc.auth.NumericPrincipal;
-import ca.nrc.cadc.auth.OpenIdPrincipal;
+import ca.nrc.cadc.auth.DNPrincipal;
 import ca.nrc.cadc.net.TransientException;
 import com.unboundid.ldap.sdk.DN;
 import com.unboundid.ldap.sdk.LDAPConnection;
 import com.unboundid.ldap.sdk.LDAPException;
 import com.unboundid.ldap.sdk.ResultCode;
-import com.unboundid.ldap.sdk.SearchResult;
-import com.unboundid.ldap.sdk.SearchScope;
 import org.apache.log4j.Logger;
 
 import javax.net.SocketFactory;
 import javax.net.ssl.SSLSocketFactory;
 import javax.security.auth.Subject;
-import javax.security.auth.x500.X500Principal;
 import java.security.AccessControlException;
 import java.security.AccessController;
 import java.security.GeneralSecurityException;
@@ -159,12 +154,12 @@ public abstract class LdapDAO
         }
     }
 
-    protected DN getSubjectDN() throws LDAPException
+    protected DN getSubjectDN()
+        throws LDAPException
     {
         if (subjDN == null)
         {
-            Subject callerSubject =
-                    Subject.getSubject(AccessController.getContext());
+            Subject callerSubject = getSubject();
             if (callerSubject == null)
             {
                 throw new AccessControlException("Caller not authenticated.");
@@ -176,48 +171,18 @@ public abstract class LdapDAO
                 throw new AccessControlException("Caller not authenticated.");
             }
 
-            String ldapField = null;
             for (Principal p : principals)
             {
-                if (p instanceof HttpPrincipal)
+                if (p instanceof DNPrincipal)
                 {
-                    ldapField = "(uid=" + p.getName() + ")";
-                    break;
-                }
-                if (p instanceof NumericPrincipal)
-                {
-                    ldapField = "(numericid=" + p.getName() + ")";
-                    break;
-                }
-                if (p instanceof X500Principal)
-                {
-                    ldapField = "(distinguishedname=" + p.getName() + ")";
-                    break;
-                }
-                if (p instanceof OpenIdPrincipal)
-                {
-                    ldapField = "(openid=" + p.getName() + ")";
-                    break;
+                    subjDN = new DN(p.getName());
                 }
             }
 
-            if (ldapField == null)
+            if (subjDN == null)
             {
                 throw new AccessControlException("Identity of caller unknown.");
             }
-
-            SearchResult searchResult =
-                    getConnection().search(config.getUsersDN(), SearchScope.ONE,
-                            ldapField, "entrydn");
-
-            if (searchResult.getEntryCount() < 1)
-            {
-                throw new AccessControlException(
-                        "No LDAP account when search with rule " + ldapField);
-            }
-
-            subjDN = (searchResult.getSearchEntries().get(0))
-                    .getAttributeValueAsDN("entrydn");
         }
         return subjDN;
     }
@@ -268,4 +233,9 @@ public abstract class LdapDAO
         throw new RuntimeException("Ldap error (" + code.getName() + ")");
     }
 
+    protected Subject getSubject()
+    {
+        return Subject.getSubject(AccessController.getContext());
+    }
+
 }
diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapUserDAO.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapUserDAO.java
index 5108b0828c2c1618262d3aa22e63eedc69057829..a0ff3e64d3a2c86e603bb704d59e83366adcf4e6 100755
--- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapUserDAO.java
+++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapUserDAO.java
@@ -80,6 +80,7 @@ import java.util.Random;
 
 import javax.security.auth.x500.X500Principal;
 
+import ca.nrc.cadc.auth.DNPrincipal;
 import org.apache.log4j.Logger;
 
 import ca.nrc.cadc.ac.PersonalDetails;
@@ -156,6 +157,10 @@ public class LdapUserDAO<T extends Principal> extends LdapDAO
             {
                     LDAP_FIRST_NAME, LDAP_LAST_NAME
             };
+    private String[] identityAttribs = new String[]
+        {
+            LDAP_UID, LDAP_DISTINGUISHED_NAME, LDAP_NUMERICID, LDAP_ENTRYDN
+        };
 
     public LdapUserDAO(LdapConfig config)
     {
@@ -545,6 +550,61 @@ public class LdapUserDAO<T extends Principal> extends LdapDAO
         return user;
     }
 
+    public User<T> getAugmentedUser(final T userID)
+        throws UserNotFoundException, TransientException,
+        AccessControlException
+    {
+        String searchField = userLdapAttrib.get(userID.getClass());
+        if (searchField == null)
+        {
+            throw new IllegalArgumentException(
+                "Unsupported principal type " + userID.getClass());
+        }
+
+        try
+        {
+            Filter filter =
+                Filter.createNOTFilter(Filter.createPresenceFilter("nsaccountlock"));
+            filter =
+                Filter.createANDFilter(filter,
+                    Filter.createEqualityFilter(searchField, userID.getName()));
+
+            SearchRequest searchRequest =
+                new SearchRequest(config.getUsersDN(), SearchScope.ONE,
+                    filter, identityAttribs);
+
+            searchRequest.addControl(
+                new ProxiedAuthorizationV2RequestControl(
+                    "dn:" + getSubjectDN().toNormalizedString()));
+
+            SearchResultEntry searchResult = getConnection().searchForEntry(searchRequest);
+
+            if (searchResult == null)
+            {
+                String msg = "User not found " + userID.toString();
+                logger.debug(msg);
+                throw new UserNotFoundException(msg);
+            }
+
+            User<T> user = new User<T>(userID);
+            user.getIdentities().add(new HttpPrincipal(
+                searchResult.getAttributeValue(LDAP_UID)));
+            user.getIdentities().add(new NumericPrincipal(
+                searchResult.getAttributeValueAsLong(LDAP_NUMERICID)));
+            user.getIdentities().add(new X500Principal(
+                searchResult.getAttributeValue(LDAP_DISTINGUISHED_NAME)));
+            user.getIdentities().add(new DNPrincipal(
+                searchResult.getAttributeValue(LDAP_ENTRYDN)));
+            return user;
+        }
+        catch (LDAPException e)
+        {
+            logger.debug("getGroup Exception: " + e, e);
+            LdapDAO.checkLdapResult(e.getResultCode());
+            throw new RuntimeException("BUG: checkLdapResult didn't throw an exception");
+        }
+    }
+
     /**
      * Obtain whether the given DN tree requires authentication.
      *
diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapUserPersistence.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapUserPersistence.java
index fd8b41ec1abb427b629fc026f53eda34b767937a..1489d221cccae4f434e8a720a0b53375656c9cbc 100755
--- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapUserPersistence.java
+++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapUserPersistence.java
@@ -202,6 +202,36 @@ public class LdapUserPersistence<T extends Principal>
         }
     }
 
+    /**
+     * Get the user specified by userID with all of the users identities.
+     *
+     * @param userID The userID.
+     *
+     * @return User instance.
+     *
+     * @throws UserNotFoundException when the user is not found.
+     * @throws TransientException If an temporary, unexpected problem occurred.
+     * @throws AccessControlException If the operation is not permitted.
+     */
+    public User<T> getAugmentedUser(T userID)
+        throws UserNotFoundException, TransientException,
+        AccessControlException
+    {
+        LdapUserDAO<T> userDAO = null;
+        try
+        {
+            userDAO = new LdapUserDAO<T>(this.config);
+            return userDAO.getAugmentedUser(userID);
+        }
+        finally
+        {
+            if (userDAO != null)
+            {
+                userDAO.close();
+            }
+        }
+    }
+
     /**
      * Get the user specified by userID.
      *
diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/GetUserAction.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/GetUserAction.java
index 92a345af5cc7383779cab27f99f37d8819dc8ee0..70cf6b0dfc454f82f6817b42eb217d97d6961016 100644
--- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/GetUserAction.java
+++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/GetUserAction.java
@@ -100,7 +100,7 @@ public class GetUserAction extends AbstractUserAction
     {
         User<Principal> user;
  
-        if (isServops())
+        if (isSubjectUser(this.augmentUserDN))
         {
         	Subject subject = new Subject();
         	subject.getPrincipals().add(this.userID);
@@ -124,64 +124,75 @@ public class GetUserAction extends AbstractUserAction
 
     protected User<Principal> getUser(Principal principal) throws Exception
     {
-        final UserPersistence<Principal> userPersistence = getUserPersistence();
-    	User<Principal> user;
-    	
-    	try
+        User<Principal> user;
+
+        // For detail=identity, if the calling user is the same as the requested user,
+        // the calling user already has all principals for that user.
+        if (detail != null && detail.equalsIgnoreCase("identity") &&
+            isSubjectUser(principal.getName()))
         {
-            user = userPersistence.getUser(principal);
-            if (detail != null)
+            Subject subject = Subject.getSubject(AccessController.getContext());
+            user = new User<Principal>(principal);
+            user.getIdentities().addAll(subject.getPrincipals());
+        }
+        else
+        {
+            final UserPersistence<Principal> userPersistence = getUserPersistence();
+            try
             {
-                // Only return user principals
-                if (detail.equals("identity"))
+                user = userPersistence.getUser(principal);
+                if (detail != null)
                 {
-                    user.details.clear();
-                }
-                // Only return user profile info, first and last name.
-                else if (detail.equals("display"))
-                {
-                    user.getIdentities().clear();
-                    Set<PersonalDetails> details =  user.getDetails(PersonalDetails.class);
-                    if (details.isEmpty())
+                    // Only return user principals
+                    if (detail.equalsIgnoreCase("identity"))
                     {
-                        String error = principal.getName() + " missing required PersonalDetails";
-                        throw new IllegalStateException(error);
+                        user.details.clear();
+                    }
+                    // Only return user profile info, first and last name.
+                    else if (detail.equalsIgnoreCase("display"))
+                    {
+                        user.getIdentities().clear();
+                        Set<PersonalDetails> details = user.getDetails(PersonalDetails.class);
+                        if (details.isEmpty())
+                        {
+                            String error = principal.getName() + " missing required PersonalDetails";
+                            throw new IllegalStateException(error);
+                        }
+                        PersonalDetails pd = details.iterator().next();
+                        user.details.clear();
+                        user.details.add(new PersonalDetails(pd.getFirstName(), pd.getLastName()));
+                    }
+                    else
+                    {
+                        throw new IllegalArgumentException("Illegal detail parameter " + detail);
                     }
-                    PersonalDetails pd = details.iterator().next();
-                    user.details.clear();
-                    user.details.add(new PersonalDetails(pd.getFirstName(), pd.getLastName()));
-                }
-                else
-                {
-                    throw new IllegalArgumentException("Illegal detail parameter " + detail);
                 }
             }
-        }
-        catch (UserNotFoundException e)
-        {
-            user = userPersistence.getPendingUser(principal);
+            catch (UserNotFoundException e)
+            {
+                user = userPersistence.getPendingUser(principal);
+            }
         }
     	
     	return user;
     }
-    
-    protected boolean isServops()
+
+    protected boolean isSubjectUser(String username)
     {
-    	boolean isServops = false;
-        AccessControlContext acc = AccessController.getContext();
-        Subject subject = Subject.getSubject(acc);
+        boolean found = false;
+        Subject subject = Subject.getSubject(AccessController.getContext());
         if (subject != null)
         {
-        	for (Principal principal : subject.getPrincipals())
-        	{
-        		if (principal.getName().equals(this.getAugmentUserDN()))
-        		{
-        			isServops = true;
-        			break;
-        		}
-        	}
+            for (Principal principal : subject.getPrincipals())
+            {
+                if (principal.getName().equals(username))
+                {
+                    found = true;
+                    break;
+                }
+            }
         }
-        
-        return isServops;
+
+        return found;
     }
 }
diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/auth/AuthenticatorImpl.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/auth/AuthenticatorImpl.java
index 024549e6ea3053593c4734ac608638b875154193..f132ab47a23e4cfefc37606ef875d6377e01ef5f 100644
--- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/auth/AuthenticatorImpl.java
+++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/auth/AuthenticatorImpl.java
@@ -133,7 +133,7 @@ public class AuthenticatorImpl implements Authenticator
                         try
                         {
                             LdapUserPersistence<Principal> dao = new LdapUserPersistence<Principal>();
-                            User<Principal> user = dao.getUser(subject.getPrincipals().iterator().next());
+                            User<Principal> user = dao.getAugmentedUser(subject.getPrincipals().iterator().next());
                             subject.getPrincipals().addAll(user.getIdentities());
                         }
                         catch (UserNotFoundException e)
diff --git a/projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/ldap/LdapDAOTest.java b/projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/ldap/LdapDAOTest.java
index 05e33b33e00b65a6d6cc2a48201937f339377647..18b0b109aa38cbf9f89a699d67225b18e522527b 100644
--- a/projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/ldap/LdapDAOTest.java
+++ b/projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/ldap/LdapDAOTest.java
@@ -68,22 +68,23 @@
 
 package ca.nrc.cadc.ac.server.ldap;
 
-import java.security.PrivilegedExceptionAction;
-
-import javax.net.ssl.SSLSocketFactory;
-import javax.security.auth.Subject;
-import javax.security.auth.x500.X500Principal;
-
+import ca.nrc.cadc.auth.DNPrincipal;
 import ca.nrc.cadc.auth.HttpPrincipal;
 import ca.nrc.cadc.auth.NumericPrincipal;
 import ca.nrc.cadc.util.Log4jInit;
-
+import com.unboundid.ldap.sdk.DN;
 import com.unboundid.ldap.sdk.LDAPConnection;
-
 import org.apache.log4j.Level;
-import org.junit.Test;
 import org.junit.BeforeClass;
-import static org.junit.Assert.*;
+import org.junit.Test;
+
+import javax.security.auth.Subject;
+import javax.security.auth.x500.X500Principal;
+import java.security.PrivilegedExceptionAction;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 
 
 public class LdapDAOTest extends AbstractLdapDAOTest
@@ -172,6 +173,31 @@ public class LdapDAOTest extends AbstractLdapDAOTest
 
     }
 
+    @Test
+    public void testGetSubjectDN() throws Exception
+    {
+        DN expected = new DN("uid=foo,ou=bar,dc=net");
+        final DNPrincipal dnPrincipal = new DNPrincipal(expected.toNormalizedString());
+
+        LdapConfig config = LdapConfig.getLdapConfig("LdapConfig.test.properties");
+        LdapDAO ldapDAO = new LdapDAO(config)
+        {
+            @Override
+            protected Subject getSubject()
+            {
+                Subject subject = new Subject();
+                subject.getPrincipals().add(new HttpPrincipal("foo"));
+                subject.getPrincipals().add(new X500Principal("uid=foo,o=bar"));
+                subject.getPrincipals().add(dnPrincipal);
+                return subject;
+            }
+        };
+
+        DN actual = ldapDAO.getSubjectDN();
+        assertNotNull("DN is null", actual);
+        assertEquals("DN's do not match", expected.toNormalizedString(), actual.toNormalizedString());
+    }
+
     private void testConnection(final LDAPConnection ldapCon)
     {
         assertTrue("Not connected but should be.", ldapCon.isConnected());
diff --git a/projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/ldap/LdapGroupDAOTest.java b/projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/ldap/LdapGroupDAOTest.java
index 24b055459faa0ebe77d4fb669f3431118b147869..5ec862782981d86de578bb287bb8e6c234e82a8e 100644
--- a/projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/ldap/LdapGroupDAOTest.java
+++ b/projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/ldap/LdapGroupDAOTest.java
@@ -74,6 +74,7 @@ import ca.nrc.cadc.ac.GroupNotFoundException;
 import ca.nrc.cadc.ac.GroupProperty;
 import ca.nrc.cadc.ac.Role;
 import ca.nrc.cadc.ac.User;
+import ca.nrc.cadc.auth.DNPrincipal;
 import ca.nrc.cadc.auth.HttpPrincipal;
 import ca.nrc.cadc.util.Log4jInit;
 import org.apache.log4j.Level;
@@ -104,7 +105,13 @@ public class LdapGroupDAOTest extends AbstractLdapDAOTest
     static String daoTestDN2 = "cn=" + daoTestUid2 + ",ou=cadc,o=hia,c=ca";
     static String daoTestDN3 = "cn=" + daoTestUid3 + ",ou=cadc,o=hia,c=ca";
     static String unknownDN = "cn=foo,ou=cadc,o=hia,c=ca";
-    
+
+    static String daoTestEntryDN1 = "uid=cadcdaotest1,ou=users,ou=ds,dc=testcanfar";
+    static String daoTestEntryDN2 = "uid=cadcdaotest2,ou=users,ou=ds,dc=testcanfar";
+
+    static DNPrincipal daoDNPrincipal1;
+    static DNPrincipal daoDNPrincipal2;
+
     static X500Principal daoTestPrincipal1;
     static X500Principal daoTestPrincipal2;
     static X500Principal daoTestPrincipal3;
@@ -135,6 +142,9 @@ public class LdapGroupDAOTest extends AbstractLdapDAOTest
         daoTestPrincipal3 = new X500Principal(daoTestDN3);
         unknownPrincipal = new X500Principal(unknownDN);
 
+        daoDNPrincipal1 = new DNPrincipal(daoTestEntryDN1);
+        daoDNPrincipal2 = new DNPrincipal(daoTestEntryDN2);
+
         daoTestUser1 = new User<X500Principal>(daoTestPrincipal1);
         daoTestUser2 = new User<X500Principal>(daoTestPrincipal2);
         daoTestUser3 = new User<X500Principal>(daoTestPrincipal3);
@@ -142,9 +152,11 @@ public class LdapGroupDAOTest extends AbstractLdapDAOTest
         
         daoTestUser1Subject = new Subject();
         daoTestUser1Subject.getPrincipals().add(daoTestUser1.getUserID());
+        daoTestUser1Subject.getPrincipals().add(daoDNPrincipal1);
         
         daoTestUser2Subject = new Subject();
         daoTestUser2Subject.getPrincipals().add(daoTestUser2.getUserID());
+        daoTestUser2Subject.getPrincipals().add(daoDNPrincipal2);
         
         anonSubject = new Subject();
         anonSubject.getPrincipals().add(unknownUser.getUserID());
diff --git a/projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/ldap/LdapUserDAOTest.java b/projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/ldap/LdapUserDAOTest.java
index cb143e90e8fedc9c87677763f09ac55b3c23b67f..68ca8ae3855d9854db2b82281ac95d13f1de7bfb 100644
--- a/projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/ldap/LdapUserDAOTest.java
+++ b/projects/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/ldap/LdapUserDAOTest.java
@@ -82,6 +82,7 @@ import java.util.Random;
 import javax.security.auth.Subject;
 import javax.security.auth.x500.X500Principal;
 
+import ca.nrc.cadc.auth.DNPrincipal;
 import org.apache.log4j.Level;
 import org.apache.log4j.Logger;
 import org.junit.BeforeClass;
@@ -103,12 +104,16 @@ public class LdapUserDAOTest extends AbstractLdapDAOTest
     private static final Logger log = Logger.getLogger(LdapUserDAOTest.class);
 
     static final String testUserX509DN = "cn=cadcdaotest1,ou=cadc,o=hia,c=ca";
+    static final String testUser1EntryDN = "uid=cadcdaotest1,ou=users,ou=ds,dc=testcanfar";
+    static final String testUser2EntryDN = "uid=cadcdaotest2,ou=users,ou=ds,dc=testcanfar";
     static int nextUserNumericID = 666;
 
     static String testUserDN;
     static User<X500Principal> testUser;
     static User<X500Principal> testMember;
     static User<HttpPrincipal> testPendingUser;
+    static DNPrincipal testUser1DNPrincipal;
+    static DNPrincipal testUser2DNPrincipal;
     static LdapConfig config;
     static Random ran = new Random(); // source of randomness for numeric ids
 
@@ -117,7 +122,7 @@ public class LdapUserDAOTest extends AbstractLdapDAOTest
     public static void setUpBeforeClass()
             throws Exception
     {
-        Log4jInit.setLevel("ca.nrc.cadc.ac", Level.DEBUG);
+        Log4jInit.setLevel("ca.nrc.cadc.ac", Level.INFO);
 
         // get the configuration of the development server from and config files...
         config = getLdapConfig();
@@ -128,10 +133,10 @@ public class LdapUserDAOTest extends AbstractLdapDAOTest
                 new User<HttpPrincipal>(new HttpPrincipal("CADCtestRequest"));
         testPendingUser.details.add(new PersonalDetails("CADCtest", "Request"));
         testPendingUser.getIdentities().add(
-                new HttpPrincipal("CADCtestRequest"));
+            new HttpPrincipal("CADCtestRequest"));
         testPendingUser.getIdentities().add(
-                new X500Principal(
-                        "uid=CADCtestRequest,ou=userrequests,ou=ds,dc=testcanfar"));
+            new X500Principal(
+                "uid=CADCtestRequest,ou=userrequests,ou=ds,dc=testcanfar"));
         testPendingUser.getIdentities().add(new NumericPrincipal(66666));
 
         testUser.details.add(new PersonalDetails("CADC", "DAOTest1"));
@@ -147,7 +152,9 @@ public class LdapUserDAOTest extends AbstractLdapDAOTest
         testMember = new User<X500Principal>(testUserX500Princ);
         testMember.details.add(new PersonalDetails("CADC", "DAOTest1"));
         testMember.getIdentities().add(new HttpPrincipal("CadcDaoTest1"));
-        
+
+        testUser1DNPrincipal = new DNPrincipal(testUser1EntryDN);
+        testUser2DNPrincipal = new DNPrincipal(testUser2EntryDN);
     }
 
     <T extends Principal> LdapUserDAO<T> getUserDAO() throws Exception
@@ -227,6 +234,7 @@ public class LdapUserDAOTest extends AbstractLdapDAOTest
     {
         Subject subject = new Subject();
         subject.getPrincipals().add(testUser.getUserID());
+        subject.getPrincipals().add(testUser1DNPrincipal);
 
         // do everything as owner
         Subject.doAs(subject, new PrivilegedExceptionAction<Object>()
@@ -258,6 +266,7 @@ public class LdapUserDAOTest extends AbstractLdapDAOTest
     {
         Subject subject = new Subject();
         subject.getPrincipals().add(testUser.getUserID());
+        subject.getPrincipals().add(testUser1DNPrincipal);
 
         // do everything as owner
         Subject.doAs(subject, new PrivilegedExceptionAction<Object>()
@@ -267,7 +276,7 @@ public class LdapUserDAOTest extends AbstractLdapDAOTest
                 try
                 {
                     Collection<DN> groups = getUserDAO().getUserGroups(testUser.getUserID(),
-                                                       false);
+                        false);
                     assertNotNull("Groups should not be null.", groups);
 
                     for (DN groupDN : groups)
@@ -301,6 +310,7 @@ public class LdapUserDAOTest extends AbstractLdapDAOTest
     {
         Subject subject = new Subject();
         subject.getPrincipals().add(testUser.getUserID());
+        subject.getPrincipals().add(testUser1DNPrincipal);
 
         // do everything as owner
         Subject.doAs(subject, new PrivilegedExceptionAction<Object>()
@@ -314,7 +324,7 @@ public class LdapUserDAOTest extends AbstractLdapDAOTest
 
                     String  groupDN = "cn=cadcdaotestgroup1," + config.getGroupsDN();
                     isMember = getUserDAO().isMember(testUser.getUserID(),
-                                                     groupDN);
+                        groupDN);
                     assertTrue("Membership should exist.", isMember);
 
                     return null;
@@ -335,7 +345,7 @@ public class LdapUserDAOTest extends AbstractLdapDAOTest
     {
         Subject subject = new Subject();
         subject.getPrincipals().add(testUser.getUserID());
-
+        subject.getPrincipals().add(testUser1DNPrincipal);
         
         // do everything as owner
         Subject.doAs(subject, new PrivilegedExceptionAction<Object>()
@@ -579,6 +589,7 @@ public class LdapUserDAOTest extends AbstractLdapDAOTest
         // add the user
         Subject subject = new Subject();
         subject.getPrincipals().add(testUser2.getUserID());
+        subject.getPrincipals().add(testUser2DNPrincipal);
         Subject.doAs(subject, new PrivilegedExceptionAction<Object>()
         {
             public Object run()
@@ -633,6 +644,7 @@ public class LdapUserDAOTest extends AbstractLdapDAOTest
 
         // update the user
         subject.getPrincipals().add(testUser2.getUserID());
+        subject.getPrincipals().add(testUser2DNPrincipal);
         User<? extends Principal> updatedUser =
             (User<? extends Principal>) Subject.doAs(subject, new PrivilegedExceptionAction<Object>()
         {
@@ -662,7 +674,7 @@ public class LdapUserDAOTest extends AbstractLdapDAOTest
         assertEquals(user1, user2);
         assertEquals(user1.details, user2.details);
         assertEquals(user1.details.size(), user2.details.size());
-        assertEquals(user1.getIdentities().size(), user2.getIdentities().size());
+        assertEquals("# principals not equal", user1.getIdentities().size(), user2.getIdentities().size());
         for( Principal princ1 : user1.getIdentities())
         {
             boolean found = false;