diff --git a/src/main/java/org/olat/admin/user/imp/TransientIdentity.java b/src/main/java/org/olat/admin/user/imp/TransientIdentity.java
index f359b30bd7cee95d2e57fc8af1433922140bd46e..fc76b74f707b4d373450edf6c16b986ea3a3c3ed 100644
--- a/src/main/java/org/olat/admin/user/imp/TransientIdentity.java
+++ b/src/main/java/org/olat/admin/user/imp/TransientIdentity.java
@@ -65,7 +65,6 @@ public class TransientIdentity implements Identity, User {
 		return login;
 	}
 	
-	@Override
 	public void setName(String name) {
 		this.login = name;
 	}
@@ -96,23 +95,11 @@ public class TransientIdentity implements Identity, User {
 		return null;
 	}
 
-	@Override
-	public void setLastLogin(Date loginDate) {
-		//
-	}
-
 	@Override
 	public Integer getStatus() {
 		return null;
 	}
 
-	@Override
-	public void setStatus(Integer newStatus) {
-		//
-	}
-
-
-
 	@Override
 	public boolean equalsByPersistableKey(Persistable persistable) {
 		return super.equals(persistable);
diff --git a/src/main/java/org/olat/admin/user/imp/UpdateIdentity.java b/src/main/java/org/olat/admin/user/imp/UpdateIdentity.java
index 37984c96d4fc7c9a433734ceef8b762aa1ea2407..412f229b8d2a5dcf5c8addd632614e2b390fe951 100644
--- a/src/main/java/org/olat/admin/user/imp/UpdateIdentity.java
+++ b/src/main/java/org/olat/admin/user/imp/UpdateIdentity.java
@@ -102,11 +102,6 @@ public class UpdateIdentity implements Identity {
 		return identity.getExternalId();
 	}
 
-	@Override
-	public void setName(String name) {
-		//
-	}
-
 	@Override
 	public User getUser() {
 		return userWrapper;
@@ -117,20 +112,10 @@ public class UpdateIdentity implements Identity {
 		return identity.getLastLogin();
 	}
 
-	@Override
-	public void setLastLogin(Date loginDate) {
-		//
-	}
-
 	@Override
 	public Integer getStatus() {
 		return identity.getStatus();
 	}
-
-	@Override
-	public void setStatus(Integer newStatus) {
-		//
-	}	
 	
 	@Override
 	public int hashCode() {
diff --git a/src/main/java/org/olat/basesecurity/BaseSecurityManager.java b/src/main/java/org/olat/basesecurity/BaseSecurityManager.java
index becb891ca12d6a9d8067db3d9a5ca25044cf2763..a1a4ebdc32e7fbfb906f64aff4232a89e2badb61 100644
--- a/src/main/java/org/olat/basesecurity/BaseSecurityManager.java
+++ b/src/main/java/org/olat/basesecurity/BaseSecurityManager.java
@@ -1023,7 +1023,7 @@ public class BaseSecurityManager implements BaseSecurity {
 			return Collections.emptyList();
 		}
 		StringBuilder sb = new StringBuilder();
-		sb.append("select ident from ").append(IdentityShort.class.getName()).append(" as ident where ident.name in (:names)");
+		sb.append("select ident from bidentityshort as ident where ident.name in (:names)");
 
 		TypedQuery<IdentityShort> query = dbInstance.getCurrentEntityManager()
 				.createQuery(sb.toString(), IdentityShort.class);
@@ -1049,7 +1049,7 @@ public class BaseSecurityManager implements BaseSecurity {
 			return Collections.emptyList();
 		}
 		StringBuilder sb = new StringBuilder();
-		sb.append("select ident from ").append(IdentityShort.class.getName()).append(" as ident where ident.key in (:keys)");
+		sb.append("select ident from bidentityshort as ident where ident.key in (:keys)");
 		
 		TypedQuery<IdentityShort> query = dbInstance.getCurrentEntityManager()
 				.createQuery(sb.toString(), IdentityShort.class);
@@ -1143,7 +1143,7 @@ public class BaseSecurityManager implements BaseSecurity {
 		String[] attributes = new String[]{ "name", "firstName", "lastName", "email" };
 		
 		StringBuilder sb = new StringBuilder();
-		sb.append("select ident from ").append(IdentityShort.class.getName()).append(" as ident ")
+		sb.append("select ident from bidentityshort as ident ")
 		  .append(" where ident.status<").append(Identity.STATUS_VISIBLE_LIMIT).append(" and (");
 		
 		boolean start = true;
@@ -1181,12 +1181,8 @@ public class BaseSecurityManager implements BaseSecurity {
 
 	@Override
 	public IdentityShort loadIdentityShortByKey(Long identityKey) {
-		StringBuilder sb = new StringBuilder();
-		sb.append("select identity from ").append(IdentityShort.class.getName()).append(" as identity ")
-			.append(" where identity.key=:identityKey");
-		
 		List<IdentityShort> idents = dbInstance.getCurrentEntityManager()
-				.createQuery(sb.toString(), IdentityShort.class)
+				.createNamedQuery("getIdentityShortById", IdentityShort.class)
 				.setParameter("identityKey", identityKey)
 				.getResultList();
 		if(idents.isEmpty()) {
@@ -1201,7 +1197,7 @@ public class BaseSecurityManager implements BaseSecurity {
 			return Collections.emptyList();
 		}
 		StringBuilder sb = new StringBuilder();
-		sb.append("select ident from ").append(IdentityShort.class.getName()).append(" as ident where ident.key in (:keys)");
+		sb.append("select ident from bidentityshort as ident where ident.key in (:keys)");
 		
 		return dbInstance.getCurrentEntityManager()
 				.createQuery(sb.toString(), IdentityShort.class)
@@ -1900,7 +1896,7 @@ public class BaseSecurityManager implements BaseSecurity {
 	 */
 	@Override
 	public Identity saveIdentityStatus(Identity identity, Integer status) {
-		Identity reloadedIdentity = loadForUpdate(identity); 
+		IdentityImpl reloadedIdentity = loadForUpdate(identity); 
 		reloadedIdentity.setStatus(status);
 		reloadedIdentity = dbInstance.getCurrentEntityManager().merge(reloadedIdentity);
 		dbInstance.commit();
@@ -1909,7 +1905,7 @@ public class BaseSecurityManager implements BaseSecurity {
 	
 	@Override
 	public Identity setIdentityLastLogin(Identity identity) {
-		Identity reloadedIdentity = loadForUpdate(identity); 
+		IdentityImpl reloadedIdentity = loadForUpdate(identity); 
 		reloadedIdentity.setLastLogin(new Date());
 		reloadedIdentity = dbInstance.getCurrentEntityManager().merge(reloadedIdentity);
 		dbInstance.commit();
@@ -1918,7 +1914,7 @@ public class BaseSecurityManager implements BaseSecurity {
 	
 	@Override
 	public Identity saveIdentityName(Identity identity, String newName) {
-		Identity reloadedIdentity = loadForUpdate(identity); 
+		IdentityImpl reloadedIdentity = loadForUpdate(identity); 
 		reloadedIdentity.setName(newName);
 		reloadedIdentity = dbInstance.getCurrentEntityManager().merge(reloadedIdentity);
 		dbInstance.commit();
diff --git a/src/main/java/org/olat/basesecurity/IdentityImpl.hbm.xml b/src/main/java/org/olat/basesecurity/IdentityImpl.hbm.xml
index 91b997fc5d643891858ed2ff11ccdeccf6bca893..6dc24cf583fb4f1fc9b02d2a7040a32ca8c314e5 100644
--- a/src/main/java/org/olat/basesecurity/IdentityImpl.hbm.xml
+++ b/src/main/java/org/olat/basesecurity/IdentityImpl.hbm.xml
@@ -23,22 +23,5 @@
     <many-to-one name="user" column="fk_user_id" class="org.olat.user.UserImpl" fetch="join" unique="true"  cascade="none"/>
 
   </class>
-  
-  
-  <class name="org.olat.basesecurity.IdentityShort" table="o_bs_identity_short_v" mutable="false">
-  	<!-- the default columns -->
-	<id name="key" column="id_id" type="long" unsaved-value="null">
-      <generator class="hilo"/>
-    </id>
-	 
-	<property name="userKey" column="us_id" type="long" />
- 	<property name="lastLogin" column="id_lastlogin" type="timestamp" />
-    <property name="name" column="id_name" type="string" />
-    <property name="status" column="id_status" type="integer" />
 
-    <property name="firstName" column="first_name" type="string" />
-    <property name="lastName" column="last_name" type="string" />
-    <property name="email" column="email" type="string" />
-
-  </class>
 </hibernate-mapping>
\ No newline at end of file
diff --git a/src/main/java/org/olat/basesecurity/IdentityImpl.java b/src/main/java/org/olat/basesecurity/IdentityImpl.java
index 4abbad5c1952f6088cd8cd2000dc00e9a021838c..3017cb380725516560ea5a85062d81cf2eeb5a9e 100644
--- a/src/main/java/org/olat/basesecurity/IdentityImpl.java
+++ b/src/main/java/org/olat/basesecurity/IdentityImpl.java
@@ -105,7 +105,6 @@ public class IdentityImpl extends PersistentObject implements Identity, Identity
 	 * 
 	 * @param name The name to set
 	 */
-	@Override
 	public void setName(String name) {
 		if (name.length() > NAME_MAXLENGTH)
 			throw new AssertException("field name of table o_bs_identity too long");
diff --git a/src/main/java/org/olat/basesecurity/IdentityShort.java b/src/main/java/org/olat/basesecurity/IdentityShort.java
index b570a9722ad4d91c17c6241d219d689b8fe587c5..8836293f573d96c5c4a155a7726af99af5ab59f6 100644
--- a/src/main/java/org/olat/basesecurity/IdentityShort.java
+++ b/src/main/java/org/olat/basesecurity/IdentityShort.java
@@ -21,91 +21,95 @@ package org.olat.basesecurity;
 
 import java.util.Date;
 
-import org.olat.core.commons.persistence.PersistentObject;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
+import javax.persistence.Table;
+
+import org.hibernate.annotations.GenericGenerator;
+import org.olat.core.id.Persistable;
 
 /**
  * 
  * Description:<br>
- * TODO: srosse Class Description for IdentityShort
+ * This is an immutable version of identity with a limited set of fields.
  * 
  * <P>
  * Initial Date:  14 juil. 2011 <br>
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  */
-//fxdiff: FXOLAT-219 decrease the load for synching groups
-public class IdentityShort extends PersistentObject implements IdentityNames {
+@Entity(name="bidentityshort")
+@Table(name="o_bs_identity_short_v")
+@NamedQueries({
+	@NamedQuery(name="selectAllIdentitiesShortUnordered", query="select ident from bidentityshort as ident"),
+	@NamedQuery(name="getIdentityShortById", query="select identity from bidentityshort as identity where identity.key=:identityKey")
+	
+})
+public class IdentityShort implements Persistable, IdentityNames {
 
 	private static final long serialVersionUID = -9039644291427632379L;
 	
+	@Id
+	@GeneratedValue(generator = "system-uuid")
+	@GenericGenerator(name = "system-uuid", strategy = "hilo")
+	@Column(name="id_id", nullable=false, unique=true, insertable=true, updatable=false)
+	private Long key;
+
+	@Column(name="us_id", nullable=true, unique=false, insertable=false, updatable=false)
 	private Long userKey;
-	
+
+	@Column(name="id_name", nullable=true, unique=false, insertable=false, updatable=false)
 	private String name;
+	@Column(name="id_lastlogin", nullable=true, unique=false, insertable=false, updatable=false)
 	private Date lastLogin;
+	@Column(name="id_status", nullable=true, unique=false, insertable=false, updatable=false)
 	private int status;
+	@Column(name="first_name", nullable=true, unique=false, insertable=false, updatable=false)
 	private String firstName;
+	@Column(name="last_name", nullable=true, unique=false, insertable=false, updatable=false)
 	private String lastName;
+	@Column(name="email", nullable=true, unique=false, insertable=false, updatable=false)
 	private String email;
 
-	public IdentityShort() {
-		//
+	@Override
+	public Long getKey() {
+		return key;
 	}
-	
+
 	public Long getUserKey() {
 		return userKey;
 	}
 
-	public void setUserKey(Long userKey) {
-		this.userKey = userKey;
-	}
-
+	@Override
 	public String getName() {
 		return name;
 	}
 
-	public void setName(String name) {
-		this.name = name;
-	}
-
 	public Date getLastLogin() {
 		return lastLogin;
 	}
 
-	public void setLastLogin(Date lastLogin) {
-		this.lastLogin = lastLogin;
-	}
-
 	public int getStatus() {
 		return status;
 	}
 
-	public void setStatus(int status) {
-		this.status = status;
-	}
-
+	@Override
 	public String getFirstName() {
 		return firstName;
 	}
 
-	public void setFirstName(String firstName) {
-		this.firstName = firstName;
-	}
-
+	@Override
 	public String getLastName() {
 		return lastName;
 	}
 
-	public void setLastName(String lastName) {
-		this.lastName = lastName;
-	}
-
 	public String getEmail() {
 		return email;
 	}
 
-	public void setEmail(String email) {
-		this.email = email;
-	}
-
 	@Override
 	public String toString() {
 		return "IdentityShort[name=" + name + "], " + super.toString();
@@ -127,4 +131,9 @@ public class IdentityShort extends PersistentObject implements IdentityNames {
 		}
 		return false;
 	}
+	
+	@Override
+	public boolean equalsByPersistableKey(Persistable persistable) {
+		return equals(persistable);
+	}
 }
diff --git a/src/main/java/org/olat/core/id/Identity.java b/src/main/java/org/olat/core/id/Identity.java
index 16bdc2245f378c0c69e4a4daf4ddbfea0feb1dd4..2736699b5841d6fc40ca59c32d646eb0bf339f1c 100644
--- a/src/main/java/org/olat/core/id/Identity.java
+++ b/src/main/java/org/olat/core/id/Identity.java
@@ -71,23 +71,10 @@ public interface Identity extends CreateInfo, IdentityRef, Persistable {
 	 * @return Last date when the user logged in.
 	 */
 	public Date getLastLogin();
-	
-	/**
-	 * Set a new last login date for the user. 
-	 * @param loginDate  New last-login date.
-	 */
-	public void setLastLogin(Date loginDate);
 
 	/**
 	 * @return Current identity status 
 	 */
 	public Integer getStatus();
-	
-	/**
-	 * Set new status (aktiv,deleted,permanent) of identity.
-	 * @param newStatus  New status
-	 */
-	public void setStatus(Integer newStatus);
 
-	public void setName(String name);
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/core/util/mail/ui/EMailIdentity.java b/src/main/java/org/olat/core/util/mail/ui/EMailIdentity.java
index 8963cadf3f8deac913613e3eead81bb10cc48e4c..09f8807a2570bb62da8b46f0cbbfafe0d049c0ea 100644
--- a/src/main/java/org/olat/core/util/mail/ui/EMailIdentity.java
+++ b/src/main/java/org/olat/core/util/mail/ui/EMailIdentity.java
@@ -79,24 +79,11 @@ class EMailIdentity implements Identity {
 		return null;
 	}
 
-	@Override
-	public void setLastLogin(Date loginDate) {/**/
-	}
-
 	@Override
 	public Integer getStatus() {
 		return null;
 	}
 
-	@Override
-	public void setStatus(Integer newStatus) {/**/
-	}
-
-	@Override
-	public void setName(String name) {/**/
-	}
-	
-
 	private class EMailUser implements User, ModifiedInfo {
 
 		private static final long serialVersionUID = 7260225880639460228L;
@@ -109,14 +96,17 @@ class EMailIdentity implements Identity {
 			data.put(UserConstants.EMAIL, email);
 		}
 
+		@Override
 		public Long getKey() {
 			return null;
 		}
 
+		@Override
 		public boolean equalsByPersistableKey(Persistable persistable) {
 			return this == persistable;
 		}
 
+		@Override
 		public Date getLastModified() {
 			return null;
 		}
@@ -126,29 +116,36 @@ class EMailIdentity implements Identity {
 			//
 		}
 
+		@Override
 		public Date getCreationDate() {
 			return null;
 		}
 
+		@Override
 		public void setProperty(String propertyName, String propertyValue) {
 			//
 		}
 
+		@Override
 		public void setPreferences(Preferences prefs) {
 			//
 		}
 
+		@Override
 		public String getProperty(String propertyName, Locale locale) {
 			return data.get(propertyName);
 		}
 
+		@Override
 		public void setIdentityEnvironmentAttributes(Map<String, String> identEnvAttribs) {/**/
 		}
 
+		@Override
 		public String getPropertyOrIdentityEnvAttribute(String propertyName, Locale locale) {
 			return data.get(propertyName);
 		}
 
+		@Override
 		public Preferences getPreferences() {
 			return prefs;
 		}
diff --git a/src/main/java/org/olat/course/assessment/AssessmentToolManager.java b/src/main/java/org/olat/course/assessment/AssessmentToolManager.java
index 1085706cf3b50a24deeb2ba5e6237eb8ea1d3ab0..dba89805c63f66484e81dc2b85eadb97491154bd 100644
--- a/src/main/java/org/olat/course/assessment/AssessmentToolManager.java
+++ b/src/main/java/org/olat/course/assessment/AssessmentToolManager.java
@@ -23,6 +23,7 @@ import java.util.List;
 
 import org.olat.basesecurity.IdentityShort;
 import org.olat.core.id.Identity;
+import org.olat.course.assessment.model.AssessmentEntryRow;
 import org.olat.course.assessment.model.CourseStatistics;
 import org.olat.course.assessment.model.SearchAssessedIdentityParams;
 import org.olat.modules.assessment.AssessmentEntry;
@@ -44,6 +45,8 @@ public interface AssessmentToolManager {
 	
 	public List<IdentityShort> getShortAssessedIdentities(Identity coach, SearchAssessedIdentityParams params, int maxResults);
 	
+	public List<AssessmentEntryRow> getAssessmentEntryRows(Identity coach, SearchAssessedIdentityParams params, AssessmentEntryStatus status);
+	
 	public List<AssessmentEntry> getAssessmentEntries(Identity coach, SearchAssessedIdentityParams params, AssessmentEntryStatus status);
 	
 
diff --git a/src/main/java/org/olat/course/assessment/manager/AssessmentToolManagerImpl.java b/src/main/java/org/olat/course/assessment/manager/AssessmentToolManagerImpl.java
index ee439ebb13f304053e7a2182b2f028f3b3f9f983..3597a283c119719c981bd1dcd93cd42182c90d78 100644
--- a/src/main/java/org/olat/course/assessment/manager/AssessmentToolManagerImpl.java
+++ b/src/main/java/org/olat/course/assessment/manager/AssessmentToolManagerImpl.java
@@ -19,6 +19,7 @@
  */
 package org.olat.course.assessment.manager;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import javax.persistence.TypedQuery;
@@ -33,6 +34,8 @@ import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.StringHelper;
 import org.olat.course.assessment.AssessmentToolManager;
+import org.olat.course.assessment.model.AssessedIdentity;
+import org.olat.course.assessment.model.AssessmentEntryRow;
 import org.olat.course.assessment.model.CourseStatistics;
 import org.olat.course.assessment.model.SearchAssessedIdentityParams;
 import org.olat.course.assessment.model.UserCourseInfosImpl;
@@ -58,6 +61,15 @@ public class AssessmentToolManagerImpl implements AssessmentToolManager {
 	@Autowired
 	private DB dbInstance;
 	
+	public List<AssessedIdentity> getIdentities() {
+		StringBuilder sf = new StringBuilder();
+		sf.append("select ident from asidentity as ident");
+		
+		return dbInstance.getCurrentEntityManager()
+				.createQuery(sf.toString(), AssessedIdentity.class)
+				.getResultList();
+	}
+	
 	@Override
 	public CourseStatistics getStatistics(Identity coach, SearchAssessedIdentityParams params) {
 		CourseStatistics entry = new CourseStatistics();
@@ -246,7 +258,7 @@ public class AssessmentToolManagerImpl implements AssessmentToolManager {
 	public List<IdentityShort> getShortAssessedIdentities(Identity coach, SearchAssessedIdentityParams params, int maxResults) {
 		StringBuilder sb = new StringBuilder();
 		sb.append("select ident")
-		  .append(" from ").append(IdentityShort.class.getName()).append(" as ident ")
+		  .append(" from bidentityshort as ident ")
 		  .append(" where ");
 		if(params.isAdmin()) {
 			sb.append(" (ident.key in (select participant.identity.key from repoentrytogroup as rel, bgroupmember as participant")
@@ -383,6 +395,90 @@ public class AssessmentToolManagerImpl implements AssessmentToolManager {
 			}
 		}
 	}
+	
+	@Override
+	public List<AssessmentEntryRow> getAssessmentEntryRows(Identity coach, SearchAssessedIdentityParams params, AssessmentEntryStatus status) {
+		StringBuilder sb = new StringBuilder();
+		sb.append("select asident, aentry from asidentity asident");
+		if(params.isFailed() || params.isPassed() || (params.getAssessmentStatus() != null && params.getAssessmentStatus().size() > 0)) {
+			sb.append(" inner join asident.assessmentEntries as aentry ");
+		} else {
+			sb.append(" left join asident.assessmentEntries as aentry ");
+		}
+		sb.append(" on ( aentry.repositoryEntry.key=:repoEntryKey");
+		if(params.getReferenceEntry() != null) {
+			sb.append(" and aentry.referenceEntry.key=:referenceKey");
+		}
+		if(params.getSubIdent() != null) {
+			sb.append(" and aentry.subIdent=:subIdent");
+		}
+		sb.append(")");
+
+		sb.append(" where (asident.key in");
+		if(params.isAdmin()) {
+			sb.append(" (select participant.identity.key from repoentrytogroup as rel, bgroupmember as participant")
+	          .append("    where rel.entry.key=:repoEntryKey and rel.group=participant.group")
+	          .append("      and participant.role='").append(GroupRoles.participant.name()).append("'")
+	          .append("  )");
+			if(params.isNonMembers()) {
+				sb.append(" or asident.key in (select aentry.identity.key from assessmententry aentryInvitee")
+				  .append("  where aentryInvitee.repositoryEntry.key=:repoEntryKey")
+				  .append("  and not exists (select membership.identity from repoentrytogroup as rel, bgroupmember as membership")
+		          .append("    where rel.entry.key=:repoEntryKey and rel.group.key=membership.group.key and membership.identity.key=asident.key)")
+		          .append(" )");
+			}
+		} else if(params.isBusinessGroupCoach() || params.isRepositoryEntryCoach()) {
+			sb.append(" (select participant.identity.key from repoentrytogroup as rel, bgroupmember as participant, bgroupmember as coach")
+	          .append("    where rel.entry.key=:repoEntryKey")
+	          .append("      and rel.group=coach.group and coach.role='").append(GroupRoles.coach.name()).append("' and coach.identity.key=:identityKey")
+	          .append("      and rel.group=participant.group and participant.role='").append(GroupRoles.participant.name()).append("'")
+	          .append("  )");
+		}
+		sb.append(" )");
+
+		if(params.isFailed()) {
+			sb.append(" aentry.passed=false");
+		}
+		if(params.isPassed()) {
+			sb.append(" aentry.passed=true");
+		}
+		if(params.getAssessmentStatus() != null && params.getAssessmentStatus().size() > 0) {
+			sb.append(" aentry.status in (:status)");
+		}
+		
+		sb.append(" order by asident.name");
+		
+		TypedQuery<Object[]> list = dbInstance.getCurrentEntityManager()
+			.createQuery(sb.toString(), Object[].class)
+			.setParameter("repoEntryKey", params.getEntry().getKey());
+		if(params.getReferenceEntry() != null) {
+			list.setParameter("referenceKey", params.getReferenceEntry().getKey());
+		}
+		if(params.getSubIdent() != null) {
+			list.setParameter("subIdent", params.getSubIdent());
+		}
+		if(!params.isAdmin()) {
+			list.setParameter("identityKey", coach.getKey());
+		}
+		
+		if(params.getAssessmentStatus() != null && params.getAssessmentStatus().size() > 0) {
+			List<String> statusList = new ArrayList<>();
+			for(AssessmentEntryStatus assessmentStatus:params.getAssessmentStatus()) {
+				statusList.add(assessmentStatus.name());
+			}
+			list.setParameter("status", statusList);
+		}
+		
+		List<Object[]> objects = list.getResultList();
+		List<AssessmentEntryRow> rows = new ArrayList<>();
+		for(Object[] object:objects) {
+			Identity identity = (Identity)object[0];
+			AssessmentEntry entry = (AssessmentEntry)object[1];
+			rows.add(new AssessmentEntryRow(identity, entry));
+		}
+		
+		return rows;
+	}
 
 	@Override
 	public List<AssessmentEntry> getAssessmentEntries(Identity coach, SearchAssessedIdentityParams params, AssessmentEntryStatus status) {
diff --git a/src/main/java/org/olat/course/assessment/model/AssessedIdentity.java b/src/main/java/org/olat/course/assessment/model/AssessedIdentity.java
new file mode 100644
index 0000000000000000000000000000000000000000..90c36302a0682bcb6fd8a41f9481fb933e79b452
--- /dev/null
+++ b/src/main/java/org/olat/course/assessment/model/AssessedIdentity.java
@@ -0,0 +1,143 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.course.assessment.model;
+
+import java.util.Date;
+import java.util.Set;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+import org.hibernate.annotations.GenericGenerator;
+import org.olat.core.id.Identity;
+import org.olat.core.id.Persistable;
+import org.olat.core.id.User;
+import org.olat.modules.assessment.AssessmentEntry;
+import org.olat.modules.assessment.model.AssessmentEntryImpl;
+import org.olat.user.UserImpl;
+
+/**
+ * The instance is immutable
+ * 
+ * Initial date: 01.12.2015<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+@Entity(name="asidentity")
+@Table(name="o_bs_identity")
+public class AssessedIdentity implements Persistable, Identity {
+
+	private static final long serialVersionUID = 5437094042277941568L;
+	
+	@Id
+	@GeneratedValue(generator = "system-uuid")
+	@GenericGenerator(name = "system-uuid", strategy = "hilo")
+	@Column(name="id", nullable=false, unique=true, insertable=true, updatable=false)
+	private Long key;
+	@Temporal(TemporalType.TIMESTAMP)
+	@Column(name="creationdate", nullable=false, insertable=false, updatable=false)
+	protected Date creationDate;
+
+	@Column(name="name", nullable=false, unique=false, insertable=false, updatable=false)
+	private String name;
+	@Column(name="lastlogin", nullable=false, unique=false, insertable=false, updatable=false)
+	private Date lastLogin;
+	@Column(name="external_id", nullable=false, unique=false, insertable=false, updatable=false)
+	private String externalId;
+	@Column(name="status", nullable=false, unique=false, insertable=false, updatable=false)
+	private Integer status;
+
+	@ManyToOne(targetEntity=UserImpl.class,fetch=FetchType.LAZY, optional=false)
+	@JoinColumn(name="fk_user_id", nullable=false, insertable=false, updatable=false)
+	private User user;
+
+	@OneToMany(targetEntity=AssessmentEntryImpl.class, mappedBy="identity")
+	private Set<AssessmentEntry> assessmentEntries;
+	
+	@Override
+	public Long getKey() {
+		return key;
+	}
+	
+	@Override
+	public Date getCreationDate() {
+		return creationDate;
+	}
+
+	@Override
+	public String getName() {
+		return name;
+	}
+
+	@Override
+	public Date getLastLogin() {
+		return lastLogin;
+	}
+
+	@Override
+	public Integer getStatus() {
+		return status;
+	}
+
+	@Override
+	public String getExternalId() {
+		return externalId;
+	}
+
+	@Override
+	public User getUser() {
+		return user;
+	}
+	
+	public Set<AssessmentEntry> getAssessmentEntries() {
+		return assessmentEntries;
+	}
+	
+	@Override
+	public int hashCode() {
+		return getKey() == null ? 34801 : getKey().hashCode();
+	}
+	
+	@Override
+	public boolean equals(Object obj) {
+		if(this == obj) {
+			return true;
+		}
+		if(obj instanceof AssessedIdentity) {
+			AssessedIdentity id = (AssessedIdentity)obj;
+			return getKey() != null && getKey().equals(id.getKey());
+		}
+		return false;
+	}
+	
+	@Override
+	public boolean equalsByPersistableKey(Persistable persistable) {
+		return equals(persistable);
+	}
+}
diff --git a/src/main/java/org/olat/course/assessment/model/AssessmentEntryRow.java b/src/main/java/org/olat/course/assessment/model/AssessmentEntryRow.java
new file mode 100644
index 0000000000000000000000000000000000000000..46f2c2c2fe282866995e46e21875dc8d6466b7d7
--- /dev/null
+++ b/src/main/java/org/olat/course/assessment/model/AssessmentEntryRow.java
@@ -0,0 +1,48 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.course.assessment.model;
+
+import org.olat.core.id.Identity;
+import org.olat.modules.assessment.AssessmentEntry;
+
+/**
+ * 
+ * Initial date: 01.12.2015<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class AssessmentEntryRow {
+	
+	private final Identity identity;
+	private final AssessmentEntry entry;
+	
+	public AssessmentEntryRow(Identity identity, AssessmentEntry entry) {
+		this.identity = identity;
+		this.entry = entry;
+	}
+	
+	public Identity getIdentity() {
+		return identity;
+	}
+	
+	public AssessmentEntry getEntry() {
+		return entry;
+	}
+}
diff --git a/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentitiesCourseNodeController.java b/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentitiesCourseNodeController.java
index 5525792df03eb3176ea09a31c4ba6de7e3528912..f34d548e23ba26630a076b60e87cdd12c9432b8b 100644
--- a/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentitiesCourseNodeController.java
+++ b/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentitiesCourseNodeController.java
@@ -20,9 +20,7 @@
 package org.olat.course.assessment.ui.tool;
 
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 
 import org.olat.basesecurity.BaseSecurity;
 import org.olat.basesecurity.BaseSecurityModule;
@@ -57,6 +55,7 @@ import org.olat.course.ICourse;
 import org.olat.course.assessment.AssessmentMainController;
 import org.olat.course.assessment.AssessmentToolManager;
 import org.olat.course.assessment.bulk.PassedCellRenderer;
+import org.olat.course.assessment.model.AssessmentEntryRow;
 import org.olat.course.assessment.model.SearchAssessedIdentityParams;
 import org.olat.course.assessment.ui.tool.AssessmentIdentitiesCourseNodeTableModel.IdentityCourseElementCols;
 import org.olat.course.nodes.AssessableCourseNode;
@@ -236,19 +235,16 @@ public class AssessmentIdentitiesCourseNodeController extends FormBasicControlle
 		}
 		params.setBusinessGroupKeys(businessGroupKeys);
 		params.setSearchString(searchString);
-		
-		List<Identity> assessedIdentities = assessmentToolManager.getAssessedIdentities(getIdentity(), params);
-		List<AssessmentEntry> assessmentEntries = assessmentToolManager.getAssessmentEntries(getIdentity(), params, null);
-		Map<Long,AssessmentEntry> entryMap = new HashMap<>();
-		assessmentEntries.forEach((entry) -> entryMap.put(entry.getIdentity().getKey(), entry));
 
-		List<AssessedIdentityCourseElementRow> rows = new ArrayList<>(assessedIdentities.size());
-		for(Identity assessedIdentity:assessedIdentities) {
-			AssessmentEntry entry = entryMap.get(assessedIdentity.getKey());
-			if(accept(entry, params)) {
-				rows.add(new AssessedIdentityCourseElementRow(assessedIdentity, entry, userPropertyHandlers, getLocale()));
-			}
+		List<AssessmentEntryRow> quickRows = assessmentToolManager.getAssessmentEntryRows(getIdentity(), params, null);
+
+		List<Identity> assessedIdentities = new ArrayList<>(quickRows.size());
+		List<AssessedIdentityCourseElementRow> rows = new ArrayList<>(quickRows.size());
+		for(AssessmentEntryRow quickRow:quickRows) {
+			assessedIdentities.add(quickRow.getIdentity());
+			rows.add(new AssessedIdentityCourseElementRow(quickRow.getIdentity(), quickRow.getEntry(), userPropertyHandlers, getLocale()));
 		}
+
 		usersTableModel.setObjects(rows);
 		tableEl.reloadData();
 
@@ -306,17 +302,17 @@ public class AssessmentIdentitiesCourseNodeController extends FormBasicControlle
 	
 	private void fillAlternativeToAssessableIdentityList(AssessmentToolOptions options) {
 		List<Group> baseGroups = new ArrayList<>();
-		if((assessmentCallback.canAssessRepositoryEntryMembers() && assessmentCallback.getCoachedGroups().isEmpty())
+		if((assessmentCallback.canAssessRepositoryEntryMembers()
+				&& (assessmentCallback.getCoachedGroups() == null || assessmentCallback.getCoachedGroups().isEmpty()))
 				|| assessmentCallback.canAssessNonMembers()) {
 			baseGroups.add(repositoryService.getDefaultGroup(courseEntry));
 		}
-		if(assessmentCallback.getCoachedGroups().size() > 0) {
+		if(assessmentCallback.getCoachedGroups() != null && assessmentCallback.getCoachedGroups().size() > 0) {
 			for(BusinessGroup coachedGroup:assessmentCallback.getCoachedGroups()) {
 				baseGroups.add(coachedGroup.getBaseGroup());
 			}
 		}
 		options.setAlternativeToIdentities(baseGroups, assessmentCallback.canAssessNonMembers());
-
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/certificate/manager/CertificatesManagerImpl.java b/src/main/java/org/olat/course/certificate/manager/CertificatesManagerImpl.java
index 3c73424204323aced10518e12a3b19cf049ba1a4..5eaf6b7d3c2316dd96a0da6991250a064e146026 100644
--- a/src/main/java/org/olat/course/certificate/manager/CertificatesManagerImpl.java
+++ b/src/main/java/org/olat/course/certificate/manager/CertificatesManagerImpl.java
@@ -693,7 +693,7 @@ public class CertificatesManagerImpl implements CertificatesManager, MessageList
 	}
 	
 	private Identity getPreviewIdentity() {
-		Identity identity = new TransientIdentity();
+		TransientIdentity identity = new TransientIdentity();
 		identity.setName("username");
 		List<UserPropertyHandler> userPropertyHandlers = userManager.getAllUserPropertyHandlers();
 		for(UserPropertyHandler handler:userPropertyHandlers) {
diff --git a/src/main/java/org/olat/course/run/preview/PreviewIdentity.java b/src/main/java/org/olat/course/run/preview/PreviewIdentity.java
index c0254efa1d88c5e666b82a22ab268cf0f08bf02a..13aea3b48b3f9de2cd472e9f15c7a4e0a15ab4e3 100644
--- a/src/main/java/org/olat/course/run/preview/PreviewIdentity.java
+++ b/src/main/java/org/olat/course/run/preview/PreviewIdentity.java
@@ -80,11 +80,6 @@ public final class PreviewIdentity implements Identity, User {
 		return "JaneDoe";
 	}
 
-	@Override
-	public void setName(String loginName) {
-		//
-	}
-
 	/**
 	 * @see org.olat.core.id.Identity#getUser()
 	 */
@@ -141,20 +136,10 @@ public final class PreviewIdentity implements Identity, User {
 		return new Date();
 	}
 
-	@Override
-	public void setLastLogin(Date loginDate) {
-		//
-	}
-
 	@Override
 	public Integer getStatus() {
 		return Identity.STATUS_ACTIV;
 	}
-
-	@Override
-	public void setStatus(Integer newStatus) {
-		//
-	}
 	
 	/**
 	 * @see org.olat.core.commons.persistence.Persistable#equalsByPersistableKey(org.olat.core.commons.persistence.Persistable)
diff --git a/src/main/java/org/olat/user/UserDisplayNamePreWarm.java b/src/main/java/org/olat/user/UserDisplayNamePreWarm.java
index 0a743052a2582e32d081b638b1feb21ef93c946e..4b6f94c128113bdd169eca9eaa3f783a9673b05a 100644
--- a/src/main/java/org/olat/user/UserDisplayNamePreWarm.java
+++ b/src/main/java/org/olat/user/UserDisplayNamePreWarm.java
@@ -19,6 +19,7 @@
  */
 package org.olat.user;
 
+import org.olat.core.configuration.PreWarm;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.CodeHelper;
@@ -31,7 +32,7 @@ import org.springframework.stereotype.Service;
  *
  */
 @Service
-public class UserDisplayNamePreWarm implements Runnable {
+public class UserDisplayNamePreWarm implements PreWarm {
 	
 	private static final OLog log = Tracing.createLoggerFor(UserDisplayNamePreWarm.class);
 
diff --git a/src/main/java/org/olat/user/UserManagerImpl.java b/src/main/java/org/olat/user/UserManagerImpl.java
index 8b0847beb9e827e897851b12f2159d1cce2877c8..ef5e480ecb74488b91a5b41b50cb124a98afc399 100644
--- a/src/main/java/org/olat/user/UserManagerImpl.java
+++ b/src/main/java/org/olat/user/UserManagerImpl.java
@@ -440,16 +440,14 @@ public class UserManagerImpl extends UserManager {
 
 	@Override
 	public int warmUp() {
-		StringBuilder sb = new StringBuilder();
-		sb.append("select ident from ").append(IdentityShort.class.getName()).append(" as ident");
-		
 		EntityManager em = dbInstance.getCurrentEntityManager();
 		
 		int batchSize = 5000;
-		TypedQuery<IdentityShort> query = em.createQuery(sb.toString(), IdentityShort.class)
+		TypedQuery<IdentityShort> query = em
+				.createNamedQuery("selectAllIdentitiesShortUnordered", IdentityShort.class)
 				.setMaxResults(batchSize);
-		int count = 0;
 		
+		int count = 0;
 		List<IdentityShort> identities;
 		do {
 			identities = query.setFirstResult(count).getResultList();
diff --git a/src/main/resources/META-INF/persistence.xml b/src/main/resources/META-INF/persistence.xml
index bf11044036981e555917b7d97eff6316d523d2c2..6aaa5b9633b9e27723689481fcf0e5b8ddbfc602 100644
--- a/src/main/resources/META-INF/persistence.xml
+++ b/src/main/resources/META-INF/persistence.xml
@@ -81,6 +81,8 @@
 		<class>org.olat.upgrade.model.InvitationUpgrade</class>
 		<!-- End upgraders mapping -->
 		
+		
+		<class>org.olat.basesecurity.IdentityShort</class>
 		<class>org.olat.basesecurity.model.GroupImpl</class>
 		<class>org.olat.basesecurity.model.GrantImpl</class>
 		<class>org.olat.basesecurity.model.GroupMembershipImpl</class>
@@ -96,6 +98,7 @@
 		<class>org.olat.core.commons.services.taskexecutor.model.PersistentTaskModifier</class>
 		<class>org.olat.core.commons.services.commentAndRating.model.UserRatingImpl</class>
 		<class>org.olat.core.commons.services.commentAndRating.model.UserCommentImpl</class>
+		<class>org.olat.course.assessment.model.AssessedIdentity</class>
 		<class>org.olat.course.assessment.model.AssessmentModeImpl</class>
 		<class>org.olat.course.assessment.model.AssessmentModeToAreaImpl</class>
 		<class>org.olat.course.assessment.model.AssessmentModeToGroupImpl</class>
diff --git a/src/test/java/org/olat/basesecurity/BaseSecurityManagerTest.java b/src/test/java/org/olat/basesecurity/BaseSecurityManagerTest.java
index a480287c3118cf1f6e86d42005dba4f638110976..28293e5133895ba2031ea3e389ef5098089c23b0 100644
--- a/src/test/java/org/olat/basesecurity/BaseSecurityManagerTest.java
+++ b/src/test/java/org/olat/basesecurity/BaseSecurityManagerTest.java
@@ -191,6 +191,26 @@ public class BaseSecurityManagerTest extends OlatTestCase {
 		Assert.assertTrue(foundIds.contains(id2));
 	}
 	
+	@Test
+	public void loadIdentityShortByKey() {
+		//create a user it
+		String idName = "find-me-short-1-" + UUID.randomUUID().toString();
+		Identity id = JunitTestHelper.createAndPersistIdentityAsUser(idName);
+		dbInstance.commitAndCloseSession();
+		
+		//find it
+		IdentityShort foundId = securityManager.loadIdentityShortByKey(id.getKey());
+		Assert.assertNotNull(foundId);
+		Assert.assertEquals(id.getKey(), foundId.getKey());
+		Assert.assertEquals(idName, foundId.getName());
+		Assert.assertNotNull(foundId.getEmail());
+		Assert.assertNotNull(foundId.getFirstName());
+		Assert.assertNotNull(foundId.getLastName());
+		Assert.assertNotNull(foundId.getLastLogin());
+		Assert.assertEquals(id.getUser().getKey(), foundId.getUserKey());
+		Assert.assertTrue(foundId.getStatus() < Identity.STATUS_VISIBLE_LIMIT);
+	}
+	
 	@Test
 	public void testGetSecurityGroupsForIdentity() {
 		// create
diff --git a/src/test/java/org/olat/basesecurity/SecurityManagerTest.java b/src/test/java/org/olat/basesecurity/SecurityManagerTest.java
index e73fcd940639c9586528c3a5f07bdc700eaf9774..421c64facbded2eef68e115eeb9abe998b66630b 100644
--- a/src/test/java/org/olat/basesecurity/SecurityManagerTest.java
+++ b/src/test/java/org/olat/basesecurity/SecurityManagerTest.java
@@ -55,7 +55,7 @@ import org.springframework.beans.factory.annotation.Autowired;
  */
 public class SecurityManagerTest extends OlatTestCase {
 
-	private Identity s1,s2,s3,testAdmin;
+	private IdentityImpl s1,s2,s3,testAdmin;
 	private static String testLogin = "test-login";
 	
 	@Autowired
@@ -259,9 +259,9 @@ public class SecurityManagerTest extends OlatTestCase {
 
 	@Before
 	public void setup() throws Exception {
-		s1 = JunitTestHelper.createAndPersistIdentityAsUser(testLogin);
-		s2 = JunitTestHelper.createAndPersistIdentityAsUser("coop");
-		s3 = JunitTestHelper.createAndPersistIdentityAsAuthor("diesbach");
-		testAdmin = JunitTestHelper.createAndPersistIdentityAsAdmin("testAdmin");
+		s1 = (IdentityImpl)JunitTestHelper.createAndPersistIdentityAsUser(testLogin);
+		s2 = (IdentityImpl)JunitTestHelper.createAndPersistIdentityAsUser("coop");
+		s3 = (IdentityImpl)JunitTestHelper.createAndPersistIdentityAsAuthor("diesbach");
+		testAdmin = (IdentityImpl)JunitTestHelper.createAndPersistIdentityAsAdmin("testAdmin");
 	}
 }
\ No newline at end of file
diff --git a/src/test/java/org/olat/course/assessment/manager/AssessmentToolManagerTest.java b/src/test/java/org/olat/course/assessment/manager/AssessmentToolManagerTest.java
index c9e86962e585d15f2728d53572a80030b408ddaf..77dc7a129a6f1c06aad8ac3ddfbeb259ed37790b 100644
--- a/src/test/java/org/olat/course/assessment/manager/AssessmentToolManagerTest.java
+++ b/src/test/java/org/olat/course/assessment/manager/AssessmentToolManagerTest.java
@@ -19,12 +19,23 @@
  */
 package org.olat.course.assessment.manager;
 
+import java.util.List;
+import java.util.Set;
+
 import org.junit.Assert;
 import org.junit.Test;
+import org.olat.core.commons.persistence.DB;
+import org.olat.core.id.Identity;
 import org.olat.course.assessment.AssessmentToolManager;
+import org.olat.course.assessment.model.AssessedIdentity;
+import org.olat.modules.assessment.AssessmentEntry;
+import org.olat.modules.assessment.manager.AssessmentEntryDAO;
+import org.olat.repository.RepositoryEntry;
+import org.olat.test.JunitTestHelper;
 import org.olat.test.OlatTestCase;
 import org.springframework.beans.factory.annotation.Autowired;
 
+
 /**
  * 
  * Initial date: 23.07.2015<br>
@@ -33,13 +44,33 @@ import org.springframework.beans.factory.annotation.Autowired;
  */
 public class AssessmentToolManagerTest extends OlatTestCase {
 
+	@Autowired
+	private DB dbInstance;
+	@Autowired
+	private AssessmentEntryDAO courseNodeAssessmentDao;
 	@Autowired
 	private AssessmentToolManager assessmentToolManager;
 	
 	@Test
 	public void getAssessedIdentities() {
+		Identity assessedIdentity = JunitTestHelper.createAndPersistIdentityAsRndUser("as-node-1");
+		RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry();
+		String subIdent = "39486543874";
+
+		AssessmentEntry nodeAssessment = courseNodeAssessmentDao
+				.createCourseNodeAssessment(assessedIdentity, entry, subIdent, entry);
+		Assert.assertNotNull(nodeAssessment);
+		dbInstance.commitAndCloseSession();
+		
 		
-		Assert.assertNotNull(assessmentToolManager);
+		List<AssessedIdentity> ids = ((AssessmentToolManagerImpl)assessmentToolManager).getIdentities();
+		Assert.assertNotNull(ids);
+		for(AssessedIdentity id:ids) {
+			if(id.getKey().equals(assessedIdentity.getKey())) {
+				Set<AssessmentEntry> entries = id.getAssessmentEntries();
+				System.out.println(entries);
+			}
+		}
 		
 	}
 }