diff --git a/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapConnectionPool.java b/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapConnectionPool.java
index 37482c058b8e85063d93f029539e9bd32eed84c8..4366e65515e75bf6704d7a6fda00802f70275f01 100644
--- a/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapConnectionPool.java
+++ b/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapConnectionPool.java
@@ -69,6 +69,7 @@
 
 package ca.nrc.cadc.ac.server.ldap;
 
+import com.unboundid.ldap.sdk.SearchResult;
 import org.apache.log4j.Logger;
 
 import ca.nrc.cadc.ac.server.ldap.LdapConfig.LdapPool;
@@ -107,8 +108,6 @@ public class LdapConnectionPool
         OFFLINE
     };
 
-    Profiler profiler = new Profiler(LdapConnectionPool.class);
-
     protected LdapConfig currentConfig;
     private String poolName;
     private LDAPConnectionPool pool;
@@ -137,6 +136,7 @@ public class LdapConnectionPool
         logger.debug("Construct pool: " + poolName + ". system state: " + systemState);
         if (SystemState.ONLINE.equals(systemState) || (SystemState.READONLY.equals(systemState) && readOnly))
         {
+            Profiler profiler = new Profiler(LdapConnectionPool.class);
             synchronized (poolMonitor)
             {
                 if (!boundPool)
@@ -176,23 +176,27 @@ public class LdapConnectionPool
 
         try
         {
+            Profiler profiler = new Profiler(LdapConnectionPool.class);
             LDAPConnection conn = null;
             synchronized (poolMonitor)
             {
                 conn = pool.getConnection();
-                profiler.checkpoint("pool.getConnection");
 
                 // BM: This query to the base dn (starting at dc=) has the
                 // effect of clearing any proxied authorization state associated
                 // with the receiving ldap server connection.  Without this in
                 // place, proxied authorization information is sometimes ignored.
-                logger.debug("Testing connection");
-                int dcIndex = currentConfig.getGroupsDN().indexOf("dc=");
-                String dcDN = currentConfig.getGroupsDN().substring(dcIndex);
-                Filter filter = Filter.createEqualityFilter("dc", "*");
-                SearchRequest searchRequest = new SearchRequest(dcDN, SearchScope.BASE, filter, new String[] {"entrydn"});
-                conn.search(searchRequest);
-                profiler.checkpoint("pool.initConnection");
+//                logger.debug("Testing connection");
+//                int index = currentConfig.getGroupsDN().indexOf(',');
+//                String rdn = currentConfig.getGroupsDN().substring(0, index);
+//                Filter filter = Filter.create("(" + rdn + ")");
+//
+//                index = rdn.indexOf('=');
+//                String attribute = rdn.substring(0, index);
+//
+//                SearchRequest searchRequest = new SearchRequest(currentConfig.getGroupsDN(), SearchScope.BASE, filter, new String[] {attribute});
+//                conn.search(searchRequest);
+//                profiler.checkpoint("pool.initConnection");
             }
             logger.debug(poolName + " pool statistics after borrow:\n" + pool.getConnectionPoolStatistics());
             profiler.checkpoint("get " + poolName + " only connection");
@@ -210,7 +214,9 @@ public class LdapConnectionPool
     {
         if (pool != null)
         {
+            Profiler profiler = new Profiler(LdapConnectionPool.class);
             pool.releaseConnection(conn);
+            profiler.checkpoint("pool.releaseConnection");
             logger.debug(poolName + " pool statistics after release:\n" + pool.getConnectionPoolStatistics());
         }
     }
@@ -225,8 +231,9 @@ public class LdapConnectionPool
         if (pool != null)
         {
             logger.debug("Closing pool...");
+            Profiler profiler = new Profiler(LdapConnectionPool.class);
             pool.close();
-            profiler.checkpoint("Pool closed.");
+            profiler.checkpoint("pool.shutdown");
         }
     }
 
diff --git a/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapConnections.java b/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapConnections.java
index cf5451e997fc29f48711ae72f3a77586669975c2..bef5ff93bfdcc554d55b72f272792c83226d6d0c 100644
--- a/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapConnections.java
+++ b/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapConnections.java
@@ -91,8 +91,6 @@ class LdapConnections
 {
     private final static Logger log = Logger.getLogger(LdapConnections.class);
 
-    Profiler profiler = new Profiler(LdapConnections.class);
-
     private LdapPersistence persistence;
     private LdapConfig config;
 
@@ -134,6 +132,7 @@ class LdapConnections
             if (autoConfigReadOnlyConn == null)
             {
                 log.debug("Getting new auto config read only connection.");
+                Profiler profiler = new Profiler(LdapConnections.class);
                 autoConfigReadOnlyConn = readOnlyPool.getConnection();
                 profiler.checkpoint("Get read only connection");
             }
@@ -173,6 +172,7 @@ class LdapConnections
             if (autoConfigReadWriteConn == null)
             {
                 log.debug("Getting new auto config read write connection.");
+                Profiler profiler = new Profiler(LdapConnections.class);
                 autoConfigReadWriteConn = readWritePool.getConnection();
                 profiler.checkpoint("Get read write connection");
             }
@@ -212,6 +212,7 @@ class LdapConnections
             if (autoConfigUnboundReadOnlyConn == null)
             {
                 log.debug("Getting new auto config unbound read only connection.");
+                Profiler profiler = new Profiler(LdapConnections.class);
                 autoConfigUnboundReadOnlyConn = unboundReadOnlyPool.getConnection();
                 profiler.checkpoint("Get read write connection");
             }
@@ -242,6 +243,7 @@ class LdapConnections
 
     void releaseConnections()
     {
+        Profiler profiler = new Profiler(LdapConnections.class);
         if (persistence != null)
         {
             if (autoConfigReadOnlyConn != null)
diff --git a/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapDAO.java b/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapDAO.java
index 49a83c207a75fa16b0fd4c35cac540a4d9c91f7c..ad70368b8b1afdb0a02588c5a33219d669652413 100755
--- a/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapDAO.java
+++ b/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapDAO.java
@@ -103,8 +103,6 @@ public abstract class LdapDAO
 
     DN subjDN = null;
 
-    private Profiler profiler = new Profiler(LdapDAO.class);
-
     public LdapDAO(LdapConnections connections)
     {
         this.connections = connections;
@@ -192,8 +190,8 @@ public abstract class LdapDAO
 
         if (config.isSecure())
         {
-            socketFactory = createSSLSocketFactory();
             Profiler profiler = new Profiler(LdapDAO.class);
+            socketFactory = createSSLSocketFactory();
             profiler.checkpoint("createSSLSocketFactory");
         }
         else
diff --git a/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapGroupDAO.java b/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapGroupDAO.java
index 0afd857e436b4ab2bb2231a136c040a1d68b33d1..bf15f4f68c5b15cdf297bd5267a33c454e4390d3 100755
--- a/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapGroupDAO.java
+++ b/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapGroupDAO.java
@@ -137,8 +137,6 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO
                     "modifytimestamp", "description", "uniquemember"
             };
 
-    private final Profiler profiler = new Profiler(LdapGroupDAO.class);
-
     private LdapUserDAO<T> userDAO;
 
     // this gets filled by the LdapgroupPersistence
@@ -396,6 +394,7 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO
             SearchResult searchResult = null;
             try
             {
+                Profiler profiler = new Profiler(LdapGroupDAO.class);
                 LDAPInterface con = getReadOnlyConnection();
                 profiler.checkpoint("getGroupNames.getConnection");
                 searchResult = con.search(searchRequest);
@@ -414,7 +413,7 @@ public class LdapGroupDAO<T extends Principal> extends LdapDAO
             }
 
             LdapDAO.checkLdapResult(searchResult.getResultCode());
-            profiler.checkpoint("checkLdapResult");
+//            profiler.checkpoint("checkLdapResult");
 
             return groupNames;
         }
diff --git a/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapPersistence.java b/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapPersistence.java
index 2e7c75da3e6bdd3cc2caf746ebcd16a461189415..37b1e4f92847ca9cee5cc9b72879022857cce60b 100644
--- a/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapPersistence.java
+++ b/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapPersistence.java
@@ -97,8 +97,6 @@ public abstract class LdapPersistence
     private static final String LDAP_POOL_JNDI_NAME = ConnectionPools.class.getName();
     private static final int POOL_CHECK_INTERVAL_MILLESCONDS = 10000; // 10 seconds
 
-    Profiler profiler = new Profiler(LdapPersistence.class);
-
     // static monitor is required for when multiple LdapPersistence objects
     // are created.
     private static Object jndiMonitor = new Object();
@@ -208,6 +206,7 @@ public abstract class LdapPersistence
                     }
                     if (pools == null)
                     {
+                        Profiler profiler = new Profiler(LdapPersistence.class);
                         LdapConfig config = LdapConfig.getLdapConfig();
                         pools = createPools(config);
                         InitialContext ic = new InitialContext();
@@ -238,6 +237,7 @@ public abstract class LdapPersistence
 
     private ConnectionPools createPools(LdapConfig config)
     {
+        Profiler profiler = new Profiler(LdapPersistence.class);
         Map<String,LdapConnectionPool> poolMap = new HashMap<String,LdapConnectionPool>(3);
         poolMap.put(POOL_READONLY, new LdapConnectionPool(
             config, config.getReadOnlyPool(), POOL_READONLY, true, true));
@@ -276,6 +276,7 @@ public abstract class LdapPersistence
             else
             {
                 logger.debug("Detected ldap configuration change, rebuilding pools");
+                Profiler profiler = new Profiler(LdapPersistence.class);
                 boolean poolRecreated = false;
                 final ConnectionPools oldPools = pools;
                 ConnectionPools newPools = null;
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 0a8303558629c0c59e93402ec35eb619f9c1f059..c41916081d4ddf6f58caadc59967006ac5b88c16 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
@@ -138,8 +138,6 @@ public class LdapUserDAO<T extends Principal> extends LdapDAO
     
     private static final Logger logger = Logger.getLogger(LdapUserDAO.class);
 
-    private final Profiler profiler = new Profiler(LdapUserDAO.class);
-
     // Map of identity type to LDAP attribute
     private final Map<Class<?>, String> userLdapAttrib = new HashMap<Class<?>, String>();
 
@@ -209,7 +207,7 @@ public class LdapUserDAO<T extends Principal> extends LdapDAO
      * @param password password to verify.
      * @return Boolean
      * @throws TransientException
-     * @throws UserNotFoundExceptionjoellama
+     * @throws UserNotFoundException
      */
     public Boolean doLogin(final String username, final String password)
         throws TransientException, UserNotFoundException
@@ -677,8 +675,8 @@ public class LdapUserDAO<T extends Principal> extends LdapDAO
     public User<T> getAugmentedUser(final T userID)
         throws UserNotFoundException, TransientException
     {
+        Profiler profiler = new Profiler(LdapUserDAO.class);
         String searchField = userLdapAttrib.get(userID.getClass());
-        profiler.checkpoint("getAugmentedUser.getSearchField");
         if (searchField == null)
         {
             throw new IllegalArgumentException(
@@ -690,14 +688,14 @@ public class LdapUserDAO<T extends Principal> extends LdapDAO
             Filter notFilter = Filter.createNOTFilter(Filter.createPresenceFilter(LDAP_NSACCOUNTLOCK));
             Filter equalsFilter = Filter.createEqualityFilter(searchField, userID.getName());
             Filter filter = Filter.createANDFilter(notFilter, equalsFilter);
-            profiler.checkpoint("getAugmentedUser.createFilter");
             logger.debug("search filter: " + filter);
 
             SearchRequest searchRequest = new SearchRequest(
                 config.getUsersDN(), SearchScope.ONE, filter, identityAttribs);
-            profiler.checkpoint("getAugmentedUser.createSearchRequest");
 
-            SearchResultEntry searchResult = getReadOnlyConnection().searchForEntry(searchRequest);
+            LDAPConnection con = getReadOnlyConnection();
+            profiler.checkpoint("getAugmentedUser.getReadOnlyConnection");
+            SearchResultEntry searchResult = con.searchForEntry(searchRequest);
             profiler.checkpoint("getAugmentedUser.searchForEntry");
 
             if (searchResult == null)
diff --git a/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapUserPersistence.java b/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapUserPersistence.java
index b3d24cd5f2f815dbd375e032ff5a2ab5eb6f77f0..fd8ffbfb9af98d2dbf137513b93762e5926347fa 100755
--- a/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapUserPersistence.java
+++ b/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/ldap/LdapUserPersistence.java
@@ -90,7 +90,6 @@ import ca.nrc.cadc.profiler.Profiler;
 public class LdapUserPersistence<T extends Principal> extends LdapPersistence implements UserPersistence<T>
 {
     private static final Logger logger = Logger.getLogger(LdapUserPersistence.class);
-    private Profiler profiler = new Profiler(LdapUserPersistence.class);
 
     public LdapUserPersistence()
     {
@@ -263,6 +262,7 @@ public class LdapUserPersistence<T extends Principal> extends LdapPersistence im
         LdapConnections conns = new LdapConnections(this);
         try
         {
+            Profiler profiler = new Profiler(LdapUserPersistence.class);
             userDAO = new LdapUserDAO<T>(conns);
             profiler.checkpoint("Create LdapUserDAO");
             User<T> user = userDAO.getAugmentedUser(userID);
@@ -476,7 +476,7 @@ public class LdapUserPersistence<T extends Principal> extends LdapPersistence im
     /**
      * Update a user's password. The given user and authenticating user must match.
      *
-     * @param user
+     * @param userID
      * @param oldPassword   current password.
      * @param newPassword   new password.
      * @throws UserNotFoundException If the given user does not exist.
@@ -510,8 +510,7 @@ public class LdapUserPersistence<T extends Principal> extends LdapPersistence im
     /**
      * Reset a user's password. The given user and authenticating user must match.
      *
-     * @param user
-     * @param oldPassword   current password.
+     * @param userID
      * @param newPassword   new password.
      * @throws UserNotFoundException If the given user does not exist.
      * @throws TransientException   If an temporary, unexpected problem occurred.
diff --git a/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/UserServlet.java b/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/UserServlet.java
index e1050d48ad1720077e0842af34299a5cbd8b4083..8d73c2adb67105a1e09ef186fc14a9080e5678d4 100644
--- a/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/UserServlet.java
+++ b/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/UserServlet.java
@@ -177,7 +177,7 @@ public class UserServlet<T extends Principal> extends HttpServlet
             AbstractUserAction action = factory.createAction(request);
             action.setAcceptedContentType(getAcceptedContentType(request));
             log.debug("content-type: " + getAcceptedContentType(request));
-            profiler.checkpoint("created action");
+//            profiler.checkpoint("created action");
 
             // Special case: if the calling subject has a servops X500Principal,
             // AND it is a GET request, do not augment the subject.
@@ -254,6 +254,7 @@ public class UserServlet<T extends Principal> extends HttpServlet
         }
         finally
         {
+            profiler.checkpoint("Action complete");
             logInfo.setElapsedTime(System.currentTimeMillis() - start);
             log.info(logInfo.end());
         }
diff --git a/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/groups/ModifyGroupAction.java b/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/groups/ModifyGroupAction.java
index 704795a141678956e4012baa23a523781aaf8db4..4089fe183e8838bb1fbfe09f4cd54765a4129a94 100755
--- a/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/groups/ModifyGroupAction.java
+++ b/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/groups/ModifyGroupAction.java
@@ -76,6 +76,7 @@ import ca.nrc.cadc.ac.Group;
 import ca.nrc.cadc.ac.User;
 import ca.nrc.cadc.ac.server.GroupPersistence;
 import ca.nrc.cadc.ac.xml.GroupReader;
+import ca.nrc.cadc.profiler.Profiler;
 
 public class ModifyGroupAction extends AbstractGroupAction
 {
@@ -93,10 +94,14 @@ public class ModifyGroupAction extends AbstractGroupAction
 
     public void doAction() throws Exception
     {
+        Profiler profiler = new Profiler(ModifyGroupAction.class);
         GroupReader groupReader = new GroupReader();
         Group group = groupReader.read(this.inputStream);
         Group oldGroup = groupPersistence.getGroup(this.groupName);
+        profiler.checkpoint("get Group");
+
         groupPersistence.modifyGroup(group);
+        profiler.checkpoint("modify Group");
 
         List<String> addedMembers = new ArrayList<String>();
         for (User member : group.getUserMembers())
@@ -131,6 +136,7 @@ public class ModifyGroupAction extends AbstractGroupAction
             deletedMembers = null;
         }
         logGroupInfo(group.getID(), deletedMembers, addedMembers);
+        profiler.checkpoint("log GroupInfo");
 
         syncOut.setHeader("Location", request);
         syncOut.setCode(303);
diff --git a/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/AbstractUserAction.java b/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/AbstractUserAction.java
index 09aaa45d453fb3f25bc00d4d3847231de3a7173d..cf31ccaa7aac93aefdadf6a4b067619dce95184a 100644
--- a/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/AbstractUserAction.java
+++ b/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/AbstractUserAction.java
@@ -101,7 +101,6 @@ public abstract class AbstractUserAction<T extends Principal> implements Privile
     private static final Logger log = Logger.getLogger(AbstractUserAction.class);
     public static final String DEFAULT_CONTENT_TYPE = "text/xml";
     public static final String JSON_CONTENT_TYPE = "application/json";
-    private Profiler profiler = new Profiler(AbstractUserAction.class);
 
     protected boolean isAugmentUser;
     protected UserLogInfo logInfo;
@@ -146,6 +145,7 @@ public abstract class AbstractUserAction<T extends Principal> implements Privile
     {
         try
         {
+            Profiler profiler = new Profiler(AbstractUserAction.class);
             doAction();
             profiler.checkpoint("doAction");
         }
@@ -219,6 +219,7 @@ public abstract class AbstractUserAction<T extends Principal> implements Privile
 
     private void sendError(int responseCode, String message)
     {
+        Profiler profiler = new Profiler(AbstractUserAction.class);
         syncOut.setCode(responseCode);
         syncOut.setHeader("Content-Type", "text/plain");
         if (message != null)
@@ -256,6 +257,7 @@ public abstract class AbstractUserAction<T extends Principal> implements Privile
     protected final UserRequest<Principal> readUserRequest(
             final InputStream inputStream) throws IOException
     {
+        Profiler profiler = new Profiler(AbstractUserAction.class);
         final UserRequest<Principal> userRequest;
 
         if (acceptedContentType.equals(DEFAULT_CONTENT_TYPE))
@@ -289,6 +291,7 @@ public abstract class AbstractUserAction<T extends Principal> implements Privile
     protected final User<Principal> readUser(final InputStream inputStream)
             throws IOException
     {
+        Profiler profiler = new Profiler(AbstractUserAction.class);
         syncOut.setHeader("Content-Type", acceptedContentType);
         final User<Principal> user;
 
@@ -321,6 +324,7 @@ public abstract class AbstractUserAction<T extends Principal> implements Privile
     protected final <T extends Principal> void writeUser(final User<T> user)
             throws IOException
     {
+        Profiler profiler = new Profiler(AbstractUserAction.class);
         syncOut.setHeader("Content-Type", acceptedContentType);
         final Writer writer = syncOut.getWriter();
 
@@ -345,6 +349,7 @@ public abstract class AbstractUserAction<T extends Principal> implements Privile
     protected final <T extends Principal> void writeUsers(final Collection<User<T>> users)
             throws IOException
     {
+        Profiler profiler = new Profiler(AbstractUserAction.class);
         syncOut.setHeader("Content-Type", acceptedContentType);
         final Writer writer = syncOut.getWriter();
 
diff --git a/cadcAccessControl-Server/src/ca/nrc/cadc/auth/AuthenticatorImpl.java b/cadcAccessControl-Server/src/ca/nrc/cadc/auth/AuthenticatorImpl.java
index bc798615f89737639587538261324e664b468998..fc765104b57e8543db47e9e425292666cf12de94 100644
--- a/cadcAccessControl-Server/src/ca/nrc/cadc/auth/AuthenticatorImpl.java
+++ b/cadcAccessControl-Server/src/ca/nrc/cadc/auth/AuthenticatorImpl.java
@@ -94,8 +94,6 @@ public class AuthenticatorImpl implements Authenticator
 {
     private static final Logger log = Logger.getLogger(AuthenticatorImpl.class);
 
-    private Profiler profiler = new Profiler(AuthenticatorImpl.class);
-
     public AuthenticatorImpl() { }
 
     /**
@@ -104,6 +102,7 @@ public class AuthenticatorImpl implements Authenticator
      */
     public Subject getSubject(Subject subject)
     {
+        Profiler profiler = new Profiler(AuthenticatorImpl.class);
         log.debug("ac augment subject: " + subject);
         AuthMethod am = AuthenticationUtil.getAuthMethod(subject);
         if (am == null || AuthMethod.ANON.equals(am))
@@ -135,6 +134,7 @@ public class AuthenticatorImpl implements Authenticator
     {
         try
         {
+            Profiler profiler = new Profiler(AuthenticatorImpl.class);
             PluginFactory pluginFactory = new PluginFactory();
             UserPersistence userPersistence = pluginFactory.createUserPersistence();
             User<Principal> user = userPersistence.getAugmentedUser(subject.getPrincipals().iterator().next());