diff --git a/cadc-access-control-admin/build.gradle b/cadc-access-control-admin/build.gradle
index 44037a6ab5e60e117a735a2fb2e59c7163ead46f..4c61862d44ffa9804e53d0194f9265697dfc8b91 100644
--- a/cadc-access-control-admin/build.gradle
+++ b/cadc-access-control-admin/build.gradle
@@ -15,7 +15,7 @@ sourceCompatibility = 1.7
 
 group = 'org.opencadc'
 
-version = '1.0.1'
+version = '1.0.2'
 
 mainClassName = 'ca.nrc.cadc.ac.admin.Main'
 
diff --git a/cadc-access-control-admin/src/main/java/ca/nrc/cadc/ac/admin/AbstractCommand.java b/cadc-access-control-admin/src/main/java/ca/nrc/cadc/ac/admin/AbstractCommand.java
index a5a32ed8aad8a4ff57f75352ee99b9f22e23bfa5..f521b5d9e9023bc4016426d212d10a4cdca85fda 100644
--- a/cadc-access-control-admin/src/main/java/ca/nrc/cadc/ac/admin/AbstractCommand.java
+++ b/cadc-access-control-admin/src/main/java/ca/nrc/cadc/ac/admin/AbstractCommand.java
@@ -89,7 +89,6 @@ public abstract class AbstractCommand implements PrivilegedAction<Object>
 
     private UserPersistence userPersistence;
 
-
     protected abstract void doRun()
             throws AccessControlException, TransientException;
 
diff --git a/cadc-access-control-admin/src/main/java/ca/nrc/cadc/ac/admin/CmdLineParser.java b/cadc-access-control-admin/src/main/java/ca/nrc/cadc/ac/admin/CmdLineParser.java
index 40185149c2bafc61c4fe92adc08d84e945067e7b..c2690950f379826a596c50b4768c026fcc819481 100644
--- a/cadc-access-control-admin/src/main/java/ca/nrc/cadc/ac/admin/CmdLineParser.java
+++ b/cadc-access-control-admin/src/main/java/ca/nrc/cadc/ac/admin/CmdLineParser.java
@@ -72,9 +72,12 @@
 import java.io.PrintStream;
 import java.security.cert.CertificateException;
 
+import javax.security.auth.Subject;
+
 import org.apache.log4j.Level;
 import org.apache.log4j.Logger;
 
+import ca.nrc.cadc.auth.CertCmdArgUtil;
 import ca.nrc.cadc.util.ArgumentMap;
 import ca.nrc.cadc.util.Log4jInit;
 import ca.nrc.cadc.util.StringUtil;
@@ -95,6 +98,7 @@ public class CmdLineParser
     private Level logLevel = Level.OFF;
     private AbstractCommand command;
     private boolean isHelpCommand = false;
+    private ArgumentMap am;
 
     /**
      * Constructor.
@@ -105,7 +109,7 @@ public class CmdLineParser
     public CmdLineParser(final String[] args, final PrintStream outStream,
         final PrintStream errStream) throws UsageException, CertificateException
     {
-        ArgumentMap am = new ArgumentMap( args );
+        am = new ArgumentMap( args );
     	this.setLogLevel(am);
     	this.parse(am, outStream, errStream);
     }
@@ -127,6 +131,11 @@ public class CmdLineParser
     	return this.logLevel;
     }
 
+    public Subject getSubjectFromCert()
+    {
+        return CertCmdArgUtil.initSubject(am);
+    }
+
     /*
      * Set the log level.
      * @param am Input arguments
@@ -294,6 +303,8 @@ public class CmdLineParser
     	StringBuilder sb = new StringBuilder();
     	sb.append("\n");
     	sb.append("Usage: " + APP_NAME + " <command> [-v|--verbose|-d|--debug] [-h|--help]\n");
+    	sb.append(CertCmdArgUtil.getCertArgUsage());
+    	sb.append("\n");
     	sb.append("Where command is\n");
     	sb.append("--list                       : List users in the Users tree\n");
     	sb.append("--list-pending               : List users in the UserRequests tree\n");
diff --git a/cadc-access-control-admin/src/main/java/ca/nrc/cadc/ac/admin/CommandRunner.java b/cadc-access-control-admin/src/main/java/ca/nrc/cadc/ac/admin/CommandRunner.java
index 6c8943814e7fb68da0f5945fcf9ce4ef8887841d..97f130684f1b7203e135eaba4b6e608a8d581e31 100644
--- a/cadc-access-control-admin/src/main/java/ca/nrc/cadc/ac/admin/CommandRunner.java
+++ b/cadc-access-control-admin/src/main/java/ca/nrc/cadc/ac/admin/CommandRunner.java
@@ -69,22 +69,17 @@
 package ca.nrc.cadc.ac.admin;
 
 import java.security.Principal;
-import java.util.HashSet;
 import java.util.Set;
 
 import javax.security.auth.Subject;
+import javax.security.auth.x500.X500Principal;
 
 import org.apache.log4j.Logger;
 
 import ca.nrc.cadc.ac.UserNotFoundException;
 import ca.nrc.cadc.ac.server.UserPersistence;
-import ca.nrc.cadc.ac.server.ldap.LdapConfig;
-import ca.nrc.cadc.auth.AuthenticationUtil;
-import ca.nrc.cadc.auth.DelegationToken;
+import ca.nrc.cadc.auth.AuthMethod;
 import ca.nrc.cadc.auth.HttpPrincipal;
-import ca.nrc.cadc.auth.PrincipalExtractor;
-import ca.nrc.cadc.auth.SSOCookieCredential;
-import ca.nrc.cadc.auth.X509CertificateChain;
 import ca.nrc.cadc.net.TransientException;
 
 
@@ -112,59 +107,33 @@ public class CommandRunner
         AbstractCommand command = commandLineParser.getCommand();
         command.setUserPersistence(userPersistence);
 
-        Principal userIDPrincipal = null;
+        Subject operatorSubject = new Subject();
+
         if (command instanceof AbstractUserCommand)
         {
-            userIDPrincipal = ((AbstractUserCommand) command).getPrincipal();
+            Principal userIDPrincipal = ((AbstractUserCommand) command).getPrincipal();
+            operatorSubject.getPrincipals().add(userIDPrincipal);
+            operatorSubject.getPublicCredentials().add(AuthMethod.PASSWORD);
         }
-
-        if (userIDPrincipal == null)
+        else
         {
-            // run as the operator
-            LdapConfig config = LdapConfig.getLdapConfig();
-            String proxyDN = config.getProxyUserDN();
-            if (proxyDN == null)
-                throw new IllegalArgumentException("No ldap account in .dbrc");
-
-            String userIDLabel = "uid=";
-            int uidIndex = proxyDN.indexOf("uid=");
-            int commaIndex = proxyDN.indexOf(",", userIDLabel.length());
-            String userID = proxyDN.substring(uidIndex + userIDLabel.length(), commaIndex);
-            userIDPrincipal = new HttpPrincipal(userID);
-        }
+            // run as the operator using their cert
+            Subject subjectFromCert = commandLineParser.getSubjectFromCert();
 
-        // run as the user
-        LOGGER.debug("running as " + userIDPrincipal.getName());
-        Set<Principal> userPrincipals = new HashSet<Principal>(1);
-        userPrincipals.add(userIDPrincipal);
-        AnonPrincipalExtractor principalExtractor = new AnonPrincipalExtractor(userPrincipals);
-        Subject subject = AuthenticationUtil.getSubject(principalExtractor);
-        Subject.doAs(subject, command);
-    }
+            if (subjectFromCert == null)
+                throw new IllegalArgumentException("Certificate required");
 
-    class AnonPrincipalExtractor implements PrincipalExtractor
-    {
-        Set<Principal> principals;
+            Set<X500Principal> pSet = subjectFromCert.getPrincipals(X500Principal.class);
+            if (pSet.isEmpty())
+                throw new IllegalArgumentException("Certificate required");
 
-        AnonPrincipalExtractor(Set<Principal> principals)
-        {
-            this.principals = principals;
-        }
-        public Set<Principal> getPrincipals()
-        {
-            return principals;
-        }
-        public X509CertificateChain getCertificateChain()
-        {
-            return null;
-        }
-        public DelegationToken getDelegationToken()
-        {
-            return null;
-        }
-        public SSOCookieCredential getSSOCookieCredential()
-        {
-            return null;
+            operatorSubject.getPrincipals().addAll(subjectFromCert.getPrincipals());
+            operatorSubject.getPrincipals().add(new HttpPrincipal("authorizedUser"));
+            operatorSubject.getPublicCredentials().addAll(subjectFromCert.getPublicCredentials());
+            operatorSubject.getPublicCredentials().add(AuthMethod.CERT);
         }
+
+        LOGGER.debug("running as: " + operatorSubject);
+        Subject.doAs(operatorSubject, command);
     }
 }
diff --git a/cadc-access-control-admin/src/main/java/ca/nrc/cadc/ac/admin/ListUserRequests.java b/cadc-access-control-admin/src/main/java/ca/nrc/cadc/ac/admin/ListUserRequests.java
index 66f48174b29e87d54990a65fdc22c1509c024bd5..8a92a058e235abcb0a8bec759fa357f4c0d8d6b8 100644
--- a/cadc-access-control-admin/src/main/java/ca/nrc/cadc/ac/admin/ListUserRequests.java
+++ b/cadc-access-control-admin/src/main/java/ca/nrc/cadc/ac/admin/ListUserRequests.java
@@ -92,4 +92,5 @@ public class ListUserRequests extends AbstractListUsers
     {
     	return this.getUserPersistence().getUserRequests();
     }
+
 }
diff --git a/cadc-access-control-admin/src/main/java/ca/nrc/cadc/ac/admin/ListUsers.java b/cadc-access-control-admin/src/main/java/ca/nrc/cadc/ac/admin/ListUsers.java
index 1256ad9af5a0a8f8e3d63356bddd808e06d7b790..bcb5d34bee217fba54a4a10949eb90dce956f0be 100644
--- a/cadc-access-control-admin/src/main/java/ca/nrc/cadc/ac/admin/ListUsers.java
+++ b/cadc-access-control-admin/src/main/java/ca/nrc/cadc/ac/admin/ListUsers.java
@@ -92,4 +92,5 @@ public class ListUsers extends AbstractListUsers
     {
     	return this.getUserPersistence().getUsers();
     }
+
 }
diff --git a/cadc-access-control-admin/src/main/java/ca/nrc/cadc/ac/admin/RejectUser.java b/cadc-access-control-admin/src/main/java/ca/nrc/cadc/ac/admin/RejectUser.java
index 4050de7b22186cc4fd0c06a7a70205a840d26d21..e21718a93cf2c124abd6b1b34591a18d7f0da203 100644
--- a/cadc-access-control-admin/src/main/java/ca/nrc/cadc/ac/admin/RejectUser.java
+++ b/cadc-access-control-admin/src/main/java/ca/nrc/cadc/ac/admin/RejectUser.java
@@ -81,10 +81,10 @@ import ca.nrc.cadc.net.TransientException;
  * @author yeunga
  *
  */
-public class RejectUser extends AbstractUserCommand 
+public class RejectUser extends AbstractUserCommand
 {
     private static final Logger log = Logger.getLogger(RejectUser.class);
-	
+
     /**
      * Constructor
      * @param userID Id of the pending user to be deleted
@@ -93,9 +93,9 @@ public class RejectUser extends AbstractUserCommand
     {
     	super(userID);
     }
-    
-    protected void execute() 
-        throws AccessControlException, UserNotFoundException, TransientException 
+
+    protected void execute()
+        throws AccessControlException, UserNotFoundException, TransientException
     {
         // delete user from the pending tree
         this.getUserPersistence().deleteUserRequest(this.getPrincipal());
diff --git a/cadc-access-control-admin/src/main/java/ca/nrc/cadc/ac/admin/ViewUser.java b/cadc-access-control-admin/src/main/java/ca/nrc/cadc/ac/admin/ViewUser.java
index 6201ca876d905d73bd634ea381eedcdc93305052..e3e705ca79e27baad75b8b35d3f5a48df326eaaf 100644
--- a/cadc-access-control-admin/src/main/java/ca/nrc/cadc/ac/admin/ViewUser.java
+++ b/cadc-access-control-admin/src/main/java/ca/nrc/cadc/ac/admin/ViewUser.java
@@ -106,7 +106,7 @@ public class ViewUser extends AbstractUserCommand
             User user = this.getUserPersistence().getUser(this.getPrincipal());
             this.printUser(user);
         }
-        catch (UserNotFoundException e)
+        catch (AccessControlException | UserNotFoundException e)
         {
             // Not in the main tree, try the pending tree
             User user = this.getUserPersistence().getUserRequest(this.getPrincipal());