diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/CreateGroupAction.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/CreateGroupAction.java
index 10f4012b1c3ab9a146af9793aa64d3c846a0e67f..32661345fc85f1042784a01421c27da98d4b9c48 100755
--- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/CreateGroupAction.java
+++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/CreateGroupAction.java
@@ -68,17 +68,15 @@
  */
 package ca.nrc.cadc.ac.server.web;
 
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
 import ca.nrc.cadc.ac.Group;
 import ca.nrc.cadc.ac.GroupReader;
 import ca.nrc.cadc.ac.GroupWriter;
 import ca.nrc.cadc.ac.User;
 import ca.nrc.cadc.ac.server.GroupPersistence;
-import java.io.InputStream;
-import java.security.Principal;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-import javax.servlet.http.HttpServletResponse;
 
 public class CreateGroupAction extends GroupsAction
 {
@@ -96,8 +94,8 @@ public class CreateGroupAction extends GroupsAction
         GroupPersistence groupPersistence = getGroupPersistence();
         Group group = GroupReader.read(this.inputStream);
         Group newGroup = groupPersistence.addGroup(group);
-        setContentType("application/xml");
-        GroupWriter.write(newGroup, getOutputStream());
+        this.response.setContentType("application/xml");
+        GroupWriter.write(newGroup, this.response.getOutputStream());
 
         List<String> addedMembers = null;
         if ((newGroup.getUserMembers().size() > 0) || (newGroup.getGroupMembers().size() > 0))
diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/GetGroupAction.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/GetGroupAction.java
index d3f758f257aa1d2ed3d85ca741c01cdaf3d8eebc..e72003567a83a2723ee6ce15376d5a5beee22027 100755
--- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/GetGroupAction.java
+++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/GetGroupAction.java
@@ -70,7 +70,6 @@
 import ca.nrc.cadc.ac.Group;
 import ca.nrc.cadc.ac.GroupWriter;
 import ca.nrc.cadc.ac.server.GroupPersistence;
-import javax.servlet.http.HttpServletResponse;
 
 public class GetGroupAction extends GroupsAction
 {
@@ -87,8 +86,8 @@ public class GetGroupAction extends GroupsAction
     {
         GroupPersistence groupPersistence = getGroupPersistence();
         Group group = groupPersistence.getGroup(this.groupName);
-        setContentType("application/xml");
-        GroupWriter.write(group, getOutputStream());
+        this.response.setContentType("application/xml");
+        GroupWriter.write(group, this.response.getOutputStream());
         return null;
     }
 
diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/GetGroupNamesAction.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/GetGroupNamesAction.java
index 0ca3c2dde196b9daf914d5b18f77753e4db124d7..a29e5fcf29a37ebf66ded5fd96cff4edbe77f26c 100644
--- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/GetGroupNamesAction.java
+++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/GetGroupNamesAction.java
@@ -65,20 +65,21 @@
  *  $Revision: 4 $
  *
  ************************************************************************
- */package ca.nrc.cadc.ac.server.web;
+ */
+
+package ca.nrc.cadc.ac.server.web;
 
-import java.io.OutputStreamWriter;
 import java.io.Writer;
 import java.util.Collection;
 
-import ca.nrc.cadc.ac.server.GroupPersistence;
-
-import com.csvreader.CsvWriter;
+import org.apache.log4j.Logger;
 
-import javax.servlet.http.HttpServletResponse;
+import ca.nrc.cadc.ac.server.GroupPersistence;
 
 public class GetGroupNamesAction extends GroupsAction
 {
+    
+    private static final Logger log = Logger.getLogger(GetGroupNamesAction.class);
 
     GetGroupNamesAction(GroupLogInfo logInfo)
     {
@@ -90,16 +91,21 @@ public class GetGroupNamesAction extends GroupsAction
     {
         GroupPersistence groupPersistence = getGroupPersistence();
         Collection<String> groups = groupPersistence.getGroupNames();
-        setContentType("text/csv");
-
-        final Writer writer = new OutputStreamWriter(getOutputStream());
-        final CsvWriter csvWriter = new CsvWriter(writer, ',');
-
+        log.debug("Found " + groups.size() + " group names");
+        response.setContentType("text/plain");
+        log.debug("Set content-type to text/plain");
+        Writer writer = response.getWriter();
+        boolean start = true;
         for (final String group : groups)
         {
-            csvWriter.write(group);
+            if (!start)
+            {
+                writer.write("\r\n");
+            }
+            writer.write(group);
+            start = false;
         }
-        csvWriter.endRecord();
+        
         return null;
     }
 }
diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/GroupsAction.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/GroupsAction.java
index 40b01cc12243c3d0909dfe7e933a1b1946b25d97..02f64926a9982e7ae88b89bed6c054087cb473a9 100755
--- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/GroupsAction.java
+++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/GroupsAction.java
@@ -69,7 +69,6 @@
 package ca.nrc.cadc.ac.server.web;
 
 import java.io.IOException;
-import java.io.OutputStream;
 import java.security.AccessControlException;
 import java.security.Principal;
 import java.security.PrivilegedActionException;
@@ -90,108 +89,99 @@ import ca.nrc.cadc.ac.server.GroupPersistence;
 import ca.nrc.cadc.ac.server.PluginFactory;
 import ca.nrc.cadc.ac.server.UserPersistence;
 import ca.nrc.cadc.net.TransientException;
-import ca.nrc.cadc.uws.server.SyncOutput;
-
 
 public abstract class GroupsAction
     implements PrivilegedExceptionAction<Object>
 {
     private static final Logger log = Logger.getLogger(GroupsAction.class);
     protected GroupLogInfo logInfo;
-    private SyncOutput syncOutput;
+    protected HttpServletResponse response;
 
     GroupsAction(GroupLogInfo logInfo)
     {
         this.logInfo = logInfo;
     }
 
-    public void doAction(Subject subject, final HttpServletResponse response)
+    public void doAction(Subject subject, HttpServletResponse response)
         throws IOException
     {
-        syncOutput = new SyncOutput()
-        {
-            @Override
-            public void setResponseCode(int code)
-            {
-                response.setStatus(code);
-            }
-
-            @Override
-            public void setHeader(String key, String value)
-            {
-                response.setHeader(key, value);
-            }
-
-            @Override
-            public OutputStream getOutputStream() throws IOException
-            {
-                return response.getOutputStream();
-            }
-        };
-
         try
         {
-            if (subject == null)
+            try
             {
-                run();
+                this.response = response;
+
+                if (subject == null)
+                {
+                    run();
+                }
+                else
+                {
+                    Subject.doAs(subject, this);
+                }
             }
-            else
+            catch (PrivilegedActionException e)
             {
-                runPrivileged(subject);
+                Throwable cause = e.getCause();
+                if (cause != null)
+                {
+                    throw cause;
+                }
+                throw e;
             }
         }
         catch (AccessControlException e)
         {
-            log.debug("Permission denied", e);
+            log.debug(e);
             String message = "Permission Denied";
             this.logInfo.setMessage(message);
             sendError(403, message);
         }
         catch (IllegalArgumentException e)
         {
-            log.debug("Illegal argument", e);
+            log.debug(e);
             String message = e.getMessage();
             this.logInfo.setMessage(message);
             sendError(400, message);
         }
         catch (MemberNotFoundException e)
         {
-            log.debug("Member Not Found", e);
+            log.debug(e);
             String message = "Member not found: " + e.getMessage();
             this.logInfo.setMessage(message);
             sendError(404, message);
         }
         catch (GroupNotFoundException e)
         {
-            log.debug("Group not found", e);
+            log.debug(e);
             String message = "Group not found: " + e.getMessage();
             this.logInfo.setMessage(message);
             sendError(404, message);
         }
         catch (UserNotFoundException e)
         {
-            log.debug("User Not Found", e);
+            log.debug(e);
             String message = "User not found: " + e.getMessage();
             this.logInfo.setMessage(message);
             sendError(404, message);
         }
         catch (MemberAlreadyExistsException e)
         {
-            log.debug("Member Already Exists", e);
+            log.debug(e);
             String message = "Member already exists: " + e.getMessage();
             this.logInfo.setMessage(message);
             sendError(409, message);
         }
         catch (GroupAlreadyExistsException e)
         {
-            log.debug("Group Already Exists", e);
+            log.debug(e);
             String message = "Group already exists: " + e.getMessage();
             this.logInfo.setMessage(message);
             sendError(409, message);
         }
         catch (UnsupportedOperationException e)
         {
-            log.debug("Unsupported Operation", e);
+            log.debug(e);
             this.logInfo.setMessage("Not yet implemented.");
             sendError(501);
         }
@@ -213,58 +203,27 @@ public abstract class GroupsAction
         }
     }
 
-    private void runPrivileged(final Subject subject) throws Throwable
-    {
-        try
-        {
-            Subject.doAs(subject, this);
-        }
-        catch (PrivilegedActionException e)
-        {
-            final Throwable cause = e.getCause();
-            if (cause != null)
-            {
-                throw cause;
-            }
-            throw e;
-        }
-    }
-
-    protected final void setStatusCode(final int statusCode)
-    {
-        syncOutput.setResponseCode(statusCode);
-    }
-
-    protected final OutputStream getOutputStream() throws IOException
-    {
-        return syncOutput.getOutputStream();
-    }
-
-    protected final void setContentType(final String contentType)
-    {
-        syncOutput.setHeader("Content-Type", contentType);
-    }
-
-    protected final void setRedirectLocation(final String location)
-    {
-        syncOutput.setHeader("Location", location);
-    }
-
     private void sendError(int responseCode)
         throws IOException
     {
         sendError(responseCode, null);
     }
 
-    private void sendError(final int code, String message)
+    private void sendError(int responseCode, String message)
         throws IOException
     {
-        setContentType("text/plain");
-        setStatusCode(code);
-
-        if (message != null)
+        if (!this.response.isCommitted())
+        {
+            this.response.setContentType("text/plain");
+            if (message != null)
+            {
+                this.response.getWriter().write(message);
+            }
+            this.response.setStatus(responseCode);
+        }
+        else
         {
-            getOutputStream().write(message.getBytes());
+            log.warn("Could not send error " + responseCode + " (" + message + ") because the response is already committed.");
         }
     }
 
diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/GroupsActionFactory.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/GroupsActionFactory.java
index 0f978accbf65d3ce48a76c5e2f03553dca81f14e..83ecc9d1f7a0caae37d88e1b53d7c7183e1079e5 100755
--- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/GroupsActionFactory.java
+++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/GroupsActionFactory.java
@@ -185,6 +185,7 @@ public class GroupsActionFactory
 
         if (action != null)
         {
+            log.debug("Returning action: " + action.getClass());
             return action;
         }
         throw new IllegalArgumentException("Bad groups request: " + method + " on " + path);
diff --git a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/ModifyGroupAction.java b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/ModifyGroupAction.java
index 1375832db2b535f1a219e66083c1e3447051e91e..c7a03ca5688c0d2c697ff24296428310767edc29 100755
--- a/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/ModifyGroupAction.java
+++ b/projects/cadcAccessControl-Server/src/ca/nrc/cadc/ac/server/web/ModifyGroupAction.java
@@ -68,17 +68,14 @@
  */
 package ca.nrc.cadc.ac.server.web;
 
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
 import ca.nrc.cadc.ac.Group;
 import ca.nrc.cadc.ac.GroupReader;
-import ca.nrc.cadc.ac.GroupWriter;
 import ca.nrc.cadc.ac.User;
 import ca.nrc.cadc.ac.server.GroupPersistence;
-import java.io.InputStream;
-import java.security.Principal;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-import javax.servlet.http.HttpServletResponse;
 
 public class ModifyGroupAction extends GroupsAction
 {
@@ -137,8 +134,7 @@ public class ModifyGroupAction extends GroupsAction
         }
         logGroupInfo(group.getID(), deletedMembers, addedMembers);
 
-        setStatusCode(303);
-        setRedirectLocation(request);
+        this.response.sendRedirect(request);
 
         return null;
     }
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 425b25f4bd0227f7de0775315b07636ec847a75d..7609ee7326133d0d2975059fdd7666c0e3435f0c 100755
--- a/projects/cadcAccessControl/src/ca/nrc/cadc/ac/client/GMSClient.java
+++ b/projects/cadcAccessControl/src/ca/nrc/cadc/ac/client/GMSClient.java
@@ -68,15 +68,16 @@
  */
 package ca.nrc.cadc.ac.client;
 
+import java.io.BufferedReader;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.net.HttpURLConnection;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLEncoder;
-import java.nio.charset.Charset;
 import java.security.AccessControlContext;
 import java.security.AccessControlException;
 import java.security.AccessController;
@@ -110,8 +111,6 @@ import ca.nrc.cadc.net.HttpUpload;
 import ca.nrc.cadc.net.InputStreamWrapper;
 import ca.nrc.cadc.net.NetUtil;
 
-import com.csvreader.CsvReader;
-
 
 /**
  * Client class for performing group searching and group actions
@@ -319,15 +318,11 @@ public class GMSClient
             {
                 try
                 {
-                    final CsvReader reader =
-                            new CsvReader(inputStream, ',',
-                                          Charset.forName("UTF-8"));
-                    if (reader.readRecord())
-                    {
-                        for (int i = 0; i < reader.getColumnCount(); i++)
-                        {
-                            groupNames.add(reader.get(i));
-                        }
+                    InputStreamReader inReader = new InputStreamReader(inputStream);
+                    BufferedReader reader = new BufferedReader(inReader);
+                    String line;
+                    while ((line = reader.readLine()) != null) {
+                        groupNames.add(line);
                     }
                 }
                 catch (Exception bug)
@@ -363,8 +358,8 @@ public class GMSClient
             throw new IOException("HttpResponse (" + responseCode + ") - " + errMessage);
         }
 
-        log.error("Content-Length: " + httpDownload.getContentLength());
-        log.error("Content-Type: " + httpDownload.getContentType());
+        log.debug("Content-Length: " + httpDownload.getContentLength());
+        log.debug("Content-Type: " + httpDownload.getContentType());
 
         return groupNames;
     }