diff --git a/src/main/java/org/olat/commons/calendar/CalendarUtils.java b/src/main/java/org/olat/commons/calendar/CalendarUtils.java
index 995f1b2eb2d0c87b27ef84134de938c9afc771c1..a7620f7fb033819791ec000e9a3bbfc688bc885a 100644
--- a/src/main/java/org/olat/commons/calendar/CalendarUtils.java
+++ b/src/main/java/org/olat/commons/calendar/CalendarUtils.java
@@ -400,6 +400,14 @@ public class CalendarUtils {
 		return cal.getTime();
 	}
 	
+	public static boolean isWorkingDay(Date date) {
+		if(date == null) return false;
+		
+		Calendar cal = Calendar.getInstance();
+		cal.setTime(date);
+		int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
+		return dayOfWeek != Calendar.SATURDAY && dayOfWeek != Calendar.SUNDAY;
+	}
 	
 	public static Long convertSecondsToMinutes(Long timeInSeconds) {
 		if(timeInSeconds != null && timeInSeconds.longValue() > 0) {
diff --git a/src/main/java/org/olat/modules/grading/GradingService.java b/src/main/java/org/olat/modules/grading/GradingService.java
index 231839282421f97733dca47cbac2fa60850968bd..b5139b3da42990de7145f58692576c33ae6a34fa 100644
--- a/src/main/java/org/olat/modules/grading/GradingService.java
+++ b/src/main/java/org/olat/modules/grading/GradingService.java
@@ -245,5 +245,9 @@ public interface GradingService {
 	 */
 	public void sendGradersAsssignmentsNotification();
 
-
+	/**
+	 * Check and eventually reassign graders which are on
+	 * absence leave.
+	 */
+	public void graderAbsenceLeavesCheckWorkingDays();
 }
diff --git a/src/main/java/org/olat/modules/grading/manager/GraderReminderJob.java b/src/main/java/org/olat/modules/grading/manager/GraderReminderJob.java
index 17de172e473f2c609927574bf727f57689233ac9..c1b5df81bc53b9b9828161ed2a20b2942ddeff7a 100644
--- a/src/main/java/org/olat/modules/grading/manager/GraderReminderJob.java
+++ b/src/main/java/org/olat/modules/grading/manager/GraderReminderJob.java
@@ -36,7 +36,9 @@ public class GraderReminderJob extends JobWithDB {
 
 	@Override
 	public void executeWithDB(JobExecutionContext arg0) {
-		CoreSpringFactory.getImpl(GradingService.class).sendReminders();
-		CoreSpringFactory.getImpl(GradingService.class).sendGradersAsssignmentsNotification();
+		GradingService gradingService = CoreSpringFactory.getImpl(GradingService.class);
+		gradingService.sendReminders();
+		gradingService.sendGradersAsssignmentsNotification();
+		gradingService.graderAbsenceLeavesCheckWorkingDays();
 	}
 }
diff --git a/src/main/java/org/olat/modules/grading/manager/GraderToIdentityDAO.java b/src/main/java/org/olat/modules/grading/manager/GraderToIdentityDAO.java
index 02c45e84042670020001b730f6e9c0abea853680..eebfbe38a3672375b67e376cb3ca4f73a96b315e 100644
--- a/src/main/java/org/olat/modules/grading/manager/GraderToIdentityDAO.java
+++ b/src/main/java/org/olat/modules/grading/manager/GraderToIdentityDAO.java
@@ -313,6 +313,29 @@ public class GraderToIdentityDAO {
 		return records;
 	}
 	
+	public List<GraderToIdentity> findGradersWithAssignmentInAbsenceLeave(Date date) {
+		QueryBuilder sb = new QueryBuilder();
+		sb.append("select rel from grader2identity as rel")
+		  .append(" inner join fetch rel.identity as ident")
+		  .append(" inner join userabsenceleave as leave on (ident.key=leave.identity.key)")
+		  .append(" inner join gradingassignment as assignment on (assignment.grader.key=rel.key)")
+		  .append(" where assignment.status ").in(GradingAssignmentStatus.assigned, GradingAssignmentStatus.inProcess)
+		  .append(" and (")
+		  .append("  (leave.absentFrom is null and leave.absentTo>=:date)")
+		  .append("  or")
+		  .append("  (leave.absentFrom<=:date and leave.absentTo is null)")
+		  .append("  or")
+		  .append("  (leave.absentFrom<=:date and leave.absentTo>=:date)")
+		  .append("  or")
+		  .append("  (leave.absentFrom is null and leave.absentTo is null)")
+		  .append(" )");
+
+		return dbInstance.getCurrentEntityManager()
+			.createQuery(sb.toString(), GraderToIdentity.class)
+			.setParameter("date", date)
+			.getResultList();
+	}
+	
 	public List<AbsenceLeave> findGradersAbsenceLeaves(GradersSearchParameters searchParams, Date from, Date to) {
 		QueryBuilder sb = new QueryBuilder();
 		sb.append("select distinct leave from userabsenceleave as leave")
diff --git a/src/main/java/org/olat/modules/grading/manager/GradingAssignmentDAO.java b/src/main/java/org/olat/modules/grading/manager/GradingAssignmentDAO.java
index d1b266b7cd3bf0b12c3f900993b6cdd24a4a64fb..7f569e1049eb4e406160408aa4c6c6db363a9ffe 100644
--- a/src/main/java/org/olat/modules/grading/manager/GradingAssignmentDAO.java
+++ b/src/main/java/org/olat/modules/grading/manager/GradingAssignmentDAO.java
@@ -104,6 +104,16 @@ public class GradingAssignmentDAO {
 				.getResultList();
 	}
 	
+	public List<GradingAssignment> getGradingAssignments(GraderToIdentity grader, GradingAssignmentStatus... assignmentStatus) {
+		QueryBuilder sb = new QueryBuilder();
+		sb.append("select assignment from gradingassignment as assignment")
+		  .append(" where assignment.grader.key=:graderKey and assignment.status ").in(assignmentStatus);
+		return dbInstance.getCurrentEntityManager()
+				.createQuery(sb.toString(), GradingAssignment.class)
+				.setParameter("graderKey", grader.getKey())
+				.getResultList();
+	}
+	
 	public List<GradingAssignment> getGradingAssignments(IdentityRef grader) {
 		QueryBuilder sb = new QueryBuilder();
 		sb.append("select assignment from gradingassignment as assignment")
diff --git a/src/main/java/org/olat/modules/grading/manager/GradingServiceImpl.java b/src/main/java/org/olat/modules/grading/manager/GradingServiceImpl.java
index 3bed6a7eebeac686757b82ef54dc267b04d09858..9179ca62bc6d0dc117b8e3a19a921559632efe5f 100644
--- a/src/main/java/org/olat/modules/grading/manager/GradingServiceImpl.java
+++ b/src/main/java/org/olat/modules/grading/manager/GradingServiceImpl.java
@@ -26,6 +26,7 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
@@ -38,12 +39,15 @@ import org.olat.basesecurity.IdentityRef;
 import org.olat.commons.calendar.CalendarUtils;
 import org.olat.core.commons.persistence.DB;
 import org.olat.core.commons.persistence.QueryBuilder;
+import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.Identity;
 import org.olat.core.id.Roles;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.StringHelper;
+import org.olat.core.util.Util;
 import org.olat.core.util.cache.CacheWrapper;
 import org.olat.core.util.coordinate.CoordinatorManager;
+import org.olat.core.util.i18n.I18nManager;
 import org.olat.core.util.mail.MailBundle;
 import org.olat.core.util.mail.MailContext;
 import org.olat.core.util.mail.MailContextImpl;
@@ -79,6 +83,7 @@ import org.olat.modules.grading.model.OlatResourceMapKey;
 import org.olat.modules.grading.model.ReferenceEntryStatistics;
 import org.olat.modules.grading.model.ReferenceEntryTimeRecordStatistics;
 import org.olat.modules.grading.model.ReferenceEntryWithStatistics;
+import org.olat.modules.grading.ui.GradingAssignmentsListController;
 import org.olat.modules.grading.ui.component.GraderMailTemplate;
 import org.olat.modules.taxonomy.TaxonomyLevel;
 import org.olat.modules.taxonomy.TaxonomyModule;
@@ -365,6 +370,8 @@ public class GradingServiceImpl implements GradingService, UserDataDeletable, Re
 		if(graderRelation != null && graderRelation.getGraderStatus() != GraderStatus.activated) {
 			graderRelation.setGraderStatus(GraderStatus.activated);
 			graderRelation = gradedToIdentityDao.updateGrader(graderRelation);
+			log.info(Tracing.M_AUDIT, "Activate grader {} in resource {} ({})",
+					graderRelation.getIdentity(), graderRelation.getEntry().getKey(), graderRelation.getEntry().getDisplayname());
 		}
 		return graderRelation;
 	}
@@ -396,6 +403,10 @@ public class GradingServiceImpl implements GradingService, UserDataDeletable, Re
 		graderRelation.setGraderStatus(GraderStatus.deactivated);
 		graderRelation = gradedToIdentityDao.updateGrader(graderRelation);
 		dbInstance.commit();
+
+		log.info(Tracing.M_AUDIT, "Deactivate grader {} {}",
+				graderRelation.getKey(), graderRelation.getIdentity());
+		
 		moveAssignments(graderRelation, replacementGrader, reassignmentTemplate, result);
 	}
 
@@ -789,7 +800,10 @@ public class GradingServiceImpl implements GradingService, UserDataDeletable, Re
 			grader.setGraderStatus(GraderStatus.activated);
 			grader = gradedToIdentityDao.updateGrader(grader);
 		}
-		
+		return assignGrader(assignment, grader, mailTemplate, result);
+	}
+	
+	private GradingAssignment assignGrader(GradingAssignment assignment, GraderToIdentity grader, GraderMailTemplate mailTemplate, MailerResult result) {
 		assignment = gradingAssignmentDao.loadByKey(assignment.getKey());
 		assignment.setAssignmentStatus(GradingAssignmentStatus.assigned);
 		assignment.setExtendedDeadline(null);
@@ -800,6 +814,9 @@ public class GradingServiceImpl implements GradingService, UserDataDeletable, Re
 		assignment = gradingAssignmentDao.updateAssignment(assignment);
 		dbInstance.commit();
 		
+		log.info(Tracing.M_AUDIT, "Assign assignment {} to grader {} ({})",
+				assignment.getKey(), grader.getKey(), grader.getIdentity());
+		
 		if(mailTemplate != null) {
 			MailContext context = new MailContextImpl("[CoachSite:0][Grading:0]");
 			decorateGraderMailTemplate(assignment, mailTemplate);
@@ -818,7 +835,9 @@ public class GradingServiceImpl implements GradingService, UserDataDeletable, Re
 		assignment.setReminder1Date(null);
 		assignment.setReminder2Date(null);
 		((GradingAssignmentImpl)assignment).setGrader(null);
-		return gradingAssignmentDao.updateAssignment(assignment);
+		assignment = gradingAssignmentDao.updateAssignment(assignment);
+		log.info(Tracing.M_AUDIT, "Unassign assignment {}", assignment.getKey());
+		return assignment;
 	}
 
 	@Override
@@ -832,6 +851,7 @@ public class GradingServiceImpl implements GradingService, UserDataDeletable, Re
 			timeRecord.setMetadataTime(metadataTime.longValue());
 			gradingTimeRecordDao.updateTimeRecord(timeRecord);
 		}
+		log.info(Tracing.M_AUDIT, "Assignment done {}", assignment.getKey());
 		return assignment;
 	}
 	
@@ -840,7 +860,9 @@ public class GradingServiceImpl implements GradingService, UserDataDeletable, Re
 		assignment = gradingAssignmentDao.loadByKey(assignment.getKey());
 		assignment.setAssignmentStatus(GradingAssignmentStatus.assigned);
 		assignment.setClosingDate(null);
-		return gradingAssignmentDao.updateAssignment(assignment);
+		assignment = gradingAssignmentDao.updateAssignment(assignment);
+		log.info(Tracing.M_AUDIT, "Assignment reopened {}", assignment.getKey());
+		return assignment;
 	}
 
 	@Override
@@ -968,4 +990,79 @@ public class GradingServiceImpl implements GradingService, UserDataDeletable, Re
 		}
 		return elementTitle;
 	}
+	
+	@Override
+	public void graderAbsenceLeavesCheckWorkingDays() {
+		Date now = new Date();
+		if(CalendarUtils.isWorkingDay(now)) {
+			graderAbsenceLeavesCheck();
+		}
+	}
+
+	public void graderAbsenceLeavesCheck() {
+		List<GraderToIdentity> graders = gradedToIdentityDao.findGradersWithAssignmentInAbsenceLeave(new Date());
+		for(GraderToIdentity grader:graders) {
+			reassignGraderAssignments(grader);
+		}
+	}
+	
+	/**
+	 * The method make a rigorous check of the absence leaves
+	 * per resource.
+	 * 
+	 * @param grader The grader to reassign
+	 */
+	private void reassignGraderAssignments(GraderToIdentity grader) {
+		String language = grader.getIdentity().getUser().getPreferences().getLanguage();
+		Locale locale = I18nManager.getInstance().getLocaleOrDefault(language);
+		List<GradingAssignment> assignments = gradingAssignmentDao.getGradingAssignments(grader,
+				GradingAssignmentStatus.assigned, GradingAssignmentStatus.inProcess);
+		Translator translator = Util.createPackageTranslator(GradingAssignmentsListController.class, locale);
+		
+		List<AbsenceLeave> absenceLeaves = absenceLeaveDao.getAbsenceLeaves(grader.getIdentity());
+		
+		for(GradingAssignment assignment:assignments) {
+			RepositoryEntry referenceEntry = assignment.getReferenceEntry();
+			boolean matchAbsence = false;
+			for(AbsenceLeave absenceLeave:absenceLeaves) {
+				if(AbsenceLeaveHelper.isOnLeave(new Date(), absenceLeave, referenceEntry.getOlatResource(), null)) {
+					matchAbsence = true;
+				}
+			}
+			
+			if(matchAbsence) {
+				log.info(Tracing.M_AUDIT, "Reassign assigment ({}) of grader on absence leaves {} in resource {} ({})",
+						assignment.getKey(), grader.getIdentity().getKey(), referenceEntry.getKey(), referenceEntry.getDisplayname());
+			
+				RepositoryEntryGradingConfiguration config = gradingConfigurationDao.getConfiguration(referenceEntry);
+				unassignGrader(assignment);
+				dbInstance.commit();
+				
+				MailerResult result = new MailerResult();
+				GraderToIdentity replacementGrader = selectGrader(referenceEntry);
+				if(replacementGrader != null) {
+					String subject;
+					if(config != null && StringHelper.containsNonWhitespace(config.getNotificationSubject())) {
+						subject = config.getNotificationSubject();
+					} else {
+						subject = translator.translate("mail.notification.subject");
+					}
+					
+					String body;
+					if(config != null && StringHelper.containsNonWhitespace(config.getNotificationBody())) {
+						body = config.getNotificationBody();
+					} else {
+						body = translator.translate("mail.notification.body");
+					}
+					
+					GraderMailTemplate reassignmentTemplate = new GraderMailTemplate("Notification", subject, body, null, null, referenceEntry);
+					assignGrader(assignment, replacementGrader, reassignmentTemplate, result);
+					
+					log.info(Tracing.M_AUDIT, "Reassignment of {} from grader {} (due to absence leaves) to {} in resource {} ({})",
+							assignment.getKey(), grader.getIdentity(), replacementGrader.getIdentity(), referenceEntry.getKey(), referenceEntry.getDisplayname());
+				}
+			}
+			dbInstance.commit();
+		}
+	}
 }
diff --git a/src/main/java/org/olat/modules/grading/ui/GradingAssignmentsListController.java b/src/main/java/org/olat/modules/grading/ui/GradingAssignmentsListController.java
index cb9be7a5ffaaad832825573a7cc35f2ae9f604c3..50374c615e30efa1efa0410dcc9f93c39c8d3c41 100644
--- a/src/main/java/org/olat/modules/grading/ui/GradingAssignmentsListController.java
+++ b/src/main/java/org/olat/modules/grading/ui/GradingAssignmentsListController.java
@@ -822,7 +822,7 @@ public class GradingAssignmentsListController extends FormBasicController implem
 		templates.add(new GraderMailTemplate(translate("template.grader.to"), 
 				translate("mail.grader.to.entry.subject"), translate("mail.grader.to.entry.body"), entry, null, referenceEntry));	
 		templates.add(new GraderMailTemplate(translate("template.notification"), 
-				translate("mail.notification.subject"), translate("mail.notification.subject"), entry, null, referenceEntry));
+				translate("mail.notification.subject"), translate("mail.notification.body"), entry, null, referenceEntry));
 		templates.add(new GraderMailTemplate(translate("template.reminder1"),
 				translate("mail.reminder1.subject"), translate("mail.reminder1.body"), entry, null, referenceEntry));
 		templates.add(new GraderMailTemplate(translate("template.reminder2"), 
diff --git a/src/test/java/org/olat/modules/grading/manager/GraderToIdentityDAOTest.java b/src/test/java/org/olat/modules/grading/manager/GraderToIdentityDAOTest.java
index 8a749c23d489147148687742a51f9c45b00b2669..36ffb853a52f40242b811ea642553e7e5da75a79 100644
--- a/src/test/java/org/olat/modules/grading/manager/GraderToIdentityDAOTest.java
+++ b/src/test/java/org/olat/modules/grading/manager/GraderToIdentityDAOTest.java
@@ -212,6 +212,53 @@ public class GraderToIdentityDAOTest extends OlatTestCase {
 		Assert.assertFalse(graderAbsenceLeaves.contains(absenceLeave4));
 	}
 	
+	@Test
+	public void findGradersWithAssignmentInAbsenceLeave() {
+		Identity grader1 = JunitTestHelper.createAndPersistIdentityAsRndUser("grader-50");
+		Identity grader2 = JunitTestHelper.createAndPersistIdentityAsRndUser("grader-51");
+		Identity grader3 = JunitTestHelper.createAndPersistIdentityAsRndUser("grader-52");
+		Identity student1 = JunitTestHelper.createAndPersistIdentityAsRndUser("student-53");
+		Identity student2 = JunitTestHelper.createAndPersistIdentityAsRndUser("student-54");
+		Identity student3 = JunitTestHelper.createAndPersistIdentityAsRndUser("student-55");
+		RepositoryEntry entry = JunitTestHelper.createRandomRepositoryEntry(grader1);
+		dbInstance.commitAndCloseSession();
+		
+		GraderToIdentity relation1 = gradedToIdentityDao.createRelation(entry, grader1);
+		GraderToIdentity relation2 = gradedToIdentityDao.createRelation(entry, grader2);
+		GraderToIdentity relation3 = gradedToIdentityDao.createRelation(entry, grader3);
+		dbInstance.commit();
+		
+		AssessmentEntry assessment1 = assessmentEntryDao
+				.createAssessmentEntry(student1, null, entry, null, Boolean.TRUE, entry);
+		AssessmentEntry assessment2 = assessmentEntryDao
+				.createAssessmentEntry(student2, null, entry, null, Boolean.TRUE, entry);
+		AssessmentEntry assessment3 = assessmentEntryDao
+				.createAssessmentEntry(student3, null, entry, null, Boolean.TRUE, entry);
+		
+		gradingAssignmentDao.createGradingAssignment(relation1, entry, assessment1, null, null);
+		gradingAssignmentDao.createGradingAssignment(relation2, entry, assessment2, null, null);
+		gradingAssignmentDao.createGradingAssignment(relation3, entry, assessment3, null, null);
+		dbInstance.commit();
+
+		absenceLeaveDao.createAbsenceLeave(grader1, addDaysToNow(-25), addDaysToNow(-10), null, null);
+		absenceLeaveDao.createAbsenceLeave(grader1, addDaysToNow(23), addDaysToNow(35), entry.getOlatResource(), "76325457");
+		absenceLeaveDao.createAbsenceLeave(grader2, null, null, null, null);
+		dbInstance.commit();
+	
+		List<GraderToIdentity> onLeavesNow = gradedToIdentityDao.findGradersWithAssignmentInAbsenceLeave(new Date());
+		Assert.assertFalse(onLeavesNow.isEmpty());
+		Assert.assertFalse(onLeavesNow.contains(relation1));
+		Assert.assertTrue(onLeavesNow.contains(relation2));
+		Assert.assertFalse(onLeavesNow.contains(relation3));
+		
+		//
+		List<GraderToIdentity> onLeavesInThePast = gradedToIdentityDao.findGradersWithAssignmentInAbsenceLeave(addDaysToNow(-15));
+		Assert.assertFalse(onLeavesInThePast.isEmpty());
+		Assert.assertTrue(onLeavesInThePast.contains(relation1));
+		Assert.assertTrue(onLeavesInThePast.contains(relation2));
+		Assert.assertFalse(onLeavesInThePast.contains(relation3));
+	}
+	
 	@Test
 	public void getGrader() {
 		Identity grader = JunitTestHelper.createAndPersistIdentityAsRndUser("grader-5");
diff --git a/src/test/java/org/olat/modules/grading/manager/GradingAssignmentDAOTest.java b/src/test/java/org/olat/modules/grading/manager/GradingAssignmentDAOTest.java
index 6c0d8dd81679a46f832765308266606df0310b9e..88246e0c2166debe3eb57e9c9018ce227562a810 100644
--- a/src/test/java/org/olat/modules/grading/manager/GradingAssignmentDAOTest.java
+++ b/src/test/java/org/olat/modules/grading/manager/GradingAssignmentDAOTest.java
@@ -33,6 +33,7 @@ import org.olat.modules.assessment.AssessmentEntry;
 import org.olat.modules.assessment.manager.AssessmentEntryDAO;
 import org.olat.modules.grading.GraderToIdentity;
 import org.olat.modules.grading.GradingAssignment;
+import org.olat.modules.grading.GradingAssignmentStatus;
 import org.olat.modules.grading.RepositoryEntryGradingConfiguration;
 import org.olat.modules.grading.model.GradingAssignmentSearchParameters;
 import org.olat.modules.grading.model.GradingAssignmentWithInfos;
@@ -257,6 +258,52 @@ public class GradingAssignmentDAOTest extends OlatTestCase {
 		Assert.assertTrue(assignments.contains(assignment));
 	}
 	
+	@Test
+	public void getGradingAssignments_graderToIdentity() {
+		Identity author = JunitTestHelper.createAndPersistIdentityAsRndUser("assignment-author-60");
+		Identity grader = JunitTestHelper.createAndPersistIdentityAsRndUser("assignment-grader-61");
+		Identity student = JunitTestHelper.createAndPersistIdentityAsRndUser("assignment-student-62");
+		RepositoryEntry entry = JunitTestHelper.createRandomRepositoryEntry(author);
+		AssessmentEntry assessment = assessmentEntryDao
+				.createAssessmentEntry(student, null, entry, null, false, entry);
+
+		GraderToIdentity relation = gradedToIdentityDao.createRelation(entry, grader);
+		GradingAssignment assignment = gradingAssignmentDao.createGradingAssignment(relation, entry, assessment, null, new Date());
+		dbInstance.commitAndCloseSession();
+		
+		List<GradingAssignment> assignments = gradingAssignmentDao.getGradingAssignments(relation);
+		Assert.assertNotNull(assignments);
+		Assert.assertEquals(1, assignments.size());
+		Assert.assertTrue(assignments.contains(assignment));
+	}
+	
+	@Test
+	public void getGradingAssignments_graderToIdentityAndStatus() {
+		Identity author = JunitTestHelper.createAndPersistIdentityAsRndUser("assignment-author-60");
+		Identity grader = JunitTestHelper.createAndPersistIdentityAsRndUser("assignment-grader-61");
+		Identity student = JunitTestHelper.createAndPersistIdentityAsRndUser("assignment-student-62");
+		RepositoryEntry entry = JunitTestHelper.createRandomRepositoryEntry(author);
+		AssessmentEntry assessment = assessmentEntryDao
+				.createAssessmentEntry(student, null, entry, null, false, entry);
+
+		GraderToIdentity relation = gradedToIdentityDao.createRelation(entry, grader);
+		GradingAssignment assignment = gradingAssignmentDao.createGradingAssignment(relation, entry, assessment, null, new Date());
+		dbInstance.commitAndCloseSession();
+		
+		// assigned and in progress
+		List<GradingAssignment> assignments = gradingAssignmentDao.getGradingAssignments(relation,
+				GradingAssignmentStatus.assigned, GradingAssignmentStatus.inProcess);
+		Assert.assertNotNull(assignments);
+		Assert.assertEquals(1, assignments.size());
+		Assert.assertTrue(assignments.contains(assignment));
+		
+		// unassigned -> empty
+		List<GradingAssignment> unAssignments = gradingAssignmentDao.getGradingAssignments(relation,
+				GradingAssignmentStatus.unassigned);
+		Assert.assertNotNull(unAssignments);
+		Assert.assertTrue(unAssignments.isEmpty());
+	}
+	
 	@Test
 	public void findGradingAssignments_all() {
 		Identity author = JunitTestHelper.createAndPersistIdentityAsRndUser("assignment-author-10");
diff --git a/src/test/java/org/olat/modules/grading/manager/GradingServiceTest.java b/src/test/java/org/olat/modules/grading/manager/GradingServiceTest.java
index fb4cc7ebc9ba2d81999069208c5ef670c21f3aa4..1e6205cfa03c3e0d6b45c6f86d4a0e281950b255 100644
--- a/src/test/java/org/olat/modules/grading/manager/GradingServiceTest.java
+++ b/src/test/java/org/olat/modules/grading/manager/GradingServiceTest.java
@@ -30,6 +30,7 @@ import org.junit.Assert;
 import org.junit.Test;
 import org.olat.core.commons.persistence.DB;
 import org.olat.core.id.Identity;
+import org.olat.core.util.mail.MailerResult;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.modules.assessment.AssessmentEntry;
 import org.olat.modules.assessment.manager.AssessmentEntryDAO;
@@ -693,6 +694,110 @@ public class GradingServiceTest extends OlatTestCase {
 		Assert.assertEquals(16060l, stats.getRecordedTimeInSeconds());
 	}
 	
+	@Test
+	public void graderAbsencesLeavesReassignment() {
+		Identity author = JunitTestHelper.createAndPersistIdentityAsRndUser("assign-40");
+		RepositoryEntry entry = JunitTestHelper.createRandomRepositoryEntry(author);
+		
+		int numOfAssessmentEntries = 6;
+		List<AssessmentEntry> assessmentEntries = new ArrayList<>();
+		for(int i=0; i<numOfAssessmentEntries; i++) {
+			Identity student = JunitTestHelper.createAndPersistIdentityAsRndUser("assign-3-" + i);
+			AssessmentEntry assessment = assessmentEntryDao.createAssessmentEntry(student, null, entry, null, false, entry);
+			assessmentEntries.add(assessment);
+		}
+
+		Identity grader1 = JunitTestHelper.createAndPersistIdentityAsRndUser("assign-41");
+		Identity grader2 = JunitTestHelper.createAndPersistIdentityAsRndUser("assign-42");
+		GraderToIdentity graderRelation1 = gradedToIdentityDao.createRelation(entry, grader1);
+		GraderToIdentity graderRelation2 = gradedToIdentityDao.createRelation(entry, grader2);
+		dbInstance.commit();
+		Assert.assertNotNull(graderRelation1);
+		Assert.assertNotNull(graderRelation2);
+		
+		for(AssessmentEntry assessmentEntry:assessmentEntries) {
+			gradingService.assignGrader(entry, assessmentEntry, true);
+		}
+		dbInstance.commit();
+
+		absenceLeaveDao.createAbsenceLeave(grader1, addDaysToNow(-5), addDaysToNow(5), null, null);
+		dbInstance.commitAndCloseSession();
+		
+		((GradingServiceImpl)gradingService).graderAbsenceLeavesCheck();
+		dbInstance.commitAndCloseSession();
+		
+		List<GradingAssignment> assignments1 = gradingAssignmentDao.getGradingAssignments(grader1);
+		Assert.assertTrue(assignments1.isEmpty());
+		
+		List<GradingAssignment> assignments2 = gradingAssignmentDao.getGradingAssignments(grader2);
+		Assert.assertEquals(6, assignments2.size());
+	}
+	
+	@Test
+	public void deactivateGrader() {
+		Identity author = JunitTestHelper.createAndPersistIdentityAsRndUser("assign-40");
+		RepositoryEntry entry = JunitTestHelper.createRandomRepositoryEntry(author);
+		
+		int numOfAssessmentEntries = 4;
+		List<AssessmentEntry> assessmentEntries = new ArrayList<>();
+		for(int i=0; i<numOfAssessmentEntries; i++) {
+			Identity student = JunitTestHelper.createAndPersistIdentityAsRndUser("assign-3-" + i);
+			AssessmentEntry assessment = assessmentEntryDao.createAssessmentEntry(student, null, entry, null, false, entry);
+			assessmentEntries.add(assessment);
+		}
+
+		Identity grader1 = JunitTestHelper.createAndPersistIdentityAsRndUser("assign-41");
+		Identity grader2 = JunitTestHelper.createAndPersistIdentityAsRndUser("assign-42");
+		GraderToIdentity graderRelation1 = gradedToIdentityDao.createRelation(entry, grader1);
+		dbInstance.commit();
+		Assert.assertNotNull(graderRelation1);
+		
+		for(AssessmentEntry assessmentEntry:assessmentEntries) {
+			gradingService.assignGrader(entry, assessmentEntry, true);
+		}
+		dbInstance.commit();
+
+		// deactivate the first grader
+		MailerResult result = new MailerResult();
+		gradingService.deactivateGrader(grader1, grader2, null, result);
+		dbInstance.commitAndCloseSession();
+		
+		// checked that the assignments was transfered
+		List<GradingAssignment> assignments1 = gradingAssignmentDao.getGradingAssignments(grader1);
+		Assert.assertTrue(assignments1.isEmpty());
+		List<GradingAssignment> assignments2 = gradingAssignmentDao.getGradingAssignments(grader2);
+		Assert.assertEquals(4, assignments2.size());
+	}
+	
+	@Test
+	public void unassignGrader() {
+		Identity author = JunitTestHelper.createAndPersistIdentityAsRndUser("assign-50");
+		RepositoryEntry entry = JunitTestHelper.createRandomRepositoryEntry(author);
+
+		Identity student = JunitTestHelper.createAndPersistIdentityAsRndUser("assign-51");
+		AssessmentEntry assessment = assessmentEntryDao.createAssessmentEntry(student, null, entry, null, false, entry);
+		Identity grader = JunitTestHelper.createAndPersistIdentityAsRndUser("assign-41");
+		GraderToIdentity graderRelation = gradedToIdentityDao.createRelation(entry, grader);
+		dbInstance.commit();
+		
+		gradingService.assignGrader(entry, assessment, true);
+		dbInstance.commit();
+		
+		// check assignments
+		List<GradingAssignment> assignments = gradingAssignmentDao.getGradingAssignments(graderRelation);
+		Assert.assertEquals(1, assignments.size());
+		GradingAssignment assignment = assignments.get(0);
+		Assert.assertEquals(assessment, assignment.getAssessmentEntry());
+		
+		// unassign
+		gradingService.unassignGrader(assignment);
+		dbInstance.commitAndCloseSession();
+		
+		// check
+		List<GradingAssignment> unassignments = gradingAssignmentDao.getGradingAssignments(graderRelation);
+		Assert.assertTrue(unassignments.isEmpty());
+	}
+	
 	private Date addDaysToNow(int days) {
 		Calendar cal = Calendar.getInstance();
 		cal.add(Calendar.DATE, days);