diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/ExperimentController.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/ExperimentController.java
index 881850ce8974b1398ea0684781bf573644bd72d9..6af9e452b5350d1e897a58f3b10735b08aea6915 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/ExperimentController.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/ExperimentController.java
@@ -9,12 +9,12 @@ import gov.anl.aps.dm.portal.model.beans.ExperimentFacade;
 import gov.anl.aps.dm.portal.model.beans.RoleTypeFacade;
 import gov.anl.aps.dm.portal.model.beans.UserExperimentRoleFacade;
 import gov.anl.aps.dm.portal.model.beans.UserInfoFacade;
+import gov.anl.aps.dm.portal.model.entities.CloneableEntity;
 import gov.anl.aps.dm.portal.model.entities.RoleType;
 import gov.anl.aps.dm.portal.model.entities.UserExperimentRole;
 import gov.anl.aps.dm.portal.model.entities.UserInfo;
-import gov.anl.aps.dm.portal.model.tempstorage.ExperimentUser;
+// import gov.anl.aps.dm.portal.model.tempstorage.ExperimentUser;
 import gov.anl.aps.dm.portal.utilities.SessionUtility;
-import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -48,6 +48,107 @@ public class ExperimentController extends CrudEntityController<Experiment, Exper
     @EJB
     private UserExperimentRoleFacade userExperimentRoleFacade;
     
+    public class ExperimentUser extends CloneableEntity {
+
+    String username;
+    String name;
+    int userId;
+    int experimentId;
+    private final boolean [] roles;
+//    private final boolean [] updatedRoles;
+    int maxRoleId = 4; // this is hardcoded, should be determined from the RoleType data table.
+                              // for now leave it hardcoded
+    
+//    Map<RoleType, Boolean> roles = new HashMap();
+
+    public ExperimentUser(int experimentId, int userId) {
+        roles = new boolean[maxRoleId+1];
+//        updatedRoles = new boolean[maxRoleId+1];
+        this.experimentId = experimentId;
+        this.userId = userId;
+    }
+    
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public boolean isIsManager() {
+        return roles[2];
+    }
+
+    public void setIsManager(boolean isManager) {
+        logger.debug("setting Manager role for experiment "+ experimentId + " and user " + username + " to " + isManager);
+        roles[2] = isManager;
+    }
+
+    public boolean isIsPI() {
+        return roles[3];
+    }
+
+    public void setIsPI(boolean isPI) {
+        roles[3] = isPI;
+    }
+
+    public boolean isIsUser() {
+        return roles[4];
+    }
+
+    public void setIsUser(boolean isUser) {
+        roles[4] = isUser;
+    }
+
+    public void setIsInRole(RoleType role, boolean isInRole) {
+        roles[role.getId()] = isInRole;
+//        updatedRoles[role.getId()] = isInRole;
+    }
+ 
+    public boolean[] getRoles() {
+        return roles;
+    }
+    
+    public void removeAllExperimentRoles() {
+        UserExperimentRole userExperimentRole;
+        for (int i = 1; i <= maxRoleId; i++) {
+        if (roles[i]) {
+                userExperimentRole = userExperimentRoleFacade.findByUserExperimentRole(userId, experimentId, i);
+                userExperimentRoleFacade.remove(userExperimentRole);
+//                updatedRoles[i] = false;
+            }            
+        }       
+    }
+
+    public boolean canAddUsers() {
+        return roles[2] || roles[3];            
+    }
+    
+    @Override
+    public int hashCode() {
+        return userId * 1000 + experimentId;
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        // TODO: Warning - this method won't work in the case the id fields are not set
+        if (!(object instanceof ExperimentUser)) {
+            return false;
+        }
+        return ((userId == ((ExperimentUser)object).userId) && (experimentId == ((ExperimentUser)object).experimentId));
+    }
+
+}
+    
     class ExperimentUsersTable extends DataTableController<ExperimentUser> {
 
         @Override
@@ -67,16 +168,21 @@ public class ExperimentController extends CrudEntityController<Experiment, Exper
         }
         
         List<ExperimentUser> convertExperimentUsers(List<UserInfo> list) {
+            logger.debug("converring ExperimentUser ");
             List<RoleType> roleTypes = roleTypeFacade.findByRoleSystemType(false);
-            generateColumns(roleTypes);
             for (UserInfo user : list) {
                 ExperimentUser eUser = new ExperimentUser(getCurrent().getId(), user.getId());
                 eUser.setUsername(user.getUsername());
+                if (experimentUsers.containsKey(eUser)) {
+                    eUser = experimentUsers.get(eUser);
+                } else {
+                    experimentUsers.put(eUser, eUser);
+                }
                 eUser.setName(user.getLastName() + ", " + user.getFirstName());
                 for (RoleType roleType : roleTypes) {
-                    eUser.setIsInRole(roleType, user.inRole(roleType.getId(), getCurrent().getId()));
+                    boolean inRole = user.inRole(roleType.getId(), getCurrent().getId());
+                    eUser.setIsInRole(roleType, inRole);
                 }
-                experimentUsers.put(eUser, eUser.getRoles());
             }
             return new ArrayList<>(experimentUsers.keySet());
         }
@@ -85,31 +191,11 @@ public class ExperimentController extends CrudEntityController<Experiment, Exper
         public String getTableName() {
             return "experimentUsersTable";
         }
-    }
-
-    static public class ColumnModel implements Serializable {
-        private String header;
-        private int property;
-
-        public ColumnModel(String header, int property) {
-            this.header = header;
-            this.property = property;
-        }
-
-        public String getHeader() {
-            return header;
-        }
-
-        public void setHeader(String header) {
-            this.header = header;
-        }
-
-        public int getProperty() {
-            return property;
-        }
         
-        public void setProperty(int property) {
-            this.property = property;
+        @Override
+        public void resetList() {
+//            experimentUsers.clear();
+            super.resetList();
         }
     }
 
@@ -135,8 +221,7 @@ public class ExperimentController extends CrudEntityController<Experiment, Exper
     private ExperimentController.ExperimentUsersTable experimentUsersListTable;
     private ExperimentController.ExperimentUsersTable experimentUsersEditTable;
     private ExperimentController.NoExperimentUsersTypeTable noExperimentUsersTypeTable;
-    private List<ExperimentController.ColumnModel> columns = new ArrayList();
-    final private Map<ExperimentUser, boolean[]> experimentUsers = new HashMap<>();
+    final private Map<ExperimentUser, ExperimentUser> experimentUsers = new HashMap<>();
 
     public ExperimentController() {
         this.experimentUsersListTable = new ExperimentController.ExperimentUsersTable();
@@ -214,6 +299,34 @@ public class ExperimentController extends CrudEntityController<Experiment, Exper
         }
         return "Experiment " + experiment.getName() + " already exists."; 
     }
+     
+    @Override
+    public String update() {
+//        findUsersInExperiment(int experimentId)
+        for (ExperimentUser experimentUser: experimentUsers.keySet()) {
+            UserInfo userInfo = userInfoFacade.find(experimentUser.userId);
+            for (int i = 2; i <= 4; i++) {
+                UserExperimentRole userExperimentRole = userExperimentRoleFacade.findByUserExperimentRole(experimentUser.userId, experimentUser.experimentId, i);
+                if (experimentUser.roles[i] && (userExperimentRole == null)) {
+                    userExperimentRole = new UserExperimentRole(experimentUser.userId, experimentUser.experimentId, i);
+                    userExperimentRoleFacade.create(userExperimentRole);
+//                    userInfo.addUserExperimentRole(userExperimentRole);
+                    logger.debug("adding userExperimentRole " + experimentUser.userId + " " + experimentUser.experimentId + " " + i);
+                } 
+                else if (!experimentUser.roles[i] && (userExperimentRole != null)) {
+                    userExperimentRoleFacade.remove(userExperimentRole);
+//                    userInfo.removeUserExperimentRole(userExperimentRole);
+                    logger.debug("removing userExperimentRole " + experimentUser.userId + " " + experimentUser.experimentId + " " + i);
+                }
+//                experimentUser.roles[i] = experimentUser.updatedRoles[i];
+            }
+        }
+        
+//        clear();
+        experimentUsersListTable.resetList();
+        experimentUsersEditTable.resetList();
+        return super.update();
+    }
 
     private void verifyExperiment(Experiment experiment) throws InvalidDate, MissingProperty {       
         if (experiment.getExperimentType() == null) {
@@ -226,20 +339,12 @@ public class ExperimentController extends CrudEntityController<Experiment, Exper
     }
    
 // the methods for Experiment User
-      public List<ExperimentController.ColumnModel> getColumns() {
-        return columns;
-    }
-
-    public void setColumns(List<ExperimentController.ColumnModel> columns) {
-        this.columns = columns;
-    }
 
     public void clear() {
         experimentUsersListTable.resetList();
         experimentUsersEditTable.resetList();
         experimentUsers.clear();
         noExperimentUsersTypeTable.resetList();
-        columns.clear();
     }
     
     public ExperimentController.ExperimentUsersTable getExperimentUsersListTable() {
@@ -265,13 +370,6 @@ public class ExperimentController extends CrudEntityController<Experiment, Exper
     public void setNoExperimentUsersTypeTable(ExperimentController.NoExperimentUsersTypeTable noExperimentUsersTypeTable) {
         this.noExperimentUsersTypeTable = noExperimentUsersTypeTable;
     }
-
-    void generateColumns(List<RoleType> roleTypes) {
-        for (RoleType role : roleTypes) {
-            ExperimentController.ColumnModel column = new ExperimentController.ColumnModel(role.getName(), role.getId());
-            columns.add(column);
-        }
-    }
     
     public boolean canAddUsers(String username) {
         UserInfo user = userInfoFacade.findByUsername(username);
@@ -291,13 +389,18 @@ public class ExperimentController extends CrudEntityController<Experiment, Exper
     }
 
     public String getRemovedUserName() {
-        return experimentUsersEditTable.getCurrentObject().getName();
+        if (experimentUsersEditTable.getCurrentObject() != null) {
+            return experimentUsersEditTable.getCurrentObject().getUsername();
+        }
+        return "";
     }
         
-    public void removeUser() {
+    public String removeUser() {
         ExperimentUser user = experimentUsersEditTable.getCurrentObject();
         user.removeAllExperimentRoles();
         experimentUsers.remove(user);
+        clear();
+        return "edit?faces-redirect=true";
     }
         
     public String addExperimentUser() {
@@ -315,6 +418,7 @@ public class ExperimentController extends CrudEntityController<Experiment, Exper
                     userExperimentRole = new UserExperimentRole(user.getId(), current.getId(), 4); // set the User
                     userExperimentRoleFacade.create(userExperimentRole);
                 }
+                clear();
                 return edit();
             } catch (RuntimeException ex) {
                 SessionUtility.addErrorMessage("Error", "Could not update UserInfo" + ": " + ex.getMessage());
@@ -322,17 +426,17 @@ public class ExperimentController extends CrudEntityController<Experiment, Exper
             }
         }
     }
-  
-//    @Override
-//     public String update() {
-//        logger.debug("current name "+current.getName());
-//        logger.debug("current startDate "+current.getStartDate());
-//        logger.debug("current endDate "+current.getEndDate());
-//        String s = super.update();
-//        logger.debug("redirecting to " + s);
-//        return s;
-//    }
 
+   public boolean hasSystemRole(String user) {
+        RoleType rt;
+        rt = roleTypeFacade.findById(1);
+        if (rt == null) {
+            return false;
+        }
+        return rt.isAdmin(user);
+    }
+
+    
    @FacesConverter(forClass = Experiment.class)
     public static class ExperimentControllerConverter implements Converter
     {
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/UserExperimentRoleFacade.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/UserExperimentRoleFacade.java
index 2b16116621f3c8b9c807036c02f1ced105152b57..4d223067b891a5ac3cb11be0209498a07d67254a 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/UserExperimentRoleFacade.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/UserExperimentRoleFacade.java
@@ -7,7 +7,6 @@
 package gov.anl.aps.dm.portal.model.beans;
 
 import gov.anl.aps.dm.portal.model.entities.UserExperimentRole;
-import gov.anl.aps.dm.portal.model.entities.UserInfo;
 import javax.ejb.Stateless;
 import javax.persistence.EntityManager;
 import javax.persistence.NoResultException;
@@ -37,7 +36,7 @@ public class UserExperimentRoleFacade extends AbstractFacade<UserExperimentRole>
             return (UserExperimentRole) em.createNamedQuery("UserExperimentRole.findByUserExperimentRole")
                     .setParameter("userId", userId)
                     .setParameter("experimentId", experimentId)
-                    .setParameter(roleId, roleId)
+                    .setParameter("roleTypeId", roleId)
                     .getSingleResult();
         }
         catch (NoResultException ex) {
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserInfo.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserInfo.java
index 455ef2ea333605607f7f7479fa47c1043e0e2d51..ed24a143b02b4c7d42b5a6ad78231a2722d162cd 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserInfo.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserInfo.java
@@ -201,6 +201,18 @@ public class UserInfo extends CloneableEntity
         }
         return false;
     }
+    
+    public void addUserExperimentRole(UserExperimentRole experimentRole) {
+        if (!inRole(experimentRole.getUserExperimentRolePK().getRoleTypeId(), experimentRole.getUserExperimentRolePK().getExperimentId())) {
+            userExperimentRoleList.add(experimentRole);
+        } 
+    }
+
+    public void removeUserExperimentRole(UserExperimentRole experimentRole) {
+        if (inRole(experimentRole.getUserExperimentRolePK().getRoleTypeId(), experimentRole.getUserExperimentRolePK().getExperimentId())) {
+            userExperimentRoleList.remove(experimentRole);
+        }
+    }
 
     @Override
     public int hashCode() {
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/tempstorage/ExperimentUser.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/tempstorage/ExperimentUser.java
index 47a7a704c4d45c0c739772b843222d1337c234a7..95ee79c6083c9618640cc9a6308bc9755b4d874d 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/tempstorage/ExperimentUser.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/tempstorage/ExperimentUser.java
@@ -20,7 +20,7 @@ public class ExperimentUser extends CloneableEntity {
     String name;
     int userId;
     int experimentId;
-    private boolean [] roles;
+    private final boolean [] roles;
     static int maxRoleId = 4; // this is hardcoded, should be determined from the RoleType data table.
                               // for now leave it hardcoded
     
@@ -48,33 +48,60 @@ public class ExperimentUser extends CloneableEntity {
         this.name = name;
     }
 
-    public void setIsInRole(RoleType role, boolean isInRole) {
-        roles[role.getId()] = isInRole;
+    public boolean isIsManager() {
+        return roles[2];
     }
-    
-    public boolean getIsInRole(RoleType role) {
-        return roles[role.getId()];
+
+    public void setIsManager(boolean isManager) {
+        roles[2] = isManager;
+        if (isManager) {
+            UserExperimentRole userExperimentRole = new UserExperimentRole(userId, experimentId, 2);
+            userExperimentRoleFacade.create(userExperimentRole);
+        } else {
+            UserExperimentRole userExperimentRole = userExperimentRoleFacade.findByUserExperimentRole(userId, experimentId, 2);
+            userExperimentRoleFacade.remove(userExperimentRole);
+        }
     }
 
-    public boolean[] getRoles() {
-        return roles;
+    public boolean isIsPI() {
+        return roles[3];
     }
 
-    public void setRoles(boolean[] roles) {
-        UserExperimentRole userExperimentRole;
-        for (int i = 1; i <= maxRoleId; i++) {
-            if (roles[i] && !this.roles[i]) {
-                userExperimentRole = new UserExperimentRole(userId, experimentId, i);
-                userExperimentRoleFacade.create(userExperimentRole);
-            } else if (!roles[i] && this.roles[i]) {
-                userExperimentRole = new UserExperimentRole(userId, experimentId, i);
-                userExperimentRoleFacade.remove(userExperimentRole);
-            }            
+    public void setIsPI(boolean isPI) {
+        roles[3] = isPI;
+        if (isPI) {
+            UserExperimentRole userExperimentRole = new UserExperimentRole(userId, experimentId, 3);
+            userExperimentRoleFacade.create(userExperimentRole);
+        } else {
+            UserExperimentRole userExperimentRole = userExperimentRoleFacade.findByUserExperimentRole(userId, experimentId, 3);
+            userExperimentRoleFacade.remove(userExperimentRole);
+        }
+    }
+
+    public boolean isIsUser() {
+        return roles[4];
+    }
+
+    public void setIsUser(boolean isUser) {
+        roles[4] = isUser;
+        if (isUser) {
+            UserExperimentRole userExperimentRole = new UserExperimentRole(userId, experimentId, 4);
+            userExperimentRoleFacade.create(userExperimentRole);
+        } else {
+            UserExperimentRole userExperimentRole = userExperimentRoleFacade.findByUserExperimentRole(userId, experimentId, 4);
+            userExperimentRoleFacade.remove(userExperimentRole);
         }
-        this.roles = roles;
+    }
+
+    public void setIsInRole(RoleType role, boolean isInRole) {
+        roles[role.getId()] = isInRole;
+    }
+ 
+    public boolean[] getRoles() {
+        return roles;
     }
     
-    public void removeAllExperimentRoles() {
+    public void removeAllExperimentRoles(UserExperimentRoleFacade userExperimentRoleFacade) {
         UserExperimentRole userExperimentRole;
         for (int i = 1; i <= maxRoleId; i++) {
         if (roles[i]) {
@@ -85,14 +112,7 @@ public class ExperimentUser extends CloneableEntity {
     }
 
     public boolean canAddUsers() {
-        // this can be tied to permission. For now let's hardcode
-        if (roles[2] || roles[3]) {
-            return true;
-        }
-        else {
-            return false;
-        }
-            
+        return roles[2] || roles[3];            
     }
     
     @Override
diff --git a/src/java/DmWebPortal/web/views/experiment/edit.xhtml b/src/java/DmWebPortal/web/views/experiment/edit.xhtml
index 4dc82894fd2bea6840f9b51baa38e36c19dfb025..bceb961bc2ae038ed0d32628cbbe57b99ec85e6d 100644
--- a/src/java/DmWebPortal/web/views/experiment/edit.xhtml
+++ b/src/java/DmWebPortal/web/views/experiment/edit.xhtml
@@ -15,7 +15,7 @@
                     <h1>Edit Experiment</h1>
                 </div>
 
-            <p:accordionPanel multiple="true" dynamic="true" cache="true"  >
+            <p:accordionPanel multiple="true" dynamic="true" cache="false" activeIndex="0,1"  >
                 <p:tab title="Experiment Properties" id="detailsTab" >
 
                     <div class="middleCenterLeftContent">
@@ -35,7 +35,7 @@
                     <p:commandButton action="#{experimentController.prepareList()}" immediate="true" value="Return" alt="Return" icon="ui-icon-arrowreturnthick-1-w"/>
                 </div>
 
-        <ui:include src="experimentUserRemoveDialog.xhtml" />
+                <ui:include src="experimentUserRemoveDialog.xhtml" />
          </h:form>
     </ui:define>
 </ui:composition>
diff --git a/src/java/DmWebPortal/web/views/experiment/experimentUserRemoveDialog.xhtml b/src/java/DmWebPortal/web/views/experiment/experimentUserRemoveDialog.xhtml
index ad18cc0fc4adcc4747a5cf39e07252317220aefa..28e5c19c11dcfdee0032d6601dc49295c43f6d4b 100644
--- a/src/java/DmWebPortal/web/views/experiment/experimentUserRemoveDialog.xhtml
+++ b/src/java/DmWebPortal/web/views/experiment/experimentUserRemoveDialog.xhtml
@@ -4,10 +4,10 @@
                 xmlns:p="http://primefaces.org/ui"
                 xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
 
-    <p:confirmDialog id="experimentUserRemoveDialog" message="Remove user  from Experiment?"
+    <p:confirmDialog id="experimentUserRemoveDialog" message="Remove user #{experimentController.getRemovedUserName()} from Experiment?"
                      header="Remove User" severity="alert" widgetVar="experimentUserRemoveDialogWidget"
                      styleClass="dialog">
-        <p:commandButton value="Yes" oncomplete="experimentUserRemoveDialogWidget.hide()" action="#{experimentController.removeUser()}"/>
+        <p:commandButton value="Yes" oncomplete="PF('experimentUserRemoveDialogWidget').hide()" action="#{experimentController.removeUser()}" update="@form"/>
         <p:commandButton value="No" onclick="PF('experimentUserRemoveDialogWidget').hide()" type="button" />
     </p:confirmDialog>  
 </ui:composition>
diff --git a/src/java/DmWebPortal/web/views/experiment/experimentUsersEditDataTable.xhtml b/src/java/DmWebPortal/web/views/experiment/experimentUsersEditDataTable.xhtml
index bf78da68e0aa581f063e97ef9fe5a1f85513a905..c66760b41efb00da69ab958bd3a61e7126f21ade 100644
--- a/src/java/DmWebPortal/web/views/experiment/experimentUsersEditDataTable.xhtml
+++ b/src/java/DmWebPortal/web/views/experiment/experimentUsersEditDataTable.xhtml
@@ -8,58 +8,65 @@
 
 
 
-        <ui:include src="experimentUserAddDialog.xhtml" />
-        
-        <p:commandButton id="experimentUserAddButton" value="Add" onclick="PF('experimentUserAddDialogWidget').show();" rendered="#{experimentController.canAddUsers(loginController.username)}" icon="ui-icon-plus" >
-            <p:tooltip for="experimentUserAddButton" value="Add new users." />
-        </p:commandButton>
-
-        <p:commandButton id="ResetFiltersButton" action="#{experimentController.experimentUsersEditTable.resetList()}" alt="Clear Filters" icon="ui-icon-refresh" styleClass="actionButtonRight" oncomplete="PF('experimentUsersEditWidget').clearFilters()" update="experimentUsersEditDataTable">
-            <p:tooltip for="ResetFiltersButton" value="Reset filters."/>
-        </p:commandButton>
-    
-        <p:dataTable id="experimentUsersEditDataTable"                              
-                     var="experimentUserObject" 
-                     value="#{experimentController.experimentUsersEditTable.listDataModel}" 
-                     filteredValue="#{experimentController.experimentUsersEditTable.filteredObjectList}"
-                     paginator="true" 
-                     paginatorAlwaysVisible="false" 
-                     rows="25"
-                     binding="#{experimentController.experimentUsersEditTable.listDataTable}"
-                     widgetVar="experimentUsersEditWidget" 
-                     emptyMessage="No users found.">
+    <ui:include src="experimentUserAddDialog.xhtml" />
+
+    <p:commandButton id="experimentUserAddButton" value="Add" onclick="PF('experimentUserAddDialogWidget').show();" rendered="#{experimentController.canAddUsers(loginController.username)}" icon="ui-icon-plus" >
+        <p:tooltip for="experimentUserAddButton" value="Add new users." />
+    </p:commandButton>
+
+    <p:commandButton id="ResetFiltersButton" action="#{experimentController.experimentUsersEditTable.resetList()}" alt="Clear Filters" icon="ui-icon-refresh" styleClass="actionButtonRight" oncomplete="PF('experimentUsersEditWidget').clearFilters()" update="experimentUsersEditDataTable">
+        <p:tooltip for="ResetFiltersButton" value="Reset filters."/>
+    </p:commandButton>
+
+    <p:dataTable id="experimentUsersEditDataTable"                              
+                 var="experimentUserObject" 
+                 value="#{experimentController.experimentUsersEditTable.listDataModel}" 
+                 filteredValue="#{experimentController.experimentUsersEditTable.filteredObjectList}"
+                 paginator="true" 
+                 paginatorAlwaysVisible="false" 
+                 rows="25"
+                 binding="#{experimentController.experimentUsersEditTable.listDataTable}"
+                 widgetVar="experimentUsersEditWidget" 
+                 emptyMessage="No users found.">
 
         <ui:param name="experimentRoles" value="#{experimentUserObject.roles}" />
 
         <p:column sortBy="#{experimentUserObject.username}" headerText="Username"
-                      filterBy="#{experimentUserObject.username}" filterMatchMode="contains" >
-                <h:outputText value="#{experimentUserObject.username}"/>
-            </p:column>
-
-            <p:column sortBy="#{experimentUserObject.name}" headerText="Last, First Name" 
-                      filterBy="#{experimentUserObject.name}" filterMatchMode="contains" >
-                <h:outputText value="#{experimentUserObject.name}"/>
-            </p:column>                  
-
-            <p:columns value="#{experimentController.columns}" var="column">
-                <ui:param name="columnId" value="#{column.property}" />
-
-                <f:facet name="header">
-                    <h:outputText value="#{column.header}" />
-                </f:facet>
-                <h:outputText value="" styleClass="ui-icon ui-icon-check" rendered="#{experimentRoles[columnId]}" /> 
-                <p:selectBooleanCheckbox value="#{experimentRoles[columnId]}" rendered="true" />                
-            </p:columns>
-
-            <p:column headerText="Actions" >
-                <div class="actionLink" >
-                    <p:commandLink oncomplete="PF('experimentUserRemoveDialogWidget').show()" rendered="true" styleClass="ui-icon ui-icon-trash" title="Remove" >
-                        <f:setPropertyActionListener value="#{experimentUserObject}" target="#{experimentController.experimentUsersEditTable.currentObject}" />
-                    </p:commandLink>
-                </div>
-            </p:column>
-
-        </p:dataTable>
+                  filterBy="#{experimentUserObject.username}" filterMatchMode="contains" >
+            <h:outputText value="#{experimentUserObject.username}"/>
+        </p:column>
+
+        <p:column sortBy="#{experimentUserObject.name}" headerText="Last, First Name" 
+                  filterBy="#{experimentUserObject.name}" filterMatchMode="contains" >
+            <h:outputText value="#{experimentUserObject.name}"/>
+        </p:column>                  
+
+        <ui:param name="isAdmin" value="#{experimentController.hasSystemRole(loginController.username)}" />
+        <p:column headerText="Manager">
+            <h:outputText value="" styleClass="ui-icon ui-icon-check" rendered="#{experimentUserObject.isManager} AND #{!isAdmin}" /> 
+            <p:selectBooleanCheckbox value="#{experimentUserObject.isManager}" rendered="#{isAdmin}" immediate="true" />  
+        </p:column>
+
+        <p:column headerText="Principal Investigator">
+            <h:outputText value="" styleClass="ui-icon ui-icon-check" rendered="#{experimentUserObject.isPI} AND #{!isAdmin}" /> 
+            <p:selectBooleanCheckbox value="#{experimentUserObject.isPI}" rendered="#{isAdmin}" />  
+        </p:column>
+
+        <p:column headerText="User">
+            <h:outputText value="" styleClass="ui-icon ui-icon-check" rendered="#{experimentUserObject.isUser} AND #{!isAdmin}" /> 
+            <p:selectBooleanCheckbox value="#{experimentUserObject.isUser}" rendered="#{isAdmin}" />  
+        </p:column>
+
+
+        <p:column headerText="Actions" rendered="#{isAdmin}">
+            <div class="actionLink" >
+                <p:commandLink oncomplete="PF('experimentUserRemoveDialogWidget').show()" rendered="true" styleClass="ui-icon ui-icon-trash" title="Remove"  update="@form">
+                    <f:setPropertyActionListener value="#{experimentUserObject}" target="#{experimentController.experimentUsersEditTable.currentObject}" />
+                </p:commandLink>
+            </div>
+        </p:column>
+
+    </p:dataTable>
 
 
 </ui:composition>
diff --git a/src/java/DmWebPortal/web/views/experiment/experimentUsersListDataTable.xhtml b/src/java/DmWebPortal/web/views/experiment/experimentUsersListDataTable.xhtml
index 6cc0abc41e08b6e44e2fef0a4df6cfd38f3c1196..3ffb91e5a1bba05872c0f06f268f2782fd4d16a4 100644
--- a/src/java/DmWebPortal/web/views/experiment/experimentUsersListDataTable.xhtml
+++ b/src/java/DmWebPortal/web/views/experiment/experimentUsersListDataTable.xhtml
@@ -3,7 +3,6 @@
 <ui:composition xmlns="http://www.w3.org/1999/xhtml"
                 xmlns:h="http://java.sun.com/jsf/html"
                 xmlns:p="http://primefaces.org/ui"
-                xmlns:f="http://java.sun.com/jsf/core"
                 xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
 
     <p:commandButton id="ResetFiltersButton" action="#{experimentController.experimentUsersListTable.resetList()}" alt="Clear Filters" icon="ui-icon-refresh" styleClass="actionButtonRight" oncomplete="PF('experimentUsersListWidget').clearFilters()" update="experimentUsersListDataTable">
@@ -31,12 +30,19 @@
             <h:outputText value="#{experimentUserObject.name}"/>
         </p:column>                  
 
-        <p:columns value="#{experimentController.columns}" var="column">
-            <f:facet name="header">
-                <h:outputText value="#{column.header}" />
-            </f:facet>
-            <h:outputText value="" styleClass="ui-icon ui-icon-check" rendered="#{experimentUserObject.roles[column.property]}" /> 
-        </p:columns>
+
+        <p:column headerText="Manager">
+            <h:outputText value="" styleClass="ui-icon ui-icon-check" rendered="#{experimentUserObject.isManager}" /> 
+        </p:column>
+
+        <p:column headerText="Principal Investigator">
+            <h:outputText value="" styleClass="ui-icon ui-icon-check" rendered="#{experimentUserObject.isPI}" />  
+        </p:column>
+
+        <p:column headerText="User">
+            <h:outputText value="" styleClass="ui-icon ui-icon-check" rendered="#{experimentUserObject.isUser}" />   
+        </p:column>
+
 
     </p:dataTable>
 
diff --git a/src/java/DmWebPortal/web/views/experiment/experimentViewPanelGrid.xhtml b/src/java/DmWebPortal/web/views/experiment/experimentViewPanelGrid.xhtml
index 3ce041b0f358f8b747e81e0450c96849305f2a81..6b2d01d12f7d9e4a8a07f216d0f82b636e643a60 100644
--- a/src/java/DmWebPortal/web/views/experiment/experimentViewPanelGrid.xhtml
+++ b/src/java/DmWebPortal/web/views/experiment/experimentViewPanelGrid.xhtml
@@ -6,7 +6,7 @@
                 xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
                 xmlns:f="http://xmlns.jcp.org/jsf/core">
 
-    <ui:param name="experimentObject" value="#{experimentController.selected}"/>
+    <ui:param name="experimentObject" value="#{experimentController.current}"/>
 
     <p:panelGrid columns="2" styleClass="viewEntityDetails">
 
diff --git a/src/java/DmWebPortal/web/views/experiment/view.xhtml b/src/java/DmWebPortal/web/views/experiment/view.xhtml
index 4ca098c16a7dba0d19538efab53d847e20bb61a8..43b5d3b686bb49bfe655ffd81f30469ce504282d 100644
--- a/src/java/DmWebPortal/web/views/experiment/view.xhtml
+++ b/src/java/DmWebPortal/web/views/experiment/view.xhtml
@@ -14,7 +14,8 @@
                 <h1>Experiment Details</h1>
             </div>
 
-            <p:accordionPanel multiple="true">
+            <ui:param name="experimentObject" value="#{experimentController.current}"/>
+            <p:accordionPanel multiple="true" activeIndex="0,1" >
                 <p:tab title="Experiment Properties">
                     <div class="middleCenterLeftContent">
                         <ui:include src="experimentViewPanelGrid.xhtml"/>