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 0241757504fcbbb8ba9b3d2065f757095f6b880e..6eaef96a4c5b0b90f108a1cec77c5d3b7c78fe6a 100644
--- a/src/main/java/org/olat/course/nodes/gta/GTAManager.java
+++ b/src/main/java/org/olat/course/nodes/gta/GTAManager.java
@@ -130,7 +130,6 @@ public interface GTAManager {
 	
 	public void removeSolution(Solution removedSolution, CourseEnvironment courseEnv, GTACourseNode cNode);
 	
-	
 	/**
 	 * Create a subscription context.
 	 * @param courseEnv The course environment
@@ -327,7 +326,7 @@ public interface GTAManager {
 	
 	public TaskProcess nextStep(TaskProcess currentStep, GTACourseNode cNode);
 
-	public Task collectTask(Task task, GTACourseNode cNode);
+	public Task collectTask(Task task, GTACourseNode cNode, int numOfDocs);
 	
 	/**
 	 * Task is reviewed and accepted.
@@ -341,9 +340,9 @@ public interface GTAManager {
 	
 	public TaskDueDate updateTaskDueDate(TaskDueDate taskDueDate);
 	
-	public Task submitTask(Task task, GTACourseNode cNode);
+	public Task submitTask(Task task, GTACourseNode cNode, int numOfDocs);
 	
-	public Task submitRevisions(Task task, GTACourseNode cNode);
+	public Task submitRevisions(Task task, GTACourseNode cNode, int numOfDocs);
 	
 	public Task updateTask(Task task, TaskProcess newStatus, int iteration, GTACourseNode cNode);
 	
diff --git a/src/main/java/org/olat/course/nodes/gta/TaskLight.java b/src/main/java/org/olat/course/nodes/gta/TaskLight.java
index 2661333fa324c9e2c1dfa54feae6fd8ad3c929a9..dbd0c94e656c877c630da6976416502d08095d44 100644
--- a/src/main/java/org/olat/course/nodes/gta/TaskLight.java
+++ b/src/main/java/org/olat/course/nodes/gta/TaskLight.java
@@ -49,10 +49,16 @@ public interface TaskLight extends TaskRef {
 	
 	public Date getSubmissionDate();
 	
+	public Integer getSubmissionNumOfDocs();
+	
 	public Date getSubmissionRevisionsDate();
 	
+	public Integer getSubmissionRevisionsNumOfDocs();
+	
 	public Date getCollectionDate();
 	
+	public Integer getCollectionNumOfDocs();
+	
 	public Long getIdentityKey();
 	
 	public Long getBusinessGroupKey();
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 d19b9cdab4bfd465766c7d30956dca1a2333ae8f..2f6bda7f5bc1924c50af68ccf8d115282c0b39cc 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
@@ -1423,18 +1423,20 @@ public class GTAManagerImpl implements GTAManager, DeletableGroupData {
 	}
 
 	@Override
-	public Task collectTask(Task task, GTACourseNode cNode) {
+	public Task collectTask(Task task, GTACourseNode cNode, int numOfDocs) {
 		TaskProcess review = nextStep(TaskProcess.submit, cNode);
 		TaskImpl taskImpl = (TaskImpl)task;
 		taskImpl.setCollectionDate(new Date());
+		taskImpl.setCollectionNumOfDocs(numOfDocs);
 		return updateTask(task, review, cNode);
 	}
 
 	@Override
-	public Task submitTask(Task task, GTACourseNode cNode) {
+	public Task submitTask(Task task, GTACourseNode cNode, int numOfDocs) {
 		TaskProcess review = nextStep(TaskProcess.submit, cNode);
 		TaskImpl taskImpl = (TaskImpl)task;
 		taskImpl.setSubmissionDate(new Date());
+		taskImpl.setSubmissionNumOfDocs(numOfDocs);
 		return updateTask(task, review, cNode);
 	}
 
@@ -1474,9 +1476,10 @@ public class GTAManagerImpl implements GTAManager, DeletableGroupData {
 	}
 
 	@Override
-	public Task submitRevisions(Task task, GTACourseNode cNode) {
+	public Task submitRevisions(Task task, GTACourseNode cNode, int numOfDocs) {
 		TaskImpl taskImpl = (TaskImpl)task;
 		taskImpl.setSubmissionRevisionsDate(new Date());
+		taskImpl.setSubmissionRevisionsNumOfDocs(numOfDocs);
 		//log the date
 		createAndPersistTaskRevisionDate(taskImpl, taskImpl.getRevisionLoop(), TaskProcess.correction);
 		return updateTask(taskImpl, TaskProcess.correction, cNode);
@@ -1524,10 +1527,11 @@ public class GTAManagerImpl implements GTAManager, DeletableGroupData {
 			taskImpl.setGraduationDate(null);
 		}
 		
-		//check submission date because of repon
+		//check submission date because of reopen
 		if(newStatus == TaskProcess.assignment || newStatus == TaskProcess.submit) {
 			if(taskImpl.getSubmissionDate() != null) {
 				taskImpl.setSubmissionDate(null);
+				taskImpl.setSubmissionNumOfDocs(null);
 			}
 		}
 	}
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 132d662ed733d1c3a2871d4578d553b3a170ea04..3c9aa299ca52457fe0695e547c781a28cd138565 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
@@ -42,6 +42,7 @@ import org.olat.core.util.Formatter;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
 import org.olat.core.util.io.SystemFileFilter;
+import org.olat.core.util.io.SystemFilenameFilter;
 import org.olat.core.util.vfs.VFSContainer;
 import org.olat.core.util.vfs.VFSItem;
 import org.olat.course.CourseFactory;
@@ -653,13 +654,27 @@ class GTANotifications {
 			RepositoryEntry re = courseEnv.getCourseGroupManager().getCourseEntry();
 			DueDate dueDate = gtaManager.getSubmissionDueDate(task, assessedIdentity, assessedGroup, gtaNode, re, true);
 			if(dueDate != null && dueDate.getDueDate() != null && dueDate.getDueDate().before(new Date())) {
-				task = gtaManager.nextStep(task, gtaNode);
+				int numOfDocs = getNumberOfSubmittedDocuments(assessedIdentity, assessedGroup);
+				task = gtaManager.submitTask(task, gtaNode, numOfDocs);
 				doUpdateAttempts(assessedIdentity, assessedGroup);
 			}
 		}
 		return task;
 	}
 	
+	private int getNumberOfSubmittedDocuments(Identity assessedIdentity, BusinessGroup assessedGroup) {
+		File[] submittedDocuments;
+		if(GTAType.group.name().equals(gtaNode.getModuleConfiguration().getStringValue(GTACourseNode.GTASK_TYPE))) {
+			File documentsDir = gtaManager.getSubmitDirectory(courseEnv, gtaNode, assessedGroup);
+			submittedDocuments = documentsDir.listFiles(new SystemFilenameFilter(true, false));
+
+		} else {
+			File documentsDir = gtaManager.getSubmitDirectory(courseEnv, gtaNode, assessedIdentity);
+			submittedDocuments = documentsDir.listFiles(new SystemFilenameFilter(true, false));
+		}
+		return submittedDocuments == null ? 0 : submittedDocuments.length;
+	}
+	
 	private boolean checkRevisionLoop(TaskProcess status, int revisionLoop,  List<TaskRevisionDate> taskRevisions) {
 		for(TaskRevisionDate taskRevision:taskRevisions) {
 			if(taskRevision.getTaskStatus() == status && taskRevision.getRevisionLoop() == revisionLoop) {
diff --git a/src/main/java/org/olat/course/nodes/gta/model/TaskImpl.java b/src/main/java/org/olat/course/nodes/gta/model/TaskImpl.java
index 0f9c1ee1e6ef30aa41a007ee0acad103ee115da6..e4fe25928042a896a20f7a92740601cae94cf588 100644
--- a/src/main/java/org/olat/course/nodes/gta/model/TaskImpl.java
+++ b/src/main/java/org/olat/course/nodes/gta/model/TaskImpl.java
@@ -1,4 +1,5 @@
 /**
+
  * <a href="http://www.openolat.org">
  * OpenOLAT - Online Learning and Training</a><br>
  * <p>
@@ -93,12 +94,19 @@ public class TaskImpl implements Task, CreateInfo, Persistable, ModifiedInfo {
 	@Temporal(TemporalType.TIMESTAMP)
 	@Column(name="g_submission_date", nullable=true, insertable=true, updatable=true)
 	private Date submissionDate;
+	@Column(name="g_submission_ndocs", nullable=true, insertable=true, updatable=true)
+	private Integer submissionNumOfDocs;
 	@Temporal(TemporalType.TIMESTAMP)
 	@Column(name="g_submission_revisions_date", nullable=true, insertable=true, updatable=true)
 	private Date submissionRevisionsDate;
+	@Column(name="g_submission_revisions_ndocs", nullable=true, insertable=true, updatable=true)
+	private Integer submissionRevisionsNumOfDocs;
 	@Temporal(TemporalType.TIMESTAMP)
 	@Column(name="g_collection_date", nullable=true, insertable=true, updatable=true)
 	private Date collectionDate;
+	@Column(name="g_collection_ndocs", nullable=true, insertable=true, updatable=true)
+	private Integer collectionNumOfDocs;
+	
 	@Temporal(TemporalType.TIMESTAMP)
 	@Column(name="g_allow_reset_date", nullable=true, insertable=true, updatable=true)
 	private Date allowResetDate;
@@ -228,6 +236,14 @@ public class TaskImpl implements Task, CreateInfo, Persistable, ModifiedInfo {
 		this.submissionDate = submissionDate;
 	}
 
+	public Integer getSubmissionNumOfDocs() {
+		return submissionNumOfDocs;
+	}
+
+	public void setSubmissionNumOfDocs(Integer submissionNumOfDocs) {
+		this.submissionNumOfDocs = submissionNumOfDocs;
+	}
+
 	@Override
 	public Date getSubmissionRevisionsDate() {
 		return submissionRevisionsDate;
@@ -237,6 +253,14 @@ public class TaskImpl implements Task, CreateInfo, Persistable, ModifiedInfo {
 		this.submissionRevisionsDate = submissionRevisionsDate;
 	}
 
+	public Integer getSubmissionRevisionsNumOfDocs() {
+		return submissionRevisionsNumOfDocs;
+	}
+
+	public void setSubmissionRevisionsNumOfDocs(Integer submissionRevisionsNumOfDocs) {
+		this.submissionRevisionsNumOfDocs = submissionRevisionsNumOfDocs;
+	}
+
 	@Override
 	public Date getCollectionDate() {
 		return collectionDate;
@@ -246,6 +270,14 @@ public class TaskImpl implements Task, CreateInfo, Persistable, ModifiedInfo {
 		this.collectionDate = collectionDate;
 	}
 
+	public Integer getCollectionNumOfDocs() {
+		return collectionNumOfDocs;
+	}
+
+	public void setCollectionNumOfDocs(Integer collectionNumOfDocs) {
+		this.collectionNumOfDocs = collectionNumOfDocs;
+	}
+
 	@Override
 	public Date getAllowResetDate() {
 		return allowResetDate;
diff --git a/src/main/java/org/olat/course/nodes/gta/model/TaskLightImpl.java b/src/main/java/org/olat/course/nodes/gta/model/TaskLightImpl.java
index b2e425dc892ea1507973fb92aae07f5e7d7001fa..8757c264f97c321765353093b587cddb8df491c0 100644
--- a/src/main/java/org/olat/course/nodes/gta/model/TaskLightImpl.java
+++ b/src/main/java/org/olat/course/nodes/gta/model/TaskLightImpl.java
@@ -81,12 +81,18 @@ public class TaskLightImpl implements TaskLight, CreateInfo, Persistable, Modifi
 	@Temporal(TemporalType.TIMESTAMP)
 	@Column(name="g_submission_date", nullable=true, insertable=true, updatable=true)
 	private Date submissionDate;
+	@Column(name="g_submission_ndocs", nullable=true, insertable=true, updatable=true)
+	private Integer submissionNumOfDocs;
 	@Temporal(TemporalType.TIMESTAMP)
 	@Column(name="g_submission_revisions_date", nullable=true, insertable=true, updatable=true)
 	private Date submissionRevisionsDate;
+	@Column(name="g_submission_revisions_ndocs", nullable=true, insertable=true, updatable=true)
+	private Integer submissionRevisionsNumOfDocs;
 	@Temporal(TemporalType.TIMESTAMP)
 	@Column(name="g_collection_date", nullable=true, insertable=true, updatable=true)
 	private Date collectionDate;
+	@Column(name="g_collection_ndocs", nullable=true, insertable=true, updatable=true)
+	private Integer collectionNumOfDocs;
 	
 	@Temporal(TemporalType.TIMESTAMP)
 	@Column(name="g_assignment_due_date", nullable=true, insertable=true, updatable=false)
@@ -205,6 +211,15 @@ public class TaskLightImpl implements TaskLight, CreateInfo, Persistable, Modifi
 		this.submissionDate = submissionDate;
 	}
 	
+	@Override
+	public Integer getSubmissionNumOfDocs() {
+		return submissionNumOfDocs;
+	}
+
+	public void setSubmissionNumOfDocs(Integer submissionNumOfDocs) {
+		this.submissionNumOfDocs = submissionNumOfDocs;
+	}
+
 	@Override
 	public Date getSubmissionRevisionsDate() {
 		return submissionRevisionsDate;
@@ -213,6 +228,15 @@ public class TaskLightImpl implements TaskLight, CreateInfo, Persistable, Modifi
 	public void setSubmissionRevisionsDate(Date submissionRevisionsDate) {
 		this.submissionRevisionsDate = submissionRevisionsDate;
 	}
+	
+	@Override
+	public Integer getSubmissionRevisionsNumOfDocs() {
+		return submissionRevisionsNumOfDocs;
+	}
+
+	public void setSubmissionRevisionsNumOfDocs(Integer submissionRevisionsNumOfDocs) {
+		this.submissionRevisionsNumOfDocs = submissionRevisionsNumOfDocs;
+	}
 
 	@Override
 	public Date getCollectionDate() {
@@ -222,6 +246,15 @@ public class TaskLightImpl implements TaskLight, CreateInfo, Persistable, Modifi
 	public void setCollectionDate(Date collectionDate) {
 		this.collectionDate = collectionDate;
 	}
+	
+	@Override
+	public Integer getCollectionNumOfDocs() {
+		return collectionNumOfDocs;
+	}
+
+	public void setCollectionNumOfDocs(Integer collectionNumOfDocs) {
+		this.collectionNumOfDocs = collectionNumOfDocs;
+	}
 
 	@Override
 	public Date getAssignmentDueDate() {
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/CoachedElementRow.java b/src/main/java/org/olat/course/nodes/gta/ui/CoachedElementRow.java
index bc2d28ebda237447c2a560f4eea0f8f7542a5a7c..6eb3de2b6c706c397e4d634c3da0ee4a38173dac 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/CoachedElementRow.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/CoachedElementRow.java
@@ -37,17 +37,21 @@ public interface CoachedElementRow {
 	
 	public TaskProcess getTaskStatus();
 	
-	public Date getSubmissionDate();
-	
 	/**
 	 * @return Date only if there is a due date and the task is not submitted.
 	 */
 	public Date getSubmissionDueDate();
 	
+	public Date getSubmissionDate();
+
 	public Date getSubmissionRevisionsDate();
 	
 	public Date getCollectionDate();
 	
+	public Date getSyntheticSubmissionDate();
+	
+	public boolean getHasSubmittedDocuments();
+
 	public TaskLight getTask();
 
 }
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/CoachedGroupRow.java b/src/main/java/org/olat/course/nodes/gta/ui/CoachedGroupRow.java
index 8551d1dfa4212a0ff568c272b8ad29bd4d0a974e..bb7a58da910730edbcd1039cea812e8aa84279d0 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/CoachedGroupRow.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/CoachedGroupRow.java
@@ -35,12 +35,17 @@ public class CoachedGroupRow implements CoachedElementRow {
 	
 	private final TaskLight task;
 	private final Date submissionDueDate;
+	private final Date syntheticSubmissionDate;
+	private final boolean hasSubmittedDocuments;
 	private final BusinessGroup businessGroup;
 	
-	public CoachedGroupRow(BusinessGroup businessGroup, TaskLight task, Date submissionDueDate) {
+	public CoachedGroupRow(BusinessGroup businessGroup, TaskLight task, Date submissionDueDate,
+			Date syntheticSubmissionDate, boolean hasSubmittedDocuments) {
 		this.task = task;
 		this.businessGroup = businessGroup;
 		this.submissionDueDate = submissionDueDate;
+		this.hasSubmittedDocuments = hasSubmittedDocuments;
+		this.syntheticSubmissionDate = syntheticSubmissionDate;
 	}
 	
 	public String getName() {
@@ -77,6 +82,16 @@ public class CoachedGroupRow implements CoachedElementRow {
 		return task == null ? null : task.getCollectionDate();
 	}
 
+	@Override
+	public Date getSyntheticSubmissionDate() {
+		return syntheticSubmissionDate;
+	}
+
+	@Override
+	public boolean getHasSubmittedDocuments() {
+		return hasSubmittedDocuments;
+	}
+
 	@Override
 	public TaskLight getTask() {
 		return task;
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/CoachedIdentityRow.java b/src/main/java/org/olat/course/nodes/gta/ui/CoachedIdentityRow.java
index 70feb8a98aa63f0f0fbc26413a234045e67991d6..5d8cea03f80f53fec68a994082c92018d9ada9ec 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/CoachedIdentityRow.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/CoachedIdentityRow.java
@@ -35,12 +35,17 @@ public class CoachedIdentityRow implements CoachedElementRow {
 
 	private final TaskLight task;
 	private final Date submissionDueDate;
+	private final Date syntheticSubmissionDate;
+	private final boolean hasSubmittedDocuments;
 	private final UserPropertiesRow identity;
 	
-	public CoachedIdentityRow(UserPropertiesRow identity, TaskLight task, Date submissionDueDate) {
+	public CoachedIdentityRow(UserPropertiesRow identity, TaskLight task, Date submissionDueDate,
+			Date syntheticSubmissionDate, boolean hasSubmittedDocuments) {
 		this.identity = identity;
 		this.task = task;
 		this.submissionDueDate = submissionDueDate;
+		this.hasSubmittedDocuments = hasSubmittedDocuments;
+		this.syntheticSubmissionDate = syntheticSubmissionDate;
 	}
 
 	@Override
@@ -72,6 +77,16 @@ public class CoachedIdentityRow implements CoachedElementRow {
 	public Date getCollectionDate() {
 		return task == null ? null : task.getCollectionDate();
 	}
+
+	@Override
+	public Date getSyntheticSubmissionDate() {
+		return syntheticSubmissionDate;
+	}
+
+	@Override
+	public boolean getHasSubmittedDocuments() {
+		return hasSubmittedDocuments;
+	}
 	
 	@Override
 	public TaskLight getTask() {
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTAAbstractController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTAAbstractController.java
index a58ec486c55fc11ed6ca06768588ad751d30c714..6292c77222707433ca160a100dff98e918f7ade5 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/GTAAbstractController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/GTAAbstractController.java
@@ -19,6 +19,7 @@
  */
 package org.olat.course.nodes.gta.ui;
 
+import java.io.File;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
@@ -39,6 +40,7 @@ import org.olat.core.util.Formatter;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.coordinate.CoordinatorManager;
 import org.olat.core.util.event.GenericEventListener;
+import org.olat.core.util.io.SystemFilenameFilter;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.course.CourseFactory;
 import org.olat.course.CourseModule;
@@ -360,7 +362,8 @@ public abstract class GTAAbstractController extends BasicController implements G
 				if(assignedTask != null && assignedTask.getTaskStatus() == TaskProcess.submit
 						&& date.compareTo(new Date()) < 0) {
 					//push to the next step
-					assignedTask = gtaManager.nextStep(assignedTask, gtaNode);
+					int numOfDocs = getNumberOfSubmittedDocuments();
+					assignedTask = gtaManager.submitTask(assignedTask, gtaNode, numOfDocs);
 					doUpdateAttempts();
 				}
 			} else if(dueDate.getMessageKey() != null) {
@@ -379,6 +382,19 @@ public abstract class GTAAbstractController extends BasicController implements G
 		return submissionDueDate;
 	}
 	
+	protected int getNumberOfSubmittedDocuments() {
+		File[] submittedDocuments;
+		if(GTAType.group.name().equals(config.getStringValue(GTACourseNode.GTASK_TYPE))) {
+			File documentsDir = gtaManager.getSubmitDirectory(courseEnv, gtaNode, assessedGroup);
+			submittedDocuments = documentsDir.listFiles(new SystemFilenameFilter(true, false));
+
+		} else {
+			File documentsDir = gtaManager.getSubmitDirectory(courseEnv, gtaNode, assessedIdentity);
+			submittedDocuments = documentsDir.listFiles(new SystemFilenameFilter(true, false));
+		}
+		return submittedDocuments == null ? 0 : submittedDocuments.length;
+	}
+	
 	protected Task stepReviewAndCorrection(@SuppressWarnings("unused")UserRequest ureq, Task assignedTask) {
 		return assignedTask;
 	}
@@ -391,13 +407,27 @@ public abstract class GTAAbstractController extends BasicController implements G
 			if(assignedTask != null && assignedTask.getTaskStatus() == TaskProcess.revision
 					&& date.compareTo(new Date()) < 0) {
 				//push to the next step
-				assignedTask = gtaManager.nextStep(assignedTask, gtaNode);
+				int numOfDocs = getNumberOfRevisionDocuments(assignedTask);
+				assignedTask = gtaManager.submitRevisions(assignedTask, gtaNode, numOfDocs);
 				doUpdateAttempts();
 			}
 		}
 		return assignedTask;
 	}
 	
+	protected int getNumberOfRevisionDocuments(Task assignedTask) {
+		File[] submittedDocuments;
+		int iteration = assignedTask.getRevisionLoop();
+		if(GTAType.group.name().equals(gtaNode.getModuleConfiguration().getStringValue(GTACourseNode.GTASK_TYPE))) {
+			File documentsDir = gtaManager.getRevisedDocumentsDirectory(courseEnv, gtaNode, iteration, assessedGroup);
+			submittedDocuments = documentsDir.listFiles(new SystemFilenameFilter(true, false));
+		} else {
+			File documentsDir = gtaManager.getRevisedDocumentsDirectory(courseEnv, gtaNode, iteration, assessedIdentity);
+			submittedDocuments = documentsDir.listFiles(new SystemFilenameFilter(true, false));
+		}
+		return submittedDocuments == null ? 0 : submittedDocuments.length;
+	}
+	
 	protected Task stepSolution(@SuppressWarnings("unused")UserRequest ureq, Task assignedTask) {
 		DueDate availableDate = getSolutionDueDate(assignedTask);
 		if(availableDate != null) {
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 bdc3bc1f7f37a2a73f3b38e998eec3374617780e..3d610f840454eb462a46e1730dcc173ce047f9d1 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
@@ -715,7 +715,17 @@ public class GTACoachController extends GTAAbstractController implements Assessm
 	}
 	
 	private void doCollectTask(UserRequest ureq, Task task) {
-		task = gtaManager.collectTask(task, gtaNode);
+		File[] submittedDocuments;
+		if(GTAType.group.name().equals(config.getStringValue(GTACourseNode.GTASK_TYPE))) {
+			File documentsDir = gtaManager.getSubmitDirectory(courseEnv, gtaNode, assessedGroup);
+			submittedDocuments = documentsDir.listFiles(new SystemFilenameFilter(true, false));
+		} else {
+			File documentsDir = gtaManager.getSubmitDirectory(courseEnv, gtaNode, getIdentity());
+			submittedDocuments = documentsDir.listFiles(new SystemFilenameFilter(true, false));
+		}
+		
+		int numOfDocs = submittedDocuments == null ? 0 : submittedDocuments.length;
+		task = gtaManager.collectTask(task, gtaNode, numOfDocs);
 		showInfo("run.documents.successfully.submitted");
 		
 		TaskMultiUserEvent event = new TaskMultiUserEvent(TaskMultiUserEvent.SUMBIT_TASK,
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTACoachedGroupListController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTACoachedGroupListController.java
index dd1d2d2781ec410ea1df3d1f792231b1c65efc07..057eff33801b587f4b764029dde7c48e70790785 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/GTACoachedGroupListController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/GTACoachedGroupListController.java
@@ -149,7 +149,16 @@ public class GTACoachedGroupListController extends GTACoachedListController {
 					submissionDueDate = dueDate.getDueDate();
 				}
 			}
-			rows.add(new CoachedGroupRow(group, task, submissionDueDate));
+
+			Date syntheticSubmissionDate = null;
+			boolean hasSubmittedDocument = false;
+			if(task != null && task.getTaskStatus() != null && task.getTaskStatus() != TaskProcess.assignment && task.getTaskStatus() != TaskProcess.submit) {
+				syntheticSubmissionDate = getSyntheticSubmissionDate(task);
+				if(syntheticSubmissionDate != null) {
+					hasSubmittedDocument = this.hasSubmittedDocument(task);
+				}
+			}
+			rows.add(new CoachedGroupRow(group, task, submissionDueDate, syntheticSubmissionDate, hasSubmittedDocument));
 		}
 		
 		tableModel.setObjects(rows);
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTACoachedListController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTACoachedListController.java
index e28e6a4fabd9f76139086ba2922266475957abfa..eedf6fc861738c05d3747213de8ee0dae5042390 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/GTACoachedListController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/GTACoachedListController.java
@@ -19,6 +19,8 @@
  */
 package org.olat.course.nodes.gta.ui;
 
+import java.util.Date;
+
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.form.flexible.FormItemContainer;
 import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
@@ -26,6 +28,7 @@ import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.course.nodes.GTACourseNode;
+import org.olat.course.nodes.gta.TaskLight;
 import org.olat.course.run.environment.CourseEnvironment;
 import org.olat.modules.ModuleConfiguration;
 
@@ -73,4 +76,28 @@ public abstract class GTACoachedListController extends FormBasicController {
 			layoutCont.contextPut("gradingEnabled", grading);
 		}
 	}
+	
+	protected Date getSyntheticSubmissionDate(TaskLight task) {
+		Date date = task.getSubmissionDate();
+		if(date == null || (task.getSubmissionRevisionsDate() != null && task.getSubmissionRevisionsDate().after(date))) {
+			date = task.getSubmissionRevisionsDate();
+		}
+		if(date == null || (task.getCollectionDate() != null && task.getCollectionDate().after(date))) {
+			date = task.getCollectionDate();
+		}
+		return date;
+	}
+	
+	public boolean hasSubmittedDocument(TaskLight task) {
+		Integer numOfDocs = task.getSubmissionNumOfDocs();
+		Date date = task.getSubmissionDate();
+		if(date == null || (task.getSubmissionRevisionsDate() != null && task.getSubmissionRevisionsDate().after(date))) {
+			date = task.getSubmissionRevisionsDate();
+			numOfDocs = task.getSubmissionRevisionsNumOfDocs();
+		}
+		if(date == null || (task.getCollectionDate() != null && task.getCollectionDate().after(date))) {
+			numOfDocs = task.getCollectionNumOfDocs();
+		}
+		return numOfDocs == null ? false : numOfDocs.intValue() > 0;
+	}
 }
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTACoachedParticipantListController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTACoachedParticipantListController.java
index 38e46c283d5fe12661c1f67cda07cc16865378d0..87679c878156eab968943f413609bb152012a49f 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/GTACoachedParticipantListController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/GTACoachedParticipantListController.java
@@ -250,8 +250,17 @@ public class GTACoachedParticipantListController extends GTACoachedListControlle
 				if(dueDate != null) {
 					submissionDueDate = dueDate.getDueDate();
 				}
+			} 
+
+			Date syntheticSubmissionDate = null;
+			boolean hasSubmittedDocument = false;
+			if(task != null && task.getTaskStatus() != null && task.getTaskStatus() != TaskProcess.assignment && task.getTaskStatus() != TaskProcess.submit) {
+				syntheticSubmissionDate = getSyntheticSubmissionDate(task);
+				if(syntheticSubmissionDate != null) {
+					hasSubmittedDocument = hasSubmittedDocument(task);
+				}
 			}
-			rows.add(new CoachedIdentityRow(assessableIdentity, task, submissionDueDate));
+			rows.add(new CoachedIdentityRow(assessableIdentity, task, submissionDueDate, syntheticSubmissionDate, hasSubmittedDocument));
 		}
 		
 		tableModel.setObjects(rows);
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 c0df9e3180535dc9ac5d6e06e858ed30f554c2b2..0ff8d3bfe51436497b18f9533809952ca57d77da 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
@@ -339,7 +339,8 @@ public class GTAParticipantController extends GTAAbstractController implements A
 	}
 	
 	private void doSubmitDocuments(UserRequest ureq, Task task) {
-		task = gtaManager.submitTask(task, gtaNode);
+		int numOfDocs = getNumberOfSubmittedDocuments();
+		task = gtaManager.submitTask(task, gtaNode, numOfDocs);
 		showInfo("run.documents.successfully.submitted");
 		
 		TaskMultiUserEvent event = new TaskMultiUserEvent(TaskMultiUserEvent.SUMBIT_TASK,
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 e191342351d6702777aee0844f80772371b8a880..82b213f79af11a7d6f03bcb32c11db58c24201b6 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
@@ -312,7 +312,18 @@ public class GTAParticipantRevisionAndCorrectionsController extends BasicControl
 	}
 	
 	private void doSubmitRevisions() {
-		assignedTask = gtaManager.submitRevisions(assignedTask, gtaNode);
+		File[] submittedDocuments;
+		int iteration = assignedTask.getRevisionLoop();
+		if(GTAType.group.name().equals(gtaNode.getModuleConfiguration().getStringValue(GTACourseNode.GTASK_TYPE))) {
+			File documentsDir = gtaManager.getRevisedDocumentsDirectory(courseEnv, gtaNode, iteration, assessedGroup);
+			submittedDocuments = documentsDir.listFiles(new SystemFilenameFilter(true, false));
+		} else {
+			File documentsDir = gtaManager.getRevisedDocumentsDirectory(courseEnv, gtaNode, iteration, getIdentity());
+			submittedDocuments = documentsDir.listFiles(new SystemFilenameFilter(true, false));
+		}
+		
+		int numOfDocs = submittedDocuments == null ? 0 : submittedDocuments.length;
+		assignedTask = gtaManager.submitRevisions(assignedTask, gtaNode, numOfDocs);
 		gtaManager.log("Revision", "revision submitted", assignedTask, getIdentity(), getIdentity(), assessedGroup, courseEnv, gtaNode);
 		
 		TaskMultiUserEvent event = new TaskMultiUserEvent(TaskMultiUserEvent.SUBMIT_REVISION,
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/component/SubmissionDateCellRenderer.java b/src/main/java/org/olat/course/nodes/gta/ui/component/SubmissionDateCellRenderer.java
index 3d498b6cd8bd2b8d39a009a2c62feb6f98650423..4fa9042b5ffd02fafeb404a722c657ac68f67e43 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/component/SubmissionDateCellRenderer.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/component/SubmissionDateCellRenderer.java
@@ -55,15 +55,16 @@ public class SubmissionDateCellRenderer implements FlexiCellRenderer {
 		if(object instanceof CoachedElementRow) {
 			CoachedElementRow ciRow = (CoachedElementRow)object;
 			TaskProcess status = ciRow.getTaskStatus();
-			if(status == null || status == TaskProcess.assignment) {
-				Date dueDate = ciRow.getSubmissionDueDate();
-				if(dueDate != null && dueDate.before(new Date())) {
-					target.append(translator.translate("no.submission"));
-				}
-			} else {
-				Date date = cascading(ciRow);
+			if(status == null || status == TaskProcess.assignment || status == TaskProcess.submit) {
+				//do nothing
+			} else  {
+				Date date = ciRow.getSyntheticSubmissionDate();
 				if(date != null) {
-					target.append(formatter.formatDate(date));
+					if(ciRow.getHasSubmittedDocuments()) {
+						target.append(formatter.formatDate(date));
+					} else {
+						target.append(translator.translate("no.submission"));
+					}
 				}
 			}
 		}
diff --git a/src/main/resources/database/mysql/alter_11_5_x_to_12_0_0.sql b/src/main/resources/database/mysql/alter_11_5_x_to_12_0_0.sql
index e602d69a65b82b0926b18be3991119c82919a022..1cbc01a36778b603419ba6715a07bbea0e0f5dbe 100644
--- a/src/main/resources/database/mysql/alter_11_5_x_to_12_0_0.sql
+++ b/src/main/resources/database/mysql/alter_11_5_x_to_12_0_0.sql
@@ -229,6 +229,10 @@ alter table o_gta_task add column g_acceptation_date datetime default null;
 alter table o_gta_task add column g_solution_date datetime default null;
 alter table o_gta_task add column g_graduation_date datetime default null;
 
+alter table o_gta_task add column g_submission_ndocs bigint default null;
+alter table o_gta_task add column g_submission_revisions_ndocs bigint default null;
+alter table o_gta_task add column g_collection_ndocs bigint default null;
+
 create table o_gta_task_revision_date (
   id bigint not null auto_increment,
   creationdate datetime not null,
diff --git a/src/main/resources/database/mysql/setupDatabase.sql b/src/main/resources/database/mysql/setupDatabase.sql
index d48bb6c9ac62fdb606176e64c3becf1c312335e3..4b21ab2d9dfcd27c0cbd4416209151e4320eb468 100644
--- a/src/main/resources/database/mysql/setupDatabase.sql
+++ b/src/main/resources/database/mysql/setupDatabase.sql
@@ -1857,8 +1857,11 @@ create table o_gta_task (
    g_rev_loop mediumint not null default 0,
    g_assignment_date datetime,
    g_submission_date datetime,
+   g_submission_ndocs bigint,
    g_submission_revisions_date datetime,
+   g_submission_revisions_ndocs bigint,
    g_collection_date datetime,
+   g_collection_ndocs bigint,
    g_acceptation_date datetime,
    g_solution_date datetime,
    g_graduation_date datetime,
diff --git a/src/main/resources/database/oracle/alter_11_5_x_to_12_0_0.sql b/src/main/resources/database/oracle/alter_11_5_x_to_12_0_0.sql
index 135895b75683adbcff3beebe3381a0cf6c15c4aa..895acf581f141aed088961a2c4d67f6ebd68ac4c 100644
--- a/src/main/resources/database/oracle/alter_11_5_x_to_12_0_0.sql
+++ b/src/main/resources/database/oracle/alter_11_5_x_to_12_0_0.sql
@@ -230,6 +230,10 @@ alter table o_gta_task add g_acceptation_date date default null;
 alter table o_gta_task add g_solution_date date default null;
 alter table o_gta_task add g_graduation_date date default null;
 
+alter table o_gta_task add g_submission_ndocs number(20) default null;
+alter table o_gta_task add g_submission_revisions_ndocs number(20) default null;
+alter table o_gta_task add g_collection_ndocs number(20) default null;
+
 create table o_gta_task_revision_date (
   id number(20) generated always as identity,
   creationdate date not null,
diff --git a/src/main/resources/database/oracle/setupDatabase.sql b/src/main/resources/database/oracle/setupDatabase.sql
index 616cd6aa53004f5f388ea338fac516e0a18df0b7..22088d9ab8d095e9f8cc9d38090ea8a70415061a 100644
--- a/src/main/resources/database/oracle/setupDatabase.sql
+++ b/src/main/resources/database/oracle/setupDatabase.sql
@@ -1881,8 +1881,11 @@ create table o_gta_task (
    g_taskname varchar2(1024 char),
    g_assignment_date date,
    g_submission_date date,
+   g_submission_ndocs number(20),
    g_submission_revisions_date date,
+   g_submission_revisions_ndocs number(20),
    g_collection_date date,
+   g_collection_ndocs number(20),
    g_acceptation_date date,
    g_solution_date date,
    g_graduation_date date,
diff --git a/src/main/resources/database/postgresql/alter_11_5_x_to_12_0_0.sql b/src/main/resources/database/postgresql/alter_11_5_x_to_12_0_0.sql
index bc764ec42185e4eb869f9960bd150e16f29fc4e0..7a4fd7d2fe48f7dd8e0a292abb05e803bcacc5d5 100644
--- a/src/main/resources/database/postgresql/alter_11_5_x_to_12_0_0.sql
+++ b/src/main/resources/database/postgresql/alter_11_5_x_to_12_0_0.sql
@@ -230,6 +230,10 @@ alter table o_gta_task add column g_acceptation_date timestamp default null;
 alter table o_gta_task add column g_solution_date timestamp default null;
 alter table o_gta_task add column g_graduation_date timestamp default null;
 
+alter table o_gta_task add column g_submission_ndocs int8 default null;
+alter table o_gta_task add column g_submission_revisions_ndocs int8 default null;
+alter table o_gta_task add column g_collection_ndocs int8 default null;
+
 create table o_gta_task_revision_date (
   id bigserial not null,
   creationdate timestamp not null,
diff --git a/src/main/resources/database/postgresql/setupDatabase.sql b/src/main/resources/database/postgresql/setupDatabase.sql
index c5f3bda9345097553f59bb78adff750fe353f633..723deaec2fa5b3fd220f7b6240a7e3ed23ce2ef8 100644
--- a/src/main/resources/database/postgresql/setupDatabase.sql
+++ b/src/main/resources/database/postgresql/setupDatabase.sql
@@ -1854,8 +1854,11 @@ create table o_gta_task (
    g_rev_loop int4 not null default 0,
    g_assignment_date timestamp,
    g_submission_date timestamp,
+   g_submission_ndocs int8,
    g_submission_revisions_date timestamp,
+   g_submission_revisions_ndocs int8,
    g_collection_date timestamp,
+   g_collection_ndocs int8,
    g_acceptation_date timestamp,
    g_solution_date timestamp,
    g_graduation_date timestamp,