diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/PasswordServlet.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/PasswordServlet.java
index 481e3439d05620aaba0e7426b1982a57348b0ed0..a7979bbd3504a2a543f4c8245ac2879d13f09c1f 100644
--- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/PasswordServlet.java
+++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/users/PasswordServlet.java
@@ -97,77 +97,88 @@ public class PasswordServlet extends HttpServlet
 	public void doPost(final HttpServletRequest request, final HttpServletResponse response)
         throws IOException
     {
+        response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
         final long start = System.currentTimeMillis();
         final ServletLogInfo logInfo = new ServletLogInfo(request);
         log.info(logInfo.start());
-        final Subject subject = AuthenticationUtil.getSubject(request);
-        logInfo.setSubject(subject);
-        
-        Subject.doAs(subject, new PrivilegedAction<Void>()
+        try
         {
-        	@Override
-        	public Void run()
-        	{
-		        try
-		        {
-		            final Set<HttpPrincipal> webPrincipals =
-		                    subject.getPrincipals(HttpPrincipal.class);
-		
-		            if (webPrincipals.isEmpty())
-		            {
-		                response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
-		            }
-		            else
-		            {
-		                User<HttpPrincipal> user = new User<HttpPrincipal>(webPrincipals.toArray(
-		                        new HttpPrincipal[1])[0]);
-			            String oldPassword = request.getParameter("old_password");
-			            String newPassword = request.getParameter("new_password");
-			            if (StringUtil.hasText(oldPassword))
-			            {
-			                if (StringUtil.hasText(newPassword))
-			                {
-			                	(new LdapUserPersistence<HttpPrincipal>()).setPassword(user, oldPassword, newPassword);
-			                }
-			                else
-			                {
-			                	throw new IllegalArgumentException("Missing new password");
-			                }
-			            }
-			            else
-			            {
-			            	throw new IllegalArgumentException("Missing old password");
-			            }
-		            }
-		        }
-		        catch (IllegalArgumentException e)
-		        {
-		            log.debug(e.getMessage(), e);
-		            logInfo.setMessage(e.getMessage());
-		            response.setStatus(400);
-		        }
-		        catch (AccessControlException e)
-		        {
-		            log.debug(e.getMessage(), e);
-		            logInfo.setMessage(e.getMessage());
-		            response.setStatus(401);
-		        }
-		        catch (Throwable t)
-		        {
-		            String message = "Internal Server Error: " + t.getMessage();
-		            log.error(message, t);
-		            logInfo.setSuccess(false);
-		            logInfo.setMessage(message);
-		            response.setStatus(500);
-		        }
-		        finally
-		        {
-		            logInfo.setElapsedTime(System.currentTimeMillis() - start);
-		            log.info(logInfo.end());
-		        }
-	            
-	            return null;
-        	}
-        });
+            final Subject subject = AuthenticationUtil.getSubject(request);
+            if ((subject == null) || (subject.getPrincipals(HttpPrincipal.class).isEmpty()))
+            {
+                logInfo.setMessage("Missing subject");
+                response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+            }
+            else
+            {
+                logInfo.setSubject(subject);		        
+                Subject.doAs(subject, new PrivilegedAction<Void>()
+                {
+                    @Override
+                    public Void run()
+                    {
+                        try
+                        {
+                            response.setStatus(HttpServletResponse.SC_OK);
+                            final Set<HttpPrincipal> webPrincipals =
+                            subject.getPrincipals(HttpPrincipal.class);
+				
+                            User<HttpPrincipal> user = new User<HttpPrincipal>(webPrincipals.iterator().next());
+                            String oldPassword = request.getParameter("old_password");
+                            String newPassword = request.getParameter("new_password");
+                            if (StringUtil.hasText(oldPassword))
+                            {
+                                if (StringUtil.hasText(newPassword))
+                                {
+                                    (new LdapUserPersistence<HttpPrincipal>()).setPassword(user, oldPassword, newPassword);
+                                }
+                                else
+                                {
+                                    throw new IllegalArgumentException("Missing new password");
+                                }
+                            }
+                            else
+                            {
+                                throw new IllegalArgumentException("Missing old password");
+                            }
+                        }
+                        catch (IllegalArgumentException e)
+                        {
+                            log.debug(e.getMessage(), e);
+                            logInfo.setMessage(e.getMessage());
+                            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+                        }
+                        catch (AccessControlException e)
+                        {
+                            log.debug(e.getMessage(), e);
+                            logInfo.setMessage(e.getMessage());
+                            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+                        }
+                        catch (Throwable t)
+                        {
+                            String message = "Internal Server Error: " + t.getMessage();
+                            log.error(message, t);
+                            logInfo.setSuccess(false);
+                            logInfo.setMessage(message);
+                            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+                        }
+			            
+                        return null;
+                    }
+                });
+            }
+        }
+        catch (Throwable t)
+        {
+            String message = "Internal Server Error: " + t.getMessage();
+            log.error(message, t);
+            logInfo.setSuccess(false);
+            logInfo.setMessage(message);
+        }
+        finally
+        {
+            logInfo.setElapsedTime(System.currentTimeMillis() - start);
+            log.info(logInfo.end());
+        }
     }
 }