diff --git a/src/main/java/org/olat/course/assessment/AssessmentManager.java b/src/main/java/org/olat/course/assessment/AssessmentManager.java
index 2082f448fdbfffc90ba0e335b3bfb4a3c7328f46..c005b8af263d5cb0e71bb064b8dc7c93d6bbb0a5 100644
--- a/src/main/java/org/olat/course/assessment/AssessmentManager.java
+++ b/src/main/java/org/olat/course/assessment/AssessmentManager.java
@@ -294,7 +294,7 @@ public interface AssessmentManager {
 	
 	public AssessmentEntry getAssessmentEntry(CourseNode courseNode, Identity assessedIdentity);
 	
-	public AssessmentEntry createAssessmentEntry(CourseNode courseNode, Identity assessedIdentity, ScoreEvaluation scoreEvaluation);
+	public AssessmentEntry getOrCreateAssessmentEntry(CourseNode courseNode, Identity assessedIdentity, Boolean entryRoot);
 	
 	public AssessmentEntry updateAssessmentEntry(AssessmentEntry assessmentEntry);
 
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 44e713d4f6d116849a549c5a81c7605d1a902d4b..5f25d31fe13ae901456562df094cfda6d0d4f348 100644
--- a/src/main/java/org/olat/course/assessment/manager/CourseAssessmentManagerImpl.java
+++ b/src/main/java/org/olat/course/assessment/manager/CourseAssessmentManagerImpl.java
@@ -64,7 +64,6 @@ import org.olat.course.groupsandrights.CourseGroupManager;
 import org.olat.course.nodeaccess.NodeAccessService;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.run.environment.CourseEnvironment;
-import org.olat.course.run.scoring.AssessmentEvaluation;
 import org.olat.course.run.scoring.ScoreAccounting;
 import org.olat.course.run.scoring.ScoreEvaluation;
 import org.olat.course.run.userview.UserCourseEnvironment;
@@ -114,12 +113,13 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
 		CoreSpringFactory.autowireObject(this);
 	}
 
-	private AssessmentEntry getOrCreate(Identity assessedIdentity, CourseNode courseNode) {
-		return assessmentService.getOrCreateAssessmentEntry(assessedIdentity, null, cgm.getCourseEntry(), courseNode.getIdent(), courseNode.getReferencedRepositoryEntry());
+	@Override
+	public AssessmentEntry getOrCreateAssessmentEntry(CourseNode courseNode, Identity assessedIdentity, Boolean entryRoot) {
+		return assessmentService.getOrCreateAssessmentEntry(assessedIdentity, null, cgm.getCourseEntry(), courseNode.getIdent(), entryRoot, courseNode.getReferencedRepositoryEntry());
 	}
 	
-	private AssessmentEntry getOrCreate(Identity assessedIdentity, String subIdent, RepositoryEntry referenceEntry) {
-		return assessmentService.getOrCreateAssessmentEntry(assessedIdentity, null, cgm.getCourseEntry(), subIdent, referenceEntry);
+	private AssessmentEntry getOrCreate(Identity assessedIdentity, String subIdent, Boolean entryRoot, RepositoryEntry referenceEntry) {
+		return assessmentService.getOrCreateAssessmentEntry(assessedIdentity, null, cgm.getCourseEntry(), subIdent, entryRoot, referenceEntry);
 	}
 
 	@Override
@@ -148,32 +148,6 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
 		return assessmentService.loadAssessmentEntries(assessedGoup, cgm.getCourseEntry(), courseNode.getIdent());
 	}
 
-	@Override
-	public AssessmentEntry createAssessmentEntry(CourseNode courseNode, Identity assessedIdentity, ScoreEvaluation scoreEvaluation) {
-		RepositoryEntry referenceEntry = null;
-		if(courseNode.needsReferenceToARepositoryEntry()) {
-			referenceEntry = courseNode.getReferencedRepositoryEntry();
-		}
-		Float score = null;
-		Boolean passed = null;
-		Date lastUserModified = null;
-		Date lastCoachModified = null;
-		if(scoreEvaluation != null) {
-			score = scoreEvaluation.getScore();
-			passed = scoreEvaluation.getPassed();
-		}
-		if(scoreEvaluation instanceof AssessmentEvaluation) {
-			AssessmentEvaluation eval = (AssessmentEvaluation)scoreEvaluation;
-			lastCoachModified = eval.getLastCoachModified();
-			lastUserModified = eval.getLastUserModified();
-		}
-		AssessmentEntry createAssessmentEntry = assessmentService
-				.createAssessmentEntry(assessedIdentity, null, cgm.getCourseEntry(), courseNode.getIdent(), referenceEntry,
-						score, passed, lastUserModified, lastCoachModified);
-		DBFactory.getInstance().commit();
-		return createAssessmentEntry;
-	}
-
 	@Override
 	public AssessmentEntry updateAssessmentEntry(AssessmentEntry assessmentEntry) {
 		AssessmentEntry updateAssessmentEntry = assessmentService.updateAssessmentEntry(assessmentEntry);
@@ -185,7 +159,8 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
 	public void saveNodeAttempts(CourseNode courseNode, Identity identity, Identity assessedIdentity, Integer attempts, Role by) {
 		ICourse course = CourseFactory.loadCourse(cgm.getCourseEntry());
 		
-		AssessmentEntry nodeAssessment = getOrCreate(assessedIdentity, courseNode);
+		Boolean entryRoot = isEntryRoot(course, courseNode);
+		AssessmentEntry nodeAssessment = getOrCreateAssessmentEntry(courseNode, assessedIdentity, entryRoot);
 		if(by == Role.coach) {
 			nodeAssessment.setLastCoachModified(new Date());
 		} else if(by == Role.user) {
@@ -213,7 +188,8 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
 	public void saveNodeComment(CourseNode courseNode, Identity identity, Identity assessedIdentity, String comment) {
 		ICourse course = CourseFactory.loadCourse(cgm.getCourseEntry());
 		
-		AssessmentEntry nodeAssessment = getOrCreate(assessedIdentity, courseNode);
+		Boolean entryRoot = isEntryRoot(course, courseNode);
+		AssessmentEntry nodeAssessment = getOrCreateAssessmentEntry(courseNode, assessedIdentity, entryRoot);
 		nodeAssessment.setComment(comment);
 		assessmentService.updateAssessmentEntry(nodeAssessment);
 		
@@ -249,14 +225,15 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
 			Files.copy(document.toPath(), targetFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
 			
 			//update counter
-			AssessmentEntry nodeAssessment = getOrCreate(assessedIdentity, courseNode);
+			ICourse course = CourseFactory.loadCourse(cgm.getCourseEntry());
+			Boolean entryRoot = isEntryRoot(course, courseNode);
+			AssessmentEntry nodeAssessment = getOrCreateAssessmentEntry(courseNode, assessedIdentity, entryRoot);
 			File[] docs = directory.listFiles(SystemFileFilter.FILES_ONLY);
 			int numOfDocs = docs == null ? 0 : docs.length;
 			nodeAssessment.setNumberOfAssessmentDocuments(numOfDocs);
 			assessmentService.updateAssessmentEntry(nodeAssessment);
 			
 			// node log
-			ICourse course = CourseFactory.loadCourse(cgm.getCourseEntry());
 			UserNodeAuditManager am = course.getCourseEnvironment().getAuditManager();
 			am.appendToUserNodeLog(courseNode, identity, assessedIdentity, "assessment document added: " + filename, null);
 			
@@ -276,15 +253,16 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
 			document.delete();
 			
 			//update counter
+			ICourse course = CourseFactory.loadCourse(cgm.getCourseEntry());
+			Boolean entryRoot = isEntryRoot(course, courseNode);
+			AssessmentEntry nodeAssessment = getOrCreateAssessmentEntry(courseNode, assessedIdentity, entryRoot);
 			File directory = getAssessmentDocumentsDirectory(courseNode, assessedIdentity);
-			AssessmentEntry nodeAssessment = getOrCreate(assessedIdentity, courseNode);
 			File[] docs = directory.listFiles(SystemFileFilter.FILES_ONLY);
 			int numOfDocs = docs == null ? 0 : docs.length;
 			nodeAssessment.setNumberOfAssessmentDocuments(numOfDocs);
 			assessmentService.updateAssessmentEntry(nodeAssessment);
 
 			// node log
-			ICourse course = CourseFactory.loadCourse(cgm.getCourseEntry());
 			UserNodeAuditManager am = course.getCourseEnvironment().getAuditManager();
 			am.appendToUserNodeLog(courseNode, identity, assessedIdentity, "assessment document removed: " + document.getName(), null);
 			
@@ -322,7 +300,8 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
 	public void saveNodeCoachComment(CourseNode courseNode, Identity assessedIdentity, String comment) {
 		ICourse course = CourseFactory.loadCourse(cgm.getCourseEntry());
 		
-		AssessmentEntry nodeAssessment = getOrCreate(assessedIdentity, courseNode);
+		Boolean entryRoot = isEntryRoot(course, courseNode);
+		AssessmentEntry nodeAssessment = getOrCreateAssessmentEntry(courseNode, assessedIdentity, entryRoot);
 		nodeAssessment.setCoachComment(comment);
 		assessmentService.updateAssessmentEntry(nodeAssessment);
 		
@@ -341,7 +320,8 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
 	public void incrementNodeAttempts(CourseNode courseNode, Identity assessedIdentity, UserCourseEnvironment userCourseEnv, Role by) {
 		ICourse course = CourseFactory.loadCourse(cgm.getCourseEntry());
 		
-		AssessmentEntry nodeAssessment = getOrCreate(assessedIdentity, courseNode);
+		Boolean entryRoot = isEntryRoot(course, courseNode);
+		AssessmentEntry nodeAssessment = getOrCreateAssessmentEntry(courseNode, assessedIdentity, entryRoot);
 		int attempts = nodeAssessment.getAttempts() == null ? 1 :nodeAssessment.getAttempts().intValue() + 1;
 		nodeAssessment.setAttempts(attempts);
 		if(by == Role.coach) {
@@ -374,7 +354,8 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
 	public void incrementNodeAttemptsInBackground(CourseNode courseNode, Identity assessedIdentity, UserCourseEnvironment userCourseEnv) {
 		ICourse course = CourseFactory.loadCourse(cgm.getCourseEntry());
 		
-		AssessmentEntry nodeAssessment = getOrCreate(assessedIdentity, courseNode);
+		Boolean entryRoot = isEntryRoot(course, courseNode);
+		AssessmentEntry nodeAssessment = getOrCreateAssessmentEntry(courseNode, assessedIdentity, entryRoot);
 		int attempts = nodeAssessment.getAttempts() == null ? 1 :nodeAssessment.getAttempts().intValue() + 1;
 		nodeAssessment.setAttempts(attempts);
 		assessmentService.updateAssessmentEntry(nodeAssessment);
@@ -391,7 +372,10 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
 	
 	@Override
 	public void updateLastModifications(CourseNode courseNode, Identity assessedIdentity, UserCourseEnvironment userCourseEnv, Role by) {
-		AssessmentEntry nodeAssessment = getOrCreate(assessedIdentity, courseNode);
+		ICourse course = CourseFactory.loadCourse(cgm.getCourseEntry());
+		
+		Boolean entryRoot = isEntryRoot(course, courseNode);
+		AssessmentEntry nodeAssessment = getOrCreateAssessmentEntry(courseNode, assessedIdentity, entryRoot);
 		if(by == Role.coach) {
 			nodeAssessment.setLastCoachModified(new Date());
 		} else if(by == Role.user) {
@@ -409,7 +393,10 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
 
 	@Override
 	public void updateLastVisited(CourseNode courseNode, Identity assessedIdentity, Date lastVisit) {
-		AssessmentEntry nodeAssessment = getOrCreate(assessedIdentity, courseNode);
+		ICourse course = CourseFactory.loadCourse(cgm.getCourseEntry());
+		
+		Boolean entryRoot = isEntryRoot(course, courseNode);
+		AssessmentEntry nodeAssessment = getOrCreateAssessmentEntry(courseNode, assessedIdentity, entryRoot);
 		assessmentService.setLastVisit(nodeAssessment, lastVisit);
 		DBFactory.getInstance().commit();
 	}
@@ -417,7 +404,10 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
 	@Override
 	public void updateCurrentCompletion(CourseNode courseNode, Identity assessedIdentity, UserCourseEnvironment userCourseEnvironment,
 			Double currentCompletion, AssessmentRunStatus runStatus, Role by) {
-		AssessmentEntry nodeAssessment = getOrCreate(assessedIdentity, courseNode);
+		ICourse course = CourseFactory.loadCourse(cgm.getCourseEntry());
+		
+		Boolean entryRoot = isEntryRoot(course, courseNode);
+		AssessmentEntry nodeAssessment = getOrCreateAssessmentEntry(courseNode, assessedIdentity, entryRoot);
 		nodeAssessment.setCurrentRunCompletion(currentCompletion);
 		nodeAssessment.setCurrentRunStatus(runStatus);
 		if(by == Role.coach) {
@@ -432,7 +422,10 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
 	@Override
 	public void updateCompletion(CourseNode courseNode, Identity assessedIdentity, UserCourseEnvironment userCourseEnvironment,
 			Double completion, AssessmentEntryStatus status, Role by) {
-		AssessmentEntry nodeAssessment = getOrCreate(assessedIdentity, courseNode);
+		ICourse course = CourseFactory.loadCourse(cgm.getCourseEntry());
+		
+		Boolean entryRoot = isEntryRoot(course, courseNode);
+		AssessmentEntry nodeAssessment = getOrCreateAssessmentEntry(courseNode, assessedIdentity, entryRoot);
 		nodeAssessment.setCompletion(completion);
 		nodeAssessment.setAssessmentStatus(status);
 		if(by == Role.coach) {
@@ -455,7 +448,9 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
 	public void updateFullyAssessed(CourseNode courseNode, UserCourseEnvironment userCourseEnvironment, Boolean fullyAssessed,
 			AssessmentEntryStatus status, Role by) {
 		Identity assessedIdentity = userCourseEnvironment.getIdentityEnvironment().getIdentity();
-		AssessmentEntry nodeAssessment = getOrCreate(assessedIdentity , courseNode);
+		ICourse course = CourseFactory.loadCourse(cgm.getCourseEntry());
+		Boolean entryRoot = isEntryRoot(course, courseNode);
+		AssessmentEntry nodeAssessment = getOrCreateAssessmentEntry(courseNode, assessedIdentity, entryRoot);
 		if (Objects.equal(fullyAssessed, nodeAssessment.getFullyAssessed())) {
 			// Fully assess can only set once
 			return;
@@ -490,7 +485,8 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
 		
 		String subIdent = courseNode.getIdent();
 		RepositoryEntry referenceEntry = courseNode.getReferencedRepositoryEntry();
-		AssessmentEntry assessmentEntry = getOrCreate(assessedIdentity, subIdent, referenceEntry);
+		Boolean entryRoot = isEntryRoot(course, courseNode);
+		AssessmentEntry assessmentEntry = getOrCreate(assessedIdentity, subIdent, entryRoot, referenceEntry);
 		if(referenceEntry != null && !referenceEntry.equals(assessmentEntry.getReferenceEntry())) {
 			assessmentEntry.setReferenceEntry(referenceEntry);
 		}
@@ -730,4 +726,8 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
 	public void deregisterFromAssessmentChangeEvents(GenericEventListener gel) {
 		CoordinatorManager.getInstance().getCoordinator().getEventBus().deregisterFor(gel, cgm.getCourseEntry().getOlatResource());
 	}
+
+	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/nodes/gta/manager/GTAManagerImpl.java b/src/main/java/org/olat/course/nodes/gta/manager/GTAManagerImpl.java
index f827fceb323bd24fe6d8e83c1a260d23e783cede..1d9d029b1338628252a30a266e95d8429b2e0f73 100644
--- a/src/main/java/org/olat/course/nodes/gta/manager/GTAManagerImpl.java
+++ b/src/main/java/org/olat/course/nodes/gta/manager/GTAManagerImpl.java
@@ -1721,13 +1721,13 @@ public class GTAManagerImpl implements GTAManager {
 		
 		TaskList taskList = getTaskList(taskImpl);
 		RepositoryEntry courseRepoEntry = taskList.getEntry();
+		ICourse course = CourseFactory.loadCourse(courseRepoEntry);
 		AssessmentEntryStatus assessmentStatus = convertToAssessmentEntrystatus(taskImpl, cNode);
 		if(GTAType.group.name().equals(cNode.getModuleConfiguration().getStringValue(GTACourseNode.GTASK_TYPE))) {
 			//update whole group
-			assessmentService.updateAssessmentEntries(taskImpl.getBusinessGroup(), courseRepoEntry, cNode.getIdent(), null, assessmentStatus);
+			assessmentService.updateAssessmentEntries(taskImpl.getBusinessGroup(), courseRepoEntry, cNode.getIdent(), Boolean.FALSE, null, assessmentStatus);
 			dbInstance.commit();
 
-			ICourse course = CourseFactory.loadCourse(courseRepoEntry);
 			List<Identity> assessedIdentities = businessGroupRelationDao.getMembers(taskImpl.getBusinessGroup(), GroupRoles.participant.name());
 			for(Identity assessedIdentity:assessedIdentities) {
 				UserCourseEnvironment userCourseEnv = AssessmentHelper.createAndInitUserCourseEnvironment(assessedIdentity, course);
@@ -1735,10 +1735,9 @@ public class GTAManagerImpl implements GTAManager {
 			}
 		} else {
 			Identity assessedIdentity = taskImpl.getIdentity();
-			assessmentService.updateAssessmentEntry(assessedIdentity, courseRepoEntry, cNode.getIdent(), null, assessmentStatus);
+			assessmentService.updateAssessmentEntry(assessedIdentity, courseRepoEntry, cNode.getIdent(), Boolean.FALSE, null, assessmentStatus);
 			dbInstance.commit();
 
-			ICourse course = CourseFactory.loadCourse(courseRepoEntry);
 			UserCourseEnvironment userCourseEnv = AssessmentHelper.createAndInitUserCourseEnvironment(assessedIdentity, course);
 			courseAssessmentService.updateLastModifications(cNode, userCourseEnv, taskImpl.getIdentity(), by);
 		}
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 be2397469ba85e6d7a9f44a7adc5899bc47cbdcf..f9eac23e4f7537ca2eb0732d99796d772bbecdfd 100644
--- a/src/main/java/org/olat/course/run/preview/PreviewAssessmentManager.java
+++ b/src/main/java/org/olat/course/run/preview/PreviewAssessmentManager.java
@@ -87,7 +87,7 @@ final class PreviewAssessmentManager implements AssessmentManager {
 	}
 
 	@Override
-	public AssessmentEntry createAssessmentEntry(CourseNode courseNode, Identity assessedIdentity, ScoreEvaluation scoreEvaluation) {
+	public AssessmentEntry getOrCreateAssessmentEntry(CourseNode courseNode, Identity assessedIdentity, Boolean entryRoot) {
 		return null;
 	}
 
diff --git a/src/main/java/org/olat/course/run/scoring/AssessmentAccounting.java b/src/main/java/org/olat/course/run/scoring/AssessmentAccounting.java
index 670ffe88325288f3be68dbd2df80e13ef6899a95..0cb8bd571127e8628b8a1f74af13996b0c2b2a74 100644
--- a/src/main/java/org/olat/course/run/scoring/AssessmentAccounting.java
+++ b/src/main/java/org/olat/course/run/scoring/AssessmentAccounting.java
@@ -134,10 +134,10 @@ public class AssessmentAccounting implements ScoreAccounting {
 	private AssessmentEntry getOrCreateAssessmentEntry(CourseNode courseNode) {
 		AssessmentEntry entry = identToEntry.get(courseNode.getIdent());
 		if (entry == null) {
-			entry = getAssessmentManager().getAssessmentEntry(courseNode, getIdentity());
-			if (entry == null) {
-				entry = getAssessmentManager().createAssessmentEntry(courseNode, getIdentity(), null);
-			}
+			Boolean entryRoot = userCourseEnvironment.getCourseEnvironment().getRunStructure().getRootNode().getIdent().equals(courseNode.getIdent())
+					? Boolean.TRUE
+					: Boolean.FALSE;
+			entry = getAssessmentManager().getOrCreateAssessmentEntry(courseNode, getIdentity(), entryRoot);
 			identToEntry.put(entry.getSubIdent(), entry);
 			AssessmentEvaluation assessmentEvaluation = getAssessmentEvaluation(courseNode);
 			courseNodeToEval.put(courseNode, assessmentEvaluation);
diff --git a/src/main/java/org/olat/ims/qti21/ui/AssessmentTestDisplayController.java b/src/main/java/org/olat/ims/qti21/ui/AssessmentTestDisplayController.java
index b0f89d4492f7a8011fabd87f3a4d61ef920dea87..8f74b614884a1030580f8ab9d28c250808ed5873 100644
--- a/src/main/java/org/olat/ims/qti21/ui/AssessmentTestDisplayController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/AssessmentTestDisplayController.java
@@ -332,7 +332,7 @@ public class AssessmentTestDisplayController extends BasicController implements
 	}
 	
 	private void initOrResumeAssessmentTestSession(UserRequest ureq, boolean authorMode) {
-		AssessmentEntry assessmentEntry = assessmentService.getOrCreateAssessmentEntry(assessedIdentity, anonymousIdentifier, entry, subIdent, testEntry);
+		AssessmentEntry assessmentEntry = assessmentService.getOrCreateAssessmentEntry(assessedIdentity, anonymousIdentifier, entry, subIdent, Boolean.FALSE, testEntry);
 		if(outcomesListener == null) {
 			boolean manualCorrections = AssessmentTestHelper.needManualCorrection(resolvedAssessmentTest);
 			outcomesListener = new AssessmentEntryOutcomesListener(entry, testEntry, assessmentEntry, manualCorrections, assessmentService, authorMode);
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentItemEditorController.java b/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentItemEditorController.java
index 085c5ae39ed738e43a7366db63165d5722db5645..012fa00add7d04de8782e95902215806466a8d1f 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentItemEditorController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentItemEditorController.java
@@ -193,7 +193,7 @@ public class AssessmentItemEditorController extends BasicController implements A
 
 			initItemEditor(ureq);
 			
-			AssessmentEntry assessmentEntry = assessmentService.getOrCreateAssessmentEntry(getIdentity(), null, testEntry, null, testEntry);
+			AssessmentEntry assessmentEntry = assessmentService.getOrCreateAssessmentEntry(getIdentity(), null, testEntry, null, Boolean.TRUE, testEntry);
 			displayCtrl = new AssessmentItemPreviewController(ureq, getWindowControl(),
 					resolvedAssessmentItem, itemRef, testEntry, assessmentEntry, rootDirectory, itemFile);
 			listenTo(displayCtrl);
@@ -554,7 +554,7 @@ public class AssessmentItemEditorController extends BasicController implements A
 				removeAsListenerAndDispose(displayCtrl);
 
 				if(testEntry != null) {
-					AssessmentEntry assessmentEntry = assessmentService.getOrCreateAssessmentEntry(getIdentity(), null, testEntry, null, testEntry);
+					AssessmentEntry assessmentEntry = assessmentService.getOrCreateAssessmentEntry(getIdentity(), null, testEntry, null, Boolean.TRUE, testEntry);
 					displayCtrl = new AssessmentItemPreviewController(ureq, getWindowControl(),
 						resolvedAssessmentItem, itemRef, testEntry, assessmentEntry, rootDirectory, itemFile);
 				} else {
diff --git a/src/main/java/org/olat/modules/assessment/AssessmentEntry.java b/src/main/java/org/olat/modules/assessment/AssessmentEntry.java
index 6e0a766b052d4a73cf026ae8d56c7e53952f7292..bc7ccb565d5b63bbd13c8d8c39265b729b1f622f 100644
--- a/src/main/java/org/olat/modules/assessment/AssessmentEntry.java
+++ b/src/main/java/org/olat/modules/assessment/AssessmentEntry.java
@@ -130,6 +130,11 @@ public interface AssessmentEntry extends AssessmentEntryLight {
 	
 	public String getSubIdent();
 	
+	/**
+	 * @return is it the root (course node) of the learn resource.
+	 */
+	public Boolean getEntryRoot();
+	
 	/**
 	 * @return The reference to the test
 	 */
diff --git a/src/main/java/org/olat/modules/assessment/AssessmentService.java b/src/main/java/org/olat/modules/assessment/AssessmentService.java
index 5bdfb0b3c56a3a8ef0db2b1e6c247ea96246ea8d..a7aa6e51114ae942553f404a8be6374adc7c81cc 100644
--- a/src/main/java/org/olat/modules/assessment/AssessmentService.java
+++ b/src/main/java/org/olat/modules/assessment/AssessmentService.java
@@ -36,30 +36,18 @@ import org.olat.repository.RepositoryEntryRef;
  */
 public interface AssessmentService {
 	
-	/**
-	 * 
-	 * @param assessedIdentity
-	 * @param entry
-	 * @param subIdent
-	 * @param referenceEntry
-	 * @param score
-	 * @param passed
-	 * @return
-	 */
-	public AssessmentEntry createAssessmentEntry(Identity assessedIdentity, String anonymousIdentifier,
-			RepositoryEntry entry, String subIdent, RepositoryEntry referenceEntry, Float score, Boolean passed, Date lastUserModified, Date lastCoachModified);
-	
 	/**
 	 * 
 	 * @param assessedIdentity
 	 * @param entry The repository entry where the assessment happens (the course if the test is in a course or
 	 * 		same as the reference entry if the test is launched as a standalone test).
 	 * @param subIdent An additional reference for the course element
+	 * @param entryRoot 
 	 * @param referenceEntry The test repository entry 
 	 * @return
 	 */
 	public AssessmentEntry getOrCreateAssessmentEntry(Identity assessedIdentity, String anonymousIdentifier,
-			RepositoryEntry entry, String subIdent, RepositoryEntry referenceEntry);
+			RepositoryEntry entry, String subIdent, Boolean entryRoot, RepositoryEntry referenceEntry);
 	
 	/**
 	 * 
@@ -96,19 +84,23 @@ public interface AssessmentService {
 	/**
 	 * Update the status for a user, create the assessment entries if it doesn't exist.
 	 * exist.
-	 * @param group
+	 * @param entryRoot
 	 * @param status
+	 * @param group
 	 * @return
 	 */
-	public AssessmentEntry updateAssessmentEntry(Identity assessedIdentity, RepositoryEntry entry, String subIdent, RepositoryEntry referenceEntry, AssessmentEntryStatus status);
+	public AssessmentEntry updateAssessmentEntry(Identity assessedIdentity, RepositoryEntry entry, String subIdent,
+			Boolean entryRoot, RepositoryEntry referenceEntry, AssessmentEntryStatus status);
 	
 	/**
 	 * Update the status for a whole group of users, create the assessment entries if they don't
 	 * exist.
 	 * @param group
+	 * @param entryRoot 
 	 * @param status
 	 * @return
 	 */
-	public List<AssessmentEntry> updateAssessmentEntries(BusinessGroup group, RepositoryEntry entry, String subIdent, RepositoryEntry referenceEntry, AssessmentEntryStatus status);
+	public List<AssessmentEntry> updateAssessmentEntries(BusinessGroup group, RepositoryEntry entry, String subIdent,
+			Boolean entryRoot, RepositoryEntry referenceEntry, AssessmentEntryStatus status);
 
 }
diff --git a/src/main/java/org/olat/modules/assessment/manager/AssessmentEntryDAO.java b/src/main/java/org/olat/modules/assessment/manager/AssessmentEntryDAO.java
index 954953e7cb4d0b89981dd868a434b68653224dc0..aa3b245bf6fa765ace25440ff21495002ce97f9a 100644
--- a/src/main/java/org/olat/modules/assessment/manager/AssessmentEntryDAO.java
+++ b/src/main/java/org/olat/modules/assessment/manager/AssessmentEntryDAO.java
@@ -51,7 +51,7 @@ public class AssessmentEntryDAO {
 	private DB dbInstance;
 	
 	public AssessmentEntry createAssessmentEntry(Identity assessedIdentity, String anonymousIdentifier,
-			RepositoryEntry entry, String subIdent, RepositoryEntry referenceEntry) {
+			RepositoryEntry entry, String subIdent, Boolean entryRoot, RepositoryEntry referenceEntry) {
 		
 		AssessmentEntryImpl data = new AssessmentEntryImpl();
 		data.setCreationDate(new Date());
@@ -60,6 +60,7 @@ public class AssessmentEntryDAO {
 		data.setAnonymousIdentifier(anonymousIdentifier);
 		data.setRepositoryEntry(entry);
 		data.setSubIdent(subIdent);
+		data.setEntryRoot(entryRoot);
 		data.setReferenceEntry(referenceEntry);
 		data.setUserVisibility(Boolean.TRUE);
 		dbInstance.getCurrentEntityManager().persist(data);
@@ -67,7 +68,7 @@ public class AssessmentEntryDAO {
 	}
 	
 	public AssessmentEntry createAssessmentEntry(Identity assessedIdentity, String anonymousIdentifier,
-			RepositoryEntry entry, String subIdent, RepositoryEntry referenceEntry,
+			RepositoryEntry entry, String subIdent, Boolean entryRoot, RepositoryEntry referenceEntry,
 			Float score, Boolean passed, Date lastUserModified, Date lastCoachModified) {
 		
 		AssessmentEntryImpl data = new AssessmentEntryImpl();
@@ -79,6 +80,7 @@ public class AssessmentEntryDAO {
 		data.setAnonymousIdentifier(anonymousIdentifier);
 		data.setRepositoryEntry(entry);
 		data.setSubIdent(subIdent);
+		data.setEntryRoot(entryRoot);
 		data.setReferenceEntry(referenceEntry);
 		data.setUserVisibility(Boolean.TRUE);
 		if(score != null) {
diff --git a/src/main/java/org/olat/modules/assessment/manager/AssessmentServiceImpl.java b/src/main/java/org/olat/modules/assessment/manager/AssessmentServiceImpl.java
index 70b0b31eb885d4dd52f04f628cf791cb88a245c3..763f6f80060e38640d889a16a1bd0cdce63e69cc 100644
--- a/src/main/java/org/olat/modules/assessment/manager/AssessmentServiceImpl.java
+++ b/src/main/java/org/olat/modules/assessment/manager/AssessmentServiceImpl.java
@@ -53,21 +53,20 @@ public class AssessmentServiceImpl implements AssessmentService, UserDataDeletab
 	@Autowired
 	private BusinessGroupRelationDAO businessGroupRelationDao;
 	
-	@Override
 	public AssessmentEntry createAssessmentEntry(Identity assessedIdentity, String anonymousIdentifier,
 			RepositoryEntry entry, String subIdent, RepositoryEntry referenceEntry,
 			Float score, Boolean passed, Date lastUserModified, Date lastCoachModified) {
-		return assessmentEntryDao.createAssessmentEntry(assessedIdentity, anonymousIdentifier, entry, subIdent, referenceEntry,
-				score, passed, lastUserModified, lastCoachModified);
+		return assessmentEntryDao.createAssessmentEntry(assessedIdentity, anonymousIdentifier, entry, subIdent, null,
+				referenceEntry, score, passed, lastUserModified, lastCoachModified);
 	}
 
 	@Override
 	public AssessmentEntry getOrCreateAssessmentEntry(Identity assessedIdentity, String anonymousIdentifier,
-			RepositoryEntry entry, String subIdent, RepositoryEntry referenceEntry) {
+			RepositoryEntry entry, String subIdent, Boolean entryRoot, RepositoryEntry referenceEntry) {
 		
 		AssessmentEntry assessmentEntry = assessmentEntryDao.loadAssessmentEntry(assessedIdentity, anonymousIdentifier, entry, subIdent);
 		if(assessmentEntry == null) {
-			assessmentEntry = assessmentEntryDao.createAssessmentEntry(assessedIdentity, anonymousIdentifier, entry, subIdent, referenceEntry);
+			assessmentEntry = assessmentEntryDao.createAssessmentEntry(assessedIdentity, anonymousIdentifier, entry, subIdent, entryRoot, referenceEntry);
 			dbInstance.commit();
 		}
 		return assessmentEntry;
@@ -118,19 +117,19 @@ public class AssessmentServiceImpl implements AssessmentService, UserDataDeletab
 
 	@Override
 	public AssessmentEntry updateAssessmentEntry(Identity assessedIdentity, RepositoryEntry entry, String subIdent,
-			RepositoryEntry referenceEntry, AssessmentEntryStatus status) {
-		AssessmentEntry assessmentEntry = getOrCreateAssessmentEntry(assessedIdentity, null, entry, subIdent, referenceEntry);
+			Boolean entryRoot, RepositoryEntry referenceEntry, AssessmentEntryStatus status) {
+		AssessmentEntry assessmentEntry = getOrCreateAssessmentEntry(assessedIdentity, null, entry, subIdent, entryRoot, referenceEntry);
 		assessmentEntry.setAssessmentStatus(status);
 		return assessmentEntryDao.updateAssessmentEntry(assessmentEntry);
 	}
 
 	@Override
 	public List<AssessmentEntry> updateAssessmentEntries(BusinessGroup group, RepositoryEntry entry, String subIdent,
-			RepositoryEntry referenceEntry, AssessmentEntryStatus status) {
+			Boolean entryRoot, RepositoryEntry referenceEntry, AssessmentEntryStatus status) {
 		List<AssessmentEntry> assessmentEntries = new ArrayList<>();
 		List<Identity> groupParticipants = businessGroupRelationDao.getMembers(group, GroupRoles.participant.name());
 		for(Identity groupParticipant:groupParticipants) {
-			AssessmentEntry assessmentEntry = getOrCreateAssessmentEntry(groupParticipant, null, entry, subIdent, referenceEntry);
+			AssessmentEntry assessmentEntry = getOrCreateAssessmentEntry(groupParticipant, null, entry, subIdent, entryRoot, referenceEntry);
 			assessmentEntry.setAssessmentStatus(status);
 			assessmentEntry = assessmentEntryDao.updateAssessmentEntry(assessmentEntry);
 			assessmentEntries.add(assessmentEntry);
diff --git a/src/main/java/org/olat/modules/assessment/model/AssessmentEntryImpl.java b/src/main/java/org/olat/modules/assessment/model/AssessmentEntryImpl.java
index 9a0c10f1a7fe663981e0760c8796077ea216f6d6..6739bab6e06b607d0c41fe649fa96bf0a8f78198 100644
--- a/src/main/java/org/olat/modules/assessment/model/AssessmentEntryImpl.java
+++ b/src/main/java/org/olat/modules/assessment/model/AssessmentEntryImpl.java
@@ -141,6 +141,8 @@ public class AssessmentEntryImpl implements Persistable, ModifiedInfo, CreateInf
 	
     @Column(name="a_subident", nullable=true, insertable=true, updatable=false)
 	private String subIdent;
+	@Column(name="a_entry_root", nullable=true, insertable=true, updatable=true)
+	private Boolean entryRoot;
 	
 	@ManyToOne(targetEntity=RepositoryEntry.class,fetch=FetchType.LAZY,optional=true)
 	@JoinColumn(name="fk_reference_entry", nullable=true, insertable=true, updatable=true)
@@ -462,6 +464,15 @@ public class AssessmentEntryImpl implements Persistable, ModifiedInfo, CreateInf
 		this.subIdent = subIdent;
 	}
 
+	@Override
+	public Boolean getEntryRoot() {
+		return entryRoot;
+	}
+
+	public void setEntryRoot(Boolean entryRoot) {
+		this.entryRoot = entryRoot;
+	}
+
 	@Override
 	public RepositoryEntry getReferenceEntry() {
 		return referenceEntry;
diff --git a/src/main/java/org/olat/modules/assessment/ui/AssessmentForm.java b/src/main/java/org/olat/modules/assessment/ui/AssessmentForm.java
index 3e5660bac638d8c27f174d94adfd11d25c0a1a63..9d1c8c9dcc96f56eac4c71121aadc59fc3965d10 100644
--- a/src/main/java/org/olat/modules/assessment/ui/AssessmentForm.java
+++ b/src/main/java/org/olat/modules/assessment/ui/AssessmentForm.java
@@ -306,7 +306,7 @@ public class AssessmentForm extends FormBasicController {
 	protected void doUpdateAssessmentData(boolean asDone) {
 		assessmentEntry = assessmentService.loadAssessmentEntry(assessedIdentity, testEntry, null, testEntry);
 		if(assessmentEntry == null) {
-			assessmentEntry = assessmentService.getOrCreateAssessmentEntry(assessedIdentity, null, testEntry, null, testEntry);
+			assessmentEntry = assessmentService.getOrCreateAssessmentEntry(assessedIdentity, null, testEntry, null, Boolean.TRUE, testEntry);
 		}
 		
 		if (assessableElement.hasAttemptsConfigured()) {
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 0d501b26299e1c9e6edd388b4c4f88378bb407f9..0daf6bf4abcf4982ad8402c03cbedfe96284e152 100644
--- a/src/main/java/org/olat/modules/portfolio/manager/PortfolioServiceImpl.java
+++ b/src/main/java/org/olat/modules/portfolio/manager/PortfolioServiceImpl.java
@@ -1340,7 +1340,7 @@ public class PortfolioServiceImpl implements PortfolioService {
 			RepositoryEntry referenceEntry = repositoryService.loadByResourceKey(resource.getKey());
 			for(Identity assessedIdentity:assessedIdentities) {
 				AssessmentEntry assessmentEntry = assessmentService
-						.getOrCreateAssessmentEntry(assessedIdentity, null, binder.getEntry(), binder.getSubIdent(), referenceEntry);
+						.getOrCreateAssessmentEntry(assessedIdentity, null, binder.getEntry(), binder.getSubIdent(), Boolean.TRUE, referenceEntry);
 				if(by == Role.coach) {
 					assessmentEntry.setLastCoachModified(new Date());
 				} else if(by == Role.user) {
@@ -1449,7 +1449,7 @@ public class PortfolioServiceImpl implements PortfolioService {
 			OLATResource resource = ((BinderImpl)binder.getTemplate()).getOlatResource();
 			RepositoryEntry referenceEntry = repositoryService.loadByResourceKey(resource.getKey());
 			AssessmentEntry assessmentEntry = assessmentService
-					.getOrCreateAssessmentEntry(assessedIdentity, null, binder.getEntry(), binder.getSubIdent(), referenceEntry);
+					.getOrCreateAssessmentEntry(assessedIdentity, null, binder.getEntry(), binder.getSubIdent(), Boolean.TRUE, referenceEntry);
 			assessmentEntry.setScore(totalScore);
 			assessmentEntry.setPassed(totalPassed);
 			assessmentEntry.setAssessmentStatus(binderStatus);
@@ -1473,7 +1473,7 @@ public class PortfolioServiceImpl implements PortfolioService {
 			OLATResource resource = ((BinderImpl)binder.getTemplate()).getOlatResource();
 			RepositoryEntry referenceEntry = repositoryService.loadByResourceKey(resource.getKey());
 			AssessmentEntry assessmentEntry = assessmentService
-					.getOrCreateAssessmentEntry(assessedIdentity, null, binder.getEntry(), binder.getSubIdent(), referenceEntry);
+					.getOrCreateAssessmentEntry(assessedIdentity, null, binder.getEntry(), binder.getSubIdent(), Boolean.TRUE, referenceEntry);
 			status = assessmentEntry.getAssessmentStatus();
 		}
 		return status;
@@ -1502,7 +1502,7 @@ public class PortfolioServiceImpl implements PortfolioService {
 			OLATResource resource = ((BinderImpl)binder.getTemplate()).getOlatResource();
 			RepositoryEntry referenceEntry = repositoryService.loadByResourceKey(resource.getKey());
 			AssessmentEntry assessmentEntry = assessmentService
-					.getOrCreateAssessmentEntry(assessedIdentity, null, binder.getEntry(), binder.getSubIdent(), referenceEntry);
+					.getOrCreateAssessmentEntry(assessedIdentity, null, binder.getEntry(), binder.getSubIdent(), Boolean.TRUE, referenceEntry);
 			assessmentEntry.setFullyAssessed(fullyAssessed);
 			assessmentEntry.setAssessmentStatus(status);
 			assessmentService.updateAssessmentEntry(assessmentEntry);
diff --git a/src/main/java/org/olat/modules/video/ui/question/VideoAssessmentItemController.java b/src/main/java/org/olat/modules/video/ui/question/VideoAssessmentItemController.java
index 1d276a3d4f4d9e4a982534b993d93db47dbd6adb..0066c11246f1a52985c9ab0ddfdcb6073f528d03 100644
--- a/src/main/java/org/olat/modules/video/ui/question/VideoAssessmentItemController.java
+++ b/src/main/java/org/olat/modules/video/ui/question/VideoAssessmentItemController.java
@@ -117,7 +117,8 @@ public class VideoAssessmentItemController extends BasicController implements Ou
 				.loadAndResolveAssessmentItem(assessmentItemUri, resourceDirectory);
 
 		String subIdent = courseNode == null ? null : courseNode.getIdent();
-		AssessmentEntry assessmentEntry = assessmentService.getOrCreateAssessmentEntry(getIdentity(), null, entry, subIdent, videoEntry);
+		Boolean entryRoot = courseNode == null? Boolean.TRUE: Boolean.FALSE;
+		AssessmentEntry assessmentEntry = assessmentService.getOrCreateAssessmentEntry(getIdentity(), null, entry, subIdent, entryRoot, videoEntry);
 		
 		QTI21DeliveryOptions options = QTI21DeliveryOptions.defaultSettings();
 		options.setEnableAssessmentItemBack(true);
@@ -174,8 +175,9 @@ public class VideoAssessmentItemController extends BasicController implements Ou
 		}
 
 		String subIdent = courseNode == null ? null : courseNode.getIdent();
+		Boolean entryRoot = courseNode == null? Boolean.TRUE: Boolean.FALSE;
 		AssessmentEntry assessmentEntry = assessmentService
-				.getOrCreateAssessmentEntry(getIdentity(), null, entry, subIdent, videoEntry);
+				.getOrCreateAssessmentEntry(getIdentity(), null, entry, subIdent, entryRoot, videoEntry);
 
 		int itemsCompleted = 0;
 		BigDecimal totalScore = BigDecimal.ZERO;
diff --git a/src/main/java/org/olat/portfolio/manager/EPFrontendManager.java b/src/main/java/org/olat/portfolio/manager/EPFrontendManager.java
index f51823edff1f0be08a0f1ab2b2b74d3c6e9609a7..1640f326ecf16f29c2661b345e1954364c94adfb 100755
--- a/src/main/java/org/olat/portfolio/manager/EPFrontendManager.java
+++ b/src/main/java/org/olat/portfolio/manager/EPFrontendManager.java
@@ -636,6 +636,7 @@ public class EPFrontendManager implements UserDataDeletable, DeletableGroupData
 		
 		final EPStructuredMap userMap = (EPStructuredMap)map;
 		Boolean synched = coordinator.getSyncer().doInSync(map.getOlatResource(), new SyncerCallback<Boolean>() {
+			@Override
 			public Boolean execute() {
 				if (userMap.getStructuredMapSource() == null) { return Boolean.FALSE; }
 				// need to reload it, I don't know why
@@ -677,7 +678,7 @@ public class EPFrontendManager implements UserDataDeletable, DeletableGroupData
 				structureManager.copyStructureRecursively(template, copy, true);
 				
 				RepositoryEntry referenceEntry = repositoryEntryDao.loadByResourceKey(template.getOlatResource().getKey());
-				assessmentService.updateAssessmentEntry(identity, courseEntry, targetSubPath, referenceEntry, AssessmentEntryStatus.inProgress);
+				assessmentService.updateAssessmentEntry(identity, courseEntry, targetSubPath, Boolean.FALSE, referenceEntry, AssessmentEntryStatus.inProgress);
 				return copy;
 			}
 		});
@@ -1178,7 +1179,7 @@ public class EPFrontendManager implements UserDataDeletable, DeletableGroupData
 				
 				RepositoryEntry referenceEntry = courseNode.getReferencedRepositoryEntry();
 				RepositoryEntry courseEntry = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
-				assessmentService.updateAssessmentEntry(owner, courseEntry, courseNode.getIdent(), referenceEntry, AssessmentEntryStatus.inReview);
+				assessmentService.updateAssessmentEntry(owner, courseEntry, courseNode.getIdent(), Boolean.FALSE, referenceEntry, AssessmentEntryStatus.inReview);
 			}
 			assessmentNotificationsHandler.markPublisherNews(owner, course.getResourceableId());
 			log.info(Tracing.M_AUDIT, "Map " + map + " from " + owner.getKey() + " has been submitted.");
diff --git a/src/main/resources/database/mysql/alter_14_2_x_to_15_0_0.sql b/src/main/resources/database/mysql/alter_14_2_x_to_15_0_0.sql
index bafaf17202fe36c1bdb6824d98f2fd87d1947e60..0d76589a2abea047ea72a07c1391fe9b01ea45b6 100644
--- a/src/main/resources/database/mysql/alter_14_2_x_to_15_0_0.sql
+++ b/src/main/resources/database/mysql/alter_14_2_x_to_15_0_0.sql
@@ -7,6 +7,7 @@ alter table o_as_entry add a_obligation varchar(50);
 alter table o_as_entry add a_first_visit datetime;
 alter table o_as_entry add a_last_visit datetime;
 alter table o_as_entry add a_num_visits int8;
+alter table o_as_entry add a_entry_root bit;
 
 -- forum
 alter table o_forum add f_refresname varchar(50);
diff --git a/src/main/resources/database/mysql/setupDatabase.sql b/src/main/resources/database/mysql/setupDatabase.sql
index 6e5a623c34e9d5ea9e0bded3fc2693529a5c7f4e..f3ec2ec5073312c67ef4a5da570e94bb005c2608 100644
--- a/src/main/resources/database/mysql/setupDatabase.sql
+++ b/src/main/resources/database/mysql/setupDatabase.sql
@@ -1286,6 +1286,7 @@ create table o_as_entry (
    a_num_visits int8,
    fk_entry bigint not null,
    a_subident varchar(64),
+   a_entry_root bit default null,
    fk_reference_entry bigint,
    fk_identity bigint default null,
    a_anon_identifier varchar(128) default null,
diff --git a/src/main/resources/database/oracle/alter_14_2_x_to_15_0_0.sql b/src/main/resources/database/oracle/alter_14_2_x_to_15_0_0.sql
index fa36abd460ec725c2a52f3f238df6dd691ac8a1b..a52b0acc80727d043f3c22717d99cd41b3f3ed00 100644
--- a/src/main/resources/database/oracle/alter_14_2_x_to_15_0_0.sql
+++ b/src/main/resources/database/oracle/alter_14_2_x_to_15_0_0.sql
@@ -7,6 +7,7 @@ alter table o_as_entry add a_obligation varchar(50);
 alter table o_as_entry add a_first_visit date;
 alter table o_as_entry add a_last_visit date;
 alter table o_as_entry add a_num_visits number(20);
+alter table o_as_entry add a_entry_root number;
 
 -- Forum
 alter table o_forum add f_refresname varchar(50);
diff --git a/src/main/resources/database/oracle/setupDatabase.sql b/src/main/resources/database/oracle/setupDatabase.sql
index b25ef37107be33d5809738aa24b3b17c17dfcc6c..7516f7010de6d049450458111bb31ebaf6fb6b56 100644
--- a/src/main/resources/database/oracle/setupDatabase.sql
+++ b/src/main/resources/database/oracle/setupDatabase.sql
@@ -1349,6 +1349,7 @@ create table o_as_entry (
    a_num_visits number(20),
    fk_entry number(20) not null,
    a_subident varchar2(64 char),
+   a_entry_root number default null,
    fk_reference_entry number(20),
    fk_identity number(20) default null,
    a_anon_identifier varchar2(128 char) default null,
diff --git a/src/main/resources/database/postgresql/alter_14_2_x_to_15_0_0.sql b/src/main/resources/database/postgresql/alter_14_2_x_to_15_0_0.sql
index 78f0364de24931b34d6fd69119ad0af5207644ce..5dd0ab5806b8ca781ec01353ad1ff79e7a6966d2 100644
--- a/src/main/resources/database/postgresql/alter_14_2_x_to_15_0_0.sql
+++ b/src/main/resources/database/postgresql/alter_14_2_x_to_15_0_0.sql
@@ -7,6 +7,7 @@ alter table o_as_entry add a_obligation varchar(50);
 alter table o_as_entry add a_first_visit timestamp;
 alter table o_as_entry add a_last_visit timestamp;
 alter table o_as_entry add a_num_visits int8;
+alter table o_as_entry add a_entry_root bool;
 
 -- Forum
 alter table o_forum add f_refresname varchar(50);
diff --git a/src/main/resources/database/postgresql/setupDatabase.sql b/src/main/resources/database/postgresql/setupDatabase.sql
index 79262d9b0352ec28f1ba7218600e7c2e55fe2e7c..b227e77da0cfd9c45f6adf0fde5ea3b000a995cb 100644
--- a/src/main/resources/database/postgresql/setupDatabase.sql
+++ b/src/main/resources/database/postgresql/setupDatabase.sql
@@ -1312,6 +1312,7 @@ create table o_as_entry (
    a_num_visits int8,
    fk_entry int8 not null,
    a_subident varchar(64),
+   a_entry_root bool,
    fk_reference_entry int8,
    fk_identity int8 default null,
    a_anon_identifier varchar(128) default null,
diff --git a/src/test/java/org/olat/course/assessment/manager/AssessmentToolManagerTest.java b/src/test/java/org/olat/course/assessment/manager/AssessmentToolManagerTest.java
index d6cb1527e990c62525226c5bd5291a66c1e7d34b..c6a1c78f92297c16ab811e5121fe08af313e5ef3 100644
--- a/src/test/java/org/olat/course/assessment/manager/AssessmentToolManagerTest.java
+++ b/src/test/java/org/olat/course/assessment/manager/AssessmentToolManagerTest.java
@@ -99,11 +99,11 @@ public class AssessmentToolManagerTest extends OlatTestCase {
 		dbInstance.commitAndCloseSession();
 		
 		// some datas
-		assessmentEntryDao.createAssessmentEntry(assessedIdentity1, null, entry, subIdent, refEntry, 3.0f, Boolean.FALSE, null, null);
-		assessmentEntryDao.createAssessmentEntry(assessedIdentity2, null, entry, subIdent, refEntry, 5.0f, Boolean.TRUE, null, null);
-		assessmentEntryDao.createAssessmentEntry(assessedIdentity3, null, entry, subIdent, refEntry, 8.0f, Boolean.TRUE, null, null);
-		assessmentEntryDao.createAssessmentEntry(assessedIdentity4, null, entry, subIdent, refEntry, 9.0f, Boolean.TRUE, null, null);
-		assessmentEntryDao.createAssessmentEntry(null, UUID.randomUUID().toString(), entry, subIdent, refEntry);
+		assessmentEntryDao.createAssessmentEntry(assessedIdentity1, null, entry, subIdent, null, refEntry, 3.0f, Boolean.FALSE, null, null);
+		assessmentEntryDao.createAssessmentEntry(assessedIdentity2, null, entry, subIdent, null, refEntry, 5.0f, Boolean.TRUE, null, null);
+		assessmentEntryDao.createAssessmentEntry(assessedIdentity3, null, entry, subIdent, null, refEntry, 8.0f, Boolean.TRUE, null, null);
+		assessmentEntryDao.createAssessmentEntry(assessedIdentity4, null, entry, subIdent, null, refEntry, 9.0f, Boolean.TRUE, null, null);
+		assessmentEntryDao.createAssessmentEntry(null, UUID.randomUUID().toString(), entry, subIdent, null, refEntry);
 		dbInstance.commitAndCloseSession();
 		
 		// coach of group 1 with id 1 and id2
@@ -197,14 +197,14 @@ public class AssessmentToolManagerTest extends OlatTestCase {
 		dbInstance.commitAndCloseSession();
 		
 		// some datas
-		assessmentEntryDao.createAssessmentEntry(assessedIdentity1, null, entry, subIdent, refEntry, 3.0f, Boolean.FALSE, null, null);
-		assessmentEntryDao.createAssessmentEntry(assessedIdentity2, null, entry, subIdent, refEntry, 5.0f, Boolean.TRUE, null, null);
-		assessmentEntryDao.createAssessmentEntry(assessedIdentity3, null, entry, subIdent, refEntry, 8.0f, Boolean.TRUE, null, null);
-		assessmentEntryDao.createAssessmentEntry(assessedIdentity4, null, entry, subIdent, refEntry, 9.0f, Boolean.TRUE, null, null);
-		assessmentEntryDao.createAssessmentEntry(assessedExtIdentity5, null, entry, subIdent, refEntry, 3.0f, Boolean.TRUE, null, null);
-		assessmentEntryDao.createAssessmentEntry(assessedExtIdentity6, null, entry, subIdent, refEntry, 4.0f, Boolean.TRUE, null, null);
-		assessmentEntryDao.createAssessmentEntry(assessedExtIdentity7, null, entry, subIdent, refEntry, 5.0f, Boolean.TRUE, null, null);
-		assessmentEntryDao.createAssessmentEntry(null, UUID.randomUUID().toString(), entry, subIdent, refEntry);
+		assessmentEntryDao.createAssessmentEntry(assessedIdentity1, null, entry, subIdent, null, refEntry, 3.0f, Boolean.FALSE, null, null);
+		assessmentEntryDao.createAssessmentEntry(assessedIdentity2, null, entry, subIdent, null, refEntry, 5.0f, Boolean.TRUE, null, null);
+		assessmentEntryDao.createAssessmentEntry(assessedIdentity3, null, entry, subIdent, null, refEntry, 8.0f, Boolean.TRUE, null, null);
+		assessmentEntryDao.createAssessmentEntry(assessedIdentity4, null, entry, subIdent, null, refEntry, 9.0f, Boolean.TRUE, null, null);
+		assessmentEntryDao.createAssessmentEntry(assessedExtIdentity5, null, entry, subIdent, null, refEntry, 3.0f, Boolean.TRUE, null, null);
+		assessmentEntryDao.createAssessmentEntry(assessedExtIdentity6, null, entry, subIdent, null, refEntry, 4.0f, Boolean.TRUE, null, null);
+		assessmentEntryDao.createAssessmentEntry(assessedExtIdentity7, null, entry, subIdent, null, refEntry, 5.0f, Boolean.TRUE, null, null);
+		assessmentEntryDao.createAssessmentEntry(null, UUID.randomUUID().toString(), entry, subIdent, null, refEntry);
 		dbInstance.commitAndCloseSession();
 		
 		// administrator with full access
@@ -268,14 +268,14 @@ public class AssessmentToolManagerTest extends OlatTestCase {
 		dbInstance.commitAndCloseSession();
 		
 		// some datas
-		assessmentEntryDao.createAssessmentEntry(assessedIdentity1, null, entry, subIdent, refEntry, 3.0f, Boolean.FALSE, null, null);
-		assessmentEntryDao.createAssessmentEntry(assessedIdentity2, null, entry, subIdent, refEntry, 5.0f, Boolean.TRUE, null, null);
-		assessmentEntryDao.createAssessmentEntry(assessedIdentity3, null, entry, subIdent, refEntry, 8.0f, Boolean.TRUE, null, null);
-		assessmentEntryDao.createAssessmentEntry(assessedIdentity4, null, entry, subIdent, refEntry, 9.0f, Boolean.TRUE, null, null);
-		assessmentEntryDao.createAssessmentEntry(assessedExtIdentity5, null, entry, subIdent, refEntry, 3.0f, Boolean.TRUE, null, null);
-		assessmentEntryDao.createAssessmentEntry(assessedExtIdentity6, null, entry, subIdent, refEntry, 4.0f, Boolean.TRUE, null, null);
-		assessmentEntryDao.createAssessmentEntry(assessedExtIdentity7, null, entry, subIdent, refEntry, 5.0f, Boolean.TRUE, null, null);
-		assessmentEntryDao.createAssessmentEntry(null, UUID.randomUUID().toString(), entry, subIdent, refEntry);
+		assessmentEntryDao.createAssessmentEntry(assessedIdentity1, null, entry, subIdent, null, refEntry, 3.0f, Boolean.FALSE, null, null);
+		assessmentEntryDao.createAssessmentEntry(assessedIdentity2, null, entry, subIdent, null, refEntry, 5.0f, Boolean.TRUE, null, null);
+		assessmentEntryDao.createAssessmentEntry(assessedIdentity3, null, entry, subIdent, null, refEntry, 8.0f, Boolean.TRUE, null, null);
+		assessmentEntryDao.createAssessmentEntry(assessedIdentity4, null, entry, subIdent, null, refEntry, 9.0f, Boolean.TRUE, null, null);
+		assessmentEntryDao.createAssessmentEntry(assessedExtIdentity5, null, entry, subIdent, null, refEntry, 3.0f, Boolean.TRUE, null, null);
+		assessmentEntryDao.createAssessmentEntry(assessedExtIdentity6, null, entry, subIdent, null, refEntry, 4.0f, Boolean.TRUE, null, null);
+		assessmentEntryDao.createAssessmentEntry(assessedExtIdentity7, null, entry, subIdent, null, refEntry, 5.0f, Boolean.TRUE, null, null);
+		assessmentEntryDao.createAssessmentEntry(null, UUID.randomUUID().toString(), entry, subIdent, null, refEntry);
 		dbInstance.commitAndCloseSession();
 		
 		// the course infos need to calculate the number of participants
diff --git a/src/test/java/org/olat/course/highscore/HighScoreManagerTest.java b/src/test/java/org/olat/course/highscore/HighScoreManagerTest.java
index 7c82bb9d5176e32062a486c06a853582dc9de8af..965e961b74ee04118e473f1c1002c1f389f7817f 100644
--- a/src/test/java/org/olat/course/highscore/HighScoreManagerTest.java
+++ b/src/test/java/org/olat/course/highscore/HighScoreManagerTest.java
@@ -71,7 +71,7 @@ public class HighScoreManagerTest extends OlatTestCase {
 			RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry();
 			String subIdent = UUID.randomUUID().toString();
 			AssessmentEntry nodeAssessment = courseNodeAssessmentDao
-					.createAssessmentEntry(assessedIdentity, subIdent, entry, subIdent, entry);
+					.createAssessmentEntry(assessedIdentity, subIdent, entry, subIdent, null, entry);
 			nodeAssessment.setScore(new BigDecimal(scores[i]));
 			dbInstance.commitAndCloseSession();
 			AssessmentEntry reloadedAssessment = courseNodeAssessmentDao.loadAssessmentEntryById(nodeAssessment.getKey());
diff --git a/src/test/java/org/olat/ims/qti21/manager/AssessmentItemSessionDAOTest.java b/src/test/java/org/olat/ims/qti21/manager/AssessmentItemSessionDAOTest.java
index affafc0d86c29f6bd877c2f76f440eea6ab39fbe..fe45a473435b9c7a53a88a0e4f263bcf550043c4 100644
--- a/src/test/java/org/olat/ims/qti21/manager/AssessmentItemSessionDAOTest.java
+++ b/src/test/java/org/olat/ims/qti21/manager/AssessmentItemSessionDAOTest.java
@@ -58,7 +58,7 @@ public class AssessmentItemSessionDAOTest extends OlatTestCase {
 		// prepare a test and a user
 		RepositoryEntry testEntry = JunitTestHelper.createAndPersistRepositoryEntry();
 		Identity assessedIdentity = JunitTestHelper.createAndPersistIdentityAsRndUser("response-session-1");
-		AssessmentEntry assessmentEntry = assessmentService.getOrCreateAssessmentEntry(assessedIdentity, null, testEntry, "-", testEntry);
+		AssessmentEntry assessmentEntry = assessmentService.getOrCreateAssessmentEntry(assessedIdentity, null, testEntry, "-", null, testEntry);
 		dbInstance.commit();
 		
 		String itemIdentifier = UUID.randomUUID().toString();
diff --git a/src/test/java/org/olat/ims/qti21/manager/AssessmentResponseDAOTest.java b/src/test/java/org/olat/ims/qti21/manager/AssessmentResponseDAOTest.java
index f99ea0e49790daea9138b9952c2c4fcf437a5d31..9e7dcbcf699095801a3dd91d9476741b591c8550 100644
--- a/src/test/java/org/olat/ims/qti21/manager/AssessmentResponseDAOTest.java
+++ b/src/test/java/org/olat/ims/qti21/manager/AssessmentResponseDAOTest.java
@@ -62,7 +62,7 @@ public class AssessmentResponseDAOTest extends OlatTestCase {
 		// prepare a test and a user
 		RepositoryEntry testEntry = JunitTestHelper.createAndPersistRepositoryEntry();
 		Identity assessedIdentity = JunitTestHelper.createAndPersistIdentityAsRndUser("response-session-1");
-		AssessmentEntry assessmentEntry = assessmentService.getOrCreateAssessmentEntry(assessedIdentity, null, testEntry, "-", testEntry);
+		AssessmentEntry assessmentEntry = assessmentService.getOrCreateAssessmentEntry(assessedIdentity, null, testEntry, "-", null, testEntry);
 		dbInstance.commit();
 		
 		String itemIdentifier = UUID.randomUUID().toString();
diff --git a/src/test/java/org/olat/ims/qti21/manager/AssessmentTestSessionDAOTest.java b/src/test/java/org/olat/ims/qti21/manager/AssessmentTestSessionDAOTest.java
index 934aa18938189498a7443c8b108083f2689f2f09..ecf668f69b15e97232c00c750c23dd40fbe2162f 100644
--- a/src/test/java/org/olat/ims/qti21/manager/AssessmentTestSessionDAOTest.java
+++ b/src/test/java/org/olat/ims/qti21/manager/AssessmentTestSessionDAOTest.java
@@ -60,7 +60,7 @@ public class AssessmentTestSessionDAOTest extends OlatTestCase {
 		// prepare a test and a user
 		RepositoryEntry testEntry = JunitTestHelper.createAndPersistRepositoryEntry();
 		Identity assessedIdentity = JunitTestHelper.createAndPersistIdentityAsRndUser("session-1");
-		AssessmentEntry assessmentEntry = assessmentService.getOrCreateAssessmentEntry(assessedIdentity, null, testEntry, "-", testEntry);
+		AssessmentEntry assessmentEntry = assessmentService.getOrCreateAssessmentEntry(assessedIdentity, null, testEntry, "-", null, testEntry);
 		dbInstance.commit();
 		
 		AssessmentTestSession testSession = testSessionDao.createAndPersistTestSession(testEntry, testEntry, "-", assessmentEntry, assessedIdentity, null, true);
@@ -75,7 +75,7 @@ public class AssessmentTestSessionDAOTest extends OlatTestCase {
 		RepositoryEntry courseEntry = JunitTestHelper.createAndPersistRepositoryEntry();
 		String subIdent = UUID.randomUUID().toString();
 		Identity assessedIdentity = JunitTestHelper.createAndPersistIdentityAsRndUser("session-2");
-		AssessmentEntry assessmentEntry = assessmentService.getOrCreateAssessmentEntry(assessedIdentity, null, courseEntry, subIdent, testEntry);
+		AssessmentEntry assessmentEntry = assessmentService.getOrCreateAssessmentEntry(assessedIdentity, null, courseEntry, subIdent, null, testEntry);
 		dbInstance.commit();
 		
 		AssessmentTestSession testSession = testSessionDao.createAndPersistTestSession(testEntry, courseEntry, subIdent, assessmentEntry, assessedIdentity, null, false);
@@ -90,7 +90,7 @@ public class AssessmentTestSessionDAOTest extends OlatTestCase {
 		RepositoryEntry courseEntry = JunitTestHelper.createAndPersistRepositoryEntry();
 		String subIdent = UUID.randomUUID().toString();
 		Identity assessedIdentity = JunitTestHelper.createAndPersistIdentityAsRndUser("session-3");
-		AssessmentEntry assessmentEntry = assessmentService.getOrCreateAssessmentEntry(assessedIdentity, null, courseEntry, subIdent, testEntry);
+		AssessmentEntry assessmentEntry = assessmentService.getOrCreateAssessmentEntry(assessedIdentity, null, courseEntry, subIdent, null, testEntry);
 		dbInstance.commit();
 		
 		AssessmentTestSession testSession = testSessionDao.createAndPersistTestSession(testEntry, courseEntry, subIdent, assessmentEntry, assessedIdentity, null, true);
@@ -110,7 +110,7 @@ public class AssessmentTestSessionDAOTest extends OlatTestCase {
 		RepositoryEntry courseEntry = JunitTestHelper.createAndPersistRepositoryEntry();
 		String subIdent = UUID.randomUUID().toString();
 		Identity assessedIdentity = JunitTestHelper.createAndPersistIdentityAsRndUser("session-3");
-		AssessmentEntry assessmentEntry = assessmentService.getOrCreateAssessmentEntry(assessedIdentity, null, courseEntry, subIdent, testEntry);
+		AssessmentEntry assessmentEntry = assessmentService.getOrCreateAssessmentEntry(assessedIdentity, null, courseEntry, subIdent, null, testEntry);
 		dbInstance.commit();
 		AssessmentTestSession testSession = testSessionDao.createAndPersistTestSession(testEntry, courseEntry, subIdent, assessmentEntry, assessedIdentity, null, false);
 		Assert.assertNotNull(testSession);
@@ -151,7 +151,7 @@ public class AssessmentTestSessionDAOTest extends OlatTestCase {
 		RepositoryEntry courseEntry = JunitTestHelper.createAndPersistRepositoryEntry();
 		String subIdent = UUID.randomUUID().toString();
 		Identity assessedIdentity = JunitTestHelper.createAndPersistIdentityAsRndUser("session-3");
-		AssessmentEntry assessmentEntry = assessmentService.getOrCreateAssessmentEntry(assessedIdentity, null, courseEntry, subIdent, testEntry);
+		AssessmentEntry assessmentEntry = assessmentService.getOrCreateAssessmentEntry(assessedIdentity, null, courseEntry, subIdent, null, testEntry);
 		dbInstance.commit();
 		
 		AssessmentTestSession testSession1 = testSessionDao.createAndPersistTestSession(testEntry, courseEntry, subIdent, assessmentEntry, assessedIdentity, null, false);
@@ -176,7 +176,7 @@ public class AssessmentTestSessionDAOTest extends OlatTestCase {
 		// prepare a test and a user
 		RepositoryEntry testEntry = JunitTestHelper.createAndPersistRepositoryEntry();
 		Identity assessedIdentity = JunitTestHelper.createAndPersistIdentityAsRndUser("session-4");
-		AssessmentEntry assessmentEntry = assessmentService.getOrCreateAssessmentEntry(assessedIdentity, null, testEntry, null, testEntry);
+		AssessmentEntry assessmentEntry = assessmentService.getOrCreateAssessmentEntry(assessedIdentity, null, testEntry, null, null, testEntry);
 		dbInstance.commit();
 		//create an assessment test session
 		AssessmentTestSession testSession1 = testSessionDao.createAndPersistTestSession(testEntry, null, null, assessmentEntry, assessedIdentity, null, false);
@@ -193,7 +193,7 @@ public class AssessmentTestSessionDAOTest extends OlatTestCase {
 		// prepare a test and a user
 		RepositoryEntry testEntry = JunitTestHelper.createAndPersistRepositoryEntry();
 		Identity assessedIdentity = JunitTestHelper.createAndPersistIdentityAsRndUser("session-5");
-		AssessmentEntry assessmentEntry = assessmentService.getOrCreateAssessmentEntry(assessedIdentity, null, testEntry, null, testEntry);
+		AssessmentEntry assessmentEntry = assessmentService.getOrCreateAssessmentEntry(assessedIdentity, null, testEntry, null, null, testEntry);
 		dbInstance.commit();
 		//create an assessment test session
 		AssessmentTestSession testSession1 = testSessionDao.createAndPersistTestSession(testEntry, null, null, assessmentEntry, assessedIdentity, null, true);
@@ -212,9 +212,9 @@ public class AssessmentTestSessionDAOTest extends OlatTestCase {
 		Identity author1 = JunitTestHelper.createAndPersistIdentityAsRndUser("session-6");
 		Identity author2 = JunitTestHelper.createAndPersistIdentityAsRndUser("session-7");
 		Identity assessedIdentity = JunitTestHelper.createAndPersistIdentityAsRndUser("session-8");
-		AssessmentEntry assessmentEntry1 = assessmentService.getOrCreateAssessmentEntry(author1, null, testEntry, null, testEntry);
-		AssessmentEntry assessmentEntry2 = assessmentService.getOrCreateAssessmentEntry(author2, null, testEntry, null, testEntry);
-		AssessmentEntry assessmentEntry3 = assessmentService.getOrCreateAssessmentEntry(assessedIdentity, null, testEntry, null, testEntry);
+		AssessmentEntry assessmentEntry1 = assessmentService.getOrCreateAssessmentEntry(author1, null, testEntry, null, null, testEntry);
+		AssessmentEntry assessmentEntry2 = assessmentService.getOrCreateAssessmentEntry(author2, null, testEntry, null, null, testEntry);
+		AssessmentEntry assessmentEntry3 = assessmentService.getOrCreateAssessmentEntry(assessedIdentity, null, testEntry, null, null, testEntry);
 		dbInstance.commit();
 		//create an assessment test session
 		AssessmentTestSession testSession1 = testSessionDao.createAndPersistTestSession(testEntry, null, null, assessmentEntry1, author1, null, true);
diff --git a/src/test/java/org/olat/modules/assessment/manager/AssessmentEntryDAOTest.java b/src/test/java/org/olat/modules/assessment/manager/AssessmentEntryDAOTest.java
index ee75a4e77cd25779eb1226f0ec41e4d186adc384..84b76f73104fe665423d3135b3ce729784db7235 100644
--- a/src/test/java/org/olat/modules/assessment/manager/AssessmentEntryDAOTest.java
+++ b/src/test/java/org/olat/modules/assessment/manager/AssessmentEntryDAOTest.java
@@ -67,9 +67,10 @@ public class AssessmentEntryDAOTest extends OlatTestCase {
 		Identity assessedIdentity = JunitTestHelper.createAndPersistIdentityAsRndUser("as-node-1");
 		RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry();
 		String subIdent = "39485349759";
+		Boolean entryRoot = Boolean.TRUE;
 
 		AssessmentEntry nodeAssessment = assessmentEntryDao
-				.createAssessmentEntry(assessedIdentity, null, entry, subIdent, entry);
+				.createAssessmentEntry(assessedIdentity, null, entry, subIdent,entryRoot, entry);
 		Assert.assertNotNull(nodeAssessment);
 		dbInstance.commitAndCloseSession();
 		
@@ -80,6 +81,7 @@ public class AssessmentEntryDAOTest extends OlatTestCase {
 		Assert.assertEquals(assessedIdentity, nodeAssessment.getIdentity());
 		Assert.assertEquals(entry, nodeAssessment.getRepositoryEntry());
 		Assert.assertEquals(subIdent, nodeAssessment.getSubIdent());
+		Assert.assertEquals(entryRoot, nodeAssessment.getEntryRoot());
 	}
 	
 	@Test
@@ -87,10 +89,10 @@ public class AssessmentEntryDAOTest extends OlatTestCase {
 		String anonymousIdentifier = UUID.randomUUID().toString();
 		RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry();
 		String subIdent = "39485349759";
-		
+		Boolean entryRoot = Boolean.TRUE;
 
 		AssessmentEntry nodeAssessment = assessmentEntryDao
-				.createAssessmentEntry(null, anonymousIdentifier, entry, subIdent, entry);
+				.createAssessmentEntry(null, anonymousIdentifier, entry, subIdent, entryRoot, entry);
 		Assert.assertNotNull(nodeAssessment);
 		dbInstance.commitAndCloseSession();
 		
@@ -101,6 +103,7 @@ public class AssessmentEntryDAOTest extends OlatTestCase {
 		Assert.assertEquals(anonymousIdentifier, nodeAssessment.getAnonymousIdentifier());
 		Assert.assertEquals(entry, nodeAssessment.getRepositoryEntry());
 		Assert.assertEquals(subIdent, nodeAssessment.getSubIdent());
+		Assert.assertEquals(entryRoot, nodeAssessment.getEntryRoot());
 	}
 	
 	@Test
@@ -108,8 +111,9 @@ public class AssessmentEntryDAOTest extends OlatTestCase {
 		Identity assessedIdentity = JunitTestHelper.createAndPersistIdentityAsRndUser("as-node-2");
 		RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry();
 		String subIdent = UUID.randomUUID().toString();
+		Boolean entryRoot = Boolean.TRUE;
 		AssessmentEntry nodeAssessment = assessmentEntryDao
-				.createAssessmentEntry(assessedIdentity, null, entry, subIdent, entry);
+				.createAssessmentEntry(assessedIdentity, null, entry, subIdent, entryRoot, entry);
 		dbInstance.commitAndCloseSession();
 		
 		AssessmentEntry reloadedAssessment = assessmentEntryDao.loadAssessmentEntryById(nodeAssessment.getKey());
@@ -118,6 +122,7 @@ public class AssessmentEntryDAOTest extends OlatTestCase {
 		Assert.assertEquals(assessedIdentity, reloadedAssessment.getIdentity());
 		Assert.assertEquals(entry, reloadedAssessment.getRepositoryEntry());
 		Assert.assertEquals(subIdent, reloadedAssessment.getSubIdent());
+		Assert.assertEquals(entryRoot, reloadedAssessment.getEntryRoot());
 	}
 	
 	@Test
@@ -125,8 +130,9 @@ public class AssessmentEntryDAOTest extends OlatTestCase {
 		Identity assessedIdentity = JunitTestHelper.createAndPersistIdentityAsRndUser("as-node-3");
 		RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry();
 		String subIdent = UUID.randomUUID().toString();
+		Boolean entryRoot = Boolean.TRUE;
 		AssessmentEntry nodeAssessment = assessmentEntryDao
-				.createAssessmentEntry(assessedIdentity, null, entry, subIdent, entry);
+				.createAssessmentEntry(assessedIdentity, null, entry, subIdent, entryRoot, entry);
 		dbInstance.commitAndCloseSession();
 		
 		AssessmentEntry reloadedAssessment = assessmentEntryDao
@@ -136,6 +142,7 @@ public class AssessmentEntryDAOTest extends OlatTestCase {
 		Assert.assertEquals(assessedIdentity, reloadedAssessment.getIdentity());
 		Assert.assertEquals(entry, reloadedAssessment.getRepositoryEntry());
 		Assert.assertEquals(subIdent, reloadedAssessment.getSubIdent());
+		Assert.assertEquals(entryRoot, reloadedAssessment.getEntryRoot());
 	}
 	
 	@Test
@@ -143,8 +150,9 @@ public class AssessmentEntryDAOTest extends OlatTestCase {
 		String anonymousIdentifier = UUID.randomUUID().toString();
 		RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry();
 		String subIdent = UUID.randomUUID().toString();
+		Boolean entryRoot = Boolean.TRUE;
 		AssessmentEntry nodeAssessment = assessmentEntryDao
-				.createAssessmentEntry(null, anonymousIdentifier, entry, subIdent, entry);
+				.createAssessmentEntry(null, anonymousIdentifier, entry, subIdent, entryRoot, entry);
 		dbInstance.commitAndCloseSession();
 		
 		AssessmentEntry reloadedAssessment = assessmentEntryDao
@@ -154,6 +162,7 @@ public class AssessmentEntryDAOTest extends OlatTestCase {
 		Assert.assertEquals(anonymousIdentifier, reloadedAssessment.getAnonymousIdentifier());
 		Assert.assertEquals(entry, reloadedAssessment.getRepositoryEntry());
 		Assert.assertEquals(subIdent, reloadedAssessment.getSubIdent());
+		Assert.assertEquals(entryRoot, reloadedAssessment.getEntryRoot());
 	}
 	
 	@Test
@@ -162,8 +171,9 @@ public class AssessmentEntryDAOTest extends OlatTestCase {
 		RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry();
 		RepositoryEntry refEntry = JunitTestHelper.createAndPersistRepositoryEntry();
 		String subIdent = UUID.randomUUID().toString();
+		Boolean entryRoot = Boolean.TRUE;
 		AssessmentEntry nodeAssessmentRef = assessmentEntryDao
-				.createAssessmentEntry(assessedIdentity, null, entry, subIdent, refEntry);
+				.createAssessmentEntry(assessedIdentity, null, entry, subIdent, entryRoot, refEntry);
 		dbInstance.commitAndCloseSession();
 		
 		AssessmentEntry reloadedAssessmentRef = assessmentEntryDao
@@ -173,6 +183,7 @@ public class AssessmentEntryDAOTest extends OlatTestCase {
 		Assert.assertEquals(assessedIdentity, reloadedAssessmentRef.getIdentity());
 		Assert.assertEquals(entry, reloadedAssessmentRef.getRepositoryEntry());
 		Assert.assertEquals(subIdent, reloadedAssessmentRef.getSubIdent());
+		Assert.assertEquals(entryRoot, reloadedAssessmentRef.getEntryRoot());
 	}
 	
 	@Test
@@ -182,7 +193,7 @@ public class AssessmentEntryDAOTest extends OlatTestCase {
 		RepositoryEntry refEntry = JunitTestHelper.createAndPersistRepositoryEntry();
 		String subIdent = UUID.randomUUID().toString();
 		AssessmentEntry nodeAssessmentRef = assessmentEntryDao
-				.createAssessmentEntry(assessedIdentity, null, entry, subIdent, refEntry, 2.0f, Boolean.TRUE, null, null);
+				.createAssessmentEntry(assessedIdentity, null, entry, subIdent, null, refEntry, 2.0f, Boolean.TRUE, null, null);
 		dbInstance.commitAndCloseSession();
 		
 		AssessmentEntry resetedAssessmentRef = assessmentEntryDao
@@ -215,7 +226,7 @@ public class AssessmentEntryDAOTest extends OlatTestCase {
 		RepositoryEntry refEntry = JunitTestHelper.createAndPersistRepositoryEntry();
 		String subIdent = UUID.randomUUID().toString();
 		AssessmentEntry nodeAssessment = assessmentEntryDao
-				.createAssessmentEntry(assessedIdentity, null, entry, subIdent, refEntry, 2.0f, Boolean.TRUE, null, null);
+				.createAssessmentEntry(assessedIdentity, null, entry, subIdent, null, refEntry, 2.0f, Boolean.TRUE, null, null);
 		dbInstance.commitAndCloseSession();
 		
 		Date firstDate = new GregorianCalendar(2013,1,28,13,24,56).getTime();
@@ -243,7 +254,7 @@ public class AssessmentEntryDAOTest extends OlatTestCase {
 		RepositoryEntry refEntry = JunitTestHelper.createAndPersistRepositoryEntry();
 		String subIdent = UUID.randomUUID().toString();
 		AssessmentEntry nodeAssessment = assessmentEntryDao
-				.createAssessmentEntry(assessedIdentity, null, entry, subIdent, refEntry, 2.0f, Boolean.TRUE, null, null);
+				.createAssessmentEntry(assessedIdentity, null, entry, subIdent, null, refEntry, 2.0f, Boolean.TRUE, null, null);
 		dbInstance.commitAndCloseSession();
 		
 		Date startDate = new GregorianCalendar(2014,1,1,1,1,2).getTime();
@@ -269,7 +280,7 @@ public class AssessmentEntryDAOTest extends OlatTestCase {
 		RepositoryEntry refEntry = JunitTestHelper.createAndPersistRepositoryEntry();
 		String subIdent = UUID.randomUUID().toString();
 		AssessmentEntry nodeAssessment = assessmentEntryDao
-				.createAssessmentEntry(assessedIdentity, null, entry, subIdent, refEntry, 2.0f, Boolean.TRUE, null, null);
+				.createAssessmentEntry(assessedIdentity, null, entry, subIdent, null, refEntry, 2.0f, Boolean.TRUE, null, null);
 		dbInstance.commitAndCloseSession();
 		
 		Assert.assertNull(nodeAssessment.getAssessmentDone());
@@ -312,7 +323,7 @@ public class AssessmentEntryDAOTest extends OlatTestCase {
 		RepositoryEntry refEntry = JunitTestHelper.createAndPersistRepositoryEntry();
 		String subIdent = UUID.randomUUID().toString();
 		AssessmentEntry nodeAssessment = assessmentEntryDao
-				.createAssessmentEntry(assessedIdentity, null, entry, subIdent, refEntry, 2.0f, Boolean.TRUE, null, null);
+				.createAssessmentEntry(assessedIdentity, null, entry, subIdent, null, refEntry, 2.0f, Boolean.TRUE, null, null);
 		dbInstance.commitAndCloseSession();
 		
 		Assert.assertNull(nodeAssessment.getFullyAssessedDate());
@@ -349,13 +360,13 @@ public class AssessmentEntryDAOTest extends OlatTestCase {
 		RepositoryEntry refEntry = JunitTestHelper.createAndPersistRepositoryEntry();
 		String subIdent = UUID.randomUUID().toString();
 		AssessmentEntry nodeAssessmentId1 = assessmentEntryDao
-				.createAssessmentEntry(assessedIdentity1, null, entry, subIdent, refEntry);
+				.createAssessmentEntry(assessedIdentity1, null, entry, subIdent, null, refEntry);
 		AssessmentEntry nodeAssessmentId2 = assessmentEntryDao
-				.createAssessmentEntry(assessedIdentity2, null, entry, subIdent, refEntry, 3.0f, Boolean.FALSE, null, null);
+				.createAssessmentEntry(assessedIdentity2, null, entry, subIdent, null, refEntry, 3.0f, Boolean.FALSE, null, null);
 		AssessmentEntry nodeAssessmentId3 = assessmentEntryDao
-				.createAssessmentEntry(assessedIdentity2, null, entry, null, entry, 3.0f, Boolean.FALSE, null, null);
+				.createAssessmentEntry(assessedIdentity2, null, entry, null, null, entry, 3.0f, Boolean.FALSE, null, null);
 		AssessmentEntry nodeAssessmentId4 = assessmentEntryDao
-				.createAssessmentEntry(assessedIdentity2, null, refEntry, subIdent, refEntry, 3.0f, Boolean.FALSE, null, null);
+				.createAssessmentEntry(assessedIdentity2, null, refEntry, subIdent, null, refEntry, 3.0f, Boolean.FALSE, null, null);
 		dbInstance.commitAndCloseSession();
 		
 		// load with our subIdent above
@@ -379,10 +390,10 @@ public class AssessmentEntryDAOTest extends OlatTestCase {
 		RepositoryEntry refEntry = JunitTestHelper.createAndPersistRepositoryEntry();
 		
 		String subIdent = UUID.randomUUID().toString();
-		assessmentEntryDao.createAssessmentEntry(assessedIdentity1, null, entry, subIdent, refEntry);
-		assessmentEntryDao.createAssessmentEntry(assessedIdentity2, null, entry, subIdent, refEntry, 3.0f, Boolean.FALSE, null, null);
-		assessmentEntryDao.createAssessmentEntry(assessedIdentity3, null, entry, null, entry, 3.0f, Boolean.FALSE, null, null);
-		assessmentEntryDao.createAssessmentEntry(assessedIdentity4, null, refEntry, subIdent, refEntry, 3.0f, Boolean.FALSE, null, null);
+		assessmentEntryDao.createAssessmentEntry(assessedIdentity1, null, entry, subIdent, null, refEntry);
+		assessmentEntryDao.createAssessmentEntry(assessedIdentity2, null, entry, subIdent, null, refEntry, 3.0f, Boolean.FALSE, null, null);
+		assessmentEntryDao.createAssessmentEntry(assessedIdentity3, null, entry, null, null, entry, 3.0f, Boolean.FALSE, null, null);
+		assessmentEntryDao.createAssessmentEntry(assessedIdentity4, null, refEntry, subIdent, null, refEntry, 3.0f, Boolean.FALSE, null, null);
 		dbInstance.commitAndCloseSession();
 
 		// id 1,2,3 are in the entry, but 4 is in an other entry and must not appears in the list
@@ -404,13 +415,13 @@ public class AssessmentEntryDAOTest extends OlatTestCase {
 		RepositoryEntry refEntry = JunitTestHelper.createAndPersistRepositoryEntry();
 		String subIdent = UUID.randomUUID().toString();
 		AssessmentEntry nodeAssessmentId1 = assessmentEntryDao
-				.createAssessmentEntry(assessedIdentity1, null, entry, subIdent, refEntry);
+				.createAssessmentEntry(assessedIdentity1, null, entry, subIdent, null, refEntry);
 		AssessmentEntry nodeAssessmentId2 = assessmentEntryDao
-				.createAssessmentEntry(assessedIdentity2, null, entry, subIdent, refEntry, 3.0f, Boolean.FALSE, null, null);
+				.createAssessmentEntry(assessedIdentity2, null, entry, subIdent, null, refEntry, 3.0f, Boolean.FALSE, null, null);
 		AssessmentEntry nodeAssessmentId3 = assessmentEntryDao
-				.createAssessmentEntry(assessedIdentity2, null, entry, null, entry, 3.0f, Boolean.FALSE, null, null);
+				.createAssessmentEntry(assessedIdentity2, null, entry, null, null, entry, 3.0f, Boolean.FALSE, null, null);
 		AssessmentEntry nodeAssessmentId4 = assessmentEntryDao
-				.createAssessmentEntry(assessedIdentity1, null, refEntry, subIdent, refEntry, 3.0f, Boolean.FALSE, null, null);
+				.createAssessmentEntry(assessedIdentity1, null, refEntry, subIdent, null, refEntry, 3.0f, Boolean.FALSE, null, null);
 		dbInstance.commitAndCloseSession();
 		
 		// load for identity 1
@@ -460,13 +471,13 @@ public class AssessmentEntryDAOTest extends OlatTestCase {
 		// some assessment entries
 		String subIdent = UUID.randomUUID().toString();
 		AssessmentEntry nodeAssessmentId1 = assessmentEntryDao
-				.createAssessmentEntry(assessedIdentity1, null, entry, subIdent, refEntry);
+				.createAssessmentEntry(assessedIdentity1, null, entry, subIdent, null, refEntry);
 		AssessmentEntry nodeAssessmentId2 = assessmentEntryDao
-				.createAssessmentEntry(assessedIdentity2, null, entry, subIdent, refEntry, 3.0f, Boolean.FALSE, null, null);
+				.createAssessmentEntry(assessedIdentity2, null, entry, subIdent, null, refEntry, 3.0f, Boolean.FALSE, null, null);
 		AssessmentEntry nodeAssessmentId3 = assessmentEntryDao
-				.createAssessmentEntry(assessedIdentity2, null, entry, null, entry, 3.0f, Boolean.FALSE, null, null);
+				.createAssessmentEntry(assessedIdentity2, null, entry, null, null, entry, 3.0f, Boolean.FALSE, null, null);
 		AssessmentEntry nodeAssessmentId4 = assessmentEntryDao
-				.createAssessmentEntry(assessedIdentity1, null, refEntry, subIdent, refEntry, 3.0f, Boolean.FALSE, null, null);
+				.createAssessmentEntry(assessedIdentity1, null, refEntry, subIdent, null, refEntry, 3.0f, Boolean.FALSE, null, null);
 		dbInstance.commitAndCloseSession();
 		
 		//load the assessment entries of entry
@@ -489,13 +500,13 @@ public class AssessmentEntryDAOTest extends OlatTestCase {
 		
 		String subIdent = UUID.randomUUID().toString();
 		AssessmentEntry nodeAssessment1 = assessmentEntryDao
-				.createAssessmentEntry(assessedIdentity1, null, entry, subIdent, refEntry);
+				.createAssessmentEntry(assessedIdentity1, null, entry, subIdent, null, refEntry);
 		AssessmentEntry nodeAssessment2 = assessmentEntryDao
-				.createAssessmentEntry(assessedIdentity2, null, entry, subIdent, refEntry, 3.0f, Boolean.FALSE, null, null);
+				.createAssessmentEntry(assessedIdentity2, null, entry, subIdent, null, refEntry, 3.0f, Boolean.FALSE, null, null);
 		AssessmentEntry nodeAssessment3 = assessmentEntryDao
-				.createAssessmentEntry(assessedIdentity2, null, entry, null, entry, 3.0f, Boolean.FALSE, null, null);
+				.createAssessmentEntry(assessedIdentity2, null, entry, null, null, entry, 3.0f, Boolean.FALSE, null, null);
 		AssessmentEntry nodeAssessment4 = assessmentEntryDao
-				.createAssessmentEntry(assessedIdentity1, null, refEntry, subIdent, refEntry, 3.0f, Boolean.FALSE, null, null);
+				.createAssessmentEntry(assessedIdentity1, null, refEntry, subIdent, null, refEntry, 3.0f, Boolean.FALSE, null, null);
 		dbInstance.commitAndCloseSession();
 		
 		// delete by reference
@@ -528,13 +539,13 @@ public class AssessmentEntryDAOTest extends OlatTestCase {
 		
 		String subIdent = UUID.randomUUID().toString();
 		AssessmentEntry nodeAssessment1 = assessmentEntryDao
-				.createAssessmentEntry(assessedIdentity1, null, entry, subIdent, refEntry);
+				.createAssessmentEntry(assessedIdentity1, null, entry, subIdent, null, refEntry);
 		AssessmentEntry nodeAssessment2 = assessmentEntryDao
-				.createAssessmentEntry(assessedIdentity2, null, entry, subIdent, refEntry, 3.0f, Boolean.FALSE, null, null);
+				.createAssessmentEntry(assessedIdentity2, null, entry, subIdent, null, refEntry, 3.0f, Boolean.FALSE, null, null);
 		AssessmentEntry nodeAssessment3 = assessmentEntryDao
-				.createAssessmentEntry(assessedIdentity2, null, entry, null, entry, 3.0f, Boolean.FALSE, null, null);
+				.createAssessmentEntry(assessedIdentity2, null, entry, null, null, entry, 3.0f, Boolean.FALSE, null, null);
 		AssessmentEntry nodeAssessment4 = assessmentEntryDao
-				.createAssessmentEntry(assessedIdentity1, null, refEntry, subIdent, refEntry, 3.0f, Boolean.FALSE, null, null);
+				.createAssessmentEntry(assessedIdentity1, null, refEntry, subIdent, null, refEntry, 3.0f, Boolean.FALSE, null, null);
 		dbInstance.commitAndCloseSession();
 		
 		// delete by reference
@@ -572,19 +583,19 @@ public class AssessmentEntryDAOTest extends OlatTestCase {
 		businessGroupRelationDao.addRole(assessedIdentity5, group, GroupRoles.coach.name());
 		
 		AssessmentEntry nodeAssessmentId1 = assessmentEntryDao
-				.createAssessmentEntry(assessedIdentity1, null, entry, subIdent, refEntry);
+				.createAssessmentEntry(assessedIdentity1, null, entry, subIdent, null, refEntry);
 		AssessmentEntry nodeAssessmentId2 = assessmentEntryDao
-				.createAssessmentEntry(assessedIdentity2, null, entry, subIdent, refEntry, 0.0f, Boolean.FALSE, null, null);
+				.createAssessmentEntry(assessedIdentity2, null, entry, subIdent, null, refEntry, 0.0f, Boolean.FALSE, null, null);
 		AssessmentEntry nodeAssessmentId3 = assessmentEntryDao
-				.createAssessmentEntry(assessedIdentity2, null, entry, null, entry, 12.0f, Boolean.FALSE, null, null);
+				.createAssessmentEntry(assessedIdentity2, null, entry, null, null, entry, 12.0f, Boolean.FALSE, null, null);
 		AssessmentEntry nodeAssessmentId4 = assessmentEntryDao
-				.createAssessmentEntry(assessedIdentity2, null, refEntry, subIdent, refEntry, 3.0f, Boolean.FALSE, null, null);
+				.createAssessmentEntry(assessedIdentity2, null, refEntry, subIdent, null, refEntry, 3.0f, Boolean.FALSE, null, null);
 		AssessmentEntry nodeAssessmentId5 = assessmentEntryDao
-				.createAssessmentEntry(assessedIdentity3, null, entry, subIdent, refEntry, 6.0f, Boolean.TRUE, null, null);
+				.createAssessmentEntry(assessedIdentity3, null, entry, subIdent, null, refEntry, 6.0f, Boolean.TRUE, null, null);
 		AssessmentEntry nodeAssessmentId6 = assessmentEntryDao
-				.createAssessmentEntry(assessedIdentity4, null, entry, subIdent, refEntry, 1.0f, Boolean.FALSE, null, null);
+				.createAssessmentEntry(assessedIdentity4, null, entry, subIdent, null, refEntry, 1.0f, Boolean.FALSE, null, null);
 		AssessmentEntry nodeAssessmentId7 = assessmentEntryDao
-				.createAssessmentEntry(assessedIdentity5, null, entry, subIdent, refEntry, 10.0f, Boolean.TRUE, null, null);
+				.createAssessmentEntry(assessedIdentity5, null, entry, subIdent, null, refEntry, 10.0f, Boolean.TRUE, null, null);
 		dbInstance.commitAndCloseSession();
 		// load with our subIdent above
 		List<AssessmentEntry> assessmentEntries = assessmentEntryDao