diff --git a/src/main/java/org/olat/course/area/CourseAreasController.java b/src/main/java/org/olat/course/area/CourseAreasController.java
index 21c311f5f0167217df8b978b2a2acf24016e9d94..cbaf89872718c8d8038b2391dcc14789a53c5d1e 100644
--- a/src/main/java/org/olat/course/area/CourseAreasController.java
+++ b/src/main/java/org/olat/course/area/CourseAreasController.java
@@ -61,6 +61,7 @@ public class CourseAreasController extends MainLayoutBasicController {
 	private static final String TABLE_ACTION_DELETE = "tbl_del";
 	
 	private final StackedPanel mainPanel;
+	
 	private final Link createAreaLink;
 	private final VelocityContainer mainVC;
 	private final TableController tableCtrl;
@@ -77,7 +78,6 @@ public class CourseAreasController extends MainLayoutBasicController {
 	
 	public CourseAreasController(UserRequest ureq, WindowControl wControl, OLATResource resource, boolean readOnly) {
 		super(ureq, wControl);
-		
 		this.resource = resource;
 
 		Translator resourceTrans = Util.createPackageTranslator(RepositoryService.class, getLocale(), getTranslator());
@@ -188,10 +188,4 @@ public class CourseAreasController extends MainLayoutBasicController {
 		listenTo(editController);
 		mainPanel.pushContent(editController.getInitialComponent());
 	}
-	
-	
-
-
-
-	
 }
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 9a5444be62b59e2bc2ca43dcaeea8c74271bd218..aea966081969b499fe1f3bc37ef3e24b4925fd09 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
@@ -364,8 +364,13 @@ public abstract class GTAAbstractController extends BasicController implements G
 						&& date.compareTo(new Date()) < 0) {
 					//push to the next step
 					int numOfDocs = getNumberOfSubmittedDocuments();
-					assignedTask = gtaManager.submitTask(assignedTask, gtaNode, numOfDocs, Role.auto);
-					doUpdateAttempts();
+					if (numOfDocs > 0 || getDoer() != Role.coach) {
+						assignedTask = gtaManager.submitTask(assignedTask, gtaNode, numOfDocs, Role.auto);
+						doUpdateAttempts();
+						if (numOfDocs > 0) {
+							showInfo("info.task.collected");
+						}
+					}
 				}
 			} else if(dueDate.getMessageKey() != null) {
 				mainVC.contextPut("submitDueDateMsg", translate(dueDate.getMessageKey(), dueDate.getMessageArg()));
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 5829dd9002661a2ee0b4718776c2774189ab4cf8..d5b777cdd5064603b9a6d3bf214cdc3a9c84b509 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
@@ -247,6 +247,15 @@ public class GTACoachController extends GTAAbstractController implements Assessm
 			}  else {
 				TextFactory.createTextComponentFromI18nKey("submittedDocs", "coach.submitted.nofiles", getTranslator(), null, true, mainVC);			
 			}
+		} else {
+			File documentsDir;
+			if(GTAType.group.name().equals(config.getStringValue(GTACourseNode.GTASK_TYPE))) {
+				documentsDir = gtaManager.getSubmitDirectory(courseEnv, gtaNode, assessedGroup);
+			} else {
+				documentsDir = gtaManager.getSubmitDirectory(courseEnv, gtaNode, assessedIdentity);
+			}
+			boolean hasDocuments = TaskHelper.hasDocuments(documentsDir);
+			mainVC.contextPut("hasUploadedDocs", hasDocuments);
 		}
 		return assignedTask;
 	}
@@ -263,8 +272,7 @@ public class GTACoachController extends GTAAbstractController implements Assessm
 	}
 	
 	private void collect(Task assignedTask) {
-		DueDate dueDate = getSubmissionDueDate(assignedTask);
-		if(!coachCourseEnv.isCourseReadOnly() && (dueDate == null || dueDate.getDueDate() == null)) {
+		if(!coachCourseEnv.isCourseReadOnly()) {
 			collectSubmissionsLink = LinkFactory.createButton("coach.collect.task", mainVC, this);
 			collectSubmissionsLink.setUserObject(assignedTask);
 		}
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/_content/coach.html b/src/main/java/org/olat/course/nodes/gta/ui/_content/coach.html
index e93a9a127ea0fc649426dac600e9fc6d3f405c88..42fd982d0afeef216970d844732e43d2768576bd 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/_content/coach.html
+++ b/src/main/java/org/olat/course/nodes/gta/ui/_content/coach.html
@@ -54,7 +54,11 @@
 		#else
 			<b>$r.translate("coach.waiting.submitted.documents")</b>
 			<br />
-			$r.translate("coach.waiting.submitted.documents.description")
+			#if($hasUploadedDocs)
+				$r.translate("coach.waiting.submitted.documents.ready.description")
+			#else 
+				$r.translate("coach.waiting.submitted.documents.description")
+			#end
 		#end
 		#if($r.available("coach.collect.task") && $r.visible("coach.collect.task"))
 			<h5>$r.translate("coach.collect.confirm.title")</h5>
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/nodes/gta/ui/_i18n/LocalStrings_de.properties
index 44b4920d0a37cb56a463c91908b7c04625dae398..c0a508508d606ad9145e648771c380310401e328 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/course/nodes/gta/ui/_i18n/LocalStrings_de.properties
@@ -63,6 +63,7 @@ coach.waiting.assignment=Warten auf Zuweisung
 coach.waiting.assignment.description=Die Aufgabe wurde noch nicht zugewiesen. Die Abgabe und Korrektur kann erst beginnen wenn eine Aufgabe zugewiesen wurde. 
 coach.waiting.submitted.documents=Warten auf Abgabe L\u00F6sung
 coach.waiting.submitted.documents.description=Es wurden noch keine Dokumente abgegeben. Die R\u00FCckgabe und Korrektur kann erst beginnen wenn die gel\u00F6ste Aufgabe abgegeben wurde. 
+coach.waiting.submitted.documents.ready.description=Es wurden Dokumente hochgeladen, aber noch nicht abgegeben. Die R\u00FCckgabe und Korrektur kann erst beginnen wenn die gel\u00F6ste Aufgabe abgegeben wurde. 
 comment=Kommentar
 condition.accessibility.title=Zugang
 confirm.delete.solution.description=Wollen Sie wirklich die L\u00F6sung "{0}" l\u00F6schen?
@@ -120,6 +121,7 @@ group.passed=Gruppe bestanden
 group.score=Gruppe Punkte
 group.title=Leistungs\u00FCbersicht
 highscore.forminfo=Die HighScore Funktionalit\u00E4t bezieht sich auf die einzelnen Mitglieder einer Gruppe. Ein Vergleich auf Ebene der Gruppen ist nicht m\u00F6glich.
+info.task.collected=Die hochgeladenen Dokumente wurden automatisch eingezogen.
 info.task.reset.allowed=Die Aufgabe wurde zur\u00FCckgesetzt. Der Teilnehmer kann dies nun best\u00E4tigen.
 info.title=$org.olat.course.nodes.ms\:info.title
 lastmodified=am {0}
@@ -155,7 +157,7 @@ notifications.solution=Im Kurs "{0}" steht die folgende Musterl\u00F6sung zum Do
 notifications.solution.task=F\u00FCr die Aufgabe "{0}" im Kurs "{1}" steht die folgende Musterl\u00F6sung zum Download bereit\: "{2}".
 notifications.submission.group=Die Aufgabe "{0}" im Kurs "{1}" wurde f\u00FCr Gruppe "{2}" abgegeben.
 notifications.submission.group.doc=F\u00FCr die Aufgabe "{0}" im Kurs "{1}" wurde ein neues Dokument "{2}" von "{3}" f\u00FCr Gruppe "{4}" hochgeladen.
-notifications.submission.individual=Die Aufgabe "{0}" im Kurs "{1}" wurde von "{2}" abgegeben.
+notifications.submission.individual=Die Aufgabe "{0}" im Kurs "{1}" wurde von "{2}" ohne L\u00F6sung abgegeben.
 notifications.submission.individual.doc=F\u00FCr die Aufgabe "{0}" im Kurs "{1}" wurde ein neues Dokument "{2}" von "{3}" hochgeladen.
 open.group=Gruppe \u00F6ffnen
 pane.tab.accessibility=Zugang
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/course/nodes/gta/ui/_i18n/LocalStrings_en.properties
index f48a13f08752a81d6ffb54eb514cf214ad7bf997..4561c5ae9e67f8ed5df07fe41f723a0eb86ad6ab 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/course/nodes/gta/ui/_i18n/LocalStrings_en.properties
@@ -63,6 +63,7 @@ coach.waiting.assignment=Waiting for assignment
 coach.waiting.assignment.description=The task has not been assigned yet. The submission and reviewing process can only be started when the task has been assigned first. 
 coach.waiting.submitted.documents=Waiting for documents
 coach.waiting.submitted.documents.description=No documents have been submitted so far. The reviewing can only be started when a final submission has been made. 
+coach.waiting.submitted.documents.ready.description=There are uploaded documents which have not been submitted so far. The reviewing can only be started when a final submission has been made. 
 comment=Comments
 condition.accessibility.title=Access
 confirm.delete.solution.description=Do you want to delete the solution "{0}"?
@@ -120,6 +121,7 @@ group.passed=Group passed
 group.score=Group score
 group.title=Score summary
 highscore.forminfo=The high-score feature refers to the members of a group. A comparison on group level is not available. 
+info.task.collected=The uploaded documents have been collected automatically.
 info.task.reset.allowed=The task has been reset. The participant can confirm it now.
 info.title=$org.olat.course.nodes.ms\:info.title
 lastmodified=at {0}
@@ -155,7 +157,7 @@ notifications.solution=In the course "{0}" the following sample solution is avai
 notifications.solution.task=For the task "{0}" in the course "{1}" the following sample solution is available for download\: "{2}".
 notifications.submission.group=The task "{0}" in course "{1}" was submitted for the group "{2}".
 notifications.submission.group.doc=\=For the task "{0}" in course "{1}" was a new document "{2}" submitted by "{3}" for the group "{4}".
-notifications.submission.individual=The task "{0}" in course "{1}" was submitted by "{2}".
+notifications.submission.individual=The task "{0}" in course "{1}" was submitted by "{2}" without a document.
 notifications.submission.individual.doc=For the task "{0}" in course "{1}" was a new document "{2}" submitted by "{3}".
 open.group=Open group
 pane.tab.accessibility=Access
diff --git a/src/main/java/org/olat/group/BusinessGroupService.java b/src/main/java/org/olat/group/BusinessGroupService.java
index ea03ea1a962e23d3e8e006127405b2fe08121214..0fa2502c634b4e662e508a76b82457f140565678 100644
--- a/src/main/java/org/olat/group/BusinessGroupService.java
+++ b/src/main/java/org/olat/group/BusinessGroupService.java
@@ -334,9 +334,9 @@ public interface BusinessGroupService {
 	
 	public void addResourcesTo(List<BusinessGroup> groups, List<RepositoryEntry> resources);
 	
-	public void removeResourceFrom(List<BusinessGroup> group, RepositoryEntryRef re);
+	public void removeResourceFrom(List<BusinessGroup> group, RepositoryEntry re);
 	
-	public void removeResource(RepositoryEntryRef resource);
+	public void removeResource(RepositoryEntry resource);
 	
 	public List<RepositoryEntry> findRepositoryEntries(Collection<BusinessGroup> groups, int firstResult, int maxResults);
 	
diff --git a/src/main/java/org/olat/group/area/BGArea.java b/src/main/java/org/olat/group/area/BGArea.java
index 1353c5515b0d2e7248d01de1a4b3fc45ce17f037..c8409375a4d23e23b6b715244d8d9adbef2e38b7 100644
--- a/src/main/java/org/olat/group/area/BGArea.java
+++ b/src/main/java/org/olat/group/area/BGArea.java
@@ -42,7 +42,7 @@ import org.olat.resource.OLATResource;
 public interface BGArea extends Persistable, CreateInfo, ShortName {
 	/** regular expression to check for valid area names */
 	// commas are not allowed. name is used in course conditions for weak binding
-	public final static String VALID_AREANAME_REGEXP = "^[^,\"]*$";
+	public static final String VALID_AREANAME_REGEXP = "^[^,\"]*$";
 
 	/**
 	 * @return The group area description
diff --git a/src/main/java/org/olat/group/area/BGAreaManager.java b/src/main/java/org/olat/group/area/BGAreaManager.java
index 0871b5ae28ec97146ca1e5273df2326737d3be30..42c70c1e7af6be130fae336e418fbc713fe4cebe 100644
--- a/src/main/java/org/olat/group/area/BGAreaManager.java
+++ b/src/main/java/org/olat/group/area/BGAreaManager.java
@@ -105,6 +105,8 @@ public interface BGAreaManager {
 	 * @param area
 	 */
 	public void removeBGFromArea(BusinessGroup group, BGArea area);
+	
+	public void removeBGFromAreas(BusinessGroup group, OLATResource resource);
 
 	/**
 	 * Deletes all business group to area relations from the given business group
diff --git a/src/main/java/org/olat/group/area/BGAreaManagerImpl.java b/src/main/java/org/olat/group/area/BGAreaManagerImpl.java
index 8fff0988f4e257ffc8a9e4ff486588270f9edb26..c87cfe8c4f639ade957a315a9010736a53f454a1 100644
--- a/src/main/java/org/olat/group/area/BGAreaManagerImpl.java
+++ b/src/main/java/org/olat/group/area/BGAreaManagerImpl.java
@@ -33,13 +33,12 @@ import javax.persistence.TypedQuery;
 
 import org.olat.basesecurity.GroupRoles;
 import org.olat.core.commons.persistence.DB;
-import org.olat.core.commons.persistence.DBFactory;
 import org.olat.core.id.Identity;
 import org.olat.core.logging.OLATRuntimeException;
-import org.olat.core.manager.BasicManager;
+import org.olat.core.logging.OLog;
+import org.olat.core.logging.Tracing;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.coordinate.CoordinatorManager;
-import org.olat.core.util.coordinate.SyncerCallback;
 import org.olat.core.util.coordinate.SyncerExecutor;
 import org.olat.group.BusinessGroup;
 import org.olat.resource.OLATResource;
@@ -53,7 +52,9 @@ import org.springframework.stereotype.Service;
  * @author gnaegi
  */
 @Service("areaManager")
-public class BGAreaManagerImpl extends BasicManager implements BGAreaManager {
+public class BGAreaManagerImpl implements BGAreaManager {
+	
+	private static final OLog log = Tracing.createLoggerFor(BGAreaManagerImpl.class); 
 	
 	@Autowired
 	private DB dbInstance;
@@ -71,16 +72,12 @@ public class BGAreaManagerImpl extends BasicManager implements BGAreaManager {
 		sb.append("select area from ").append(BGAreaImpl.class.getName()).append(" area ")
 		  .append(" where area.key in (:keys)");
 		
-		List<BGArea> areas = dbInstance.getCurrentEntityManager().createQuery(sb.toString(), BGArea.class)
+		return dbInstance.getCurrentEntityManager().createQuery(sb.toString(), BGArea.class)
 				.setParameter("keys", keys)
 				.getResultList();
-		return areas;
 	}
 
-	/**
-	 * @see org.olat.group.area.BGAreaManager#findBGArea(java.lang.String,
-	 *      org.olat.group.context.BGContext)
-	 */
+	@Override
 	public BGArea findBGArea(String areaName, OLATResource resource) {
 		StringBuilder sb = new StringBuilder();
 		sb.append("select area from ").append(BGAreaImpl.class.getName()).append(" area ")
@@ -99,28 +96,20 @@ public class BGAreaManagerImpl extends BasicManager implements BGAreaManager {
 		return areas.get(0);
 	}
 
-	/**
-	 * @see org.olat.group.area.BGAreaManager#updateBGArea(org.olat.group.area.BGArea)
-	 */
+
 	//o_clusterOK by:cg synchronized
+	@Override
 	public BGArea updateBGArea(final BGArea area) {
 		// look if an area with such a name does already exist in this context
 		final OLATResource resource = area.getResource();
-		
-		BGArea updatedBGArea =CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(resource, new SyncerCallback<BGArea>(){
-			public BGArea execute() {
-				BGArea reloadArea = loadArea(area.getKey());
-				reloadArea.setName(area.getName());
-				reloadArea.setDescription(area.getDescription());
-				return dbInstance.getCurrentEntityManager().merge(reloadArea);
-			}
+		return CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(resource, () -> {
+			BGArea reloadArea = loadArea(area.getKey());
+			reloadArea.setName(area.getName());
+			reloadArea.setDescription(area.getDescription());
+			return dbInstance.getCurrentEntityManager().merge(reloadArea);
 		});
-		return updatedBGArea;
 	}
 
-	/**
-	 * @see org.olat.group.area.BGAreaManager#deleteBGArea(org.olat.group.area.BGArea)
-	 */
 	@Override
 	public void deleteBGArea(final BGArea area) {
 		final OLATResource resource = area.getResource();
@@ -136,9 +125,9 @@ public class BGAreaManagerImpl extends BasicManager implements BGAreaManager {
 					deleteAssessmentModeToAreaRelations(reloadArea);
 					// 3) delete area itself
 					dbInstance.deleteObject(reloadArea);
-					logAudit("Deleted Business Group Area", reloadArea.toString());
+					log.audit("Deleted Business Group Area", reloadArea.toString());
 				} else {
-					logAudit("Business Group Area was already deleted", area.toString());
+					log.audit("Business Group Area was already deleted", area.toString());
 				}
 			}
 		});
@@ -158,27 +147,36 @@ public class BGAreaManagerImpl extends BasicManager implements BGAreaManager {
 				.setParameter("groupKey", group.getKey())
 				.executeUpdate();
 	}
-
-	/**
-	 * @see org.olat.group.area.BGAreaManager#addBGToBGArea(org.olat.group.BusinessGroup,
-	 *      org.olat.group.area.BGArea)
-	 */
+	
+	@Override
 	public void addBGToBGArea(BusinessGroup group, BGArea area) {
 		BGtoAreaRelation bgAreaRel = new BGtoAreaRelationImpl(area, group);
 		dbInstance.saveObject(bgAreaRel);
 	}
 
-	/**
-	 * @see org.olat.group.area.BGAreaManager#removeBGFromArea(org.olat.group.BusinessGroup,
-	 *      org.olat.group.area.BGArea)
-	 */
+	@Override
 	public void removeBGFromArea(BusinessGroup group, BGArea area) {
 		removeBGFromArea(group.getKey(), area.getKey());
 	}
+	
+	@Override
+	public void removeBGFromAreas(BusinessGroup group, OLATResource resource) {
+		StringBuilder sb = new StringBuilder();
+		sb.append("select bgarel from ").append(BGtoAreaRelationImpl.class.getName()).append(" as bgarel ")
+		  .append(" inner join bgarel.groupArea as area")
+		  .append(" where bgarel.businessGroup.key=:businessGroupKey and area.resource.key=:resourceKey");
+
+		List<BGtoAreaRelationImpl> relations = dbInstance.getCurrentEntityManager()
+				.createQuery(sb.toString(), BGtoAreaRelationImpl.class)
+				.setParameter("businessGroupKey", group.getKey())
+				.setParameter("resourceKey", resource.getKey())
+				.getResultList();
+		for(BGtoAreaRelationImpl relation:relations) {
+			dbInstance.getCurrentEntityManager().remove(relation);
+		}
+	}
 
-	/**
-	 * @see org.olat.group.area.BGAreaManager#findBusinessGroupsOfArea(org.olat.group.area.BGArea)
-	 */
+	@Override
 	public List<BusinessGroup> findBusinessGroupsOfArea(BGArea area) {
 		return findBusinessGroupsOfAreas(Collections.singletonList(area));
 	}
@@ -186,7 +184,7 @@ public class BGAreaManagerImpl extends BasicManager implements BGAreaManager {
 	@Override
 	public List<BusinessGroup> findBusinessGroupsOfAreas(List<BGArea> areas) {
 		if(areas == null || areas.isEmpty()) return Collections.emptyList();
-		List<Long> areaKeys = new ArrayList<Long>();
+		List<Long> areaKeys = new ArrayList<>();
 		for(BGArea area:areas) {
 			areaKeys.add(area.getKey());
 		}
@@ -203,7 +201,7 @@ public class BGAreaManagerImpl extends BasicManager implements BGAreaManager {
 		  .append(" left join fetch businessGroup.resource resource")
 		  .append(" where  bgarel.groupArea.key in (:areaKeys)");
 
-		return DBFactory.getInstance().getCurrentEntityManager()
+		return dbInstance.getCurrentEntityManager()
 				.createQuery(sb.toString(), BusinessGroup.class)
 				.setParameter("areaKeys", areaKeys)
 				.getResultList();
@@ -218,16 +216,12 @@ public class BGAreaManagerImpl extends BasicManager implements BGAreaManager {
 		  .append(" inner join bgarel.businessGroup businessGroup ")
 		  .append(" where  bgarel.groupArea.key in (:areaKeys)");
 
-		return DBFactory.getInstance().getCurrentEntityManager()
+		return dbInstance.getCurrentEntityManager()
 				.createQuery(sb.toString(), Long.class)
 				.setParameter("areaKeys", areaKeys)
 				.getResultList();
 	}
 
-	/**
-	 * @see org.olat.group.area.BGAreaManager#findBusinessGroupsOfAreaAttendedBy(org.olat.core.id.Identity,
-	 *      java.lang.String, org.olat.group.context.BGContext)
-	 */
 	@Override
 	public List<BusinessGroup> findBusinessGroupsOfAreaAttendedBy(Identity identity, List<Long> areaKeys, OLATResource resource) {
 		StringBuilder sb = new StringBuilder();
@@ -253,13 +247,10 @@ public class BGAreaManagerImpl extends BasicManager implements BGAreaManager {
 			query.setParameter("resourceKey", resource.getKey());
 		}
 		
-		List<BusinessGroup> groups = query.getResultList();
-		return groups;
+		return query.getResultList();
 	}
 
-	/**
-	 * @see org.olat.group.area.BGAreaManager#findBGAreasOfBusinessGroup(org.olat.group.BusinessGroup)
-	 */
+	@Override
 	public List<BGArea> findBGAreasOfBusinessGroup(BusinessGroup group) {
 		return findBGAreasOfBusinessGroups(Collections.singletonList(group));
 	}
@@ -273,7 +264,7 @@ public class BGAreaManagerImpl extends BasicManager implements BGAreaManager {
 		  .append("where bgarel.businessGroup.key in (:groupKeys)");
 
 		TypedQuery<BGArea> areaQuery = dbInstance.getCurrentEntityManager().createQuery(sb.toString(), BGArea.class);
-		List<Long> groupKeys = new ArrayList<Long>();
+		List<Long> groupKeys = new ArrayList<>();
 		for(BusinessGroup group:groups) {
 			groupKeys.add(group.getKey());
 		}
@@ -290,7 +281,7 @@ public class BGAreaManagerImpl extends BasicManager implements BGAreaManager {
 		  .append("where bgarel.businessGroup.key in (:groupKeys)");
 
 		TypedQuery<Number> areaQuery = dbInstance.getCurrentEntityManager().createQuery(sb.toString(), Number.class);
-		List<Long> groupKeys = new ArrayList<Long>();
+		List<Long> groupKeys = new ArrayList<>();
 		for(BusinessGroup group:groups) {
 			groupKeys.add(group.getKey());
 		}
@@ -298,9 +289,6 @@ public class BGAreaManagerImpl extends BasicManager implements BGAreaManager {
 		return areaQuery.getSingleResult().intValue();
 	}
 
-	/**
-	 * @see org.olat.group.area.BGAreaManager#countBGAreasOfBGContext(org.olat.group.context.BGContext)
-	 */
 	@Override
 	public int countBGAreasInContext(OLATResource resource) {
 		StringBuilder sb = new StringBuilder();
@@ -319,16 +307,13 @@ public class BGAreaManagerImpl extends BasicManager implements BGAreaManager {
 	public List<BGArea> findBGAreasInContext(OLATResource resource) {
 		StringBuilder sb = new StringBuilder();
 		sb.append("select area from ").append(BGAreaImpl.class.getName()).append(" area where area.resource.key=:resourceKey");
-		List<BGArea> areas = dbInstance.getCurrentEntityManager().createQuery(sb.toString(), BGArea.class)
+		return dbInstance.getCurrentEntityManager().createQuery(sb.toString(), BGArea.class)
 				.setParameter("resourceKey", resource.getKey())
 				.getResultList();
-		return areas;
 	}
 
-	/**
-	 * @see org.olat.group.area.BGAreaManager#isIdentityInBGArea(org.olat.core.id.Identity,
-	 *      java.lang.String, org.olat.group.context.BGContext)
-	 */
+
+	@Override
 	public boolean isIdentityInBGArea(Identity identity, String areaName, Long areaKey, OLATResource resource) {
 		StringBuilder sb = new StringBuilder();
 		sb.append("select count(bgarel) from ").append(BGtoAreaRelationImpl.class.getName()).append(" as bgarel")
@@ -360,18 +345,16 @@ public class BGAreaManagerImpl extends BasicManager implements BGAreaManager {
 		return count.intValue() > 0;
 	}
 
-	/**
-	 * @see org.olat.group.area.BGAreaManager#reloadArea(org.olat.group.area.BGArea)
-	 */
+	@Override
 	public BGArea reloadArea(BGArea area) {
-		return (BGArea) DBFactory.getInstance().loadObject(area);
+		return (BGArea) dbInstance.loadObject(area);
 	}
 
 	@Override
 	public boolean existArea(String nameOrKey, OLATResource resource) {
 		Long key = null;
 		if(StringHelper.isLong(nameOrKey)) {
-			key = new Long(nameOrKey);
+			key = Long.valueOf(nameOrKey);
 		}
 		
 		StringBuilder sb = new StringBuilder();
@@ -399,7 +382,7 @@ public class BGAreaManagerImpl extends BasicManager implements BGAreaManager {
 		if(!StringHelper.containsNonWhitespace(areaNames)) return Collections.emptyList();
 		
 		String[] areaNameArr = areaNames.split(",");
-		List<String> areaNameList = new ArrayList<String>();
+		List<String> areaNameList = new ArrayList<>();
 		for(String areaName:areaNameArr) {
 			areaNameList.add(areaName.trim());
 		}
@@ -410,12 +393,11 @@ public class BGAreaManagerImpl extends BasicManager implements BGAreaManager {
 		sb.append("select area.key from ").append(BGAreaImpl.class.getName()).append(" area")
 		  .append(" where area.resource.key=:resourceKey and area.name in (:names)");
 
-		List<Long> keys = dbInstance.getCurrentEntityManager().createQuery(sb.toString(), Long.class)
+		return dbInstance.getCurrentEntityManager().createQuery(sb.toString(), Long.class)
 				.setParameter("resourceKey", resource.getKey())
 				.setParameter("names", areaNameList)
 				.setHint("org.hibernate.cacheable", Boolean.TRUE)
 				.getResultList();
-		return keys;
 	}
 
 	/**
@@ -430,9 +412,7 @@ public class BGAreaManagerImpl extends BasicManager implements BGAreaManager {
 	public BGArea createAndPersistBGArea(String areaName, String description, OLATResource resource) {
 		BGArea area = new BGAreaImpl(areaName, description, resource);
 		dbInstance.getCurrentEntityManager().persist(area);
-		if (area != null) {
-			logAudit("Created Business Group Area", area.toString());
-		}
+		log.audit("Created Business Group Area", area.toString());
 		// else no area created, name duplicate
 		return area;
 	}
diff --git a/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java b/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java
index 94e0f88626f16a05fd0d881b9efc5589aad34996..247e890b8aed594904545a3217288159fe5774da 100644
--- a/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java
+++ b/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java
@@ -1626,7 +1626,7 @@ public class BusinessGroupServiceImpl implements BusinessGroupService {
 	}
 
 	@Override
-	public void removeResourceFrom(List<BusinessGroup> groups, RepositoryEntryRef re) {
+	public void removeResourceFrom(List<BusinessGroup> groups, RepositoryEntry re) {
 		if(groups == null || groups.isEmpty()) {
 			return; // nothing to do
 		}
@@ -1636,6 +1636,7 @@ public class BusinessGroupServiceImpl implements BusinessGroupService {
 		int count = 0;
 		for(BusinessGroup group:groups) {
 			businessGroupRelationDAO.deleteRelation(group, re);
+			areaManager.removeBGFromAreas(group, re.getOlatResource());
 			events.add(new BusinessGroupRelationModified(BusinessGroupRelationModified.RESOURCE_REMOVED_EVENT, group.getKey(), re.getKey()));
 			if(count++ % 20 == 0) {
 				dbInstance.commit();
@@ -1650,7 +1651,7 @@ public class BusinessGroupServiceImpl implements BusinessGroupService {
 	}
 	
 	@Override
-	public void removeResource(RepositoryEntryRef re) {
+	public void removeResource(RepositoryEntry re) {
 		SearchBusinessGroupParams params = new SearchBusinessGroupParams();
 		List<BusinessGroup> groups = findBusinessGroups(params, re, 0, -1);
 		removeResourceFrom(groups, re);
diff --git a/src/main/java/org/olat/group/ui/NewAreaController.java b/src/main/java/org/olat/group/ui/NewAreaController.java
index a7a15bd2bf44af4ccbea8e830d17998939b2586d..b304da8491a9d63483d432788f55c1b1d406772b 100644
--- a/src/main/java/org/olat/group/ui/NewAreaController.java
+++ b/src/main/java/org/olat/group/ui/NewAreaController.java
@@ -29,7 +29,6 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
-import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.velocity.VelocityContainer;
@@ -44,6 +43,7 @@ import org.olat.group.area.BGAreaManager;
 import org.olat.group.ui.area.BGAreaFormController;
 import org.olat.resource.OLATResource;
 import org.olat.util.logging.activity.LoggingResourceable;
+import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  * Description:<br>
@@ -65,7 +65,9 @@ public class NewAreaController extends BasicController {
 	private boolean bulkMode = false;
 	private Set<BGArea> newAreas;
 	private HashSet<String> newAreaNames;
-	private final BGAreaManager areaManager;
+	
+	@Autowired
+	private BGAreaManager areaManager;
 
 	/**
 	 * 
@@ -81,8 +83,7 @@ public class NewAreaController extends BasicController {
 		this.resource = resource;
 		this.bulkMode = bulkMode;
 		//
-		areaManager = CoreSpringFactory.getImpl(BGAreaManager.class);
-		contentVC = this.createVelocityContainer("areaform");
+		contentVC = createVelocityContainer("areaform");
 		contentVC.contextPut("bulkMode", bulkMode ? Boolean.TRUE : Boolean.FALSE);
 		//
 		areaCreateController = new BGAreaFormController(ureq, wControl, null, bulkMode);
@@ -94,21 +95,12 @@ public class NewAreaController extends BasicController {
 		}
 		putInitialPanel(contentVC);
 	}
-	
-	/**
-	 * @see org.olat.core.gui.control.DefaultController#doDispose(boolean)
-	 */
+
 	@Override
 	protected void doDispose() {
-		// Don't dispose anything
-		
+		//
 	}
 
-	/**
-	 * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest,
-	 *      org.olat.core.gui.components.Component,
-	 *      org.olat.core.gui.control.Event)
-	 */
 	@Override
 	public void event(UserRequest ureq, Component source, Event event) {
 		// Don't do anything.
@@ -120,7 +112,7 @@ public class NewAreaController extends BasicController {
 			if (event == Event.DONE_EVENT) {
 				String areaDesc = this.areaCreateController.getAreaDescription();
 				
-				Set<String> allNames = new HashSet<String>();
+				Set<String> allNames = new HashSet<>();
 				if (this.bulkMode) {
 					allNames = this.areaCreateController.getGroupNames();
 				} else {
@@ -128,8 +120,8 @@ public class NewAreaController extends BasicController {
 				}
 
 				// create bulkgroups only if there is no name which already exists. 
-				newAreas = new HashSet<BGArea>();
-				newAreaNames = new HashSet<String>();
+				newAreas = new HashSet<>();
+				newAreaNames = new HashSet<>();
 				for (String areaName : allNames) {
 					BGArea newArea = areaManager.createAndPersistBGArea(areaName, areaDesc, resource);
 					newAreas.add(newArea);
@@ -178,7 +170,7 @@ public class NewAreaController extends BasicController {
 	}
 	
 	public List<Long> getCreatedAreaKeys(){
-		List<Long> areaKeys = new ArrayList<Long>();
+		List<Long> areaKeys = new ArrayList<>();
 		for(BGArea newArea:newAreas) {
 			areaKeys.add(newArea.getKey());
 		}
diff --git a/src/main/java/org/olat/group/ui/area/BGAreaEditController.java b/src/main/java/org/olat/group/ui/area/BGAreaEditController.java
index fb7018d1fc30a047684e0d11fad6887d9c25d460..2b82de3f4e689c8db6198e00a68726c50a64f955 100644
--- a/src/main/java/org/olat/group/ui/area/BGAreaEditController.java
+++ b/src/main/java/org/olat/group/ui/area/BGAreaEditController.java
@@ -25,9 +25,9 @@
 
 package org.olat.group.ui.area;
 
+import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.commons.lang.StringEscapeUtils;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
@@ -41,6 +41,7 @@ import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.controller.BasicController;
 import org.olat.core.logging.activity.ThreadLocalUserActivityLogger;
+import org.olat.core.util.StringHelper;
 import org.olat.group.BusinessGroup;
 import org.olat.group.BusinessGroupService;
 import org.olat.group.GroupLoggingAction;
@@ -50,6 +51,7 @@ import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryManager;
 import org.olat.resource.OLATResource;
 import org.olat.util.logging.activity.LoggingResourceable;
+import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  * Description:<BR>
@@ -74,10 +76,15 @@ public class BGAreaEditController extends BasicController {
 	private BGArea area;
 	private OLATResource resource;
 	private RepositoryEntry repoEntry;
-	private List<BusinessGroup> allGroups, inAreaGroups;
-	// managers
-	private final BGAreaManager areaManager;
-	private final BusinessGroupService businessGroupService;
+	private List<BusinessGroup> allGroups;
+	private List<BusinessGroup> inAreaGroups;
+
+	@Autowired
+	private BGAreaManager areaManager;
+	@Autowired
+	private RepositoryManager repositoryManager;
+	@Autowired
+	private BusinessGroupService businessGroupService;
 
 	/**
 	 * Constructor for the business group area edit controller
@@ -90,10 +97,8 @@ public class BGAreaEditController extends BasicController {
 		super(ureq, wControl);
 
 		this.area = area;
-		areaManager = CoreSpringFactory.getImpl(BGAreaManager.class);
 		resource = area.getResource();
-		repoEntry = RepositoryManager.getInstance().lookupRepositoryEntry(resource, false);
-		businessGroupService = CoreSpringFactory.getImpl(BusinessGroupService.class);
+		repoEntry = repositoryManager.lookupRepositoryEntry(resource, false);
 
 		// tabbed pane
 		tabbedPane = new TabbedPane("tabbedPane", ureq.getLocale());
@@ -109,7 +114,7 @@ public class BGAreaEditController extends BasicController {
 			mainVC.put("backLink", backLink);
 		}
 		mainVC.put("tabbedpane", tabbedPane);
-		mainVC.contextPut("title", translate("area.edit.title", new String[] { StringEscapeUtils.escapeHtml(area.getName()).toString() }));
+		mainVC.contextPut("title", translate("area.edit.title", new String[] { StringHelper.escapeHtml(area.getName()) }));
 		putInitialPanel(mainVC);
 	}
 
@@ -134,22 +139,25 @@ public class BGAreaEditController extends BasicController {
 		tabbedPane.addTab(translate("tab.groups"), groupsTabVC);
 
 		allGroups = businessGroupService.findBusinessGroups(null, repoEntry, 0, -1);
+		List<BusinessGroup> repoGroups = new ArrayList<>(allGroups);
 		inAreaGroups = areaManager.findBusinessGroupsOfArea(area);
-		groupsDataModel = new GroupsToAreaDataModel(allGroups, inAreaGroups);
+		for(BusinessGroup inAreaGroup:inAreaGroups) {
+			if(!allGroups.contains(inAreaGroup)) {
+				allGroups.add(inAreaGroup);
+			}
+		}
+		groupsDataModel = new GroupsToAreaDataModel(allGroups, repoGroups, inAreaGroups, getTranslator());
 
 		groupsChoice = new Choice("groupsChoice", getTranslator());
 		groupsChoice.setSubmitKey("submit");
 		groupsChoice.setCancelKey("cancel");
 		groupsChoice.setModel(groupsDataModel);
+		groupsChoice.setEscapeHtml(false);
 		groupsChoice.addListener(this);
 		groupsTabVC.put("groupsChoice", groupsChoice);
-		groupsTabVC.contextPut("noGroupsFound", (allGroups.size() > 0 ? Boolean.FALSE : Boolean.TRUE));
+		groupsTabVC.contextPut("noGroupsFound", Boolean.valueOf(allGroups.isEmpty()));
 	}
 
-	/**
-	 * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest,
-	 *      org.olat.core.gui.components.Component, org.olat.core.gui.control.Event)
-	 */
 	@Override
 	public void event(UserRequest ureq, Component source, Event event) {
 		if (source == groupsChoice) {
@@ -180,7 +188,7 @@ public class BGAreaEditController extends BasicController {
 					getWindowControl().setWarning(translate("error.area.name.exists"));
 				} else {
 					area = updatedArea;
-					mainVC.contextPut("title", translate("area.edit.title", new String[] { StringEscapeUtils.escapeHtml(area.getName()).toString() }));
+					mainVC.contextPut("title", translate("area.edit.title", new String[] { StringHelper.escapeHtml(area.getName()) }));
 				}
 			} else if (event == Event.CANCELLED_EVENT) {
 				// area might have been changed, reload from db
@@ -227,13 +235,10 @@ public class BGAreaEditController extends BasicController {
 		for (Integer position:removedGroups) {
 			BusinessGroup group = groupsDataModel.getObject(position.intValue());
 			areaManager.removeBGFromArea(group, area);
-			this.inAreaGroups.remove(group);
+			inAreaGroups.remove(group);
 		}
 	}
 
-	/**
-	 * @see org.olat.core.gui.control.DefaultController#doDispose(boolean)
-	 */
 	@Override
 	protected void doDispose() {
 		// don't dispose anything
diff --git a/src/main/java/org/olat/group/ui/area/GroupsToAreaDataModel.java b/src/main/java/org/olat/group/ui/area/GroupsToAreaDataModel.java
index 6f645f61028cf03ad0319b1d62e0395394b8d73d..918fd2af9a410296c3620f6f514c1a5dcfbce254 100644
--- a/src/main/java/org/olat/group/ui/area/GroupsToAreaDataModel.java
+++ b/src/main/java/org/olat/group/ui/area/GroupsToAreaDataModel.java
@@ -28,6 +28,8 @@ package org.olat.group.ui.area;
 import java.util.List;
 
 import org.olat.core.gui.components.choice.ChoiceModel;
+import org.olat.core.gui.translator.Translator;
+import org.olat.core.util.StringHelper;
 import org.olat.group.BusinessGroup;
 
 /**
@@ -37,8 +39,11 @@ import org.olat.group.BusinessGroup;
  * @author gnaegi
  */
 public class GroupsToAreaDataModel implements ChoiceModel {
+	
+	private final Translator translator;
 	private final List<BusinessGroup> allGroups;
 	private final List<BusinessGroup> inAreaGroups;
+	private final List<BusinessGroup> repoGroups;
 
 	/**
 	 * Constructor for the GroupsToAreaDataModel
@@ -47,9 +52,12 @@ public class GroupsToAreaDataModel implements ChoiceModel {
 	 * @param inAreaGroups All groups that are associated to the group area. The
 	 *          checked rows.
 	 */
-	public GroupsToAreaDataModel(List<BusinessGroup> allGroups, List<BusinessGroup> inAreaGroups) {
+	public GroupsToAreaDataModel(List<BusinessGroup> allGroups, List<BusinessGroup> repoGroups,
+			List<BusinessGroup> inAreaGroups, Translator translator) {
 		this.allGroups = allGroups;
 		this.inAreaGroups = inAreaGroups;
+		this.repoGroups = repoGroups;
+		this.translator = translator;
 	}
 
 	@Override
@@ -64,7 +72,13 @@ public class GroupsToAreaDataModel implements ChoiceModel {
 
 	@Override
 	public String getLabel(int row) {
-		return getObject(row).getName();
+		BusinessGroup group = getObject(row);
+		String label = StringHelper.escapeHtml(group.getName());
+		if(inAreaGroups.contains(group) && !repoGroups.contains(group)) {
+			String explain = translator.translate("");
+			label += " <span title='" + explain + "'><i class='o_icon o_icon_warn'> </i></span>";
+		}
+		return label;
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/group/ui/area/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/group/ui/area/_i18n/LocalStrings_de.properties
index e959ff319a2b5ed6cf0a73c029574c184391867b..309acbeb66ab915e44d0ab7da798a8c70cdca4a3 100644
--- a/src/main/java/org/olat/group/ui/area/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/group/ui/area/_i18n/LocalStrings_de.properties
@@ -20,3 +20,4 @@ groupchoice.no.groups=Es wurde keine Lerngruppe gefunden. Bitte erstellen Sie zu
 
 tab.details=Beschreibung
 tab.groups=Gruppenzuordnung
+warning.group.not.in.repo=Lerngruppe ist nicht in Kurs gebunden.
diff --git a/src/main/java/org/olat/group/ui/area/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/group/ui/area/_i18n/LocalStrings_en.properties
index dcb7c0a88f46e67e9cea468d09290aba0ee3adb6..5236ce85550ddcfe9addb5c8be79e6d3c4d469b2 100644
--- a/src/main/java/org/olat/group/ui/area/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/group/ui/area/_i18n/LocalStrings_en.properties
@@ -20,3 +20,5 @@ groupchoice.no.groups=No learning groups found. Please create a learning group f
 
 tab.details=Description
 tab.groups=Group assignment
+warning.group.not.in.repo=Learning group is not linked to the course.
+
diff --git a/src/main/java/org/olat/modules/lecture/ui/TeacherRollCallController.java b/src/main/java/org/olat/modules/lecture/ui/TeacherRollCallController.java
index 22bdba66698bb6366dfff4b18fd47d757ad4ac30..bd72dba8783e40dda69a60a69d36e9382b702776 100644
--- a/src/main/java/org/olat/modules/lecture/ui/TeacherRollCallController.java
+++ b/src/main/java/org/olat/modules/lecture/ui/TeacherRollCallController.java
@@ -39,13 +39,10 @@ import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
 import org.olat.core.gui.components.form.flexible.impl.FormEvent;
 import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer;
 import org.olat.core.gui.components.form.flexible.impl.elements.FormSubmit;
-import org.olat.core.gui.components.form.flexible.impl.elements.table.BooleanCellRenderer;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiColumnModel;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiColumnModel;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelFactory;
-import org.olat.core.gui.components.form.flexible.impl.elements.table.SelectionEvent;
-import org.olat.core.gui.components.form.flexible.impl.elements.table.StaticFlexiCellRenderer;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
@@ -95,7 +92,9 @@ public class TeacherRollCallController extends FormBasicController {
 	private FlexiTableElement tableEl;
 	private TeacherRollCallDataModel tableModel;
 	private FormSubmit quickSaveButton;
-	private FormLink reopenButton, cancelLectureBlockButton, closeLectureBlocksButton;
+	private FormLink reopenButton;
+	private FormLink cancelLectureBlockButton;
+	private FormLink closeLectureBlocksButton;
 	
 	private ReasonController reasonCtrl;
 	private CloseableModalController cmc;
@@ -170,11 +169,11 @@ public class TeacherRollCallController extends FormBasicController {
 			String endTime = formatter.formatTimeShort(lectureBlock.getEndDate());
 			
 			String[] args = new String[] {
-					lectureBlock.getTitle(),	// {0}	
-					sb.toString(),				// {1}
-					date,						// {2}
-					startTime,					// {3}
-					endTime						// {4}
+					lectureBlock.getTitle(),	// 0	
+					sb.toString(),				// 1
+					date,						// 2
+					startTime,					// 3
+					endTime						// 4
 			};
 		
 			layoutCont.contextPut("date", date);
@@ -214,9 +213,7 @@ public class TeacherRollCallController extends FormBasicController {
 			columnsModel.addFlexiColumnModel(col);
 			colPos++;
 			
-			if(!options.hasDefaultOrderBy()) {
-				options.setDefaultOrderBy(new SortKey(propName, true));
-			} else if(UserConstants.LASTNAME.equals(propName)) {
+			if(!options.hasDefaultOrderBy() || UserConstants.LASTNAME.equals(propName)) {
 				options.setDefaultOrderBy(new SortKey(propName, true));
 			}
 		}
@@ -231,9 +228,7 @@ public class TeacherRollCallController extends FormBasicController {
 			}
 			
 			//all button
-			DefaultFlexiColumnModel allCol = new DefaultFlexiColumnModel("all",
-					RollCols.all.ordinal(), "all",
-					new BooleanCellRenderer(new StaticFlexiCellRenderer(translate("all"), "all", null, null, translate("all.desc")), null));
+			DefaultFlexiColumnModel allCol = new DefaultFlexiColumnModel(RollCols.all);
 			allCol.setAlwaysVisible(true);
 			columnsModel.addFlexiColumnModel(allCol);
 			if(secCallback.canViewAuthorizedAbsences() || secCallback.canEditAuthorizedAbsences()) {
@@ -371,6 +366,14 @@ public class TeacherRollCallController extends FormBasicController {
 			row.setAuthorizedAbsenceCont(absenceCont);
 			absenceCont.contextPut("row", row);
 		}
+		
+		if(secCallback.canEditAbsences()) {
+			FormLink allLink = uifactory.addFormLink("all_".concat(Integer.toString(++counter)), "all", null, flc, Link.LINK);
+			allLink.setTitle("all.desc");
+			allLink.setDomReplacementWrapperRequired(false);
+			allLink.setUserObject(row);
+			row.setAllLink(allLink);
+		}
 
 		String comment = rollCall == null ? "" : rollCall.getComment();
 		String commentId = "comment_".concat(Integer.toString(++counter));
@@ -439,7 +442,7 @@ public class TeacherRollCallController extends FormBasicController {
 
 	@Override
 	protected boolean validateFormLogic(UserRequest ureq) {
-		boolean allOk = true;
+		boolean allOk = super.validateFormLogic(ureq);
 
 		for(int i=tableModel.getRowCount(); i-->0; ) {
 			TeacherRollCallRow row = tableModel.getObject(i);
@@ -459,21 +462,12 @@ public class TeacherRollCallController extends FormBasicController {
 			}
 		}
 
-		return allOk & super.validateFormLogic(ureq);
+		return allOk;
 	}
 	
 	@Override
 	protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
-		if(source == tableEl) {
-			if(event instanceof SelectionEvent) {
-				SelectionEvent se = (SelectionEvent)event;
-				String cmd = se.getCommand();
-				TeacherRollCallRow row = tableModel.getObject(se.getIndex());
-				if("all".equals(cmd)) {
-					doCheckAllRow(row);
-				}
-			}
-		} else if(source instanceof MultipleSelectionElement) {
+		if(source instanceof MultipleSelectionElement) {
 			MultipleSelectionElement check = (MultipleSelectionElement)source;
 			TeacherRollCallRow row = (TeacherRollCallRow)check.getUserObject();
 			if(row.getAuthorizedAbsence() == check) {
@@ -497,9 +491,13 @@ public class TeacherRollCallController extends FormBasicController {
 		} else if(source instanceof FormLink) {
 			FormLink link = (FormLink)source;
 			String cmd = link.getCmd();
-			if(cmd != null && cmd.startsWith("abs_reason_")) {
-				TeacherRollCallRow row = (TeacherRollCallRow)link.getUserObject();
-				doCalloutReasonAbsence(ureq, link.getFormDispatchId(), row);
+			if(cmd != null) {
+				if(cmd.startsWith("abs_reason_")) {
+					TeacherRollCallRow row = (TeacherRollCallRow)link.getUserObject();
+					doCalloutReasonAbsence(ureq, link.getFormDispatchId(), row);
+				} else if(cmd.startsWith("all_")) {
+					doCheckAllRow((TeacherRollCallRow)link.getUserObject());
+				}
 			}
 		}
 		super.formInnerEvent(ureq, source, event);
diff --git a/src/main/java/org/olat/modules/lecture/ui/TeacherRollCallDataModel.java b/src/main/java/org/olat/modules/lecture/ui/TeacherRollCallDataModel.java
index 28599e33d56e932ad6d921409846aa54e827d9f9..ae0ced2ddf3273dc434a587062bec3dc60b673c3 100644
--- a/src/main/java/org/olat/modules/lecture/ui/TeacherRollCallDataModel.java
+++ b/src/main/java/org/olat/modules/lecture/ui/TeacherRollCallDataModel.java
@@ -68,7 +68,7 @@ public class TeacherRollCallDataModel extends DefaultFlexiTableDataModel<Teacher
 				case status: return row.getRollCallStatusEl();
 				case authorizedAbsence: return row.getAuthorizedAbsenceCont();
 				case comment: return row.getCommentEl();
-				case all: return secCallback.canEditAbsences();
+				case all: return row.getAllLink();
 				default: return null;
 			}
 		} else if(col < TeacherRollCallController.CHECKBOX_OFFSET) {
diff --git a/src/main/java/org/olat/modules/lecture/ui/TeacherRollCallRow.java b/src/main/java/org/olat/modules/lecture/ui/TeacherRollCallRow.java
index 6b91cf0eaca2b0d9b9b41472d4064cf5fdae69ee..8a54c65b50a522e0989a07cd11545bfa12714f7c 100644
--- a/src/main/java/org/olat/modules/lecture/ui/TeacherRollCallRow.java
+++ b/src/main/java/org/olat/modules/lecture/ui/TeacherRollCallRow.java
@@ -41,6 +41,7 @@ import org.olat.user.propertyhandlers.UserPropertyHandler;
 public class TeacherRollCallRow extends UserPropertiesRow {
 	
 	private Identity identity;
+	private FormLink allLink;
 	private FormLink reasonLink;
 	private TextElement commentEl;
 	private LectureBlockRollCall rollCall;
@@ -101,6 +102,14 @@ public class TeacherRollCallRow extends UserPropertiesRow {
 		this.authorizedAbsence = authorizedAbsence;
 	}
 
+	public FormLink getAllLink() {
+		return allLink;
+	}
+
+	public void setAllLink(FormLink allLink) {
+		this.allLink = allLink;
+	}
+
 	public FormLink getReasonLink() {
 		return reasonLink;
 	}
diff --git a/src/test/java/org/olat/group/test/BGAreaManagerTest.java b/src/test/java/org/olat/group/test/BGAreaManagerTest.java
index ae5424f3fc0645f3a308e909a1b7bbbf8d268bd7..9a0bebec233191985f3f9383fd17354720c51955 100644
--- a/src/test/java/org/olat/group/test/BGAreaManagerTest.java
+++ b/src/test/java/org/olat/group/test/BGAreaManagerTest.java
@@ -407,6 +407,52 @@ public class BGAreaManagerTest extends OlatTestCase {
 		Assert.assertTrue(diminushedGroups.contains(group1));
 	}
 	
+	/**
+	 * Check that the remove resource from business group service remove
+	 * the relation to area too
+	 */
+	@Test
+	public void removeResourceFrom_withArea() {
+		//create a resource, an area, a group
+		RepositoryEntry resource1 =  JunitTestHelper.createAndPersistRepositoryEntry();
+		RepositoryEntry resource2 =  JunitTestHelper.createAndPersistRepositoryEntry();
+		String areaName = UUID.randomUUID().toString();
+		BGArea area1 = areaManager.createAndPersistBGArea("area-1-" + areaName, "description:" + areaName, resource1.getOlatResource());
+		BGArea area2 = areaManager.createAndPersistBGArea("area-1-" + areaName, "description:" + areaName, resource2.getOlatResource());
+		//create the group
+		BusinessGroup group = businessGroupService.createBusinessGroup(null, "area-1-group", "area-group-desc", 0, -1, false, false, null);
+		dbInstance.commitAndCloseSession();
+		//add relations group to courses
+		businessGroupService.addResourceTo(group, resource1);
+		businessGroupService.addResourceTo(group, resource2);
+		//add the relations to areas
+		areaManager.addBGToBGArea(group, area1);
+		areaManager.addBGToBGArea(group, area2);
+		dbInstance.commitAndCloseSession();
+		
+		//check find groups
+		List<BusinessGroup> groupArea1s = areaManager.findBusinessGroupsOfArea(area1);
+		Assert.assertNotNull(groupArea1s);
+		Assert.assertEquals(1, groupArea1s.size());
+		Assert.assertTrue(groupArea1s.contains(group));
+		
+		List<BusinessGroup> groupArea2s = areaManager.findBusinessGroupsOfArea(area2);
+		Assert.assertNotNull(groupArea2s);
+		Assert.assertEquals(1, groupArea2s.size());
+		Assert.assertTrue(groupArea2s.contains(group));
+		
+		// remove resource2 from group
+		businessGroupService.removeResourceFrom(Collections.singletonList(group), resource2);
+		
+		List<BusinessGroup> groupArea1s_remove = areaManager.findBusinessGroupsOfArea(area1);
+		Assert.assertNotNull(groupArea1s_remove);
+		Assert.assertEquals(1, groupArea1s.size());
+		Assert.assertTrue(groupArea1s_remove.contains(group));
+		
+		List<BusinessGroup> groupArea2s_remove = areaManager.findBusinessGroupsOfArea(area2);
+		Assert.assertTrue(groupArea2s_remove.isEmpty());
+	}
+	
 	@Test
 	public void findGroupsByAreas() {
 		//create a resource, 3 area and 2 group