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 9c3b3c87f54844a9b5410c20e5b316154746fedc..f9acc1c50e2f031631fbfb7ed405b798c13251de 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
@@ -227,7 +227,12 @@ public abstract class LdapDAO
             throws TransientException
     {
     	logger.debug("Ldap result: " + code);
-    	
+    	if (code == ResultCode.SUCCESS 
+                || code == ResultCode.NO_SUCH_OBJECT)
+        {
+            return;
+        }
+        
         if (code == ResultCode.INSUFFICIENT_ACCESS_RIGHTS)
         {
             throw new AccessControlException("Not authorized ");
@@ -236,20 +241,20 @@ public abstract class LdapDAO
         {
             throw new AccessControlException("Invalid credentials ");
         }
-        else if ((code == ResultCode.SUCCESS) || (code
-                                                  == ResultCode.NO_SUCH_OBJECT))
-        {
-            // all good. nothing to do
-        }
         else if (code == ResultCode.PARAM_ERROR)
         {
             throw new IllegalArgumentException("Error in Ldap parameters ");
         }
-        else if (code == ResultCode.BUSY ||
-                 code == ResultCode.CONNECT_ERROR)
+        else if (code == ResultCode.BUSY 
+                || code == ResultCode.CONNECT_ERROR)
         {
             throw new TransientException("Connection problems ");
         }
+        else if (code == ResultCode.TIMEOUT
+                || code == ResultCode.TIME_LIMIT_EXCEEDED)
+        {
+            throw new TransientException("ldap timeout");
+        }
         else
         {
             throw new RuntimeException("Ldap error (" + code.getName() + ")");
diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapGroupDAO.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapGroupDAO.java
index 78db922b2d5e126a6e4519f1f6526e6765d655c6..6c2a6275c9251edeffbe029cccba7e34b0943138 100755
--- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapGroupDAO.java
+++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapGroupDAO.java
@@ -235,7 +235,7 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO
         for (Group groupMember : groups)
         {
             final String groupMemberID = groupMember.getID();
-            if (!checkGroupExists(groupMemberID))
+            if (!checkGroupExists(groupMemberID, false))
             {
                 throw new GroupNotFoundException(groupMemberID);
             }
@@ -346,12 +346,11 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO
             catch (LDAPSearchException e)
             {
                 logger.debug("Could not find groups root", e);
+                LdapDAO.checkLdapResult(e.getResultCode());
                 if (e.getResultCode() == ResultCode.NO_SUCH_OBJECT)
                 {
                     throw new IllegalStateException("Could not find groups root");
                 }
-                else if (e.getResultCode() == ResultCode.TIME_LIMIT_EXCEEDED)
-                    throw new TransientException("time limit exceeded", e);
                 
                 throw new IllegalStateException("unexpected failure", e);
             }
@@ -622,77 +621,76 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO
         {
             mods.add(new Modification(ModificationType.REPLACE, "description", group.description));
         }
-        
-        Set<String> newMembers = new HashSet<String>();
-        for (User<?> member : group.getUserMembers())
-        {
-            DN memberDN = userPersist.getUserDN(member);
-            newMembers.add(memberDN.toNormalizedString());
-        }
-        for (Group gr : group.getGroupMembers())
+        try
         {
-            if (!checkGroupExists(gr.getID()))
+            Set<String> newMembers = new HashSet<String>();
+            for (User<?> member : group.getUserMembers())
             {
-                throw new GroupNotFoundException(gr.getID());
+                DN memberDN = userPersist.getUserDN(member);
+                newMembers.add(memberDN.toNormalizedString());
             }
-            DN grDN = getGroupDN(gr.getID());
-            newMembers.add(grDN.toNormalizedString());
-        }
-        
-        Set<String> newAdmins = new HashSet<String>();
-        Set<User<? extends Principal>> existingUserAdmins = new HashSet<User<? extends Principal>>(0);
-        if (existing != null)
-        {
-        	existingUserAdmins = existing.getUserAdmins();
-        }
-        for (User<?> member : group.getUserAdmins())
-        {
-        	DN memberDN = userPersist.getUserDN(member);
-        	newAdmins.add(memberDN.toNormalizedString());
-        	if (!existingUserAdmins.contains(member))
+            for (Group gr : group.getGroupMembers())
             {
-            	adminChanges = true;
+                if (!checkGroupExists(gr.getID(), false))
+                {
+                    throw new GroupNotFoundException(gr.getID());
+                }
+                DN grDN = getGroupDN(gr.getID());
+                newMembers.add(grDN.toNormalizedString());
             }
-        }
-        
-        Set<Group> existingGroupAdmins = new HashSet<Group>(0);
-        if (existing != null)
-        {
-        	existingGroupAdmins = existing.getGroupAdmins();
-        }
-        for (Group gr : group.getGroupAdmins())
-        {
-            if (!checkGroupExists(gr.getID()))
+
+            Set<String> newAdmins = new HashSet<String>();
+            Set<User<? extends Principal>> existingUserAdmins = new HashSet<User<? extends Principal>>(0);
+            if (existing != null)
             {
-                throw new GroupNotFoundException(gr.getID());
+                    existingUserAdmins = existing.getUserAdmins();
+            }
+            for (User<?> member : group.getUserAdmins())
+            {
+                    DN memberDN = userPersist.getUserDN(member);
+                    newAdmins.add(memberDN.toNormalizedString());
+                    if (!existingUserAdmins.contains(member))
+                {
+                    adminChanges = true;
+                }
             }
 
-        	DN grDN = getGroupDN(gr.getID());
-        	newAdmins.add(grDN.toNormalizedString());
-        	if (!existingGroupAdmins.contains(gr))
+            Set<Group> existingGroupAdmins = new HashSet<Group>(0);
+            if (existing != null)
             {
-            	adminChanges = true;
+                    existingGroupAdmins = existing.getGroupAdmins();
+            }
+            for (Group gr : group.getGroupAdmins())
+            {
+                if (!checkGroupExists(gr.getID(), false))
+                {
+                    throw new GroupNotFoundException(gr.getID());
+                }
+
+                    DN grDN = getGroupDN(gr.getID());
+                    newAdmins.add(grDN.toNormalizedString());
+                    if (!existingGroupAdmins.contains(gr))
+                {
+                    adminChanges = true;
+                }
             }
-        }
 
-        mods.add(new Modification(ModificationType.REPLACE, "uniquemember", 
-                (String[]) newMembers.toArray(new String[newMembers.size()])));
-        adminMods.add(new Modification(ModificationType.REPLACE, "uniquemember", 
-                (String[]) newAdmins.toArray(new String[newAdmins.size()])));
+            mods.add(new Modification(ModificationType.REPLACE, "uniquemember", 
+                    (String[]) newMembers.toArray(new String[newMembers.size()])));
+            adminMods.add(new Modification(ModificationType.REPLACE, "uniquemember", 
+                    (String[]) newAdmins.toArray(new String[newAdmins.size()])));
         
-        try
-        {
-        	// modify admin group first (if necessary)
-        	if (adminChanges)
-        	{   
-                ModifyRequest modifyRequest = new ModifyRequest(getAdminGroupDN(group.getID()), adminMods);
-                
-	            modifyRequest.addControl(
-	                    new ProxiedAuthorizationV2RequestControl(
-	                            "dn:" + getSubjectDN().toNormalizedString()));
-	            LdapDAO.checkLdapResult(getConnection().
-	                    modify(modifyRequest).getResultCode());
-        	}
+            // modify admin group first (if necessary)
+            if (adminChanges)
+            {   
+            ModifyRequest modifyRequest = new ModifyRequest(getAdminGroupDN(group.getID()), adminMods);
+
+                modifyRequest.addControl(
+                        new ProxiedAuthorizationV2RequestControl(
+                                "dn:" + getSubjectDN().toNormalizedString()));
+                LdapDAO.checkLdapResult(getConnection().
+                        modify(modifyRequest).getResultCode());
+            }
             
             // modify the group itself now
         	ModifyRequest modifyRequest = new ModifyRequest(getGroupDN(group.getID()), mods);
@@ -705,7 +703,7 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO
         }
         catch (LDAPException e1)
         {
-        	logger.debug("Modify Exception: " + e1, e1);
+            logger.debug("Modify Exception: " + e1, e1);
             LdapDAO.checkLdapResult(e1.getResultCode());
         }
         try
@@ -1066,7 +1064,7 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO
         }
         catch (LDAPException e)
         {
-        	logger.debug("getGroupDN Exception: " + e, e);
+            logger.debug("getGroupDN Exception: " + e, e);
             LdapDAO.checkLdapResult(e.getResultCode());
         }
         throw new IllegalArgumentException(groupID + " not a valid group ID");
@@ -1085,7 +1083,7 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO
         }
         catch (LDAPException e)
         {
-        	logger.debug("getAdminGroupDN Exception: " + e, e);
+            logger.debug("getAdminGroupDN Exception: " + e, e);
             LdapDAO.checkLdapResult(e.getResultCode());
         }
         throw new IllegalArgumentException(groupID + " not a valid group ID");
@@ -1117,17 +1115,43 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO
         }
     }
     
-    private boolean checkGroupExists(String groupID) 
-            throws TransientException
+    private boolean checkGroupExists(String groupID, boolean lockedGroupsExist)
+            throws LDAPException, TransientException
     {
-        for (String groupName : getGroupNames())
+        try
         {
-            if (groupName.equalsIgnoreCase(groupID))
+            DN groupDN = getGroupDN(groupID);
+            Filter filter = Filter.createEqualityFilter("entrydn", groupDN.toNormalizedString());
+        
+            SearchRequest searchRequest =  new SearchRequest(
+                        config.getGroupsDN(), SearchScope.SUB, filter, 
+                        "cn", "nsaccountlock");
+
+            //searchRequest.addControl(
+            //            new ProxiedAuthorizationV2RequestControl("dn:" + 
+            //                    getSubjectDN().toNormalizedString()));
+
+            SearchResultEntry searchResult = 
+                    getConnection().searchForEntry(searchRequest);
+
+            if (searchResult == null)
             {
-                return true;
+                String msg = "Group not found " + groupDN;
+                logger.debug(msg);
+                return false;
             }
+
+            if (searchResult.getAttribute("nsaccountlock") != null)
+            {
+                // deleted group
+                String msg = "Group marked deleted " + groupDN;
+                logger.debug(msg);
+                return lockedGroupsExist;
+            }
+
+            return true;
         }
-        return false;
-    }
+        finally { }
+    }        
 
 }