diff --git a/src/main/java/org/olat/course/assessment/manager/AssessmentModeManagerImpl.java b/src/main/java/org/olat/course/assessment/manager/AssessmentModeManagerImpl.java
index a9b1534b440d6068a573dcce080d8c10afbad1ad..c4c6fdeb72b13942e4485ae97f989b631594062d 100644
--- a/src/main/java/org/olat/course/assessment/manager/AssessmentModeManagerImpl.java
+++ b/src/main/java/org/olat/course/assessment/manager/AssessmentModeManagerImpl.java
@@ -380,12 +380,8 @@ public class AssessmentModeManagerImpl implements AssessmentModeManager {
 			assessedKeys.addAll(courseMemberKeys);
 		}
 		
-		if(targetAudience == Target.curriculumEls || targetAudience == Target.courseAndGroups) {
-			List<Long> courseMemberKeys = assessmentMode.isApplySettingsForCoach()
-					? repositoryEntryRelationDao.getMemberKeys(re, RepositoryEntryRelationType.entryAndCurriculums, GroupRoles.coach.name(), GroupRoles.participant.name())
-					: repositoryEntryRelationDao.getMemberKeys(re, RepositoryEntryRelationType.entryAndCurriculums, GroupRoles.participant.name());
-			assessedKeys.addAll(courseMemberKeys);
-			
+		// For courseAndGroups, the curriculums are retrieved by the relation type.
+		if(targetAudience == Target.curriculumEls) {
 			List<CurriculumElementRef> curriculumElements = new ArrayList<>();
 			Set<AssessmentModeToCurriculumElement> modeTocurriculumElements  = assessmentMode.getCurriculumElements();
 			for(AssessmentModeToCurriculumElement modeTocurriculumElement:modeTocurriculumElements) {
diff --git a/src/main/java/org/olat/course/reminder/rule/AttemptsRuleSPI.java b/src/main/java/org/olat/course/reminder/rule/AttemptsRuleSPI.java
index 5e1d63059c2bb69ec991fa2dadeb11882469911c..cc25c520f0ea5d4a848ee60c119e9ad2b5ad3901 100644
--- a/src/main/java/org/olat/course/reminder/rule/AttemptsRuleSPI.java
+++ b/src/main/java/org/olat/course/reminder/rule/AttemptsRuleSPI.java
@@ -87,7 +87,7 @@ public class AttemptsRuleSPI implements FilterRuleSPI {
 			CourseNode courseNode = course.getRunStructure().getNode(nodeIdent);
 			if (courseNode == null) {
 				identities.clear();
-				log.error("Attempts rule in course " + entry.getKey() + " (" + entry.getDisplayname() + ") is missing a course element");
+				log.warn("Attempts rule in course {} ({}) is missing a course element", entry.getKey(), entry.getDisplayname());
 				return;
 			}
 
diff --git a/src/main/java/org/olat/ims/qti21/AssessmentTestHelper.java b/src/main/java/org/olat/ims/qti21/AssessmentTestHelper.java
index 876423142d66ad3bdbd6ef25116031559bbd9158..4addfebcbbc08aa724d2a33f39eae3ad49a72a8f 100644
--- a/src/main/java/org/olat/ims/qti21/AssessmentTestHelper.java
+++ b/src/main/java/org/olat/ims/qti21/AssessmentTestHelper.java
@@ -66,7 +66,9 @@ public class AssessmentTestHelper {
 					.getItemRefsBySystemIdMap().get(currentItem.getItemSystemId());
 			
 			AssessmentItemRef itemRef = null;
-			if(itemRefs.size() == 1) {
+			if(itemRefs == null) {
+				// itemRef stay null
+			} else if(itemRefs.size() == 1) {
 				itemRef = itemRefs.get(0);
 			} else {
 				Identifier itemId = itemKey.getIdentifier();
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 53ca58e8b30cfe438a9766f9dae01c02be8e5310..d8c73c8413beb067bb4b4f035b3aa29392a0d30f 100644
--- a/src/main/java/org/olat/ims/qti21/ui/AssessmentTestDisplayController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/AssessmentTestDisplayController.java
@@ -369,7 +369,7 @@ public class AssessmentTestDisplayController extends BasicController implements
 						initNewAssessmentTestSession(ureq, assessmentEntry, authorMode);
 					}
 				} catch(Exception e) {
-					logError("Cannot resume session as author", e);
+					logWarn("Cannot resume session as author", e);
 					initNewAssessmentTestSession(ureq, assessmentEntry, authorMode);
 				}
 			} else {
@@ -414,12 +414,15 @@ public class AssessmentTestDisplayController extends BasicController implements
 		if(subIdent == null && !authorMode) {
 			resourcesList.deregisterResourceable(entry, subIdent, getWindow());
 		}
-		
-		suspendAssessmentTest(new Date());
-		if(candidateSession != null) {
-			OLATResourceable sessionOres = OresHelper
-					.createOLATResourceableInstance(AssessmentTestSession.class, candidateSession.getKey());
-			CoordinatorManager.getInstance().getCoordinator().getEventBus().deregisterFor(this, sessionOres);
+		try {
+			suspendAssessmentTest(new Date());
+			if(candidateSession != null) {
+				OLATResourceable sessionOres = OresHelper
+						.createOLATResourceableInstance(AssessmentTestSession.class, candidateSession.getKey());
+				CoordinatorManager.getInstance().getCoordinator().getEventBus().deregisterFor(this, sessionOres);
+			}
+		} catch (Exception e) {
+			logError("", e);
 		}
 	}
 	
diff --git a/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionAssessmentItemListController.java b/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionAssessmentItemListController.java
index f4b2dd4fe57f3fc405c7873d3a3bd20eca3bdb5a..7d1ccbc8117f6d03a6f7456f9238e14fbc3fbcb9 100644
--- a/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionAssessmentItemListController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionAssessmentItemListController.java
@@ -92,7 +92,7 @@ import uk.ac.ed.ph.jqtiplus.state.TestSessionState;
 
 /**
  * A table with the list of assessment items of the test
- * with statistics about the users wo answered (or not answered)
+ * with statistics about the users who answered (or not answered)
  * every assessment item.
  * 
  * 
@@ -472,7 +472,7 @@ public class CorrectionAssessmentItemListController extends FormBasicController
 				boolean readOnly = model.isReadOnly(assessedIdentity);
 				identityItemCtrl = new CorrectionIdentityAssessmentItemNavigationController(ureq, getWindowControl(),
 						model.getTestEntry(), model.getResolvedAssessmentTest(), itemCorrection, listEntry,
-						selectedItemSessions, model, null, readOnly);
+						selectedItemSessions, model, null, readOnly, true);
 				listenTo(identityItemCtrl);
 				updatePreviousNext();
 				
diff --git a/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityAssessmentItemController.java b/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityAssessmentItemController.java
index 86ea3fb3ab264935ce97d2efcd748e0800df1274..b94cc51effcbf48a9991ebe0807ad45dc96f298e 100644
--- a/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityAssessmentItemController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityAssessmentItemController.java
@@ -88,6 +88,7 @@ public class CorrectionIdentityAssessmentItemController extends FormBasicControl
 	private final ResourcesMapper resourcesMapper;
 	
 	private final boolean readOnly;
+	private final boolean pageIdentity;
 	private CorrectionOverviewModel model;
 	private final RepositoryEntry testEntry;
 	private AssessmentItemCorrection itemCorrection;
@@ -114,7 +115,7 @@ public class CorrectionIdentityAssessmentItemController extends FormBasicControl
 			RepositoryEntry testEntry, ResolvedAssessmentTest resolvedAssessmentTest,
 			AssessmentItemCorrection itemCorrection, AssessmentItemListEntry assessmentEntry,
 			List<? extends AssessmentItemListEntry> assessmentEntryList, CorrectionOverviewModel model,
-			GradingTimeRecordRef gradingTimeRecord, boolean readOnly) {
+			GradingTimeRecordRef gradingTimeRecord, boolean readOnly, boolean pageIdentity) {
 		super(ureq, wControl, "correction_identity_assessment_item");
 		this.readOnly = readOnly;
 		this.gradingTimeRecord = gradingTimeRecord;
@@ -126,6 +127,7 @@ public class CorrectionIdentityAssessmentItemController extends FormBasicControl
 		
 		this.model = model;
 		this.testEntry = testEntry;
+		this.pageIdentity = pageIdentity;
 		this.itemCorrection = itemCorrection;
 		this.assessmentEntry = assessmentEntry;
 		this.assessmentEntryList = assessmentEntryList;
@@ -166,12 +168,15 @@ public class CorrectionIdentityAssessmentItemController extends FormBasicControl
 		formLayout.add("interactions", identityInteractionsCtrl.getInitialFormItem());
 		
 		uifactory.addFormCancelButton("cancel", formLayout, ureq, getWindowControl());
+
 		if(readOnly) {
-			nextQuestionButton = uifactory.addFormLink("next.item", formLayout, Link.BUTTON);
+			String nextI18n = pageIdentity ? "next.user" : "next.item";
+			nextQuestionButton = uifactory.addFormLink("next.item", nextI18n, null, formLayout, Link.BUTTON);
 			backOverviewButton = uifactory.addFormLink("back.overview", formLayout, Link.BUTTON);
 		} else {
 			uifactory.addFormSubmitButton("save", formLayout);
-			saveNextQuestionButton = uifactory.addFormLink("save.next", formLayout, Link.BUTTON);
+			String saveNextI18n = pageIdentity ? "save.next.identity" : "save.next";
+			saveNextQuestionButton = uifactory.addFormLink("save.next", saveNextI18n, null, formLayout, Link.BUTTON);
 			saveBackOverviewButton = uifactory.addFormLink("save.back", formLayout, Link.BUTTON);
 		}
 	}
diff --git a/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityAssessmentItemListController.java b/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityAssessmentItemListController.java
index 7554969282ff4a1fb81276adebbbdd3ae69ee4ab..3d60ff2d2898e35398fc52d65db80d33f2581e91 100644
--- a/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityAssessmentItemListController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityAssessmentItemListController.java
@@ -408,7 +408,7 @@ public class CorrectionIdentityAssessmentItemListController extends FormBasicCon
 				AssessmentItem assessmentItem = resolvedAssessmentItem.getRootNodeLookup().extractIfSuccessful();
 				identityItemCtrl = new CorrectionIdentityAssessmentItemNavigationController(ureq, getWindowControl(),
 						model.getTestEntry(), model.getResolvedAssessmentTest(), itemCorrection, row,
-						tableModel.getObjects(), model, gradingTimeRecord, readOnly);
+						tableModel.getObjects(), model, gradingTimeRecord, readOnly, false);
 				listenTo(identityItemCtrl);
 				stackPanel.pushController(assessmentItem.getTitle(), identityItemCtrl);
 				updatePreviousNext();
diff --git a/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityAssessmentItemNavigationController.java b/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityAssessmentItemNavigationController.java
index ddbd698bcf3485f5220d41f95d5e6f9d7f6a9868..5b197d8e77cc63d7e1e77e28642c1dac759cdc18 100644
--- a/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityAssessmentItemNavigationController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityAssessmentItemNavigationController.java
@@ -64,12 +64,12 @@ public class CorrectionIdentityAssessmentItemNavigationController extends BasicC
 			RepositoryEntry testEntry, ResolvedAssessmentTest resolvedAssessmentTest,
 			AssessmentItemCorrection itemCorrection, AssessmentItemListEntry assessmentEntry,
 			List<? extends AssessmentItemListEntry> assessmentEntryList, CorrectionOverviewModel model,
-			GradingTimeRecordRef gradingTimeRecord, boolean readOnly) {
+			GradingTimeRecordRef gradingTimeRecord, boolean readOnly, boolean pageIdentity) {
 		super(ureq, wControl);
 		mainVC = createVelocityContainer("corrections_navigation");
 		
 		itemCtrl = new CorrectionIdentityAssessmentItemController(ureq, wControl, testEntry, resolvedAssessmentTest,
-				itemCorrection, assessmentEntry, assessmentEntryList, model, gradingTimeRecord, readOnly);
+				itemCorrection, assessmentEntry, assessmentEntryList, model, gradingTimeRecord, readOnly, pageIdentity);
 		listenTo(itemCtrl);
 		mainVC.put("items", itemCtrl.getInitialComponent());
 		
diff --git a/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_de.properties
index 017fb110e7c01e52999e923473df2a84c84bbf50..72fc0bb3dcb865a0dc495109ea44f0d23613f317 100644
--- a/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_de.properties
@@ -28,10 +28,11 @@ previous.item=Vorherige Frage
 previous.user=Vorheriger Benutzer
 save.back=Speichern und zur \u00DCbersicht
 save.next=Speichern und n\u00E4chste Frage
+save.next.identity=Speichern und n\u00E4chster Teilnehmer
 save.tests=Als endg\u00FCltiges Resultat speichern
 score=Punkte
 show.rubric=Beschreibung anzeigen
-show.rubric.with.title=Beschreibung f\u00FCr "<b>{0}</b>" anzeigen
+show.rubric.with.title=Beschreibung f\u00FCr "<strong>{0}</strong>" anzeigen
 status=Status
 table.header.action=<i class='o_icon o_icon_actions o_icon-lg'> </i>
 table.header.answered=Beantwortet
diff --git a/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_en.properties
index a27b4b521427c2e13b20914ffdc9a8efb56f700d..524ddb4f1e4df2d52ab33ed3b2a44941eee606a3 100644
--- a/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_en.properties
@@ -28,10 +28,11 @@ previous.item=Previous question
 previous.user=Previous user
 save.back=Save and back to overview
 save.next=Save and next question
+save.next.identity=Save and next participant
 save.tests=Save results as completed
 score=Score
 show.rubric=Show description
-show.rubric.with.title=Show description for "<b>{0}</b>"
+show.rubric.with.title=Show description for "<strong>{0}</strong>"
 status=Status
 table.header.action=<i class\='o_icon o_icon_actions o_icon-lg'> </i>
 table.header.answered=Answered
diff --git a/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_fr.properties
index 09386334c17266c5013ba2a800b3c6d425332950..d41a0314c2f66f966f9e8519456fa56e23b3a9c1 100644
--- a/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/ims/qti21/ui/assessment/_i18n/LocalStrings_fr.properties
@@ -28,6 +28,7 @@ previous.item=Question pr\u00E9c\u00E9dente
 previous.user=Utilisateur pr\u00E9c\u00E9dent
 save.back=Sauver et retourner \u00E0 l'aper\u00E7u
 save.next=Sauver et question suivante
+save.next.identity=Sauver et participant suivant
 save.tests=Sauver les r\u00E9sultats d\u00E9finitifs
 score=R\u00E9sultats
 show.rubric=Montrer la description
diff --git a/src/main/java/org/olat/modules/fo/Message.java b/src/main/java/org/olat/modules/fo/Message.java
index e452453420194721eb5cd9b81051802d2e766f6b..c2db05cd9807c0b4933f0b75271f7fd21355b9e1 100644
--- a/src/main/java/org/olat/modules/fo/Message.java
+++ b/src/main/java/org/olat/modules/fo/Message.java
@@ -25,6 +25,8 @@
 
 package org.olat.modules.fo;
 
+import java.util.Date;
+
 import org.olat.core.id.CreateInfo;
 import org.olat.core.id.Identity;
 import org.olat.core.id.ModifiedInfo;
@@ -57,6 +59,13 @@ public interface Message extends MessageLight, CreateInfo, ModifiedInfo,  Persis
 	
 	public void setModifier(Identity identity);
 	
+	/**
+	 * @return The date the modifier makes a change
+	 */
+	public Date getModificationDate();
+	
+	public void setModificationDate(Date date);
+	
 	public Message getParent();
 	
 	public void setParent(Message message);
diff --git a/src/main/java/org/olat/modules/fo/MessageLight.java b/src/main/java/org/olat/modules/fo/MessageLight.java
index b81bad0ad9b4f51f0752bd37aea793f914d9cd9b..0170e47618982937cb13f952939853d435f6cd34 100644
--- a/src/main/java/org/olat/modules/fo/MessageLight.java
+++ b/src/main/java/org/olat/modules/fo/MessageLight.java
@@ -43,6 +43,11 @@ public interface MessageLight extends MessageRef {
 	
 	public Identity getModifier();
 	
+	/**
+	 * @return The date the modifier makes a change
+	 */
+	public Date getModificationDate();
+	
 	public Date getCreationDate();
 	
 	public Date getLastModified();
diff --git a/src/main/java/org/olat/modules/fo/archiver/MessageNode.java b/src/main/java/org/olat/modules/fo/archiver/MessageNode.java
index e3865c00f3bc2e8b9fc7b2f71cacedaf590d61c7..80fca14b639b0e287ff388ad50cddbabad4f732d 100644
--- a/src/main/java/org/olat/modules/fo/archiver/MessageNode.java
+++ b/src/main/java/org/olat/modules/fo/archiver/MessageNode.java
@@ -66,7 +66,11 @@ public class MessageNode extends GenericNode implements Serializable {
 		creator = message.getCreator();
 		creationDate = message.getCreationDate();
 		modifier = message.getModifier();
-		modifiedDate = message.getLastModified();
+		if(message.getModificationDate() != null) {
+			modifiedDate = message.getModificationDate();
+		} else {
+			modifiedDate = message.getLastModified();
+		}
 		guest = message.isGuest();
 		pseudonym = message.getPseudonym();
 		if(message.getParent()==null) {
diff --git a/src/main/java/org/olat/modules/fo/manager/ForumManager.java b/src/main/java/org/olat/modules/fo/manager/ForumManager.java
index 1b2e4d042f0470fbad0280b82dae1292837622d6..9feeb02040cecb09e23b06e8de94234af3bc23bf 100644
--- a/src/main/java/org/olat/modules/fo/manager/ForumManager.java
+++ b/src/main/java/org/olat/modules/fo/manager/ForumManager.java
@@ -1231,6 +1231,7 @@ public class ForumManager {
 		((MessageImpl)message).setCreationDate(oldMessage.getCreationDate());
 		message.setLastModified(oldMessage.getLastModified());
 		message.setModifier(oldMessage.getModifier());
+		message.setModificationDate(oldMessage.getModificationDate());
 		message.setTitle(oldMessage.getTitle());
 		message.setBody(oldMessage.getBody());
 		message.setPseudonym(oldMessage.getPseudonym());
diff --git a/src/main/java/org/olat/modules/fo/model/MessageImpl.java b/src/main/java/org/olat/modules/fo/model/MessageImpl.java
index 9bb1255adbed67fba7d1e0662554a56ad6e01d98..355b591057b24ca91f34b900461aab2d9db1c594 100644
--- a/src/main/java/org/olat/modules/fo/model/MessageImpl.java
+++ b/src/main/java/org/olat/modules/fo/model/MessageImpl.java
@@ -90,6 +90,9 @@ public class MessageImpl implements CreateInfo, Persistable, Message {
 	@Column(name="numofwords", nullable=true, insertable=true, updatable=true)
 	private Integer numOfWords;
 	
+	@Column(name="modification_date", nullable=true, insertable=true, updatable=true)
+	private Date modificationDate;
+	
 	@ManyToOne(targetEntity=MessageImpl.class,fetch=FetchType.LAZY,optional=true)
 	@JoinColumn(name="parent_id", nullable=true, insertable=true, updatable=true)
 	private Message parent;
@@ -130,18 +133,12 @@ public class MessageImpl implements CreateInfo, Persistable, Message {
 		this.creationDate = creationDate;
 	}
 
-
-	/**
-	 * @return
-	 */
+	@Override
 	public String getBody() {
 		return body;
 	}
 
-
-	/**
-	 * @return
-	 */
+	@Override
 	public Identity getCreator() {
 		return creator;
 	}
@@ -153,14 +150,17 @@ public class MessageImpl implements CreateInfo, Persistable, Message {
 		creator = identity;
 	}
 
+	@Override
 	public String getPseudonym() {
 		return pseudonym;
 	}
 
+	@Override
 	public void setPseudonym(String pseudonym) {
 		this.pseudonym = pseudonym;
 	}
 
+	@Override
 	public boolean isGuest() {
 		return guest;
 	}
@@ -169,9 +169,7 @@ public class MessageImpl implements CreateInfo, Persistable, Message {
 		this.guest = guest;
 	}
 
-	/**
-	 * @return
-	 */
+	@Override
 	public Forum getForum() {
 		return forum;
 	}
@@ -180,16 +178,12 @@ public class MessageImpl implements CreateInfo, Persistable, Message {
 		this.forum = forum;
 	}
 
-	/**
-	 * @return
-	 */
+	@Override
 	public Identity getModifier() {
 		return modifier;
 	}
 
-	/**
-	 * @return
-	 */
+	@Override
 	public Message getParent() {
 		return parent;
 	}
@@ -199,90 +193,86 @@ public class MessageImpl implements CreateInfo, Persistable, Message {
 		return parent == null ? null : parent.getKey();
 	}
 
-	/**
-	 * @return
-	 */
+	@Override
 	public Message getThreadtop() {
 		return threadtop;
 	}
 
-	/**
-	 * @return
-	 */
+	@Override
 	public String getTitle() {
 		return title;
 	}
 
-	/**
-	 * @param string
-	 */
+	@Override
 	public void setBody(String string) {
 		body = string;
 	}
 
-	/**
-	 * @param identity
-	 */
+	@Override
 	public void setModifier(Identity identity) {
 		modifier = identity;
 	}
 
-	/**
-	 * @param message
-	 */
+	@Override
 	public void setParent(Message message) {
 		parent = message;
 	}
 
-	/**
-	 * @param message
-	 */
+	@Override
 	public void setThreadtop(Message message) {
 		threadtop = message;
 	}
 
-	/**
-	 * @param string
-	 */
+	@Override
 	public void setTitle(String string) {
 		title = string;
 	}
-	
+
+	@Override
 	public int getStatusCode() {
 		return statusCode;
 	}
+	
+	@Override
 	public void setStatusCode(int statusCode) {
 		this.statusCode = statusCode;
 	}
 
-	/**
-	 * 
-	 * @see org.olat.core.id.ModifiedInfo#getLastModified()
-	 */
+	@Override
 	public Date getLastModified() {
 		return lastModified;
 	}
 
-	/**
-	 * 
-	 * @see org.olat.core.id.ModifiedInfo#setLastModified(java.util.Date)
-	 */
+	@Override
 	public void setLastModified(Date date) {
 		this.lastModified = date;
 	}
 
+	@Override
+	public Date getModificationDate() {
+		return modificationDate;
+	}
+
+	public void setModificationDate(Date modificationDate) {
+		this.modificationDate = modificationDate;
+	}
+
+	@Override
 	public Integer getNumOfCharacters() {
 		return numOfCharacters;
 	}
 
+	@Override
 	public void setNumOfCharacters(Integer numOfCharacters) {
 		this.numOfCharacters = numOfCharacters;
 	}
 
+	@Override
 	public Integer getNumOfWords() {
 		return numOfWords;
 	}
 
+	@Override
 	public void setNumOfWords(Integer numOfWords) {
 		this.numOfWords = numOfWords;
 	}
diff --git a/src/main/java/org/olat/modules/fo/model/MessageLightImpl.java b/src/main/java/org/olat/modules/fo/model/MessageLightImpl.java
index 54fd2e06ed4d3bdf2220103a5cf0078412db65da..50eff107ceeb497669ea8adf932b327063b0bbc0 100644
--- a/src/main/java/org/olat/modules/fo/model/MessageLightImpl.java
+++ b/src/main/java/org/olat/modules/fo/model/MessageLightImpl.java
@@ -82,6 +82,9 @@ public class MessageLightImpl implements MessageLight, CreateInfo, Persistable,
 	private String title;
 	@Column(name="body", nullable=false, insertable=false, updatable=false)
 	private String body;
+	
+	@Column(name="modification_date", nullable=true, insertable=true, updatable=true)
+	private Date modificationDate;
 
 	@Column(name="parent_id", nullable=true, insertable=false, updatable=false)
 	private Long parentKey;
@@ -112,27 +115,33 @@ public class MessageLightImpl implements MessageLight, CreateInfo, Persistable,
 	public Date getCreationDate() {
 		return creationDate;
 	}
-	
+
+	@Override
 	public int getStatusCode() {
 		return statusCode;
 	}
-	
+
+	@Override
 	public String getTitle() {
 		return title;
 	}
 
+	@Override
 	public String getBody() {
 		return body;
 	}
 
+	@Override
 	public Identity getCreator() {
 		return creator;
 	}
 
+	@Override
 	public String getPseudonym() {
 		return pseudonym;
 	}
 
+	@Override
 	public boolean isGuest() {
 		return guest;
 	}
@@ -141,21 +150,30 @@ public class MessageLightImpl implements MessageLight, CreateInfo, Persistable,
 		return forumKey;
 	}
 
+	@Override
 	public Identity getModifier() {
 		return modifier;
 	}
 
+	@Override
 	public Long getParentKey() {
 		return parentKey;
 	}
 
+	@Override
 	public MessageRef getThreadtop() {
 		return threadtop;
 	}
 
+	@Override
 	public Date getLastModified() {
 		return lastModified;
 	}
+	
+	@Override
+	public Date getModificationDate() {
+		return modificationDate;
+	}
 
 	@Override
 	public int hashCode() {
diff --git a/src/main/java/org/olat/modules/fo/restapi/MessageVO.java b/src/main/java/org/olat/modules/fo/restapi/MessageVO.java
index 81b0399f74209f9f7b5790d7af079692f3b309b7..0652ff9df4983e81336be7461e21729cc033b93f 100644
--- a/src/main/java/org/olat/modules/fo/restapi/MessageVO.java
+++ b/src/main/java/org/olat/modules/fo/restapi/MessageVO.java
@@ -89,7 +89,7 @@ public class MessageVO {
 		body = message.getBody();
 		
 		Status messageStatus = Status.getStatus(message.getStatusCode());
-		sticky = new Boolean(messageStatus.isSticky());
+		sticky = Boolean.valueOf(messageStatus.isSticky());
 	}
 
 	public Long getKey() {
diff --git a/src/main/java/org/olat/modules/fo/ui/MessageEditController.java b/src/main/java/org/olat/modules/fo/ui/MessageEditController.java
index c2714266c793a80d0994f34f76cbb86c95e0aaae..c6e8abfe19ef777b8eb3997af1b2b706f753fb09 100644
--- a/src/main/java/org/olat/modules/fo/ui/MessageEditController.java
+++ b/src/main/java/org/olat/modules/fo/ui/MessageEditController.java
@@ -24,6 +24,7 @@ import java.text.Collator;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.Date;
 import java.util.List;
 
 import javax.persistence.PersistenceException;
@@ -559,7 +560,8 @@ public class MessageEditController extends FormBasicController {
 	private void commitEditMode() {
 		boolean children = fm.countMessageChildren(message.getKey()) > 0;
 		if (foCallback.mayEditMessageAsModerator() || (userIsMsgCreator && !children)) {
-			message.setModifier(getIdentity());	
+			message.setModifier(getIdentity());
+			message.setModificationDate(new Date());
 			message = fm.updateMessage(message, true);
 			persistTempUploadedFiles(message);
 			notifiySubscription();
diff --git a/src/main/java/org/olat/modules/fo/ui/MessageListController.java b/src/main/java/org/olat/modules/fo/ui/MessageListController.java
index 7d05902624a9ac97dca26fcbcae16d5dcb376f5c..d459573b058ebde3c0c2d9ab1d5e0e3bea12d0ad 100644
--- a/src/main/java/org/olat/modules/fo/ui/MessageListController.java
+++ b/src/main/java/org/olat/modules/fo/ui/MessageListController.java
@@ -600,6 +600,12 @@ public class MessageListController extends BasicController implements GenericEve
 				messageView.setModifierFirstName(modifier.getUser().getProperty(UserConstants.FIRSTNAME, getLocale()));
 				messageView.setModifierLastName(modifier.getUser().getProperty(UserConstants.LASTNAME, getLocale()));
 			}
+			
+			if(m.getModificationDate() != null) {
+				messageView.setFormattedModificationDate(formatter.formatDateAndTime(m.getModificationDate()));
+			} else {
+				messageView.setFormattedModificationDate(messageView.getFormattedLastModified());
+			}	
 		} else {
 			messageView.setModified(false);
 		}
diff --git a/src/main/java/org/olat/modules/fo/ui/MessageView.java b/src/main/java/org/olat/modules/fo/ui/MessageView.java
index c92e46ad79b18c295f05c5bb4fab3405e679ddd9..2a419eef6456ed93c8ea47ac9ff6e7c87f81bd91 100644
--- a/src/main/java/org/olat/modules/fo/ui/MessageView.java
+++ b/src/main/java/org/olat/modules/fo/ui/MessageView.java
@@ -45,6 +45,7 @@ public class MessageView extends MessageLightView {
 	private String modifierFirstName;
 	private String modifierLastName;
 	private String modifierPseudonym;
+	private String formattedModificationDate;
 	
 	private String creatorFirstname;
 	private String creatorLastname;
@@ -140,6 +141,14 @@ public class MessageView extends MessageLightView {
 		this.modifierPseudonym = modifierPseudonym;
 	}
 
+	public String getFormattedModificationDate() {
+		return formattedModificationDate;
+	}
+
+	public void setFormattedModificationDate(String formattedModificationDate) {
+		this.formattedModificationDate = formattedModificationDate;
+	}
+
 	public boolean isAuthor() {
 		return author;
 	}
diff --git a/src/main/java/org/olat/modules/fo/ui/_content/threadview.html b/src/main/java/org/olat/modules/fo/ui/_content/threadview.html
index c56798979da302640d2e6064e352ed798c06c017..0516c20957da370a157d08bcd3e2e4ec34b6b67c 100644
--- a/src/main/java/org/olat/modules/fo/ui/_content/threadview.html
+++ b/src/main/java/org/olat/modules/fo/ui/_content/threadview.html
@@ -112,7 +112,7 @@
 					#else
 		   				$r.escapeHtml($message.modifierFirstName) $r.escapeHtml($message.modifierLastName)
 		   			#end
-		   			$message.formattedLastModified
+		   			$message.formattedModificationDate
 		   		#end
 		   		#if($message.moved)
 		   			$r.translate("msg.moved")
diff --git a/src/main/java/org/olat/upgrade/_spring/databaseUpgradeContext.xml b/src/main/java/org/olat/upgrade/_spring/databaseUpgradeContext.xml
index a6905f231cd6743dcfdcabb7958f3ce8f90ee0f2..2ade21fdc7e4888020f748cddfae0d101d8e509e 100644
--- a/src/main/java/org/olat/upgrade/_spring/databaseUpgradeContext.xml
+++ b/src/main/java/org/olat/upgrade/_spring/databaseUpgradeContext.xml
@@ -228,6 +228,10 @@
 					<constructor-arg index="0" value="OLAT_14.2.13" />
 					<property name="alterDbStatements" value="alter_14_2_x_to_14_2_13.sql" />
 				</bean>
+				<bean id="database_upgrade_14_2_16" class="org.olat.upgrade.DatabaseUpgrade">
+					<constructor-arg index="0" value="OLAT_14.2.16" />
+					<property name="alterDbStatements" value="alter_14_2_x_to_14_2_16.sql" />
+				</bean>
 				<bean id="database_upgrade_15_pre_0" class="org.olat.upgrade.DatabaseUpgrade">
 					<constructor-arg index="0" value="OLAT_15.pre.0" />
 					<property name="alterDbStatements" value="alter_14_2_x_to_15_pre_0.sql" />
diff --git a/src/main/resources/database/mysql/alter_14_2_x_to_14_2_16.sql b/src/main/resources/database/mysql/alter_14_2_x_to_14_2_16.sql
new file mode 100644
index 0000000000000000000000000000000000000000..653a4f486bedee86c8bc15089722c9553a662969
--- /dev/null
+++ b/src/main/resources/database/mysql/alter_14_2_x_to_14_2_16.sql
@@ -0,0 +1,3 @@
+-- Forum
+alter table o_message add column modification_date datetime;
+
diff --git a/src/main/resources/database/mysql/setupDatabase.sql b/src/main/resources/database/mysql/setupDatabase.sql
index 9bfb12beabfff6678776124b8e0fb511529ecc56..29174514bbb946619838e65bb5425ffdf5ea5e21 100644
--- a/src/main/resources/database/mysql/setupDatabase.sql
+++ b/src/main/resources/database/mysql/setupDatabase.sql
@@ -418,6 +418,7 @@ create table if not exists o_message (
    topthread_id bigint,
    creator_id bigint,
    modifier_id bigint,
+   modification_date datetime,
    forum_fk bigint,
    statuscode integer,
    numofwords integer,
diff --git a/src/main/resources/database/oracle/alter_14_2_x_to_14_2_16.sql b/src/main/resources/database/oracle/alter_14_2_x_to_14_2_16.sql
new file mode 100644
index 0000000000000000000000000000000000000000..97b1f33e661210eee5299a077450552c549342a0
--- /dev/null
+++ b/src/main/resources/database/oracle/alter_14_2_x_to_14_2_16.sql
@@ -0,0 +1,3 @@
+-- Forum
+alter table o_message add modification_date date;
+
diff --git a/src/main/resources/database/oracle/setupDatabase.sql b/src/main/resources/database/oracle/setupDatabase.sql
index 5f911680e7fca659a629c14b48a404807e76656f..ac8aaed042648df1c43faddd23c79ade34bdced0 100644
--- a/src/main/resources/database/oracle/setupDatabase.sql
+++ b/src/main/resources/database/oracle/setupDatabase.sql
@@ -456,6 +456,7 @@ CREATE TABLE o_message (
   topthread_id number(20),
   creator_id number(20),
   modifier_id number(20),
+  modification_date date,
   forum_fk number(20),
   statuscode number(11),
   numofwords number(11),
diff --git a/src/main/resources/database/postgresql/alter_14_2_x_to_14_2_16.sql b/src/main/resources/database/postgresql/alter_14_2_x_to_14_2_16.sql
new file mode 100644
index 0000000000000000000000000000000000000000..9b1f658350230fa7de3b8ab00c02ea608db1ef88
--- /dev/null
+++ b/src/main/resources/database/postgresql/alter_14_2_x_to_14_2_16.sql
@@ -0,0 +1,3 @@
+-- Forum
+alter table o_message add column modification_date timestamp;
+
diff --git a/src/main/resources/database/postgresql/setupDatabase.sql b/src/main/resources/database/postgresql/setupDatabase.sql
index e386e52daadd02cac208a6ef8b96c5caa26ac29d..1064d3b87f426294062fc2f0bc8596dda9241948 100644
--- a/src/main/resources/database/postgresql/setupDatabase.sql
+++ b/src/main/resources/database/postgresql/setupDatabase.sql
@@ -416,6 +416,7 @@ create table o_message (
    topthread_id int8,
    creator_id int8,
    modifier_id int8,
+   modification_date timestamp,
    forum_fk int8,
    statuscode int4,
    numofwords int4,
diff --git a/src/test/java/org/olat/course/assessment/manager/AssessmentModeManagerTest.java b/src/test/java/org/olat/course/assessment/manager/AssessmentModeManagerTest.java
index e102c9d950776d481803c369f13e11ad0e04a7b8..f2fa98477781eaf41a01de760cce6347ae20bdf7 100644
--- a/src/test/java/org/olat/course/assessment/manager/AssessmentModeManagerTest.java
+++ b/src/test/java/org/olat/course/assessment/manager/AssessmentModeManagerTest.java
@@ -994,8 +994,54 @@ public class AssessmentModeManagerTest extends OlatTestCase {
 		Assert.assertTrue(assessedIdentityKeys.contains(participant1.getKey()));
 		Assert.assertTrue(assessedIdentityKeys.contains(coach2.getKey()));
 		Assert.assertTrue(assessedIdentityKeys.contains(participant2.getKey()));
-	}	
+	}
 	
+	@Test
+	public void getAssessedIdentities_course_curriculumElements() {
+		Identity author = JunitTestHelper.createAndPersistIdentityAsRndUser("as-mode-39");
+		RepositoryEntry entry = JunitTestHelper.deployBasicCourse(author);
+		Identity participant1 = JunitTestHelper.createAndPersistIdentityAsRndUser("as-mode-40");
+		Identity participant2 = JunitTestHelper.createAndPersistIdentityAsRndUser("as-mode-41");
+		Identity coach1 = JunitTestHelper.createAndPersistIdentityAsRndUser("as-mode-42");
+		
+		Curriculum curriculum = curriculumService.createCurriculum("cur-as-mode-4", "Curriculum for assessment", "Curriculum", null);
+		CurriculumElement element1 = curriculumService.createCurriculumElement("Element-for-rel-1", "Element for assessment",  CurriculumElementStatus.active,
+				null, null, null, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, CurriculumLearningProgress.disabled, curriculum);
+		CurriculumElement element2 = curriculumService.createCurriculumElement("Element-for-rel-2", "Element for assessment",  CurriculumElementStatus.active,
+				null, null, null, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, CurriculumLearningProgress.disabled, curriculum);
+		
+		dbInstance.commit();
+		curriculumService.addRepositoryEntry(element1, entry, false);
+		curriculumService.addRepositoryEntry(element2, entry, false);
+		curriculumService.addMember(element1, participant1, CurriculumRoles.participant);
+		curriculumService.addMember(element2, participant2, CurriculumRoles.participant);
+		curriculumService.addMember(element1, coach1, CurriculumRoles.coach);
+		curriculumService.addMember(element2, coach1, CurriculumRoles.coach);
+		dbInstance.commitAndCloseSession();
+		
+		Identity participant3 = JunitTestHelper.createAndPersistIdentityAsRndUser("as-mode-23");
+		Identity coach2 = JunitTestHelper.createAndPersistIdentityAsRndUser("as-mode-24");
+		repositoryEntryRelationDao.addRole(participant3, entry, GroupRoles.participant.name());
+		repositoryEntryRelationDao.addRole(coach2, entry, GroupRoles.coach.name());
+		repositoryEntryRelationDao.addRole(author, entry, GroupRoles.owner.name());
+		
+		AssessmentMode mode = createMinimalAssessmentmode(entry);
+		mode.setTargetAudience(AssessmentMode.Target.curriculumEls);
+		mode.setApplySettingsForCoach(true);
+		mode = assessmentModeMgr.persist(mode);
+
+		AssessmentModeToCurriculumElement modeToElement = assessmentModeMgr.createAssessmentModeToCurriculumElement(mode, element1);
+		mode.getCurriculumElements().add(modeToElement);
+		mode = assessmentModeMgr.merge(mode, true);
+		dbInstance.commitAndCloseSession();
+		Assert.assertNotNull(mode);
+
+		Set<Long> assessedIdentityKeys = assessmentModeMgr.getAssessedIdentityKeys(mode);
+		Assert.assertNotNull(assessedIdentityKeys);
+		Assert.assertEquals(2, assessedIdentityKeys.size());
+		Assert.assertTrue(assessedIdentityKeys.contains(coach1.getKey()));
+		Assert.assertTrue(assessedIdentityKeys.contains(participant1.getKey()));
+	}
 	
 	@Test
 	public void isIpAllowed_exactMatch() {