diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/DataTableController.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/DataTableController.java
index 6104a57a2c1ff2d48848bc19481224bee914cc12..ac019ebf470cba5f8885b7589e025321a0c993af 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/DataTableController.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/DataTableController.java
@@ -16,7 +16,7 @@ public abstract class DataTableController<EntityType extends CloneableEntity> im
     private static final Logger logger = Logger.getLogger(DataTableController.class.getName());
 
 
-    protected EntityType current = null;
+    protected EntityType currentObject = null;
 
     private DataModel listDataModel = null;
     private DataTable listDataTable = null;
@@ -34,12 +34,12 @@ public abstract class DataTableController<EntityType extends CloneableEntity> im
     
     public abstract String getClassName();
 
-    public EntityType getCurrent() {
-        return current;
+    public EntityType getCurrentObject() {
+        return currentObject;
     }
 
-    public void setCurrent(EntityType current) {
-        this.current = current;
+    public void setCurrentObject(EntityType current) {
+        this.currentObject = current;
     }
 
     public DataModel createListDataModel() {
@@ -54,20 +54,24 @@ public abstract class DataTableController<EntityType extends CloneableEntity> im
     }
 
     public abstract List<EntityType> findAll();
+    
+    public String getTableName() {
+        return "deafault";
+    }
 
     public void resetList() {
-        logger.debug("Resetting list");
+        logger.debug("Resetting list"+" "+getTableName());
         listDataModel = null;
         listDataTable = null;
         listDataModelReset = true;
         filteredObjectList = null;
         selectedObjectList = null;
-        current = null;
+        currentObject = null;
     }
 
    public DataTable getListDataTable() {
         if (listDataTable == null) {
-            logger.debug("Recreating data table");
+            logger.debug("Recreating data table"+" "+getTableName());
             listDataTable = new DataTable();
         }
         return listDataTable;
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 227ff11e4211819d23712a0aa5a384d3203d54be..881850ce8974b1398ea0684781bf573644bd72d9 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
@@ -6,7 +6,19 @@ import gov.anl.aps.dm.portal.exceptions.InvalidDate;
 import gov.anl.aps.dm.portal.exceptions.MissingProperty;
 import gov.anl.aps.dm.portal.model.entities.Experiment;
 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.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.utilities.SessionUtility;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import javax.ejb.EJB;
 import javax.inject.Named;
@@ -27,7 +39,109 @@ public class ExperimentController extends CrudEntityController<Experiment, Exper
     @EJB
     private ExperimentFacade experimentFacade;
 
+    @EJB
+    private UserInfoFacade userInfoFacade;
+
+    @EJB
+    private RoleTypeFacade roleTypeFacade;
+    
+    @EJB
+    private UserExperimentRoleFacade userExperimentRoleFacade;
+    
+    class ExperimentUsersTable extends DataTableController<ExperimentUser> {
+
+        @Override
+        public String getClassName() {
+            return "ExperimentUser";
+        }
+
+        @Override
+        public List<ExperimentUser> findAll() {                
+            try {
+                List<UserInfo> list = userInfoFacade.findUsersInExperiment(getCurrent().getId());
+                List<ExperimentUser> tempUsersList = convertExperimentUsers(list);
+                return new ArrayList<>(tempUsersList);
+            } catch (NumberFormatException e) {
+                return null;
+            }
+        }
+        
+        List<ExperimentUser> convertExperimentUsers(List<UserInfo> list) {
+            List<RoleType> roleTypes = roleTypeFacade.findByRoleSystemType(false);
+            generateColumns(roleTypes);
+            for (UserInfo user : list) {
+                ExperimentUser eUser = new ExperimentUser(getCurrent().getId(), user.getId());
+                eUser.setUsername(user.getUsername());
+                eUser.setName(user.getLastName() + ", " + user.getFirstName());
+                for (RoleType roleType : roleTypes) {
+                    eUser.setIsInRole(roleType, user.inRole(roleType.getId(), getCurrent().getId()));
+                }
+                experimentUsers.put(eUser, eUser.getRoles());
+            }
+            return new ArrayList<>(experimentUsers.keySet());
+        }
+        
+        @Override
+        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;
+        }
+    }
+
+    class NoExperimentUsersTypeTable extends DataTableController<UserInfo> {
+
+        @Override
+        public String getClassName() {
+            return "UserInfo";
+        }
+
+        @Override
+        public List<UserInfo> findAll() {
+            resetList();
+            return userInfoFacade.findNoUsersInExperiment(getCurrent().getId());
+        }
+        
+        @Override
+        public String getTableName() {
+            return "noExperimentUsersTable";
+        }
+    }
+    
+    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<>();
+
     public ExperimentController() {
+        this.experimentUsersListTable = new ExperimentController.ExperimentUsersTable();
+        this.experimentUsersEditTable = new ExperimentController.ExperimentUsersTable();
+        this.noExperimentUsersTypeTable = new ExperimentController.NoExperimentUsersTypeTable();
     }
 
     @Override
@@ -60,9 +174,16 @@ public class ExperimentController extends CrudEntityController<Experiment, Exper
 
     @Override
     public String prepareEdit(Experiment experiment) {
+        clear();
         return super.prepareEdit(experiment);
     }
 
+    @Override
+    public String prepareView(Experiment experiment) {
+        clear();
+        return super.prepareView(experiment);
+    }
+
     @Override
     public void prepareEntityInsert(Experiment experiment) throws ObjectAlreadyExists, InvalidDate, MissingProperty {
         if ((experiment.getName() == null) || (experiment.getName().length() == 0)){
@@ -104,8 +225,115 @@ 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() {
+        return experimentUsersListTable;
+    }
+
+    public void setExperimentUsersListTable(ExperimentController.ExperimentUsersTable experimentUsersTable) {
+        this.experimentUsersListTable = experimentUsersTable;
+    }
+    
+    public ExperimentController.ExperimentUsersTable getExperimentUsersEditTable() {
+        return experimentUsersEditTable;
+    }
+
+    public void setExperimentUsersEditTable(ExperimentController.ExperimentUsersTable experimentUsersTable) {
+        this.experimentUsersEditTable = experimentUsersTable;
+    }
+    
+    public ExperimentController.NoExperimentUsersTypeTable getNoExperimentUsersTypeTable() {
+        return noExperimentUsersTypeTable;
+    }
+
+    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);
+        // optimally here it should find all system roles. The roles optimally would have a policy
+        // defining adding/removing users. For each of the role that allows adding users,
+        // the code that is for administartor role (below) would be added.
+        RoleType rt = roleTypeFacade.findById(1);   // administrator role id
+        if (rt == null) {
+            return false;
+        }
+        if (rt.isAdmin(username)) {
+            return true;
+        }
+        return false;
+        // experiment type permission
+        // return experimentUsersMap.get(username).canAddUsers();
+    }
+
+    public String getRemovedUserName() {
+        return experimentUsersEditTable.getCurrentObject().getName();
+    }
+        
+    public void removeUser() {
+        ExperimentUser user = experimentUsersEditTable.getCurrentObject();
+        user.removeAllExperimentRoles();
+        experimentUsers.remove(user);
+    }
+        
+    public String addExperimentUser() {
+        List<UserInfo> newUsers = noExperimentUsersTypeTable.getSelectedObjectList();
+        if (newUsers == null) {
+            logger.debug("null selected list");
+            return null;
+        } else if (newUsers.isEmpty()) {
+            logger.debug("empty selected list");
+            return null;
+        } else {
+            try {
+                UserExperimentRole userExperimentRole;
+                for (UserInfo user : newUsers) {
+                    userExperimentRole = new UserExperimentRole(user.getId(), current.getId(), 4); // set the User
+                    userExperimentRoleFacade.create(userExperimentRole);
+                }
+                return edit();
+            } catch (RuntimeException ex) {
+                SessionUtility.addErrorMessage("Error", "Could not update UserInfo" + ": " + ex.getMessage());
+                return null;
+            }
+        }
+    }
+  
+//    @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;
+//    }
 
-    @FacesConverter(forClass = Experiment.class)
+   @FacesConverter(forClass = Experiment.class)
     public static class ExperimentControllerConverter implements Converter
     {
 
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/ExperimentUsersController.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/ExperimentUsersController.java
deleted file mode 100644
index 0a63654a6c337300c8a2518327b242e6278a1409..0000000000000000000000000000000000000000
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/ExperimentUsersController.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * To change this license header, choose License Headers in Project Properties.
- * To change this template file, choose Tools | Templates
- * and open the template in the editor.
- */
-
-package gov.anl.aps.dm.portal.controllers;
-
-
-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.Experiment;
-import gov.anl.aps.dm.portal.model.entities.RoleType;
-import gov.anl.aps.dm.portal.model.entities.UserInfo;
-import gov.anl.aps.dm.portal.model.tempstorage.ExperimentUser;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-import javax.ejb.EJB;
-import javax.enterprise.context.SessionScoped;
-import javax.inject.Named;
-import org.apache.log4j.Logger;
-
-@Named("experimentUsersController")
-@SessionScoped
-public class ExperimentUsersController  implements Serializable {
-    
-    private static final Logger logger = Logger.getLogger(ExperimentUsersController.class.getName());
-    
-    @EJB
-    private UserExperimentRoleFacade userExperimentRoleFacade;
-
-    @EJB
-    private UserInfoFacade userInfoFacade;
-
-    @EJB
-    private RoleTypeFacade roleTypeFacade;
-
-    public ExperimentUsersController() {
-        this.experimentUsersTable = new ExperimentUsersTable();
-    }
-
-    class ExperimentUsersTable extends DataTableController<ExperimentUser> {
-
-//        @Override
-//        public String getClassName() {
-//            return "UserInfo";
-//        }
-//
-//        @Override
-//        public List<UserInfo> findAll() {
-//            try {
-//                return userInfoFacade.findUsersInExperiment(experiment.getId());
-//            } catch (NumberFormatException e) {
-//                return null;
-//            }
-//        }
-
-        @Override
-        public String getClassName() {
-            return "ExperimentUser";
-        }
-
-        @Override
-        public List<ExperimentUser> findAll() {
-            experimentUsers.clear();
-            try {
-                List<UserInfo> list = userInfoFacade.findUsersInExperiment(experiment.getId());
-                convertExperimentUsers(list);
-                return experimentUsers;
-            } catch (NumberFormatException e) {
-                return null;
-            }
-        }
-        
-        void convertExperimentUsers(List<UserInfo> list) {
-            List<RoleType> roleTypes = roleTypeFacade.findByRoleSystemType(false);
-            generateColumns(roleTypes);
-            for (UserInfo user : list) {
-                ExperimentUser eUser = new ExperimentUser();
-                eUser.setUsername(user.getUsername());
-                eUser.setName(user.getLastName() + ", " + user.getFirstName());
-                for (RoleType roleType : roleTypes) {
-                    eUser.setIsInRole(roleType, user.inRole(roleType.getId(), experiment.getId()));
-                }
-                experimentUsers.add(eUser);
-            }
-        }
-    }
-
-    static 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 int getProperty() {
-            return property;
-        }
-    }
-
-    private ExperimentUsersTable experimentUsersTable;
-    private Experiment experiment;
-    private List<ExperimentUser> experimentUsers = new ArrayList<>();
-    private List<ColumnModel> columns;
-
-    public List<ColumnModel> getColumns() {
-        return columns;
-    }
-
-    public void setColumns(List<ColumnModel> columns) {
-        this.columns = columns;
-    }
-
-    public Experiment getExperiment() {
-        return experiment;
-    }
-
-    public void setExperiment(Experiment experiment) {
-        experimentUsersTable.resetList();
-        this.experiment = experiment;
-    }
-
-    public ExperimentUsersTable getExperimentUsersTable() {
-        return experimentUsersTable;
-    }
-
-    public void setExperimentUsersTable(ExperimentUsersTable experimentUsersTable) {
-        this.experimentUsersTable = experimentUsersTable;
-    }
-    
-    void generateColumns(List<RoleType> roleTypes) {
-        for (RoleType role : roleTypes) {
-            ColumnModel column = new ColumnModel(role.getName(), role.getId());
-            columns.add(column);
-        }
-    }
-    
-//    public boolean getIsInRole() {
-//        
-//    }
-//    
-//    public void setIsInRole(boolean inRole)
-//  
-    
-    
-    
-    
-//    public String getCurrentEntityInstanceName() {
-//        return null;
-//    }
-//    
-//    public String remove() {
-//        return null;
-//    }
-//    
-//    public boolean canRemove(String removerUsername, UserInfo removee) {
-//        return false;
-//    }
-//    
-//    public boolean canAddUsers(String username) {
-//        return true;
-//    }
-//    
-//    public void setIsInRole(int roleId, String userId) {
-//        
-//    }
-//    
-//    public boolean canAssignManager(String userId) {
-//        return true;
-//    }
-//    
-//    public boolean canAssignPI(String userId) {
-//        return true;
-//    }
-//    
-//    public boolean canAssignUser(String userId) {
-//        return true;
-//    }
-    
-}
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/UserSystemRoleController.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/UserSystemRoleController.java
index 3cf77a14c8350c350da34b5692732983759300fe..22cd4d0981afa5c3f08ad8a6057b6cd80f069824 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/UserSystemRoleController.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/UserSystemRoleController.java
@@ -177,7 +177,7 @@ public class UserSystemRoleController  implements Serializable
         int id = Integer.parseInt(systemRoleId);
         RoleType rt = roleTypeFacade.findById(id);
         if (rt != null) {
-            rt.removeRoleTypeFromUser(systemRoleTable.current);
+            rt.removeRoleTypeFromUser(systemRoleTable.currentObject);
         }
         try {
         roleTypeFacade.edit(rt);
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/RoleTypeFacade.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/RoleTypeFacade.java
index 045470b7bb8f9ab763d16f0322bef013731925b3..f51b1bf6b00aa86ba3b437b55c6d4248fd1ac2a8 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/RoleTypeFacade.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/RoleTypeFacade.java
@@ -7,7 +7,6 @@
 package gov.anl.aps.dm.portal.model.beans;
 
 import gov.anl.aps.dm.portal.model.entities.RoleType;
-import gov.anl.aps.dm.portal.model.entities.UserInfo;
 import java.util.List;
 import javax.ejb.Stateless;
 import javax.persistence.EntityManager;
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 67ea311b6898ac35da44959fa4cee0e90e503633..2b16116621f3c8b9c807036c02f1ced105152b57 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,8 +7,10 @@
 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;
 import javax.persistence.PersistenceContext;
 
 /**
@@ -30,4 +32,16 @@ public class UserExperimentRoleFacade extends AbstractFacade<UserExperimentRole>
         super(UserExperimentRole.class);
     }
     
+    public UserExperimentRole findByUserExperimentRole(int userId, int experimentId, int roleId) {
+        try {
+            return (UserExperimentRole) em.createNamedQuery("UserExperimentRole.findByUserExperimentRole")
+                    .setParameter("userId", userId)
+                    .setParameter("experimentId", experimentId)
+                    .setParameter(roleId, roleId)
+                    .getSingleResult();
+        }
+        catch (NoResultException ex) {
+        }
+        return null;
+    }
 }
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/UserInfoFacade.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/UserInfoFacade.java
index 4712ca736184ecdc1b7b61da6f55df2a81ea7081..91f0a1f4bff2d6f028f1dd21e931e2b6e1f27ffc 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/UserInfoFacade.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/UserInfoFacade.java
@@ -79,4 +79,14 @@ public class UserInfoFacade extends AbstractFacade<UserInfo>
         return null;
     }
 
+    public List<UserInfo> findNoUsersInExperiment(int experimentId) {
+        try {
+            return (List<UserInfo>) em.createNamedQuery("UserInfo.findNoUsersInExperiment")
+                    .setParameter("experimentId", experimentId)
+                    .getResultList();
+        } catch (NoResultException ex) {
+        }
+        return null;
+    }
+
 }
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserExperimentRole.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserExperimentRole.java
index eb9c815dab6027fe2e5fca58a1cdf1bf7faad132..9377187847fb754662ac7b7fa82507cc73c15792 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserExperimentRole.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/UserExperimentRole.java
@@ -26,7 +26,9 @@ import javax.xml.bind.annotation.XmlRootElement;
     @NamedQuery(name = "UserExperimentRole.findAll", query = "SELECT u FROM UserExperimentRole u"),
     @NamedQuery(name = "UserExperimentRole.findByUserId", query = "SELECT u FROM UserExperimentRole u WHERE u.userExperimentRolePK.userId = :userId"),
     @NamedQuery(name = "UserExperimentRole.findByExperimentId", query = "SELECT u FROM UserExperimentRole u WHERE u.userExperimentRolePK.experimentId = :experimentId"),
-    @NamedQuery(name = "UserExperimentRole.findByRoleTypeId", query = "SELECT u FROM UserExperimentRole u WHERE u.userExperimentRolePK.roleTypeId = :roleTypeId")})
+    @NamedQuery(name = "UserExperimentRole.findByRoleTypeId", query = "SELECT u FROM UserExperimentRole u WHERE u.userExperimentRolePK.roleTypeId = :roleTypeId"),
+    @NamedQuery(name = "UserExperimentRole.findByUserExperimentRole", query = "SELECT u FROM UserExperimentRole u WHERE u.userExperimentRolePK.userId = :userId AND u.userExperimentRolePK.experimentId = :experimentId AND u.userExperimentRolePK.roleTypeId = :roleTypeId")})
+
 public class UserExperimentRole extends CloneableEntity
 {
     @EmbeddedId
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 56a6b742a7a292dda2f195a4b243acb736af7739..455ef2ea333605607f7f7479fa47c1043e0e2d51 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
@@ -43,7 +43,8 @@ import javax.xml.bind.annotation.XmlTransient;
     @NamedQuery(name = "UserInfo.findByPassword", query = "SELECT u FROM UserInfo u WHERE u.password = :password"),
     @NamedQuery(name = "UserInfo.findNonAdmins", query = "SELECT u FROM UserInfo u WHERE u.id NOT IN (SELECT u2.id from UserInfo u2 JOIN u2.roleTypeList rt WHERE rt.id = :roleTypeId)"),
     @NamedQuery(name = "UserInfo.findUsersInRole", query = "SELECT u FROM UserInfo u WHERE u.id IN (SELECT u2.id from UserInfo u2 JOIN u2.roleTypeList rt WHERE rt.id = :roleTypeId)"),
-    @NamedQuery(name = "UserInfo.findUsersInExperiment", query = "SELECT DISTINCT u FROM UserInfo u WHERE u.id IN (SELECT u2.id from UserInfo u2 JOIN u2.userExperimentRoleList r WHERE r.experiment.id = :experimentId)")})
+    @NamedQuery(name = "UserInfo.findUsersInExperiment", query = "SELECT DISTINCT u FROM UserInfo u WHERE u.id IN (SELECT u2.id from UserInfo u2 JOIN u2.userExperimentRoleList r WHERE r.experiment.id = :experimentId)"),
+    @NamedQuery(name = "UserInfo.findNoUsersInExperiment", query = "SELECT u FROM UserInfo u WHERE u.id NOT IN (SELECT u2.id from UserInfo u2 JOIN u2.userExperimentRoleList r WHERE r.experiment.id = :experimentId)")})
 
 public class UserInfo extends CloneableEntity
 {
@@ -86,6 +87,7 @@ public class UserInfo extends CloneableEntity
     private List<UserExperimentRole> userExperimentRoleList;
     @OneToMany(cascade = CascadeType.ALL, mappedBy = "userInfo")
     private List<UserSetting> userSettingList;
+    
 
     public UserInfo() {
     }
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 3c629631efd0e531013975c6cfb927bbd448c684..47a7a704c4d45c0c739772b843222d1337c234a7 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
@@ -1,9 +1,11 @@
 package gov.anl.aps.dm.portal.model.tempstorage;
 
+import gov.anl.aps.dm.portal.model.beans.UserExperimentRoleFacade;
 import gov.anl.aps.dm.portal.model.entities.CloneableEntity;
 import gov.anl.aps.dm.portal.model.entities.RoleType;
-import java.util.HashMap;
-import java.util.Map;
+import gov.anl.aps.dm.portal.model.entities.UserExperimentRole;
+import gov.anl.aps.dm.portal.model.entities.UserInfo;
+import javax.ejb.EJB;
 
 /**
  *
@@ -11,10 +13,25 @@ import java.util.Map;
  */
 public class ExperimentUser extends CloneableEntity {
 
+    @EJB
+    private UserExperimentRoleFacade userExperimentRoleFacade;
+    
     String username;
     String name;
-    Map<RoleType, Boolean> roles = new HashMap();
+    int userId;
+    int experimentId;
+    private boolean [] roles;
+    static 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];
+        this.experimentId = experimentId;
+        this.userId = userId;
+    }
+    
     public String getUsername() {
         return username;
     }
@@ -32,7 +49,64 @@ public class ExperimentUser extends CloneableEntity {
     }
 
     public void setIsInRole(RoleType role, boolean isInRole) {
-        roles.put(role, isInRole);
+        roles[role.getId()] = isInRole;
+    }
+    
+    public boolean getIsInRole(RoleType role) {
+        return roles[role.getId()];
+    }
+
+    public boolean[] getRoles() {
+        return roles;
+    }
+
+    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);
+            }            
+        }
+        this.roles = 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);
+            }            
+        }       
+    }
+
+    public boolean canAddUsers() {
+        // this can be tied to permission. For now let's hardcode
+        if (roles[2] || roles[3]) {
+            return true;
+        }
+        else {
+            return false;
+        }
+            
     }
     
+    @Override
+    public int hashCode() {
+        return username.hashCode();
+    }
+
+    @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 UserInfo)) {
+            return false;
+        }
+        return (username.equals(((ExperimentUser)object).username));
+    }
+
 }
diff --git a/src/java/DmWebPortal/web/WEB-INF/faces-config.xml b/src/java/DmWebPortal/web/WEB-INF/faces-config.xml
index b8e4f061fb5737b0fd1748305200da1ec2622008..9a85cb2b4a27a70f73b0e9dbd4610791f6e52e8d 100644
--- a/src/java/DmWebPortal/web/WEB-INF/faces-config.xml
+++ b/src/java/DmWebPortal/web/WEB-INF/faces-config.xml
@@ -9,4 +9,8 @@
             <var>resources</var>
         </resource-bundle>
     </application>
+<validator>
+    <validator-id>checkboxValidator</validator-id>
+    <validator-class>gov.anl.aps.dm.portal.controllers.CheckboxValidator</validator-class>
+</validator>
 </faces-config>
diff --git a/src/java/DmWebPortal/web/views/experiment/edit.xhtml b/src/java/DmWebPortal/web/views/experiment/edit.xhtml
index 00b14e432f1f181c37c5efbce0121328fb421630..4dc82894fd2bea6840f9b51baa38e36c19dfb025 100644
--- a/src/java/DmWebPortal/web/views/experiment/edit.xhtml
+++ b/src/java/DmWebPortal/web/views/experiment/edit.xhtml
@@ -11,21 +11,32 @@
     <ui:define name="middleCenter">
         <h:form id="editExperimentForm">
 
-            <div class="middleCenterLeftContent">
                 <div class="pageTitle">
                     <h1>Edit Experiment</h1>
                 </div>
 
-                <ui:include src="experimentEditPanelGrid.xhtml"/>
+            <p:accordionPanel multiple="true" dynamic="true" cache="true"  >
+                <p:tab title="Experiment Properties" id="detailsTab" >
+
+                    <div class="middleCenterLeftContent">
+                        <ui:include src="experimentEditPanelGrid.xhtml"/>
+                    </div>
+
+                </p:tab>
+
+                <p:tab title="Experiment Users" id="usersTab">                
+                    <ui:include src="experimentUsersEditDataTable.xhtml"/>
+                </p:tab>
+            </p:accordionPanel>
+                
                 <p/>
                 <div class="actionButton">
-                    <p:commandButton action="#{experimentController.update()}" value="Save" alt="Save" icon="ui-icon-check" update="@form"/>
+                    <p:commandButton  action="#{experimentController.update()}" value="Save" alt="Save" icon="ui-icon-check"/>
                     <p:commandButton action="#{experimentController.prepareList()}" immediate="true" value="Return" alt="Return" icon="ui-icon-arrowreturnthick-1-w"/>
                 </div>
-            </div>
-
-        </h:form>
 
+        <ui:include src="experimentUserRemoveDialog.xhtml" />
+         </h:form>
     </ui:define>
 </ui:composition>
 
diff --git a/src/java/DmWebPortal/web/views/experiment/experimentEditPanelGrid.xhtml b/src/java/DmWebPortal/web/views/experiment/experimentEditPanelGrid.xhtml
index 62297e74854443af9246a2452e7412dc64d2b21f..8592664d047daa8c09f20646f15d4f8ec4bb2ab9 100644
--- a/src/java/DmWebPortal/web/views/experiment/experimentEditPanelGrid.xhtml
+++ b/src/java/DmWebPortal/web/views/experiment/experimentEditPanelGrid.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}"/>
     <ui:param name="isFieldWriteable" value="#{loginController.loggedIn}"/>
 
     <p:panelGrid columns="2" > 
@@ -34,4 +34,6 @@
         <p:calendar id="endDate" value="#{experimentObject.endDate}" mode="popup" showOn="button" />
 
     </p:panelGrid>
+
+
 </ui:composition>
diff --git a/src/java/DmWebPortal/web/views/experiment/experimentListDataTable.xhtml b/src/java/DmWebPortal/web/views/experiment/experimentListDataTable.xhtml
index 55fc48b43418b6abf0d17c1dff13158ab6053cd8..4893d7d5dcf879d768349a762b26bb73d07cc5d9 100644
--- a/src/java/DmWebPortal/web/views/experiment/experimentListDataTable.xhtml
+++ b/src/java/DmWebPortal/web/views/experiment/experimentListDataTable.xhtml
@@ -56,10 +56,11 @@
         <p:column headerText="Actions" >
             <div class="actionLink">
                 <p:commandLink action="#{experimentController.prepareView(experimentObject)}" styleClass="ui-icon ui-icon-info" title="View">
-                    <f:setPropertyActionListener value="#{experimentObject}" target="#{experimentUsersController.experiment}"/>
-                    <f:setPropertyActionListener value="#{experimentObject}" target="#{experimentController.current}"/>
+
+                </p:commandLink>
+                <p:commandLink action="#{experimentController.prepareEdit(experimentObject)}" rendered="#{loginController.loggedIn}" styleClass="ui-icon ui-icon-pencil" title="Edit">
+
                 </p:commandLink>
-                <p:commandLink action="#{experimentController.prepareEdit(experimentObject)}" rendered="#{loginController.loggedIn}" styleClass="ui-icon ui-icon-pencil" title="Edit"/>
                 <p:commandLink oncomplete="PF('experimentDestroyDialogWidget').show()" rendered="#{loginController.loggedIn}" styleClass="ui-icon ui-icon-trash" title="Delete" update="@form">
                     <f:setPropertyActionListener value="#{experimentObject}" target="#{experimentController.current}"/>
                 </p:commandLink>
diff --git a/src/java/DmWebPortal/web/views/experiment/experimentUserAddDialog.xhtml b/src/java/DmWebPortal/web/views/experiment/experimentUserAddDialog.xhtml
new file mode 100644
index 0000000000000000000000000000000000000000..bc486eac4fde9acda71329e1b4e539030268702e
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experiment/experimentUserAddDialog.xhtml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<ui:composition xmlns="http://www.w3.org/1999/xhtml"
+                xmlns:p="http://primefaces.org/ui"
+                xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
+                xmlns:h="http://xmlns.jcp.org/jsf/html"
+                xmlns:f="http://xmlns.jcp.org/jsf/core"
+                xmlns:c="http://xmlns.jcp.org/jsp/jstl/core">
+
+
+
+   
+    <p:dialog id="experimentUserAddDialog" 
+              header="Add experiment users" widgetVar="experimentUserAddDialogWidget" dynamic="true" styleClass="dialog" width="800">
+        
+            <div class="actionButton">
+                <p:commandButton id="ResetFilters" actionListener="#{experimentController.noExperimentUsersTypeTable.resetFilterList()}" alt="Clear Filters" icon="ui-icon-refresh" styleClass="actionButtonRight" oncomplete="PF('experimentUserAddDialogWidget').show()" update="experimentUserAddDialog" >
+                    <p:tooltip for="ResetFilters" value="Reset list filters."/>
+                </p:commandButton>
+            </div>
+        
+        <div>
+         <p:dataTable id="addExperimentUserList"                              
+                 var="experimentUser" 
+                 value="#{experimentController.noExperimentUsersTypeTable.listDataModel}" 
+                 filteredValue="#{experimentController.noExperimentUsersTypeTable.filteredObjectList}"
+                 paginator="true" 
+                 paginatorAlwaysVisible="false" 
+                 rows="25"
+                 binding="#{experimentController.noExperimentUsersTypeTable.listDataTable}"
+                 selection="#{experimentController.noExperimentUsersTypeTable.selectedObjectList}"
+                 rowKey="#{experimentUser.username}"
+                 widgetVar="experimentUserAddTableWidgetVar" 
+                 emptyMessage="No users to add."
+                 rowSelectMode="true"
+                 selectionMode="multiple" >
+
+            <p:column sortBy="#{experimentUser.username}" headerText="Username" 
+                      filterBy="#{experimentUser.username}" filterMatchMode="contains" >
+                <h:outputText value="#{experimentUser.username}"/>
+            </p:column>
+
+            <p:column sortBy="#{experimentUser.lastName}" headerText="Last Name" 
+                      filterBy="#{experimentUser.lastName}" filterMatchMode="contains" >
+                <h:outputText value="#{experimentUser.lastName}"/>
+            </p:column>                  
+
+            <p:column sortBy="#{experimentUser.firstName}" headerText="First Name" 
+                      filterBy="#{experimentUser.firstName}" filterMatchMode="contains" >
+                <h:outputText value="#{experimentUser.firstName}"/>
+            </p:column> 
+
+            <p:column sortBy="#{experimentUser.email}" headerText="Email" 
+                      filterBy="#{experimentUser.email}" filterMatchMode="contains" >
+                <h:outputText value="#{experimentUser.email}"/>
+            </p:column>
+
+            <f:facet name="footer">
+                <p:commandButton value="Add" action="#{experimentController.addExperimentUser()}" oncomplete="PF('experimentUserAddDialogWidget').hide()" update="@form"/>
+                <p:commandButton value="Clear Selection" onclick="PF('experimentUserAddTableWidgetVar').unselectAllRows()" />
+            </f:facet>
+        </p:dataTable>
+        </div>
+    </p:dialog>  
+</ui:composition>
+
+
diff --git a/src/java/DmWebPortal/web/views/experiment/experimentUserRemoveDialog.xhtml b/src/java/DmWebPortal/web/views/experiment/experimentUserRemoveDialog.xhtml
index 6b5a7432c8e44d7b4b51064cbefa85b1a99c5d27..ad18cc0fc4adcc4747a5cf39e07252317220aefa 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 #{experimentUsersController.getCurrentEntityInstanceName()} from Experiment?"
+    <p:confirmDialog id="experimentUserRemoveDialog" message="Remove user  from Experiment?"
                      header="Remove User" severity="alert" widgetVar="experimentUserRemoveDialogWidget"
                      styleClass="dialog">
-        <p:commandButton value="Yes" oncomplete="experimentUserRemoveDialogWidget.hide()" action="#{experimentUsersController.remove()}"/>
+        <p:commandButton value="Yes" oncomplete="experimentUserRemoveDialogWidget.hide()" action="#{experimentController.removeUser()}"/>
         <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
new file mode 100644
index 0000000000000000000000000000000000000000..bf78da68e0aa581f063e97ef9fe5a1f85513a905
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experiment/experimentUsersEditDataTable.xhtml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<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">
+
+
+
+        <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>
+
+
+</ui:composition>
diff --git a/src/java/DmWebPortal/web/views/experiment/experimentUsersListDataTable.xhtml b/src/java/DmWebPortal/web/views/experiment/experimentUsersListDataTable.xhtml
index b75441349e53ef60440aa0db3b439064eca9c17d..6cc0abc41e08b6e44e2fef0a4df6cfd38f3c1196 100644
--- a/src/java/DmWebPortal/web/views/experiment/experimentUsersListDataTable.xhtml
+++ b/src/java/DmWebPortal/web/views/experiment/experimentUsersListDataTable.xhtml
@@ -4,71 +4,40 @@
                 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"
-                xmlns:c="http://xmlns.jcp.org/jsp/jstl/core">
-
-
-
-        <p:commandButton id="experimentUserAddButton" value="Add" rendered="#{experimentUsersController.canAddUsers(loginController.username)}" icon="ui-icon-plus" >
-            <p:tooltip for="experimentUserAddButton" value="Add new Users." />
-        </p:commandButton>
-
-        <p:commandButton id="ResetFiltersButton" action="#{experimentUsersController.experimentUsersTable.resetList()}" alt="Clear Filters" icon="ui-icon-refresh" styleClass="actionButtonRight" oncomplete="PF('experimentUsersListWidget').clearFilters()" update="experimentUsersListDataTable">
-            <p:tooltip for="ResetFiltersButton" value="Reset filters."/>
-        </p:commandButton>
-
-        <p:dataTable id="experimentUsersListDataTable"                              
-                     var="experimentUserObject" 
-                     value="#{experimentUsersController.experimentUsersTable.listDataModel}" 
-                     filteredValue="#{experimentUsersController.experimentUsersTable.filteredObjectList}"
-                     paginator="true" 
-                     paginatorAlwaysVisible="false" 
-                     rows="25"
-                     binding="#{experimentUsersController.experimentUsersTable.listDataTable}"
-                     widgetVar="experimentUsersListWidget" 
-                     emptyMessage="No users found.">
-
-            <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="#{experimentUsersController.columns}" var="column">
-                <f:facet name=header">
-                         <h:outputText value="#{column.header}" />
-                </f:facet>
-                 <p:selectBooleanCheckbox value="#{experimentUsersController.isManager(experimentUserObject.id)}" rendered="true" />                
-            </p:columns>
-     
-<!--            <p:column headerText="Manager" >
-                <p:selectBooleanCheckbox value="#{experimentUsersController.isManager(experimentUserObject.id)}" rendered="true" />
-            </p:column>
-
-            <p:column headerText="PI" >
-                <p:selectBooleanCheckbox value="#{experimentUsersController.isPI(experimentUserObject.id)}" rendered="true" />
-
-            </p:column>
-
-            <p:column headerText="User" >
-                <p:selectBooleanCheckbox value="#{experimentUsersController.isUser(experimentUserObject.id)}" rendered="true" />
-
-            </p:column>-->
-
-
-            <p:column headerText="Actions" >
-                <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="#{experimentUsersController.experimentUsersTable.current}" />
-                    </p:commandLink>
-                </div>
-            </p:column>
-
-        </p:dataTable>
-
+                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">
+        <p:tooltip for="ResetFiltersButton" value="Reset filters."/>
+    </p:commandButton>
+
+    <p:dataTable id="experimentUsersListDataTable"                              
+                 var="experimentUserObject" 
+                 value="#{experimentController.experimentUsersListTable.listDataModel}" 
+                 filteredValue="#{experimentController.experimentUsersListTable.filteredObjectList}"
+                 paginator="true" 
+                 paginatorAlwaysVisible="false" 
+                 rows="25"
+                 binding="#{experimentController.experimentUsersListTable.listDataTable}"
+                 widgetVar="experimentUsersListWidget" 
+                 emptyMessage="No users found.">
+
+        <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">
+            <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:dataTable>
 
 </ui:composition>
diff --git a/src/java/DmWebPortal/web/views/experiment/view.xhtml b/src/java/DmWebPortal/web/views/experiment/view.xhtml
index 329c53ad42114db9bff6287f214937f29b069815..4ca098c16a7dba0d19538efab53d847e20bb61a8 100644
--- a/src/java/DmWebPortal/web/views/experiment/view.xhtml
+++ b/src/java/DmWebPortal/web/views/experiment/view.xhtml
@@ -30,12 +30,12 @@
 
             <div class="actionButton">
                 <p:commandButton action="#{experimentController.prepareEdit(experimentObject)}" rendered="#{loginController.loggedIn}" value="Edit" alt="Edit" icon="ui-icon-pencil"/>
-                <p:commandButton onclick="PF('experimentDestroyDialogWidget').show();" rendered="#{loginController.loggedIn}" value="Delete" alt="Delete" icon="ui-icon-trash"/> 
                 <p:commandButton action="#{experimentController.prepareList()}" value="Return" alt="Return" icon="ui-icon-arrowreturnthick-1-w"/>
             </div>
-            <ui:include src="experimentDestroyDialog.xhtml"/>
+
         </h:form>
     </ui:define>
+
 </ui:composition>
 
 
diff --git a/src/java/DmWebPortal/web/views/experimentType/edit.xhtml b/src/java/DmWebPortal/web/views/experimentType/edit.xhtml
index 2ece326ecd8436e9d613f2d84c80079809bc0452..53281c4d48f375926ef54cc3ed494f5dcce2e7c4 100644
--- a/src/java/DmWebPortal/web/views/experimentType/edit.xhtml
+++ b/src/java/DmWebPortal/web/views/experimentType/edit.xhtml
@@ -19,7 +19,7 @@
                 <ui:include src="experimentTypeEditPanelGrid.xhtml"/>
                 <p/>
                 <div class="actionButton">
-                    <p:commandButton action="#{experimentTypeController.update()}" value="Save" alt="Save" icon="ui-icon-check" update="@form"/>
+                    <p:commandButton action="#{experimentTypeController.update()}" value="Save" alt="Save" icon="ui-icon-check"/>
                     <p:commandButton action="#{experimentTypeController.prepareList()}" immediate="true" value="Return" alt="Return" icon="ui-icon-arrowreturnthick-1-w"/>
                 </div>
             </div>
diff --git a/src/java/DmWebPortal/web/views/login.xhtml b/src/java/DmWebPortal/web/views/login.xhtml
index 0c52069d95eb22c0358b261c084a3eccc4484112..82f994e16cbbc27f167e6b5a2b79b6d7b22ed4f0 100644
--- a/src/java/DmWebPortal/web/views/login.xhtml
+++ b/src/java/DmWebPortal/web/views/login.xhtml
@@ -39,11 +39,12 @@
                             <p:inputText id="username" value="#{loginController.username}" title="Username"/>
                             <p:watermark for="username" value="Username"/>
                         </div>
+                        <p/>
                         <div>
                             <p:password id="password" value="#{loginController.password}" title="Password"/>
                             <p:watermark for="password" value="Password"/>
                         </div>
-
+                        <p/>
                         <div>
                             <p:commandButton value="Login" action="#{loginController.login()}" />
                         </div>
diff --git a/src/java/DmWebPortal/web/views/roleType/view.xhtml b/src/java/DmWebPortal/web/views/roleType/view.xhtml
index befa1674d5515efa5f323191e573d156004e0d55..417c6ea188e3cb226d8785481ae0383fea6399e5 100644
--- a/src/java/DmWebPortal/web/views/roleType/view.xhtml
+++ b/src/java/DmWebPortal/web/views/roleType/view.xhtml
@@ -19,8 +19,8 @@
                 <ui:include src="roleTypeViewPanelGrid.xhtml"/>
                 
                 <p/>
-                    <c:set var="roleTypeObject" value="#{roleTypeController.selected}"/>
-                <c:set var="isEntityWriteable" value="#{loginController.loggedIn}"/>
+                <ui:param name="roleTypeObject" value="#{roleTypeController.selected}"/>
+                <ui:param name="isEntityWriteable" value="#{loginController.loggedIn}"/>
                 <div class="actionButton">
                     <p:commandButton action="#{roleTypeController.prepareEdit(roleTypeObject)}" rendered="#{isEntityWriteable}" value="Edit" alt="Edit" icon="ui-icon-pencil"/>
                     <p:commandButton onclick="PF('roleTypeDestroyDialogWidget').show();" rendered="#{loginController.loggedIn}" value="Delete" alt="Delete" icon="ui-icon-trash">
diff --git a/src/java/DmWebPortal/web/views/userSystemRole/systemRoleListDataTable.xhtml b/src/java/DmWebPortal/web/views/userSystemRole/systemRoleListDataTable.xhtml
index c38ad452658c6b7e173f45ff7c87f97c3425ce79..b713cde16bfd61d4a53e264751e44594fc016fbd 100644
--- a/src/java/DmWebPortal/web/views/userSystemRole/systemRoleListDataTable.xhtml
+++ b/src/java/DmWebPortal/web/views/userSystemRole/systemRoleListDataTable.xhtml
@@ -47,7 +47,7 @@
         <p:column headerText="Actions" >
             <div class="actionLink" >
             <p:commandLink oncomplete="PF('systemRoleRemoveDialogWidget').show()" rendered="#{userSystemRoleController.hasSystemRole(loginController.username) and (loginController.username != systemUserObject.username)}" styleClass="ui-icon ui-icon-trash" title="Remove" update="@form" >
-                    <f:setPropertyActionListener value="#{systemUserObject}" target="#{userSystemRoleController.systemRoleTable.current}" />
+                    <f:setPropertyActionListener value="#{systemUserObject}" target="#{userSystemRoleController.systemRoleTable.currentObject}" />
             </p:commandLink>
             </div>
         </p:column>
diff --git a/src/java/DmWebPortal/web/views/userSystemRole/systemRoleRemoveDialog.xhtml b/src/java/DmWebPortal/web/views/userSystemRole/systemRoleRemoveDialog.xhtml
index 7ea624e101b78820cd34d39c40dccc740fc223e4..e446137d5c33be037b97f2e39ab430e6609ae6dc 100644
--- a/src/java/DmWebPortal/web/views/userSystemRole/systemRoleRemoveDialog.xhtml
+++ b/src/java/DmWebPortal/web/views/userSystemRole/systemRoleRemoveDialog.xhtml
@@ -5,7 +5,7 @@
                 xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
 
 
-        <p:confirmDialog id="systemRoleRemoveDialog" message="Remove #{userSystemRoleController.getSystemRoleName()} Role for user #{userSystemRoleController.systemRoleTable.current.username}?"
+        <p:confirmDialog id="systemRoleRemoveDialog" message="Remove #{userSystemRoleController.getSystemRoleName()} Role for user #{userSystemRoleController.systemRoleTable.currentObject.username}?"
                      header="Remove System Role" severity="alert" widgetVar="systemRoleRemoveDialogWidget"
                      styleClass="dialog">
         <p:commandButton value="Yes" oncomplete="systemRoleRemoveDialogWidget.hide()"  action="#{userSystemRoleController.removeSystemRole()}"/>