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 23ad3b9a6cbc0728423df19a7028ffb58b24baa3..78db922b2d5e126a6e4519f1f6526e6765d655c6 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
@@ -345,11 +345,15 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO
             }
             catch (LDAPSearchException e)
             {
+                logger.debug("Could not find groups root", e);
                 if (e.getResultCode() == ResultCode.NO_SUCH_OBJECT)
                 {
-                    logger.debug("Could not find groups root", e);
                     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);
             }
             
             LdapDAO.checkLdapResult(searchResult.getResultCode());
@@ -366,7 +370,7 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO
         }
         catch (LDAPException e1)
         {
-        	logger.debug("getGroupNames Exception: " + e1, e1);
+            logger.debug("getGroupNames Exception: " + e1, e1);
             LdapDAO.checkLdapResult(e1.getResultCode());
             throw new IllegalStateException("Unexpected exception: " + e1.getMatchedDN(), e1);
         }
diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/GroupsServlet.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/GroupsServlet.java
index dd62ed5cdb871629bb86aa975b1a24e7b583e492..aad716349bbf46fc0048f7d17849b41acdf517d1 100755
--- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/GroupsServlet.java
+++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/GroupsServlet.java
@@ -78,6 +78,7 @@ import javax.servlet.http.HttpServletResponse;
 import org.apache.log4j.Logger;
 
 import ca.nrc.cadc.auth.AuthenticationUtil;
+import ca.nrc.cadc.net.TransientException;
 
 public class GroupsServlet extends HttpServlet
 {
diff --git a/projects/cadcAccessControl/src/ca/nrc/cadc/ac/client/GMSClient.java b/projects/cadcAccessControl/src/ca/nrc/cadc/ac/client/GMSClient.java
index cb0ec4f65ed7605c44f0731fe0246200dccaf6cb..ce1d005865214114730f0e3a13070992f8d7bc21 100755
--- a/projects/cadcAccessControl/src/ca/nrc/cadc/ac/client/GMSClient.java
+++ b/projects/cadcAccessControl/src/ca/nrc/cadc/ac/client/GMSClient.java
@@ -110,13 +110,15 @@ import ca.nrc.cadc.net.HttpPost;
 import ca.nrc.cadc.net.HttpUpload;
 import ca.nrc.cadc.net.InputStreamWrapper;
 import ca.nrc.cadc.net.NetUtil;
+import ca.nrc.cadc.net.event.TransferEvent;
+import ca.nrc.cadc.net.event.TransferListener;
 
 
 /**
  * Client class for performing group searching and group actions
  * with the access control web service.
  */
-public class GMSClient
+public class GMSClient implements TransferListener
 {
     private static final Logger log = Logger.getLogger(GMSClient.class);
     
@@ -159,6 +161,18 @@ public class GMSClient
         }
     }
 
+    public void transferEvent(TransferEvent te)
+    {
+        if ( TransferEvent.RETRYING == te.getState() )
+            log.debug("retry after request failed, reason: "  + te.getError());
+    }
+
+    public String getEventHeader()
+    {
+        return null; // no custom eventID header
+    }
+
+    
     /**
      * Get a list of groups.
      *
@@ -392,8 +406,10 @@ public class GMSClient
         HttpPost transfer = new HttpPost(updateGroupURL, groupXML.toString(), 
                                          "application/xml", true);
         transfer.setSSLSocketFactory(getSSLSocketFactory());
+        transfer.setTransferListener(this);
         transfer.run();
         
+        
         Throwable error = transfer.getThrowable();
         if (error != null)
         {