diff --git a/src/main/java/org/olat/course/assessment/AssessmentManager.java b/src/main/java/org/olat/course/assessment/AssessmentManager.java
index c005b8af263d5cb0e71bb064b8dc7c93d6bbb0a5..de0fd2225b8738b6e62a481caf11d6416fd35986 100644
--- a/src/main/java/org/olat/course/assessment/AssessmentManager.java
+++ b/src/main/java/org/olat/course/assessment/AssessmentManager.java
@@ -37,6 +37,7 @@ import org.olat.course.run.scoring.ScoreEvaluation;
 import org.olat.course.run.userview.UserCourseEnvironment;
 import org.olat.group.BusinessGroup;
 import org.olat.modules.assessment.AssessmentEntry;
+import org.olat.modules.assessment.Overridable;
 import org.olat.modules.assessment.Role;
 import org.olat.modules.assessment.model.AssessmentEntryStatus;
 import org.olat.modules.assessment.model.AssessmentRunStatus;
@@ -273,6 +274,13 @@ public interface AssessmentManager {
 			ScoreEvaluation scoreEvaluation, UserCourseEnvironment userCourseEnvironment,
 			boolean incrementUserAttempts, Role by);
 	
+	public Overridable<Boolean> getRootPassed(UserCourseEnvironment userCourseEnvironment);
+
+	public Overridable<Boolean> overrideRootPassed(Identity coach, UserCourseEnvironment userCourseEnvironment,
+			Boolean passed);
+
+	public Overridable<Boolean> resetRootPassed(Identity coach, UserCourseEnvironment userCourseEnvironment);
+	
 	/**
 	 * Provides an OLATResourceable for locking (of score/passed etc.) purposes (if doInSync is called on score/passed data)
 	 * Or provides a lock token for assessment data of the assessedIdentity.
diff --git a/src/main/java/org/olat/course/assessment/CourseAssessmentService.java b/src/main/java/org/olat/course/assessment/CourseAssessmentService.java
index 8bbf0002c9d3ce3ed6ab776714e0c614a828b073..b005018f1f7d2af6b2ed1309347ee936c7bf7719 100644
--- a/src/main/java/org/olat/course/assessment/CourseAssessmentService.java
+++ b/src/main/java/org/olat/course/assessment/CourseAssessmentService.java
@@ -40,6 +40,7 @@ import org.olat.course.run.scoring.ScoreEvaluation;
 import org.olat.course.run.userview.UserCourseEnvironment;
 import org.olat.group.BusinessGroup;
 import org.olat.modules.assessment.AssessmentEntry;
+import org.olat.modules.assessment.Overridable;
 import org.olat.modules.assessment.Role;
 import org.olat.modules.assessment.model.AssessmentEntryStatus;
 import org.olat.modules.assessment.model.AssessmentRunStatus;
@@ -258,6 +259,13 @@ public interface CourseAssessmentService {
 	public void saveScoreEvaluation(CourseNode courseNode, Identity identity, ScoreEvaluation scoreEvaluation,
 			UserCourseEnvironment userCourseEnvironment, boolean incrementUserAttempts, Role by);
 	
+	public Overridable<Boolean> getRootPassed(UserCourseEnvironment userCourseEnvironment);
+
+	public Overridable<Boolean> overrideRootPassed(Identity coach, UserCourseEnvironment userCourseEnvironment,
+			Boolean passed);
+
+	public Overridable<Boolean> resetRootPassed(Identity coach, UserCourseEnvironment userCourseEnvironment);
+	
 	/**
 	 * Returns a controller to edit the node specific details. Check
 	 * AssessmentConfig.hasEditableDetails() before invoking this method.
diff --git a/src/main/java/org/olat/course/assessment/manager/CourseAssessmentManagerImpl.java b/src/main/java/org/olat/course/assessment/manager/CourseAssessmentManagerImpl.java
index b1b8659ac4988701d71a33d34d3f45e71379f7f1..dd39b42351a4658a58a3c8f8e0d5f26d6a466893 100644
--- a/src/main/java/org/olat/course/assessment/manager/CourseAssessmentManagerImpl.java
+++ b/src/main/java/org/olat/course/assessment/manager/CourseAssessmentManagerImpl.java
@@ -70,6 +70,7 @@ import org.olat.course.run.userview.UserCourseEnvironment;
 import org.olat.group.BusinessGroup;
 import org.olat.modules.assessment.AssessmentEntry;
 import org.olat.modules.assessment.AssessmentService;
+import org.olat.modules.assessment.Overridable;
 import org.olat.modules.assessment.Role;
 import org.olat.modules.assessment.model.AssessmentEntryStatus;
 import org.olat.modules.assessment.model.AssessmentRunStatus;
@@ -536,14 +537,9 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
 		DBFactory.getInstance().commit();
 		
 		// node log
-		UserNodeAuditManager am = courseEnv.getAuditManager();
-		am.appendToUserNodeLog(courseNode, identity, assessedIdentity,  "score set to: " + String.valueOf(scoreEvaluation.getScore()), by);
-		if(scoreEvaluation.getPassed()!=null) {
-			am.appendToUserNodeLog(courseNode, identity, assessedIdentity, "passed set to: " + scoreEvaluation.getPassed().toString(), by);
-		} else {
-			am.appendToUserNodeLog(courseNode, identity, assessedIdentity, "passed set to \"undefined\"", by);
-		}
+		logAuditPassed(courseNode, identity, by, userCourseEnv, scoreEvaluation.getPassed());
 		if(scoreEvaluation.getAssessmentID()!=null) {
+			UserNodeAuditManager am = courseEnv.getAuditManager();
 			am.appendToUserNodeLog(courseNode, assessedIdentity, assessedIdentity, "assessmentId set to: " + scoreEvaluation.getAssessmentID().toString(), by);
 		}
 		
@@ -552,25 +548,13 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
 		CoordinatorManager.getInstance().getCoordinator().getEventBus().fireEventToListenersOf(ace, course);
 		
 		// user activity logging
+		logActivityPassed(assessedIdentity, scoreEvaluation.getPassed());
 		if (scoreEvaluation.getScore()!=null) {
 			ThreadLocalUserActivityLogger.log(AssessmentLoggingAction.ASSESSMENT_SCORE_UPDATED, 
 					getClass(), 
 					LoggingResourceable.wrap(assessedIdentity), 
 					LoggingResourceable.wrapNonOlatResource(StringResourceableType.qtiScore, "", String.valueOf(scoreEvaluation.getScore())));
 		}
-
-		if (scoreEvaluation.getPassed()!=null) {
-			ThreadLocalUserActivityLogger.log(AssessmentLoggingAction.ASSESSMENT_PASSED_UPDATED, 
-					getClass(), 
-					LoggingResourceable.wrap(assessedIdentity), 
-					LoggingResourceable.wrapNonOlatResource(StringResourceableType.qtiPassed, "", String.valueOf(scoreEvaluation.getPassed())));
-		} else {
-			ThreadLocalUserActivityLogger.log(AssessmentLoggingAction.ASSESSMENT_PASSED_UPDATED, 
-					getClass(), 
-					LoggingResourceable.wrap(assessedIdentity), 
-					LoggingResourceable.wrapNonOlatResource(StringResourceableType.qtiPassed, "", "undefined"));
-		}
-
 		if (incrementUserAttempts && attempts!=null) {
 			if(identity != null) {
 				ThreadLocalUserActivityLogger.log(AssessmentLoggingAction.ASSESSMENT_ATTEMPTS_UPDATED, 
@@ -584,23 +568,149 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
 			}
 		}
 		
+		updateUserEfficiencyStatement(userCourseEnv, courseNode);
+		generateCertificate(userCourseEnv, course);
+	}
+	
+	@Override
+	public Overridable<Boolean> getRootPassed(UserCourseEnvironment userCourseEnvironment) {
+		Identity assessedIdentity = userCourseEnvironment.getIdentityEnvironment().getIdentity();
+		CourseEnvironment courseEnv = userCourseEnvironment.getCourseEnvironment();
+		CourseNode rootNode = courseEnv.getRunStructure().getRootNode();
+		String subIdent = rootNode.getIdent();
+		RepositoryEntry referenceEntry = rootNode.getReferencedRepositoryEntry();
+		AssessmentEntry assessmentEntry = getOrCreate(assessedIdentity, subIdent, Boolean.TRUE, referenceEntry);
+		return assessmentEntry.getPassedOverridable();
+	}
+
+	@Override
+	public Overridable<Boolean> overrideRootPassed(Identity coach, UserCourseEnvironment userCourseEnvironment, Boolean passed) {
+		Identity assessedIdentity = userCourseEnvironment.getIdentityEnvironment().getIdentity();
+		
+		ICourse course = CourseFactory.loadCourse(cgm.getCourseEntry());
+		CourseEnvironment courseEnv = userCourseEnvironment.getCourseEnvironment();
+		
+		CourseNode rootNode = courseEnv.getRunStructure().getRootNode();
+		String subIdent = rootNode.getIdent();
+		RepositoryEntry referenceEntry = rootNode.getReferencedRepositoryEntry();
+		AssessmentEntry assessmentEntry = getOrCreate(assessedIdentity, subIdent, Boolean.TRUE, referenceEntry);
+		
+		Date now = new Date();
+		assessmentEntry.setLastCoachModified(now);
+		assessmentEntry.getPassedOverridable().override(passed, coach, now);
+		assessmentEntry = assessmentService.updateAssessmentEntry(assessmentEntry);
+		DBFactory.getInstance().commit();
+		
+		nodeAccessService.onPassedUpdated(rootNode, userCourseEnvironment, passed, Boolean.TRUE, Role.coach);
+		DBFactory.getInstance().commit();
+		
+		ScoreAccounting scoreAccounting = userCourseEnvironment.getScoreAccounting();
+		scoreAccounting.evaluateAll(true);
+		DBFactory.getInstance().commit();
+		
+		logAuditPassed(rootNode, coach, Role.coach, userCourseEnvironment, passed);
+		logActivityPassed(assessedIdentity, passed);
+		
+		AssessmentChangedEvent ace = new AssessmentChangedEvent(AssessmentChangedEvent.TYPE_SCORE_EVAL_CHANGED, assessedIdentity);
+		CoordinatorManager.getInstance().getCoordinator().getEventBus().fireEventToListenersOf(ace, course);
+		
+		updateUserEfficiencyStatement(userCourseEnvironment, rootNode);
+		generateCertificate(userCourseEnvironment, course);
+		
+		return assessmentEntry.getPassedOverridable();
+	}
+
+	@Override
+	public Overridable<Boolean> resetRootPassed(Identity coach, UserCourseEnvironment userCourseEnvironment) {
+		Identity assessedIdentity = userCourseEnvironment.getIdentityEnvironment().getIdentity();
+		
+		ICourse course = CourseFactory.loadCourse(cgm.getCourseEntry());
+		CourseEnvironment courseEnv = userCourseEnvironment.getCourseEnvironment();
+		
+		CourseNode rootNode = courseEnv.getRunStructure().getRootNode();
+		String subIdent = rootNode.getIdent();
+		RepositoryEntry referenceEntry = rootNode.getReferencedRepositoryEntry();
+		AssessmentEntry assessmentEntry = getOrCreate(assessedIdentity, subIdent, Boolean.TRUE, referenceEntry);
+		
+		Date now = new Date();
+		assessmentEntry.setLastCoachModified(now);
+		assessmentEntry.getPassedOverridable().reset();
+		assessmentEntry = assessmentService.updateAssessmentEntry(assessmentEntry);
+		DBFactory.getInstance().commit();
+		
+		Boolean passed = assessmentEntry.getPassed();
+		nodeAccessService.onPassedUpdated(rootNode, userCourseEnvironment, passed, Boolean.TRUE, Role.coach);
+		DBFactory.getInstance().commit();
+		
+		ScoreAccounting scoreAccounting = userCourseEnvironment.getScoreAccounting();
+		scoreAccounting.evaluateAll(true);
+		DBFactory.getInstance().commit();
+		
+		logAuditPassed(rootNode, coach, Role.coach, userCourseEnvironment, passed);
+		logActivityPassed(assessedIdentity, passed);
+		
+		AssessmentChangedEvent ace = new AssessmentChangedEvent(AssessmentChangedEvent.TYPE_SCORE_EVAL_CHANGED, assessedIdentity);
+		CoordinatorManager.getInstance().getCoordinator().getEventBus().fireEventToListenersOf(ace, course);
+		
+		updateUserEfficiencyStatement(userCourseEnvironment, rootNode);
+		generateCertificate(userCourseEnvironment, course);
+		
+		return assessmentEntry.getPassedOverridable();
+	}
+
+	private void logAuditPassed(CourseNode courseNode, Identity identity, Role by,
+			UserCourseEnvironment userCourseEnvironment, Boolean passed) {
+		UserNodeAuditManager am = userCourseEnvironment.getCourseEnvironment().getAuditManager();
+		Identity assessedIdentity = userCourseEnvironment.getIdentityEnvironment().getIdentity();
+		if(passed != null) {
+			am.appendToUserNodeLog(courseNode, identity, assessedIdentity, "passed set to: " + passed.toString(), by);
+		} else {
+			am.appendToUserNodeLog(courseNode, identity, assessedIdentity, "passed set to \"undefined\"", by);
+		}
+	}
+
+	private void logActivityPassed(Identity assessedIdentity, Boolean passed) {
+		if (passed != null) {
+			ThreadLocalUserActivityLogger.log(AssessmentLoggingAction.ASSESSMENT_PASSED_UPDATED, 
+					getClass(), 
+					LoggingResourceable.wrap(assessedIdentity), 
+					LoggingResourceable.wrapNonOlatResource(StringResourceableType.qtiPassed, "", String.valueOf(passed)));
+		} else {
+			ThreadLocalUserActivityLogger.log(AssessmentLoggingAction.ASSESSMENT_PASSED_UPDATED, 
+					getClass(), 
+					LoggingResourceable.wrap(assessedIdentity), 
+					LoggingResourceable.wrapNonOlatResource(StringResourceableType.qtiPassed, "", "undefined"));
+		}
+	}
+
+	private void updateUserEfficiencyStatement(UserCourseEnvironment userCourseEnvironment, CourseNode courseNode) {
+		CourseEnvironment courseEnv = userCourseEnvironment.getCourseEnvironment();
 		// write only when enabled for this course
 		if (courseEnv.getCourseConfig().isEfficencyStatementEnabled()) {
+			Identity assessedIdentity = userCourseEnvironment.getIdentityEnvironment().getIdentity();
+			ScoreAccounting scoreAccounting = userCourseEnvironment.getScoreAccounting();
+			CourseNode rootNode = userCourseEnvironment.getCourseEnvironment().getRunStructure().getRootNode();
+			
 			List<AssessmentNodeData> data = new ArrayList<>(50);
 			AssessmentNodesLastModified lastModifications = new AssessmentNodesLastModified();
-			AssessmentHelper.getAssessmentNodeDataList(0, courseEnv.getRunStructure().getRootNode(),
-					scoreAccounting, userCourseEnv, true, true, true, data, lastModifications);
+			
+			AssessmentHelper.getAssessmentNodeDataList(0, rootNode, scoreAccounting, userCourseEnvironment, true, true,
+					true, data, lastModifications);
 			efficiencyStatementManager.updateUserEfficiencyStatement(assessedIdentity, courseEnv, data, lastModifications, cgm.getCourseEntry());
 		}
+	}
 
-		if(course.getCourseConfig().isAutomaticCertificationEnabled()) {
-			CourseNode rootNode = courseEnv.getRunStructure().getRootNode();
+	private void generateCertificate(UserCourseEnvironment userCourseEnvironment, ICourse course) {
+		if (course.getCourseConfig().isAutomaticCertificationEnabled()) {
+			Identity assessedIdentity = userCourseEnvironment.getIdentityEnvironment().getIdentity();
+			ScoreAccounting scoreAccounting = userCourseEnvironment.getScoreAccounting();
+			CourseNode rootNode = userCourseEnvironment.getCourseEnvironment().getRunStructure().getRootNode();
 			ScoreEvaluation rootEval = scoreAccounting.evalCourseNode(rootNode);
-			if(rootEval != null && rootEval.getPassed() != null && rootEval.getPassed().booleanValue()
+			if (rootEval != null && rootEval.getPassed() != null && rootEval.getPassed().booleanValue()
 					&& certificatesManager.isCertificationAllowed(assessedIdentity, cgm.getCourseEntry())) {
 				CertificateTemplate template = null;
 				Long templateId = course.getCourseConfig().getCertificateTemplate();
-				if(templateId != null) {
+				if (templateId != null) {
 					template = certificatesManager.getTemplateById(templateId);
 				}
 				CertificateInfos certificateInfos = new CertificateInfos(assessedIdentity, rootEval.getScore(), rootEval.getPassed());
@@ -735,4 +845,5 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
 	private Boolean isEntryRoot(ICourse course, CourseNode courseNode) {
 		return course.getCourseEnvironment().getRunStructure().getRootNode().getIdent().equals(courseNode.getIdent());
 	}
+	
 }
diff --git a/src/main/java/org/olat/course/assessment/manager/CourseAssessmentServiceImpl.java b/src/main/java/org/olat/course/assessment/manager/CourseAssessmentServiceImpl.java
index 33f29afec20f5b3b0af37532c28f33407439cd80..3f0b56b245b6ca972fa9439ac25dbf652a411711 100644
--- a/src/main/java/org/olat/course/assessment/manager/CourseAssessmentServiceImpl.java
+++ b/src/main/java/org/olat/course/assessment/manager/CourseAssessmentServiceImpl.java
@@ -62,6 +62,7 @@ import org.olat.course.run.userview.UserCourseEnvironmentImpl;
 import org.olat.group.BusinessGroup;
 import org.olat.modules.assessment.AssessmentEntry;
 import org.olat.modules.assessment.AssessmentService;
+import org.olat.modules.assessment.Overridable;
 import org.olat.modules.assessment.Role;
 import org.olat.modules.assessment.model.AssessmentEntryStatus;
 import org.olat.modules.assessment.model.AssessmentRunStatus;
@@ -324,6 +325,30 @@ public class CourseAssessmentServiceImpl implements CourseAssessmentService, Nod
 		am.saveScoreEvaluation(courseNode, identity, assessedIdentity, scoreEvaluation, userCourseEnvironment,
 				incrementUserAttempts, by);
 	}
+	
+	@Override
+	public Overridable<Boolean> getRootPassed(UserCourseEnvironment userCourseEnvironment) {
+		if (!userCourseEnvironment.isParticipant()) return Overridable.empty();
+		
+		AssessmentManager am = userCourseEnvironment.getCourseEnvironment().getAssessmentManager();
+		return am.getRootPassed(userCourseEnvironment);
+	}
+
+	@Override
+	public Overridable<Boolean> overrideRootPassed(Identity coach, UserCourseEnvironment userCourseEnvironment, Boolean passed) {
+		if (!userCourseEnvironment.isParticipant()) return Overridable.empty();
+		
+		AssessmentManager am = userCourseEnvironment.getCourseEnvironment().getAssessmentManager();
+		return am.overrideRootPassed(coach, userCourseEnvironment, passed);
+	}
+
+	@Override
+	public Overridable<Boolean> resetRootPassed(Identity coach, UserCourseEnvironment userCourseEnvironment) {
+		if (!userCourseEnvironment.isParticipant()) return Overridable.empty();
+		
+		AssessmentManager am = userCourseEnvironment.getCourseEnvironment().getAssessmentManager();
+		return am.resetRootPassed(coach, userCourseEnvironment);
+	}
 
 	@Override
 	public Controller getDetailsEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel,
diff --git a/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentityCourseController.java b/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentityCourseController.java
index 6f92c2cf7a858937b2de40fe5f96d090ab60dce7..f0f372afa04506a7d2e1d81aab692ba8870312c5 100644
--- a/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentityCourseController.java
+++ b/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentityCourseController.java
@@ -130,7 +130,7 @@ public class AssessmentIdentityCourseController extends BasicController
 			
 		Boolean passedManually = course.getRunStructure().getRootNode().getModuleConfiguration().getBooleanSafe(STCourseNode.CONFIG_PASSED_MANUALLY);
 		if (passedManually) {
-			passedCtrl = new IdentityPassedController(ureq, wControl, coachCourseEnv, courseEntry, assessedIdentity);
+			passedCtrl = new IdentityPassedController(ureq, wControl, coachCourseEnv, assessedUserCourseEnv);
 			identityAssessmentVC.put("passed", passedCtrl.getInitialComponent());
 			listenTo(passedCtrl);
 		}
@@ -191,6 +191,8 @@ public class AssessmentIdentityCourseController extends BasicController
 			if(event instanceof AssessmentFormEvent) {
 				AssessmentFormEvent aee = (AssessmentFormEvent)event;
 				treeOverviewCtrl.loadModel();
+				if (passedCtrl != null) passedCtrl.refresh();
+				if (certificateCtrl != null) certificateCtrl.loadList();
 				if(aee.isClose()) {
 					stackPanel.popController(currentNodeCtrl);
 				}
@@ -204,6 +206,7 @@ public class AssessmentIdentityCourseController extends BasicController
 		} else if (source == passedCtrl) {
 			if (event == FormEvent.CHANGED_EVENT) {
 				treeOverviewCtrl.loadModel();
+				if (certificateCtrl != null) certificateCtrl.loadList();
 				fireEvent(ureq, event);
 			}
 		}
diff --git a/src/main/java/org/olat/course/assessment/ui/tool/IdentityCertificatesController.java b/src/main/java/org/olat/course/assessment/ui/tool/IdentityCertificatesController.java
index e6adba3a3a7e9678d904e6ccd0b7ef5ccea2bc71..f259234c4b44fc8cb950fe2b7afe252d688ac1eb 100644
--- a/src/main/java/org/olat/course/assessment/ui/tool/IdentityCertificatesController.java
+++ b/src/main/java/org/olat/course/assessment/ui/tool/IdentityCertificatesController.java
@@ -133,7 +133,7 @@ public class IdentityCertificatesController extends BasicController implements G
 		}
 	}
 
-	private void loadList() {
+	void loadList() {
 		List<Certificate> certificates = certificatesManager.getCertificates(assessedIdentity, courseEntry.getOlatResource());
 		List<Links> certificatesLink = new ArrayList<>(certificates.size());
 		int count = 0;
diff --git a/src/main/java/org/olat/course/assessment/ui/tool/IdentityPassedController.java b/src/main/java/org/olat/course/assessment/ui/tool/IdentityPassedController.java
index 20ea5d6f0d3c4eb16de8ab4c967947affa6ea298..7f10707573155e69eaa4ac8b8e0b9e049152fa86 100644
--- a/src/main/java/org/olat/course/assessment/ui/tool/IdentityPassedController.java
+++ b/src/main/java/org/olat/course/assessment/ui/tool/IdentityPassedController.java
@@ -19,8 +19,6 @@
  */
 package org.olat.course.assessment.ui.tool;
 
-import java.util.Date;
-
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.form.flexible.impl.FormEvent;
@@ -30,13 +28,10 @@ import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.controller.BasicController;
-import org.olat.core.id.Identity;
 import org.olat.core.util.Formatter;
+import org.olat.course.assessment.CourseAssessmentService;
 import org.olat.course.run.userview.UserCourseEnvironment;
-import org.olat.modules.assessment.AssessmentEntry;
-import org.olat.modules.assessment.AssessmentService;
 import org.olat.modules.assessment.Overridable;
-import org.olat.repository.RepositoryEntry;
 import org.olat.user.UserManager;
 import org.springframework.beans.factory.annotation.Autowired;
 
@@ -53,22 +48,18 @@ public class IdentityPassedController extends BasicController {
 	private Link failLink;
 	private Link resetLink;
 
-	private final RepositoryEntry courseEntry;
-	private final String rootIdent;
-	private final Identity assessedIdentity;
+	private final UserCourseEnvironment assessedUserCourseEnv;
 	private final boolean readOnly;
 	
 	@Autowired
-	private AssessmentService assessmentService;
+	private CourseAssessmentService courseAssessmentService;
 	@Autowired
 	private UserManager userManager;
 
 	protected IdentityPassedController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment coachCourseEnv,
-			RepositoryEntry courseEntry, Identity assessedIdentity) {
+			UserCourseEnvironment assessedUserCourseEnv) {
 		super(ureq, wControl);
-		this.courseEntry = courseEntry;
-		this.assessedIdentity = assessedIdentity;
-		this.rootIdent = coachCourseEnv.getCourseEnvironment().getRunStructure().getRootNode().getIdent();
+		this.assessedUserCourseEnv = assessedUserCourseEnv;
 		this.readOnly = coachCourseEnv.isCourseReadOnly();
 		
 		mainVC = createVelocityContainer("passed");
@@ -77,12 +68,15 @@ public class IdentityPassedController extends BasicController {
 		failLink = LinkFactory.createLink("passed.manually.fail", "assed.manually.fail", getTranslator(), mainVC, this, Link.BUTTON);
 		resetLink = LinkFactory.createLink("passed.manually.reset", "assed.manually.reset", getTranslator(), mainVC, this, Link.BUTTON);
 		
-		AssessmentEntry assessmentEntry = assessmentService.getOrCreateAssessmentEntry(assessedIdentity, null,
-				courseEntry, rootIdent, Boolean.TRUE, null);
-		Overridable<Boolean> passedOverridable = assessmentEntry.getPassedOverridable();
+		Overridable<Boolean> passedOverridable = courseAssessmentService.getRootPassed(assessedUserCourseEnv);
 		updateUI(passedOverridable);
 		putInitialPanel(mainVC);
 	}
+	
+	void refresh() {
+		Overridable<Boolean> passedOverridable = courseAssessmentService.getRootPassed(assessedUserCourseEnv);
+		updateUI(passedOverridable);
+	}
 
 	private void updateUI(Overridable<Boolean> passedOverridable) {
 		mainVC.contextPut("message", getMessage(passedOverridable));
@@ -148,21 +142,15 @@ public class IdentityPassedController extends BasicController {
 	}
 
 	private void doOverride(UserRequest ureq, Boolean passed) {
-		AssessmentEntry assessmentEntry = assessmentService.getOrCreateAssessmentEntry(assessedIdentity, null,
-				courseEntry, rootIdent, Boolean.TRUE, null);
-		Overridable<Boolean> passedOverridable = assessmentEntry.getPassedOverridable();
-		passedOverridable.override(passed, getIdentity(), new Date());
-		assessmentService.updateAssessmentEntry(assessmentEntry);
+		Overridable<Boolean> passedOverridable = courseAssessmentService.overrideRootPassed(getIdentity(),
+				assessedUserCourseEnv, passed);
 		updateUI(passedOverridable);
 		fireEvent(ureq, FormEvent.CHANGED_EVENT);
 	}
 
 	private void doReset(UserRequest ureq) {
-		AssessmentEntry assessmentEntry = assessmentService.getOrCreateAssessmentEntry(assessedIdentity, null,
-				courseEntry, rootIdent, Boolean.TRUE, null);
-		Overridable<Boolean> passedOverridable = assessmentEntry.getPassedOverridable();
-		passedOverridable.reset();
-		assessmentService.updateAssessmentEntry(assessmentEntry);
+		Overridable<Boolean> passedOverridable = courseAssessmentService.resetRootPassed(getIdentity(),
+				assessedUserCourseEnv);
 		updateUI(passedOverridable);
 		fireEvent(ureq, FormEvent.CHANGED_EVENT);
 	}
diff --git a/src/main/java/org/olat/course/run/preview/PreviewAssessmentManager.java b/src/main/java/org/olat/course/run/preview/PreviewAssessmentManager.java
index f9eac23e4f7537ca2eb0732d99796d772bbecdfd..c1de82116dc51c927d8dc9fb17bd33930ca5c46b 100644
--- a/src/main/java/org/olat/course/run/preview/PreviewAssessmentManager.java
+++ b/src/main/java/org/olat/course/run/preview/PreviewAssessmentManager.java
@@ -42,6 +42,7 @@ import org.olat.course.run.scoring.ScoreEvaluation;
 import org.olat.course.run.userview.UserCourseEnvironment;
 import org.olat.group.BusinessGroup;
 import org.olat.modules.assessment.AssessmentEntry;
+import org.olat.modules.assessment.Overridable;
 import org.olat.modules.assessment.Role;
 import org.olat.modules.assessment.model.AssessmentEntryStatus;
 import org.olat.modules.assessment.model.AssessmentRunStatus;
@@ -255,6 +256,20 @@ final class PreviewAssessmentManager implements AssessmentManager {
 			incrementNodeAttempts(courseNode, identity, userCourseEnvironment, by);
 		}
 	}
+	@Override
+	public Overridable<Boolean> getRootPassed(UserCourseEnvironment userCourseEnvironment) {
+		return Overridable.empty();
+	};
+
+	@Override
+	public Overridable<Boolean> overrideRootPassed(Identity coach, UserCourseEnvironment userCourseEnvironment, Boolean passed) {
+		return Overridable.empty();
+	}
+
+	@Override
+	public Overridable<Boolean> resetRootPassed(Identity coach, UserCourseEnvironment userCourseEnvironment) {
+		return Overridable.empty();
+	}
 
 	@Override
 	public OLATResourceable createOLATResourceableForLocking(Identity assessedIdentity) {