diff --git a/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapUserDAO.java b/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapUserDAO.java
index e2f4371fe2818f086db178aca0b5b95370ba4494..9fb16743fbb52a67faf47f47c66b117914b921b1 100755
--- a/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapUserDAO.java
+++ b/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapUserDAO.java
@@ -815,7 +815,7 @@ public class LdapUserDAO extends LdapDAO
         logger.debug("search filter: " + filter);
 
         final String[] attributes = new String[]
-            { LDAP_UID, LDAP_FIRST_NAME, LDAP_LAST_NAME };
+            { LDAP_USER_NAME, LDAP_FIRST_NAME, LDAP_LAST_NAME };
         final SearchRequest searchRequest =
             new SearchRequest(usersDN, SearchScope.ONE, filter, attributes);
 
@@ -831,10 +831,10 @@ public class LdapUserDAO extends LdapDAO
                     next.getAttributeValue(LDAP_FIRST_NAME);
                 final String lastName =
                     next.getAttributeValue(LDAP_LAST_NAME).trim();
-                final String uid = next.getAttributeValue(LDAP_UID);
+                final String username = next.getAttributeValue(LDAP_USER_NAME);
 
                 User user = new User();
-                user.getIdentities().add(new HttpPrincipal(uid));
+                user.getIdentities().add(new HttpPrincipal(username));
 
                 // Only add Personal Details if it is relevant.
                 if (StringUtil.hasLength(firstName) &&
diff --git a/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/groups/CreateGroupAction.java b/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/groups/CreateGroupAction.java
index 37c3e1335499e464880c68141f041b724df29e89..d58b5b791a82f3864527ee49834c537e419c3212 100755
--- a/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/groups/CreateGroupAction.java
+++ b/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/groups/CreateGroupAction.java
@@ -107,7 +107,7 @@ public class CreateGroupAction extends AbstractGroupAction
             }
             for (User usr : group.getUserMembers())
             {
-                addedMembers.add(usr.getHttpPrincipal().getName());
+                addedMembers.add(usr.getX500Principal().getName());
             }
         }
         logGroupInfo(group.getID(), null, addedMembers);
diff --git a/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/groups/RemoveUserMemberAction.java b/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/groups/RemoveUserMemberAction.java
index 1bda22da92a2d9b4dbb52c744c9e3678b6ecf2c6..8abb5a7a6a2d2ed80b4a436baa8285947e28f3ed 100755
--- a/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/groups/RemoveUserMemberAction.java
+++ b/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/groups/RemoveUserMemberAction.java
@@ -78,6 +78,7 @@ import ca.nrc.cadc.ac.User;
 import ca.nrc.cadc.ac.server.PluginFactory;
 import ca.nrc.cadc.ac.server.UserPersistence;
 import ca.nrc.cadc.auth.AuthenticationUtil;
+import ca.nrc.cadc.util.ObjectUtil;
 
 public class RemoveUserMemberAction extends AbstractGroupAction
 {
@@ -99,7 +100,12 @@ public class RemoveUserMemberAction extends AbstractGroupAction
         Group group = groupPersistence.getGroup(this.groupName);
 
         Principal userPrincipal = AuthenticationUtil.createPrincipal(this.userID, this.userIDType);
-        User toRemove = getUserPersistence().getUser(userPrincipal);
+
+        User user = getUserPersistence().getAugmentedUser(userPrincipal);
+        User toRemove = new User();
+        ObjectUtil.setField(toRemove, user.getID(), "id");
+        toRemove.getIdentities().addAll(user.getIdentities());
+
         if (!group.getUserMembers().remove(toRemove))
         {
             throw new MemberNotFoundException();
diff --git a/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/web/groups/RemoveUserMemberActionTest.java b/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/web/groups/RemoveUserMemberActionTest.java
index 042cd981939921e4025f4c1657be61777ad05edb..d12fc441d495414ac8b4fa84b6df56af7750392f 100644
--- a/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/web/groups/RemoveUserMemberActionTest.java
+++ b/cadcAccessControl-Server/test/src/ca/nrc/cadc/ac/server/web/groups/RemoveUserMemberActionTest.java
@@ -71,11 +71,16 @@ package ca.nrc.cadc.ac.server.web.groups;
 import static org.easymock.EasyMock.createMock;
 import static org.junit.Assert.fail;
 
+import java.net.URI;
 import java.security.Principal;
+import java.util.UUID;
 
 import javax.security.auth.x500.X500Principal;
 
+import ca.nrc.cadc.ac.AC;
+import ca.nrc.cadc.ac.InternalID;
 import ca.nrc.cadc.auth.HttpPrincipal;
+import ca.nrc.cadc.util.ObjectUtil;
 import org.apache.log4j.Level;
 import org.apache.log4j.Logger;
 import org.easymock.EasyMock;
@@ -111,11 +116,14 @@ public class RemoveUserMemberActionTest
     {
         try
         {
+            User user = new User();
+            InternalID internalID = new InternalID(new URI(AC.USER_URI + "?" + UUID.randomUUID()));
+            ObjectUtil.setField(user, internalID, "id");
+
             String userID = "cn=foo,c=ca";
             String userIDType = IdentityType.X500.getValue();
-            Principal userPrincipal = AuthenticationUtil.createPrincipal(userID, userIDType);
-            User user = new User();
-            user.getIdentities().add(userPrincipal);
+            Principal x500Principal = AuthenticationUtil.createPrincipal(userID, userIDType);
+            user.getIdentities().add(x500Principal);
 
             Group group = new Group("group");
             User member = new User();
@@ -126,7 +134,7 @@ public class RemoveUserMemberActionTest
             EasyMock.expect(mockGroupPersistence.getGroup("group")).andReturn(group);
 
             final UserPersistence mockUserPersistence = EasyMock.createMock(UserPersistence.class);
-            EasyMock.expect(mockUserPersistence.getUser(userPrincipal)).andReturn(user);
+            EasyMock.expect(mockUserPersistence.getAugmentedUser(x500Principal)).andReturn(user);
 
             EasyMock.replay(mockGroupPersistence, mockUserPersistence);
 
@@ -160,10 +168,13 @@ public class RemoveUserMemberActionTest
     {
         try
         {
+            User user = new User();
+            InternalID internalID = new InternalID(new URI(AC.USER_URI + "?" + UUID.randomUUID()));
+            ObjectUtil.setField(user, internalID, "id");
+
             String userID = "cn=foo,c=ca";
             String userIDType = IdentityType.X500.getValue();
             Principal userPrincipal = AuthenticationUtil.createPrincipal(userID, userIDType);
-            User user = new User();
             user.getIdentities().add(new X500Principal(userID));
             user.getIdentities().add(new HttpPrincipal("foo"));
 
@@ -176,7 +187,7 @@ public class RemoveUserMemberActionTest
             EasyMock.expectLastCall();
 
             final UserPersistence mockUserPersistence = EasyMock.createMock(UserPersistence.class);
-            EasyMock.expect(mockUserPersistence.getUser(userPrincipal)).andReturn(user);
+            EasyMock.expect(mockUserPersistence.getAugmentedUser(userPrincipal)).andReturn(user);
 
             EasyMock.replay(mockGroupPersistence, mockUserPersistence);
 
diff --git a/cadcAccessControl/src/ca/nrc/cadc/ac/User.java b/cadcAccessControl/src/ca/nrc/cadc/ac/User.java
index 19a1b2cd6e8fdaa05652ada5013ffcd2bcfb6568..827f3df6c1f3e36c64fed54d8567ba9835c83aa1 100644
--- a/cadcAccessControl/src/ca/nrc/cadc/ac/User.java
+++ b/cadcAccessControl/src/ca/nrc/cadc/ac/User.java
@@ -68,6 +68,7 @@
  */
 package ca.nrc.cadc.ac;
 
+import java.io.PrintWriter;
 import java.security.Principal;
 import java.util.Comparator;
 import java.util.Date;
@@ -77,8 +78,12 @@ import java.util.TreeSet;
 
 import ca.nrc.cadc.auth.HttpPrincipal;
 
+import javax.security.auth.x500.X500Principal;
+
 public class User
 {
+    // How on God's green earth is this used?  Where is it set?
+    // jenkinsd 2016.03.24
     private InternalID id;
 
     private Set<Principal> identities = new TreeSet<Principal>(new PrincipalComparator());
@@ -141,6 +146,14 @@ public class User
         return null;
     }
 
+    public X500Principal getX500Principal()
+    {
+        final Set<X500Principal> identities =
+                getIdentities(X500Principal.class);
+        return identities.isEmpty() ? null : identities.iterator().next();
+    }
+
+
     /**
      * A User is considered consistent if the User's set of identities are a superset
      * of this Users set of identities.
diff --git a/cadcAccessControl/src/ca/nrc/cadc/ac/client/UserClient.java b/cadcAccessControl/src/ca/nrc/cadc/ac/client/UserClient.java
index 5d4bbc919b42ea7d6265b5acabb404ac0bc45895..389ceab4c6b7ce8177b644659f3a3dd9df78b687 100644
--- a/cadcAccessControl/src/ca/nrc/cadc/ac/client/UserClient.java
+++ b/cadcAccessControl/src/ca/nrc/cadc/ac/client/UserClient.java
@@ -124,8 +124,8 @@ public class UserClient
     /**
      * Constructor.
      *
-     * @param baseURL The URL of the supporting access control web service
-     *                obtained from the registry.
+     * @param serviceURI    The URI of the supporting access control web service
+     *                      obtained from the registry.
      */
     public UserClient(URI serviceURI)
             throws IllegalArgumentException
@@ -136,7 +136,7 @@ public class UserClient
     public UserClient(URI serviceURI, RegistryClient registryClient)
     {
         if (serviceURI == null)
-            throw new IllegalArgumentException("invalid serviceURI: " + serviceURI);
+            throw new IllegalArgumentException("Service URI cannot be null.");
         if (serviceURI.getFragment() != null)
             throw new IllegalArgumentException("invalid serviceURI (fragment not allowed): " + serviceURI);
 
@@ -211,7 +211,9 @@ public class UserClient
     {
         URL usersURL = registryClient.getServiceURL(usersURI, "https");
         final List<User> webUsers = new ArrayList<User>();
-        HttpDownload httpDownload = new HttpDownload(usersURL, new JsonUserListInputStreamWrapper(webUsers));
+        HttpDownload httpDownload =
+                new HttpDownload(usersURL,
+                                 new JsonUserListInputStreamWrapper(webUsers));
         httpDownload.setRequestProperty("Accept", "application/json");
         httpDownload.run();
 
diff --git a/cadcAccessControl/test/src/ca/nrc/cadc/ac/client/UserClientTest.java b/cadcAccessControl/test/src/ca/nrc/cadc/ac/client/UserClientTest.java
index 205d68ad80646b0e3610a8f397eacb5cdc6d5bd8..067d5ab6b8f24d430ff5b063b41b3c483c8e0822 100644
--- a/cadcAccessControl/test/src/ca/nrc/cadc/ac/client/UserClientTest.java
+++ b/cadcAccessControl/test/src/ca/nrc/cadc/ac/client/UserClientTest.java
@@ -108,16 +108,32 @@ public class UserClientTest
         try
         {
             new UserClient(null);
-            Assert.fail("Null base URL should throw an illegalArgumentException.");
+            Assert.fail("Null service URI should throw an illegalArgumentException.");
         }
         catch (IllegalArgumentException iae)
         {
-            Assert.assertTrue(iae.getMessage().contains("invalid serviceURI"));
+            Assert.assertTrue(iae.getMessage().contains("cannot be null"));
         }
         catch (Throwable t)
         {
         	Assert.fail("Unexpected exception: " + t.getMessage());
         }
+
+        // case 2: serviceURI with a fragment
+        try
+        {
+            URI uri = new URI("http://foo.com/bar?test#fragment");
+            new UserClient(uri);
+            Assert.fail("Service URI containing a fragment should throw an illegalArgumentException.");
+        }
+        catch (IllegalArgumentException iae)
+        {
+            Assert.assertTrue(iae.getMessage().contains("fragment not allowed"));
+        }
+        catch (Throwable t)
+        {
+            Assert.fail("Unexpected exception: " + t.getMessage());
+        }
     }
 
     @Test