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 571328ff38d8ed5760a5c480d14b873d2a085492..f11316f22946da216044ec5a380af2458284f789 100644
--- a/src/main/java/org/olat/course/assessment/manager/CourseAssessmentManagerImpl.java
+++ b/src/main/java/org/olat/course/assessment/manager/CourseAssessmentManagerImpl.java
@@ -86,9 +86,9 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
 	
 	public static final String ASSESSMENT_DOCS_DIR = "assessmentdocs";
 	
-	private static final Float FLOAT_ZERO = new Float(0);
-	private static final Double DOUBLE_ZERO = new Double(0);
-	private static final Integer INTEGER_ZERO = new Integer(0);
+	private static final Float FLOAT_ZERO = Float.valueOf(0.0f);
+	private static final Double DOUBLE_ZERO = Double.valueOf(0.0d);
+	private static final Integer INTEGER_ZERO = Integer.valueOf(0);
 	
 	private final CourseGroupManager cgm;
 	private final AssessmentService assessmentService;
@@ -179,7 +179,7 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
 
 		//node log
 		UserNodeAuditManager am = course.getCourseEnvironment().getAuditManager();
-		am.appendToUserNodeLog(courseNode, identity, assessedIdentity, "ATTEMPTS set to: " + String.valueOf(attempts));
+		am.appendToUserNodeLog(courseNode, identity, assessedIdentity, "ATTEMPTS set to: " + String.valueOf(attempts), by);
 
 		// notify about changes
 		AssessmentChangedEvent ace = new AssessmentChangedEvent(AssessmentChangedEvent.TYPE_ATTEMPTS_CHANGED, assessedIdentity);
@@ -202,7 +202,7 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
 		
 		// node log
 		UserNodeAuditManager am = course.getCourseEnvironment().getAuditManager();
-		am.appendToUserNodeLog(courseNode, identity, assessedIdentity, "COMMENT set to: " + comment);
+		am.appendToUserNodeLog(courseNode, identity, assessedIdentity, "COMMENT set to: " + comment, null);
 
 		// notify about changes
 		AssessmentChangedEvent ace = new AssessmentChangedEvent(AssessmentChangedEvent.TYPE_USER_COMMENT_CHANGED, assessedIdentity);
@@ -241,7 +241,7 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
 			// node log
 			ICourse course = CourseFactory.loadCourse(cgm.getCourseEntry());
 			UserNodeAuditManager am = course.getCourseEnvironment().getAuditManager();
-			am.appendToUserNodeLog(courseNode, identity, assessedIdentity, "assessment document added: " + filename);
+			am.appendToUserNodeLog(courseNode, identity, assessedIdentity, "assessment document added: " + filename, null);
 			
 			// user activity logging
 			ThreadLocalUserActivityLogger.log(AssessmentLoggingAction.ASSESSMENT_DOCUMENT_ADDED, 
@@ -269,7 +269,7 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
 			// node log
 			ICourse course = CourseFactory.loadCourse(cgm.getCourseEntry());
 			UserNodeAuditManager am = course.getCourseEnvironment().getAuditManager();
-			am.appendToUserNodeLog(courseNode, identity, assessedIdentity, "assessment document removed: " + document.getName());
+			am.appendToUserNodeLog(courseNode, identity, assessedIdentity, "assessment document removed: " + document.getName(), null);
 			
 			// user activity logging
 			ThreadLocalUserActivityLogger.log(AssessmentLoggingAction.ASSESSMENT_DOCUMENT_REMOVED, 
@@ -461,14 +461,14 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
 		
 		// node log
 		UserNodeAuditManager am = courseEnv.getAuditManager();
-		am.appendToUserNodeLog(courseNode, identity, assessedIdentity,  "score set to: " + String.valueOf(scoreEvaluation.getScore()));
+		am.appendToUserNodeLog(courseNode, identity, assessedIdentity,  "score set to: " + String.valueOf(scoreEvaluation.getScore()), by);
 		if(scoreEvaluation.getPassed()!=null) {
-			am.appendToUserNodeLog(courseNode, identity, assessedIdentity, "passed set to: " + scoreEvaluation.getPassed().toString());
+			am.appendToUserNodeLog(courseNode, identity, assessedIdentity, "passed set to: " + scoreEvaluation.getPassed().toString(), by);
 		} else {
-			am.appendToUserNodeLog(courseNode, identity, assessedIdentity, "passed set to \"undefined\"");
+			am.appendToUserNodeLog(courseNode, identity, assessedIdentity, "passed set to \"undefined\"", by);
 		}
 		if(scoreEvaluation.getAssessmentID()!=null) {
-			am.appendToUserNodeLog(courseNode, assessedIdentity, assessedIdentity, "assessmentId set to: " + scoreEvaluation.getAssessmentID().toString());
+			am.appendToUserNodeLog(courseNode, assessedIdentity, assessedIdentity, "assessmentId set to: " + scoreEvaluation.getAssessmentID().toString(), by);
 		}
 		
 		// notify about changes
@@ -504,7 +504,7 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
 		
 		// write only when enabled for this course
 		if (courseEnv.getCourseConfig().isEfficencyStatementEnabled()) {
-			List<AssessmentNodeData> data = new ArrayList<AssessmentNodeData>(50);
+			List<AssessmentNodeData> data = new ArrayList<>(50);
 			AssessmentNodesLastModified lastModifications = new AssessmentNodesLastModified();
 			AssessmentHelper.getAssessmentNodeDataList(0, courseEnv.getRunStructure().getRootNode(),
 					scoreAccounting, userCourseEnv, true, true, true, data, lastModifications);
diff --git a/src/main/java/org/olat/course/auditing/UserNodeAuditManager.java b/src/main/java/org/olat/course/auditing/UserNodeAuditManager.java
index 6a161148bd8641db5a3f859751ded84599eb3b02..1723740c550c02670dd241ac808ca0afd0ca9801 100644
--- a/src/main/java/org/olat/course/auditing/UserNodeAuditManager.java
+++ b/src/main/java/org/olat/course/auditing/UserNodeAuditManager.java
@@ -28,6 +28,7 @@ package org.olat.course.auditing;
 import org.olat.core.id.Identity;
 import org.olat.course.nodes.CourseNode;
 import org.olat.group.BusinessGroup;
+import org.olat.modules.assessment.Role;
 
 /**
  * Description:
@@ -83,9 +84,10 @@ public interface UserNodeAuditManager {
 	 * @param identity The user who initiated the action that triggered the log
 	 *          entry
 	 * @param assessedIdentity The user who is affected by the change
-	 * @param logText
+	 * @param logText The text to log
+	 * @param by The role of the acting user (optional)
 	 */
-	public void appendToUserNodeLog(CourseNode courseNode, Identity identity, Identity assessedIdentity, String logText);
+	public void appendToUserNodeLog(CourseNode courseNode, Identity identity, Identity assessedIdentity, String logText, Role by);
 	
 	/**
 	 * 
@@ -95,6 +97,6 @@ public interface UserNodeAuditManager {
 	 * @param assessedGroup
 	 * @param logText
 	 */
-	public void appendToUserNodeLog(CourseNode courseNode, Identity identity, BusinessGroup assessedGroup, String logText);
+	public void appendToUserNodeLog(CourseNode courseNode, Identity identity, BusinessGroup assessedGroup, String logText, Role by);
 
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/course/auditing/UserNodeAuditManagerImpl.java b/src/main/java/org/olat/course/auditing/UserNodeAuditManagerImpl.java
index 304f764db785beaaba392c01f0864e6d7ec93e71..fb5785213936321ca80e27a0f356a140d0c2f7a9 100644
--- a/src/main/java/org/olat/course/auditing/UserNodeAuditManagerImpl.java
+++ b/src/main/java/org/olat/course/auditing/UserNodeAuditManagerImpl.java
@@ -32,6 +32,7 @@ import org.olat.course.ICourse;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.properties.CoursePropertyManager;
 import org.olat.group.BusinessGroup;
+import org.olat.modules.assessment.Role;
 import org.olat.properties.Property;
 
 /**
@@ -57,14 +58,9 @@ public class UserNodeAuditManagerImpl implements UserNodeAuditManager {
 		cpm = course.getCourseEnvironment().getCoursePropertyManager();
 	}
 	
-	/**
-	 * @see org.olat.course.auditing.AuditManager#appendToUserNodeLog(org.olat.course.nodes.CourseNode,
-	 *      org.olat.core.id.Identity, org.olat.core.id.Identity,
-	 *      java.lang.String)
-	 */
 	@Override
-	public void appendToUserNodeLog(CourseNode courseNode, Identity identity, Identity assessedIdentity, String logText) {
-		String text = formatMessage(identity, logText) ;
+	public void appendToUserNodeLog(CourseNode courseNode, Identity identity, Identity assessedIdentity, String logText, Role by) {
+		String text = formatMessage(identity, logText, by) ;
 		
 		Property logProperty = cpm.findCourseNodeProperty(courseNode, assessedIdentity, null, LOG_IDENTIFYER);
 		if (logProperty == null) {
@@ -79,8 +75,8 @@ public class UserNodeAuditManagerImpl implements UserNodeAuditManager {
 	}
 		
 	@Override
-	public void appendToUserNodeLog(CourseNode courseNode, Identity identity, BusinessGroup assessedGroup, String logText) {
-		String text = formatMessage(identity, logText) ;
+	public void appendToUserNodeLog(CourseNode courseNode, Identity identity, BusinessGroup assessedGroup, String logText, Role by) {
+		String text = formatMessage(identity, logText, by) ;
 		
 		Property logProperty = cpm.findCourseNodeProperty(courseNode, null, assessedGroup, LOG_IDENTIFYER);
 		if (logProperty == null) {
@@ -93,8 +89,8 @@ public class UserNodeAuditManagerImpl implements UserNodeAuditManager {
 			cpm.updateProperty(logProperty);
 		}
 	}
-	
-	private String formatMessage(Identity identity, String logText) {
+
+	private String formatMessage(Identity identity, String logText, Role by) {
 		Date now = new Date();
 		String date;
 		synchronized(sdb) {
@@ -103,8 +99,19 @@ public class UserNodeAuditManagerImpl implements UserNodeAuditManager {
 		StringBuilder sb = new StringBuilder(256);
 		sb.append(LOG_DELIMITER)
 		  .append("Date: ").append(date).append("\n");
-		if(identity != null) {
-			sb.append("Identity: ").append(identity.getKey()).append("\n");
+		if(by == Role.auto) {
+			sb.append("Identity: automatic");
+		} else if(identity != null) {
+			sb.append("Identity: ")
+			  .append(identity.getUser().getFirstName())
+			  .append(" ")
+			  .append(identity.getUser().getLastName())
+			  .append(" (")
+			  .append(identity.getKey()).append(")");
+			if(by == Role.coach) {
+				sb.append(" (coach)");
+			}
+			sb.append("\n");
 		}
 		sb.append(logText).append("\n");
 		return sb.toString();
@@ -112,7 +119,7 @@ public class UserNodeAuditManagerImpl implements UserNodeAuditManager {
 
 	protected String createLimitedLogContent(String logContent, int maxLength) {
 		if (logContent.length() < maxLength) {
-			return logContent.toString();// nothing to limit
+			return logContent;// nothing to limit
 		}
 		// too long => limit it by removing first log entries
 		while (logContent.length() > maxLength) {
@@ -122,19 +129,12 @@ public class UserNodeAuditManagerImpl implements UserNodeAuditManager {
 		return LOG_PREFIX_REMOVED_OLD_LOG_ENTRIES + logContent;
 	}
 
-	/**
-	 * @see org.olat.course.auditing.AuditManager#hasUserNodeLogs(org.olat.course.nodes.CourseNode)
-	 */
 	@Override
 	public boolean hasUserNodeLogs(CourseNode node) {
 		int numOfProperties = cpm.countCourseNodeProperties(node, null, null, LOG_IDENTIFYER);
 		return numOfProperties > 0;
 	}
 
-	/**
-	 * @see org.olat.course.auditing.AuditManager#getUserNodeLog(org.olat.course.nodes.CourseNode,
-	 *      org.olat.core.id.Identity)
-	 */
 	@Override
 	public String getUserNodeLog(CourseNode courseNode, Identity identity) {
 		Property property = cpm.findCourseNodeProperty(courseNode, identity, null, LOG_IDENTIFYER);
diff --git a/src/main/java/org/olat/course/nodes/gta/GTAManager.java b/src/main/java/org/olat/course/nodes/gta/GTAManager.java
index 0140879b7c4ff4ed11ff0e03dd7aafa29f15941c..ef12ab7cf7362d557e5f17324c7ff0af6257daea 100644
--- a/src/main/java/org/olat/course/nodes/gta/GTAManager.java
+++ b/src/main/java/org/olat/course/nodes/gta/GTAManager.java
@@ -362,9 +362,9 @@ public interface GTAManager {
 	public boolean hasMarks(RepositoryEntry entry, GTACourseNode gtaNode, Identity marker);
 
 	public void log(String step, String operation, Task assignedTask, Identity actor, Identity assessedIdentity, BusinessGroup assessedGroup,
-			CourseEnvironment courseEnv, GTACourseNode cNode);
+			CourseEnvironment courseEnv, GTACourseNode cNode, Role by);
 	
 	public void log(String step, SubmitEvent event, Task assignedTask, Identity actor, Identity assessedIdentity, BusinessGroup assessedGroup,
-			CourseEnvironment courseEnv, GTACourseNode cNode);
+			CourseEnvironment courseEnv, GTACourseNode cNode, Role by);
 
 }
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 1564435fe3b7610f97a846508e2b931503001188..73e88ce2e2e251742493030e26d35b40fe6e1d2d 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
@@ -1682,35 +1682,37 @@ public class GTAManagerImpl implements GTAManager {
 
 	@Override
 	public void log(String step, String operation, Task assignedTask, Identity actor, Identity assessedIdentity, BusinessGroup assessedGroup,
-			CourseEnvironment courseEnv, GTACourseNode cNode) {
+			CourseEnvironment courseEnv, GTACourseNode cNode, Role by) {
 		//log
-		String msg = step + " of " + assignedTask.getTaskName() + ": " + operation;
+		String taskName = StringHelper.containsNonWhitespace(assignedTask.getTaskName()) ? assignedTask.getTaskName() : assignedTask.getKey().toString();
+		String msg = step + " of " + taskName + ": " + operation;
 		if(GTAType.group.name().equals(cNode.getModuleConfiguration().getStringValue(GTACourseNode.GTASK_TYPE))) {
 			log.audit(msg + " to business group: " + assessedGroup.getName(), null);
 			courseEnv.getAuditManager()
-				.appendToUserNodeLog(cNode, actor, assessedGroup, msg);
+				.appendToUserNodeLog(cNode, actor, assessedGroup, msg, by);
 		} else {
 			log.audit(msg, null);
 			courseEnv.getAuditManager()
-				.appendToUserNodeLog(cNode, actor, assessedIdentity, msg);
+				.appendToUserNodeLog(cNode, actor, assessedIdentity, msg, by);
 		}
 	}
 
 	@Override
 	public void log(String step, SubmitEvent event, Task assignedTask, Identity actor, Identity assessedIdentity, BusinessGroup assessedGroup,
-			CourseEnvironment courseEnv, GTACourseNode cNode) {
+			CourseEnvironment courseEnv, GTACourseNode cNode, Role by) {
 		String operation = event.getLogMessage();
 		String file = event.getFilename();
 		//log
-		String msg = step + " of " + assignedTask.getTaskName() + ": " + operation + " " + file;
+		String taskName = StringHelper.containsNonWhitespace(assignedTask.getTaskName()) ? assignedTask.getTaskName() : assignedTask.getKey().toString();
+		String msg = step + " of " + taskName + ": " + operation + " " + file;
 		if(GTAType.group.name().equals(cNode.getModuleConfiguration().getStringValue(GTACourseNode.GTASK_TYPE))) {
 			log.audit(msg + " to business group: " + assessedGroup.getName(), null);
 			courseEnv.getAuditManager()
-				.appendToUserNodeLog(cNode, actor, assessedGroup, msg);
+				.appendToUserNodeLog(cNode, actor, assessedGroup, msg, by);
 		} else {
 			log.audit(msg, null);
 			courseEnv.getAuditManager()
-				.appendToUserNodeLog(cNode, actor, assessedIdentity, msg);
+				.appendToUserNodeLog(cNode, actor, assessedIdentity, msg, by);
 		}
 	}
 	
diff --git a/src/main/java/org/olat/course/nodes/gta/manager/GTANotifications.java b/src/main/java/org/olat/course/nodes/gta/manager/GTANotifications.java
index c0841e8ea44fd841d18921e541ccd2620e1715f7..17abc26974f797e796a4c4c23f78721086bfa002 100644
--- a/src/main/java/org/olat/course/nodes/gta/manager/GTANotifications.java
+++ b/src/main/java/org/olat/course/nodes/gta/manager/GTANotifications.java
@@ -59,6 +59,7 @@ import org.olat.course.nodes.gta.TaskRevisionDate;
 import org.olat.course.nodes.gta.model.DueDate;
 import org.olat.course.nodes.gta.model.Membership;
 import org.olat.course.nodes.gta.ui.GTARunController;
+import org.olat.course.nodes.gta.ui.events.SubmitEvent;
 import org.olat.course.run.environment.CourseEnvironment;
 import org.olat.course.run.userview.UserCourseEnvironment;
 import org.olat.group.BusinessGroup;
@@ -696,6 +697,7 @@ class GTANotifications {
 			if(dueDate != null && dueDate.getDueDate() != null && dueDate.getDueDate().before(new Date())) {
 				int numOfDocs = getNumberOfSubmittedDocuments(assessedIdentity, assessedGroup);
 				task = gtaManager.submitTask(task, gtaNode, numOfDocs, Role.auto);
+				gtaManager.log("Submit", (SubmitEvent)null, task, null, assessedIdentity, assessedGroup, courseEnv, gtaNode, Role.auto);
 				doUpdateAttempts(assessedIdentity, assessedGroup);
 			}
 		}
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/ConfirmResetTaskController.java b/src/main/java/org/olat/course/nodes/gta/ui/ConfirmResetTaskController.java
index c4d21b509731b48f773acf655232a1a6007f5b91..0b72eb38ce95bc552901b077c09233e8e6ec9773 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/ConfirmResetTaskController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/ConfirmResetTaskController.java
@@ -34,6 +34,7 @@ import org.olat.course.nodes.GTACourseNode;
 import org.olat.course.nodes.gta.GTAManager;
 import org.olat.course.nodes.gta.Task;
 import org.olat.course.run.environment.CourseEnvironment;
+import org.olat.modules.assessment.Role;
 import org.olat.user.UserManager;
 import org.springframework.beans.factory.annotation.Autowired;
 
@@ -93,7 +94,7 @@ public class ConfirmResetTaskController extends FormBasicController {
 	@Override
 	protected void formOK(UserRequest ureq) {
 		task = gtaManager.resetTask(task, gtaNode, courseEnv);
-		gtaManager.log("Reset task", "reset task", task, getIdentity(), getIdentity(), null, courseEnv, gtaNode);
+		gtaManager.log("Reset task", "reset task", task, getIdentity(), getIdentity(), null, courseEnv, gtaNode, Role.coach);
 		fireEvent(ureq, Event.DONE_EVENT);
 	}
 
@@ -101,7 +102,7 @@ public class ConfirmResetTaskController extends FormBasicController {
 	protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
 		if(dontResetButton == source) {
 			task = gtaManager.resetTaskRefused(task, gtaNode);
-			gtaManager.log("Refuse reset task", "refuse reset task", task, getIdentity(), getIdentity(), null, courseEnv, gtaNode);
+			gtaManager.log("Refuse reset task", "refuse reset task", task, getIdentity(), getIdentity(), null, courseEnv, gtaNode, Role.coach);
 			fireEvent(ureq, Event.DONE_EVENT);
 		}
 		super.formInnerEvent(ureq, source, event);
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/EditDueDatesController.java b/src/main/java/org/olat/course/nodes/gta/ui/EditDueDatesController.java
index 33758eac7748e4dce7454793023ae687e7e47148..5cf6b63c21bfe398ec982d3a963a3a9e4685d00d 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/EditDueDatesController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/EditDueDatesController.java
@@ -153,7 +153,8 @@ public class EditDueDatesController extends FormBasicController {
 			TaskProcess submit = gtaManager.previousStep(TaskProcess.review, gtaNode);//only submit allowed
 			if(submit == TaskProcess.submit) {
 				task = gtaManager.updateTask(task, submit, gtaNode, Role.coach);
-				gtaManager.log("Back to submission", "revert status of task back to submission", task, getIdentity(), assessedIdentity, assessedGroup, courseEnv, gtaNode);
+				gtaManager.log("Back to submission", "revert status of task back to submission", task, getIdentity(),
+						assessedIdentity, assessedGroup, courseEnv, gtaNode, Role.coach);
 			}
 		}
 		
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/EditMultipleDueDatesController.java b/src/main/java/org/olat/course/nodes/gta/ui/EditMultipleDueDatesController.java
index 57432f711feba0af2f9714d8956a443be8ffc4af..be56d90cefe6115ac9419f6844d1dfd1c8c67afe 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/EditMultipleDueDatesController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/EditMultipleDueDatesController.java
@@ -147,7 +147,8 @@ public class EditMultipleDueDatesController extends FormBasicController {
 				TaskProcess submit = gtaManager.previousStep(TaskProcess.review, gtaNode);//only submit allowed
 				if(submit == TaskProcess.submit) {
 					task = gtaManager.updateTask(task, submit, gtaNode, Role.coach);
-					gtaManager.log("Back to submission", "revert status of task back to submission", task, getIdentity(), task.getIdentity(), task.getBusinessGroup(), courseEnv, gtaNode);
+					gtaManager.log("Back to submission", "revert status of task back to submission", task,
+							getIdentity(), task.getIdentity(), task.getBusinessGroup(), courseEnv, gtaNode, Role.coach);
 				}
 			}
 		}
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTAAvailableTaskController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTAAvailableTaskController.java
index 184d4557ae5eb86a40d1b189ed2b220a507c6339..50339be37d53bfa58b15ef18a14db8d4a7c05282 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/GTAAvailableTaskController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/GTAAvailableTaskController.java
@@ -67,6 +67,7 @@ import org.olat.course.nodes.gta.ui.component.DescriptionWithTooltipCellRenderer
 import org.olat.course.run.environment.CourseEnvironment;
 import org.olat.group.BusinessGroup;
 import org.olat.group.BusinessGroupService;
+import org.olat.modules.assessment.Role;
 import org.springframework.beans.factory.annotation.Autowired;
 
 /**
@@ -267,10 +268,11 @@ public class GTAAvailableTaskController extends FormBasicController {
 			showError("task.assignment.error");
 		} else if(response.getStatus() == AssignmentResponse.Status.alreadyAssigned) {
 			showWarning("task.alreadyChosen");
-		} else if(response == null || response.getStatus() == AssignmentResponse.Status.ok) {
+		} else if(response.getStatus() == AssignmentResponse.Status.ok) {
 			showInfo("task.successfully.assigned");
 			fireEvent(ureq, Event.DONE_EVENT);
-			gtaManager.log("Assignment", "task assigned", response.getTask(), getIdentity(), assessedIdentity, assessedGroup, courseEnv, gtaNode);
+			gtaManager.log("Assignment", "task assigned", response.getTask(), getIdentity(),
+					assessedIdentity, assessedGroup, courseEnv, gtaNode, Role.user);
 			doSendConfirmationEmail(response.getTask());
 		}
 	}
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTACoachController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTACoachController.java
index d5b777cdd5064603b9a6d3bf214cdc3a9c84b509..ffdcdd05e52ec81949d1166ad4a07a16fd7ae49b 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/GTACoachController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/GTACoachController.java
@@ -572,7 +572,8 @@ public class GTACoachController extends GTAAbstractController implements Assessm
 		} else if(submitCorrectionsCtrl == source) {
 			if(event instanceof SubmitEvent) {
 				Task assignedTask = submitCorrectionsCtrl.getAssignedTask();
-				gtaManager.log("Corrections", (SubmitEvent)event, assignedTask, getIdentity(), assessedIdentity, assessedGroup, courseEnv, gtaNode);
+				gtaManager.log("Corrections", (SubmitEvent)event, assignedTask,
+						getIdentity(), assessedIdentity, assessedGroup, courseEnv, gtaNode, Role.coach);
 			}
 		} else if(confirmReviewDocumentCtrl == source) {
 			if(DialogBoxUIFactory.isOkEvent(event) || DialogBoxUIFactory.isYesEvent(event)) {
@@ -665,7 +666,7 @@ public class GTACoachController extends GTAAbstractController implements Assessm
 		//go to solution, grading or graded
 		gtaManager.reviewedTask(task, gtaNode);
 		showInfo("coach.documents.successfully.reviewed");
-		gtaManager.log("Review", "documents reviewed", task, getIdentity(), assessedIdentity, assessedGroup, courseEnv, gtaNode);
+		gtaManager.log("Review", "documents reviewed", task, getIdentity(), assessedIdentity, assessedGroup, courseEnv, gtaNode, Role.coach);
 		
 		cleanUpProcess();
 		process(ureq);
@@ -684,7 +685,7 @@ public class GTACoachController extends GTAAbstractController implements Assessm
 	
 	private void doRevisions(UserRequest ureq, Task task) {
 		gtaManager.updateTask(task, TaskProcess.revision, 1, gtaNode, Role.coach);
-		gtaManager.log("Review", "need revision", task, getIdentity(), assessedIdentity, assessedGroup, courseEnv, gtaNode);
+		gtaManager.log("Review", "need revision", task, getIdentity(), assessedIdentity, assessedGroup, courseEnv, gtaNode, Role.coach);
 		
 		cleanUpProcess();
 		process(ureq);
@@ -742,7 +743,7 @@ public class GTACoachController extends GTAAbstractController implements Assessm
 		CoordinatorManager.getInstance().getCoordinator().getEventBus()
 			.fireEventToListenersOf(event, taskListEventResource);
 		
-		gtaManager.log("Collect", "collect documents", task, getIdentity(), assessedIdentity, assessedGroup, courseEnv, gtaNode);
+		gtaManager.log("Collect", "collect documents", task, getIdentity(), assessedIdentity, assessedGroup, courseEnv, gtaNode, Role.coach);
 		
 		cleanUpProcess();
 		process(ureq);
@@ -770,7 +771,8 @@ public class GTACoachController extends GTAAbstractController implements Assessm
 		if(submit == TaskProcess.submit) {
 			task = gtaManager.updateTask(task, submit, gtaNode, Role.coach);
 			
-			gtaManager.log("Back to submission", "revert status of task back to submission", task, getIdentity(), assessedIdentity, assessedGroup, courseEnv, gtaNode);
+			gtaManager.log("Back to submission", "revert status of task back to submission", task,
+					getIdentity(), assessedIdentity, assessedGroup, courseEnv, gtaNode, Role.coach);
 			
 			cleanUpProcess();
 			process(ureq);
@@ -794,7 +796,8 @@ public class GTACoachController extends GTAAbstractController implements Assessm
 	
 	private void doAllowResetTask(UserRequest ureq, Task assignedTask) {
 		gtaManager.allowResetTask(assignedTask, getIdentity(), gtaNode);
-		gtaManager.log("Allow reset task", "Allow the user to reset the task", assignedTask, getIdentity(), assessedIdentity, assessedGroup, courseEnv, gtaNode);
+		gtaManager.log("Allow reset task", "Allow the user to reset the task", assignedTask,
+				getIdentity(), assessedIdentity, assessedGroup, courseEnv, gtaNode, Role.coach);
 		cleanUpProcess();
 		process(ureq);
 		showInfo("info.task.reset.allowed", (String)null);
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTACoachRevisionAndCorrectionsController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTACoachRevisionAndCorrectionsController.java
index c249466d6428afcc21b852c8061d75017b3da9a7..01f625edd093b687fc7b99be9dcc84c0bac4659f 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/GTACoachRevisionAndCorrectionsController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/GTACoachRevisionAndCorrectionsController.java
@@ -287,7 +287,8 @@ public class GTACoachRevisionAndCorrectionsController extends BasicController im
 		if(uploadCorrectionsCtrl == source) {
 			if(event instanceof SubmitEvent) {
 				Task aTask = uploadCorrectionsCtrl.getAssignedTask();
-				gtaManager.log("Corrections", (SubmitEvent)event, aTask, getIdentity(), assessedIdentity, assessedGroup, courseEnv, gtaNode);
+				gtaManager.log("Corrections", (SubmitEvent)event, aTask,
+						getIdentity(), assessedIdentity, assessedGroup, courseEnv, gtaNode, Role.coach);
 			}
 		} else if(confirmReturnToRevisionsCtrl == source) {
 			if(event == Event.DONE_EVENT) {
@@ -376,7 +377,8 @@ public class GTACoachRevisionAndCorrectionsController extends BasicController im
 	
 	private void doCollect() {
 		assignedTask = gtaManager.updateTask(assignedTask, TaskProcess.correction, gtaNode, Role.coach);
-		gtaManager.log("Collect revision", "revision collected", assignedTask, getIdentity(), assessedIdentity, assessedGroup, courseEnv, gtaNode);
+		gtaManager.log("Collect revision", "revision collected", assignedTask,
+				getIdentity(), assessedIdentity, assessedGroup, courseEnv, gtaNode, Role.coach);
 
 		ICourse course = CourseFactory.loadCourse(courseEnv.getCourseResourceableId());
 		if(businessGroupTask) {
@@ -397,7 +399,8 @@ public class GTACoachRevisionAndCorrectionsController extends BasicController im
 	
 	private void doReturnToRevisions(Task task) {
 		assignedTask = gtaManager.updateTask(task, TaskProcess.revision, currentIteration + 1, gtaNode, Role.coach);
-		gtaManager.log("Revision", "need another revision", assignedTask, getIdentity(), assessedIdentity, assessedGroup, courseEnv, gtaNode);
+		gtaManager.log("Revision", "need another revision", assignedTask,
+				getIdentity(), assessedIdentity, assessedGroup, courseEnv, gtaNode, Role.coach);
 	}
 	
 	private void doConfirmCloseRevisionProcess(UserRequest ureq) {
@@ -409,6 +412,7 @@ public class GTACoachRevisionAndCorrectionsController extends BasicController im
 	
 	private void doCloseRevisionProcess() {
 		assignedTask = gtaManager.reviewedTask(assignedTask, gtaNode);
-		gtaManager.log("Revision", "close revision", assignedTask, getIdentity(), assessedIdentity, assessedGroup, courseEnv, gtaNode);
+		gtaManager.log("Revision", "close revision", assignedTask,
+				getIdentity(), assessedIdentity, assessedGroup, courseEnv, gtaNode, Role.coach);
 	}
 }
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTAParticipantController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTAParticipantController.java
index fcc500d7f4f2bc7cd1a23b02c67430ebc00ad3ac..51974e7b7261eb46d5d06d4c0c5f78b33942f33c 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/GTAParticipantController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/GTAParticipantController.java
@@ -347,7 +347,8 @@ public class GTAParticipantController extends GTAAbstractController implements A
 		CoordinatorManager.getInstance().getCoordinator().getEventBus()
 			.fireEventToListenersOf(event, taskListEventResource);
 		
-		gtaManager.log("Submit", "submit documents", task, getIdentity(), assessedIdentity, assessedGroup, courseEnv, gtaNode);
+		gtaManager.log("Submit", "submit documents", task,
+				getIdentity(), assessedIdentity, assessedGroup, courseEnv, gtaNode, Role.user);
 		
 		cleanUpProcess();
 		process(ureq);
@@ -762,7 +763,8 @@ public class GTAParticipantController extends GTAAbstractController implements A
 			boolean hasUploadDocuments = submitDocCtrl.hasUploadDocuments();
 			if(event instanceof SubmitEvent) {
 				Task assignedTask = submitDocCtrl.getAssignedTask();
-				gtaManager.log("Submit", (SubmitEvent)event, assignedTask, getIdentity(), assessedIdentity, assessedGroup, courseEnv, gtaNode);
+				gtaManager.log("Submit", (SubmitEvent)event, assignedTask,
+						getIdentity(), assessedIdentity, assessedGroup, courseEnv, gtaNode, Role.user);
 			} else if(event == Event.DONE_EVENT) {
 				cleanUpProcess();
 				process(ureq);
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTAParticipantRevisionAndCorrectionsController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTAParticipantRevisionAndCorrectionsController.java
index 66f9681d3480cacf5157dfffaeaa4772e11aefe8..92182a0245a09a86c3205edd7fde5cc341efbf19 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/GTAParticipantRevisionAndCorrectionsController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/GTAParticipantRevisionAndCorrectionsController.java
@@ -254,7 +254,8 @@ public class GTAParticipantRevisionAndCorrectionsController extends BasicControl
 		if(uploadRevisionsCtrl == source) {
 			if(event instanceof SubmitEvent) {
 				Task aTask = uploadRevisionsCtrl.getAssignedTask();
-				gtaManager.log("Revision", (SubmitEvent)event, aTask, getIdentity(), getIdentity(), assessedGroup, courseEnv, gtaNode);				
+				gtaManager.log("Revision", (SubmitEvent)event, aTask,
+						getIdentity(), getIdentity(), assessedGroup, courseEnv, gtaNode, Role.user);				
 			} else if(event == Event.DONE_EVENT) {
 				fireEvent(ureq, Event.DONE_EVENT);
 			}
@@ -328,7 +329,8 @@ public class GTAParticipantRevisionAndCorrectionsController extends BasicControl
 		
 		int numOfDocs = submittedDocuments == null ? 0 : submittedDocuments.length;
 		assignedTask = gtaManager.submitRevisions(assignedTask, gtaNode, numOfDocs, Role.user);
-		gtaManager.log("Revision", "revision submitted", assignedTask, getIdentity(), getIdentity(), assessedGroup, courseEnv, gtaNode);
+		gtaManager.log("Revision", "revision submitted", assignedTask,
+				getIdentity(), getIdentity(), assessedGroup, courseEnv, gtaNode, Role.user);
 		
 		TaskMultiUserEvent event = new TaskMultiUserEvent(TaskMultiUserEvent.SUBMIT_REVISION,
 				assessedGroup == null ? getIdentity() : null, assessedGroup, getIdentity());
diff --git a/src/main/java/org/olat/course/nodes/ta/DropboxController.java b/src/main/java/org/olat/course/nodes/ta/DropboxController.java
index c3b5aa366b33062c97ab84d4137f132a8f03d116..097ff1727798aee1a18257534fbdd7126bf85369 100644
--- a/src/main/java/org/olat/course/nodes/ta/DropboxController.java
+++ b/src/main/java/org/olat/course/nodes/ta/DropboxController.java
@@ -367,7 +367,7 @@ public class DropboxController extends BasicController {
 				
 		// log entry for this file
 		UserNodeAuditManager am = userCourseEnv.getCourseEnvironment().getAuditManager();
-		am.appendToUserNodeLog(node, identity, identity, "FILE UPLOADED: " + filename);
+		am.appendToUserNodeLog(node, identity, identity, "FILE UPLOADED: " + filename, null);
 
 		return VelocityHelper.getInstance().evaluateVTL(confirmation, c);
 	}
diff --git a/src/main/java/org/olat/course/nodes/ta/DropboxScoringViewController.java b/src/main/java/org/olat/course/nodes/ta/DropboxScoringViewController.java
index 1d8d6c9ec4532c228a66ee263ca83f3dde8429e1..8f802620a263de1b10e28d784840087beeea7457 100644
--- a/src/main/java/org/olat/course/nodes/ta/DropboxScoringViewController.java
+++ b/src/main/java/org/olat/course/nodes/ta/DropboxScoringViewController.java
@@ -282,7 +282,7 @@ public class DropboxScoringViewController extends BasicController {
 					// log entry for this file
 					Identity coach = ureq.getIdentity();
 					Identity student = userCourseEnv.getIdentityEnvironment().getIdentity();
-					am.appendToUserNodeLog(node, coach, student, "FILE DELETED: " + folderEvent.getFilename());
+					am.appendToUserNodeLog(node, coach, student, "FILE DELETED: " + folderEvent.getFilename(), null);
 				}
 			}
 		} else if (source == returnboxFolderRunController) {
@@ -304,7 +304,7 @@ public class DropboxScoringViewController extends BasicController {
 						}
 					}
 
-					am.appendToUserNodeLog(node, coach, student, "FILE UPLOADED: " + folderEvent.getFilename());
+					am.appendToUserNodeLog(node, coach, student, "FILE UPLOADED: " + folderEvent.getFilename(), null);
 					String toMail = UserManager.getInstance().getUserDisplayEmail(student, ureq.getLocale());
 					
 					OLATResourceable ores = OresHelper.createOLATResourceableInstance(CourseNode.class, Long.valueOf(node.getIdent()));
@@ -324,7 +324,7 @@ public class DropboxScoringViewController extends BasicController {
 					bundle.setContent(subject, body);
 					MailerResult result = CoreSpringFactory.getImpl(MailManager.class).sendMessage(bundle);
 					if(result.getReturnCode() > 0) {
-						am.appendToUserNodeLog(node, coach, student, "MAIL SEND FAILED TO:" + toMail + "; MailReturnCode: " + result.getReturnCode());
+						am.appendToUserNodeLog(node, coach, student, "MAIL SEND FAILED TO:" + toMail + "; MailReturnCode: " + result.getReturnCode(), null);
 						log.warn("Could not send email 'returnbox notification' to " + student + "with email=" + toMail);
 					} else {
 						log.info("Send email 'returnbox notification' to " + student + "with email=" + toMail);
diff --git a/src/main/java/org/olat/course/run/preview/PreviewAuditManager.java b/src/main/java/org/olat/course/run/preview/PreviewAuditManager.java
index 56f6b06bc6c1245591f4b29dac64ac15c861a348..f23f80bccf56554c271747c9011ed5cf89ec8c8c 100644
--- a/src/main/java/org/olat/course/run/preview/PreviewAuditManager.java
+++ b/src/main/java/org/olat/course/run/preview/PreviewAuditManager.java
@@ -29,6 +29,7 @@ import org.olat.core.id.Identity;
 import org.olat.course.auditing.UserNodeAuditManager;
 import org.olat.course.nodes.CourseNode;
 import org.olat.group.BusinessGroup;
+import org.olat.modules.assessment.Role;
 
 /**
  * Initial Date: 08.02.2005
@@ -37,19 +38,12 @@ import org.olat.group.BusinessGroup;
  */
 final class PreviewAuditManager implements UserNodeAuditManager {
 
-	/**
-	 * @see org.olat.course.auditing.AuditManager#hasUserNodeLogs(org.olat.course.nodes.CourseNode)
-	 */
 	@Override
 	public boolean hasUserNodeLogs(CourseNode node) {
 		// no logging in preview
 		return false;
 	}
 
-	/**
-	 * @see org.olat.course.auditing.AuditManager#getUserNodeLog(org.olat.course.nodes.CourseNode,
-	 *      org.olat.core.id.Identity)
-	 */
 	@Override
 	public String getUserNodeLog(CourseNode courseNode, Identity identity) {
 		// no logging in preview
@@ -62,18 +56,13 @@ final class PreviewAuditManager implements UserNodeAuditManager {
 		return null;
 	}
 
-	/**
-	 * @see org.olat.course.auditing.AuditManager#appendToUserNodeLog(org.olat.course.nodes.CourseNode,
-	 *      org.olat.core.id.Identity, org.olat.core.id.Identity,
-	 *      java.lang.String)
-	 */
 	@Override
-	public void appendToUserNodeLog(CourseNode courseNode, Identity identity, Identity assessedIdentity, String logText) {
+	public void appendToUserNodeLog(CourseNode courseNode, Identity identity, Identity assessedIdentity, String logText, Role by) {
 		// no logging in preview
 	}
 
 	@Override
-	public void appendToUserNodeLog(CourseNode courseNode, Identity identity, BusinessGroup assessedGroup, String logText) {
+	public void appendToUserNodeLog(CourseNode courseNode, Identity identity, BusinessGroup assessedGroup, String logText, Role by) {
 		// no logging in preview
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/upgrade/legacy/NewCachePersistingAssessmentManager.java b/src/main/java/org/olat/upgrade/legacy/NewCachePersistingAssessmentManager.java
index 7238da08f942dfb5a37da5494186cc17fa6b7920..a5eedd1916acca9d45adf1ac7a21d414ff766ad8 100644
--- a/src/main/java/org/olat/upgrade/legacy/NewCachePersistingAssessmentManager.java
+++ b/src/main/java/org/olat/upgrade/legacy/NewCachePersistingAssessmentManager.java
@@ -443,7 +443,7 @@ public class NewCachePersistingAssessmentManager {
 
 		// node log
 		UserNodeAuditManager am = course.getCourseEnvironment().getAuditManager();
-		am.appendToUserNodeLog(courseNode, identity, assessedIdentity, ATTEMPTS + " set to: " + String.valueOf(attempts));
+		am.appendToUserNodeLog(courseNode, identity, assessedIdentity, ATTEMPTS + " set to: " + String.valueOf(attempts), null);
 
 		// notify about changes
 		AssessmentChangedEvent ace = new AssessmentChangedEvent(AssessmentChangedEvent.TYPE_ATTEMPTS_CHANGED, assessedIdentity);
@@ -512,7 +512,7 @@ public class NewCachePersistingAssessmentManager {
 		});
 		// node log
 		UserNodeAuditManager am = course.getCourseEnvironment().getAuditManager();
-		am.appendToUserNodeLog(courseNode, identity, assessedIdentity, COMMENT + " set to: " + comment);
+		am.appendToUserNodeLog(courseNode, identity, assessedIdentity, COMMENT + " set to: " + comment, null);
 
 		// notify about changes
 		AssessmentChangedEvent ace = new AssessmentChangedEvent(AssessmentChangedEvent.TYPE_USER_COMMENT_CHANGED, assessedIdentity);
@@ -901,14 +901,14 @@ public class NewCachePersistingAssessmentManager {
 		
 		// node log
 		UserNodeAuditManager am = course.getCourseEnvironment().getAuditManager();
-		am.appendToUserNodeLog(courseNode, identity, assessedIdentity, SCORE + " set to: " + String.valueOf(scoreEvaluation.getScore()));
+		am.appendToUserNodeLog(courseNode, identity, assessedIdentity, SCORE + " set to: " + String.valueOf(scoreEvaluation.getScore()), null);
 		if(scoreEvaluation.getPassed()!=null) {
-		  am.appendToUserNodeLog(courseNode, identity, assessedIdentity, PASSED + " set to: " + scoreEvaluation.getPassed().toString());
+		  am.appendToUserNodeLog(courseNode, identity, assessedIdentity, PASSED + " set to: " + scoreEvaluation.getPassed().toString(), null);
 		} else {
-			 am.appendToUserNodeLog(courseNode, identity, assessedIdentity, PASSED + " set to \"undefined\"");
+			 am.appendToUserNodeLog(courseNode, identity, assessedIdentity, PASSED + " set to \"undefined\"", null);
 		}
 		if(scoreEvaluation.getAssessmentID()!=null) {
-			am.appendToUserNodeLog(courseNode, assessedIdentity, assessedIdentity, ASSESSMENT_ID + " set to: " + scoreEvaluation.getAssessmentID().toString());
+			am.appendToUserNodeLog(courseNode, assessedIdentity, assessedIdentity, ASSESSMENT_ID + " set to: " + scoreEvaluation.getAssessmentID().toString(), null);
 		}		
 
 		// notify about changes