From 299ec2822e5f3f8163476ab7eb9fec44fb735863 Mon Sep 17 00:00:00 2001
From: uhensler <urs.hensler@frentix.com>
Date: Fri, 23 Aug 2019 11:44:30 +0200
Subject: [PATCH] OO-4186: Delete last methods from assessable course node

---
 .../assessment/CourseAssessmentService.java   |  4 +--
 .../assessment/handler/AssessmentHandler.java |  4 +--
 .../handler/NonAssessmentHandler.java         |  4 +--
 .../manager/BulkAssessmentTask.java           |  4 +--
 .../manager/CourseAssessmentServiceImpl.java  | 13 +++++----
 .../IdentityListCourseNodeController.java     |  4 +--
 .../tool/tools/AbstractToolsController.java   |  2 +-
 .../course/nodes/AssessableCourseNode.java    | 14 ---------
 .../olat/course/nodes/BasicLTICourseNode.java |  6 ----
 .../course/nodes/CheckListCourseNode.java     | 21 +-------------
 .../org/olat/course/nodes/GTACourseNode.java  | 14 ---------
 .../olat/course/nodes/IQTESTCourseNode.java   |  9 ------
 .../org/olat/course/nodes/MSCourseNode.java   | 19 ------------
 .../course/nodes/PortfolioCourseNode.java     | 29 -------------------
 .../course/nodes/ProjectBrokerCourseNode.java | 14 ---------
 .../org/olat/course/nodes/STCourseNode.java   | 13 ---------
 .../olat/course/nodes/ScormCourseNode.java    | 16 +---------
 .../org/olat/course/nodes/TACourseNode.java   | 13 ---------
 .../basiclti/CourseNodeOutcomeMapper.java     |  3 +-
 .../nodes/basiclti/LTIAssessmentHandler.java  |  4 +--
 .../nodes/basiclti/LTIRunController.java      |  2 +-
 .../nodes/cl/CheckListAssessmentHandler.java  |  4 +--
 .../nodes/cl/ui/CheckListRunController.java   |  2 +-
 .../gta/AbstractGTAAssessmentHandler.java     |  4 +--
 ...TACoachedParticipantGradingController.java |  6 +++-
 .../gta/ui/GTAParticipantController.java      |  5 +++-
 .../nodes/iq/ConfirmReopenController.java     |  3 +-
 .../IQIdentityListCourseNodeController.java   |  2 +-
 .../nodes/iq/IQTESTAssessmentHandler.java     |  4 +--
 .../course/nodes/ms/MSAssessmentHandler.java  |  4 +--
 .../portfolio/PortfolioAssessmentHandler.java |  4 +--
 .../ProjectBrokerAssessmentHandler.java       |  4 +--
 .../nodes/scorm/ScormAssessmentHandler.java   |  4 +--
 .../nodes/scorm/ScormRunController.java       |  2 +-
 .../course/nodes/st/STAssessmentHandler.java  |  3 +-
 .../ta/DropboxScoringViewController.java      |  4 +--
 .../course/nodes/ta/TAAssessmentHandler.java  |  4 +--
 .../olat/course/nodes/ta/TaskController.java  |  9 +++++-
 .../course/reminder/rule/PassedRuleSPI.java   |  3 +-
 .../course/reminder/rule/ScoreRuleSPI.java    |  3 +-
 .../course/run/scoring/ScoreAccounting.java   | 19 +++++-------
 .../ui/QTI21AssessmentDetailsController.java  |  2 +-
 ...ctionIdentityAssessmentItemController.java |  2 +-
 .../manager/PortfolioServiceImpl.java         |  4 +--
 .../olat/modules/scorm/ScormAPIMapper.java    |  8 ++---
 45 files changed, 84 insertions(+), 237 deletions(-)

diff --git a/src/main/java/org/olat/course/assessment/CourseAssessmentService.java b/src/main/java/org/olat/course/assessment/CourseAssessmentService.java
index 803d403e214..31a8bb8cba1 100644
--- a/src/main/java/org/olat/course/assessment/CourseAssessmentService.java
+++ b/src/main/java/org/olat/course/assessment/CourseAssessmentService.java
@@ -74,7 +74,7 @@ public interface CourseAssessmentService {
 	 * @param userCourseEnvironment
 	 * @return
 	 */
-	public AssessmentEvaluation getUserAssessmentEvaluation(CourseNode courseNode, UserCourseEnvironment userCourseEnvironment);
+	public AssessmentEvaluation getPersistedAssessmentEvaluation(CourseNode courseNode, UserCourseEnvironment userCourseEnvironment);
 	
 	/**
 	 * Converts the assessmentEntry to an AssessmentEvaluation in respect of the
@@ -113,7 +113,7 @@ public interface CourseAssessmentService {
 	 *         default values 0.0f / false for score/passed; currently only the
 	 *         STNode returns null, if there are no scoring rules defined.
 	 */
-	public ScoreEvaluation getUserScoreEvaluation(CourseNode courseNode, UserCourseEnvironment userCourseEnvironment);
+	public AssessmentEvaluation getUserScoreEvaluation(CourseNode courseNode, UserCourseEnvironment userCourseEnvironment);
 	
 	public void updateUserScoreEvaluation(CourseNode courseNode, ScoreEvaluation scoreEvaluation,
 			UserCourseEnvironment userCourseEnvironment, Identity coachingIdentity, boolean incrementAttempts, Role by);
diff --git a/src/main/java/org/olat/course/assessment/handler/AssessmentHandler.java b/src/main/java/org/olat/course/assessment/handler/AssessmentHandler.java
index aa26d4f007e..ee63f7eaf45 100644
--- a/src/main/java/org/olat/course/assessment/handler/AssessmentHandler.java
+++ b/src/main/java/org/olat/course/assessment/handler/AssessmentHandler.java
@@ -26,8 +26,8 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.course.assessment.ui.tool.AssessmentCourseNodeController;
 import org.olat.course.nodes.CourseNode;
+import org.olat.course.run.scoring.AssessmentEvaluation;
 import org.olat.course.run.scoring.ScoreCalculator;
-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;
@@ -66,7 +66,7 @@ public interface AssessmentHandler {
 	 * @param userCourseEnvironment
 	 * @return
 	 */
-	public ScoreEvaluation getCalculatedScoreEvaluation(CourseNode courseNode, UserCourseEnvironment userCourseEnvironment);
+	public AssessmentEvaluation getCalculatedScoreEvaluation(CourseNode courseNode, UserCourseEnvironment userCourseEnvironment);
 	
 	/**
 	 * This method has to be implemented if the AssessmentConfig.isScoreEvaluationCalculated() return true.
diff --git a/src/main/java/org/olat/course/assessment/handler/NonAssessmentHandler.java b/src/main/java/org/olat/course/assessment/handler/NonAssessmentHandler.java
index 681da2988b2..849ed8c4a0b 100644
--- a/src/main/java/org/olat/course/assessment/handler/NonAssessmentHandler.java
+++ b/src/main/java/org/olat/course/assessment/handler/NonAssessmentHandler.java
@@ -26,8 +26,8 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.course.assessment.ui.tool.AssessmentCourseNodeController;
 import org.olat.course.nodes.CourseNode;
+import org.olat.course.run.scoring.AssessmentEvaluation;
 import org.olat.course.run.scoring.ScoreCalculator;
-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;
@@ -63,7 +63,7 @@ public class NonAssessmentHandler implements AssessmentHandler {
 	}
 
 	@Override
-	public ScoreEvaluation getCalculatedScoreEvaluation(CourseNode courseNode,
+	public AssessmentEvaluation getCalculatedScoreEvaluation(CourseNode courseNode,
 			UserCourseEnvironment userCourseEnvironment) {
 		return null;
 	}
diff --git a/src/main/java/org/olat/course/assessment/manager/BulkAssessmentTask.java b/src/main/java/org/olat/course/assessment/manager/BulkAssessmentTask.java
index ad27b325da8..553ba60a692 100644
--- a/src/main/java/org/olat/course/assessment/manager/BulkAssessmentTask.java
+++ b/src/main/java/org/olat/course/assessment/manager/BulkAssessmentTask.java
@@ -397,7 +397,7 @@ public class BulkAssessmentTask implements LongRunnable, TaskAwareRunnable, Sequ
 			
 			Boolean passed = row.getPassed();
 			if (hasPassed && passed != null && cut == null) { // Configuration of manual assessment --> Display passed/not passed: yes, Type of display: Manual by tutor
-				ScoreEvaluation seOld = courseNode.getUserScoreEvaluation(uce);
+				ScoreEvaluation seOld = courseAssessmentService.getUserScoreEvaluation(courseNode, uce);
 				Float oldScore = seOld.getScore();
 				ScoreEvaluation se = new ScoreEvaluation(oldScore, passed, datas.getStatus(), datas.getVisibility(), null, null, null, null);
 				// Update score,passed properties in db, and the user's efficiency statement
@@ -431,7 +431,7 @@ public class BulkAssessmentTask implements LongRunnable, TaskAwareRunnable, Sequ
 			}
 			
 			if(!statusVisibilitySet && (datas.getStatus() != null || datas.getVisibility() != null)) {
-				ScoreEvaluation seOld = courseNode.getUserScoreEvaluation(uce);
+				ScoreEvaluation seOld = courseAssessmentService.getUserScoreEvaluation(courseNode, uce);
 				ScoreEvaluation se = new ScoreEvaluation(seOld.getScore(), seOld.getPassed(),
 						datas.getStatus(), datas.getVisibility(), seOld.getFullyAssessed(),
 						seOld.getCurrentRunCompletion(), seOld.getCurrentRunStatus(), seOld.getAssessmentID());
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 fb6b5270b3d..269ef741ae0 100644
--- a/src/main/java/org/olat/course/assessment/manager/CourseAssessmentServiceImpl.java
+++ b/src/main/java/org/olat/course/assessment/manager/CourseAssessmentServiceImpl.java
@@ -100,7 +100,7 @@ public class CourseAssessmentServiceImpl implements CourseAssessmentService {
 	}
 
 	@Override
-	public AssessmentEvaluation getUserAssessmentEvaluation(CourseNode courseNode, UserCourseEnvironment userCourseEnvironment) {
+	public AssessmentEvaluation getPersistedAssessmentEvaluation(CourseNode courseNode, UserCourseEnvironment userCourseEnvironment) {
 		AssessmentEntry assessmentEntry = getAssessmentHandler(courseNode).getAssessmentEntry(courseNode, userCourseEnvironment);
 		return toAssessmentEvaluation(assessmentEntry, courseNode);
 	}
@@ -117,17 +117,18 @@ public class CourseAssessmentServiceImpl implements CourseAssessmentService {
 	}
 
 	@Override
-	public ScoreEvaluation getUserScoreEvaluation(CourseNode courseNode, UserCourseEnvironment userCourseEnvironment) {
+	public AssessmentEvaluation getUserScoreEvaluation(CourseNode courseNode, UserCourseEnvironment userCourseEnvironment) {
 		AssessmentConfig assessmentConfig = getAssessmentConfig(courseNode);
 		AssessmentHandler assessmentHandler = getAssessmentHandler(courseNode);
 		
-		ScoreEvaluation scoreEvaluation = AssessmentEvaluation.EMPTY_EVAL;
+		AssessmentEvaluation assessmentEvaluation = AssessmentEvaluation.EMPTY_EVAL;
 		if (assessmentConfig.isScoreEvaluationCalculated()) {
-			scoreEvaluation = assessmentHandler.getCalculatedScoreEvaluation(courseNode, userCourseEnvironment);
+			assessmentEvaluation = assessmentHandler.getCalculatedScoreEvaluation(courseNode, userCourseEnvironment);
 		} else if (assessmentConfig.isScoreEvaluationPersisted()) {
-			scoreEvaluation = getUserAssessmentEvaluation(courseNode, userCourseEnvironment);
+			assessmentEvaluation = getPersistedAssessmentEvaluation(courseNode, userCourseEnvironment);
 		}
-		return scoreEvaluation;
+		// Other handlers should be able to have other implementations
+		return assessmentEvaluation;
 	}
 	
 	@Override
diff --git a/src/main/java/org/olat/course/assessment/ui/tool/IdentityListCourseNodeController.java b/src/main/java/org/olat/course/assessment/ui/tool/IdentityListCourseNodeController.java
index 738398717b7..07a4ca400cc 100644
--- a/src/main/java/org/olat/course/assessment/ui/tool/IdentityListCourseNodeController.java
+++ b/src/main/java/org/olat/course/assessment/ui/tool/IdentityListCourseNodeController.java
@@ -844,7 +844,7 @@ public class IdentityListCourseNodeController extends FormBasicController
 			UserCourseEnvironment assessedUserCourseEnv = new UserCourseEnvironmentImpl(identityEnv, course.getCourseEnvironment(), coachCourseEnv.isCourseReadOnly());
 			assessedUserCourseEnv.getScoreAccounting().evaluateAll();
 
-			ScoreEvaluation scoreEval = assessableCourseNode.getUserScoreEvaluation(assessedUserCourseEnv);
+			ScoreEvaluation scoreEval = courseAssessmentService.getUserScoreEvaluation(courseNode, assessedUserCourseEnv);
 			ScoreEvaluation doneEval = new ScoreEvaluation(scoreEval.getScore(), scoreEval.getPassed(),
 					scoreEval.getAssessmentStatus(), visibility, scoreEval.getFullyAssessed(),
 					scoreEval.getCurrentRunCompletion(), scoreEval.getCurrentRunStatus(), scoreEval.getAssessmentID());
@@ -884,7 +884,7 @@ public class IdentityListCourseNodeController extends FormBasicController
 		UserCourseEnvironment assessedUserCourseEnv = new UserCourseEnvironmentImpl(identityEnv, course.getCourseEnvironment(), coachCourseEnv.isCourseReadOnly());
 		assessedUserCourseEnv.getScoreAccounting().evaluateAll();
 
-		ScoreEvaluation scoreEval = assessableCourseNode.getUserScoreEvaluation(assessedUserCourseEnv);
+		ScoreEvaluation scoreEval = courseAssessmentService.getUserScoreEvaluation(courseNode, assessedUserCourseEnv);
 		ScoreEvaluation doneEval = new ScoreEvaluation(scoreEval.getScore(), scoreEval.getPassed(),
 				AssessmentEntryStatus.done, null, scoreEval.getFullyAssessed(),
 				scoreEval.getCurrentRunCompletion(), scoreEval.getCurrentRunStatus(), scoreEval.getAssessmentID());
diff --git a/src/main/java/org/olat/course/assessment/ui/tool/tools/AbstractToolsController.java b/src/main/java/org/olat/course/assessment/ui/tool/tools/AbstractToolsController.java
index 831e3439d80..70020eef848 100644
--- a/src/main/java/org/olat/course/assessment/ui/tool/tools/AbstractToolsController.java
+++ b/src/main/java/org/olat/course/assessment/ui/tool/tools/AbstractToolsController.java
@@ -99,7 +99,7 @@ public abstract class AbstractToolsController extends BasicController {
 
 		assessedUserCourseEnv = AssessmentHelper
 				.createAndInitUserCourseEnvironment(assessedIdentity, coachCourseEnv.getCourseEnvironment());
-		scoreEval = courseNode.getUserScoreEvaluation(assessedUserCourseEnv);
+		scoreEval = courseAssessmentService.getUserScoreEvaluation(courseNode, assessedUserCourseEnv);
 	}
 	
 	public boolean isCourseReadonly() {
diff --git a/src/main/java/org/olat/course/nodes/AssessableCourseNode.java b/src/main/java/org/olat/course/nodes/AssessableCourseNode.java
index e1a013f2e63..e9eb7a564d9 100644
--- a/src/main/java/org/olat/course/nodes/AssessableCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/AssessableCourseNode.java
@@ -26,10 +26,6 @@
 
 package org.olat.course.nodes;
 
-import org.olat.course.run.scoring.AssessmentEvaluation;
-import org.olat.course.run.userview.UserCourseEnvironment;
-
-
 /**
  * Initial Date:  Jun 18, 2004
  * @author gnaegi
@@ -41,14 +37,4 @@ import org.olat.course.run.userview.UserCourseEnvironment;
  */
 public interface AssessableCourseNode extends CourseNode {
 
-	/**
-	 * this method implementation must not cache any results!
-	 * 
-	 * The user has no scoring results jet (e.g. made no test yet), then the
-	 * ScoreEvaluation.NA has to be returned!
-	 * @param userCourseEnv
-	 * @return null, if this node cannot deliver any useful scoring info (this is not the case for a test never tried or manual scoring: those have default values 0.0f / false for score/passed; currently only the STNode returns null if there are no scoring rules defined.)
-	 */
-	public AssessmentEvaluation getUserScoreEvaluation(UserCourseEnvironment userCourseEnv);
-
 }
diff --git a/src/main/java/org/olat/course/nodes/BasicLTICourseNode.java b/src/main/java/org/olat/course/nodes/BasicLTICourseNode.java
index 2fdd4f9721f..0bad4813e6a 100644
--- a/src/main/java/org/olat/course/nodes/BasicLTICourseNode.java
+++ b/src/main/java/org/olat/course/nodes/BasicLTICourseNode.java
@@ -47,7 +47,6 @@ import org.olat.course.nodes.basiclti.LTIConfigForm;
 import org.olat.course.nodes.basiclti.LTIEditController;
 import org.olat.course.nodes.basiclti.LTIRunController;
 import org.olat.course.run.navigation.NodeRunConstructionResult;
-import org.olat.course.run.scoring.AssessmentEvaluation;
 import org.olat.course.run.userview.NodeEvaluation;
 import org.olat.course.run.userview.UserCourseEnvironment;
 import org.olat.ims.lti.LTIDisplayOptions;
@@ -264,9 +263,4 @@ public class BasicLTICourseNode extends AbstractAccessableCourseNode implements
 		config.setConfigurationVersion(CURRENT_VERSION);
 	}
 
-	@Override
-	public AssessmentEvaluation getUserScoreEvaluation(UserCourseEnvironment userCourseEnv) {
-		return null; // moved
-	}
-
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/course/nodes/CheckListCourseNode.java b/src/main/java/org/olat/course/nodes/CheckListCourseNode.java
index f7b74085b6b..dc28173ac50 100644
--- a/src/main/java/org/olat/course/nodes/CheckListCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/CheckListCourseNode.java
@@ -72,7 +72,6 @@ import org.olat.course.nodes.cl.ui.CheckListRunController;
 import org.olat.course.nodes.cl.ui.CheckListRunForCoachController;
 import org.olat.course.properties.CoursePropertyManager;
 import org.olat.course.run.navigation.NodeRunConstructionResult;
-import org.olat.course.run.scoring.AssessmentEvaluation;
 import org.olat.course.run.scoring.ScoreEvaluation;
 import org.olat.course.run.userview.NodeEvaluation;
 import org.olat.course.run.userview.UserCourseEnvironment;
@@ -152,24 +151,6 @@ public class CheckListCourseNode extends AbstractAccessableCourseNode implements
 		return createNodeRunConstructionResult(ureq, wControl, userCourseEnv, ne, null).getRunController();
 	}
 
-	/**
-	 * the structure node does not have a score itself, but calculates the
-	 * score/passed info by evaluating the configured expression in the the
-	 * (condition)interpreter.
-	 * 
-	 * @see org.olat.course.nodes.AssessableCourseNode#getUserScoreEvaluation(org.olat.course.run.userview.UserCourseEnvironment)
-	 */
-	@Override
-	public AssessmentEvaluation getUserScoreEvaluation(UserCourseEnvironment userCourseEnv) {
-		return null; // moved
-	}
-
-	public AssessmentEntry getUserAssessmentEntry(CourseNode courseNode, UserCourseEnvironment userCourseEnv) {
-		AssessmentManager am = userCourseEnv.getCourseEnvironment().getAssessmentManager();
-		Identity mySelf = userCourseEnv.getIdentityEnvironment().getIdentity();
-		return am.getAssessmentEntry(this, mySelf);
-	}
-
 	@Override
 	public StatusDescription isConfigValid() {
 		if (oneClickStatusCache != null && oneClickStatusCache.length > 0) {
@@ -458,7 +439,7 @@ public class CheckListCourseNode extends AbstractAccessableCourseNode implements
 		}
 
 		CourseAssessmentService courseAssessmentService = CoreSpringFactory.getImpl(CourseAssessmentService.class);
-		ScoreEvaluation currentEval = courseAssessmentService.getUserAssessmentEvaluation(this, assessedUserCourseEnv);
+		ScoreEvaluation currentEval = courseAssessmentService.getPersistedAssessmentEvaluation(this, assessedUserCourseEnv);
 		ScoreEvaluation sceval = new ScoreEvaluation(new Float(score), currentEval.getPassed());
 		courseAssessmentService.saveScoreEvaluation(this, identity, sceval, assessedUserCourseEnv, false, by);
 	}
diff --git a/src/main/java/org/olat/course/nodes/GTACourseNode.java b/src/main/java/org/olat/course/nodes/GTACourseNode.java
index 9044a0cb416..7965a57ea6f 100644
--- a/src/main/java/org/olat/course/nodes/GTACourseNode.java
+++ b/src/main/java/org/olat/course/nodes/GTACourseNode.java
@@ -61,7 +61,6 @@ import org.olat.core.util.vfs.filters.VFSSystemItemFilter;
 import org.olat.course.CourseFactory;
 import org.olat.course.ICourse;
 import org.olat.course.archiver.ScoreAccountingHelper;
-import org.olat.course.assessment.AssessmentManager;
 import org.olat.course.editor.CourseEditorEnv;
 import org.olat.course.editor.NodeEditController;
 import org.olat.course.editor.PublishEvents;
@@ -78,13 +77,11 @@ import org.olat.course.nodes.gta.ui.GTACoachedGroupListController;
 import org.olat.course.nodes.gta.ui.GTAEditController;
 import org.olat.course.nodes.gta.ui.GTARunController;
 import org.olat.course.run.navigation.NodeRunConstructionResult;
-import org.olat.course.run.scoring.AssessmentEvaluation;
 import org.olat.course.run.userview.NodeEvaluation;
 import org.olat.course.run.userview.UserCourseEnvironment;
 import org.olat.group.BusinessGroup;
 import org.olat.group.BusinessGroupService;
 import org.olat.modules.ModuleConfiguration;
-import org.olat.modules.assessment.AssessmentEntry;
 import org.olat.repository.RepositoryEntry;
 import org.olat.user.UserManager;
 
@@ -789,15 +786,4 @@ public class GTACourseNode extends AbstractAccessableCourseNode implements Persi
 		return new GTACoachedGroupListController(ureq, wControl, stackPanel, coachCourseEnv, this, groups);
 	}
 
-	@Override
-	public AssessmentEvaluation getUserScoreEvaluation(UserCourseEnvironment userCourseEnv) {
-		return null; // moved;
-	}
-
-	public AssessmentEntry getUserAssessmentEntry(CourseNode courseNode, UserCourseEnvironment userCourseEnv) {
-		AssessmentManager am = userCourseEnv.getCourseEnvironment().getAssessmentManager();
-		Identity assessedIdentity = userCourseEnv.getIdentityEnvironment().getIdentity();
-		return am.getAssessmentEntry(this, assessedIdentity);
-	}
-
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java b/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java
index 54a990f9e30..5622f9cd51b 100644
--- a/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java
@@ -68,7 +68,6 @@ import org.olat.course.nodes.iq.QTIResourceTypeModule;
 import org.olat.course.properties.CoursePropertyManager;
 import org.olat.course.run.environment.CourseEnvironment;
 import org.olat.course.run.navigation.NodeRunConstructionResult;
-import org.olat.course.run.scoring.AssessmentEvaluation;
 import org.olat.course.run.scoring.ScoreEvaluation;
 import org.olat.course.run.userview.NodeEvaluation;
 import org.olat.course.run.userview.UserCourseEnvironment;
@@ -374,14 +373,6 @@ public class IQTESTCourseNode extends AbstractAccessableCourseNode implements Pe
 		return oneClickStatusCache;
 	}
 
-	/**
-	 * @see org.olat.course.nodes.AssessableCourseNode#getUserScoreEvaluation(org.olat.course.run.userview.UserCourseEnvironment)
-	 */
-	@Override
-	public AssessmentEvaluation getUserScoreEvaluation(UserCourseEnvironment userCourseEnv) {
-		return null; // moved
-	}
-
 	@Override
 	public RepositoryEntry getReferencedRepositoryEntry() {
 		// ",false" because we do not want to be strict, but just indicate whether
diff --git a/src/main/java/org/olat/course/nodes/MSCourseNode.java b/src/main/java/org/olat/course/nodes/MSCourseNode.java
index 960e4643320..7912622336f 100644
--- a/src/main/java/org/olat/course/nodes/MSCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/MSCourseNode.java
@@ -51,13 +51,11 @@ import org.olat.core.util.Util;
 import org.olat.course.ICourse;
 import org.olat.course.assessment.AssessmentManager;
 import org.olat.course.assessment.CourseAssessmentService;
-import org.olat.course.assessment.handler.AssessmentConfig;
 import org.olat.course.condition.ConditionEditController;
 import org.olat.course.editor.CourseEditorEnv;
 import org.olat.course.editor.NodeEditController;
 import org.olat.course.editor.PublishEvents;
 import org.olat.course.editor.StatusDescription;
-import org.olat.course.nodes.ms.MSAssessmentConfig;
 import org.olat.course.nodes.ms.MSCourseNodeEditController;
 import org.olat.course.nodes.ms.MSCourseNodeRunController;
 import org.olat.course.nodes.ms.MSRunController;
@@ -66,7 +64,6 @@ import org.olat.course.nodes.ms.MinMax;
 import org.olat.course.properties.CoursePropertyManager;
 import org.olat.course.properties.PersistingCoursePropertyManager;
 import org.olat.course.run.navigation.NodeRunConstructionResult;
-import org.olat.course.run.scoring.AssessmentEvaluation;
 import org.olat.course.run.scoring.ScoreEvaluation;
 import org.olat.course.run.userview.NodeEvaluation;
 import org.olat.course.run.userview.UserCourseEnvironment;
@@ -271,22 +268,6 @@ public class MSCourseNode extends AbstractAccessableCourseNode implements Persis
 	public static void removeEvaluationFormReference(ModuleConfiguration moduleConfig) {
 		moduleConfig.remove(CONFIG_KEY_EVAL_FORM_SOFTKEY);
 	}
-	@Override
-	public AssessmentEvaluation getUserScoreEvaluation(UserCourseEnvironment userCourseEnv) {
-		updateModuleConfigDefaults(false); //TODO uh remove
-		AssessmentConfig assessmentConfig =  new MSAssessmentConfig(getModuleConfiguration());
-		if(assessmentConfig.hasPassed() || assessmentConfig.hasScore() || assessmentConfig.hasComment()) {
-			AssessmentEntry userAssessmentEntry = getUserAssessmentEntry(null, userCourseEnv);
-			return AssessmentEvaluation.toAssessmentEvaluation(userAssessmentEntry, assessmentConfig);
-		}
-		return AssessmentEvaluation.EMPTY_EVAL;
-	}
-
-	public AssessmentEntry getUserAssessmentEntry(CourseNode courseNode, UserCourseEnvironment userCourseEnv) {
-		AssessmentManager am = userCourseEnv.getCourseEnvironment().getAssessmentManager();
-		Identity mySelf = userCourseEnv.getIdentityEnvironment().getIdentity();
-		return am.getAssessmentEntry(this, mySelf);
-	}
 
 	@Override
 	public String informOnDelete(Locale locale, ICourse course) {
diff --git a/src/main/java/org/olat/course/nodes/PortfolioCourseNode.java b/src/main/java/org/olat/course/nodes/PortfolioCourseNode.java
index 13c08630257..43e78f57384 100644
--- a/src/main/java/org/olat/course/nodes/PortfolioCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/PortfolioCourseNode.java
@@ -43,7 +43,6 @@ import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
 import org.olat.core.util.ValidationStatus;
 import org.olat.course.ICourse;
-import org.olat.course.assessment.AssessmentManager;
 import org.olat.course.condition.Condition;
 import org.olat.course.condition.interpreter.ConditionInterpreter;
 import org.olat.course.editor.CourseEditorEnv;
@@ -55,11 +54,9 @@ import org.olat.course.nodes.portfolio.PortfolioCourseNodeConfiguration.Deadline
 import org.olat.course.nodes.portfolio.PortfolioCourseNodeEditController;
 import org.olat.course.nodes.portfolio.PortfolioCourseNodeRunController;
 import org.olat.course.run.navigation.NodeRunConstructionResult;
-import org.olat.course.run.scoring.AssessmentEvaluation;
 import org.olat.course.run.userview.NodeEvaluation;
 import org.olat.course.run.userview.UserCourseEnvironment;
 import org.olat.modules.ModuleConfiguration;
-import org.olat.modules.assessment.AssessmentEntry;
 import org.olat.modules.portfolio.PortfolioService;
 import org.olat.portfolio.EPTemplateMapResource;
 import org.olat.portfolio.manager.EPFrontendManager;
@@ -290,32 +287,6 @@ public class PortfolioCourseNode extends AbstractAccessableCourseNode implements
 		nodeEval.putAccessStatus(EDIT_CONDITION_ID, editor);
 	}
 
-	@Override
-	public AssessmentEvaluation getUserScoreEvaluation(UserCourseEnvironment userCourseEnv) {
-		return null; // moved
-	}
-
-	public AssessmentEntry getUserAssessmentEntry(CourseNode courseNode, UserCourseEnvironment userCourseEnv) {
-		AssessmentManager am = userCourseEnv.getCourseEnvironment().getAssessmentManager();
-		Identity mySelf = userCourseEnv.getIdentityEnvironment().getIdentity();
-		String referenceSoftkey = getReferencedRepositoryEntrySoftkey();
-		if(referenceSoftkey == null) {
-			Long mapKey = (Long)getModuleConfiguration().get(PortfolioCourseNodeConfiguration.MAP_KEY);
-			if(mapKey != null) {
-				RepositoryEntry re = CoreSpringFactory.getImpl(EPStructureManager.class)
-						.loadPortfolioRepositoryEntryByMapKey(mapKey);
-				if(re != null) {
-					referenceSoftkey = re.getSoftkey();
-				}
-			}
-		}
-		
-		if(referenceSoftkey != null) {
-			return am.getAssessmentEntry(this, mySelf);
-		}
-		return null;
-	}
-
 	@Override
 	public void exportNode(File exportDirectory, ICourse course) {
 		RepositoryEntry re = getReferencedRepositoryEntry();
diff --git a/src/main/java/org/olat/course/nodes/ProjectBrokerCourseNode.java b/src/main/java/org/olat/course/nodes/ProjectBrokerCourseNode.java
index 7c9e7919ca2..559b2345fbb 100644
--- a/src/main/java/org/olat/course/nodes/ProjectBrokerCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/ProjectBrokerCourseNode.java
@@ -77,7 +77,6 @@ import org.olat.core.util.vfs.VFSManager;
 import org.olat.core.util.vfs.filters.VFSSystemItemFilter;
 import org.olat.core.util.xml.XStreamHelper;
 import org.olat.course.ICourse;
-import org.olat.course.assessment.AssessmentManager;
 import org.olat.course.condition.Condition;
 import org.olat.course.condition.interpreter.ConditionExpression;
 import org.olat.course.condition.interpreter.ConditionInterpreter;
@@ -99,14 +98,12 @@ import org.olat.course.nodes.ta.ReturnboxController;
 import org.olat.course.properties.CoursePropertyManager;
 import org.olat.course.properties.PersistingCoursePropertyManager;
 import org.olat.course.run.navigation.NodeRunConstructionResult;
-import org.olat.course.run.scoring.AssessmentEvaluation;
 import org.olat.course.run.userview.NodeEvaluation;
 import org.olat.course.run.userview.UserCourseEnvironment;
 import org.olat.group.BusinessGroup;
 import org.olat.group.BusinessGroupService;
 import org.olat.group.model.BusinessGroupReference;
 import org.olat.modules.ModuleConfiguration;
-import org.olat.modules.assessment.AssessmentEntry;
 import org.olat.properties.Property;
 import org.olat.repository.RepositoryEntry;
 import org.olat.resource.OLATResource;
@@ -464,17 +461,6 @@ public class ProjectBrokerCourseNode extends GenericCourseNode implements Persis
 		this.conditionProjectBroker = condition;
 	}
 
-	@Override
-	public AssessmentEvaluation getUserScoreEvaluation(UserCourseEnvironment userCourseEnv) {
-		return null; // moved
-	}
-
-	public AssessmentEntry getUserAssessmentEntry(CourseNode courseNode, UserCourseEnvironment userCourseEnv) {
-		AssessmentManager am = userCourseEnv.getCourseEnvironment().getAssessmentManager();
-		Identity mySelf = userCourseEnv.getIdentityEnvironment().getIdentity();
-		return am.getAssessmentEntry(this, mySelf);
-	}
-
 	@Override
 	public void postImport(File importDirectory, ICourse course, CourseEnvironmentMapper envMapper, Processing processType) {
 		// initialize managers
diff --git a/src/main/java/org/olat/course/nodes/STCourseNode.java b/src/main/java/org/olat/course/nodes/STCourseNode.java
index 9cf34ddf90f..18eeeb0ac3d 100644
--- a/src/main/java/org/olat/course/nodes/STCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/STCourseNode.java
@@ -68,7 +68,6 @@ import org.olat.course.nodes.st.STCourseNodeEditController;
 import org.olat.course.nodes.st.STCourseNodeRunController;
 import org.olat.course.nodes.st.STPeekViewController;
 import org.olat.course.run.navigation.NodeRunConstructionResult;
-import org.olat.course.run.scoring.AssessmentEvaluation;
 import org.olat.course.run.scoring.FailedEvaluationType;
 import org.olat.course.run.scoring.ScoreCalculator;
 import org.olat.course.run.scoring.ScoreEvaluation;
@@ -242,18 +241,6 @@ public class STCourseNode extends AbstractAccessableCourseNode implements Assess
 		}
 	}
 
-	/**
-	 * the structure node does not have a score itself, but calculates the
-	 * score/passed info by evaluating the configured expression in the the
-	 * (condition)interpreter.
-	 * 
-	 * @see org.olat.course.nodes.AssessableCourseNode#getUserScoreEvaluation(org.olat.course.run.userview.UserCourseEnvironment)
-	 */
-	@Override
-	public AssessmentEvaluation getUserScoreEvaluation(UserCourseEnvironment userCourseEnv) {
-		return null; // moved
-	}
-
 	@Override
 	public StatusDescription isConfigValid() {
 		if (oneClickStatusCache != null) { return oneClickStatusCache[0]; }
diff --git a/src/main/java/org/olat/course/nodes/ScormCourseNode.java b/src/main/java/org/olat/course/nodes/ScormCourseNode.java
index 468b5d2947f..6fbd0ec3961 100644
--- a/src/main/java/org/olat/course/nodes/ScormCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/ScormCourseNode.java
@@ -51,7 +51,6 @@ import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
 import org.olat.core.util.ZipUtil;
 import org.olat.course.ICourse;
-import org.olat.course.assessment.AssessmentManager;
 import org.olat.course.editor.CourseEditorEnv;
 import org.olat.course.editor.NodeEditController;
 import org.olat.course.editor.StatusDescription;
@@ -60,12 +59,10 @@ import org.olat.course.nodes.scorm.ScormEditController;
 import org.olat.course.nodes.scorm.ScormRunController;
 import org.olat.course.properties.CoursePropertyManager;
 import org.olat.course.run.navigation.NodeRunConstructionResult;
-import org.olat.course.run.scoring.AssessmentEvaluation;
 import org.olat.course.run.userview.NodeEvaluation;
 import org.olat.course.run.userview.UserCourseEnvironment;
 import org.olat.fileresource.types.ScormCPFileResource;
 import org.olat.modules.ModuleConfiguration;
-import org.olat.modules.assessment.AssessmentEntry;
 import org.olat.modules.scorm.ScormMainManager;
 import org.olat.modules.scorm.ScormPackageConfig;
 import org.olat.modules.scorm.archiver.ScormExportManager;
@@ -357,18 +354,7 @@ public class ScormCourseNode extends AbstractAccessableCourseNode implements Per
 		}
 		return true;
 	}
-
-	@Override
-	public AssessmentEvaluation getUserScoreEvaluation(UserCourseEnvironment userCourseEnv) {
-		return null; // moved
-	}
-
-	public AssessmentEntry getUserAssessmentEntry(CourseNode courseNode, UserCourseEnvironment userCourseEnv) {
-		AssessmentManager am = userCourseEnv.getCourseEnvironment().getAssessmentManager();
-		Identity mySelf = userCourseEnv.getIdentityEnvironment().getIdentity();
-		return am.getAssessmentEntry(this, mySelf);//we want t
-	}
-
+	
 	@Override
 	public void cleanupOnDelete(ICourse course) {
 		super.cleanupOnDelete(course);
diff --git a/src/main/java/org/olat/course/nodes/TACourseNode.java b/src/main/java/org/olat/course/nodes/TACourseNode.java
index 2ae33ed9579..0eff13d9734 100644
--- a/src/main/java/org/olat/course/nodes/TACourseNode.java
+++ b/src/main/java/org/olat/course/nodes/TACourseNode.java
@@ -88,12 +88,10 @@ import org.olat.course.properties.CoursePropertyManager;
 import org.olat.course.properties.PersistingCoursePropertyManager;
 import org.olat.course.run.environment.CourseEnvironment;
 import org.olat.course.run.navigation.NodeRunConstructionResult;
-import org.olat.course.run.scoring.AssessmentEvaluation;
 import org.olat.course.run.scoring.ScoreEvaluation;
 import org.olat.course.run.userview.NodeEvaluation;
 import org.olat.course.run.userview.UserCourseEnvironment;
 import org.olat.modules.ModuleConfiguration;
-import org.olat.modules.assessment.AssessmentEntry;
 import org.olat.modules.assessment.Role;
 import org.olat.properties.Property;
 import org.olat.repository.RepositoryEntry;
@@ -443,17 +441,6 @@ public class TACourseNode extends GenericCourseNode implements PersistentAssessa
 		this.conditionSolution = conditionSolution;
 	}
 
-	@Override
-	public AssessmentEvaluation getUserScoreEvaluation(UserCourseEnvironment userCourseEnv) {
-		return null; // moved
-	}
-
-	public AssessmentEntry getUserAssessmentEntry(CourseNode courseNode, UserCourseEnvironment userCourseEnv) {
-		AssessmentManager am = userCourseEnv.getCourseEnvironment().getAssessmentManager();
-		Identity mySelf = userCourseEnv.getIdentityEnvironment().getIdentity();
-		return am.getAssessmentEntry(this, mySelf);
-	}
-
 	//TODO uh anders als die Default Implemntation notwendig?
 	public void updateUserScoreEvaluation(ScoreEvaluation scoreEval, UserCourseEnvironment userCourseEnvironment,
 			Identity coachingIdentity, boolean incrementAttempts, Role by) {
diff --git a/src/main/java/org/olat/course/nodes/basiclti/CourseNodeOutcomeMapper.java b/src/main/java/org/olat/course/nodes/basiclti/CourseNodeOutcomeMapper.java
index 664f47d3ec7..df42049a485 100644
--- a/src/main/java/org/olat/course/nodes/basiclti/CourseNodeOutcomeMapper.java
+++ b/src/main/java/org/olat/course/nodes/basiclti/CourseNodeOutcomeMapper.java
@@ -134,7 +134,8 @@ public class CourseNodeOutcomeMapper extends OutcomeMapper {
 		if(node instanceof BasicLTICourseNode) {
 			BasicLTICourseNode ltiNode = (BasicLTICourseNode)node;
 			UserCourseEnvironment userCourseEnv = getUserCourseEnvironment(course);
-			ScoreEvaluation eval = ltiNode.getUserScoreEvaluation(userCourseEnv);
+			CourseAssessmentService courseAssessmentService = CoreSpringFactory.getImpl(CourseAssessmentService.class);
+			ScoreEvaluation eval = courseAssessmentService.getUserScoreEvaluation(ltiNode, userCourseEnv);
 			String score = "";
 			if(eval != null && eval.getScore() != null) {
 				float scaledScore = eval.getScore();
diff --git a/src/main/java/org/olat/course/nodes/basiclti/LTIAssessmentHandler.java b/src/main/java/org/olat/course/nodes/basiclti/LTIAssessmentHandler.java
index 8a41714faa9..c6d9bac9d66 100644
--- a/src/main/java/org/olat/course/nodes/basiclti/LTIAssessmentHandler.java
+++ b/src/main/java/org/olat/course/nodes/basiclti/LTIAssessmentHandler.java
@@ -31,8 +31,8 @@ import org.olat.course.assessment.handler.AssessmentHandler;
 import org.olat.course.assessment.ui.tool.AssessmentCourseNodeController;
 import org.olat.course.nodes.BasicLTICourseNode;
 import org.olat.course.nodes.CourseNode;
+import org.olat.course.run.scoring.AssessmentEvaluation;
 import org.olat.course.run.scoring.ScoreCalculator;
-import org.olat.course.run.scoring.ScoreEvaluation;
 import org.olat.course.run.userview.UserCourseEnvironment;
 import org.olat.group.BusinessGroup;
 import org.olat.ims.lti.ui.LTIResultDetailsController;
@@ -70,7 +70,7 @@ public class LTIAssessmentHandler implements AssessmentHandler {
 	}
 
 	@Override
-	public ScoreEvaluation getCalculatedScoreEvaluation(CourseNode courseNode,
+	public AssessmentEvaluation getCalculatedScoreEvaluation(CourseNode courseNode,
 			UserCourseEnvironment userCourseEnvironment) {
 		return null;
 	}
diff --git a/src/main/java/org/olat/course/nodes/basiclti/LTIRunController.java b/src/main/java/org/olat/course/nodes/basiclti/LTIRunController.java
index f18e2ac9613..6f3e62b37fd 100644
--- a/src/main/java/org/olat/course/nodes/basiclti/LTIRunController.java
+++ b/src/main/java/org/olat/course/nodes/basiclti/LTIRunController.java
@@ -342,7 +342,7 @@ public class LTIRunController extends BasicController {
 			Integer attempts = courseAssessmentService.getUserAttempts(courseNode, userCourseEnv);
 			startPage.contextPut("attempts", attempts);
 	    
-			ScoreEvaluation eval = courseNode.getUserScoreEvaluation(userCourseEnv);
+			ScoreEvaluation eval = courseAssessmentService.getUserScoreEvaluation(courseNode, userCourseEnv);
 			Float cutValue = config.getFloatEntry(BasicLTICourseNode.CONFIG_KEY_PASSED_CUT_VALUE);
 			if(cutValue != null) {
 				startPage.contextPut("hasPassedValue", Boolean.TRUE);
diff --git a/src/main/java/org/olat/course/nodes/cl/CheckListAssessmentHandler.java b/src/main/java/org/olat/course/nodes/cl/CheckListAssessmentHandler.java
index 6ec5baa8dcf..b56ecb55314 100644
--- a/src/main/java/org/olat/course/nodes/cl/CheckListAssessmentHandler.java
+++ b/src/main/java/org/olat/course/nodes/cl/CheckListAssessmentHandler.java
@@ -34,8 +34,8 @@ import org.olat.course.assessment.ui.tool.AssessmentCourseNodeController;
 import org.olat.course.nodes.CheckListCourseNode;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.cl.ui.AssessedIdentityCheckListController;
+import org.olat.course.run.scoring.AssessmentEvaluation;
 import org.olat.course.run.scoring.ScoreCalculator;
-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;
@@ -71,7 +71,7 @@ public class CheckListAssessmentHandler implements AssessmentHandler {
 	}
 
 	@Override
-	public ScoreEvaluation getCalculatedScoreEvaluation(CourseNode courseNode,
+	public AssessmentEvaluation getCalculatedScoreEvaluation(CourseNode courseNode,
 			UserCourseEnvironment userCourseEnvironment) {
 		return null;
 	}
diff --git a/src/main/java/org/olat/course/nodes/cl/ui/CheckListRunController.java b/src/main/java/org/olat/course/nodes/cl/ui/CheckListRunController.java
index f3b73576e6c..3ebc74e2aec 100644
--- a/src/main/java/org/olat/course/nodes/cl/ui/CheckListRunController.java
+++ b/src/main/java/org/olat/course/nodes/cl/ui/CheckListRunController.java
@@ -203,7 +203,7 @@ public class CheckListRunController extends FormBasicController implements Contr
 	}
 	
 	private void exposeUserDataToVC(UserRequest ureq, FormLayoutContainer layoutCont) {
-		AssessmentEntry scoreEval = courseNode.getUserAssessmentEntry(null, userCourseEnv);
+		AssessmentEntry scoreEval = courseAssessmentService.getAssessmentEntry(courseNode, userCourseEnv);
 		if(scoreEval == null) {
 			layoutCont.contextPut("score", null);
 			layoutCont.contextPut("hasPassedValue", Boolean.FALSE);
diff --git a/src/main/java/org/olat/course/nodes/gta/AbstractGTAAssessmentHandler.java b/src/main/java/org/olat/course/nodes/gta/AbstractGTAAssessmentHandler.java
index 7cd755d6c9e..b1c65b4580d 100644
--- a/src/main/java/org/olat/course/nodes/gta/AbstractGTAAssessmentHandler.java
+++ b/src/main/java/org/olat/course/nodes/gta/AbstractGTAAssessmentHandler.java
@@ -34,8 +34,8 @@ import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.GTACourseNode;
 import org.olat.course.nodes.gta.ui.GTAAssessmentDetailsController;
 import org.olat.course.nodes.gta.ui.GTAIdentityListCourseNodeController;
+import org.olat.course.run.scoring.AssessmentEvaluation;
 import org.olat.course.run.scoring.ScoreCalculator;
-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;
@@ -64,7 +64,7 @@ public abstract class AbstractGTAAssessmentHandler implements AssessmentHandler
 	}
 
 	@Override
-	public ScoreEvaluation getCalculatedScoreEvaluation(CourseNode courseNode,
+	public AssessmentEvaluation getCalculatedScoreEvaluation(CourseNode courseNode,
 			UserCourseEnvironment userCourseEnvironment) {
 		return null;
 	}
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTACoachedParticipantGradingController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTACoachedParticipantGradingController.java
index ae4bff8a729..0480c6b27f2 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/GTACoachedParticipantGradingController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/GTACoachedParticipantGradingController.java
@@ -35,6 +35,7 @@ import org.olat.core.util.resource.OresHelper;
 import org.olat.course.CourseFactory;
 import org.olat.course.ICourse;
 import org.olat.course.assessment.AssessmentHelper;
+import org.olat.course.assessment.CourseAssessmentService;
 import org.olat.course.assessment.ui.tool.AssessmentIdentityCourseNodeController;
 import org.olat.course.nodes.GTACourseNode;
 import org.olat.course.nodes.gta.GTAManager;
@@ -73,6 +74,9 @@ public class GTACoachedParticipantGradingController extends BasicController {
 
 	@Autowired
 	private GTAManager gtaManager;
+	@Autowired
+	private CourseAssessmentService courseAssessmentService;
+
 	
 	public GTACoachedParticipantGradingController(UserRequest ureq, WindowControl wControl,
 			OLATResourceable courseOres, GTACourseNode gtaNode, Task assignedTask, 
@@ -158,7 +162,7 @@ public class GTACoachedParticipantGradingController extends BasicController {
 		listenTo(msCtrl);
 		mainVC.put("msrun", msCtrl.getInitialComponent());
 		
-		AssessmentEvaluation scoreEval = gtaNode.getUserScoreEvaluation(assessedUserCourseEnv);
+		AssessmentEvaluation scoreEval = courseAssessmentService.getUserScoreEvaluation(gtaNode, assessedUserCourseEnv);
 		if(scoreEval.getAssessmentStatus() == AssessmentEntryStatus.done) {
 			if(assignedTask == null) {
 				RepositoryEntry courseEntry = coachCourseEnv.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTAParticipantController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTAParticipantController.java
index cb2ab1c652f..3e998dbd2f1 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/GTAParticipantController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/GTAParticipantController.java
@@ -54,6 +54,7 @@ import org.olat.core.util.mail.MailManager;
 import org.olat.core.util.mail.MailTemplate;
 import org.olat.core.util.mail.MailerResult;
 import org.olat.core.util.vfs.VFSContainer;
+import org.olat.course.assessment.CourseAssessmentService;
 import org.olat.course.nodes.GTACourseNode;
 import org.olat.course.nodes.MSCourseNode;
 import org.olat.course.nodes.gta.AssignmentResponse;
@@ -107,6 +108,8 @@ public class GTAParticipantController extends GTAAbstractController implements A
 	
 	@Autowired
 	private MailManager mailManager;
+	@Autowired
+	private CourseAssessmentService courseAssessmentService;
 
 	public GTAParticipantController(UserRequest ureq, WindowControl wControl,
 			GTACourseNode gtaNode, UserCourseEnvironment userCourseEnv) {
@@ -718,7 +721,7 @@ public class GTAParticipantController extends GTAAbstractController implements A
 		boolean isVisible = false;
 		if(config.getBooleanSafe(GTACourseNode.GTASK_GRADING)) {
 			if (assignedTask != null && (assignedTask.getTaskStatus() == TaskProcess.grading || assignedTask.getTaskStatus() == TaskProcess.graded)) {
-				AssessmentEvaluation eval = gtaNode.getUserScoreEvaluation(getAssessedUserCourseEnvironment());
+				AssessmentEvaluation eval = courseAssessmentService.getUserScoreEvaluation(gtaNode, getAssessedUserCourseEnvironment());
 				isVisible = eval.getUserVisible() == null || eval.getUserVisible().booleanValue();
 			}
 		} else {
diff --git a/src/main/java/org/olat/course/nodes/iq/ConfirmReopenController.java b/src/main/java/org/olat/course/nodes/iq/ConfirmReopenController.java
index 01208a562c4..75704eb54a0 100644
--- a/src/main/java/org/olat/course/nodes/iq/ConfirmReopenController.java
+++ b/src/main/java/org/olat/course/nodes/iq/ConfirmReopenController.java
@@ -85,7 +85,8 @@ public class ConfirmReopenController extends FormBasicController {
 		} else {
 			UserCourseEnvironment assessedUserCourseEnv = AssessmentHelper
 					.createAndInitUserCourseEnvironment(testSession.getIdentity(), courseEnv);
-			ScoreEvaluation scoreEval = courseNode.getUserScoreEvaluation(assessedUserCourseEnv);
+
+			ScoreEvaluation scoreEval = courseAssessmentService.getUserScoreEvaluation(courseNode, assessedUserCourseEnv);
 			ScoreEvaluation reopenedScoreEval = new ScoreEvaluation(scoreEval.getScore(), scoreEval.getPassed(),
 					AssessmentEntryStatus.inProgress, scoreEval.getUserVisible(), scoreEval.getFullyAssessed(),
 					scoreEval.getCurrentRunCompletion(), AssessmentRunStatus.running, testSession.getKey());
diff --git a/src/main/java/org/olat/course/nodes/iq/IQIdentityListCourseNodeController.java b/src/main/java/org/olat/course/nodes/iq/IQIdentityListCourseNodeController.java
index b27bdf38cd8..40b16ef1c94 100644
--- a/src/main/java/org/olat/course/nodes/iq/IQIdentityListCourseNodeController.java
+++ b/src/main/java/org/olat/course/nodes/iq/IQIdentityListCourseNodeController.java
@@ -439,7 +439,7 @@ public class IQIdentityListCourseNodeController extends IdentityListCourseNodeCo
 		for(AssessmentTestSession testSession:testSessionsToComplete) {
 			UserCourseEnvironment assessedUserCourseEnv = AssessmentHelper
 					.createAndInitUserCourseEnvironment(testSession.getIdentity(), getCourseEnvironment());
-			ScoreEvaluation scoreEval = ((IQTESTCourseNode)courseNode).getUserScoreEvaluation(assessedUserCourseEnv);
+			ScoreEvaluation scoreEval = courseAssessmentService.getUserScoreEvaluation(courseNode, assessedUserCourseEnv);
 			
 			BigDecimal finalScore = testSession.getFinalScore();
 			Float score = finalScore == null ? null : finalScore.floatValue();
diff --git a/src/main/java/org/olat/course/nodes/iq/IQTESTAssessmentHandler.java b/src/main/java/org/olat/course/nodes/iq/IQTESTAssessmentHandler.java
index bbce039ec6b..f62bb322e81 100644
--- a/src/main/java/org/olat/course/nodes/iq/IQTESTAssessmentHandler.java
+++ b/src/main/java/org/olat/course/nodes/iq/IQTESTAssessmentHandler.java
@@ -36,8 +36,8 @@ import org.olat.course.assessment.handler.NonAssessmentConfig;
 import org.olat.course.assessment.ui.tool.AssessmentCourseNodeController;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.IQTESTCourseNode;
+import org.olat.course.run.scoring.AssessmentEvaluation;
 import org.olat.course.run.scoring.ScoreCalculator;
-import org.olat.course.run.scoring.ScoreEvaluation;
 import org.olat.course.run.userview.UserCourseEnvironment;
 import org.olat.fileresource.types.ImsQTI21Resource;
 import org.olat.group.BusinessGroup;
@@ -89,7 +89,7 @@ public class IQTESTAssessmentHandler implements AssessmentHandler {
 	}
 
 	@Override
-	public ScoreEvaluation getCalculatedScoreEvaluation(CourseNode courseNode,
+	public AssessmentEvaluation getCalculatedScoreEvaluation(CourseNode courseNode,
 			UserCourseEnvironment userCourseEnvironment) {
 		return null;
 	}
diff --git a/src/main/java/org/olat/course/nodes/ms/MSAssessmentHandler.java b/src/main/java/org/olat/course/nodes/ms/MSAssessmentHandler.java
index 0dd8ddd21e8..cd0824b88a1 100644
--- a/src/main/java/org/olat/course/nodes/ms/MSAssessmentHandler.java
+++ b/src/main/java/org/olat/course/nodes/ms/MSAssessmentHandler.java
@@ -31,8 +31,8 @@ import org.olat.course.assessment.handler.AssessmentHandler;
 import org.olat.course.assessment.ui.tool.AssessmentCourseNodeController;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.MSCourseNode;
+import org.olat.course.run.scoring.AssessmentEvaluation;
 import org.olat.course.run.scoring.ScoreCalculator;
-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;
@@ -69,7 +69,7 @@ public class MSAssessmentHandler implements AssessmentHandler {
 	}
 
 	@Override
-	public ScoreEvaluation getCalculatedScoreEvaluation(CourseNode courseNode,
+	public AssessmentEvaluation getCalculatedScoreEvaluation(CourseNode courseNode,
 			UserCourseEnvironment userCourseEnvironment) {
 		return null;
 	}
diff --git a/src/main/java/org/olat/course/nodes/portfolio/PortfolioAssessmentHandler.java b/src/main/java/org/olat/course/nodes/portfolio/PortfolioAssessmentHandler.java
index 6fd9ea28dd1..4e7c582c585 100644
--- a/src/main/java/org/olat/course/nodes/portfolio/PortfolioAssessmentHandler.java
+++ b/src/main/java/org/olat/course/nodes/portfolio/PortfolioAssessmentHandler.java
@@ -32,8 +32,8 @@ import org.olat.course.assessment.handler.AssessmentHandler;
 import org.olat.course.assessment.ui.tool.AssessmentCourseNodeController;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.PortfolioCourseNode;
+import org.olat.course.run.scoring.AssessmentEvaluation;
 import org.olat.course.run.scoring.ScoreCalculator;
-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;
@@ -91,7 +91,7 @@ public class PortfolioAssessmentHandler implements AssessmentHandler {
 	}
 
 	@Override
-	public ScoreEvaluation getCalculatedScoreEvaluation(CourseNode courseNode,
+	public AssessmentEvaluation getCalculatedScoreEvaluation(CourseNode courseNode,
 			UserCourseEnvironment userCourseEnvironment) {
 		return null;
 	}
diff --git a/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerAssessmentHandler.java b/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerAssessmentHandler.java
index 1ee627cb3ab..12acddadb97 100644
--- a/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerAssessmentHandler.java
+++ b/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerAssessmentHandler.java
@@ -31,8 +31,8 @@ import org.olat.course.assessment.handler.AssessmentHandler;
 import org.olat.course.assessment.ui.tool.AssessmentCourseNodeController;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.ProjectBrokerCourseNode;
+import org.olat.course.run.scoring.AssessmentEvaluation;
 import org.olat.course.run.scoring.ScoreCalculator;
-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;
@@ -68,7 +68,7 @@ public class ProjectBrokerAssessmentHandler implements AssessmentHandler {
 	}
 
 	@Override
-	public ScoreEvaluation getCalculatedScoreEvaluation(CourseNode courseNode,
+	public AssessmentEvaluation getCalculatedScoreEvaluation(CourseNode courseNode,
 			UserCourseEnvironment userCourseEnvironment) {
 		return null;
 	}
diff --git a/src/main/java/org/olat/course/nodes/scorm/ScormAssessmentHandler.java b/src/main/java/org/olat/course/nodes/scorm/ScormAssessmentHandler.java
index 5e8bbeaf5c5..cf8237788cd 100644
--- a/src/main/java/org/olat/course/nodes/scorm/ScormAssessmentHandler.java
+++ b/src/main/java/org/olat/course/nodes/scorm/ScormAssessmentHandler.java
@@ -31,8 +31,8 @@ import org.olat.course.assessment.handler.AssessmentHandler;
 import org.olat.course.assessment.ui.tool.AssessmentCourseNodeController;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.ScormCourseNode;
+import org.olat.course.run.scoring.AssessmentEvaluation;
 import org.olat.course.run.scoring.ScoreCalculator;
-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;
@@ -69,7 +69,7 @@ public class ScormAssessmentHandler implements AssessmentHandler {
 	}
 
 	@Override
-	public ScoreEvaluation getCalculatedScoreEvaluation(CourseNode courseNode,
+	public AssessmentEvaluation getCalculatedScoreEvaluation(CourseNode courseNode,
 			UserCourseEnvironment userCourseEnvironment) {
 		return null;
 	}
diff --git a/src/main/java/org/olat/course/nodes/scorm/ScormRunController.java b/src/main/java/org/olat/course/nodes/scorm/ScormRunController.java
index ca4005594c9..42f976dce37 100644
--- a/src/main/java/org/olat/course/nodes/scorm/ScormRunController.java
+++ b/src/main/java/org/olat/course/nodes/scorm/ScormRunController.java
@@ -238,7 +238,7 @@ public class ScormRunController extends BasicController implements ScormAPICallb
 		}
 
 		if (isAssessable) {
-			ScoreEvaluation scoreEval = scormNode.getUserScoreEvaluation(userCourseEnv);
+			ScoreEvaluation scoreEval = courseAssessmentService.getUserScoreEvaluation(scormNode, userCourseEnv);
 			Float score = scoreEval.getScore();
 			if(ScormEditController.CONFIG_ASSESSABLE_TYPE_SCORE.equals(assessableType)) {
 				startPage.contextPut("score", score != null ? AssessmentHelper.getRoundedScore(score) : "0");
diff --git a/src/main/java/org/olat/course/nodes/st/STAssessmentHandler.java b/src/main/java/org/olat/course/nodes/st/STAssessmentHandler.java
index 4f71bb02e92..fdd75fb8e4f 100644
--- a/src/main/java/org/olat/course/nodes/st/STAssessmentHandler.java
+++ b/src/main/java/org/olat/course/nodes/st/STAssessmentHandler.java
@@ -35,7 +35,6 @@ import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.STCourseNode;
 import org.olat.course.run.scoring.AssessmentEvaluation;
 import org.olat.course.run.scoring.ScoreCalculator;
-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;
@@ -75,7 +74,7 @@ public class STAssessmentHandler implements AssessmentHandler {
 	}
 
 	@Override
-	public ScoreEvaluation getCalculatedScoreEvaluation(CourseNode courseNode, UserCourseEnvironment userCourseEnvironment) {
+	public AssessmentEvaluation getCalculatedScoreEvaluation(CourseNode courseNode, UserCourseEnvironment userCourseEnvironment) {
 		ScoreCalculator scoreCalculator = getScoreCalculator(courseNode);
 		if (scoreCalculator == null) { 
 			// this is a not-computable course node at the moment (no scoring/passing rules defined)
diff --git a/src/main/java/org/olat/course/nodes/ta/DropboxScoringViewController.java b/src/main/java/org/olat/course/nodes/ta/DropboxScoringViewController.java
index 35d73631c61..26ddf98c776 100644
--- a/src/main/java/org/olat/course/nodes/ta/DropboxScoringViewController.java
+++ b/src/main/java/org/olat/course/nodes/ta/DropboxScoringViewController.java
@@ -308,7 +308,7 @@ public class DropboxScoringViewController extends BasicController {
 					
 					if(node instanceof AssessableCourseNode) {
 						AssessableCourseNode acn = (AssessableCourseNode)node;
-						AssessmentEvaluation eval = acn.getUserScoreEvaluation(userCourseEnv);
+						AssessmentEvaluation eval = courseAssessmentService.getUserScoreEvaluation(node, userCourseEnv);
 						if(eval.getAssessmentStatus() == null || eval.getAssessmentStatus() == AssessmentEntryStatus.notStarted) {
 							eval = new AssessmentEvaluation(eval, AssessmentEntryStatus.inProgress);
 							courseAssessmentService.updateUserScoreEvaluation(acn, eval, userCourseEnv, coach, false, Role.coach);
@@ -344,7 +344,7 @@ public class DropboxScoringViewController extends BasicController {
 			} else if(FolderCommand.FOLDERCOMMAND_FINISHED == event) {
 				if(node instanceof AssessableCourseNode) {
 					AssessableCourseNode acn = (AssessableCourseNode)node;
-					AssessmentEvaluation eval = acn.getUserScoreEvaluation(userCourseEnv);
+					AssessmentEvaluation eval = courseAssessmentService.getUserScoreEvaluation(node, userCourseEnv);
 					if (eval == null) {
 						eval = AssessmentEvaluation.EMPTY_EVAL;
 					}
diff --git a/src/main/java/org/olat/course/nodes/ta/TAAssessmentHandler.java b/src/main/java/org/olat/course/nodes/ta/TAAssessmentHandler.java
index 28dcca487ea..54be6b959e2 100644
--- a/src/main/java/org/olat/course/nodes/ta/TAAssessmentHandler.java
+++ b/src/main/java/org/olat/course/nodes/ta/TAAssessmentHandler.java
@@ -31,8 +31,8 @@ import org.olat.course.assessment.handler.AssessmentHandler;
 import org.olat.course.assessment.ui.tool.AssessmentCourseNodeController;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.TACourseNode;
+import org.olat.course.run.scoring.AssessmentEvaluation;
 import org.olat.course.run.scoring.ScoreCalculator;
-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;
@@ -69,7 +69,7 @@ public class TAAssessmentHandler implements AssessmentHandler {
 	}
 
 	@Override
-	public ScoreEvaluation getCalculatedScoreEvaluation(CourseNode courseNode,
+	public AssessmentEvaluation getCalculatedScoreEvaluation(CourseNode courseNode,
 			UserCourseEnvironment userCourseEnvironment) {
 		return null;
 	}
diff --git a/src/main/java/org/olat/course/nodes/ta/TaskController.java b/src/main/java/org/olat/course/nodes/ta/TaskController.java
index d0c32a69661..ba99351007a 100644
--- a/src/main/java/org/olat/course/nodes/ta/TaskController.java
+++ b/src/main/java/org/olat/course/nodes/ta/TaskController.java
@@ -61,6 +61,7 @@ import org.olat.core.util.vfs.VFSItem;
 import org.olat.core.util.vfs.VFSLeaf;
 import org.olat.core.util.vfs.VFSManager;
 import org.olat.core.util.vfs.VFSMediaResource;
+import org.olat.course.assessment.CourseAssessmentService;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.TACourseNode;
 import org.olat.course.properties.CoursePropertyManager;
@@ -71,6 +72,7 @@ import org.olat.modules.ModuleConfiguration;
 import org.olat.modules.assessment.Role;
 import org.olat.modules.assessment.model.AssessmentEntryStatus;
 import org.olat.properties.Property;
+import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  * Initial Date:  02.09.2004
@@ -130,6 +132,10 @@ public class TaskController extends BasicController {
 	private String assignedTask;
 	
 	private Panel panel;
+	
+	@Autowired
+	private CourseAssessmentService courseAssessmentService;
+
 	/**
 	 * Implements a task component.
 	 * @param ureq
@@ -227,6 +233,7 @@ public class TaskController extends BasicController {
 	/**
 	 * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest, org.olat.core.gui.components.Component, org.olat.core.gui.control.Event)
 	 */
+	@Override
 	public void event(UserRequest ureq, Component source, Event event) {
 		
 		log.debug("Test Component.event source" + source + "  , event=" + event);
@@ -337,7 +344,7 @@ public class TaskController extends BasicController {
 		Property p = cpm.createCourseNodePropertyInstance(node, identity, null, PROP_ASSIGNED, null, null, task, null);
 		cpm.saveProperty(p);
 		
-		AssessmentEvaluation eval = node.getUserScoreEvaluation(userCourseEnv);
+		AssessmentEvaluation eval = courseAssessmentService.getUserScoreEvaluation(node, userCourseEnv);
 		if(eval.getAssessmentStatus() == null || eval.getAssessmentStatus() == AssessmentEntryStatus.notStarted) {
 			eval = new AssessmentEvaluation(eval, AssessmentEntryStatus.inProgress);
 			node.updateUserScoreEvaluation(eval, userCourseEnv, getIdentity(), false, Role.user);
diff --git a/src/main/java/org/olat/course/reminder/rule/PassedRuleSPI.java b/src/main/java/org/olat/course/reminder/rule/PassedRuleSPI.java
index cfd823f5010..5e1793b02df 100644
--- a/src/main/java/org/olat/course/reminder/rule/PassedRuleSPI.java
+++ b/src/main/java/org/olat/course/reminder/rule/PassedRuleSPI.java
@@ -101,13 +101,12 @@ public class PassedRuleSPI implements FilterRuleSPI {
 			if(courseNode instanceof STCourseNode) {
 				passeds = new HashMap<>();
 				
-				STCourseNode structureNode = (STCourseNode)courseNode;
 				CourseAssessmentService courseAssessmentService = CoreSpringFactory.getImpl(CourseAssessmentService.class);
 				AssessmentConfig assessmentConfig = courseAssessmentService.getAssessmentConfig(courseNode);
 				if(assessmentConfig.hasPassed()) {
 					for(Identity identity:identities) {
 						UserCourseEnvironment uce = AssessmentHelper.createAndInitUserCourseEnvironment(identity, course);
-						ScoreEvaluation scoreEval = structureNode.getUserScoreEvaluation(uce);
+						ScoreEvaluation scoreEval = courseAssessmentService.getUserScoreEvaluation(courseNode, uce);
 						Boolean passed = scoreEval.getPassed();
 						if(passed != null) {
 							passeds.put(identity.getKey(), passed);
diff --git a/src/main/java/org/olat/course/reminder/rule/ScoreRuleSPI.java b/src/main/java/org/olat/course/reminder/rule/ScoreRuleSPI.java
index 89061269305..c3bfcfd774c 100644
--- a/src/main/java/org/olat/course/reminder/rule/ScoreRuleSPI.java
+++ b/src/main/java/org/olat/course/reminder/rule/ScoreRuleSPI.java
@@ -103,13 +103,12 @@ public class ScoreRuleSPI implements FilterRuleSPI {
 			if(courseNode instanceof STCourseNode) {
 				scores = new HashMap<>();
 				
-				STCourseNode structureNode = (STCourseNode)courseNode;
 				CourseAssessmentService courseAssessmentService = CoreSpringFactory.getImpl(CourseAssessmentService.class);
 				AssessmentConfig assessmentConfig = courseAssessmentService.getAssessmentConfig(courseNode);
 				if(assessmentConfig.hasScore()) {
 					for(Identity identity:identities) {
 						UserCourseEnvironment uce = AssessmentHelper.createAndInitUserCourseEnvironment(identity, course);
-						ScoreEvaluation scoreEval = structureNode.getUserScoreEvaluation(uce);
+						ScoreEvaluation scoreEval = courseAssessmentService.getUserScoreEvaluation(courseNode, uce);
 						Float score = scoreEval.getScore();
 						if(score != null) {
 							scores.put(identity.getKey(), score);
diff --git a/src/main/java/org/olat/course/run/scoring/ScoreAccounting.java b/src/main/java/org/olat/course/run/scoring/ScoreAccounting.java
index e2e7440d855..4728f31c361 100644
--- a/src/main/java/org/olat/course/run/scoring/ScoreAccounting.java
+++ b/src/main/java/org/olat/course/run/scoring/ScoreAccounting.java
@@ -53,6 +53,7 @@ import org.olat.modules.assessment.model.AssessmentRunStatus;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryService;
 import org.olat.repository.model.RepositoryEntryLifecycle;
+import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  * Description:<BR/>
@@ -69,6 +70,9 @@ public class ScoreAccounting {
 	private boolean error;
 	private final UserCourseEnvironment userCourseEnvironment;
 	private final Map<AssessableCourseNode, AssessmentEvaluation> cachedScoreEvals = new HashMap<>();
+	
+	@Autowired
+	private CourseAssessmentService courseAssessmentService;
 
 	/**
 	 * Constructor of the user score accounting object
@@ -76,6 +80,7 @@ public class ScoreAccounting {
 	 */
 	public ScoreAccounting(UserCourseEnvironment userCourseEnvironment) {
 		this.userCourseEnvironment = userCourseEnvironment;
+		CoreSpringFactory.autowireObject(this);
 	}
 
 	/**
@@ -105,7 +110,6 @@ public class ScoreAccounting {
 			CourseNode courseNode = userCourseEnvironment.getCourseEnvironment().getRunStructure().getNode(nodeIdent);
 			if(courseNode instanceof AssessableCourseNode) {
 				AssessableCourseNode acn = (AssessableCourseNode)courseNode;
-				CourseAssessmentService courseAssessmentService = CoreSpringFactory.getImpl(CourseAssessmentService.class);
 				AssessmentEvaluation se = courseAssessmentService.toAssessmentEvaluation(entry, courseNode);
 				cachedScoreEvals.put(acn, se);
 			}
@@ -155,7 +159,6 @@ public class ScoreAccounting {
 			recursionLevel++;
 			AssessmentEvaluation se = null;
 			if (recursionLevel <= 15) {
-				CourseAssessmentService courseAssessmentService = CoreSpringFactory.getImpl(CourseAssessmentService.class);
 				AssessmentConfig assessmentConfig = courseAssessmentService.getAssessmentConfig(cn);
 				if (update && assessmentConfig.isScoreEvaluationCalculated()) {
 					AssessmentEntry entry = identToEntries.get(cn.getIdent());
@@ -168,7 +171,7 @@ public class ScoreAccounting {
 							AssessmentEntry entry = identToEntries.get(cn.getIdent());
 							se = courseAssessmentService.toAssessmentEvaluation(entry, assessmentConfig);
 						} else {
-							se = cn.getUserScoreEvaluation(userCourseEnvironment);
+							se = courseAssessmentService.getUserScoreEvaluation(cn, userCourseEnvironment);
 						}
 						cachedScoreEvals.put(cn, se);
 					}
@@ -201,7 +204,6 @@ public class ScoreAccounting {
 		private AssessmentEvaluation calculateScoreEvaluation(AssessmentEntry entry, CourseNode cNode, AssessmentConfig assessmentConfig) {
 			AssessmentEvaluation se;
 			if(assessmentConfig.hasScore() || assessmentConfig.hasPassed()) {
-				CourseAssessmentService courseAssessmentService = CoreSpringFactory.getImpl(CourseAssessmentService.class);
 				ScoreCalculator scoreCalculator = courseAssessmentService.getScoreCalculator(cNode);
 				String scoreExpressionStr = scoreCalculator.getScoreExpression();
 				String passedExpressionStr = scoreCalculator.getPassedExpression();
@@ -362,12 +364,7 @@ public class ScoreAccounting {
 	 * @return The score evaluation
 	 */
 	public AssessmentEvaluation getScoreEvaluation(CourseNode courseNode) {
-		AssessmentEvaluation se = null;
-		if (courseNode instanceof AssessableCourseNode) {
-			AssessableCourseNode acn = (AssessableCourseNode) courseNode;
-			se = acn.getUserScoreEvaluation(userCourseEnvironment);
-		}
-		return se;
+		return courseAssessmentService.getUserScoreEvaluation(courseNode, userCourseEnvironment);
 	}
 
 	/**
@@ -378,7 +375,7 @@ public class ScoreAccounting {
 	public AssessmentEvaluation evalCourseNode(AssessableCourseNode cn) {
 		AssessmentEvaluation se = cachedScoreEvals.get(cn);
 		if (se == null) { // result of this node has not been calculated yet, do it
-			se = cn.getUserScoreEvaluation(userCourseEnvironment);
+			se = getScoreEvaluation(cn);
 			cachedScoreEvals.put(cn, se);
 		}
 		return se;
diff --git a/src/main/java/org/olat/ims/qti21/ui/QTI21AssessmentDetailsController.java b/src/main/java/org/olat/ims/qti21/ui/QTI21AssessmentDetailsController.java
index 515fcda1307..d448a85e174 100644
--- a/src/main/java/org/olat/ims/qti21/ui/QTI21AssessmentDetailsController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/QTI21AssessmentDetailsController.java
@@ -432,7 +432,7 @@ public class QTI21AssessmentDetailsController extends FormBasicController {
 	private void doUpdateCourseNode(AssessmentTestSession session, AssessmentTest assessmentTest, AssessmentEntryStatus entryStatus) {
 		Double cutValue = QtiNodesExtractor.extractCutValue(assessmentTest);
 		
-		ScoreEvaluation scoreEval = courseNode.getUserScoreEvaluation(assessedUserCourseEnv);
+		ScoreEvaluation scoreEval = courseAssessmentService.getUserScoreEvaluation(courseNode, assessedUserCourseEnv);
 		BigDecimal finalScore = session.getFinalScore();
 		Float score = finalScore == null ? null : finalScore.floatValue();
 		Boolean passed = scoreEval.getPassed();
diff --git a/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityAssessmentItemController.java b/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityAssessmentItemController.java
index 1f3c797821a..ac26e1652d4 100644
--- a/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityAssessmentItemController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityAssessmentItemController.java
@@ -242,7 +242,7 @@ public class CorrectionIdentityAssessmentItemController extends FormBasicControl
 
 		UserCourseEnvironment assessedUserCourseEnv = AssessmentHelper
 				.createAndInitUserCourseEnvironment(testSession.getIdentity(), courseEnv);
-		ScoreEvaluation scoreEval = courseNode.getUserScoreEvaluation(assessedUserCourseEnv);
+		ScoreEvaluation scoreEval = courseAssessmentService.getUserScoreEvaluation(courseNode, assessedUserCourseEnv);
 		
 		BigDecimal finalScore = testSession.getFinalScore();
 		Float score = finalScore == null ? null : finalScore.floatValue();
diff --git a/src/main/java/org/olat/modules/portfolio/manager/PortfolioServiceImpl.java b/src/main/java/org/olat/modules/portfolio/manager/PortfolioServiceImpl.java
index 85895116958..ab1dcec9aa0 100644
--- a/src/main/java/org/olat/modules/portfolio/manager/PortfolioServiceImpl.java
+++ b/src/main/java/org/olat/modules/portfolio/manager/PortfolioServiceImpl.java
@@ -1441,7 +1441,7 @@ public class PortfolioServiceImpl implements PortfolioService {
 			if(courseNode instanceof PortfolioCourseNode) {
 				PortfolioCourseNode pfNode = (PortfolioCourseNode)courseNode;
 				UserCourseEnvironment userCourseEnv = AssessmentHelper.createAndInitUserCourseEnvironment(assessedIdentity, course);
-				AssessmentEvaluation eval = pfNode.getUserScoreEvaluation(userCourseEnv);
+				AssessmentEvaluation eval = courseAssessmentService.getUserScoreEvaluation(pfNode, userCourseEnv);
 				status = eval.getAssessmentStatus();
 			}
 		} else {
@@ -1468,7 +1468,7 @@ public class PortfolioServiceImpl implements PortfolioService {
 			if(courseNode instanceof PortfolioCourseNode) {
 				PortfolioCourseNode pfNode = (PortfolioCourseNode)courseNode;
 				UserCourseEnvironment userCourseEnv = AssessmentHelper.createAndInitUserCourseEnvironment(assessedIdentity, course);
-				AssessmentEvaluation eval = pfNode.getUserScoreEvaluation(userCourseEnv);
+				AssessmentEvaluation eval = courseAssessmentService.getUserScoreEvaluation(pfNode, userCourseEnv);
 				
 				ScoreEvaluation scoreEval= new ScoreEvaluation(eval.getScore(), eval.getPassed(), status, true, fullyAssessed, null, null, binder.getKey());
 				courseAssessmentService.updateUserScoreEvaluation(courseNode, scoreEval, userCourseEnv,
diff --git a/src/main/java/org/olat/modules/scorm/ScormAPIMapper.java b/src/main/java/org/olat/modules/scorm/ScormAPIMapper.java
index 73b061b2949..cbf793b0ecc 100644
--- a/src/main/java/org/olat/modules/scorm/ScormAPIMapper.java
+++ b/src/main/java/org/olat/modules/scorm/ScormAPIMapper.java
@@ -118,10 +118,10 @@ public class ScormAPIMapper implements Mapper, ScormAPICallback, Serializable {
 			CourseAssessmentService courseAssessmentService = CoreSpringFactory.getImpl(CourseAssessmentService.class);
 			AssessmentConfig assessmentConfig = courseAssessmentService.getAssessmentConfig(scormNode);
 			if(assessmentConfig.hasScore()) {
-				currentScore = scormNode.getUserScoreEvaluation(userCourseEnv).getScore();
+				currentScore = courseAssessmentService.getUserScoreEvaluation(scormNode, userCourseEnv).getScore();
 			}
 			if(assessmentConfig.hasPassed()) {
-				currentPassed = scormNode.getUserScoreEvaluation(userCourseEnv).getPassed();
+				currentPassed = courseAssessmentService.getUserScoreEvaluation(scormNode, userCourseEnv).getPassed();
 			}
 		}
 	}
@@ -213,7 +213,7 @@ public class ScormAPIMapper implements Mapper, ScormAPICallback, Serializable {
 				}
 			} else if (!config.getBooleanSafe(ScormEditController.CONFIG_ATTEMPTSDEPENDONSCORE, false)) {
 				boolean increment = !attemptsIncremented && finish;
-				ScoreEvaluation sceval = scormNode.getUserScoreEvaluation(userCourseEnv);
+				ScoreEvaluation sceval = courseAssessmentService.getUserScoreEvaluation(scormNode, userCourseEnv);
 				courseAssessmentService.updateUserScoreEvaluation(scormNode, sceval, userCourseEnv, identity, increment,
 						Role.user);
 				if(increment) {
@@ -278,7 +278,7 @@ public class ScormAPIMapper implements Mapper, ScormAPICallback, Serializable {
 				}
 			} else if (!config.getBooleanSafe(ScormEditController.CONFIG_ATTEMPTSDEPENDONSCORE, false)) {
 				boolean increment = !attemptsIncremented && finish;
-				ScoreEvaluation sceval = scormNode.getUserScoreEvaluation(userCourseEnv);
+				ScoreEvaluation sceval = courseAssessmentService.getUserScoreEvaluation(scormNode, userCourseEnv);
 				courseAssessmentService.updateUserScoreEvaluation(scormNode, sceval, userCourseEnv, identity, increment,
 						Role.user);
 				if(increment) {
-- 
GitLab