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 36ca56576e7e609aec5b899ca5b02049706f9908..a0655b8254f475be188f6fbabc182c76e6a01008 100644
--- a/src/main/java/org/olat/course/assessment/manager/CourseAssessmentServiceImpl.java
+++ b/src/main/java/org/olat/course/assessment/manager/CourseAssessmentServiceImpl.java
@@ -22,12 +22,15 @@ package org.olat.course.assessment.manager;
 import java.io.File;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import javax.annotation.PostConstruct;
 
 import org.apache.logging.log4j.Logger;
+import org.olat.basesecurity.GroupRoles;
 import org.olat.core.commons.persistence.DBFactory;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.stack.BreadcrumbPanel;
@@ -46,7 +49,6 @@ import org.olat.course.assessment.handler.NonAssessmentHandler;
 import org.olat.course.assessment.ui.tool.AssessmentCourseNodeController;
 import org.olat.course.auditing.UserNodeAuditManager;
 import org.olat.course.config.CourseConfig;
-import org.olat.course.nodeaccess.NodeAccessService;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.properties.CoursePropertyManager;
 import org.olat.course.run.environment.CourseEnvironment;
@@ -65,6 +67,8 @@ import org.olat.modules.assessment.model.AssessmentRunStatus;
 import org.olat.modules.assessment.ui.AssessmentToolContainer;
 import org.olat.modules.assessment.ui.AssessmentToolSecurityCallback;
 import org.olat.repository.RepositoryEntry;
+import org.olat.repository.RepositoryEntryRelationType;
+import org.olat.repository.RepositoryService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -82,7 +86,7 @@ public class CourseAssessmentServiceImpl implements CourseAssessmentService, Nod
 	private static final String NON_ASSESSMENT_TYPE = NonAssessmentHandler.NODE_TYPE;
 	
 	@Autowired
-	private NodeAccessService nodeAccsessService;
+	private RepositoryService repositoryService;
 	
 	@Autowired
 	private List<AssessmentHandler> loadedAssessmentHandlers;
@@ -347,13 +351,19 @@ public class CourseAssessmentServiceImpl implements CourseAssessmentService, Nod
 	public void evaluateAll(ICourse course) {
 		log.debug("Evaluate all score accountings for course {}", course);
 		CourseEnvironment courseEnv = course.getCourseEnvironment();
+		RepositoryEntry courseEntry = courseEnv.getCourseGroupManager().getCourseEntry();
 		CoursePropertyManager pm = courseEnv.getCoursePropertyManager();
+		
+		Set<Identity> identities = new HashSet<>();
 		List<Identity> assessedIdentities = pm.getAllIdentitiesWithCourseAssessmentData(null);
+		identities.addAll(assessedIdentities);
+		List<Identity> members = repositoryService.getMembers(courseEntry, RepositoryEntryRelationType.all, GroupRoles.participant.name());
+		identities.addAll(members);
 		
 		int count = 0;
-		for(Identity assessedIdentity: assessedIdentities) {
-			evaluateAll(courseEnv, assessedIdentity);
-			log.debug("Evaluated score accounting in course {} for {}", course, assessedIdentity);
+		for(Identity identity: identities) {
+			evaluateAll(courseEnv, identity);
+			log.debug("Evaluated score accounting in course {} for {}", course, identity);
 			if(++count % 10 == 0) {
 				DBFactory.getInstance().commitAndCloseSession();
 			}
diff --git a/src/main/java/org/olat/upgrade/OLATUpgrade_15_pre_0.java b/src/main/java/org/olat/upgrade/OLATUpgrade_15_pre_0.java
new file mode 100644
index 0000000000000000000000000000000000000000..3b28bb575876d08f362fb2064a1ce7a8353a8ad6
--- /dev/null
+++ b/src/main/java/org/olat/upgrade/OLATUpgrade_15_pre_0.java
@@ -0,0 +1,203 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.upgrade;
+
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.logging.log4j.Logger;
+import org.olat.core.commons.persistence.DB;
+import org.olat.core.commons.persistence.QueryBuilder;
+import org.olat.core.logging.Tracing;
+import org.olat.course.CorruptedCourseException;
+import org.olat.course.CourseFactory;
+import org.olat.course.ICourse;
+import org.olat.course.Structure;
+import org.olat.course.assessment.CourseAssessmentService;
+import org.olat.course.nodes.CourseNode;
+import org.olat.repository.RepositoryEntry;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * 
+ * Initial date: 6 dec 2019<br>
+ * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
+ *
+ */
+public class OLATUpgrade_15_pre_0 extends OLATUpgrade {
+
+	private static final Logger log = Tracing.createLoggerFor(OLATUpgrade_15_pre_0.class);
+	
+	private static final String VERSION = "OLAT_15.pre.0";
+	private static final String INIT_ASSESSMENT_ENTRY_ROOT = "INIT ASESSMENT ENTRY ROOT";
+	
+	@Autowired
+	private DB dbInstance;
+	@Autowired
+	private CourseAssessmentService courseAssessmentService;
+	
+	public OLATUpgrade_15_pre_0() {
+		super();
+	}
+	
+	@Override
+	public String getVersion() {
+		return VERSION;
+	}
+
+	@Override
+	public boolean doPostSystemInitUpgrade(UpgradeManager upgradeManager) {
+		UpgradeHistoryData uhd = upgradeManager.getUpgradesHistory(VERSION);
+		if (uhd == null) {
+			// has never been called, initialize
+			uhd = new UpgradeHistoryData();
+		} else if (uhd.isInstallationComplete()) {
+			return false;
+		}
+		
+		boolean allOk = true;
+		allOk &= migrateAssessmentEntry(upgradeManager, uhd);
+
+		uhd.setInstallationComplete(allOk);
+		upgradeManager.setUpgradesHistory(uhd, VERSION);
+		if(allOk) {
+			log.info(Tracing.M_AUDIT, "Finished OLATUpgrade_15_pre_0 successfully!");
+		} else {
+			log.info(Tracing.M_AUDIT, "OLATUpgrade_15_pre_0 not finished, try to restart OpenOlat!");
+		}
+		return allOk;
+	}
+	
+	
+	private boolean migrateAssessmentEntry(UpgradeManager upgradeManager, UpgradeHistoryData uhd) {
+		boolean allOk = true;
+		if (!uhd.getBooleanDataValue(INIT_ASSESSMENT_ENTRY_ROOT)) {
+			try {
+				migrateCourseAssessmentEntries();
+				migrateOtherRepositoryEntryRoot();
+				dbInstance.commitAndCloseSession();
+				log.info("All assessment entries migrated.");
+			} catch (Exception e) {
+				log.error("", e);
+				allOk = false;
+			}
+			
+			uhd.setBooleanDataValue(INIT_ASSESSMENT_ENTRY_ROOT, allOk);
+			upgradeManager.setUpgradesHistory(uhd, VERSION);
+		}
+		return allOk;
+	}
+
+	private void migrateCourseAssessmentEntries() {
+		List<RepositoryEntry> courseEntries = getCourseEntries();
+
+		AtomicInteger migrationCounter = new AtomicInteger(0);
+		for (RepositoryEntry repositoryEntry : courseEntries) {
+			migrateCourseAssessmentEntries(repositoryEntry);
+			migrationCounter.incrementAndGet();
+			if(migrationCounter.get() % 25 == 0) {
+				dbInstance.commitAndCloseSession();
+			} else {
+				dbInstance.commit();
+			}
+			if(migrationCounter.get() % 100 == 0) {
+				log.info("Assessment entries: num. of courses migrated: {}", migrationCounter);
+			}
+		}
+	}
+
+	private List<RepositoryEntry> getCourseEntries() {
+		QueryBuilder sb = new QueryBuilder();
+		sb.append("select re");
+		sb.append("  from repositoryentry re");
+		sb.append("       inner join re.olatResource as ores");
+		sb.and().append(" ores.resName = 'CourseModule'");
+		
+		return dbInstance.getCurrentEntityManager()
+				.createQuery(sb.toString(), RepositoryEntry.class)
+				.getResultList();
+	}
+
+	private void migrateCourseAssessmentEntries(RepositoryEntry repositoryEntry) {
+		try {
+			ICourse course = CourseFactory.loadCourse(repositoryEntry);
+			if (course != null) {
+				Structure runStructure = course.getCourseEnvironment().getRunStructure();
+				if (runStructure != null) {
+					CourseNode rootNode = runStructure.getRootNode();
+					if (rootNode != null) {
+						String ident = rootNode.getIdent();
+						setRootEntryTrue(repositoryEntry, ident);
+						setRootEntryFalse(repositoryEntry, ident);
+						courseAssessmentService.evaluateAll(course);
+						log.info("Assessment entries migrated: course {} ({}).",
+								repositoryEntry.getKey(), repositoryEntry.getDisplayname());
+					}
+				}
+			}
+		} catch (CorruptedCourseException e) {
+			// do nothing
+		}
+	}
+
+	private void setRootEntryTrue(RepositoryEntry repositoryEntry, String ident) {
+		QueryBuilder sb = new QueryBuilder();
+		sb.append("update assessmententry ae");
+		sb.append("   set ae.entryRoot=true");
+		sb.and().append("entryRoot is null");
+		sb.and().append("ae.repositoryEntry.key = :repoKey");
+		sb.and().append("ae.subIdent = :subIdent");
+		
+		dbInstance.getCurrentEntityManager()
+				.createQuery(sb.toString())
+				.setParameter("repoKey", repositoryEntry.getKey())
+				.setParameter("subIdent", ident)
+				.executeUpdate();
+	}
+	
+	private void setRootEntryFalse(RepositoryEntry repositoryEntry, String ident) {
+		QueryBuilder sb = new QueryBuilder();
+		sb.append("update assessmententry ae");
+		sb.append("   set ae.entryRoot=false");
+		sb.and().append("entryRoot is null");
+		sb.and().append("ae.repositoryEntry.key = :repoKey");
+		sb.and().append("ae.subIdent <> :subIdent");
+		
+		dbInstance.getCurrentEntityManager()
+				.createQuery(sb.toString())
+				.setParameter("repoKey", repositoryEntry.getKey())
+				.setParameter("subIdent", ident)
+				.executeUpdate();
+	}
+
+	private void migrateOtherRepositoryEntryRoot() {
+		QueryBuilder sb = new QueryBuilder();
+		sb.append("update assessmententry ae");
+		sb.append("   set ae.entryRoot=true");
+		sb.and().append("entryRoot is null");
+		
+		dbInstance.getCurrentEntityManager()
+				.createQuery(sb.toString())
+				.executeUpdate();
+		
+		log.info("Updated entry root for assessment entries of other than courses.");
+	}
+	
+}
diff --git a/src/main/java/org/olat/upgrade/_spring/upgradeContext.xml b/src/main/java/org/olat/upgrade/_spring/upgradeContext.xml
index 41caa9939e29024b5522b5b12ca5de9fb1a6427d..fe20eb327e2851641c31f351ad9b25d09acc9b41 100644
--- a/src/main/java/org/olat/upgrade/_spring/upgradeContext.xml
+++ b/src/main/java/org/olat/upgrade/_spring/upgradeContext.xml
@@ -53,6 +53,7 @@
 				<bean id="upgrade_14_0_3" class="org.olat.upgrade.OLATUpgrade_14_0_3"/>
 				<bean id="upgrade_14_0_5" class="org.olat.upgrade.OLATUpgrade_14_0_5"/>
 				<bean id="upgrade_14_1_0" class="org.olat.upgrade.OLATUpgrade_14_1_0"/>
+				<bean id="upgrade_14_2_0" class="org.olat.upgrade.OLATUpgrade_15_pre_0"/>
 			</list>
 		</property>
 	</bean>