diff --git a/src/main/java/org/olat/course/assessment/AssessmentModeManager.java b/src/main/java/org/olat/course/assessment/AssessmentModeManager.java
index d9df8ceb9c8dae6157e83f01f4ecc191d771cb55..381fd2c49dd63845534746d3e1a23450e8c69902 100644
--- a/src/main/java/org/olat/course/assessment/AssessmentModeManager.java
+++ b/src/main/java/org/olat/course/assessment/AssessmentModeManager.java
@@ -28,7 +28,6 @@ import javax.servlet.http.HttpServletRequest;
 import org.olat.basesecurity.IdentityRef;
 import org.olat.course.assessment.model.SearchAssessmentModeParams;
 import org.olat.group.BusinessGroup;
-import org.olat.group.BusinessGroupRef;
 import org.olat.group.area.BGArea;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryEntryRef;
@@ -52,7 +51,6 @@ public interface AssessmentModeManager {
 	
 	public AssessmentModeToGroup createAssessmentModeToGroup(AssessmentMode mode, BusinessGroup group);
 	
-	public void deleteAssessmentModesToGroup(BusinessGroupRef group);
 	
 	public AssessmentModeToArea createAssessmentModeToArea(AssessmentMode mode, BGArea area);
 	
@@ -74,21 +72,6 @@ public interface AssessmentModeManager {
 	 */
 	public void delete(AssessmentMode assessmentMode);
 	
-	/**
-	 * Delete all assessment modes of a course.
-	 * 
-	 * @param entry
-	 */
-	public void delete(RepositoryEntryRef entry);
-	
-	/**
-	 * Delete the relations between assessment mode and group for the specified business group and course.
-	 * @param businessGroup
-	 * @param entry
-	 */
-	public void delete(BusinessGroupRef businessGroup, RepositoryEntryRef entry);
-
-	
 	public AssessmentMode getAssessmentModeById(Long key);
 	
 	/**
diff --git a/src/main/java/org/olat/course/assessment/manager/AssessmentModeDAO.java b/src/main/java/org/olat/course/assessment/manager/AssessmentModeDAO.java
new file mode 100644
index 0000000000000000000000000000000000000000..b5a44abf23dfe9f2947acd0b9a2881b9a268e405
--- /dev/null
+++ b/src/main/java/org/olat/course/assessment/manager/AssessmentModeDAO.java
@@ -0,0 +1,257 @@
+/**
+ * <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.manager;
+
+import static org.olat.core.commons.persistence.PersistenceHelper.appendAnd;
+import static org.olat.core.commons.persistence.PersistenceHelper.appendFuzzyLike;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+
+import javax.persistence.TemporalType;
+import javax.persistence.TypedQuery;
+
+import org.olat.basesecurity.GroupRoles;
+import org.olat.basesecurity.IdentityRef;
+import org.olat.core.commons.persistence.DB;
+import org.olat.core.commons.persistence.PersistenceHelper;
+import org.olat.core.util.StringHelper;
+import org.olat.course.assessment.AssessmentMode;
+import org.olat.course.assessment.AssessmentMode.Status;
+import org.olat.course.assessment.model.AssessmentModeImpl;
+import org.olat.course.assessment.model.SearchAssessmentModeParams;
+import org.olat.group.BusinessGroupImpl;
+import org.olat.group.BusinessGroupRef;
+import org.olat.group.area.BGtoAreaRelationImpl;
+import org.olat.repository.RepositoryEntryRef;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 
+ * Initial date: 20.04.2015<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+@Service
+public class AssessmentModeDAO {
+	
+	@Autowired
+	private DB dbInstance;
+	
+	public AssessmentMode getAssessmentModeById(Long key) {
+		List<AssessmentMode> modes = dbInstance.getCurrentEntityManager()
+			.createNamedQuery("assessmentModeById", AssessmentMode.class)
+			.setParameter("modeKey", key)
+			.getResultList();
+		
+		return modes == null || modes.isEmpty() ? null : modes.get(0);
+	}
+	
+	public List<AssessmentMode> findAssessmentMode(SearchAssessmentModeParams params) {
+		StringBuilder sb = new StringBuilder();
+		sb.append("select mode from courseassessmentmode mode")
+		  .append(" inner join fetch mode.repositoryEntry v")
+		  .append(" inner join fetch v.olatResource res");
+		
+		boolean where = false;
+		
+		Date date = params.getDate();
+		if(date != null) {
+			where = appendAnd(sb, where);
+			sb.append(":date between mode.beginWithLeadTime and mode.endWithFollowupTime");
+		}
+		
+		String name = params.getName();
+		if(StringHelper.containsNonWhitespace(name)) {
+			name = PersistenceHelper.makeFuzzyQueryString(name);
+			where = appendAnd(sb, where);
+			sb.append("(");
+			appendFuzzyLike(sb, "v.displayname", "name", dbInstance.getDbVendor());
+			sb.append(" or ");
+			appendFuzzyLike(sb, "mode.name", "name", dbInstance.getDbVendor());
+			sb.append(")");
+		}
+		
+		Long id = null;
+		String refs = null;
+		String fuzzyRefs = null;
+		if(StringHelper.containsNonWhitespace(params.getIdAndRefs())) {
+			refs = params.getIdAndRefs();
+			fuzzyRefs = PersistenceHelper.makeFuzzyQueryString(refs);
+			where = appendAnd(sb, where);
+			sb.append(" (v.externalId=:ref or ");
+			PersistenceHelper.appendFuzzyLike(sb, "v.externalRef", "fuzzyRefs", dbInstance.getDbVendor());
+			sb.append(" or v.softkey=:ref");
+			if(StringHelper.isLong(refs)) {
+				try {
+					id = Long.parseLong(refs);
+					sb.append(" or v.key=:vKey or res.resId=:vKey");
+				} catch (NumberFormatException e) {
+					//
+				}
+			}
+			sb.append(")");	
+		}
+		
+		sb.append(" order by mode.beginWithLeadTime desc ");
+
+		TypedQuery<AssessmentMode> query = dbInstance.getCurrentEntityManager()
+				.createQuery(sb.toString(), AssessmentMode.class);
+		if(StringHelper.containsNonWhitespace(params.getName())) {
+			query.setParameter("name", name);
+		}
+		if(id != null) {
+			query.setParameter("vKey", id);
+		}
+		if(refs != null) {
+			query.setParameter("ref", refs);
+		}
+		if(fuzzyRefs != null) {
+			query.setParameter("fuzzyRefs", fuzzyRefs);
+		}
+		if(date != null) {
+			query.setParameter("date", date, TemporalType.TIMESTAMP);
+		}
+		return query.getResultList();
+	}
+	
+	public List<AssessmentMode> getAssessmentModeFor(RepositoryEntryRef entry) {
+		return dbInstance.getCurrentEntityManager()
+				.createNamedQuery("assessmentModeByRepoEntry", AssessmentMode.class)
+				.setParameter("entryKey", entry.getKey())
+				.getResultList();
+	}
+	
+	public List<AssessmentMode> getAssessmentModes(Date now) {
+		Calendar cal = Calendar.getInstance();
+		cal.set(Calendar.MILLISECOND, 0);
+		cal.set(Calendar.SECOND, 0);
+		
+		StringBuilder sb = new StringBuilder();
+		sb.append("select mode from courseassessmentmode mode where ")
+		  .append(" (mode.beginWithLeadTime<=:now and mode.endWithFollowupTime>=:now and mode.manualBeginEnd=false)")
+		  .append(" or mode.statusString in ('").append(Status.leadtime.name()).append("','")
+		  .append(Status.assessment.name()).append("','").append(Status.followup.name()).append("')");
+
+		return dbInstance.getCurrentEntityManager()
+				.createQuery(sb.toString(), AssessmentMode.class)
+				.setParameter("now", now)
+				.getResultList();
+	}
+	
+	public boolean isInAssessmentMode(RepositoryEntryRef entry, Date date) {
+		Calendar cal = Calendar.getInstance();
+		cal.set(Calendar.MILLISECOND, 0);
+		cal.set(Calendar.SECOND, 0);
+		
+		StringBuilder sb = new StringBuilder();
+		sb.append("select count(mode) from courseassessmentmode mode where ")
+		  .append(" mode.repositoryEntry.key=:repoKey and (")
+		  .append(" (mode.beginWithLeadTime<=:now and mode.endWithFollowupTime>=:now and mode.manualBeginEnd=false)")
+		  .append(" or mode.statusString in ('").append(Status.leadtime.name()).append("','")
+		  .append(Status.assessment.name()).append("','").append(Status.followup.name()).append("'))");
+
+		List<Number> count = dbInstance.getCurrentEntityManager()
+				.createQuery(sb.toString(), Number.class)
+				.setParameter("now", date)
+				.setParameter("repoKey", entry.getKey())
+				.getResultList();
+		return count != null && count.size() > 0 && count.get(0).intValue() > 0;
+	}
+	
+	protected List<AssessmentMode> loadAssessmentModeFor(IdentityRef identity, List<AssessmentMode> currentModes) {
+		StringBuilder sb = new StringBuilder(1500);
+		sb.append("select mode from courseassessmentmode mode ")
+		  .append(" inner join fetch mode.repositoryEntry entry")
+		  .append(" left join mode.groups as modeToGroup")
+		  .append(" left join mode.areas as modeToArea")
+		  .append(" where mode.key in (:modeKeys)")
+		  .append("  and ((mode.targetAudienceString in ('").append(AssessmentMode.Target.courseAndGroups.name()).append("','").append(AssessmentMode.Target.groups.name()).append("')")
+		  .append("   and (exists (select businessGroup from ").append(BusinessGroupImpl.class.getName()).append(" as businessGroup, bgroupmember as membership")
+		  .append("     where modeToGroup.businessGroup=businessGroup and membership.group=businessGroup.baseGroup and membership.identity.key=:identityKey")
+		  .append("     and (membership.role='").append(GroupRoles.participant.name()).append("' or ")
+		  .append("       (mode.applySettingsForCoach=true and membership.role='").append(GroupRoles.coach.name()).append("'))")
+		  .append("   ) or exists (select areaToGroup from ").append(BGtoAreaRelationImpl.class.getName()).append(" as areaToGroup,").append(BusinessGroupImpl.class.getName()).append(" as businessGroupArea, bgroupmember as membership")
+		  .append("     where modeToArea.area=areaToGroup.groupArea and areaToGroup.businessGroup=businessGroupArea and membership.group=businessGroupArea.baseGroup and membership.identity.key=:identityKey")
+		  .append("     and (membership.role='").append(GroupRoles.participant.name()).append("' or ")
+		  .append("       (mode.applySettingsForCoach=true and membership.role='").append(GroupRoles.coach.name()).append("'))")
+		  .append("  ))) or (mode.targetAudienceString in ('").append(AssessmentMode.Target.courseAndGroups.name()).append("','").append(AssessmentMode.Target.course.name()).append("')")
+		  .append("   and exists (select rel from repoentrytogroup as rel,  bgroupmember as membership ")
+		  .append("     where mode.repositoryEntry=rel.entry and membership.group=rel.group and rel.defaultGroup=true and membership.identity.key=:identityKey")
+		  .append("     and (membership.role='").append(GroupRoles.participant.name()).append("' or ")
+		  .append("       (mode.applySettingsForCoach=true and membership.role='").append(GroupRoles.coach.name()).append("'))")
+		  .append("  ))")
+		  .append(" )");
+
+		List<Long> modeKeys = new ArrayList<>(currentModes.size());
+		for(AssessmentMode mode:currentModes) {
+			modeKeys.add(mode.getKey());
+		}
+		List<AssessmentMode> modeList = dbInstance.getCurrentEntityManager()
+				.createQuery(sb.toString(), AssessmentMode.class)
+				.setParameter("identityKey", identity.getKey())
+				.setParameter("modeKeys", modeKeys)
+				.getResultList();
+		//quicker than distinct
+		return new ArrayList<AssessmentMode>(new HashSet<AssessmentMode>(modeList));
+	}
+	
+	public void delete(AssessmentMode assessmentMode) {
+		AssessmentModeImpl refMode = dbInstance.getCurrentEntityManager()
+				.getReference(AssessmentModeImpl.class, assessmentMode.getKey());
+		dbInstance.getCurrentEntityManager().remove(refMode);
+	}
+	
+	/**
+	 * Delete all assessment modes of a course.
+	 * 
+	 * @param entry The course
+	 */
+	public void delete(RepositoryEntryRef entry) {
+		for(AssessmentMode mode: getAssessmentModeFor(entry)) {
+			delete(mode);
+		}
+	}
+	
+	public void deleteAssessmentModesToGroup(BusinessGroupRef businessGroup) {
+		String q = "delete from courseassessmentmodetogroup as modegrrel where modegrrel.businessGroup.key=:groupKey";
+		dbInstance.getCurrentEntityManager().createQuery(q)
+			.setParameter("groupKey", businessGroup.getKey())
+			.executeUpdate();
+	}
+	
+	/**
+	 * Delete the relations between assessment mode and group for the specified business group and course.
+	 * @param businessGroup
+	 * @param entry
+	 */
+	public void delete(BusinessGroupRef businessGroup, RepositoryEntryRef entry) {
+		String q = "delete from courseassessmentmodetogroup as modegrrel where modegrrel.businessGroup.key=:groupKey and modegrrel.assessmentMode.key in (select amode.key from courseassessmentmode amode where amode.repositoryEntry.key=:repoKey)";
+		dbInstance.getCurrentEntityManager().createQuery(q)
+			.setParameter("groupKey", businessGroup.getKey())
+			.setParameter("repoKey", entry.getKey())
+			.executeUpdate();
+	}
+
+}
diff --git a/src/main/java/org/olat/course/assessment/manager/AssessmentModeManagerImpl.java b/src/main/java/org/olat/course/assessment/manager/AssessmentModeManagerImpl.java
index 1e5b7ba890e20f2ce20bdd7b78aaa30b570c67d5..ed47a6e2d76831e39299718e7a30ee06e61b677e 100644
--- a/src/main/java/org/olat/course/assessment/manager/AssessmentModeManagerImpl.java
+++ b/src/main/java/org/olat/course/assessment/manager/AssessmentModeManagerImpl.java
@@ -19,9 +19,6 @@
  */
 package org.olat.course.assessment.manager;
 
-import static org.olat.core.commons.persistence.PersistenceHelper.appendAnd;
-import static org.olat.core.commons.persistence.PersistenceHelper.appendFuzzyLike;
-
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Collections;
@@ -31,14 +28,11 @@ import java.util.List;
 import java.util.Set;
 import java.util.StringTokenizer;
 
-import javax.persistence.TemporalType;
-import javax.persistence.TypedQuery;
 import javax.servlet.http.HttpServletRequest;
 
 import org.olat.basesecurity.GroupRoles;
 import org.olat.basesecurity.IdentityRef;
 import org.olat.core.commons.persistence.DB;
-import org.olat.core.commons.persistence.PersistenceHelper;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.Encoder;
@@ -55,11 +49,8 @@ import org.olat.course.assessment.model.AssessmentModeToAreaImpl;
 import org.olat.course.assessment.model.AssessmentModeToGroupImpl;
 import org.olat.course.assessment.model.SearchAssessmentModeParams;
 import org.olat.group.BusinessGroup;
-import org.olat.group.BusinessGroupImpl;
-import org.olat.group.BusinessGroupRef;
 import org.olat.group.area.BGArea;
 import org.olat.group.area.BGAreaManager;
-import org.olat.group.area.BGtoAreaRelationImpl;
 import org.olat.group.manager.BusinessGroupRelationDAO;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryEntryRef;
@@ -84,6 +75,8 @@ public class AssessmentModeManagerImpl implements AssessmentModeManager {
 	@Autowired
 	private BGAreaManager areaMgr;
 	@Autowired
+	private AssessmentModeDAO assessmentModeDao;
+	@Autowired
 	private BusinessGroupRelationDAO businessGroupRelationDao;
 	@Autowired
 	private RepositoryEntryRelationDAO repositoryEntryRelationDao;
@@ -172,103 +165,22 @@ public class AssessmentModeManagerImpl implements AssessmentModeManager {
 
 	@Override
 	public void delete(AssessmentMode assessmentMode) {
-		AssessmentModeImpl refMode = dbInstance.getCurrentEntityManager()
-				.getReference(AssessmentModeImpl.class, assessmentMode.getKey());
-		dbInstance.getCurrentEntityManager().remove(refMode);
-	}
-
-	@Override
-	public void delete(RepositoryEntryRef entry) {
-		for(AssessmentMode mode: getAssessmentModeFor(entry)) {
-			delete(mode);
-		}
+		assessmentModeDao.delete(assessmentMode);
 	}
 
 	@Override
 	public AssessmentMode getAssessmentModeById(Long key) {
-		List<AssessmentMode> modes = dbInstance.getCurrentEntityManager()
-			.createNamedQuery("assessmentModeById", AssessmentMode.class)
-			.setParameter("modeKey", key)
-			.getResultList();
-		
-		return modes == null || modes.isEmpty() ? null : modes.get(0);
+		return assessmentModeDao.getAssessmentModeById(key);
 	}
 
 	@Override
 	public List<AssessmentMode> findAssessmentMode(SearchAssessmentModeParams params) {
-		StringBuilder sb = new StringBuilder();
-		sb.append("select mode from courseassessmentmode mode")
-		  .append(" inner join fetch mode.repositoryEntry v")
-		  .append(" inner join fetch v.olatResource res");
-		
-		boolean where = false;
-		
-		Date date = params.getDate();
-		if(date != null) {
-			where = appendAnd(sb, where);
-			sb.append(":date between mode.beginWithLeadTime and mode.endWithFollowupTime");
-		}
-		
-		String name = params.getName();
-		if(StringHelper.containsNonWhitespace(name)) {
-			name = PersistenceHelper.makeFuzzyQueryString(name);
-			where = appendAnd(sb, where);
-			sb.append("(");
-			appendFuzzyLike(sb, "v.displayname", "name", dbInstance.getDbVendor());
-			sb.append(" or ");
-			appendFuzzyLike(sb, "mode.name", "name", dbInstance.getDbVendor());
-			sb.append(")");
-		}
-		
-		Long id = null;
-		String refs = null;
-		String fuzzyRefs = null;
-		if(StringHelper.containsNonWhitespace(params.getIdAndRefs())) {
-			refs = params.getIdAndRefs();
-			fuzzyRefs = PersistenceHelper.makeFuzzyQueryString(refs);
-			where = appendAnd(sb, where);
-			sb.append(" (v.externalId=:ref or ");
-			PersistenceHelper.appendFuzzyLike(sb, "v.externalRef", "fuzzyRefs", dbInstance.getDbVendor());
-			sb.append(" or v.softkey=:ref");
-			if(StringHelper.isLong(refs)) {
-				try {
-					id = Long.parseLong(refs);
-					sb.append(" or v.key=:vKey or res.resId=:vKey");
-				} catch (NumberFormatException e) {
-					//
-				}
-			}
-			sb.append(")");	
-		}
-		
-		sb.append(" order by mode.beginWithLeadTime desc ");
-
-		TypedQuery<AssessmentMode> query = dbInstance.getCurrentEntityManager()
-				.createQuery(sb.toString(), AssessmentMode.class);
-		if(StringHelper.containsNonWhitespace(params.getName())) {
-			query.setParameter("name", name);
-		}
-		if(id != null) {
-			query.setParameter("vKey", id);
-		}
-		if(refs != null) {
-			query.setParameter("ref", refs);
-		}
-		if(fuzzyRefs != null) {
-			query.setParameter("fuzzyRefs", fuzzyRefs);
-		}
-		if(date != null) {
-			query.setParameter("date", date, TemporalType.TIMESTAMP);
-		}
-		return query.getResultList();
+		return assessmentModeDao.findAssessmentMode(params);
 	}
 
 	@Override
 	public List<AssessmentMode> getAssessmentModeFor(RepositoryEntryRef entry) {
-		return dbInstance.getCurrentEntityManager()
-				.createNamedQuery("assessmentModeByRepoEntry", AssessmentMode.class)
-				.setParameter("entryKey", entry.getKey())
-				.getResultList();
+		return assessmentModeDao.getAssessmentModeFor(entry);
 	}
 
 	@Override
@@ -277,47 +189,10 @@ public class AssessmentModeManagerImpl implements AssessmentModeManager {
 		List<AssessmentMode> myModes = null;
 		if(currentModes.size() > 0) {
 			//check permissions, groups, areas, course
-			myModes = loadAssessmentModeFor(identity, currentModes);
+			myModes = assessmentModeDao.loadAssessmentModeFor(identity, currentModes);
 		}
 		return myModes == null ? Collections.<AssessmentMode>emptyList() : myModes;
 	}
-	
-	private List<AssessmentMode> loadAssessmentModeFor(IdentityRef identity, List<AssessmentMode> currentModes) {
-		StringBuilder sb = new StringBuilder(1500);
-		sb.append("select mode from courseassessmentmode mode ")
-		  .append(" inner join fetch mode.repositoryEntry entry")
-		  .append(" left join mode.groups as modeToGroup")
-		  .append(" left join mode.areas as modeToArea")
-		  .append(" where mode.key in (:modeKeys)")
-		  .append("  and ((mode.targetAudienceString in ('").append(AssessmentMode.Target.courseAndGroups.name()).append("','").append(AssessmentMode.Target.groups.name()).append("')")
-		  .append("   and (exists (select businessGroup from ").append(BusinessGroupImpl.class.getName()).append(" as businessGroup, bgroupmember as membership")
-		  .append("     where modeToGroup.businessGroup=businessGroup and membership.group=businessGroup.baseGroup and membership.identity.key=:identityKey")
-		  .append("     and (membership.role='").append(GroupRoles.participant.name()).append("' or ")
-		  .append("       (mode.applySettingsForCoach=true and membership.role='").append(GroupRoles.coach.name()).append("'))")
-		  .append("   ) or exists (select areaToGroup from ").append(BGtoAreaRelationImpl.class.getName()).append(" as areaToGroup,").append(BusinessGroupImpl.class.getName()).append(" as businessGroupArea, bgroupmember as membership")
-		  .append("     where modeToArea.area=areaToGroup.groupArea and areaToGroup.businessGroup=businessGroupArea and membership.group=businessGroupArea.baseGroup and membership.identity.key=:identityKey")
-		  .append("     and (membership.role='").append(GroupRoles.participant.name()).append("' or ")
-		  .append("       (mode.applySettingsForCoach=true and membership.role='").append(GroupRoles.coach.name()).append("'))")
-		  .append("  ))) or (mode.targetAudienceString in ('").append(AssessmentMode.Target.courseAndGroups.name()).append("','").append(AssessmentMode.Target.course.name()).append("')")
-		  .append("   and exists (select rel from repoentrytogroup as rel,  bgroupmember as membership ")
-		  .append("     where mode.repositoryEntry=rel.entry and membership.group=rel.group and rel.defaultGroup=true and membership.identity.key=:identityKey")
-		  .append("     and (membership.role='").append(GroupRoles.participant.name()).append("' or ")
-		  .append("       (mode.applySettingsForCoach=true and membership.role='").append(GroupRoles.coach.name()).append("'))")
-		  .append("  ))")
-		  .append(" )");
-
-		List<Long> modeKeys = new ArrayList<>(currentModes.size());
-		for(AssessmentMode mode:currentModes) {
-			modeKeys.add(mode.getKey());
-		}
-		List<AssessmentMode> modeList = dbInstance.getCurrentEntityManager()
-				.createQuery(sb.toString(), AssessmentMode.class)
-				.setParameter("identityKey", identity.getKey())
-				.setParameter("modeKeys", modeKeys)
-				.getResultList();
-		//quicker than distinct
-		return new ArrayList<AssessmentMode>(new HashSet<AssessmentMode>(modeList));
-	}
 
 	@Override
 	public Set<Long> getAssessedIdentityKeys(AssessmentMode assessmentMode) {
@@ -363,41 +238,12 @@ public class AssessmentModeManagerImpl implements AssessmentModeManager {
 
 	@Override
 	public List<AssessmentMode> getAssessmentModes(Date now) {
-		Calendar cal = Calendar.getInstance();
-		cal.set(Calendar.MILLISECOND, 0);
-		cal.set(Calendar.SECOND, 0);
-		
-		StringBuilder sb = new StringBuilder();
-		sb.append("select mode from courseassessmentmode mode where ")
-		  .append(" (mode.beginWithLeadTime<=:now and mode.endWithFollowupTime>=:now and mode.manualBeginEnd=false)")
-		  .append(" or mode.statusString in ('").append(Status.leadtime.name()).append("','")
-		  .append(Status.assessment.name()).append("','").append(Status.followup.name()).append("')");
-
-		return dbInstance.getCurrentEntityManager()
-				.createQuery(sb.toString(), AssessmentMode.class)
-				.setParameter("now", now)
-				.getResultList();
+		return assessmentModeDao.getAssessmentModes(now);
 	}
 
 	@Override
 	public boolean isInAssessmentMode(RepositoryEntryRef entry, Date date) {
-		Calendar cal = Calendar.getInstance();
-		cal.set(Calendar.MILLISECOND, 0);
-		cal.set(Calendar.SECOND, 0);
-		
-		StringBuilder sb = new StringBuilder();
-		sb.append("select count(mode) from courseassessmentmode mode where ")
-		  .append(" mode.repositoryEntry.key=:repoKey and (")
-		  .append(" (mode.beginWithLeadTime<=:now and mode.endWithFollowupTime>=:now and mode.manualBeginEnd=false)")
-		  .append(" or mode.statusString in ('").append(Status.leadtime.name()).append("','")
-		  .append(Status.assessment.name()).append("','").append(Status.followup.name()).append("'))");
-
-		List<Number> count = dbInstance.getCurrentEntityManager()
-				.createQuery(sb.toString(), Number.class)
-				.setParameter("now", date)
-				.setParameter("repoKey", entry.getKey())
-				.getResultList();
-		return count != null && count.size() > 0 && count.get(0).intValue() > 0;
+		return assessmentModeDao.isInAssessmentMode(entry, date);
 	}
 
 	@Override
@@ -409,23 +255,6 @@ public class AssessmentModeManagerImpl implements AssessmentModeManager {
 		return modeToGroup;
 	}
 
-	@Override
-	public void deleteAssessmentModesToGroup(BusinessGroupRef businessGroup) {
-		String q = "delete from courseassessmentmodetogroup as modegrrel where modegrrel.businessGroup.key=:groupKey";
-		dbInstance.getCurrentEntityManager().createQuery(q)
-			.setParameter("groupKey", businessGroup.getKey())
-			.executeUpdate();
-	}
-	
-	@Override
-	public void delete(BusinessGroupRef businessGroup, RepositoryEntryRef entry) {
-		String q = "delete from courseassessmentmodetogroup as modegrrel where modegrrel.businessGroup.key=:groupKey and modegrrel.assessmentMode.key in (select amode.key from courseassessmentmode amode where amode.repositoryEntry.key=:repoKey)";
-		dbInstance.getCurrentEntityManager().createQuery(q)
-			.setParameter("groupKey", businessGroup.getKey())
-			.setParameter("repoKey", entry.getKey())
-			.executeUpdate();
-	}
-
 	@Override
 	public AssessmentModeToArea createAssessmentModeToArea(AssessmentMode mode, BGArea area) {
 		AssessmentModeToAreaImpl modeToArea = new AssessmentModeToAreaImpl();
diff --git a/src/main/java/org/olat/group/manager/BusinessGroupRelationDAO.java b/src/main/java/org/olat/group/manager/BusinessGroupRelationDAO.java
index e009a6411797a3c10497290e5b5735c8912d6dfd..ffed87984854c147f7f43edc77162ec690382289 100644
--- a/src/main/java/org/olat/group/manager/BusinessGroupRelationDAO.java
+++ b/src/main/java/org/olat/group/manager/BusinessGroupRelationDAO.java
@@ -40,7 +40,7 @@ import org.olat.core.commons.persistence.DB;
 import org.olat.core.commons.persistence.PersistenceHelper;
 import org.olat.core.id.Identity;
 import org.olat.core.util.StringHelper;
-import org.olat.course.assessment.AssessmentModeManager;
+import org.olat.course.assessment.manager.AssessmentModeDAO;
 import org.olat.group.BusinessGroup;
 import org.olat.group.BusinessGroupImpl;
 import org.olat.group.BusinessGroupRef;
@@ -67,7 +67,7 @@ public class BusinessGroupRelationDAO {
 	@Autowired
 	private GroupDAO groupDao;
 	@Autowired
-	private AssessmentModeManager assessmentModeMgr;
+	private AssessmentModeDAO assessmentModeDao;
 	@Autowired
 	private RepositoryEntryRelationDAO repositoryEntryRelationDao;
 	
@@ -372,7 +372,7 @@ public class BusinessGroupRelationDAO {
 	}
 	
 	public void deleteRelation(BusinessGroup group, RepositoryEntryRef entry) {
-		assessmentModeMgr.delete(group, entry);
+		assessmentModeDao.delete(group, entry);
 		repositoryEntryRelationDao.removeRelation(group.getBaseGroup(), entry);
 	}
 	
diff --git a/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java b/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java
index 59fcf59e3ab656025cb7f651b52c6c2dc4948569..26232e480a405ec8f7c8a8bdc8ed258da79d3026 100644
--- a/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java
+++ b/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java
@@ -68,7 +68,7 @@ import org.olat.core.util.mail.MailTemplate;
 import org.olat.core.util.mail.MailerResult;
 import org.olat.core.util.resource.OLATResourceableJustBeforeDeletedEvent;
 import org.olat.core.util.resource.OresHelper;
-import org.olat.course.assessment.AssessmentModeManager;
+import org.olat.course.assessment.manager.AssessmentModeDAO;
 import org.olat.group.BusinessGroup;
 import org.olat.group.BusinessGroupAddResponse;
 import org.olat.group.BusinessGroupManagedFlag;
@@ -148,7 +148,7 @@ public class BusinessGroupServiceImpl implements BusinessGroupService, UserDataD
 	@Autowired
 	private ContactDAO contactDao;
 	@Autowired
-	private AssessmentModeManager assessmentModeMgr;
+	private AssessmentModeDAO assessmentModeDao;
 	@Autowired
 	private BusinessGroupRelationDAO businessGroupRelationDAO;
 	@Autowired
@@ -750,7 +750,7 @@ public class BusinessGroupServiceImpl implements BusinessGroupService, UserDataD
 			areaManager.deleteBGtoAreaRelations(group);
 			// 3) Delete the relations
 			businessGroupRelationDAO.deleteRelationsToRepositoryEntry(group);
-			assessmentModeMgr.deleteAssessmentModesToGroup(group);
+			assessmentModeDao.deleteAssessmentModesToGroup(group);
 			// 4) delete properties
 			propertyManager.deleteProperties(null, group, null, null, null);
 			propertyManager.deleteProperties(null, null, group, null, null);
diff --git a/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java b/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java
index 8fea6e25bf641ba7e59b9216b5f91448bf5f9e3a..8aaa4288bb276117df47a5926fa6bb90bba0122f 100644
--- a/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java
+++ b/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java
@@ -52,7 +52,7 @@ import org.olat.core.util.vfs.LocalFolderImpl;
 import org.olat.core.util.vfs.VFSContainer;
 import org.olat.core.util.vfs.VFSItem;
 import org.olat.core.util.vfs.VFSLeaf;
-import org.olat.course.assessment.AssessmentModeManager;
+import org.olat.course.assessment.manager.AssessmentModeDAO;
 import org.olat.course.assessment.manager.UserCourseInformationsManager;
 import org.olat.course.certificate.CertificatesManager;
 import org.olat.repository.ErrorList;
@@ -117,7 +117,7 @@ public class RepositoryServiceImpl implements RepositoryService {
 	@Autowired
 	private UserCourseInformationsManager userCourseInformationsManager;
 	@Autowired
-	private AssessmentModeManager assessmentModeMgr;
+	private AssessmentModeDAO assessmentModeDao;
 
 	@Autowired
 	private LifeFullIndexer lifeIndexer;
@@ -309,7 +309,7 @@ public class RepositoryServiceImpl implements RepositoryService {
 		// delete all catalog entries referencing deleted entry
 		catalogManager.resourceableDeleted(entry);
 		// delete assessment modes
-		assessmentModeMgr.delete(entry);
+		assessmentModeDao.delete(entry);
 		
 		//delete all policies
 		securityManager.deletePolicies(resource);